--- /dev/null
+#!/bin/sh
+
+PCL_DIR=`pwd`
+BUILD_DIR=$PCL_DIR/build
+DOC_DIR=$BUILD_DIR/doc/doxygen/html
+
+TUTORIALS_DIR=$BUILD_DIR/doc/tutorials/html
+ADVANCED_DIR=$BUILD_DIR/doc/advanced/html
+
+CMAKE_C_FLAGS="-Wall -Wextra -Wabi -O2"
+CMAKE_CXX_FLAGS="-Wall -Wextra -Wabi -O2"
+
+function build ()
+{
+ case $CC in
+ clang ) build_clang;;
+ gcc ) build_gcc;;
+ esac
+}
+
+function build_clang ()
+{
+ # A complete build
+ # Configure
+ mkdir $BUILD_DIR && cd $BUILD_DIR
+ cmake -DCMAKE_C_FLAGS=$CMAKE_C_FLAGS -DCMAKE_CXX_FLAGS=$CMAKE_CXX_FLAGS \
+ -DPCL_ONLY_CORE_POINT_TYPES=ON \
+ -DBUILD_global_tests=OFF \
+ $PCL_DIR
+ # Build
+ make -j2
+}
+
+function build_gcc ()
+{
+ # A reduced build, only pcl_common
+ # Configure
+ mkdir $BUILD_DIR && cd $BUILD_DIR
+ cmake -DCMAKE_C_FLAGS=$CMAKE_C_FLAGS -DCMAKE_CXX_FLAGS=$CMAKE_CXX_FLAGS \
+ -DPCL_ONLY_CORE_POINT_TYPES=ON \
+ -DBUILD_2d=OFF \
+ -DBUILD_features=OFF \
+ -DBUILD_filters=OFF \
+ -DBUILD_geometry=OFF \
+ -DBUILD_global_tests=OFF \
+ -DBUILD_io=OFF \
+ -DBUILD_kdtree=OFF \
+ -DBUILD_keypoints=OFF \
+ -DBUILD_ml=OFF \
+ -DBUILD_octree=OFF \
+ -DBUILD_outofcore=OFF \
+ -DBUILD_people=OFF \
+ -DBUILD_recognition=OFF \
+ -DBUILD_registration=OFF \
+ -DBUILD_sample_consensus=OFF \
+ -DBUILD_search=OFF \
+ -DBUILD_segmentation=OFF \
+ -DBUILD_stereo=OFF \
+ -DBUILD_surface=OFF \
+ -DBUILD_tools=OFF \
+ -DBUILD_tracking=OFF \
+ -DBUILD_visualization=OFF \
+ $PCL_DIR
+ # Build
+ make -j2
+}
+
+function test ()
+{
+ # Configure
+ mkdir $BUILD_DIR && cd $BUILD_DIR
+ cmake -DCMAKE_C_FLAGS=$CMAKE_C_FLAGS -DCMAKE_CXX_FLAGS=$CMAKE_CXX_FLAGS -DPCL_ONLY_CORE_POINT_TYPES=ON -DBUILD_global_tests=ON -DPCL_NO_PRECOMPILE=ON $PCL_DIR
+ # Build and run tests
+ make pcl_filters -j3
+ make test_filters
+ make pcl_registration -j3
+ make test_registration
+ make test_registration_api
+ make tests -j3
+}
+
+function doc ()
+{
+ # Do not generate documentation for pull requests
+ if [[ $TRAVIS_PULL_REQUEST != 'false' ]]; then exit; fi
+ # Install doxygen and sphinx
+ sudo apt-get install doxygen doxygen-latex graphviz python-pip
+ sudo pip install sphinx sphinxcontrib-doxylink
+ # Configure
+ mkdir $BUILD_DIR && cd $BUILD_DIR
+ cmake -DDOXYGEN_USE_SHORT_NAMES=OFF \
+ -DSPHINX_HTML_FILE_SUFFIX=php \
+ -DWITH_DOCS=1 \
+ -DWITH_TUTORIALS=1 \
+ $PCL_DIR
+
+ git config --global user.email "documentation@pointclouds.org"
+ git config --global user.name "PointCloudLibrary (via TravisCI)"
+
+ if [ -z "$id_rsa_{1..23}" ]; then echo 'No $id_rsa_{1..23} found !' ; exit 1; fi
+
+ echo -n $id_rsa_{1..23} >> ~/.ssh/travis_rsa_64
+ base64 --decode --ignore-garbage ~/.ssh/travis_rsa_64 > ~/.ssh/id_rsa
+
+ chmod 600 ~/.ssh/id_rsa
+
+ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
+
+ cd $DOC_DIR
+ git clone git@github.com:PointCloudLibrary/documentation.git .
+
+ # Generate documentation and tutorials
+ cd $BUILD_DIR
+ make doc tutorials advanced
+
+ # Upload to GitHub if generation succeeded
+ if [[ $? == 0 ]]; then
+ # Copy generated tutorials to the doc directory
+ cp -r $TUTORIALS_DIR/* $DOC_DIR/tutorials
+ cp -r $ADVANCED_DIR/* $DOC_DIR/advanced
+ # Commit and push
+ cd $DOC_DIR
+ git add --all
+ git commit --amend -m "Documentation for commit $TRAVIS_COMMIT"
+ git push --force
+ else
+ exit 2
+ fi
+}
+
+case $TASK in
+ build ) build;;
+ test ) test;;
+ doc ) doc;;
+esac
compiler:
- gcc
- clang
+env:
+ matrix:
+ - TASK="build"
+ global:
+ - secure: XQw5SBf/7b1SHFR+kKklBWhWVgNvm4vIi+wwyajFSbDLOPpsAqtnDKeA2DV9ciaQJ3CVAvBoyxYgzAvpbsb5k95jadbvu9aSlo/AQnAbz+8DhkJL25DwJAn8G4s4zD1MFi7P4fxJHZsv/l9UcdW4BzjEhh0VidWCO4hP6I9BAQc=
+ - secure: dRKTSeQI2Jad+/K9XCkNZxuu8exPi2wGzf6D0ogd1Nb2ZIUsOtnHSME4DO+xv7F5ZYrythHTrfezQl5hhcK+cr7A12okxlvmF/gVFuGCBPkUbyWPOrxx/Ic5pqdVnmrMFG1hFmr1KmOxCVx0F48JfGNd4ZgtUBAmnIomRp8sXRI=
+ - secure: ah6/Y0D8bBFfAU38RdWsLJ/0Gp5uN5KEHVOnyhEUx1wDaBcDl9+aIE9Xyah44ei/fqQg1MXBfgMnaF7oHpDs4dAKITYP4wV8WDX1DCl1dalIrWMTSFYRknc3Y6hT+HadMlkcV9CCLEhZ7gyyNkm+idbekt/WbQE6Jls/vBhdZxI=
+ - secure: V8XIEPjagHSFInXjogs8ypsC/gL5dq4VENYZbC9q8KYrNT9y1DLnMgNh9pGad25OjOqftBFwsgx6QYo357+MwpynfF+KcYNybjuR/vVGXpLcm0Uytnp6bE7oQbQ1s806TlXHb0Xk/bO2cLRYCCMCkhUOm+Dreu1uhKpoI/z0VMs=
+ - secure: vPRheiXkGnzBHRaVFsA3VtwK6DtWG48VIdbOxboaR6jb9jT9yNz5EQrapiLOFFkhGsZ1mCgeunR58BGUPiSl8gEvOheBBUgZW6x8kbHDpxSUc2H70bLRAKxP4t8e3ZDFg2RjGnvXkGhzUTu9oWnbfWxGAILJAOpNoT0MqDgP+Z0=
+ - secure: bT9kXekVN89zJeS4IEobLOeuAmRJqsgTjZky/mGqmOY1H8oIgcHC+41twB+nxkaU2mQskOvG45UwnAAW/8X6WdTbwKYeFWI5mXpCiXoiGL/dsYiig3GzYYv32ZJQL9B8tkEW6Xc0GY6v4K91Xw+HoKLi/tjxh3NjQxpfktwwCBQ=
+ - secure: kp5CTFyo/E5+v382ypD1mIP7RIVOq5A1NDur1NrYI9or+8+zGcK5A2/Ex6Bb6rac5l7cVcqx6Xel+clxH2eQP2D8GqkaxdZs/u9L7MdFqsfn/QYOIshYlowRoLX86W0KOhsTdLLv2mOS6DnWhIuhgDfrczD3hFQdP9PMTBpd65A=
+ - secure: YXJJRdv5OD/Qo1vNqPnFfx//SotxecFQyXjzEKQ8Zxu+EfVKVs95DUiUX+hiDlPrVGKhI3kTvza+lkaIv9fkjWiwSja5LsUbW/+2cwkhoHmOzVtdcpascfP7fcXc0kWTuvg1FLGNBv26SEym1FfNzp0Sm+ANZsCc4fQVXjDhQSY=
+ - secure: wyWnJoZydXcFW359Vid6YfG9l0WTFqIpuEhgFV8gtSbkrSU0JrrUrKuN5ld/cPb+sRa/I8FAftSDsH4CW67impwLmfNfGf4wZTOBvBKyDGjlI+TLEo4ew/yq+MYIkkEleCWOj5eUkAHPHUUhJzI8SvX+ZuxiJEXapoV0xymbrig=
+ - secure: vCvNI8egL2DRCicbWTuLOyXiW8478tedYvRneDMtCDB2lYToG32sYY0fS9KIciNohgObC8dbVraScgobL5cL4Ir4qrTUfBvGJ71OOMVujNEvkTts4YyI5zhA1PeEJ9+xcbQkE0/f78g7HQnd2LjZLXSxxrFVyJnjGaq1siNNRik=
+ - secure: iUjKlT1bJq3pZp3tS0yOmycSZwmGSbrfTe9fWs0P78o3WRYlzBx4IWa+RZb1l0l6LpCUo00wdgeKKhvzClHFza31fumZJKkFeDf/jxAM2TtSbcIxxXwqpi4yJJZs7SkYrU/lugv0NI6UHtl5wAkIp8sjtCCHVYJjlYNHaLhL75o=
+ - secure: DWrK3JsbzV5iUK3Xj6MpVWwlZv85GxdLl8c73ONcynZJ1tzUU3bfdvOtMxJrAnmH9QANw5RGORgbOyiDnvydCCpmL9RjswFqfkQX0mRTV8UYDPlJ1bBZJkX8I97yw8W1UyK1Q76kfr5bZjhikpsS/81Ll6z6Kj9FOte6KFfbznk=
+ - secure: B32G/fehtPQdu1bF+dbCJ/Eo22MiszxZj7UOwNggRFifoxTmRdffZyuqapW0PLCTbBEvlS6UfajGOmVvZx5QH8Q/gtutJqXDTMgWpOai66JUwnpn6AX6NnhFGc+s2cpp3V2+5I26OrFkaXTcS7flz32XJdKZmPgvjY1qoppmyzo=
+ - secure: u0cyLpY3LVF1gA8Sj4Q7X4Xv4bBT7m8IBDnm/AS412H0dM47dcFu8uxVFgWRu3WrM8T87Uc7+ftHkxKJezXgDPEVUixAnwLg2nEVEf6v3HC/HW+X9m98q1mELKXTLxc/f57rAIhhYPkjQh+leg6JmrhG1t0X7kh7d3CY0wwdSL0=
+ - secure: KlIjQVEWlr+H/PAKIAcKS6WO1EFBdXXvXLisEnferB1RWgGwuLRgtIZzI+BJdt/7BMSyWvRExqt6xNyfqpxKXl1kdJawc3rpeYufklHQgmB2qGBSrpMtNr0S3gPFePBdnETbdPHwA63QCrpRKcrHqJxmeIzAmstH736iRXuubFs=
+ - secure: ldwk79cqSgaEUZLt5rbNLRcNaVf/bx2zjBEDbvzAF9JCqVx/L5zCRTr5raHsxzBOzz25Qs3nFW81e1WLwxMAWshvI7EM/YG8GXqECvJGWpHBwcZI1SVP3zMhpH/jJE8vbMFaM2NOmhMT03z91vt0NlvR4DJMY0KV351awGSL2Do=
+ - secure: SyLCwwc+jjkdmNUkRdGRDR2lNrPCu1ZvPstvVWQke5uw3BlnVKXWK7V3yq9g11ZsCl/7aldBexjf7pqeXbJ5Wl5goiI3E+/Ooujd/EWkMn9K3YlG57p8Zdw/A/fUMJgAH3qrM//ihdO0KDJD8eCGLlm4qV0SnlWFPQ+Dy8BsAc8=
+ - secure: DaqjsZS60Y070Gw2lUNltzDltiYKB8IlYqsp0SyOjZAKlDGgp97+9YGEaIGcKF1qw3VGswg+7rrjWQ59iiwstTqgvx1mTTik0Qc0RCc8GtvIm+PS9TOhWxQginmhZmET9QKnGB7uj6K63qN8V8MZakZWIJxgUXx8jGiCTD22/eQ=
+ - secure: x4x3vHY6Wf4kxjAT8dbWRl8n4PxTGv8RtzfGIZYXvJgbnY2qW+cJ8Edp64V1LegvQbBQmKqAP9YSLHwZsuL3LxfVqt/seRs+DJMDVUd9jVYmym0rPqemJLezapalEg6qfLuoeNkDPWvIVccQCDEBPfaUdD0ZXYo44LS5jIV0+T8=
+ - secure: Pm2hyxdSLnY3ltrAva0FwNWWEQQcnf1JK2Fhjc3sWFpStMF7Obk93u4G5M6f2f28ZY6HFaMRYC1qEz/+yMIjsusIv8j0E6hgB/EnoM0dlxCc0aryH3X2IOYBVjRMjOFPmhYbNBoMmZWLluHWSyVSqr9k9nxowMfM3mi4fah11aQ=
+ - secure: WTZ238yAEfXRyll1n8yau3FUW9HTvq6scKIl9AmNZrnzTr9dktupWrBVV6CtvaufT1mSmDigZ7VGC6T71HkyRIyb2qfVTrnjnxE96Wtcci6PfkuQc2L2puuZYo8dXaBRoOgJKGHFo/uKVKWnp7t55dp3lBJJmclHhon+K2hMSJw=
+ - secure: LNsNoBvqY/jYDoBjWCE5cM+f1H8xOwSBc/tbWZo6E/jPRjUOLzXSicMMUMrlVto+bFzSUT8OVajV3XmoRx+Qntzv6bDSAGjdycvHd2YZQPn8BYrsFtR4So7SsJkF9FlxzbiOXaiSRpwGn7TP/DO7Neubrr4IS2ef4nWowGrnCE8=
+ - secure: PZivWbaCWFA2BFFY8n3UMxdEWjz7rBh568u9LF5LH3HgWADnfiwWzNriACqX9fhe7tSmDru5Bk978s+xPPAY9v24cfiDEX5a5MQ/XVr2rP48n3vlUDWERDhIodJ73F9F9GGZXToGdNz0MBUAHgiv7Lb0GYUfmOYzUJjWghngLBw=
+matrix:
+ include:
+ - compiler: clang
+ env: TASK="test"
+ - env: TASK="doc"
before_install:
- sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl -y
- sudo add-apt-repository ppa:apokluda/boost1.53 -y
+ - sudo add-apt-repository ppa:yade-users/external -y
+ - sudo add-apt-repository ppa:libreoffice/ppa -y
- sudo apt-get update -d
- - sudo apt-get install cmake libvtk5-qt4-dev libflann-dev libeigen3-dev libopenni-dev libqhull-dev libboost-filesystem1.53-dev libboost-iostreams1.53-dev libboost-thread1.53-dev
-script:
- - mkdir build && cd build
- - cmake -DBUILD_global_tests=ON -DCMAKE_C_FLAGS="-Wall -Wextra -Wabi -O2" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wabi -O2" -DPCL_ONLY_CORE_POINT_TYPES=ON .. && make -j2 && make test
+install:
+ - sudo apt-get install libvtk5-qt4-dev libflann-dev libeigen3-dev libopenni-dev libqhull-dev libboost-filesystem1.53-dev libboost-iostreams1.53-dev libboost-thread1.53-dev libboost-chrono1.53-dev libusb-1.0-0-dev libgtest-dev
+script:
+ - bash .travis.sh
# ChangeList
+## *= 1.7.2 (10.09.2014) =*
+
+* Added support for VTK6
+ [[#363]](https://github.com/PointCloudLibrary/pcl/pull/363)
+* Removed Google Test from the source tree and added it as a system dependency
+ [[#731]](https://github.com/PointCloudLibrary/pcl/pull/731)
+* Added support for QHull 2012 on non-Debian platforms
+ [[#852]](https://github.com/PointCloudLibrary/pcl/pull/852)
+
+### `libpcl_common:`
+
+* Added `BearingAngleImage` class
+ [[#198]](https://github.com/PointCloudLibrary/pcl/pull/198)
+* Added `pcl::CPPFSignature` point type
+ [[#296]](https://github.com/PointCloudLibrary/pcl/pull/296)
+* Added `getRGBAVector4i()`, `getBGRVector3cMap()`, and `getBGRAVector4cMap()`
+ to all point types containing RGB/RGBA fields
+ [[#450]](https://github.com/PointCloudLibrary/pcl/pull/450)
+* Added a family of "has field" functions to check presence of a particular
+ field in a point type both at compile- and run-time
+ [[#462]](https://github.com/PointCloudLibrary/pcl/pull/462)
+* Added a function to copy data between points of different types
+ [[#465]](https://github.com/PointCloudLibrary/pcl/pull/465)
+* Added test macros for equality/nearness checks
+ [[#499]](https://github.com/PointCloudLibrary/pcl/pull/499)
+* Added `descriptorSize()` to all point types with descriptors
+ [[#531]](https://github.com/PointCloudLibrary/pcl/pull/531)
+* Added possibility to copy a cloud inside another one while interpolating
+ borders
+ [[#567]](https://github.com/PointCloudLibrary/pcl/pull/567)
+* Added a function to determine the point of intersection of three non-parallel
+ planes
+ [[#571]](https://github.com/PointCloudLibrary/pcl/pull/571)
+* Fixed a bug in HSV to RGB color conversion
+ [[#581]](https://github.com/PointCloudLibrary/pcl/pull/581)
+* Added a new `CentroidPoint` class
+ [[#586]](https://github.com/PointCloudLibrary/pcl/pull/586)
+* Templated intersection computation functions on scalar type
+ [[#646]](https://github.com/PointCloudLibrary/pcl/pull/646)
+* Templated functions in 'eigen.h' on scalar type
+ [[#660]](https://github.com/PointCloudLibrary/pcl/pull/660)
+* Added functions to transform points, vectors, lines, etc.
+ [[#660]](https://github.com/PointCloudLibrary/pcl/pull/660)
+
+### `libpcl_features:`
+
+* Added a simple implementation of CPPF using normalised HSV values in the
+ feature vector
+ [[#296]](https://github.com/PointCloudLibrary/pcl/pull/296)
+* Added `MomentOfInertiaEstimation` and `ROPSEstimation` features
+ [[#319]](https://github.com/PointCloudLibrary/pcl/pull/319)
+* Fixed a problem in `OURCVFHEstimation::computeRFAndShapeDistribution()`
+ [[#738]](https://github.com/PointCloudLibrary/pcl/pull/738)
+* Fixed undefined behavior in `OURCVFHEstimation::computeFeature()`
+ [[#811]](https://github.com/PointCloudLibrary/pcl/pull/811)
+* Fixed memory corruption error in OUR-CVFH
+ [[#875]](https://github.com/PointCloudLibrary/pcl/pull/875)
+
+### `libpcl_filters:`
+
+* Added a function to set the minimum number of points required for a voxel to
+ be used in `VoxelGrid`
+ [[#434]](https://github.com/PointCloudLibrary/pcl/pull/434)
+* Added `GridMinimum` filter
+ [[#520]](https://github.com/PointCloudLibrary/pcl/pull/520)
+* Added a morphological filter that operates on Z dimension
+ [[#533]](https://github.com/PointCloudLibrary/pcl/pull/533)
+* Added progressive morphological filter to extract ground returns
+ [[#574]](https://github.com/PointCloudLibrary/pcl/pull/574)
+* Added a filter to remove locally maximal points in the z dimension
+ [[#577]](https://github.com/PointCloudLibrary/pcl/pull/577)
+* Added an approximate version of the progressive morphological filter
+ [[#665]](https://github.com/PointCloudLibrary/pcl/pull/665)
+* Added `ModelOutlierRemoval` class that filters points in a cloud based on the
+ distance between model and point
+ [[#702]](https://github.com/PointCloudLibrary/pcl/pull/702)
+
+### `libpcl_io:`
+
+* Added experimental version of an OpenNI 2.x grabber
+ [[#276]](https://github.com/PointCloudLibrary/pcl/pull/276)
+ [[#843]](https://github.com/PointCloudLibrary/pcl/pull/843)
+* Added support for IFS file format
+ [[#354]](https://github.com/PointCloudLibrary/pcl/pull/354)
+ [[#356]](https://github.com/PointCloudLibrary/pcl/pull/356)
+* Added possibility to load `PCLPointCloud2` from OBJ files
+ [[#363]](https://github.com/PointCloudLibrary/pcl/pull/363)
+* Fixed loading and saving of PLY files
+ [[#510]](https://github.com/PointCloudLibrary/pcl/pull/510)
+ [[#579]](https://github.com/PointCloudLibrary/pcl/pull/579)
+* Fixed race conditions in `PCDGrabber`
+ [[#582]](https://github.com/PointCloudLibrary/pcl/pull/582)
+* Fixed multi openni grabber buffer corruption
+ [[#845]](https://github.com/PointCloudLibrary/pcl/pull/845)
+* Fixed incompatibility with Boost 1.56 in `LZFImageWriter`
+ [[#867]](https://github.com/PointCloudLibrary/pcl/pull/867)
+* Fixed a bug in `PLYReader` which lead to deformation of point clouds when
+ displayed in `CloudViewer` or `PCLVisualizer`
+ [[#879]](https://github.com/PointCloudLibrary/pcl/pull/879)
+
+### `libpcl_kdtree:`
+
+* Fixed double memory free bug in `KdTreeFLANN`
+ [[#618]](https://github.com/PointCloudLibrary/pcl/pull/618)
+
+### `libpcl_keypoints:`
+
+* Added a method `Keypoint::getKeypointsIndices ()`
+ [[#318]](https://github.com/PointCloudLibrary/pcl/pull/318)
+* Added keypoints based on Trajkovic and Hedley operator (2D and 3D versions)
+ [[#409]](https://github.com/PointCloudLibrary/pcl/pull/409)
+
+### `libpcl_octree:`
+
+* Fixed a bug in `OctreePointCloudAdjacency::computeNeighbors()`
+ [[#455]](https://github.com/PointCloudLibrary/pcl/pull/455)
+* Accelerated `OctreePointCloudAdjacency` building by disabling dynamic key
+ resizing
+ [[#332]](https://github.com/PointCloudLibrary/pcl/pull/332)
+* Fixed a bug with infinite points in `OctreePointCloudAdjacency`
+ [[#723]](https://github.com/PointCloudLibrary/pcl/pull/723)
+
+### `libpcl_people:`
+
+* Added a possibility to define a transformation matrix for people tracker
+ [[#606]](https://github.com/PointCloudLibrary/pcl/pull/606)
+
+### `libpcl_recognition:`
+
+* Allow PCL to be built against a system-wide installed metslib
+ [[#299]](https://github.com/PointCloudLibrary/pcl/pull/299)
+* Fixed a bug in `ObjRecRANSAC::addModel()`
+ [[#269]](https://github.com/PointCloudLibrary/pcl/pull/269)
+* Added `LINEMOD::loadTemplates()` (useful for object recognition systems that
+ store templates for different objects in different files)
+ [[#358]](https://github.com/PointCloudLibrary/pcl/pull/358)
+
+### `libpcl_registration:`
+
+* Fixed `SampleConsensusInitialAlignment::hasConverged()`
+ [[#339]](https://github.com/PointCloudLibrary/pcl/pull/339)
+* Added `JointIterativeClosestPoint`
+ [[#344]](https://github.com/PointCloudLibrary/pcl/pull/344)
+* Made correspondence rejectors to actually work with ICP
+ [[#419]](https://github.com/PointCloudLibrary/pcl/pull/419)
+* Added `GeneralizedIterativeClosestPoint6D` that integrates Lab color space
+ information into the GICP algorithm
+ [[#491]](https://github.com/PointCloudLibrary/pcl/pull/491)
+* Fixed bugs and optimized `SampleConsensusPrerejective`
+ [[#741]](https://github.com/PointCloudLibrary/pcl/pull/741)
+* Fixed a bug in `TransformationEstimationSVDScale`
+ [[#885]](https://github.com/PointCloudLibrary/pcl/pull/885)
+
+### `libpcl_sample_consensus:`
+
+* Unified `SampleConsensusModelNormalParallelPlane` with
+ `SampleConsensusModelNormalPlane` to avoid code duplication
+ [[#696]](https://github.com/PointCloudLibrary/pcl/pull/696)
+
+### `libpcl_search:`
+
+* `search::KdTree` can now be used with different KdTree implementations
+ [[#81]](https://github.com/PointCloudLibrary/pcl/pull/81)
+* Added a new interface to FLANN's multiple randomized trees for
+ high-dimensional (feature) searches
+ [[#435]](https://github.com/PointCloudLibrary/pcl/pull/435)
+* Fixed a bug in the `Ptr` typdef in `KdTree`
+ [[#820]](https://github.com/PointCloudLibrary/pcl/pull/820)
+
+### `libpcl_segmentation:`
+
+* Added `GrabCut` segmentation and a show-case application for 2D
+ [[#330]](https://github.com/PointCloudLibrary/pcl/pull/330)
+* Updated `RegionGrowingRGB::assembleRegion()` to speed up the algorithm
+ [[#538]](https://github.com/PointCloudLibrary/pcl/pull/538)
+* Fixed a bug with missing point infinity test in `RegionGrowing`
+ [[#617]](https://github.com/PointCloudLibrary/pcl/pull/617)
+* Fixed alignment issue in `SupervoxelClustering`
+ [[#625]](https://github.com/PointCloudLibrary/pcl/pull/625)
+* Added a curvature parameter to `Region3D` class
+ [[#653]](https://github.com/PointCloudLibrary/pcl/pull/653)
+* Fixed a minor bug in `OrganizedConnectedComponentSegmentation`
+ [[#802]](https://github.com/PointCloudLibrary/pcl/pull/802)
+
+### `libpcl_surface:`
+
+* Fixed a bug in `EarClipping` where computation failed if all vertices have
+ the same x or y component
+ [[#130]](https://github.com/PointCloudLibrary/pcl/pull/130)
+* Added support for unequal focal lengths along different axes in texture
+ mapping
+ [[#352]](https://github.com/PointCloudLibrary/pcl/pull/352)
+* Speeded up bilateral upsampling
+ [[#689]](https://github.com/PointCloudLibrary/pcl/pull/689)
+* Reduced space usage in `MovingLeastSquares`
+ [[#785]](https://github.com/PointCloudLibrary/pcl/pull/785)
+
+### `libpcl_tracking:`
+
+* Fixed Hue distance calculation in tracking `HSVColorCoherence`
+ [[#390]](https://github.com/PointCloudLibrary/pcl/pull/390)
+* Added pyramidal KLT tracking
+ [[#587]](https://github.com/PointCloudLibrary/pcl/pull/587)
+
+### `libpcl_visualization:`
+
+* Added a new color handler `PointCloudColorHandlerRGBAField` that takes into
+ account alpha channel
+ [[#306]](https://github.com/PointCloudLibrary/pcl/pull/306)
+* Fixed `PCLVisualizer` crashes on OS X
+ [[#384]](https://github.com/PointCloudLibrary/pcl/pull/384)
+* Added possibility to display texture on polygon meshes
+ [[#400]](https://github.com/PointCloudLibrary/pcl/pull/400)
+* Added ability to add and remove several coordinate systems
+ [[#401]](https://github.com/PointCloudLibrary/pcl/pull/401)
+* Added `ImageViewer::markPoints()`
+ [[#439]](https://github.com/PointCloudLibrary/pcl/pull/439)
+* Added `setWindowPosition()` and `setWindowName()` to `PCLPlotter`
+ [[#457]](https://github.com/PointCloudLibrary/pcl/pull/457)
+* Changed camera parameters display to be more user-friendly
+ [[#544]](https://github.com/PointCloudLibrary/pcl/pull/544)
+* Added `PCLVisualizer::updateCoordinateSystemPose()`
+ [[#569]](https://github.com/PointCloudLibrary/pcl/pull/569)
+* Fixed display of non-triangular meshes in `PCLVisualizer`
+ [[#686]](https://github.com/PointCloudLibrary/pcl/pull/686)
+* Added a capability to save and restore camera view in `PCLVisualizer`
+ [[#703]](https://github.com/PointCloudLibrary/pcl/pull/703)
+* Added `PCLVisualizer::getShapeActorMap()` function
+ [[#725]](https://github.com/PointCloudLibrary/pcl/pull/725)
+* Fixed undefined behavior when drawing axis in `PCLVisualizer`
+ [[#762]](https://github.com/PointCloudLibrary/pcl/pull/762)
+* Fixed HSV to RGB conversion in `PointCloudColorHandlerHSVField`
+ [[#772]](https://github.com/PointCloudLibrary/pcl/pull/772)
+* Fixed non-working key presses in visualization GUIs on Mac OS X systems
+ [[#795]](https://github.com/PointCloudLibrary/pcl/pull/795)
+* Fixed a bug in `PCLVisualizer::addCube()`
+ [[#846]](https://github.com/PointCloudLibrary/pcl/pull/846)
+* Fixed a bug in cone visualization and added possibility to set cone length
+ [[#881]](https://github.com/PointCloudLibrary/pcl/pull/881)
+
+### `PCL Tools:`
+
+* Added a simple tool to compute Hausdorff distance between two point clouds
+ [[#519]](https://github.com/PointCloudLibrary/pcl/pull/519)
+* Updated `pcl_viewer` to use RGB color handler as default
+ [[#556]](https://github.com/PointCloudLibrary/pcl/pull/556)
+* Added a morphological tool `pcl_morph` to apply dilate/erode/open/close
+ operations on the Z dimension
+ [[#572]](https://github.com/PointCloudLibrary/pcl/pull/572)
+* Added a tool `pcl_generate` to generate random clouds
+ [[#599]](https://github.com/PointCloudLibrary/pcl/pull/599)
+* Added a tool `pcl_grid_min` to find grid minimums
+ [[#603]](https://github.com/PointCloudLibrary/pcl/pull/603)
+* Added a tool `pcl_local_max` to filter out local maxima
+ [[#604]](https://github.com/PointCloudLibrary/pcl/pull/604)
+* Added optional depth image input to `pcl_png2pcd` converter
+ [[#680]](https://github.com/PointCloudLibrary/pcl/pull/680)
+* Fixed memory size calculation in `pcl_openni_pcd_recorder`
+ [[#676]](https://github.com/PointCloudLibrary/pcl/pull/676)
+* Added device ID parameter to `pcl_openni_pcd_recorder`
+ [[#673]](https://github.com/PointCloudLibrary/pcl/pull/673)
+* Added automatic camera reset on startup in `pcl_viewer`
+ [[#693]](https://github.com/PointCloudLibrary/pcl/pull/693)
+* Added a capability to save and restore camera view in `pcl_viewer`
+ [[#703]](https://github.com/PointCloudLibrary/pcl/pull/703)
+* Updated `pcl_pcd2png` tool to be able to paint pixels corresponding to
+ infinite points with black. Added Glasbey lookup table to paint labels with
+ a fixed set of highly distinctive colors.
+ [[#767]](https://github.com/PointCloudLibrary/pcl/pull/767)
+* Added `pcl_obj2pcd` tool
+ [[#816]](https://github.com/PointCloudLibrary/pcl/pull/816)
+
+### `PCL Apps:`
+
+* Fixed disappearing cloud from selection in Cloud Composer
+ [[#814]](https://github.com/PointCloudLibrary/pcl/pull/814)
+
+
## *= 1.7.1 (07.10.2013) =*
+
* New pcl::io::savePNGFile() functions and pcd2png tool (deprecates organized_pcd_to_png).
* Support for Intel Perceptual Computing SDK cameras.
* New Dual quaternion transformation estimation algorithm.
### ---[ PCL global CMake
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+if(POLICY CMP0048)
+ cmake_policy(SET CMP0048 OLD) # do not use VERSION option in project() command
+endif()
+
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "possible configurations" FORCE)
# In case the user does not setup CMAKE_BUILD_TYPE, assume it's RelWithDebInfo
string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
### ---[ Find universal dependencies
-set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH})
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH})
+
+# ---[ Include pkgconfig
+include (FindPkgConfig)
# ---[ Release/Debug specific flags
if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
if(NOT DEFINED CMAKE_RELEASE_POSTFIX)
set(CMAKE_RELEASE_POSTFIX "_release")
endif()
+ if(NOT DEFINED CMAKE_RELWITHDEBINFO_POSTFIX)
+ set(CMAKE_RELWITHDEBINFO_POSTFIX "_release")
+ endif()
+ if(NOT DEFINED CMAKE_MINSIZEREL_POSTFIX)
+ set(CMAKE_MINSIZEREL_POSTFIX "_release")
+ endif()
endif()
# ---[ special maintainer mode
message ("PCL shared libs on Android must be: ${PCL_SHARED_LIBS}")
endif()
-include(${PCL_SOURCE_DIR}/cmake/pcl_verbosity.cmake)
-include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake)
-include(${PCL_SOURCE_DIR}/cmake/pcl_options.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_verbosity.cmake")
+include("${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake")
+include("${PCL_SOURCE_DIR}/cmake/pcl_options.cmake")
# Enable verbose timing display?
if(CMAKE_TIMING_VERBOSE AND UNIX)
endif(CMAKE_TIMING_VERBOSE AND UNIX)
# check for SSE flags
-include(${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake")
if (PCL_ENABLE_SSE)
PCL_CHECK_FOR_SSE()
endif (PCL_ENABLE_SSE)
SET(CMAKE_C_FLAGS "-Qunused-arguments")
endif()
if("${CMAKE_CXX_FLAGS}" STREQUAL "")
- SET(CMAKE_CXX_FLAGS "-Qunused-arguments -Wno-invalid-offsetof ${SSE_FLAGS}") # Unfortunately older Clang versions do not have this: -Wno-unnamed-type-template-args
+ SET(CMAKE_CXX_FLAGS "-ftemplate-depth=1024 -Qunused-arguments -Wno-invalid-offsetof ${SSE_FLAGS}") # Unfortunately older Clang versions do not have this: -Wno-unnamed-type-template-args
+ if(APPLE AND WITH_CUDA AND CUDA_FOUND)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++")
+ endif()
endif()
SET(CLANG_LIBRARIES "stdc++")
endif()
-# ---[ Project folders
-option(USE_PROJECT_FOLDERS "Use folders to organize PCL projects in an IDE." OFF)
-mark_as_advanced(USE_PROJECT_FOLDERS)
-if(USE_PROJECT_FOLDERS)
- set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-endif(USE_PROJECT_FOLDERS)
-
-include(${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake)
-set(PCL_VERSION 1.7.1 CACHE STRING "PCL version")
+include("${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake")
+set(PCL_VERSION 1.7.2 CACHE STRING "PCL version")
DISSECT_VERSION()
GET_OS_INFO()
SET_INSTALL_DIRS()
if(WIN32)
- set(PCL_RESOURCES_DIR ${PCL_SOURCE_DIR}/resources)
- set(PCL_POINTCLOUDS_DIR ${PCL_RESOURCES_DIR}/pointclouds)
+ set(PCL_RESOURCES_DIR "${PCL_SOURCE_DIR}/resources")
+ set(PCL_POINTCLOUDS_DIR "${PCL_RESOURCES_DIR}/pointclouds")
endif(WIN32)
-set(PCL_OUTPUT_LIB_DIR ${PCL_BINARY_DIR}/${LIB_INSTALL_DIR})
-set(PCL_OUTPUT_BIN_DIR ${PCL_BINARY_DIR}/${BIN_INSTALL_DIR})
-make_directory(${PCL_OUTPUT_LIB_DIR})
-make_directory(${PCL_OUTPUT_BIN_DIR})
+set(PCL_OUTPUT_LIB_DIR "${PCL_BINARY_DIR}/${LIB_INSTALL_DIR}")
+set(PCL_OUTPUT_BIN_DIR "${PCL_BINARY_DIR}/${BIN_INSTALL_DIR}")
+make_directory("${PCL_OUTPUT_LIB_DIR}")
+make_directory("${PCL_OUTPUT_BIN_DIR}")
if(WIN32)
foreach(config ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${config} CONFIG)
### ---[ Find universal dependencies
# the gcc-4.2.1 coming with MacOS X is not compatible with the OpenMP pragmas we use, so disabling OpenMP for it
-if((NOT APPLE) OR (NOT CMAKE_COMPILER_IS_GNUCXX) OR (GCC_VERSION VERSION_GREATER 4.2.1))
+if((NOT APPLE) OR (NOT CMAKE_COMPILER_IS_GNUCXX) OR (GCC_VERSION VERSION_GREATER 4.2.1) OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
find_package(OpenMP)
endif()
if(OPENMP_FOUND)
message (STATUS "Not found OpenMP")
endif()
# Boost (required)
-include(${PCL_SOURCE_DIR}/cmake/pcl_find_boost.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_find_boost.cmake")
# Eigen (required)
find_package(Eigen REQUIRED)
include_directories(SYSTEM ${EIGEN_INCLUDE_DIRS})
include_directories(${FLANN_INCLUDE_DIRS})
# libusb-1.0
-find_package(libusb-1.0)
-if(LIBUSB_1_FOUND)
- include_directories(${LIBUSB_1_INCLUDE_DIR})
-endif(LIBUSB_1_FOUND)
+option(WITH_LIBUSB "Build USB RGBD-Camera drivers" TRUE)
+if(WITH_LIBUSB)
+ find_package(libusb-1.0)
+ if(LIBUSB_1_FOUND)
+ include_directories("${LIBUSB_1_INCLUDE_DIR}")
+ endif(LIBUSB_1_FOUND)
+endif(WITH_LIBUSB)
# OpenNI
-find_package(OpenNI)
-if (OPENNI_FOUND)
- set(HAVE_OPENNI ON)
- include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS})
-endif()
+option(WITH_OPENNI "OpenNI driver support" TRUE)
+if(WITH_OPENNI)
+ find_package(OpenNI)
+ if (OPENNI_FOUND)
+ set(HAVE_OPENNI ON)
+ include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS})
+ endif(OPENNI_FOUND)
+endif(WITH_OPENNI)
+
+# OpenNI 2
+option(WITH_OPENNI2 "OpenNI 2 driver support" TRUE)
+if(WITH_OPENNI2)
+ find_package(OpenNI2)
+ if (OPENNI2_FOUND)
+ set(HAVE_OPENNI2 ON)
+ include_directories(SYSTEM ${OPENNI2_INCLUDE_DIRS})
+ endif(OPENNI2_FOUND)
+endif(WITH_OPENNI2)
# Fotonic (FZ_API)
-find_package(FZAPI)
-if (FZAPI_FOUND)
- set(HAVE_FZAPI ON)
- include_directories(SYSTEM ${FZAPI_INCLUDE_DIR})
-endif()
+option(WITH_FZAPI "Build Fotonic Camera support" TRUE)
+if(WITH_FZAPI)
+ find_package(FZAPI)
+ if (FZAPI_FOUND)
+ set(HAVE_FZAPI ON)
+ include_directories(SYSTEM "${FZAPI_INCLUDE_DIR}")
+ endif(FZAPI_FOUND)
+endif(WITH_FZAPI)
# Intel Perceptional Computing Interface (PXCAPI)
-find_package(PXCAPI)
-if (PXCAPI_FOUND)
- set(HAVE_PXCAPI ON)
- include_directories(SYSTEM ${PXCAPI_INCLUDE_DIRS})
+option(WITH_PXCAPI "Build PXC Device support" TRUE)
+if(WITH_PXCAPI)
+ find_package(PXCAPI)
+ if (PXCAPI_FOUND)
+ set(HAVE_PXCAPI ON)
+ include_directories(SYSTEM ${PXCAPI_INCLUDE_DIRS})
+ endif(PXCAPI_FOUND)
+endif(WITH_PXCAPI)
+
+# metslib
+if (PKG_CONFIG_FOUND)
+ pkg_check_modules(METSLIB metslib)
+ if (METSLIB_FOUND)
+ set (HAVE_METSLIB ON)
+ include_directories(${METSLIB_INCLUDE_DIRS})
+ else()
+ include_directories("${PCL_SOURCE_DIR}/recognition/include/pcl/recognition/3rdparty/")
+ endif()
+else()
+ include_directories(${PCL_SOURCE_DIR}/recognition/include/pcl/recognition/3rdparty/)
endif()
# LibPNG
-find_package(PNG)
-if (PNG_FOUND)
- set (HAVE_PNG ON)
- include_directories(${PNG_INCLUDE_DIR})
-endif(PNG_FOUND)
+option(WITH_PNG "PNG file support" TRUE)
+if(WITH_PNG)
+ find_package(PNG)
+ if (PNG_FOUND)
+ set (HAVE_PNG ON)
+ include_directories("${PNG_INCLUDE_DIR}")
+ endif(PNG_FOUND)
+endif(WITH_PNG)
# Qhull
-if(NOT PCL_SHARED_LIBS OR WIN32)
- set(QHULL_USE_STATIC ON)
-endif(NOT PCL_SHARED_LIBS OR WIN32)
-find_package(Qhull)
-
-# Find Qt5
-include(cmake/pcl_find_qt5.cmake)
-
-# Find QT4
-if(NOT QT5_FOUND)
- find_package(Qt4)
- if (QT4_FOUND)
- include(${QT_USE_FILE})
- endif (QT4_FOUND)
-endif()
+option(WITH_QHULL "Include convex-hull operations" TRUE)
+if(WITH_QHULL)
+ if(NOT PCL_SHARED_LIBS OR WIN32)
+ set(QHULL_USE_STATIC ON)
+ endif(NOT PCL_SHARED_LIBS OR WIN32)
+ find_package(Qhull)
+endif(WITH_QHULL)
+
+option(WITH_QT "Build QT Front-End" TRUE)
+if(WITH_QT)
+ # Find Qt4
+ find_package(Qt4)
+ if (QT4_FOUND)
+ include("${QT_USE_FILE}")
+ endif (QT4_FOUND)
+
+ # Find QT5
+ if(NOT QT4_FOUND)
+ include(cmake/pcl_find_qt5.cmake)
+ endif(NOT QT4_FOUND)
+endif(WITH_QT)
# Find VTK
-find_package(VTK)
-if(VTK_FOUND)
- if (PCL_SHARED_LIBS OR
- (NOT (PCL_SHARED_LIBS) AND NOT (VTK_BUILD_SHARED_LIBS)))
- set(VTK_FOUND TRUE)
- find_package (QVTK)
- message(STATUS "VTK found (include: ${VTK_INCLUDE_DIRS}, lib: ${VTK_LIBRARY_DIRS})")
- link_directories(${VTK_LIBRARY_DIRS})
- set(HAVE_VTK ON)
- else ()
- set(VTK_FOUND OFF)
- set(HAVE_VTK OFF)
- message ("Warning: You are to build PCL in STATIC but VTK is SHARED!")
- message ("Warning: VTK disabled!")
- endif ()
-endif(VTK_FOUND)
-# Find MPI
-if (WITH_MPI) # this script searches for MPI 10 sec under windows, annoying especially if you do this often
- find_package(MPI)
- if(MPI_CXX_FOUND)
- include_directories(SYSTEM ${MPI_INCLUDE_PATH})
- endif(MPI_CXX_FOUND)
-endif()
-#Find Doxygen and html help compiler if any
-find_package(Doxygen)
-if(DOXYGEN_FOUND)
- find_package(HTMLHelp)
-endif(DOXYGEN_FOUND)
+option(WITH_VTK "Build VTK-Visualizations" TRUE)
+if(WITH_VTK AND NOT ANDROID)
+ find_package(VTK)
+ if(VTK_FOUND)
+ message(STATUS "VTK_MAJOR_VERSION ${VTK_MAJOR_VERSION}")
+ if (PCL_SHARED_LIBS OR
+ (NOT (PCL_SHARED_LIBS) AND NOT (VTK_BUILD_SHARED_LIBS)))
+ set(VTK_FOUND TRUE)
+ find_package (QVTK)
+ if (${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
+ message(STATUS "VTK found (include: ${VTK_INCLUDE_DIRS}, lib: ${VTK_LIBRARY_DIRS})")
+ link_directories(${VTK_LIBRARY_DIRS})
+ else(${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
+ include (${VTK_USE_FILE})
+ message(STATUS "VTK found (include: ${VTK_INCLUDE_DIRS}, lib: ${VTK_LIBRARIES}")
+ endif (${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
+ if (APPLE)
+ option (VTK_USE_COCOA "Use Cocoa for VTK render windows" ON)
+ MARK_AS_ADVANCED (VTK_USE_COCOA)
+ endif (APPLE)
+ set(HAVE_VTK ON)
+ else ()
+ set(VTK_FOUND OFF)
+ set(HAVE_VTK OFF)
+ message ("Warning: You are to build PCL in STATIC but VTK is SHARED!")
+ message ("Warning: VTK disabled!")
+ endif ()
+ endif(VTK_FOUND)
+else(WITH_VTK AND NOT ANDROID)
+ set(VTK_FOUND OFF)
+ set(HAVE_VTK OFF)
+endif(WITH_VTK AND NOT ANDROID)
+
+
#Find PCAP
-find_package(Pcap)
+option(WITH_PCAP "pcap file capabilities in Velodyne HDL driver" TRUE)
+if(WITH_PCAP)
+ find_package(Pcap)
+endif(WITH_PCAP)
+
+# OpenGL and GLUT
+include("${PCL_SOURCE_DIR}/cmake/pcl_find_gl.cmake")
### ---[ Create the config.h file
set(pcl_config_h_in "${CMAKE_CURRENT_SOURCE_DIR}/pcl_config.h.in")
set(pcl_config_h "${CMAKE_CURRENT_BINARY_DIR}/include/pcl/pcl_config.h")
-configure_file(${pcl_config_h_in} ${pcl_config_h})
-PCL_ADD_INCLUDES(common "" ${pcl_config_h})
-include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
+configure_file("${pcl_config_h_in}" "${pcl_config_h}")
+PCL_ADD_INCLUDES(common "" "${pcl_config_h}")
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
### ---[ Set up for tests
enable_testing()
### ---[ Set up for examples
-#include(${PCL_SOURCE_DIR}/cmake/pcl_examples.cmake)
+#include("${PCL_SOURCE_DIR}/cmake/pcl_examples.cmake")
### ---[ Add the libraries subdirectories
-include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake")
-collect_subproject_directory_names(${PCL_SOURCE_DIR} "CMakeLists.txt" PCL_MODULES_NAMES PCL_MODULES_DIRS doc)
+collect_subproject_directory_names("${PCL_SOURCE_DIR}" "CMakeLists.txt" PCL_MODULES_NAMES PCL_MODULES_DIRS doc)
set(PCL_MODULES_NAMES_UNSORTED ${PCL_MODULES_NAMES})
topological_sort(PCL_MODULES_NAMES PCL_ _DEPENDS)
sort_relative(PCL_MODULES_NAMES_UNSORTED PCL_MODULES_NAMES PCL_MODULES_DIRS)
foreach(subdir ${PCL_MODULES_DIRS})
- add_subdirectory(${PCL_SOURCE_DIR}/${subdir})
+ add_subdirectory("${PCL_SOURCE_DIR}/${subdir}")
endforeach(subdir)
### ---[ Documentation
add_subdirectory(doc)
### ---[ Configure PCLConfig.cmake
-include(${PCL_SOURCE_DIR}/cmake/pcl_pclconfig.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_pclconfig.cmake")
### ---[ Package creation
-include(${PCL_SOURCE_DIR}/cmake/pcl_all_in_one_installer.cmake)
-include(${PCL_SOURCE_DIR}/cmake/pcl_cpack.cmake)
+include("${PCL_SOURCE_DIR}/cmake/pcl_all_in_one_installer.cmake")
+include("${PCL_SOURCE_DIR}/cmake/pcl_cpack.cmake")
if(CPACK_GENERATOR)
message(STATUS "Found CPack generators: ${CPACK_GENERATOR}")
include(CPack)
endif(CPACK_GENERATOR)
### ---[ Make a pretty picture of the dependency graph
-include(${PCL_SOURCE_DIR}/cmake/dep_graph.cmake)
+include("${PCL_SOURCE_DIR}/cmake/dep_graph.cmake")
MAKE_DEP_GRAPH()
### ---[ Finish up
--- /dev/null
+# Contributing to PCL
+
+Please take a moment to review this document in order to make the contribution
+process easy and effective for everyone involved.
+
+Following these guidelines helps to communicate that you respect the time of
+the developers managing and developing this open source project. In return,
+they should reciprocate that respect in addressing your issue or assessing
+patches and features.
+
+
+## Using the issue tracker
+
+The [issue tracker](https://github.com/PointCloudLibrary/pcl/issues) is
+the preferred channel for submitting [pull requests](#pull-requests) and
+[bug reports](#bugs), but please respect the following
+restrictions:
+
+* Please **do not** use the issue tracker for personal support requests (use
+ [mailing list](http://www.pcl-users.org/)).
+
+* Please **do not** derail or troll issues. Keep the discussion on topic and
+ respect the opinions of others.
+
+
+<a name="pull-requests"></a>
+## Pull requests
+
+Good pull requests - patches, improvements, new features - are a fantastic
+help. They should remain focused in scope and avoid containing unrelated
+commits.
+
+**Please ask first** before embarking on any significant pull request (e.g.
+implementing features, refactoring code), otherwise you risk spending a lot of
+time working on something that the project's developers might not want to merge
+into the project. Please read the [tutorial on writing a new PCL class](http://pointclouds.org/documentation/tutorials/writing_new_classes.php#writing-new-classes) if you want to contribute a
+brand new feature.
+
+If you are new to Git, GitHub, or contributing to an open-source project, you
+may want to consult the [step-by-step guide on preparing and submitting a pull request](https://github.com/PointCloudLibrary/pcl/wiki/A-step-by-step-guide-on-preparing-and-submitting-a-pull-request).
+
+
+<a name="checklist"></a>
+### Checklist
+
+Please use the following checklist to make sure that your contribution is well
+prepared for merging into PCL:
+
+1. Source code adheres to the coding conventions described in [PCL Style Guide](http://pointclouds.org/documentation/advanced/pcl_style_guide.php).
+ But if you modify existing code, do not change/fix style in the lines that
+ are not related to your contribution.
+
+2. Commit history is tidy (no merge commits, commits are [squashed](http://davidwalsh.name/squash-commits-git)
+ into logical units).
+
+3. Each contributed file has a [license](#license) text on top.
+
+
+<a name="bugs"></a>
+## Bug reports
+
+A bug is a _demonstrable problem_ that is caused by the code in the repository.
+Good bug reports are extremely helpful - thank you!
+
+Guidelines for bug reports:
+
+1. **Check if the issue has been reported** — use GitHub issue search and
+ mailing list archive search.
+
+2. **Check if the issue has been fixed** — try to reproduce it using the
+ latest `master` branch in the repository.
+
+3. **Isolate the problem** — ideally create a reduced test
+ case.
+
+A good bug report shouldn't leave others needing to chase you up for more
+information. Please try to be as detailed as possible in your report. What is
+your environment? What steps will reproduce the issue? What would you expect to
+be the outcome? All these details will help people to fix any potential bugs.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the OS environment in which it occurs. If
+> suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>
+> Any other information you want to share that is relevant to the issue being
+> reported. This might include the lines of code that you have identified as
+> causing the bug, and potential solutions (and your opinions on their
+> merits).
+
+
+<a name="license"></a>
+## License
+
+PCL is 100% [BSD licensed](LICENSE.txt), and by submitting a patch, you agree to
+allow Open Perception, Inc. to license your work under the terms of the BSD
+License. The corpus of the license should be inserted as a C++ comment on top
+of each `.h` and `.cpp` file:
+
+```cpp
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+```
+
+Please note that if the academic institution or company you are affiliated with
+does not allow to give up the rights, you may insert an additional copyright
+line.
endif(PCL_ALL_IN_ONE_INSTALLER)
# use static Boost in Windows
if(WIN32)
- set(Boost_USE_STATIC_LIBS ON)
- set(Boost_USE_STATIC ON)
+ set(Boost_USE_STATIC_LIBS @Boost_USE_STATIC_LIBS@)
+ set(Boost_USE_STATIC @Boost_USE_STATIC@)
+ set(Boost_USE_MULTITHREAD @Boost_USE_MULTITHREAD@)
endif(WIN32)
if(${CMAKE_VERSION} VERSION_LESS 2.8.5)
SET(Boost_ADDITIONAL_VERSIONS "1.43" "1.43.0" "1.44" "1.44.0" "1.45" "1.45.0" "1.46.1" "1.46.0" "1.46" "1.47" "1.47.0")
# Most likely we are on windows so prefer static libraries over shared ones (Mourad's recommend)
find_library(QHULL_LIBRARY
- NAMES qhullstatic qhull qhull${QHULL_MAJOR_VERSION}
+ NAMES "@QHULL_LIBRARY_NAME@"
HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}"
PATHS "$ENV{PROGRAMFILES}/qhull" "$ENV{PROGRAMW6432}/qhull"
PATH_SUFFIXES project build bin lib)
find_library(QHULL_LIBRARY_DEBUG
- NAMES qhullstatic_d qhull_d qhull${QHULL_MAJOR_VERSION}_d qhull_d${QHULL_MAJOR_VERSION}
- qhull qhull${QHULL_MAJOR_VERSION}
+ NAMES "@QHULL_LIBRARY_DEBUG_NAME@"
HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}"
PATHS "$ENV{PROGRAMFILES}/qhull" "$ENV{PROGRAMW6432}/qhull"
PATH_SUFFIXES project build bin lib)
endif(OPENNI_FOUND)
endmacro(find_openni)
+#remove this as soon as openni2-dev is shipped with FindOpenni2.cmake
+macro(find_openni2)
+ if(NOT OPENNI2_ROOT AND ("ON" STREQUAL "ON"))
+ get_filename_component(OPENNI2_LIBRARY_HINT "OPENNI_LIBRARY-NOTFOUND" PATH)
+ endif(NOT OPENNI2_ROOT AND ("ON" STREQUAL "ON"))
+
+ set(OPENNI2_SUFFIX)
+ if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(OPENNI2_SUFFIX 64)
+ endif(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+
+ if(PKG_CONFIG_FOUND)
+ pkg_check_modules(PC_OPENNI2 openni2-dev)
+ endif(PKG_CONFIG_FOUND)
+
+ find_path(OPENNI2_INCLUDE_DIRS OpenNI.h
+ HINTS /usr/include/openni2 /usr/include/ni2
+ PATHS "$ENV{OPENNI2_INCLUDE${OPENNI2_SUFFIX}}"
+ PATH_SUFFIXES openni openni2 include Include)
+
+ find_library(OPENNI2_LIBRARY
+ NAMES OpenNI2 # No suffix needed on Win64
+ HINTS /usr/lib
+ PATHS "$ENV{OPENNI2_LIB${OPENNI2_SUFFIX}}"
+ PATH_SUFFIXES lib Lib Lib64)
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(OpenNI2 DEFAULT_MSG OPENNI2_LIBRARY OPENNI2_INCLUDE_DIRS)
+
+ if(OPENNI2_FOUND)
+ get_filename_component(OPENNI_LIBRARY_PATH ${OPENNI2_LIBRARY} PATH)
+ set(OPENNI2_LIBRARY_DIRS ${OPENNI2_LIBRARY_PATH})
+ set(OPENNI2_LIBRARIES "${OPENNI2_LIBRARY}")
+ set(OPENNI2_REDIST_DIR $ENV{OPENNI2_REDIST${OPENNI2_SUFFIX}})
+ endif(OPENNI2_FOUND)
+endmacro(find_openni2)
+
#remove this as soon as flann is shipped with FindFlann.cmake
macro(find_flann)
if(PCL_ALL_IN_ONE_INSTALLER)
endmacro(find_flann)
macro(find_VTK)
- if(PCL_ALL_IN_ONE_INSTALLER)
+ if(PCL_ALL_IN_ONE_INSTALLER AND NOT ANDROID)
set(VTK_DIR "${PCL_ROOT}/3rdParty/VTK/lib/vtk-5.8")
- elseif(NOT VTK_DIR)
+ elseif(NOT VTK_DIR AND NOT ANDROID)
set(VTK_DIR "@VTK_DIR@")
- endif(PCL_ALL_IN_ONE_INSTALLER)
- find_package(VTK ${QUIET_})
- if (VTK_FOUND AND NOT ANDROID)
- set(VTK_LIBRARIES vtkCommon vtkRendering vtkHybrid vtkCharts)
- endif(VTK_FOUND AND NOT ANDROID)
+ endif(PCL_ALL_IN_ONE_INSTALLER AND NOT ANDROID)
+ if(NOT ANDROID)
+ find_package(VTK ${QUIET_})
+ if (VTK_FOUND)
+ set(VTK_LIBRARIES "@VTK_LIBRARIES@")
+ endif(VTK_FOUND)
+ endif()
endmacro(find_VTK)
macro(find_libusb)
find_qhull()
elseif("${_lib}" STREQUAL "openni")
find_openni()
+ elseif("${_lib}" STREQUAL "openni2")
+ find_openni2()
elseif("${_lib}" STREQUAL "vtk")
find_VTK()
elseif("${_lib}" STREQUAL "libusb-1.0")
if(${LIB}_LIBRARIES)
list(APPEND PCL_${COMPONENT}_LIBRARIES "${${LIB}_LIBRARIES}")
endif(${LIB}_LIBRARIES)
- if(${LIB}_DEFINITIONS)
+ if(${LIB}_DEFINITIONS AND NOT ${LIB} STREQUAL "VTK")
list(APPEND PCL_${COMPONENT}_DEFINITIONS ${${LIB}_DEFINITIONS})
- endif(${LIB}_DEFINITIONS)
+ endif(${LIB}_DEFINITIONS AND NOT ${LIB} STREQUAL "VTK")
else(${LIB}_FOUND)
if("${_is_optional}" STREQUAL "OPTIONAL")
add_definitions("-DDISABLE_${LIB}")
if(EXISTS "${PCL_ROOT}/3rdParty")
set(PCL_ALL_IN_ONE_INSTALLER ON)
endif(EXISTS "${PCL_ROOT}/3rdParty")
+elseif(EXISTS "${PCL_ROOT}/include/pcl/pcl_config.h")
+ # Found a non-standard (likely ANDROID) PCL installation
+ # pcl_message("Found a PCL installation")
+ set(PCL_INCLUDE_DIRS "${PCL_ROOT}/include")
+ set(PCL_LIBRARY_DIRS "${PCL_ROOT}/lib")
+ if(EXISTS "${PCL_ROOT}/3rdParty")
+ set(PCL_ALL_IN_ONE_INSTALLER ON)
+ endif(EXISTS "${PCL_ROOT}/3rdParty")
elseif(EXISTS "${PCL_DIR}/include/pcl/pcl_config.h")
# Found PCLConfig.cmake in a build tree of PCL
# pcl_message("PCL found into a build tree.")
@PCLCONFIG_OPTIONAL_DEPENDENCIES@
-set(pcl_header_only_components geometry modeler in_hand_scanner)
+set(pcl_header_only_components geometry modeler in_hand_scanner point_cloud_editor cloud_composer optronic_viewer)
include(FindPackageHandleStandardArgs)
PATH)
endif(PCL_${COMPONENT}_LIBRARY_DEBUG)
+ # Restrict this to Windows users
+ if(NOT PCL_${COMPONENT}_LIBRARY AND WIN32)
+ # might be debug only
+ set(PCL_${COMPONENT}_LIBRARY ${PCL_${COMPONENT}_LIBRARY_DEBUG})
+ endif(NOT PCL_${COMPONENT}_LIBRARY AND WIN32)
+
find_package_handle_standard_args(PCL_${COMPONENT} DEFAULT_MSG
PCL_${COMPONENT}_LIBRARY PCL_${COMPONENT}_INCLUDE_DIR)
else(_is_header_only EQUAL -1)
list(REMOVE_DUPLICATES PCL_LIBRARY_DIRS)
endif(NOT "${PCL_LIBRARY_DIRS}" STREQUAL "")
-# We need to export march=native for tutorials or user code
-if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
-list (APPEND PCL_DEFINITIONS "@SSE_FLAGS@")
-endif()
-
-if(NOT MSVC)
-list (APPEND PCL_DEFINITIONS "-Wno-invalid-offsetof")
-endif(NOT MSVC)
-
if(NOT "${PCL_DEFINITIONS}" STREQUAL "")
list(REMOVE_DUPLICATES PCL_DEFINITIONS)
endif(NOT "${PCL_DEFINITIONS}" STREQUAL "")
pcl_remove_duplicate_libraries(PCL_LIBRARIES PCL_DEDUP_LIBRARIES)
set(PCL_LIBRARIES ${PCL_DEDUP_LIBRARIES})
# Add 3rd party libraries, as user code might include our .HPP implementations
-list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${FLANN_LIBRARIES} ${VTK_LIBRARIES})
+list(APPEND PCL_LIBRARIES ${BOOST_LIBRARIES} ${QHULL_LIBRARIES} ${OPENNI_LIBRARIES} ${OPENNI2_LIBRARIES} ${FLANN_LIBRARIES} ${VTK_LIBRARIES})
find_package_handle_standard_args(PCL DEFAULT_MSG PCL_LIBRARIES PCL_INCLUDE_DIRS)
mark_as_advanced(PCL_LIBRARIES PCL_INCLUDE_DIRS PCL_LIBRARY_DIRS)
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- include (${VTK_USE_FILE})
+ include("${VTK_USE_FILE}")
endif(NOT VTK_FOUND)
# OpenNI found?
endif(NOT OPENNI_FOUND)
set(DEFAULT FALSE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni vtk)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni vtk)
if(build)
- include_directories (${CMAKE_CURRENT_BINARY_DIR})
- include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
+ include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
- PCL_ADD_EXECUTABLE(pcl_test_search_speed ${SUBSYS_NAME} src/test_search.cpp)
+ PCL_ADD_EXECUTABLE(pcl_test_search_speed "${SUBSYS_NAME}" src/test_search.cpp)
target_link_libraries(pcl_test_search_speed pcl_common pcl_io pcl_search pcl_kdtree pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_nn_classification_example ${SUBSYS_NAME} src/nn_classification_example.cpp)
+ PCL_ADD_EXECUTABLE(pcl_nn_classification_example "${SUBSYS_NAME}" src/nn_classification_example.cpp)
target_link_libraries(pcl_nn_classification_example pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE(pcl_pyramid_surface_matching ${SUBSYS_NAME} src/pyramid_surface_matching.cpp)
+ PCL_ADD_EXECUTABLE(pcl_pyramid_surface_matching "${SUBSYS_NAME}" src/pyramid_surface_matching.cpp)
target_link_libraries(pcl_pyramid_surface_matching pcl_common pcl_io pcl_features pcl_registration pcl_filters)
- PCL_ADD_EXECUTABLE(pcl_statistical_multiscale_interest_region_extraction_example ${SUBSYS_NAME} src/statistical_multiscale_interest_region_extraction_example.cpp)
+ PCL_ADD_EXECUTABLE(pcl_statistical_multiscale_interest_region_extraction_example "${SUBSYS_NAME}" src/statistical_multiscale_interest_region_extraction_example.cpp)
target_link_libraries(pcl_statistical_multiscale_interest_region_extraction_example pcl_common pcl_io pcl_features pcl_filters)
if(LIBUSB_1_FOUND)
- PCL_ADD_EXECUTABLE(pcl_dinast_grabber ${SUBSYS_NAME} src/dinast_grabber_example.cpp)
+ PCL_ADD_EXECUTABLE(pcl_dinast_grabber "${SUBSYS_NAME}" src/dinast_grabber_example.cpp)
target_link_libraries(pcl_dinast_grabber pcl_common pcl_visualization pcl_io)
endif(LIBUSB_1_FOUND)
if (VTK_FOUND)
- PCL_ADD_EXECUTABLE(pcl_ppf_object_recognition ${SUBSYS_NAME} src/ppf_object_recognition.cpp)
+ PCL_ADD_EXECUTABLE(pcl_ppf_object_recognition "${SUBSYS_NAME}" src/ppf_object_recognition.cpp)
target_link_libraries(pcl_ppf_object_recognition pcl_common pcl_io pcl_filters pcl_features pcl_registration pcl_visualization pcl_sample_consensus pcl_segmentation)
- PCL_ADD_EXECUTABLE(pcl_multiscale_feature_persistence_example ${SUBSYS_NAME} src/multiscale_feature_persistence_example.cpp)
+ PCL_ADD_EXECUTABLE(pcl_multiscale_feature_persistence_example "${SUBSYS_NAME}" src/multiscale_feature_persistence_example.cpp)
target_link_libraries(pcl_multiscale_feature_persistence_example pcl_common pcl_io pcl_filters pcl_features pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_surfel_smoothing_test ${SUBSYS_NAME} src/surfel_smoothing_test.cpp)
+ PCL_ADD_EXECUTABLE(pcl_surfel_smoothing_test "${SUBSYS_NAME}" src/surfel_smoothing_test.cpp)
target_link_libraries(pcl_surfel_smoothing_test pcl_common pcl_io pcl_surface pcl_filters pcl_features pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_feature_matching ${SUBSYS_NAME} src/feature_matching.cpp)
+ PCL_ADD_EXECUTABLE(pcl_feature_matching "${SUBSYS_NAME}" src/feature_matching.cpp)
target_link_libraries(pcl_feature_matching pcl_common pcl_io pcl_registration pcl_keypoints pcl_sample_consensus pcl_visualization pcl_search pcl_features pcl_kdtree pcl_surface pcl_segmentation)
- PCL_ADD_EXECUTABLE(pcl_convolve ${SUBSYS_NAME} src/convolve.cpp)
+ PCL_ADD_EXECUTABLE(pcl_convolve "${SUBSYS_NAME}" src/convolve.cpp)
target_link_libraries(pcl_convolve pcl_common pcl_io pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_pcd_organized_multi_plane_segmentation ${SUBSYS_NAME} src/pcd_organized_multi_plane_segmentation.cpp)
+ PCL_ADD_EXECUTABLE(pcl_pcd_organized_multi_plane_segmentation "${SUBSYS_NAME}" src/pcd_organized_multi_plane_segmentation.cpp)
target_link_libraries(pcl_pcd_organized_multi_plane_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features)
if (QHULL_FOUND)
- PCL_ADD_EXECUTABLE(pcl_pcd_select_object_plane ${SUBSYS_NAME} src/pcd_select_object_plane.cpp)
+ PCL_ADD_EXECUTABLE(pcl_pcd_select_object_plane "${SUBSYS_NAME}" src/pcd_select_object_plane.cpp)
target_link_libraries(pcl_pcd_select_object_plane pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features pcl_surface)
endif()
-# PCL_ADD_EXECUTABLE(pcl_convolve ${SUBSYS_NAME} src/convolve.cpp)
+# PCL_ADD_EXECUTABLE(pcl_convolve "${SUBSYS_NAME}" src/convolve.cpp)
# target_link_libraries(pcl_convolve pcl_common pcl_io pcl_visualization)
+ if (QT4_FOUND AND VTK_USE_QVTK)
+
+ # Manual registration demo
+ QT4_WRAP_UI(manual_registration_ui src/manual_registration/manual_registration.ui)
+ QT4_WRAP_CPP(manual_registration_moc include/pcl/apps/manual_registration.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_manual_registration "${SUBSYS_NAME}" ${manual_registration_ui} ${manual_registration_moc} src/manual_registration/manual_registration.cpp)
+ target_link_libraries(pcl_manual_registration pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface ${QVTK_LIBRARY} ${QT_LIBRARIES})
+
+ QT4_WRAP_UI(pcd_video_player_ui src/pcd_video_player/pcd_video_player.ui)
+ QT4_WRAP_CPP(pcd_video_player_moc include/pcl/apps/pcd_video_player.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_pcd_video_player "${SUBSYS_NAME}" ${pcd_video_player_ui} ${pcd_video_player_moc} src/pcd_video_player/pcd_video_player.cpp)
+ target_link_libraries(pcl_pcd_video_player pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface ${QVTK_LIBRARY} ${QT_LIBRARIES})
+
+ endif (QT4_FOUND AND VTK_USE_QVTK)
+
if (OPENNI_FOUND AND BUILD_OPENNI)
-# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_grab_frame ${SUBSYS_NAME} src/openni_grab_frame.cpp)
+# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_grab_frame "${SUBSYS_NAME}" src/openni_grab_frame.cpp)
# target_link_libraries(pcl_openni_grab_frame pcl_common pcl_io pcl_visualization)
-# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_grab_images ${SUBSYS_NAME} src/openni_grab_images.cpp)
+# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_grab_images "${SUBSYS_NAME}" src/openni_grab_images.cpp)
# target_link_libraries(pcl_openni_grab_images pcl_common pcl_io pcl_visualization)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_fast_mesh ${SUBSYS_NAME} src/openni_fast_mesh.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_fast_mesh "${SUBSYS_NAME}" src/openni_fast_mesh.cpp)
target_link_libraries(pcl_openni_fast_mesh pcl_common pcl_io pcl_visualization pcl_surface)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_voxel_grid ${SUBSYS_NAME} src/openni_voxel_grid.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_voxel_grid "${SUBSYS_NAME}" src/openni_voxel_grid.cpp)
target_link_libraries(pcl_openni_voxel_grid pcl_common pcl_io pcl_filters pcl_visualization)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_octree_compression ${SUBSYS_NAME} src/openni_octree_compression.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_octree_compression "${SUBSYS_NAME}" src/openni_octree_compression.cpp)
target_link_libraries(pcl_openni_octree_compression pcl_common pcl_io pcl_filters pcl_visualization pcl_octree)
if(HAVE_PNG)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_organized_compression ${SUBSYS_NAME} src/openni_organized_compression.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_organized_compression "${SUBSYS_NAME}" src/openni_organized_compression.cpp)
target_link_libraries(pcl_openni_organized_compression pcl_common pcl_io pcl_filters pcl_visualization pcl_octree)
endif(HAVE_PNG)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_shift_to_depth_conversion ${SUBSYS_NAME} src/openni_shift_to_depth_conversion.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_shift_to_depth_conversion "${SUBSYS_NAME}" src/openni_shift_to_depth_conversion.cpp)
target_link_libraries(pcl_openni_shift_to_depth_conversion pcl_common pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_openni_mobile_server ${SUBSYS_NAME} src/openni_mobile_server.cpp)
+ PCL_ADD_EXECUTABLE(pcl_openni_mobile_server "${SUBSYS_NAME}" src/openni_mobile_server.cpp)
target_link_libraries(pcl_openni_mobile_server pcl_common pcl_io pcl_filters pcl_visualization)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_planar_segmentation ${SUBSYS_NAME} src/openni_planar_segmentation.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_planar_segmentation "${SUBSYS_NAME}" src/openni_planar_segmentation.cpp)
target_link_libraries(pcl_openni_planar_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_organized_multi_plane_segmentation ${SUBSYS_NAME} src/openni_organized_multi_plane_segmentation.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_organized_multi_plane_segmentation "${SUBSYS_NAME}" src/openni_organized_multi_plane_segmentation.cpp)
target_link_libraries(pcl_openni_organized_multi_plane_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_ii_normal_estimation ${SUBSYS_NAME} src/openni_ii_normal_estimation.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_ii_normal_estimation "${SUBSYS_NAME}" src/openni_ii_normal_estimation.cpp)
target_link_libraries(pcl_openni_ii_normal_estimation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_feature_persistence ${SUBSYS_NAME} src/openni_feature_persistence.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_feature_persistence "${SUBSYS_NAME}" src/openni_feature_persistence.cpp)
target_link_libraries(pcl_openni_feature_persistence pcl_common pcl_io pcl_filters pcl_visualization pcl_features)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_mls_smoothing ${SUBSYS_NAME} src/openni_mls_smoothing.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_mls_smoothing "${SUBSYS_NAME}" src/openni_mls_smoothing.cpp)
target_link_libraries(pcl_openni_mls_smoothing pcl_common pcl_io pcl_surface pcl_visualization)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_change_viewer ${SUBSYS_NAME} src/openni_change_viewer.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_change_viewer "${SUBSYS_NAME}" src/openni_change_viewer.cpp)
target_link_libraries(pcl_openni_change_viewer pcl_common pcl_io pcl_kdtree pcl_octree pcl_visualization pcl_filters)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_uniform_sampling ${SUBSYS_NAME} src/openni_uniform_sampling.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_uniform_sampling "${SUBSYS_NAME}" src/openni_uniform_sampling.cpp)
target_link_libraries(pcl_openni_uniform_sampling pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface pcl_keypoints)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_boundary_estimation ${SUBSYS_NAME} src/openni_boundary_estimation.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_boundary_estimation "${SUBSYS_NAME}" src/openni_boundary_estimation.cpp)
target_link_libraries(pcl_openni_boundary_estimation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface)
if (QT4_FOUND AND VTK_USE_QVTK)
# OpenNI Passthrough application demo
QT4_WRAP_UI(openni_passthrough_ui src/openni_passthrough.ui)
QT4_WRAP_CPP(openni_passthrough_moc include/pcl/apps/openni_passthrough.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- PCL_ADD_EXECUTABLE(pcl_openni_passthrough ${SUBSYS_NAME} ${openni_passthrough_ui} ${openni_passthrough_moc} src/openni_passthrough.cpp)
- target_link_libraries(pcl_openni_passthrough pcl_common pcl_io pcl_filters pcl_visualization QVTK ${QT_LIBRARIES})
+ PCL_ADD_EXECUTABLE(pcl_openni_passthrough "${SUBSYS_NAME}" ${openni_passthrough_ui} ${openni_passthrough_moc} src/openni_passthrough.cpp)
+ target_link_libraries(pcl_openni_passthrough pcl_common pcl_io pcl_filters pcl_visualization ${QVTK_LIBRARY} ${QT_LIBRARIES})
# OpenNI Organized Connected Component application demo
QT4_WRAP_UI(organized_segmentation_demo_ui src/organized_segmentation_demo.ui)
QT4_WRAP_CPP(organized_segmentation_demo_moc include/pcl/apps/organized_segmentation_demo.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_organized_segmentation_demo ${SUBSYS_NAME} ${organized_segmentation_demo_ui} ${organized_segmentation_demo_moc} src/organized_segmentation_demo.cpp)
- target_link_libraries(pcl_organized_segmentation_demo pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface QVTK ${QT_LIBRARIES})
-
- # Manual registration demo
- QT4_WRAP_UI(manual_registration_ui src/manual_registration/manual_registration.ui)
- QT4_WRAP_CPP(manual_registration_moc include/pcl/apps/manual_registration.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_manual_registration ${SUBSYS_NAME} ${manual_registration_ui} ${manual_registration_moc} src/manual_registration/manual_registration.cpp)
- target_link_libraries(pcl_manual_registration pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface QVTK ${QT_LIBRARIES})
-
- QT4_WRAP_UI(pcd_video_player_ui src/pcd_video_player/pcd_video_player.ui)
- QT4_WRAP_CPP(pcd_video_player_moc include/pcl/apps/pcd_video_player.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_pcd_video_player ${SUBSYS_NAME} ${pcd_video_player_ui} ${pcd_video_player_moc} src/pcd_video_player/pcd_video_player.cpp)
- target_link_libraries(pcl_pcd_video_player pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface QVTK ${QT_LIBRARIES})
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_organized_segmentation_demo "${SUBSYS_NAME}" ${organized_segmentation_demo_ui} ${organized_segmentation_demo_moc} src/organized_segmentation_demo.cpp)
+ target_link_libraries(pcl_organized_segmentation_demo pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface ${QVTK_LIBRARY} ${QT_LIBRARIES})
# Database processing (integration) demo
# QT4_WRAP_UI(db_proc_ui src/db_proc/db_proc.ui)
# QT4_WRAP_CPP(db_proc_moc include/pcl/apps/db_proc.h OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)
-# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_db_proc ${SUBSYS_NAME} ${db_proc_ui} ${db_proc_moc} src/db_proc/db_proc.cpp)
-# target_link_libraries(pcl_db_proc pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface QVTK ${QT_LIBRARIES})
+# PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_db_proc "${SUBSYS_NAME}" ${db_proc_ui} ${db_proc_moc} src/db_proc/db_proc.cpp)
+# target_link_libraries(pcl_db_proc pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface ${QVTK_LIBRARY} ${QT_LIBRARIES})
endif ()
set(srcs src/render_views_tesselated_sphere.cpp)
if (QHULL_FOUND)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_3d_convex_hull ${SUBSYS_NAME} src/openni_3d_convex_hull.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_3d_convex_hull "${SUBSYS_NAME}" src/openni_3d_convex_hull.cpp)
target_link_libraries(pcl_openni_3d_convex_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_3d_concave_hull ${SUBSYS_NAME} src/openni_3d_concave_hull.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_3d_concave_hull "${SUBSYS_NAME}" src/openni_3d_concave_hull.cpp)
target_link_libraries(pcl_openni_3d_concave_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_tracking ${SUBSYS_NAME} src/openni_tracking.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_tracking "${SUBSYS_NAME}" src/openni_tracking.cpp)
target_link_libraries(pcl_openni_tracking pcl_common pcl_io pcl_surface pcl_visualization pcl_filters pcl_features pcl_segmentation pcl_tracking pcl_search)
- set(incs include/pcl/${SUBSYS_NAME}/dominant_plane_segmentation.h ${incs})
- set(impl_incs include/pcl/${SUBSYS_NAME}/impl/dominant_plane_segmentation.hpp)
+ set(incs "include/pcl/${SUBSYS_NAME}/dominant_plane_segmentation.h" ${incs})
+ set(impl_incs "include/pcl/${SUBSYS_NAME}/impl/dominant_plane_segmentation.hpp")
set(srcs src/dominant_plane_segmentation.cpp ${srcs})
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_planar_convex_hull ${SUBSYS_NAME} src/openni_planar_convex_hull.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_planar_convex_hull "${SUBSYS_NAME}" src/openni_planar_convex_hull.cpp)
target_link_libraries(pcl_openni_planar_convex_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_surface)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_linemod "${SUBSYS_NAME}" src/ni_linemod.cpp)
+ target_link_libraries(pcl_ni_linemod pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface pcl_search)
+
endif() # QHULL_FOUND
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
- set(LIB_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${impl_incs} ${incs})
- target_link_libraries(${LIB_NAME} pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search)
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${impl_incs} ${incs})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "" "" "" "" "")
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_agast ${SUBSYS_NAME} src/ni_agast.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_agast "${SUBSYS_NAME}" src/ni_agast.cpp)
target_link_libraries(pcl_ni_agast pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_keypoints pcl_surface pcl_search)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_linemod ${SUBSYS_NAME} src/ni_linemod.cpp)
- target_link_libraries(pcl_ni_linemod pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface pcl_search)
-
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_susan ${SUBSYS_NAME} src/ni_susan.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_susan "${SUBSYS_NAME}" src/ni_susan.cpp)
target_link_libraries(pcl_ni_susan pcl_common pcl_visualization pcl_features pcl_keypoints pcl_search)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ni_trajkovic ${SUBSYS_NAME} src/ni_trajkovic.cpp)
+ target_link_libraries(pcl_ni_trajkovic pcl_common pcl_visualization pcl_features pcl_keypoints pcl_search)
+
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni_klt "${SUBSYS_NAME}" src/openni_klt.cpp)
+ target_link_libraries(pcl_openni_klt pcl_common pcl_io pcl_visualization pcl_tracking)
endif() # OPENNI_FOUND + BUILD_OPENNI
endif() # VTK_FOUND
- add_subdirectory(modeler)
- add_subdirectory(cloud_composer)
- if(OPENNI_FOUND)
- add_subdirectory(in_hand_scanner)
- endif(OPENNI_FOUND)
- add_subdirectory(point_cloud_editor)
- if(FZAPI_FOUND)
- add_subdirectory(optronic_viewer)
- endif(FZAPI_FOUND)
+ # OpenGL and GLUT
+ if(OPENGL_FOUND AND GLUT_FOUND)
+ include_directories("${OPENGL_INCLUDE_DIR}")
+ include_directories("${GLUT_INCLUDE_DIR}")
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_grabcut_2d "${SUBSYS_NAME}" src/grabcut_2d.cpp)
+ target_link_libraries (pcl_grabcut_2d pcl_common pcl_io pcl_segmentation pcl_search ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES})
+ endif(OPENGL_FOUND AND GLUT_FOUND)
+
+ collect_subproject_directory_names("${CMAKE_CURRENT_SOURCE_DIR}" "CMakeLists.txt" PCL_APPS_MODULES_NAMES PCL_APPS_MODULES_DIRS ${SUBSYS_NAME})
+ set(PCL_APPS_MODULES_NAMES_UNSORTED ${PCL_APPS_MODULES_NAMES})
+ topological_sort(PCL_APPS_MODULES_NAMES PCL_APPS_ _DEPENDS)
+ sort_relative(PCL_APPS_MODULES_NAMES_UNSORTED PCL_APPS_MODULES_NAMES PCL_APPS_MODULES_DIRS)
+ foreach(subdir ${PCL_APPS_MODULES_DIRS})
+ add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/${subdir}")
+ endforeach(subdir)
endif(build)
-
-
# string(REGEX REPLACE "-Wconversion(.+)" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
#endif()
-set(SUBSYS_NAME cloud_composer)
-set(SUBSYS_DESC "Cloud Composer - Application for Manipulating Point Clouds")
-set(SUBSYS_DEPS common io visualization filters apps)
+SET(SUBSUBSYS_NAME cloud_composer)
+SET(SUBSUBSYS_DESC "Cloud Composer - Application for Manipulating Point Clouds")
+SET(SUBSUBSYS_DEPS common io visualization filters apps)
# Find VTK
if(NOT VTK_FOUND)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "VTK was not found.")
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- include (${VTK_USE_FILE})
+ include("${VTK_USE_FILE}")
endif(NOT VTK_FOUND)
# QT4 Found?
if(NOT QT4_FOUND)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "Qt4 was not found.")
-else(NOT QT4_FOUND)
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
set(DEFAULT TRUE)
set(REASON)
endif(NOT QT4_FOUND)
# QVTK?
if(NOT VTK_USE_QVTK)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "Cloud composer requires QVTK")
-else(NOT VTK_USE_QVTK)
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
set(DEFAULT TRUE)
set(REASON)
endif(NOT VTK_USE_QVTK)
#Default to not building for now
-set(DEFAULT FALSE)
+if ("${DEFAULT}" STREQUAL "TRUE")
+ set(DEFAULT FALSE)
+endif ("${DEFAULT}" STREQUAL "TRUE")
-PCL_SUBSYS_OPTION(build app_${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build app_${SUBSYS_NAME} ${SUBSYS_DEPS})
+PCL_SUBSUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSUBSYS_DEPEND(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" DEPS ${SUBSUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC(${SUBSUBSYS_NAME})
if(build)
- include_directories (${CMAKE_CURRENT_BINARY_DIR})
- include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
+ include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
- if (VTK_FOUND AND QT4_FOUND AND VTK_USE_QVTK)
#Sources & Headers for main application
- set(incs include/pcl/apps/${SUBSYS_NAME}/qt.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_composer.h
- include/pcl/apps/${SUBSYS_NAME}/project_model.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_viewer.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_view.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_browser.h
- include/pcl/apps/${SUBSYS_NAME}/item_inspector.h
- include/pcl/apps/${SUBSYS_NAME}/tool_interface/abstract_tool.h
- include/pcl/apps/${SUBSYS_NAME}/tool_interface/tool_factory.h
- include/pcl/apps/${SUBSYS_NAME}/commands.h
- include/pcl/apps/${SUBSYS_NAME}/work_queue.h
- include/pcl/apps/${SUBSYS_NAME}/toolbox_model.h
- include/pcl/apps/${SUBSYS_NAME}/properties_model.h
- include/pcl/apps/${SUBSYS_NAME}/signal_multiplexer.h
- include/pcl/apps/${SUBSYS_NAME}/merge_selection.h
- include/pcl/apps/${SUBSYS_NAME}/transform_clouds.h)
+ set(incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/qt.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_composer.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/project_model.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_viewer.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_view.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_browser.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/item_inspector.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tool_interface/abstract_tool.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tool_interface/tool_factory.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/commands.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/work_queue.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/toolbox_model.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/properties_model.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/signal_multiplexer.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/merge_selection.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/transform_clouds.h")
set(srcs src/main.cpp
src/cloud_composer.cpp
src/tool_interface/abstract_tool.cpp
src/transform_clouds.cpp)
- set(impl_incs include/pcl/apps/${SUBSYS_NAME}/impl/cloud_item.hpp
- include/pcl/apps/${SUBSYS_NAME}/impl/merge_selection.hpp
- include/pcl/apps/${SUBSYS_NAME}/impl/transform_clouds.hpp)
+ set(impl_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/cloud_item.hpp"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/merge_selection.hpp"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/transform_clouds.hpp")
#Sources and headers for item types
- set(item_incs include/pcl/apps/${SUBSYS_NAME}/items/cloud_composer_item.h
- include/pcl/apps/${SUBSYS_NAME}/items/cloud_item.h
- include/pcl/apps/${SUBSYS_NAME}/items/normals_item.h
- include/pcl/apps/${SUBSYS_NAME}/items/fpfh_item.h)
+ set(item_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/items/cloud_composer_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/items/cloud_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/items/normals_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/items/fpfh_item.h")
set(item_srcs src/items/cloud_composer_item.cpp
src/items/cloud_item.cpp
src/items/fpfh_item.cpp)
#Sources and headers for point selectors
- set (selector_incs include/pcl/apps/${SUBSYS_NAME}/point_selectors/interactor_style_switch.h
- include/pcl/apps/${SUBSYS_NAME}/point_selectors/rectangular_frustum_selector.h
- include/pcl/apps/${SUBSYS_NAME}/point_selectors/selected_trackball_interactor_style.h
- include/pcl/apps/${SUBSYS_NAME}/point_selectors/click_trackball_interactor_style.h)
+ set (selector_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/point_selectors/interactor_style_switch.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/point_selectors/rectangular_frustum_selector.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/point_selectors/selected_trackball_interactor_style.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/point_selectors/click_trackball_interactor_style.h")
set (selector_srcs src/point_selectors/interactor_style_switch.cpp
src/point_selectors/selection_event.cpp
QT4_WRAP_CPP(cloud_composer_moc ${incs} OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
QT4_ADD_RESOURCES(resource_srcs ${resources})
- set(EXE_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_EXECUTABLE(${EXE_NAME} ${SUBSYS_NAME} ${cloud_composer_ui} ${cloud_composer_moc} ${srcs} ${resource_srcs} ${item_srcs} ${selector_srcs} ${impl_incs})
- target_link_libraries(${EXE_NAME} pcl_common pcl_io pcl_visualization pcl_filters QVTK ${QT_LIBRARIES})
+ set(EXE_NAME "pcl_${SUBSUBSYS_NAME}")
+ PCL_ADD_EXECUTABLE("${EXE_NAME}" "${SUBSUBSYS_NAME}" ${cloud_composer_ui} ${cloud_composer_moc} ${srcs} ${resource_srcs} ${item_srcs} ${selector_srcs} ${impl_incs})
+ target_link_libraries("${EXE_NAME}" pcl_common pcl_io pcl_visualization pcl_filters ${QVTK_LIBRARY} ${QT_LIBRARIES})
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs} ${item_incs} ${selector_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}" ${incs} ${item_incs} ${selector_incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}/impl" ${impl_incs})
- PCL_MAKE_PKGCONFIG(${EXE_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${EXE_NAME}" "${SUBSUBSYS_NAME}" "${SUBSYS_DESC}" "" "" "" "" "")
- #TOOL BUILDING SCRIPTS
+ #TOOL buildING SCRIPTS
#Create subdirectory for plugin libs
- set (CLOUD_COMPOSER_PLUGIN_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cloud_composer_plugins)
- make_directory (${CLOUD_COMPOSER_PLUGIN_DIR})
+ set (CLOUD_COMPOSER_PLUGIN_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cloud_composer_plugins")
+ make_directory("${CLOUD_COMPOSER_PLUGIN_DIR}")
- set(INTERFACE_HEADERS include/pcl/apps/${SUBSYS_NAME}/tool_interface/abstract_tool.h)
+ set(INTERFACE_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tool_interface/abstract_tool.h")
set(INTERFACE_SOURCES src/tool_interface/abstract_tool.cpp)
QT4_WRAP_CPP(INTERFACE_HEADERS_MOC ${INTERFACE_HEADERS} OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- PCL_ADD_LIBRARY(pcl_cc_tool_interface ${SUBSYS_NAME} ${INTERFACE_SOURCES} ${INTERFACE_HEADERS_MOC})
+ PCL_ADD_LIBRARY(pcl_cc_tool_interface "${SUBSUBSYS_NAME}" ${INTERFACE_SOURCES} ${INTERFACE_HEADERS_MOC})
target_link_libraries(pcl_cc_tool_interface pcl_common ${QT_LIBRARIES})
+
+ IF(APPLE)
+ SET_TARGET_PROPERTIES(pcl_cc_tool_interface PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
+ ENDIF()
include(ComposerTool.cmake REQUIRED)
#FPFH Tool
set (FPFH_DEPS pcl_features pcl_kdtree pcl_filters)
set (FPFH_SOURCES tools/fpfh_estimation.cpp)
- set (FPFH_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/fpfh_estimation.h)
+ set (FPFH_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/fpfh_estimation.h")
define_composer_tool (fpfh_estimation "${FPFH_SOURCES}" "${FPFH_HEADERS}" "${FPFH_DEPS}")
#Normals Tool
set (NORMALS_DEPS pcl_features pcl_kdtree)
set (NORMALS_SOURCES tools/normal_estimation.cpp)
- set (NORMALS_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/normal_estimation.h)
+ set (NORMALS_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/normal_estimation.h")
define_composer_tool (normal_estimation "${NORMALS_SOURCES}" "${NORMALS_HEADERS}" "${NORMALS_DEPS}")
#Euclidean Clustering Tool
set (EC_DEPS pcl_segmentation pcl_kdtree)
set (EC_SOURCES tools/euclidean_clustering.cpp)
- set (EC_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/euclidean_clustering.h)
+ set (EC_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/euclidean_clustering.h")
define_composer_tool (euclidean_clustering "${EC_SOURCES}" "${EC_HEADERS}" "${EC_DEPS}")
#Statistical Outlier Removal Tool
set (SOR_DEPS pcl_filters)
set (SOR_SOURCES tools/statistical_outlier_removal.cpp)
- set (SOR_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/statistical_outlier_removal.h)
+ set (SOR_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/statistical_outlier_removal.h")
define_composer_tool (statistical_outlier_removal "${SOR_SOURCES}" "${SOR_HEADERS}" "${SOR_DEPS}")
#Vox Grid Downsample Tool
set (VOXDS_DEPS pcl_filters)
set (VOXDS_SOURCES tools/voxel_grid_downsample.cpp)
- set (VOXDS_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/voxel_grid_downsample.h)
+ set (VOXDS_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/voxel_grid_downsample.h")
define_composer_tool (voxel_grid_downsample "${VOXDS_SOURCES}" "${VOXDS_HEADERS}" "${VOXDS_DEPS}")
#Organized Segmentation
set (OSEG_DEPS pcl_segmentation pcl_kdtree)
- set (OSEG_SOURCES tools/organized_segmentation.cpp include/pcl/apps/${SUBSYS_NAME}/tools/impl/organized_segmentation.hpp)
- set (OSEG_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/organized_segmentation.h)
+ set (OSEG_SOURCES tools/organized_segmentation.cpp "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/impl/organized_segmentation.hpp")
+ set (OSEG_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/organized_segmentation.h")
define_composer_tool (organized_segmentation "${OSEG_SOURCES}" "${OSEG_HEADERS}" "${OSEG_DEPS}")
#Sanitize Cloud Tool
set (SAN_DEPS pcl_filters)
set (SAN_SOURCES tools/sanitize_cloud.cpp)
- set (SAN_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/sanitize_cloud.h)
+ set (SAN_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/sanitize_cloud.h")
define_composer_tool (sanitize_cloud "${SAN_SOURCES}" "${SAN_HEADERS}" "${SAN_DEPS}")
#Supervoxels
set (VSP_DEPS pcl_octree pcl_segmentation)
- set (VSP_SOURCES tools/supervoxels.cpp include/pcl/apps/${SUBSYS_NAME}/tools/impl/supervoxels.hpp)
- set (VSP_HEADERS include/pcl/apps/${SUBSYS_NAME}/tools/supervoxels.h)
+ set (VSP_SOURCES tools/supervoxels.cpp "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/impl/supervoxels.hpp")
+ set (VSP_HEADERS "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/tools/supervoxels.h")
define_composer_tool (supervoxels "${VSP_SOURCES}" "${VSP_HEADERS}" "${VSP_DEPS}")
-
- endif () #VTK_FOUND AND QT4_FOUND AND VTK_USE_QVTK
-
endif(build)
add_dependencies(${TOOL_TARGET} pcl_cc_tool_interface ${DEPS})
target_link_libraries(${TOOL_TARGET} pcl_cc_tool_interface pcl_common pcl_io ${DEPS} ${QT_LIBRARIES})
+
+ IF(APPLE)
+ SET_TARGET_PROPERTIES(${TOOL_TARGET} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
+ ENDIF()
endfunction(define_composer_tool TOOL_NAME TOOL_SOURCES TOOL_HEADERS DEPS)
Q_DECLARE_METATYPE (pcl::cloud_composer::CloudView);
#endif
+
/** \brief Slot Called whenever the item selection_model_ changes */
void
- itemSelectionChanged ( const QItemSelection & selected, const QItemSelection & deselected );
+ itemSelectionChanged ( const QItemSelection &, const QItemSelection &);
/** \brief Creates a new cloud from the selected items and points */
void
}
void
-pcl::cloud_composer::CloudView::dataChanged (const QModelIndex & topLeft, const QModelIndex & bottomRight)
+pcl::cloud_composer::CloudView::dataChanged (const QModelIndex &, const QModelIndex &)
{
}
void
-pcl::cloud_composer::CloudView::selectionCompleted (vtkObject* caller, unsigned long event_id, void* client_data, void* call_data)
+pcl::cloud_composer::CloudView::selectionCompleted (vtkObject*, unsigned long, void*, void* call_data)
{
boost::shared_ptr<SelectionEvent> selected (static_cast<SelectionEvent*> (call_data));
void
-pcl::cloud_composer::CloudView::manipulationCompleted (vtkObject* caller, unsigned long event_id, void* client_data, void* call_data)
+pcl::cloud_composer::CloudView::manipulationCompleted (vtkObject*, unsigned long, void*, void* call_data)
{
boost::shared_ptr<ManipulationEvent> manip_event (static_cast<ManipulationEvent*> (call_data));
model_->manipulateClouds (manip_event);
}
-}
\ No newline at end of file
+}
+
}
bool
-pcl::cloud_composer::DeleteItemCommand::runCommand (AbstractTool* tool)
+pcl::cloud_composer::DeleteItemCommand::runCommand (AbstractTool*)
{
//For delete item command, each selected item should be processed separately
//e.g. delete every selected item
- int num_new_items = 0;
foreach (const CloudComposerItem *item, original_data_)
{
QList <CloudComposerItem*> output;
qCritical () << "Removal of items failed in MergeCloudCommand::redo";
}
-}
\ No newline at end of file
+}
+
}
void
-pcl::cloud_composer::ItemInspector::selectionChanged (const QModelIndex ¤t, const QModelIndex &)
+pcl::cloud_composer::ItemInspector::selectionChanged (const QModelIndex &, const QModelIndex &)
{
//If we have a model loaded, save its tree state
// if (current_item_properties_model_)
}
void
-pcl::cloud_composer::CloudComposerItem::paintView (boost::shared_ptr<pcl::visualization::PCLVisualizer> vis) const
+pcl::cloud_composer::CloudComposerItem::paintView (boost::shared_ptr<pcl::visualization::PCLVisualizer>) const
{
qDebug () << "Paint View in Cloud Composer Item - doing nothing";
}
void
-pcl::cloud_composer::CloudComposerItem::removeFromView (boost::shared_ptr<pcl::visualization::PCLVisualizer> vis) const
+pcl::cloud_composer::CloudComposerItem::removeFromView (boost::shared_ptr<pcl::visualization::PCLVisualizer>) const
{
qDebug () << "Remove from View in Cloud Composer Item - doing nothing";
}
pcl::ExtractIndices<pcl::PCLPointCloud2> filter;
pcl::PCLPointCloud2::Ptr merged_cloud (new pcl::PCLPointCloud2);
+ //To Save the pose of the first original item
+ Eigen::Vector4f source_origin;
+ Eigen::Quaternionf source_orientation;
+ bool pose_found = false;
foreach (const CloudItem* input_cloud_item, selected_item_index_map_.keys ())
{
//If this cloud hasn't been completely selected
filter.filter (*selected_points);
qDebug () << "Original minus indices is "<<original_minus_indices->width;
- Eigen::Vector4f source_origin = input_cloud_item->data (ItemDataRole::ORIGIN).value<Eigen::Vector4f> ();
- Eigen::Quaternionf source_orientation = input_cloud_item->data (ItemDataRole::ORIENTATION).value<Eigen::Quaternionf> ();
+
+ if (!pose_found)
+ {
+ source_origin = input_cloud_item->data (ItemDataRole::ORIGIN).value<Eigen::Vector4f> ();
+ source_orientation = input_cloud_item->data (ItemDataRole::ORIENTATION).value<Eigen::Quaternionf> ();
+ pose_found = true;
+ }
CloudItem* new_cloud_item = new CloudItem (input_cloud_item->text ()
, original_minus_indices
, source_origin
concatenatePointCloud (*merged_cloud, *input_cloud, *temp_cloud);
merged_cloud = temp_cloud;
}
-
+
CloudItem* cloud_item = new CloudItem ("Cloud from Selection"
- , merged_cloud);
+ , merged_cloud
+ , source_origin
+ , source_orientation);
output.append (cloud_item);
return output;
-}
\ No newline at end of file
+}
vtkMapper* mapper = act->actor->GetMapper ();
vtkDataSet* data = mapper->GetInput ();
vtkPolyData* poly_data = vtkPolyData::SafeDownCast (data);
+#if VTK_MAJOR_VERSION > 5
+ id_filter->SetInputData (poly_data);
+#else
id_filter->SetInput (poly_data);
+#endif
//extract_geometry->SetInput (poly_data);
vtkSmartPointer<vtkPolyData> selected = vtkSmartPointer<vtkPolyData>::New ();
glyph_filter->SetOutput (selected);
glyph_filter->Update ();
+#if VTK_MAJOR_VERSION < 6
selected->SetSource (0);
+#endif
if (selected->GetNumberOfPoints() > 0)
{
qDebug () << "Selected " << selected->GetNumberOfPoints () << " points.";
id_selected_data_map.insert ( QString::fromStdString ((*it).first), selected);
- #if VTK_MAJOR_VERSION <= 5
+ #if VTK_MAJOR_VERSION < 6
append->AddInput (selected);
#else // VTK 6
append->AddInputData (selected);
append->Update ();
vtkSmartPointer<vtkPolyData> all_points = append->GetOutput ();
qDebug () << "Allpoints = " <<all_points->GetNumberOfPoints ();
-
- selected_mapper->SetInput (all_points);
+#if VTK_MAJOR_VERSION < 6
+ selected_mapper->SetInput (all_points);
+#else
+ selected_mapper->SetInputData (all_points);
+#endif
selected_mapper->ScalarVisibilityOff ();
vtkIdTypeArray* ids = vtkIdTypeArray::SafeDownCast (all_points->GetPointData ()->GetArray ("OriginalIds"));
pcl::PCLPointCloud2::ConstPtr cloud = cloud_to_save->data (ItemDataRole::CLOUD_BLOB).value <pcl::PCLPointCloud2::ConstPtr> ();
Eigen::Vector4f origin = cloud_to_save->data (ItemDataRole::ORIGIN).value <Eigen::Vector4f> ();
Eigen::Quaternionf orientation = cloud_to_save->data (ItemDataRole::ORIENTATION).value <Eigen::Quaternionf> ();
- int result = pcl::io::savePCDFile (filename.toStdString (), *cloud, origin, orientation );
+ pcl::io::savePCDFile (filename.toStdString (), *cloud, origin, orientation );
}
pcl::cloud_composer::ProjectModel::selectAllItems (QStandardItem* item)
{
- int num_rows;
if (!item)
item = this->invisibleRootItem ();
else
emit newCloudFromSelectionAvailable (onlyCloudItemsSelected ());
//Find out which style is active, emit the signal
- QMap<interactor_styles::INTERACTOR_STYLES, bool>::iterator itr = selected_style_map_.begin();
foreach (interactor_styles::INTERACTOR_STYLES style, selected_style_map_.keys())
{
if (selected_style_map_.value (style))
}
void
-pcl::cloud_composer::ProjectModel::itemSelectionChanged ( const QItemSelection & selected, const QItemSelection & deselected )
+pcl::cloud_composer::ProjectModel::itemSelectionChanged ( const QItemSelection &, const QItemSelection &)
{
//qDebug () << "Item selection changed!";
//Set all point selected cloud items back to green text, since if they are selected they get changed to white
void
-pcl::cloud_composer::PropertiesModel::propertyChanged (QStandardItem* property_item)
+pcl::cloud_composer::PropertiesModel::propertyChanged (QStandardItem*)
{
//qDebug () << "Property Changed in properties model";
parent_item_->propertyChanged ();
-}
\ No newline at end of file
+}
+
}
void
-pcl::cloud_composer::ToolBoxModel::activeProjectChanged(ProjectModel* new_model, ProjectModel* previous_model)
+pcl::cloud_composer::ToolBoxModel::activeProjectChanged(ProjectModel* new_model, ProjectModel*)
{
//Disconnect old project model signal for selection change
if (project_model_)
}
void
-pcl::cloud_composer::ToolBoxModel::selectedItemChanged ( const QItemSelection & selected, const QItemSelection & deselected )
+pcl::cloud_composer::ToolBoxModel::selectedItemChanged ( const QItemSelection & selected, const QItemSelection &)
{
updateEnabledTools (selected);
}
-}
\ No newline at end of file
+}
}
QList <pcl::cloud_composer::CloudComposerItem*>
-pcl::cloud_composer::SanitizeCloudTool::performAction (ConstItemList input_data, PointTypeFlags::PointType type)
+pcl::cloud_composer::SanitizeCloudTool::performAction (ConstItemList input_data, PointTypeFlags::PointType)
{
QList <CloudComposerItem*> output;
const CloudComposerItem* input_item;
parameter_model->addProperty ("Keep Organized", false, Qt::ItemIsEditable | Qt::ItemIsEnabled);
return parameter_model;
-}
\ No newline at end of file
+}
+
}
QList <pcl::cloud_composer::CloudComposerItem*>
-pcl::cloud_composer::VoxelGridDownsampleTool::performAction (ConstItemList input_data, PointTypeFlags::PointType type)
+pcl::cloud_composer::VoxelGridDownsampleTool::performAction (ConstItemList input_data, PointTypeFlags::PointType)
{
QList <CloudComposerItem*> output;
const CloudComposerItem* input_item;
-set(SUBSYS_NAME in_hand_scanner)
-set(SUBSYS_DESC "In-hand scanner for small objects")
-set(SUBSYS_DEPS common features io kdtree apps)
-set(SUBSYS_LIBS pcl_common pcl_features pcl_io pcl_kdtree)
+set(SUBSUBSYS_NAME in_hand_scanner)
+set(SUBSUBSYS_DESC "In-hand scanner for small objects")
+set(SUBSUBSYS_DEPS common features io kdtree apps)
+set(SUBSUBSYS_LIBS pcl_common pcl_features pcl_io pcl_kdtree)
+
+################################################################################
+# Qt
+if(NOT QT4_FOUND)
+ set(DEFAULT AUTO_OFF)
+ set(REASON "Qt4 is required for the in_hand_scanner app!")
+else()
+ set(DEFAULT TRUE)
+ set(REASON)
+endif()
+
+# OpenGL
+if(NOT OPENGL_FOUND AND NOT OPENGL_GLU_FOUND)
+ set(DEFAULT AUTO_OFF)
+ set(REASON "OpenGL & GLU are required for the in_hand_scanner app!")
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
+ set(DEFAULT TRUE)
+ set(REASON)
+endif()
+
+#OpenNI
+if(NOT OPENNI_FOUND OR NOT BUILD_OPENNI)
+ set(DEFAULT AUTO_OFF)
+ set(REASON "OpenNI was not found or was disabled by the user.")
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
+ set(DEFAULT TRUE)
+ set(REASON)
+endif()
+
+# Default to not building for now
+if (${DEFAULT} STREQUAL "TRUE")
+ set(DEFAULT FALSE)
+endif()
+
+pcl_subsubsys_option(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+pcl_subsubsys_depend(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS Qt4 OpenGL OpenGL_GLU openni)
+
+pcl_add_doc("${SUBSUBSYS_NAME}")
################################################################################
set(INCS
- include/pcl/apps/${SUBSYS_NAME}/boost.h
- include/pcl/apps/${SUBSYS_NAME}/common_types.h
- include/pcl/apps/${SUBSYS_NAME}/eigen.h
- include/pcl/apps/${SUBSYS_NAME}/icp.h
- include/pcl/apps/${SUBSYS_NAME}/input_data_processing.h
- include/pcl/apps/${SUBSYS_NAME}/integration.h
- include/pcl/apps/${SUBSYS_NAME}/mesh_processing.h
- include/pcl/apps/${SUBSYS_NAME}/utils.h
- include/pcl/apps/${SUBSYS_NAME}/visibility_confidence.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/common_types.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/icp.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/input_data_processing.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/integration.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/mesh_processing.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/utils.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/visibility_confidence.h"
)
set(IMPL_INCS
- include/pcl/apps/${SUBSYS_NAME}/impl/common_types.hpp
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/common_types.hpp"
)
set(SRCS
)
# Qt
-set(MOC_IN_HAND_SCANNER_INC include/pcl/apps/${SUBSYS_NAME}/in_hand_scanner.h)
-set(MOC_OPENGL_VIEWER_INC include/pcl/apps/${SUBSYS_NAME}/opengl_viewer.h)
-set(MOC_OFFLINE_INTEGRATION_INC include/pcl/apps/${SUBSYS_NAME}/offline_integration.h)
+set(MOC_IN_HAND_SCANNER_INC "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/in_hand_scanner.h")
+set(MOC_OPENGL_VIEWER_INC "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/opengl_viewer.h")
+set(MOC_OFFLINE_INTEGRATION_INC "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/offline_integration.h")
-set(MOC_MAIN_WINDOW_INC include/pcl/apps/${SUBSYS_NAME}/main_window.h)
-set(MOC_HELP_WINDOW_INC include/pcl/apps/${SUBSYS_NAME}/help_window.h)
+set(MOC_MAIN_WINDOW_INC "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/main_window.h")
+set(MOC_HELP_WINDOW_INC "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/help_window.h")
set(UI_MAIN_WINDOW src/main_window.ui)
set(UI_HELP_WINDOW src/help_window.ui)
# Offline integration
set(OI_INCS
- include/pcl/apps/${SUBSYS_NAME}/integration.h
- include/pcl/apps/${SUBSYS_NAME}/visibility_confidence.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/integration.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/visibility_confidence.h"
)
set(OI_SRCS
################################################################################
-# Default to not building for now
-set(DEFAULT FALSE)
-
-pcl_subsys_option(BUILD app_${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-pcl_subsys_depend(BUILD app_${SUBSYS_NAME} ${SUBSYS_DEPS})
-pcl_add_doc(${SUBSYS_NAME})
-
-set(ADDITIONAL_LIBS "")
-if(BUILD)
- # Qt
- if(NOT QT4_FOUND)
- message(WARNING "Qt4 is needed for the in_hand_scanner app! It will not be built!")
- set(BUILD FALSE)
- endif()
-
- # OpenGL
- find_package(OpenGL)
- if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
- list(APPEND ADDITIONAL_LIBS ${OPENGL_LIBRARIES})
- else()
- message(WARNING "OpenGL & GLU are needed for the in_hand_scanner app! It will not be built!")
- set(BUILD FALSE)
- endif()
-endif()
-
-################################################################################
-
-if(BUILD)
+if(build)
# Qt
# http://qtnode.net/wiki/Qt4_with_cmake
# http://qt-project.org/quarterly/view/using_cmake_to_build_qt_projects
set(QT_USE_QTOPENGL TRUE)
- include(${QT_USE_FILE})
- qt4_wrap_cpp(MOC_IN_HAND_SCANNER_SRC ${MOC_IN_HAND_SCANNER_INC})
- qt4_wrap_cpp(MOC_OPENGL_VIEWER_SRC ${MOC_OPENGL_VIEWER_INC} OPTIONS -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- qt4_wrap_cpp(MOC_OFFLINE_INTEGRATION_SRC ${MOC_OFFLINE_INTEGRATION_INC} OPTIONS -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ include("${QT_USE_FILE}")
+ qt4_wrap_cpp(MOC_IN_HAND_SCANNER_SRC "${MOC_IN_HAND_SCANNER_INC}")
+ qt4_wrap_cpp(MOC_OPENGL_VIEWER_SRC "${MOC_OPENGL_VIEWER_INC}" OPTIONS -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ qt4_wrap_cpp(MOC_OFFLINE_INTEGRATION_SRC "${MOC_OFFLINE_INTEGRATION_INC}" OPTIONS -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
- qt4_wrap_cpp(MOC_MAIN_WINDOW_SRC ${MOC_MAIN_WINDOW_INC})
- qt4_wrap_cpp(MOC_HELP_WINDOW_SRC ${MOC_HELP_WINDOW_INC})
- qt4_wrap_ui(UI_MAIN_WINDOW_INC ${UI_MAIN_WINDOW})
- qt4_wrap_ui(UI_HELP_WINDOW_INC ${UI_HELP_WINDOW})
+ qt4_wrap_cpp(MOC_MAIN_WINDOW_SRC "${MOC_MAIN_WINDOW_INC}")
+ qt4_wrap_cpp(MOC_HELP_WINDOW_SRC "${MOC_HELP_WINDOW_INC}")
+ qt4_wrap_ui(UI_MAIN_WINDOW_INC "${UI_MAIN_WINDOW}")
+ qt4_wrap_ui(UI_HELP_WINDOW_INC "${UI_HELP_WINDOW}")
list(APPEND ADDITIONAL_LIBS ${QT_LIBRARIES})
- include_directories(${CMAKE_CURRENT_BINARY_DIR}) # For the ui files
+ include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
# In-hand scanner
- list(APPEND INCS ${MOC_IN_HAND_SCANNER_INC} ${MOC_OPENGL_VIEWER_INC} ${MOC_MAIN_WINDOW_INC} ${MOC_HELP_WINDOW_INC} ${UI_MAIN_WINDOW_INC} ${UI_HELP_WINDOW_INC})
- list(APPEND SRCS ${MOC_IN_HAND_SCANNER_SRC} ${MOC_OPENGL_VIEWER_SRC} ${MOC_MAIN_WINDOW_SRC} ${MOC_HELP_WINDOW_SRC})
-
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ list(APPEND INCS "${MOC_IN_HAND_SCANNER_INC}" "${MOC_OPENGL_VIEWER_INC}" "${MOC_MAIN_WINDOW_INC}" "${MOC_HELP_WINDOW_INC}" "${UI_MAIN_WINDOW_INC}" "${UI_HELP_WINDOW_INC}")
+ list(APPEND SRCS "${MOC_IN_HAND_SCANNER_SRC}" "${MOC_OPENGL_VIEWER_SRC}" "${MOC_MAIN_WINDOW_SRC}" "${MOC_HELP_WINDOW_SRC}")
- set(EXE_NAME pcl_${SUBSYS_NAME})
- pcl_add_executable_opt_bundle(${EXE_NAME} ${SUBSYS_NAME} ${SRCS} ${INCS} ${IMPL_INCS})
- target_link_libraries(${EXE_NAME} ${SUBSYS_LIBS} ${ADDITIONAL_LIBS})
+ set(EXE_NAME "pcl_${SUBSUBSYS_NAME}")
+ pcl_add_executable_opt_bundle("${EXE_NAME}" "${SUBSUBSYS_NAME}" ${SRCS} ${INCS} ${IMPL_INCS})
+ target_link_libraries("${EXE_NAME}" ${SUBSUBSYS_LIBS} ${OPENGL_LIBRARIES} ${QT_LIBRARIES})
- pcl_add_includes(${SUBSYS_NAME} ${SUBSYS_NAME} ${INCS})
- pcl_add_includes(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${IMPL_INCS})
+ pcl_add_includes("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}" ${INCS})
+ pcl_add_includes("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}/impl" ${IMPL_INCS})
- pcl_make_pkgconfig(${EXE_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ pcl_make_pkgconfig("${EXE_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" "" "" "" "" "")
# Offline integration
- list(APPEND OI_INCS ${MOC_OPENGL_VIEWER_INC} ${MOC_OFFLINE_INTEGRATION_INC})
- list(APPEND OI_SRCS ${MOC_OPENGL_VIEWER_SRC} ${MOC_OFFLINE_INTEGRATION_SRC})
+ list(APPEND OI_INCS "${MOC_OPENGL_VIEWER_INC}" "${MOC_OFFLINE_INTEGRATION_INC}")
+ list(APPEND OI_SRCS "${MOC_OPENGL_VIEWER_SRC}" "${MOC_OFFLINE_INTEGRATION_SRC}")
- pcl_add_executable_opt_bundle(pcl_offline_integration ${SUBSYS_NAME} ${OI_SRCS} ${OI_INCS})
- target_link_libraries(pcl_offline_integration ${SUBSYS_LIBS} ${ADDITIONAL_LIBS})
+ pcl_add_executable_opt_bundle(pcl_offline_integration "${SUBSUBSYS_NAME}" ${OI_SRCS} ${OI_INCS})
+ target_link_libraries(pcl_offline_integration ${SUBSUBSYS_LIBS} ${OPENGL_LIBRARIES} ${QT_LIBRARIES})
endif()
#include <typeinfo>
#include <cstdlib>
-#ifdef __APPLE__
-# include <OpenGL/gl.h>
-# include <OpenGL/glu.h>
+#include <pcl/pcl_config.h>
+#ifdef OPENGL_IS_A_FRAMEWORK
+# include <OpenGL/gl.h>
+# include <OpenGL/glu.h>
#else
-# include <GL/gl.h>
-# include <GL/glu.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
#endif
#include <QtOpenGL>
if (int (cloud_filtered_->points.size ()) < k_)
{
- PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.",
+ PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %lu points! Aborting.",
cloud_filtered_->points.size ());
return;
}
if (int (cloud_filtered_->points.size ()) < k_)
{
- PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.",
+ PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %lu points! Aborting.",
cloud_filtered_->points.size ());
return;
}
if (int (cloud_filtered_->points.size ()) < k_)
{
- PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.",
+ PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %lu points! Aborting.",
cloud_filtered_->points.size ());
return;
}
grid_.setInputCloud (cloud_filtered_);
grid_.filter (*cloud_downsampled_);
- PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering (%f -> %f): %zu out of %zu\n",
+ PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering (%f -> %f): %lu out of %lu\n",
min_z_bounds_, max_z_bounds_, cloud_downsampled_->points.size (), input_->points.size ());
// ---[ Estimate the point normals
n3d_.setInputCloud (cloud_downsampled_);
n3d_.compute (*cloud_normals_);
- PCL_INFO ("[DominantPlaneSegmentation] %zu normals estimated. \n", cloud_normals_->points.size ());
+ PCL_INFO ("[DominantPlaneSegmentation] %lu normals estimated. \n", cloud_normals_->points.size ());
// ---[ Perform segmentation
seg_.setInputCloud (cloud_downsampled_);
cluster_.setIndices (boost::make_shared<const pcl::PointIndices> (cloud_object_indices));
cluster_.extract (clusters2);
- PCL_INFO ("[DominantPlaneSegmentation::compute()] Number of clusters found matching the given constraints: %zu.\n",
+ PCL_INFO ("[DominantPlaneSegmentation::compute()] Number of clusters found matching the given constraints: %lu.\n",
clusters2.size ());
clusters.resize (clusters2.size ());
if (int (cloud_filtered_->points.size ()) < k_)
{
- PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.",
+ PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %lu points! Aborting.",
cloud_filtered_->points.size ());
return;
}
grid_.setInputCloud (cloud_filtered_);
grid_.filter (*cloud_downsampled_);
- PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering&downsampling (%f -> %f): %zu out of %zu\n",
+ PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering&downsampling (%f -> %f): %lu out of %lu\n",
min_z_bounds_, max_z_bounds_, cloud_downsampled_->points.size (), input_->points.size ());
// ---[ Estimate the point normals
n3d_.setInputCloud (cloud_downsampled_);
n3d_.compute (*cloud_normals_);
- PCL_INFO ("[DominantPlaneSegmentation] %zu normals estimated. \n", cloud_normals_->points.size ());
+ PCL_INFO ("[DominantPlaneSegmentation] %lu normals estimated. \n", cloud_normals_->points.size ());
// ---[ Perform segmentation
seg_.setInputCloud (cloud_downsampled_);
cluster_.setIndices (boost::make_shared<const pcl::PointIndices> (cloud_object_indices));
cluster_.extract (clusters2);
- PCL_INFO ("[DominantPlaneSegmentation::compute_full()] Number of clusters found matching the given constraints: %zu.\n",
+ PCL_INFO ("[DominantPlaneSegmentation::compute_full()] Number of clusters found matching the given constraints: %lu.\n",
clusters2.size ());
clusters.resize (clusters2.size ());
-set(SUBSYS_NAME modeler)
-set(SUBSYS_DESC "PCLModeler: PCL based reconstruction platform")
-set(SUBSYS_DEPS common geometry io filters sample_consensus segmentation visualization kdtree features surface octree registration keypoints tracking search apps)
+set(SUBSUBSYS_NAME modeler)
+set(SUBSUBSYS_DESC "PCLModeler: PCL based reconstruction platform")
+set(SUBSUBSYS_DEPS common geometry io filters sample_consensus segmentation visualization kdtree features surface octree registration keypoints tracking search apps)
set(REASON "")
# Find VTK and QVTK
if(VTK_FOUND AND VTK_USE_QVTK)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
elseif(NOT VTK_FOUND)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "VTK was not found.")
elseif(NOT VTK_USE_QVTK)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "VTK was not built with Qt support.")
endif(VTK_FOUND AND VTK_USE_QVTK)
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
-
# Default to not building for now
-set(DEFAULT FALSE)
+if (${DEFAULT} STREQUAL "TRUE")
+ set(DEFAULT FALSE)
+endif()
-PCL_SUBSYS_OPTION(build app_${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build app_${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS vtk)
+PCL_SUBSUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSUBSYS_DEPEND(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS vtk)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSUBSYS_NAME}")
if(build)
-
- include_directories (${CMAKE_CURRENT_BINARY_DIR})
- include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
+ include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Set Qt files and resources here
set(uis main_window.ui)
- set(moc_incs include/pcl/apps/${SUBSYS_NAME}/main_window.h
- include/pcl/apps/${SUBSYS_NAME}/scene_tree.h
- include/pcl/apps/${SUBSYS_NAME}/parameter_dialog.h
- include/pcl/apps/${SUBSYS_NAME}/thread_controller.h
- include/pcl/apps/${SUBSYS_NAME}/abstract_worker.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_mesh_item_updater.h)
+ set(moc_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/main_window.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/scene_tree.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/parameter_dialog.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/thread_controller.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/abstract_worker.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_mesh_item_updater.h")
set(resources resources/resources.qrc)
set(incs ${moc_incs}
- include/pcl/apps/${SUBSYS_NAME}/qt.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/qt.h"
- include/pcl/apps/${SUBSYS_NAME}/dock_widget.h
- include/pcl/apps/${SUBSYS_NAME}/abstract_item.h
- include/pcl/apps/${SUBSYS_NAME}/render_window.h
- include/pcl/apps/${SUBSYS_NAME}/render_window_item.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/dock_widget.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/abstract_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/render_window.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/render_window_item.h"
- include/pcl/apps/${SUBSYS_NAME}/parameter.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/parameter.h"
- include/pcl/apps/${SUBSYS_NAME}/cloud_mesh.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_mesh_item.h
- include/pcl/apps/${SUBSYS_NAME}/channel_actor_item.h
- include/pcl/apps/${SUBSYS_NAME}/points_actor_item.h
- include/pcl/apps/${SUBSYS_NAME}/normals_actor_item.h
- include/pcl/apps/${SUBSYS_NAME}/surface_actor_item.h
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_mesh.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_mesh_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/channel_actor_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/points_actor_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/normals_actor_item.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/surface_actor_item.h"
- include/pcl/apps/${SUBSYS_NAME}/icp_registration_worker.h
- include/pcl/apps/${SUBSYS_NAME}/voxel_grid_downsample_worker.h
- include/pcl/apps/${SUBSYS_NAME}/statistical_outlier_removal_worker.h
- include/pcl/apps/${SUBSYS_NAME}/normal_estimation_worker.h
- include/pcl/apps/${SUBSYS_NAME}/poisson_worker.h)
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/icp_registration_worker.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/voxel_grid_downsample_worker.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/statistical_outlier_removal_worker.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/normal_estimation_worker.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/poisson_worker.h")
set(srcs src/main.cpp
src/normal_estimation_worker.cpp
src/poisson_worker.cpp)
- set(impl_incs include/pcl/apps/${SUBSYS_NAME}/impl/parameter.hpp
- include/pcl/apps/${SUBSYS_NAME}/impl/scene_tree.hpp)
+ set(impl_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/parameter.hpp"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/impl/scene_tree.hpp")
# Qt stuff
QT4_WRAP_UI(ui_srcs ${uis})
SET_SOURCE_FILES_PROPERTIES(${srcs} PROPERTIES OBJECT_DEPENDS "${ui_srcs}")
# Generate executable
- set(EXE_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_EXECUTABLE(${EXE_NAME} ${SUBSYS_NAME} ${ui_srcs} ${moc_srcs} ${resource_srcs} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${EXE_NAME} pcl_common pcl_io pcl_kdtree pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search QVTK ${QT_LIBRARIES})
+ set(EXE_NAME "pcl_${SUBSUBSYS_NAME}")
+ PCL_ADD_EXECUTABLE("${EXE_NAME}" "${SUBSUBSYS_NAME}" ${ui_srcs} ${moc_srcs} ${resource_srcs} ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${EXE_NAME}" pcl_common pcl_io pcl_kdtree pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search ${QVTK_LIBRARY} ${QT_LIBRARIES})
# Put the ui in the windows project file
- IF (${CMAKE_BUILD_TOOL} MATCHES "msdev")
- SET (srcs ${srcs} ${uis})
- ENDIF (${CMAKE_BUILD_TOOL} MATCHES "msdev")
- IF (${CMAKE_BUILD_TOOL} MATCHES "devenv")
- SET (srcs ${srcs} ${uis})
- ENDIF (${CMAKE_BUILD_TOOL} MATCHES "devenv")
+ IF("${CMAKE_BUILD_TOOL}" MATCHES "msdev")
+ LIST(APPEND srcs ${uis})
+ ELSEIF("${CMAKE_BUILD_TOOL}" MATCHES "devenv")
+ LIST(APPEND srcs ${uis})
+ ENDIF("${CMAKE_BUILD_TOOL}" MATCHES "msdev")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}/impl" ${impl_incs})
- PCL_MAKE_PKGCONFIG(${EXE_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${EXE_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" "" "" "" "" "")
add_subdirectory(tools)
// Set the euclidean distance difference epsilon (criterion 3)
icp.setEuclideanFitnessEpsilon (*euclidean_fitness_epsilon_);
- icp.setInputCloud(cloud_mesh_item->getCloudMesh()->getCloud());
+ icp.setInputSource(cloud_mesh_item->getCloudMesh()->getCloud());
icp.setInputTarget(cloud_);
pcl::PointCloud<CloudMesh::PointT> result;
icp.align(result);
createNormalLines();
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput(poly_data_);
+#else
+ mapper->SetInputData (poly_data_);
+#endif
vtkSmartPointer<vtkDataArray> scalars;
cloud_mesh_->getColorScalarsFromField(scalars, color_scheme_);
scalars->GetRange(minmax);
actor_->GetMapper()->SetScalarRange(minmax);
- poly_data_->Update();
-
return;
}
pcl::modeler::PointsActorItem::initImpl()
{
poly_data_->SetPoints(cloud_mesh_->getVtkPoints());
- poly_data_->Update();
vtkSmartPointer<vtkVertexGlyphFilter> vertex_glyph_filter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
-#if VTK_MAJOR_VERSION <= 5
+#if VTK_MAJOR_VERSION < 6
vertex_glyph_filter->AddInput(poly_data_);
#else
- vertex_glyph_filter->AddInputData(polydata);
+ vertex_glyph_filter->AddInputData (poly_data_);
#endif
vertex_glyph_filter->Update();
scalars->GetRange(minmax);
actor_->GetMapper()->SetScalarRange(minmax);
- poly_data_->Update();
-
return;
}
vtkSmartPointer<vtkDataArray> scalars;
cloud_mesh_->getColorScalarsFromField(scalars, color_scheme_);
poly_data_->GetPointData ()->SetScalars (scalars);
- poly_data_->Update();
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput(poly_data_);
+#else
+ mapper->SetInputData (poly_data_);
+#endif
double minmax[2];
scalars->GetRange(minmax);
scalars->GetRange(minmax);
actor_->GetMapper()->SetScalarRange(minmax);
- poly_data_->Update();
-
return;
}
-set(SUBSYS_NAME optronic_viewer)
-set(SUBSYS_DESC "PCL Optronic Viewer")
-set(SUBSYS_DEPS common geometry io filters sample_consensus segmentation visualization kdtree features surface octree registration keypoints tracking search apps)
-set(DEFAULT OFF)
-set(REASON "")
+set(SUBSUBSYS_NAME optronic_viewer)
+set(SUBSUBSYS_DESC "PCL Optronic Viewer")
+set(SUBSUBSYS_DEPS common geometry io filters sample_consensus segmentation visualization kdtree features surface octree registration keypoints tracking search apps)
# Find VTK and QVTK
if(VTK_FOUND AND VTK_USE_QVTK)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
elseif(NOT VTK_FOUND)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "VTK was not found.")
elseif(NOT VTK_USE_QVTK)
- set(DEFAULT FALSE)
+ set(DEFAULT AUTO_OFF)
set(REASON "VTK was not built with Qt support.")
endif(VTK_FOUND AND VTK_USE_QVTK)
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+# Find QT
+if(NOT QT_USE_FILE)
+ set(DEFAULT AUTO_OFF)
+ set(REASON "Qt was not found.")
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
+ set(DEFAULT TRUE)
+ set(REASON)
+endif(NOT QT_USE_FILE)
+
+# FZAPI
+if(FZAPI_FOUND)
+ set(DEFAULT TRUE)
+ set(REASON)
+elseif(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
+ set(DEFAULT AUTO_OFF)
+ set(REASON "FZAPI was not found.")
+endif()
# Default to not building for now
-set(DEFAULT FALSE)
+if (${DEFAULT} STREQUAL "TRUE")
+ set(DEFAULT FALSE)
+endif()
-PCL_SUBSYS_OPTION(build app_${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build app_${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS vtk)
+PCL_SUBSUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSUBSYS_DEPEND(build "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" DEPS ${SUBSUBSYS_DEPS} EXT_DEPS vtk)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSUBSYS_NAME}")
if(build)
- include_directories (${CMAKE_CURRENT_BINARY_DIR})
- include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
+ include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Set Qt files and resources here
# set(uis main_window.ui)
- set(moc_incs include/pcl/apps/${SUBSYS_NAME}/main_window.h
- include/pcl/apps/${SUBSYS_NAME}/filter_window.h
- include/pcl/apps/${SUBSYS_NAME}/openni_grabber.h)
-# include/pcl/apps/${SUBSYS_NAME}/scene_tree.h
-# include/pcl/apps/${SUBSYS_NAME}/parameter_dialog.h
-# include/pcl/apps/${SUBSYS_NAME}/thread_controller.h
-# include/pcl/apps/${SUBSYS_NAME}/abstract_worker.h
-# include/pcl/apps/${SUBSYS_NAME}/cloud_mesh_item_updater.h)
+ set(moc_incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/main_window.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/filter_window.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/openni_grabber.h")
+# "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/scene_tree.h"
+# "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/parameter_dialog.h"
+# "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/thread_controller.h"
+# "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/abstract_worker.h"
+# "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_mesh_item_updater.h")
# set(resources resources/resources.qrc)
# set(incs ${moc_incs})
- set(incs include/pcl/apps/${SUBSYS_NAME}/qt.h
- include/pcl/apps/${SUBSYS_NAME}/openni_grabber.h
- include/pcl/apps/${SUBSYS_NAME}/cloud_filter.h
- include/pcl/apps/${SUBSYS_NAME}/main_window.h
- include/pcl/apps/${SUBSYS_NAME}/filter_window.h)
+ set(incs "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/qt.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/openni_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/cloud_filter.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/main_window.h"
+ "include/pcl/${SUBSYS_NAME}/${SUBSUBSYS_NAME}/filter_window.h")
set(srcs src/main.cpp
src/cloud_filter.cpp
# SET_SOURCE_FILES_PROPERTIES(${srcs} PROPERTIES OBJECT_DEPENDS "${ui_srcs}")
# Generate executable
- set(EXE_NAME pcl_${SUBSYS_NAME})
-# PCL_ADD_EXECUTABLE(${EXE_NAME} ${SUBSYS_NAME} ${ui_srcs} ${moc_srcs} ${resource_srcs} ${srcs} ${incs} ${impl_incs})
- PCL_ADD_EXECUTABLE(${EXE_NAME} ${SUBSYS_NAME} ${moc_srcs} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${EXE_NAME} pcl_common pcl_io pcl_kdtree pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search QVTK ${QT_LIBRARIES})
+ set(EXE_NAME "pcl_${SUBSUBSYS_NAME}")
+# PCL_ADD_EXECUTABLE("${EXE_NAME}" "${SUBSUBSYS_NAME}" ${ui_srcs} ${moc_srcs} ${resource_srcs} ${srcs} ${incs} ${impl_incs})
+ PCL_ADD_EXECUTABLE("${EXE_NAME}" "${SUBSUBSYS_NAME}" ${moc_srcs} ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${EXE_NAME}" pcl_common pcl_io pcl_kdtree pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search QVTK ${QT_LIBRARIES})
# Put the ui in the windows project file
- IF (${CMAKE_BUILD_TOOL} MATCHES "msdev")
- SET (srcs ${srcs} ${uis})
- ENDIF (${CMAKE_BUILD_TOOL} MATCHES "msdev")
- IF (${CMAKE_BUILD_TOOL} MATCHES "devenv")
- SET (srcs ${srcs} ${uis})
- ENDIF (${CMAKE_BUILD_TOOL} MATCHES "devenv")
+ IF("${CMAKE_BUILD_TOOL}" MATCHES "msdev")
+ LIST(APPEND srcs ${uis})
+ ELSEIF("${CMAKE_BUILD_TOOL}" MATCHES "devenv")
+ LIST(APPEND srcs ${uis})
+ ENDIF("${CMAKE_BUILD_TOOL}" MATCHES "msdev")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSUBSYS_NAME}/impl" ${impl_incs})
- PCL_MAKE_PKGCONFIG(${EXE_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${EXE_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" "" "" "" "" "")
endif(build)
-SET(SUBSYS_NAME point_cloud_editor)
-SET(SUBSYS_DESC "Point Cloud Editor - Simple editor for 3D point clouds")
-SET(SUBSYS_DEPS common filters io apps)
+SET(SUBSUBSYS_NAME point_cloud_editor)
+SET(SUBSUBSYS_DESC "Point Cloud Editor - Simple editor for 3D point clouds")
+SET(SUBSUBSYS_DEPS common filters io apps)
-SET(MOC_INCS include/pcl/apps/${SUBSYS_NAME}/cloudEditorWidget.h
- include/pcl/apps/${SUBSYS_NAME}/mainWindow.h
- include/pcl/apps/${SUBSYS_NAME}/denoiseParameterForm.h
- include/pcl/apps/${SUBSYS_NAME}/statisticsDialog.h
+SET(MOC_INCS "include/pcl/apps/${SUBSUBSYS_NAME}/cloudEditorWidget.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/mainWindow.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/denoiseParameterForm.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/statisticsDialog.h"
)
SET(RSRC resources/pceditor_resources.qrc)
SET(INCS ${MOC_INCS}
- include/pcl/apps/${SUBSYS_NAME}/cloud.h
- include/pcl/apps/${SUBSYS_NAME}/cloudTransformTool.h
- include/pcl/apps/${SUBSYS_NAME}/command.h
- include/pcl/apps/${SUBSYS_NAME}/commandQueue.h
- include/pcl/apps/${SUBSYS_NAME}/common.h
- include/pcl/apps/${SUBSYS_NAME}/copyBuffer.h
- include/pcl/apps/${SUBSYS_NAME}/copyCommand.h
- include/pcl/apps/${SUBSYS_NAME}/cutCommand.h
- include/pcl/apps/${SUBSYS_NAME}/deleteCommand.h
- include/pcl/apps/${SUBSYS_NAME}/denoiseCommand.h
- include/pcl/apps/${SUBSYS_NAME}/localTypes.h
- include/pcl/apps/${SUBSYS_NAME}/pasteCommand.h
- include/pcl/apps/${SUBSYS_NAME}/select1DTool.h
- include/pcl/apps/${SUBSYS_NAME}/select2DTool.h
- include/pcl/apps/${SUBSYS_NAME}/selection.h
- include/pcl/apps/${SUBSYS_NAME}/selectionTransformTool.h
- include/pcl/apps/${SUBSYS_NAME}/statistics.h
- include/pcl/apps/${SUBSYS_NAME}/toolInterface.h
- include/pcl/apps/${SUBSYS_NAME}/trackball.h
- include/pcl/apps/${SUBSYS_NAME}/transformCommand.h
+ "include/pcl/apps/${SUBSUBSYS_NAME}/cloud.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/cloudTransformTool.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/command.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/commandQueue.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/common.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/copyBuffer.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/copyCommand.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/cutCommand.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/deleteCommand.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/denoiseCommand.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/localTypes.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/pasteCommand.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/select1DTool.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/select2DTool.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/selection.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/selectionTransformTool.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/statistics.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/toolInterface.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/trackball.h"
+ "include/pcl/apps/${SUBSUBSYS_NAME}/transformCommand.h"
)
-SET(SRCS src/main.cpp
- src/mainWindow.cpp
- src/commandQueue.cpp
- src/selection.cpp
- src/copyBuffer.cpp
- src/deleteCommand.cpp
- src/cutCommand.cpp
- src/pasteCommand.cpp
- src/cloud.cpp
- src/cloudEditorWidget.cpp
- src/cloudTransformTool.cpp
- src/select1DTool.cpp
- src/select2DTool.cpp
- src/selectionTransformTool.cpp
- src/transformCommand.cpp
- src/common.cpp
- src/denoiseCommand.cpp
- src/statistics.cpp
- src/statisticsDialog.cpp
- src/trackball.cpp
- src/denoiseParameterForm.cpp
+SET(SRCS src/main.cpp
+ src/mainWindow.cpp
+ src/commandQueue.cpp
+ src/selection.cpp
+ src/copyBuffer.cpp
+ src/deleteCommand.cpp
+ src/cutCommand.cpp
+ src/pasteCommand.cpp
+ src/cloud.cpp
+ src/cloudEditorWidget.cpp
+ src/cloudTransformTool.cpp
+ src/select1DTool.cpp
+ src/select2DTool.cpp
+ src/selectionTransformTool.cpp
+ src/transformCommand.cpp
+ src/common.cpp
+ src/denoiseCommand.cpp
+ src/statistics.cpp
+ src/statisticsDialog.cpp
+ src/trackball.cpp
+ src/denoiseParameterForm.cpp
)
IF(NOT QT4_FOUND)
- SET(DEFAULT FALSE)
+ SET(DEFAULT AUTO_OFF)
SET(REASON "Qt4 was not found.")
ELSE(NOT QT4_FOUND)
SET(DEFAULT TRUE)
SET(REASON)
ENDIF(NOT QT4_FOUND)
+
# Find OpenGL
-find_package(OpenGL)
IF(NOT OPENGL_FOUND)
- SET(DEFAULT FALSE)
+ SET(DEFAULT AUTO_OFF)
SET(REASON "OpenGL was not found.")
-ELSE(NOT OPENGL_FOUND)
+ELSEIF(NOT ${DEFAULT} STREQUAL "AUTO_OFF")
SET(DEFAULT TRUE)
SET(REASON)
ENDIF(NOT OPENGL_FOUND)
# Default to not building for now
-set(DEFAULT FALSE)
-SET(REASON "")
+if (${DEFAULT} STREQUAL "TRUE")
+ set(DEFAULT FALSE)
+endif()
-PCL_SUBSYS_OPTION(BUILD app_${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(BUILD app_${SUBSYS_NAME} ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_SUBSUBSYS_OPTION(BUILD "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSUBSYS_DEPEND(BUILD "${SUBSYS_NAME}" "${SUBSUBSYS_NAME}" ${SUBSYS_DEPS})
+PCL_ADD_DOC(${SUBSUBSYS_NAME})
IF(BUILD)
-
- INCLUDE(${QT_USE_FILE})
+ INCLUDE("${QT_USE_FILE}")
SET(QT_USE_QTOPENGL TRUE)
#QT4_WRAP_CPP(MOC_SRCS ${MOC_INCS})
QT4_WRAP_CPP(MOC_SRCS ${MOC_INCS} OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)
QT4_ADD_RESOURCES(RESOURCES_SRCS ${RSRC})
- INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/include
- ${QT_QT_INCLUDE_DIR}
- ${QT_QTOPENGL_INCLUDE_DIR}
- )
-
- SET(EXE_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_EXECUTABLE(${EXE_NAME}
- ${SUBSYS_NAME}
- ${SRCS}
- ${RESOURCES_SRCS}
- ${MOC_SRCS}
- ${INCS}
- )
+ INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include"
+ "${QT_QTOPENGL_INCLUDE_DIR}"
+ )
- TARGET_LINK_LIBRARIES(${EXE_NAME}
- ${QT_LIBRARIES}
- ${QT_QTOPENGL_LIBRARY}
- ${OPENGL_LIBRARIES}
- ${BOOST_LIBRARIES}
- pcl_common
- pcl_io
- pcl_filters
- )
+ SET(EXE_NAME "pcl_${SUBSUBSYS_NAME}")
+ PCL_ADD_EXECUTABLE("${EXE_NAME}"
+ "${SUBSUBSYS_NAME}"
+ ${SRCS}
+ ${RESOURCES_SRCS}
+ ${MOC_SRCS}
+ ${INCS}
+ )
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${INCS})
- PCL_MAKE_PKGCONFIG(${EXE_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "")
+ TARGET_LINK_LIBRARIES("${EXE_NAME}"
+ ${QT_LIBRARIES}
+ ${QT_QTOPENGL_LIBRARY}
+ ${OPENGL_LIBRARIES}
+ ${BOOST_LIBRARIES}
+ pcl_common
+ pcl_io
+ pcl_filters
+ )
+ PCL_ADD_INCLUDES("${SUBSUBSYS_NAME}" "${SUBSYS_NAME}/${SUBSUBSYS_NAME}" ${INCS})
+ PCL_MAKE_PKGCONFIG("${EXE_NAME}" "${SUBSUBSYS_NAME}" "${SUBSUBSYS_DESC}" "" "" "" "" "")
ENDIF(BUILD)
assert(false); return (*this);
}
- /// The copy buffer which backs up the points removed from the cloud.
- CopyBuffer cut_cloud_buffer_;
-
- /// a selection which backs up the index of the points cut in the
- /// original cloud.
- Selection cut_selection_;
-
/// A shared pointer pointing to the selection object.
SelectionPtr selection_ptr_;
/// a pointer pointing to the copy buffer.
CopyBufferPtr copy_buffer_ptr_;
+ /// a selection which backs up the index of the points cut in the
+ /// original cloud.
+ Selection cut_selection_;
+
+ /// The copy buffer which backs up the points removed from the cloud.
+ CopyBuffer cut_cloud_buffer_;
+
};
#endif // CUT_COMMAND_H_
assert(false); return (*this);
}
- /// a copy buffer which backs up the points deleted from the cloud.
- CopyBuffer deleted_cloud_buffer_;
+ /// a pointer pointing to the cloud
+ CloudPtr cloud_ptr_;
+
+ /// A shared pointer pointing to the selection object.
+ SelectionPtr selection_ptr_;
/// a selection which backs up the index of the deleted points in the
/// original cloud.
Selection deleted_selection_;
- /// A shared pointer pointing to the selection object.
- SelectionPtr selection_ptr_;
-
- /// a pointer pointing to the cloud
- CloudPtr cloud_ptr_;
+ /// a copy buffer which backs up the points deleted from the cloud.
+ CopyBuffer deleted_cloud_buffer_;
};
#endif // DELETE_COMMAND_H_
assert(false); return (*this);
}
- /// The size of the cloud before new points are pasted. This value is used
- /// to mark the point where points were added to the cloud. In order to
- /// support undo, one only has to resize the cloud using this value.
- unsigned int prev_cloud_size_;
+ /// a pointer pointing to the copy buffer.
+ ConstCopyBufferPtr copy_buffer_ptr_;
/// A shared pointer pointing to the selection object.
SelectionPtr selection_ptr_;
/// a pointer pointing to the cloud
CloudPtr cloud_ptr_;
- /// a pointer pointing to the copy buffer.
- ConstCopyBufferPtr copy_buffer_ptr_;
+ /// The size of the cloud before new points are pasted. This value is used
+ /// to mark the point where points were added to the cloud. In order to
+ /// support undo, one only has to resize the cloud using this value.
+ unsigned int prev_cloud_size_;
};
#endif // PASTE_COMMAND_H_
void
applyTransform(ConstSelectionPtr sel_ptr);
+ /// pointers to constructor params
+ ConstSelectionPtr selection_ptr_;
+
+ /// a pointer poiting to the cloud
+ CloudPtr cloud_ptr_;
+
+ float translate_x_, translate_y_, translate_z_;
+
/// An internal selection object used to perform undo
SelectionPtr internal_selection_ptr_;
/// of the selected points
float transform_matrix_[MATRIX_SIZE];
- float translate_x_, translate_y_, translate_z_;
-
- /// pointers to constructor params
- ConstSelectionPtr selection_ptr_;
-
- /// a pointer poiting to the cloud
- CloudPtr cloud_ptr_;
-
/// The transform matrix of the cloud used by this command
float cloud_matrix_[MATRIX_SIZE];
/// The inverted transform matrix of the cloud used by this command
#include <QMessageBox>
#include <QMouseEvent>
#include <qgl.h>
-#include <GL/glu.h>
+
+#include <pcl/pcl_config.h>
+
+#ifdef OPENGL_IS_A_FRAMEWORK
+# include <OpenGL/glu.h>
+#else
+# include <GL/glu.h>
+#endif
+
#include <pcl/filters/filter.h>
#include <pcl/io/pcd_io.h>
#include <pcl/apps/point_cloud_editor/cloudEditorWidget.h>
#include <pcl/apps/point_cloud_editor/statisticsDialog.h>
-StatisticsDialog::StatisticsDialog(QWidget *parent)
+StatisticsDialog::StatisticsDialog(QWidget *)
{
button_box_ = new QDialogButtonBox;
button_box_->addButton(tr("Hide"), QDialogButtonBox::AcceptRole);
{
int viewport_source, viewport_convolved = 0;
int direction = -1;
- int nb_threads = 0;
+ int nb_threads = 1;
char border_policy = 'Z';
double threshold = 0.001;
pcl::filters::Convolution<pcl::PointXYZRGB, pcl::PointXYZRGB> convolution;
{
if (nb_threads <= 0)
nb_threads = 1;
+#ifndef _OPENMP
+ if (nb_threads > 1)
+ {
+ pcl::console::print_info ("OpenMP not activated. Number of threads: 1\n");
+ nb_threads = 1;
+ }
+#endif
+ }
+#ifdef _OPENMP
+ else
+ {
+ nb_threads = omp_get_num_procs();
}
+#endif
convolution.setNumberOfThreads (nb_threads);
// borders policy if any
}
}
convolved_label << pcl::getTime () - t0 << "s";
+#ifdef _OPENMP
+ convolved_label << "\ncpu cores: " << omp_get_num_procs() << " ";
+#else
+ convolved_label << "\n";
+#endif
+ convolved_label << "threads: " << nb_threads;
// Display
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("Convolution"));
// viewport stuff
--- /dev/null
+#include <pcl/point_cloud.h>
+#include <pcl/segmentation/grabcut_segmentation.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/point_types.h>
+#include <pcl/PCLPointCloud2.h>
+
+#ifdef GLUT_IS_A_FRAMEWORK
+#include <GLUT/glut.h>
+#else
+#include <GL/glut.h>
+#if defined (FREEGLUT)
+#include <GL/freeglut_ext.h>
+#elif defined (GLUI_OPENGLUT)
+#include <GL/openglut.h>
+#endif
+#endif
+
+class GrabCutHelper : public pcl::GrabCut<pcl::PointXYZRGB>
+{
+ using pcl::GrabCut<pcl::PointXYZRGB>::n_links_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::graph_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::indices_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::hard_segmentation_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::width_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::height_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::graph_nodes_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::L_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::K_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::GMM_component_;
+ using pcl::GrabCut<pcl::PointXYZRGB>::input_;
+
+ public:
+ typedef boost::shared_ptr<GrabCutHelper > Ptr;
+ typedef boost::shared_ptr<const GrabCutHelper > ConstPtr;
+
+ GrabCutHelper (uint32_t K = 5, float lambda = 50.f)
+ : pcl::GrabCut<pcl::PointXYZRGB> (K, lambda)
+ {}
+
+ ~GrabCutHelper ()
+ { }
+
+ void
+ setInputCloud (const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr& cloud);
+ void
+ setBackgroundPointsIndices (const pcl::PointIndices::ConstPtr& point_indices);
+ void
+ setBackgroundPointsIndices (int x1, int y1, int x2, int y2);
+ void
+ setTrimap(int x1, int y1, int x2, int y2, const pcl::segmentation::grabcut::TrimapValue& t);
+ void
+ refine ();
+ int
+ refineOnce ();
+ void
+ fitGMMs ();
+ void
+ display (int display_type);
+ void
+ overlayAlpha ();
+
+ private:
+ void
+ buildImages ();
+
+ // Clouds of various variables that can be displayed for debugging.
+ pcl::PointCloud<float>::Ptr n_links_image_;
+ pcl::segmentation::grabcut::Image::Ptr t_links_image_;
+ pcl::segmentation::grabcut::Image::Ptr gmm_image_;
+ pcl::PointCloud<float>::Ptr alpha_image_;
+
+ int image_height_1_;
+ int image_width_1_;
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::setInputCloud (const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr& cloud)
+{
+ pcl::GrabCut<pcl::PointXYZRGB>::setInputCloud (cloud);
+ // Reset clouds
+ n_links_image_.reset (new pcl::PointCloud<float> (cloud->width, cloud->height, 0));
+ t_links_image_.reset (new pcl::segmentation::grabcut::Image (cloud->width, cloud->height));
+ gmm_image_.reset (new pcl::segmentation::grabcut::Image (cloud->width, cloud->height));
+ alpha_image_.reset (new pcl::PointCloud<float> (cloud->width, cloud->height, 0));
+ image_height_1_ = cloud->height-1;
+ image_width_1_ = cloud->width-1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::setBackgroundPointsIndices (const pcl::PointIndices::ConstPtr& point_indices)
+{
+ pcl::GrabCut<pcl::PointXYZRGB>::setBackgroundPointsIndices (point_indices);
+ buildImages ();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::setBackgroundPointsIndices (int x1, int y1, int x2, int y2)
+{
+ pcl::PointIndices::Ptr point_indices (new pcl::PointIndices);
+ point_indices->indices.reserve (input_->size ());
+ if (x1 > x2) std::swap (x1, x2);
+ if (y1 > y2) std::swap (y1, y2);
+ for (int y = std::max (y1, 0); y <= std::min (static_cast<int> (input_->height -1), y2); ++y)
+ for (int x = std::max (x1, 0); x <= std::min (static_cast<int> (input_->width -1), x2); ++x)
+ point_indices->indices.push_back (y * input_->width + x);
+ setBackgroundPointsIndices (point_indices);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::setTrimap(int x1, int y1, int x2, int y2, const pcl::segmentation::grabcut::TrimapValue& t)
+{
+ using namespace pcl::segmentation::grabcut;
+ if (x1 > x2) std::swap (x1, x2);
+ if (y1 > y2) std::swap (y1, y2);
+ for (int y = std::max (y1, 0); y <= std::min (static_cast<int> (image_height_1_), y2); ++y)
+ for (int x = std::max (x1, 0); x <= std::min (static_cast<int> (image_width_1_), x2); ++x)
+ {
+ std::size_t idx = y * input_->width + x;
+ trimap_[idx] = TrimapUnknown;
+ // Immediately set the segmentation as well so that the display will update.
+ if (t == TrimapForeground)
+ hard_segmentation_[idx] = SegmentationForeground;
+ else if (t == TrimapBackground)
+ hard_segmentation_[idx] = SegmentationBackground;
+ }
+
+ // Build debugging images
+ buildImages();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::refine ()
+{
+// boost::lock_guard<boost::mutex> lock (refine_mutex);
+ pcl::GrabCut<pcl::PointXYZRGB>::refine ();
+ buildImages ();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+int
+GrabCutHelper::refineOnce ()
+{
+ // boost::lock_guard<boost::mutex> lock (refine_once_mutex);
+ int result = pcl::GrabCut<pcl::PointXYZRGB>::refineOnce ();
+ buildImages ();
+ return (result);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::fitGMMs ()
+{
+// boost::lock_guard<boost::mutex> lock (fit_gmms_mutex);
+ pcl::GrabCut<pcl::PointXYZRGB>::fitGMMs ();
+ buildImages ();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::buildImages ()
+{
+ using namespace pcl::segmentation::grabcut;
+ memset (&n_links_image_->points[0], 0, sizeof (float) * n_links_image_->size ());
+ for (int y = 0; y < static_cast<int> (image_->height); ++y)
+ {
+ for (int x = 0; x < static_cast<int> (image_->width); ++x)
+ {
+ std::size_t index = y * image_->width + x;
+
+ if (x > 0 && y < image_height_1_)
+ {
+ (*n_links_image_)(x,y) += n_links_[index].weights[0];
+ (*n_links_image_)(x-1,y+1) += n_links_[index].weights[0];
+ }
+
+ if (y < image_height_1_)
+ {
+ (*n_links_image_)(x,y) += n_links_[index].weights[1];
+ (*n_links_image_)(x,y+1) += n_links_[index].weights[1];
+ }
+
+ if (x < image_width_1_ && y < image_height_1_)
+ {
+ (*n_links_image_)(x,y) += n_links_[index].weights[2];
+ (*n_links_image_)(x+1,y+1) += n_links_[index].weights[2];
+ }
+
+ if (x < image_width_1_)
+ {
+ (*n_links_image_)(x,y) += n_links_[index].weights[3];
+ (*n_links_image_)(x+1,y) += n_links_[index].weights[3];
+ }
+
+ // TLinks cloud
+ pcl::segmentation::grabcut::Color &tlink_point = t_links_image_->points[index];
+ pcl::segmentation::grabcut::Color &gmm_point = gmm_image_->points[index];
+ float &alpha_point = alpha_image_->points[index];
+ double red = pow (graph_.getSourceEdgeCapacity (index)/L_, 0.25); // red
+ double green = pow (graph_.getTargetEdgeCapacity (index)/L_, 0.25); // green
+ tlink_point.r = static_cast<float> (red);
+ tlink_point.g = static_cast<float> (green);
+ gmm_point.b = tlink_point.b = 0;
+ // GMM cloud and Alpha cloud
+ if (hard_segmentation_[index] == SegmentationForeground)
+ {
+ //assert (static_cast<float>(GMM_component_[index]+1)/static_cast<float> (K_) < 1.f);
+ gmm_point.r = static_cast<float>(GMM_component_[index]+1)/static_cast<float> (K_);
+ alpha_point = 0;
+ }
+ else
+ {
+ gmm_point.g = static_cast<float>(GMM_component_[index]+1)/static_cast<float> (K_);
+ alpha_point = 0.75;
+ }
+ }
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::display (int display_type)
+{
+ switch (display_type)
+ {
+ case 0:
+ glDrawPixels (image_->width, image_->height, GL_RGB, GL_FLOAT, &(image_->points[0]));
+ break;
+
+ case 1:
+ glDrawPixels (gmm_image_->width, gmm_image_->height, GL_RGB, GL_FLOAT, &(gmm_image_->points[0]));
+ break;
+
+ case 2:
+ glDrawPixels (n_links_image_->width, n_links_image_->height, GL_LUMINANCE, GL_FLOAT, &(n_links_image_->points[0]));
+ break;
+
+ case 3:
+ glDrawPixels (t_links_image_->width, t_links_image_->height, GL_RGB, GL_FLOAT, &(t_links_image_->points[0]));
+ break;
+
+ default:
+ // Do nothing
+ break;
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+GrabCutHelper::overlayAlpha ()
+{
+ glDrawPixels (alpha_image_->width, alpha_image_->height, GL_ALPHA, GL_FLOAT, &(alpha_image_->points[0]));
+}
+
+/* GUI interface */
+int display_type = 0;
+bool show_mask = false;
+bool initialized = false;
+// 2D stuff
+int xstart, ystart, xend, yend;
+bool box = false;
+bool left = false, right = false;
+bool refining_ = false;
+uint32_t width, height;
+GrabCutHelper grabcut;
+pcl::segmentation::grabcut::Image::Ptr display_image;
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+display ()
+{
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if (display_type == -1)
+ glDrawPixels (display_image->width, display_image->height, GL_RGB, GL_FLOAT, &(display_image->points[0]));
+ else
+ grabcut.display (display_type);
+
+ if (show_mask)
+ {
+ grabcut.overlayAlpha ();
+ }
+
+ if (box)
+ {
+ glColor4f( 1, 1, 1, 1 );
+ glBegin( GL_LINE_LOOP );
+ glVertex2d( xstart, ystart );
+ glVertex2d( xstart, yend );
+ glVertex2d( xend, yend );
+ glVertex2d( xend, ystart );
+ glEnd();
+ }
+
+ glFlush();
+ glutSwapBuffers();
+}
+
+/////////////////////////////////////////////////////////////////////////
+void
+idle_callback ()
+{
+ int changed = 0;
+
+ if (refining_)
+ {
+ changed = grabcut.refineOnce ();
+ glutPostRedisplay ();
+ }
+
+ if (!changed)
+ {
+ refining_ = false;
+ glutIdleFunc (NULL);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////
+void
+motion_callback (int x, int y)
+{
+ y = height - y;
+
+ if (box == true)
+ {
+ xend = x; yend = y;
+ glutPostRedisplay ();
+ }
+
+ if (initialized)
+ {
+ if (left)
+ grabcut.setTrimap (x-2,y-2,x+2,y+2,pcl::segmentation::grabcut::TrimapForeground);
+
+ if (right)
+ grabcut.setTrimap (x-2,y-2,x+2,y+2,pcl::segmentation::grabcut::TrimapForeground);
+
+ glutPostRedisplay ();
+ }
+}
+
+void
+mouse_callback (int button, int state, int x, int y)
+{
+ y = height - y;
+
+ switch (button)
+ {
+ case GLUT_LEFT_BUTTON:
+ if (state==GLUT_DOWN)
+ {
+ left = true;
+
+ if (!initialized)
+ {
+ xstart = x; ystart = y;
+ box = true;
+ }
+ }
+
+ if (state==GLUT_UP)
+ {
+ left = false;
+
+ if (initialized)
+ {
+ grabcut.refineOnce ();
+ glutPostRedisplay ();
+ }
+ else
+ {
+ xend = x; yend = y;
+ grabcut.setBackgroundPointsIndices (xstart, ystart, xend, yend);
+ box = false;
+ initialized = true;
+ show_mask = true;
+ glutPostRedisplay ();
+ }
+ }
+ break;
+
+ case GLUT_RIGHT_BUTTON:
+ if (state==GLUT_DOWN)
+ {
+ right = true;
+ }
+ if (state==GLUT_UP)
+ {
+ right = false;
+
+ if (initialized)
+ {
+ grabcut.refineOnce ();
+ glutPostRedisplay ();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////
+void
+keyboard_callback (unsigned char key, int, int)
+{
+ switch (key)
+ {
+ case ' ': // space bar show/hide alpha mask
+ show_mask = !show_mask;
+ break;
+ case '0': case 'i': case 'I':// choose the RGB image
+ display_type = 0;
+ break;
+ case '1': case 'g': case 'G':// choose GMM index mask
+ display_type = 1;
+ break;
+ case '2': case 'n': case 'N': // choose N-Link mask
+ display_type = 2;
+ break;
+ case '3': case 't': case 'T': // choose T-Link mask
+ display_type = 3;
+ break;
+ case 'r': // run GrabCut refinement
+ refining_ = true;
+ glutIdleFunc (idle_callback);
+ break;
+ case 'o': // run one step of GrabCut refinement
+ grabcut.refineOnce ();
+ glutPostRedisplay ();
+ break;
+ case 'l': // rerun the Orchard-Bowman GMM clustering
+ grabcut.fitGMMs ();
+ glutPostRedisplay ();
+ break;
+ // case 's': case 'S':
+ // save ();
+ // break;
+ case 'q': case 'Q':
+#if defined (FREEGLUT) || defined (GLUI_OPENGLUT)
+ glutLeaveMainLoop ();
+#else
+ exit (0);
+#endif
+ break;
+ case 27:
+ refining_ = false;
+ glutIdleFunc(NULL);
+ default:
+ break;
+ }
+ glutPostRedisplay ();
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+int main (int argc, char** argv)
+{
+ // Parse the command line arguments for .pcd files
+ std::vector<int> parsed_file_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
+ if (parsed_file_indices.empty ())
+ {
+ pcl::console::print_error ("Need at least an input PCD file (e.g. scene.pcd) to continue!\n\n");
+ pcl::console::print_info ("Ideally, need an input file, and two output PCD files, e.g., object.pcd, background.pcd\n");
+ return (-1);
+ }
+
+ std::string object_file = "object.pcd", background_file = "background.pcd";
+ if (parsed_file_indices.size () >= 3)
+ background_file = argv[parsed_file_indices[2]];
+ if (parsed_file_indices.size () >= 2)
+ object_file = argv[parsed_file_indices[1]];
+
+ pcl::PCDReader reader;
+ // Test the header
+ pcl::PCLPointCloud2 dummy;
+ reader.readHeader (argv[parsed_file_indices[0]], dummy);
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr scene (new pcl::PointCloud<pcl::PointXYZRGB>);
+ if (pcl::getFieldIndex (dummy, "rgba") != -1)
+ {
+ if (pcl::io::loadPCDFile (argv[parsed_file_indices[0]], *scene) < 0)
+ {
+ pcl::console::print_error (stderr, "[error]\n");
+ return (-2);
+ }
+ }
+ else
+ if (pcl::getFieldIndex (dummy, "rgb") != -1)
+ {
+ if (pcl::io::loadPCDFile (argv[parsed_file_indices[0]], *scene) < 0)
+ {
+ pcl::console::print_error (stderr, "[error]\n");
+ return (-2);
+ }
+ }
+ else
+ {
+ pcl::console::print_error (stderr, "[No RGB data found!]\n");
+ return (-1);
+ }
+
+ if (scene->isOrganized ())
+ {
+ pcl::console::print_highlight ("Enabling 2D image viewer mode.\n");
+ }
+
+
+ width = scene->width;
+ height = scene->height;
+
+ display_type = -1;
+
+ display_image.reset (new pcl::segmentation::grabcut::Image (scene->width, scene->height));
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr tmp (new pcl::PointCloud<pcl::PointXYZRGB> (scene->width, scene->height));
+
+ if (scene->isOrganized ())
+ {
+ pcl::uint32_t height_1 = scene->height -1;
+ for (std::size_t i = 0; i < scene->height; ++i)
+ {
+ for (std::size_t j = 0; j < scene->width; ++j)
+ {
+ const pcl::PointXYZRGB &p = (*scene) (j,i);
+ std::size_t reverse_index = (height_1-i) * scene->width + j;
+ display_image->points[reverse_index].r = static_cast<float> (p.r) / 255.0;
+ display_image->points[reverse_index].g = static_cast<float> (p.g) / 255.0;
+ display_image->points[reverse_index].b = static_cast<float> (p.b) / 255.0;
+ tmp->points[reverse_index] = p;
+ }
+ }
+ }
+
+ grabcut.setInputCloud (tmp);
+
+ glutInit (&argc,argv);
+ glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
+
+ glutInitWindowSize (width, height);
+ glutInitWindowPosition (100,100);
+
+ glutCreateWindow ("GrabCut");
+
+ glOrtho (0,width,0,height,-1,1);
+
+ //set the background color to black (RGBA)
+ glClearColor(0.0,0.0,0.0,0.0);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ glutDisplayFunc (display);
+ glutMouseFunc (mouse_callback);
+ glutMotionFunc (motion_callback);
+ glutKeyboardFunc (keyboard_callback);
+
+ glutMainLoop ();
+
+ return (0);
+}
vector<PointIndices> label_indices;
vector<PointIndices> boundary_indices;
mps_.segmentAndRefine (regions, model_coefficients, inlier_indices, labels, label_indices, boundary_indices);
- PCL_DEBUG ("Number of planar regions detected: %zu for a cloud of %zu points and %zu normals.\n", regions.size (), search_.getInputCloud ()->points.size (), normal_cloud->points.size ());
+ PCL_DEBUG ("Number of planar regions detected: %lu for a cloud of %lu points and %lu normals.\n", regions.size (), search_.getInputCloud ()->points.size (), normal_cloud->points.size ());
double max_dist = numeric_limits<double>::max ();
// Compute the distances from all the planar regions to the picked point, and select the closest region
PlanarRegion<PointT> refined_region;
pcl::approximatePolygon (region, refined_region, 0.01, false, true);
- PCL_INFO ("Planar region: %zu points initial, %zu points after refinement.\n", region.getContour ().size (), refined_region.getContour ().size ());
+ PCL_INFO ("Planar region: %lu points initial, %lu points after refinement.\n", region.getContour ().size (), refined_region.getContour ().size ());
cloud_viewer_.addPolygon (refined_region, 0.0, 0.0, 1.0, "refined_region");
cloud_viewer_.setShapeRenderingProperties (visualization::PCL_VISUALIZER_LINE_WIDTH, 10, "refined_region");
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, O R PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#define SHOW_FPS 1
+#include <pcl/apps/timer.h>
+#include <pcl/common/common.h>
+#include <pcl/io/openni_grabber.h>
+#include <pcl/keypoints/trajkovic_2d.h>
+#include <pcl/keypoints/trajkovic_3d.h>
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/visualization/image_viewer.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+
+using namespace pcl;
+typedef PointXYZRGBA PointT;
+typedef PointXYZI KeyPointT;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+class TrajkovicDemo
+{
+ public:
+ typedef PointCloud<PointT> Cloud;
+ typedef Cloud::Ptr CloudPtr;
+ typedef Cloud::ConstPtr CloudConstPtr;
+
+ TrajkovicDemo (Grabber& grabber, bool enable_3d)
+ : cloud_viewer_ ("TRAJKOVIC 3D Keypoints -- PointCloud")
+ , grabber_ (grabber)
+ , image_viewer_ ("TRAJKOVIC 3D Keypoints -- Image")
+ , enable_3d_ (enable_3d)
+ {
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+ void
+ cloud_callback_3d (const CloudConstPtr& cloud)
+ {
+ FPS_CALC ("cloud callback");
+ boost::mutex::scoped_lock lock (cloud_mutex_);
+ cloud_ = cloud;
+
+ // Compute TRAJKOVIC keypoints 3D
+ TrajkovicKeypoint3D<PointT, KeyPointT> trajkovic;
+ trajkovic.setInputCloud (cloud);
+ trajkovic.setNumberOfThreads (6);
+ keypoints_.reset (new PointCloud<KeyPointT>);
+ trajkovic.compute (*keypoints_);
+ keypoints_indices_ = trajkovic.getKeypointsIndices ();
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+ void
+ cloud_callback_2d (const CloudConstPtr& cloud)
+ {
+ FPS_CALC ("cloud callback");
+ boost::mutex::scoped_lock lock (cloud_mutex_);
+ cloud_ = cloud;
+
+ // Compute TRAJKOVIC keypoints 2D
+ TrajkovicKeypoint2D<PointT, KeyPointT> trajkovic;
+ trajkovic.setInputCloud (cloud);
+ trajkovic.setNumberOfThreads (6);
+ keypoints_.reset (new PointCloud<KeyPointT>);
+ trajkovic.compute (*keypoints_);
+ keypoints_indices_ = trajkovic.getKeypointsIndices ();
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+ void
+ init ()
+ {
+ boost::function<void (const CloudConstPtr&) > cloud_cb;
+ if (enable_3d_)
+ cloud_cb = boost::bind (&TrajkovicDemo::cloud_callback_3d, this, _1);
+ else
+ cloud_cb = boost::bind (&TrajkovicDemo::cloud_callback_2d, this, _1);
+
+ cloud_connection = grabber_.registerCallback (cloud_cb);
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+ std::string
+ getStrBool (bool state)
+ {
+ std::ostringstream ss;
+ ss << state;
+ return (ss.str ());
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+ void
+ run ()
+ {
+ grabber_.start ();
+
+ bool image_init = false, cloud_init = false;
+ bool keypts = true;
+
+ while (!cloud_viewer_.wasStopped () && !image_viewer_.wasStopped ())
+ {
+ PointCloud<KeyPointT>::Ptr keypoints;
+ CloudConstPtr cloud;
+ if (cloud_mutex_.try_lock ())
+ {
+ cloud_.swap (cloud);
+ keypoints_.swap (keypoints);
+
+ cloud_mutex_.unlock ();
+ }
+
+ if (cloud)
+ {
+ int w (cloud->width);
+ if (!cloud_init)
+ {
+ cloud_viewer_.setPosition (0, 0);
+ cloud_viewer_.setSize (cloud->width, cloud->height);
+ cloud_init = !cloud_init;
+ }
+
+ if (!cloud_viewer_.updatePointCloud (cloud, "OpenNICloud"))
+ {
+ cloud_viewer_.addPointCloud (cloud, "OpenNICloud");
+ cloud_viewer_.resetCameraViewpoint ("OpenNICloud");
+ }
+
+ if (!image_init)
+ {
+ image_viewer_.setPosition (cloud->width, 0);
+ image_viewer_.setSize (cloud->width, cloud->height);
+ image_init = !image_init;
+ }
+
+ image_viewer_.addRGBImage<PointT> (cloud);
+
+ if (keypoints && !keypoints->empty ())
+ {
+ image_viewer_.removeLayer (getStrBool (keypts));
+ std::vector<int> uv;
+ uv.reserve (keypoints_indices_->indices.size () * 2);
+ for (std::vector<int>::const_iterator id = keypoints_indices_->indices.begin ();
+ id != keypoints_indices_->indices.end ();
+ ++id)
+ {
+ int u (*id % w);
+ int v (*id / w);
+ image_viewer_.markPoint (u, v, visualization::red_color, visualization::blue_color, 5, getStrBool (!keypts), 0.5);
+ }
+ keypts = !keypts;
+
+ visualization::PointCloudColorHandlerCustom<KeyPointT> blue (keypoints, 0, 0, 255);
+ if (!cloud_viewer_.updatePointCloud (keypoints, blue, "keypoints"))
+ cloud_viewer_.addPointCloud (keypoints, blue, "keypoints");
+ cloud_viewer_.setPointCloudRenderingProperties (visualization::PCL_VISUALIZER_POINT_SIZE, 10, "keypoints");
+ cloud_viewer_.setPointCloudRenderingProperties (visualization::PCL_VISUALIZER_OPACITY, 0.5, "keypoints");
+ }
+ }
+
+ cloud_viewer_.spinOnce ();
+ image_viewer_.spinOnce ();
+ boost::this_thread::sleep (boost::posix_time::microseconds (100));
+ }
+
+ grabber_.stop ();
+ cloud_connection.disconnect ();
+ }
+
+ visualization::PCLVisualizer cloud_viewer_;
+ Grabber& grabber_;
+ boost::mutex cloud_mutex_;
+ CloudConstPtr cloud_;
+
+ visualization::ImageViewer image_viewer_;
+
+ PointCloud<KeyPointT>::Ptr keypoints_;
+ pcl::PointIndicesConstPtr keypoints_indices_;
+ bool enable_3d_;
+ private:
+ boost::signals2::connection cloud_connection;
+};
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ if (pcl::console::find_switch (argc, argv, "-h"))
+ {
+ pcl::console::print_info ("Syntax is: %s [-device device_id_string] [-2d]\n", argv[0]);
+ return (0);
+ }
+
+ std::string device_id ("#1");
+ bool enable_3d = true;
+ if (pcl::console::find_switch (argc, argv, "-2d"))
+ enable_3d = false;
+
+ if (pcl::console::find_argument (argc, argv, "-device"))
+ pcl::console::parse<std::string> (argc, argv, "-device", device_id);
+
+ pcl::console::print_info ("Extracting Trajkovic %s keypoints from device %s.\n",
+ enable_3d ? "3D" : "2D", device_id.c_str ());
+
+ OpenNIGrabber grabber (device_id);
+
+ TrajkovicDemo openni_viewer (grabber, enable_3d);
+
+ openni_viewer.init ();
+ openni_viewer.run ();
+
+ return (0);
+}
+/* ]--- */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2014-, Open Perception, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#define MEASURE_FUNCTION_TIME
+#include <pcl/common/time.h> //fps calculations
+#include <pcl/io/openni_grabber.h>
+#include <pcl/visualization/boost.h>
+#include <pcl/visualization/image_viewer.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/tracking/pyramidal_klt.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/keypoints/harris_2d.h>
+
+#define SHOW_FPS 1
+#if SHOW_FPS
+#define FPS_CALC(_WHAT_) \
+do \
+{ \
+ static unsigned count = 0;\
+ static double last = pcl::getTime ();\
+ double now = pcl::getTime (); \
+ ++count; \
+ if (now - last >= 1.0) \
+ { \
+ std::cout << "Average framerate("<< _WHAT_ << "): " << double(count)/double(now - last) << " Hz" << std::endl; \
+ count = 0; \
+ last = now; \
+ } \
+}while(false)
+#else
+#define FPS_CALC(_WHAT_) \
+do \
+{ \
+}while(false)
+#endif
+
+void
+printHelp (int, char **argv)
+{
+ using pcl::console::print_error;
+ using pcl::console::print_info;
+
+ print_error ("Syntax is: %s [((<device_id> | <path-to-oni-file>) [-depthmode <mode>] [-imagemode <mode>] [-xyz] | -l [<device_id>]| -h | --help)]\n", argv [0]);
+ print_info ("%s -h | --help : shows this help\n", argv [0]);
+ print_info ("%s -xyz : use only XYZ values and ignore RGB components (this flag is required for use with ASUS Xtion Pro) \n", argv [0]);
+ print_info ("%s -l : list all available devices\n", argv [0]);
+ print_info ("%s -l <device-id> :list all available modes for specified device\n", argv [0]);
+ print_info ("\t\t<device_id> may be \"#1\", \"#2\", ... for the first, second etc device in the list\n");
+#ifndef _WIN32
+ print_info ("\t\t bus@address for the device connected to a specific usb-bus / address combination\n");
+ print_info ("\t\t <serial-number>\n");
+#endif
+ print_info ("\n\nexamples:\n");
+ print_info ("%s \"#1\"\n", argv [0]);
+ print_info ("\t\t uses the first device.\n");
+ print_info ("%s \"./temp/test.oni\"\n", argv [0]);
+ print_info ("\t\t uses the oni-player device to play back oni file given by path.\n");
+ print_info ("%s -l\n", argv [0]);
+ print_info ("\t\t list all available devices.\n");
+ print_info ("%s -l \"#2\"\n", argv [0]);
+ print_info ("\t\t list all available modes for the second device.\n");
+ #ifndef _WIN32
+ print_info ("%s A00361800903049A\n", argv [0]);
+ print_info ("\t\t uses the device with the serial number \'A00361800903049A\'.\n");
+ print_info ("%s 1@16\n", argv [0]);
+ print_info ("\t\t uses the device on address 16 at USB bus 1.\n");
+ #endif
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointType>
+class OpenNIViewer
+{
+ public:
+ typedef pcl::PointCloud<PointType> Cloud;
+ typedef typename Cloud::ConstPtr CloudConstPtr;
+
+ OpenNIViewer (pcl::Grabber& grabber)
+ : image_viewer_ ()
+ , grabber_ (grabber)
+ , rgb_data_ (0), rgb_data_size_ (0)
+ { }
+
+ void
+ detect_keypoints (const CloudConstPtr& cloud)
+ {
+ pcl::HarrisKeypoint2D<PointType, pcl::PointXYZI> harris;
+ harris.setInputCloud (cloud);
+ harris.setNumberOfThreads (6);
+ harris.setNonMaxSupression (true);
+ harris.setRadiusSearch (0.01);
+ harris.setMethod (pcl::HarrisKeypoint2D<PointType, pcl::PointXYZI>::TOMASI);
+ harris.setThreshold (0.05);
+ harris.setWindowWidth (5);
+ harris.setWindowHeight (5);
+ pcl::PointCloud<pcl::PointXYZI>::Ptr response (new pcl::PointCloud<pcl::PointXYZI>);
+ harris.compute (*response);
+ points_ = harris.getKeypointsIndices ();
+ }
+
+ void
+ cloud_callback (const CloudConstPtr& cloud)
+ {
+ FPS_CALC ("cloud callback");
+ boost::mutex::scoped_lock lock (cloud_mutex_);
+ cloud_ = cloud;
+ // Compute Tomasi keypoints
+ tracker_->setInputCloud (cloud_);
+ // if (!points_)
+ // {
+ if (!points_ || (counter_ % 10 == 0))
+ {
+ detect_keypoints (cloud_);
+ tracker_->setPointsToTrack (points_);
+ }
+
+ // }
+ tracker_->compute ();
+ ++counter_;
+ }
+
+ void
+ image_callback (const boost::shared_ptr<openni_wrapper::Image>& image)
+ {
+ FPS_CALC ("image callback");
+ boost::mutex::scoped_lock lock (image_mutex_);
+ image_ = image;
+
+ if (image->getEncoding () != openni_wrapper::Image::RGB)
+ {
+ if (rgb_data_size_ < image->getWidth () * image->getHeight ())
+ {
+ if (rgb_data_)
+ delete [] rgb_data_;
+ rgb_data_size_ = image->getWidth () * image->getHeight ();
+ rgb_data_ = new unsigned char [rgb_data_size_ * 3];
+ }
+ image_->fillRGB (image_->getWidth (), image_->getHeight (), rgb_data_);
+ }
+ }
+
+ void
+ keyboard_callback (const pcl::visualization::KeyboardEvent& event, void*)
+ {
+ static pcl::PCDWriter writer;
+ static std::ostringstream frame;
+ if (event.keyUp ())
+ {
+ if ((event.getKeyCode () == 's') || (event.getKeyCode () == 'S'))
+ {
+ boost::mutex::scoped_lock lock (cloud_mutex_);
+ frame.str ("frame-");
+ frame << boost::posix_time::to_iso_string (boost::posix_time::microsec_clock::local_time ()) << ".pcd";
+ writer.writeBinaryCompressed (frame.str (), *cloud_);
+ PCL_INFO ("Written cloud %s.\n", frame.str ().c_str ());
+ }
+ }
+ }
+
+ void
+ mouse_callback (const pcl::visualization::MouseEvent& mouse_event, void*)
+ {
+ if (mouse_event.getType() == pcl::visualization::MouseEvent::MouseButtonPress && mouse_event.getButton() == pcl::visualization::MouseEvent::LeftButton)
+ {
+ cout << "left button pressed @ " << mouse_event.getX () << " , " << mouse_event.getY () << endl;
+ }
+ }
+
+ /**
+ * @brief starts the main loop
+ */
+ void
+ run ()
+ {
+ boost::function<void (const CloudConstPtr&) > cloud_cb = boost::bind (&OpenNIViewer::cloud_callback, this, _1);
+ boost::signals2::connection cloud_connection = grabber_.registerCallback (cloud_cb);
+
+ boost::signals2::connection image_connection;
+ if (grabber_.providesCallback<void (const boost::shared_ptr<openni_wrapper::Image>&)>())
+ {
+ image_viewer_.reset (new pcl::visualization::ImageViewer ("Pyramidal KLT Tracker"));
+ boost::function<void (const boost::shared_ptr<openni_wrapper::Image>&) > image_cb = boost::bind (&OpenNIViewer::image_callback, this, _1);
+ image_connection = grabber_.registerCallback (image_cb);
+ }
+
+ tracker_.reset (new pcl::tracking::PyramidalKLTTracker<PointType>);
+
+ bool image_init = false;
+
+ grabber_.start ();
+
+ while (!image_viewer_->wasStopped ())
+ {
+ boost::shared_ptr<openni_wrapper::Image> image;
+ CloudConstPtr cloud;
+
+ // See if we can get a cloud
+ if (cloud_mutex_.try_lock ())
+ {
+ cloud_.swap (cloud);
+ cloud_mutex_.unlock ();
+ }
+
+ // See if we can get an image
+ if (image_mutex_.try_lock ())
+ {
+ image_.swap (image);
+ image_mutex_.unlock ();
+ }
+
+ if (image)
+ {
+ if (!image_init && cloud && cloud->width != 0)
+ {
+ image_viewer_->setPosition (0, 0);
+ image_viewer_->setSize (cloud->width, cloud->height);
+ image_init = !image_init;
+ }
+
+ if (image->getEncoding() == openni_wrapper::Image::RGB)
+ image_viewer_->addRGBImage (image->getMetaData ().Data (), image->getWidth (), image->getHeight ());
+ else
+ image_viewer_->addRGBImage (rgb_data_, image->getWidth (), image->getHeight ());
+ image_viewer_->spinOnce ();
+ }
+
+ if (tracker_->getInitialized () && cloud_)
+ {
+ if (points_mutex_.try_lock ())
+ {
+ keypoints_ = tracker_->getTrackedPoints ();
+ points_status_ = tracker_->getPointsToTrackStatus ();
+ points_mutex_.unlock ();
+ }
+
+ std::vector<float> markers;
+ markers.reserve (keypoints_->size () * 2);
+ for (std::size_t i = 0; i < keypoints_->size (); ++i)
+ {
+ if (points_status_->indices[i] < 0)
+ continue;
+ const pcl::PointUV &uv = keypoints_->points[i];
+ markers.push_back (uv.u);
+ markers.push_back (uv.v);
+ }
+ image_viewer_->removeLayer ("tracked");
+ image_viewer_->markPoints (markers, pcl::visualization::blue_color,
+ pcl::visualization::red_color, 5, "tracked", 1.0);
+
+ }
+ }
+
+ grabber_.stop ();
+
+ cloud_connection.disconnect ();
+ image_connection.disconnect ();
+ if (rgb_data_)
+ delete[] rgb_data_;
+ }
+
+ boost::shared_ptr<pcl::visualization::ImageViewer> image_viewer_;
+
+ pcl::Grabber& grabber_;
+ boost::mutex cloud_mutex_;
+ boost::mutex image_mutex_;
+ boost::mutex points_mutex_;
+
+ CloudConstPtr cloud_;
+ boost::shared_ptr<openni_wrapper::Image> image_;
+ unsigned char* rgb_data_;
+ unsigned rgb_data_size_;
+ boost::shared_ptr<pcl::tracking::PyramidalKLTTracker<PointType> > tracker_;
+ pcl::PointCloud<pcl::PointUV>::ConstPtr keypoints_;
+ pcl::PointIndicesConstPtr points_;
+ pcl::PointIndicesConstPtr points_status_;
+ int counter_;
+};
+
+// Create the PCLVisualizer object
+boost::shared_ptr<pcl::visualization::ImageViewer> img;
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ std::string device_id("");
+ pcl::OpenNIGrabber::Mode depth_mode = pcl::OpenNIGrabber::OpenNI_Default_Mode;
+ pcl::OpenNIGrabber::Mode image_mode = pcl::OpenNIGrabber::OpenNI_Default_Mode;
+ bool xyz = false;
+
+ if (argc >= 2)
+ {
+ device_id = argv[1];
+ if (device_id == "--help" || device_id == "-h")
+ {
+ printHelp(argc, argv);
+ return 0;
+ }
+ else if (device_id == "-l")
+ {
+ if (argc >= 3)
+ {
+ pcl::OpenNIGrabber grabber(argv[2]);
+ boost::shared_ptr<openni_wrapper::OpenNIDevice> device = grabber.getDevice();
+ cout << "Supported depth modes for device: " << device->getVendorName() << " , " << device->getProductName() << endl;
+ std::vector<std::pair<int, XnMapOutputMode > > modes = grabber.getAvailableDepthModes();
+ for (std::vector<std::pair<int, XnMapOutputMode > >::const_iterator it = modes.begin(); it != modes.end(); ++it)
+ {
+ cout << it->first << " = " << it->second.nXRes << " x " << it->second.nYRes << " @ " << it->second.nFPS << endl;
+ }
+
+ if (device->hasImageStream ())
+ {
+ cout << endl << "Supported image modes for device: " << device->getVendorName() << " , " << device->getProductName() << endl;
+ modes = grabber.getAvailableImageModes();
+ for (std::vector<std::pair<int, XnMapOutputMode > >::const_iterator it = modes.begin(); it != modes.end(); ++it)
+ {
+ cout << it->first << " = " << it->second.nXRes << " x " << it->second.nYRes << " @ " << it->second.nFPS << endl;
+ }
+ }
+ }
+ else
+ {
+ openni_wrapper::OpenNIDriver& driver = openni_wrapper::OpenNIDriver::getInstance();
+ if (driver.getNumberDevices() > 0)
+ {
+ for (unsigned deviceIdx = 0; deviceIdx < driver.getNumberDevices(); ++deviceIdx)
+ {
+ cout << "Device: " << deviceIdx + 1 << ", vendor: " << driver.getVendorName(deviceIdx) << ", product: " << driver.getProductName(deviceIdx)
+ << ", connected: " << driver.getBus(deviceIdx) << " @ " << driver.getAddress(deviceIdx) << ", serial number: \'" << driver.getSerialNumber(deviceIdx) << "\'" << endl;
+ }
+
+ }
+ else
+ cout << "No devices connected." << endl;
+
+ cout <<"Virtual Devices available: ONI player" << endl;
+ }
+ return 0;
+ }
+ }
+ else
+ {
+ openni_wrapper::OpenNIDriver& driver = openni_wrapper::OpenNIDriver::getInstance();
+ if (driver.getNumberDevices() > 0)
+ cout << "Device Id not set, using first device." << endl;
+ }
+
+ unsigned mode;
+ if (pcl::console::parse(argc, argv, "-depthmode", mode) != -1)
+ depth_mode = pcl::OpenNIGrabber::Mode (mode);
+
+ if (pcl::console::parse(argc, argv, "-imagemode", mode) != -1)
+ image_mode = pcl::OpenNIGrabber::Mode (mode);
+
+ if (pcl::console::find_argument (argc, argv, "-xyz") != -1)
+ xyz = true;
+
+ pcl::OpenNIGrabber grabber (device_id, depth_mode, image_mode);
+
+ if (xyz || !grabber.providesCallback<pcl::OpenNIGrabber::sig_cb_openni_point_cloud_rgb> ())
+ {
+ OpenNIViewer<pcl::PointXYZ> openni_viewer (grabber);
+ openni_viewer.run ();
+ }
+ else
+ {
+ OpenNIViewer<pcl::PointXYZRGBA> openni_viewer (grabber);
+ openni_viewer.run ();
+ }
+
+ return (0);
+}
+/* ]--- */
viewer->addPointCloud<PointT> (cloud, single_color, "cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_OPACITY, 0.15, "cloud");
- viewer->addCoordinateSystem (1.0);
+ viewer->addCoordinateSystem (1.0, "global");
viewer->initCameraParameters ();
return (viewer);
}
char name[1024];
for (size_t i = 0; i < prev_models_size; i++)
{
- sprintf (name, "normal_%zu", i);
+ sprintf (name, "normal_%lu", i);
viewer->removeShape (name);
sprintf (name, "plane_%02zu", i);
pcl::PointXYZ pt2 = pcl::PointXYZ (centroid[0] + (0.5f * model[0]),
centroid[1] + (0.5f * model[1]),
centroid[2] + (0.5f * model[2]));
- sprintf (name, "normal_%zu", i);
+ sprintf (name, "normal_%lu", i);
viewer->addArrow (pt2, pt1, 1.0, 0, 0, false, name);
contour->points = regions[i].getContour ();
viewer.setBackgroundColor (0, 0, 0);
//viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
//viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_OPACITY, 0.15, "cloud");
- viewer.addCoordinateSystem (1.0);
+ viewer.addCoordinateSystem (1.0, "global");
viewer.initCameraParameters ();
viewer.registerKeyboardCallback(&PCDOrganizedMultiPlaneSegmentation::keyboard_callback, *this, 0);
}
ec.setIndices (points_above_plane);
ec.extract (euclidean_label_indices);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", euclidean_label_indices.size ()); print_info (" clusters]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", euclidean_label_indices.size ()); print_info (" clusters]\n");
}
// For each cluster found
// Estimate normals
PointCloud<Normal>::Ptr normal_cloud (new PointCloud<Normal>);
estimateNormals (cloud_, *normal_cloud);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", normal_cloud->size ()); print_info (" points]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", normal_cloud->size ()); print_info (" points]\n");
OrganizedMultiPlaneSegmentation<PointT, Normal, Label> mps;
mps.setMinInliers (1000);
print_highlight (stderr, "Searching for the largest plane (%2.0d) ", i++);
TicToc tt; tt.tic ();
seg.segment (*inliers, coefficients);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", inliers->indices.size ()); print_info (" points]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", inliers->indices.size ()); print_info (" points]\n");
// No datasets could be found anymore
if (inliers->indices.empty ())
cloud_segmented.swap (cloud_remaining);
}
}
- print_highlight ("Number of planar regions detected: %zu for a cloud of %zu points\n", regions.size (), cloud_->size ());
+ print_highlight ("Number of planar regions detected: %lu for a cloud of %lu points\n", regions.size (), cloud_->size ());
double max_dist = numeric_limits<double>::max ();
// Compute the distances from all the planar regions to the picked point, and select the closest region
if (cloud_->isOrganized ())
{
approximatePolygon (regions[idx], region, 0.01f, false, true);
- print_highlight ("Planar region: %zu points initial, %zu points after refinement.\n", regions[idx].getContour ().size (), region.getContour ().size ());
+ print_highlight ("Planar region: %lu points initial, %lu points after refinement.\n", regions[idx].getContour ().size (), region.getContour ().size ());
}
else
{
PointCloud<PointT> plane_hull;
chull.reconstruct (plane_hull);
region.setContour (plane_hull);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", plane_hull.size ()); print_info (" points]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", plane_hull.size ()); print_info (" points]\n");
}
}
cloud_viewer_->addPointCloud (cloud_, "scene");
cloud_viewer_->resetCameraViewpoint ("scene");
- cloud_viewer_->addCoordinateSystem (0.1, 0, 0, 0);
+ cloud_viewer_->addCoordinateSystem (0.1, 0, 0, 0, "global");
}
/////////////////////////////////////////////////////////////////////////
return (false);
}
print_info ("[done, "); print_value ("%g", tt.toc ());
- print_info (" ms : "); print_value ("%zu", cloud_->size ()); print_info (" points]\n");
+ print_info (" ms : "); print_value ("%lu", cloud_->size ()); print_info (" points]\n");
if (cloud_->isOrganized ())
search_.reset (new search::OrganizedNeighbor<PointT>);
vtkSmartPointer<vtkTransformFilter> trans_filter_center = vtkSmartPointer<vtkTransformFilter>::New ();
trans_filter_center->SetTransform (trans_center);
+#if VTK_MAJOR_VERSION < 6
trans_filter_center->SetInput (polydata_);
+#else
+ trans_filter_center->SetInputData (polydata_);
+#endif
trans_filter_center->Update ();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
// Get camera positions
vtkPolyData *sphere = subdivide->GetOutput ();
- sphere->Update ();
std::vector<Eigen::Vector3f> cam_positions;
if (!use_vertices_)
# EIGEN_FOUND - True if Eigen was found.
# EIGEN_INCLUDE_DIRS - Directories containing the Eigen include files.
# EIGEN_DEFINITIONS - Compiler flags for Eigen.
+# EIGEN_VERSION - Package version
find_package(PkgConfig QUIET)
pkg_check_modules(PC_EIGEN eigen3)
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} /usr /usr/local)
endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+if(APPLE)
+ list(APPEND CMAKE_INCLUDE_PATH /opt/local)
+ set(CMAKE_FIND_FRAMEWORK NEVER)
+endif()
find_path(EIGEN_INCLUDE_DIR Eigen/Core
HINTS ${PC_EIGEN_INCLUDEDIR} ${PC_EIGEN_INCLUDE_DIRS} "${EIGEN_ROOT}" "$ENV{EIGEN_ROOT}"
"$ENV{PROGRAMFILES}/Eigen 3.0.0" "$ENV{PROGRAMW6432}/Eigen 3.0.0"
PATH_SUFFIXES eigen3 include/eigen3 include)
+if(EIGEN_INCLUDE_DIR)
+ file(READ "${EIGEN_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen_version_header)
+
+ string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen_world_version_match "${_eigen_version_header}")
+ set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen_major_version_match "${_eigen_version_header}")
+ set(EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen_minor_version_match "${_eigen_version_header}")
+ set(EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}")
+ set(EIGEN_VERSION ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})
+endif(EIGEN_INCLUDE_DIR)
set(EIGEN_INCLUDE_DIRS ${EIGEN_INCLUDE_DIR})
+set(CMAKE_FIND_FRAMEWORK)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Eigen DEFAULT_MSG EIGEN_INCLUDE_DIR)
mark_as_advanced(EIGEN_INCLUDE_DIR)
if(EIGEN_FOUND)
- message(STATUS "Eigen found (include: ${EIGEN_INCLUDE_DIRS})")
+ message(STATUS "Eigen found (include: ${EIGEN_INCLUDE_DIRS}, version: ${EIGEN_VERSION})")
endif(EIGEN_FOUND)
-
# FZAPI_INCLUDE_DIRS - Directories containing the FZAPI include files.
# FZAPI_LIBRARIES - Libraries needed to use FZAPI.
-#MESSAGE("Searching for Fotonic in: ${FZ_API_DIR}")
-
if(FZ_API_DIR)
# Find include dirs
- #MESSAGE("Searching Fotonic includes: ${FZ_API_DIR}")
find_path(FZAPI_INCLUDE_DIR fz_api.h
PATHS "${FZ_API_DIR}" NO_DEFAULT_PATH
DOC "Fotonic include directories")
# Find libraries
- #MESSAGE("Searching Fotonic libs: ${FZ_API_DIR}/Release")
find_library(FZAPI_LIBS fotonic_fz_api
HINTS "${FZ_API_DIR}/Release" NO_DEFAULT_PATH
DOC "Fotonic libraries")
set(FZ_API_DIR "default value" CACHE FILEPATH "directory of Fotonic API")
endif()
-#MESSAGE("FZAPI_INCLUDE_DIR: ${FZAPI_INCLUDE_DIR}")
-#MESSAGE("FZAPI_LIBS: ${FZAPI_LIBS}")
-
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(FZAPI DEFAULT_MSG
FZAPI_LIBS FZAPI_INCLUDE_DIR)
IF (APPLE)
# These values for Apple could probably do with improvement.
+ if (${CMAKE_SYSTEM_VERSION} VERSION_LESS "13.0.0")
FIND_PATH( GLEW_INCLUDE_DIR glew.h
/System/Library/Frameworks/GLEW.framework/Versions/A/Headers
${OPENGL_LIBRARY_DIR}
- )
+ )
SET(GLEW_GLEW_LIBRARY "-framework GLEW" CACHE STRING "GLEW library for OSX")
+ else (${CMAKE_SYSTEM_VERSION} VERSION_LESS "13.0.0")
+ find_package(PkgConfig)
+ pkg_check_modules(glew GLEW)
+ SET(GLEW_GLEW_LIBRARY ${GLEW_LIBRARIES} CACHE STRING "GLEW library for OSX")
+ endif (${CMAKE_SYSTEM_VERSION} VERSION_LESS "13.0.0")
SET(GLEW_cocoa_LIBRARY "-framework Cocoa" CACHE STRING "Cocoa framework for OSX")
ELSE (APPLE)
--- /dev/null
+###############################################################################
+# Find GTest
+#
+# This sets the following variables:
+# GTEST_FOUND - True if GTest was found.
+# GTEST_INCLUDE_DIRS - Directories containing the GTest include files.
+# GTEST_SRC - Directories containing the GTest source files.
+
+if(CMAKE_SYSTEM_NAME STREQUAL Linux)
+ set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} /usr /usr/local)
+endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+if(APPLE)
+ list(APPEND CMAKE_INCLUDE_PATH /opt/local)
+ set(CMAKE_FIND_FRAMEWORK NEVER)
+endif()
+
+find_path(GTEST_INCLUDE_DIR gtest/gtest.h
+ HINTS "${GTEST_ROOT}" "$ENV{GTEST_ROOT}"
+ PATHS "$ENV{PROGRAMFILES}/gtest" "$ENV{PROGRAMW6432}/gtest"
+ PATHS "$ENV{PROGRAMFILES}/gtest-1.7.0" "$ENV{PROGRAMW6432}/gtest-1.7.0"
+ PATH_SUFFIXES gtest include/gtest include)
+
+find_path(GTEST_SRC_DIR src/gtest-all.cc
+ HINTS "${GTEST_ROOT}" "$ENV{GTEST_ROOT}"
+ PATHS "$ENV{PROGRAMFILES}/gtest" "$ENV{PROGRAMW6432}/gtest"
+ PATHS "$ENV{PROGRAMFILES}/gtest-1.7.0" "$ENV{PROGRAMW6432}/gtest-1.7.0"
+ PATH /usr/src/gtest
+ PATH_SUFFIXES gtest usr/src/gtest)
+
+set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
+set(CMAKE_FIND_FRAMEWORK)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Gtest DEFAULT_MSG GTEST_INCLUDE_DIR GTEST_SRC_DIR)
+
+mark_as_advanced(GTEST_INCLUDE_DIR GTEST_SRC_DIR)
+
+if(GTEST_FOUND)
+ message(STATUS "GTest found (include: ${GTEST_INCLUDE_DIRS}, src: ${GTEST_SRC_DIR})")
+endif(GTEST_FOUND)
+++ /dev/null
-# - Find a Message Passing Interface (MPI) implementation
-# The Message Passing Interface (MPI) is a library used to write
-# high-performance distributed-memory parallel applications, and
-# is typically deployed on a cluster. MPI is a standard interface
-# (defined by the MPI forum) for which many implementations are
-# available. All of them have somewhat different include paths,
-# libraries to link against, etc., and this module tries to smooth
-# out those differences.
-#
-# === Variables ===
-#
-# This module will set the following variables per language in your project,
-# where <lang> is one of C, CXX, or Fortran:
-# MPI_<lang>_FOUND TRUE if FindMPI found MPI flags for <lang>
-# MPI_<lang>_COMPILER MPI Compiler wrapper for <lang>
-# MPI_<lang>_COMPILE_FLAGS Compilation flags for MPI programs
-# MPI_<lang>_INCLUDE_PATH Include path(s) for MPI header
-# MPI_<lang>_LINK_FLAGS Linking flags for MPI programs
-# MPI_<lang>_LIBRARIES All libraries to link MPI programs against
-# Additionally, FindMPI sets the following variables for running MPI
-# programs from the command line:
-# MPIEXEC Executable for running MPI programs
-# MPIEXEC_NUMPROC_FLAG Flag to pass to MPIEXEC before giving
-# it the number of processors to run on
-# MPIEXEC_PREFLAGS Flags to pass to MPIEXEC directly
-# before the executable to run.
-# MPIEXEC_POSTFLAGS Flags to pass to MPIEXEC after other flags
-# === Usage ===
-#
-# To use this module, simply call FindMPI from a CMakeLists.txt file, or
-# run find_package(MPI), then run CMake. If you are happy with the auto-
-# detected configuration for your language, then you're done. If not, you
-# have two options:
-# 1. Set MPI_<lang>_COMPILER to the MPI wrapper (mpicc, etc.) of your
-# choice and reconfigure. FindMPI will attempt to determine all the
-# necessary variables using THAT compiler's compile and link flags.
-# 2. If this fails, or if your MPI implementation does not come with
-# a compiler wrapper, then set both MPI_<lang>_LIBRARIES and
-# MPI_<lang>_INCLUDE_PATH. You may also set any other variables
-# listed above, but these two are required. This will circumvent
-# autodetection entirely.
-# When configuration is successful, MPI_<lang>_COMPILER will be set to the
-# compiler wrapper for <lang>, if it was found. MPI_<lang>_FOUND and other
-# variables above will be set if any MPI implementation was found for <lang>,
-# regardless of whether a compiler was found.
-#
-# When using MPIEXEC to execute MPI applications, you should typically use
-# all of the MPIEXEC flags as follows:
-# ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} PROCS
-# ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS
-# where PROCS is the number of processors on which to execute the program,
-# EXECUTABLE is the MPI program, and ARGS are the arguments to pass to the
-# MPI program.
-#
-# === Backward Compatibility ===
-#
-# For backward compatibility with older versions of FindMPI, these
-# variables are set, but deprecated:
-# MPI_FOUND MPI_COMPILER MPI_LIBRARY
-# MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_EXTRA_LIBRARY
-# MPI_LINK_FLAGS MPI_LIBRARIES
-# In new projects, please use the MPI_<lang>_XXX equivalents.
-
-#=============================================================================
-# Copyright 2001-2011 Kitware, Inc.
-# Copyright 2010-2011 Todd Gamblin tgamblin@llnl.gov
-# Copyright 2001-2009 Dave Partyka
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-# include this to handle the QUIETLY and REQUIRED arguments
-include(FindPackageHandleStandardArgs)
-include(GetPrerequisites)
-
-#
-# This part detects MPI compilers, attempting to wade through the mess of compiler names in
-# a sensible way.
-#
-# The compilers are detected in this order:
-#
-# 1. Try to find the most generic availble MPI compiler, as this is usually set up by
-# cluster admins. e.g., if plain old mpicc is available, we'll use it and assume it's
-# the right compiler.
-#
-# 2. If a generic mpicc is NOT found, then we attempt to find one that matches
-# CMAKE_<lang>_COMPILER_ID. e.g. if you are using XL compilers, we'll try to find mpixlc
-# and company, but not mpiicc. This hopefully prevents toolchain mismatches.
-#
-# If you want to force a particular MPI compiler other than what we autodetect (e.g. if you
-# want to compile regular stuff with GNU and parallel stuff with Intel), you can always set
-# your favorite MPI_<lang>_COMPILER explicitly and this stuff will be ignored.
-#
-
-# Start out with the generic MPI compiler names, as these are most commonly used.
-set(_MPI_C_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r)
-set(_MPI_CXX_COMPILER_NAMES mpicxx mpiCC mpcxx mpCC mpic++ mpc++
- mpicxx_r mpiCC_r mpcxx_r mpCC_r mpic++_r mpc++_r)
-set(_MPI_Fortran_COMPILER_NAMES mpif95 mpif95_r mpf95 mpf95_r
- mpif90 mpif90_r mpf90 mpf90_r
- mpif77 mpif77_r mpf77 mpf77_r)
-
-# GNU compiler names
-set(_MPI_GNU_C_COMPILER_NAMES mpigcc mpgcc mpigcc_r mpgcc_r)
-set(_MPI_GNU_CXX_COMPILER_NAMES mpig++ mpg++ mpig++_r mpg++_r)
-set(_MPI_GNU_Fortran_COMPILER_NAMES mpigfortran mpgfortran mpigfortran_r mpgfortran_r
- mpig77 mpig77_r mpg77 mpg77_r)
-
-# Intel MPI compiler names
-set(_MPI_Intel_C_COMPILER_NAMES mpiicc)
-set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc mpiicxx mpiic++ mpiiCC)
-set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort mpiif95 mpiif90 mpiif77)
-
-# PGI compiler names
-set(_MPI_PGI_C_COMPILER_NAMES mpipgcc mppgcc)
-set(_MPI_PGI_CXX_COMPILER_NAMES mpipgCC mppgCC)
-set(_MPI_PGI_Fortran_COMPILER_NAMES mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77)
-
-# XLC MPI Compiler names
-set(_MPI_XL_C_COMPILER_NAMES mpxlc mpxlc_r mpixlc mpixlc_r)
-set(_MPI_XL_CXX_COMPILER_NAMES mpixlcxx mpixlC mpixlc++ mpxlcxx mpxlc++ mpixlc++ mpxlCC
- mpixlcxx_r mpixlC_r mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r)
-set(_MPI_XL_Fortran_COMPILER_NAMES mpixlf95 mpixlf95_r mpxlf95 mpxlf95_r
- mpixlf90 mpixlf90_r mpxlf90 mpxlf90_r
- mpixlf77 mpixlf77_r mpxlf77 mpxlf77_r
- mpixlf mpixlf_r mpxlf mpxlf_r)
-
-# append vendor-specific compilers to the list if we either don't know the compiler id,
-# or if we know it matches the regular compiler.
-foreach (lang C CXX Fortran)
- foreach (id GNU Intel PGI XL)
- if (NOT CMAKE_${lang}_COMPILER_ID OR "${CMAKE_${lang}_COMPILER_ID}" STREQUAL "${id}")
- list(APPEND _MPI_${lang}_COMPILER_NAMES ${_MPI_${id}_${lang}_COMPILER_NAMES})
- endif()
- unset(_MPI_${id}_${lang}_COMPILER_NAMES) # clean up the namespace here
- endforeach()
-endforeach()
-
-
-# Names to try for MPI exec
-set(_MPI_EXEC_NAMES mpiexec mpirun lamexec srun)
-
-# Grab the path to MPI from the registry if we're on windows.
-set(_MPI_PREFIX_PATH)
-if(WIN32)
- list(APPEND _MPI_PREFIX_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/..")
- list(APPEND _MPI_PREFIX_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]")
- list(APPEND _MPI_PREFIX_PATH "$ENV{ProgramW6432}/MPICH2/")
-endif()
-
-# Build a list of prefixes to search for MPI.
-foreach(SystemPrefixDir ${CMAKE_SYSTEM_PREFIX_PATH})
- foreach(MpiPackageDir ${_MPI_PREFIX_PATH})
- if(EXISTS ${SystemPrefixDir}/${MpiPackageDir})
- list(APPEND _MPI_PREFIX_PATH "${SystemPrefixDir}/${MpiPackageDir}")
- endif()
- endforeach()
-endforeach()
-
-
-#
-# interrogate_mpi_compiler(lang try_libs)
-#
-# Attempts to extract compiler and linker args from an MPI compiler. The arguments set
-# by this function are:
-#
-# MPI_<lang>_INCLUDE_PATH MPI_<lang>_LINK_FLAGS MPI_<lang>_FOUND
-# MPI_<lang>_COMPILE_FLAGS MPI_<lang>_LIBRARIES
-#
-# MPI_<lang>_COMPILER must be set beforehand to the absolute path to an MPI compiler for
-# <lang>. Additionally, MPI_<lang>_INCLUDE_PATH and MPI_<lang>_LIBRARIES may be set
-# to skip autodetection.
-#
-# If try_libs is TRUE, this will also attempt to find plain MPI libraries in the usual
-# way. In general, this is not as effective as interrogating the compilers, as it
-# ignores language-specific flags and libraries. However, some MPI implementations
-# (Windows implementations) do not have compiler wrappers, so this approach must be used.
-#
-function (interrogate_mpi_compiler lang try_libs)
- # MPI_${lang}_NO_INTERROGATE will be set to a compiler name when the *regular* compiler was
- # discovered to be the MPI compiler. This happens on machines like the Cray XE6 that use
- # modules to set cc, CC, and ftn to the MPI compilers. If the user force-sets another MPI
- # compiler, MPI_${lang}_COMPILER won't be equal to MPI_${lang}_NO_INTERROGATE, and we'll
- # inspect that compiler anew. This allows users to set new compilers w/o rm'ing cache.
- string(COMPARE NOTEQUAL "${MPI_${lang}_NO_INTERROGATE}" "${MPI_${lang}_COMPILER}" interrogate)
-
- # If MPI is set already in the cache, don't bother with interrogating the compiler.
- if (interrogate AND ((NOT MPI_${lang}_INCLUDE_PATH) OR (NOT MPI_${lang}_LIBRARIES)))
- if (MPI_${lang}_COMPILER)
- # Check whether the -showme:compile option works. This indicates that we have either OpenMPI
- # or a newer version of LAM-MPI, and implies that -showme:link will also work.
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -showme:compile
- OUTPUT_VARIABLE MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
-
- if (MPI_COMPILER_RETURN EQUAL 0)
- # If we appear to have -showme:compile, then we should
- # also have -showme:link. Try it.
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -showme:link
- OUTPUT_VARIABLE MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
-
- if (MPI_COMPILER_RETURN EQUAL 0)
- # We probably have -showme:incdirs and -showme:libdirs as well,
- # so grab that while we're at it.
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -showme:incdirs
- OUTPUT_VARIABLE MPI_INCDIRS OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_INCDIRS ERROR_STRIP_TRAILING_WHITESPACE)
-
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -showme:libdirs
- OUTPUT_VARIABLE MPI_LIBDIRS OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_LIBDIRS ERROR_STRIP_TRAILING_WHITESPACE)
-
- else()
- # reset things here if something went wrong.
- set(MPI_COMPILE_CMDLINE)
- set(MPI_LINK_CMDLINE)
- endif()
- endif ()
-
- # Older versions of LAM-MPI have "-showme". Try to find that.
- if (NOT MPI_COMPILER_RETURN EQUAL 0)
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -showme
- OUTPUT_VARIABLE MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
- endif()
-
- # MVAPICH uses -compile-info and -link-info. Try them.
- if (NOT MPI_COMPILER_RETURN EQUAL 0)
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -compile-info
- OUTPUT_VARIABLE MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
-
- # If we have compile-info, also have link-info.
- if (MPI_COMPILER_RETURN EQUAL 0)
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -link-info
- OUTPUT_VARIABLE MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
- endif()
-
- # make sure we got compile and link. Reset vars if something's wrong.
- if (NOT MPI_COMPILER_RETURN EQUAL 0)
- set(MPI_COMPILE_CMDLINE)
- set(MPI_LINK_CMDLINE)
- endif()
- endif()
-
- # MPICH just uses "-show". Try it.
- if (NOT MPI_COMPILER_RETURN EQUAL 0)
- execute_process(
- COMMAND ${MPI_${lang}_COMPILER} -show
- OUTPUT_VARIABLE MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE MPI_COMPILER_RETURN)
- endif()
-
- if (MPI_COMPILER_RETURN EQUAL 0)
- # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE
- # into MPI_LINK_CMDLINE, if we didn't find the link line.
- if (NOT MPI_LINK_CMDLINE)
- set(MPI_LINK_CMDLINE ${MPI_COMPILE_CMDLINE})
- endif()
- else()
- message(STATUS "Unable to determine MPI from MPI driver ${MPI_${lang}_COMPILER}")
- set(MPI_COMPILE_CMDLINE)
- set(MPI_LINK_CMDLINE)
- endif()
-
- # Here, we're done with the interrogation part, and we'll try to extract args we care
- # about from what we learned from the compiler wrapper scripts.
-
- # If interrogation came back with something, extract our variable from the MPI command line
- if (MPI_COMPILE_CMDLINE OR MPI_LINK_CMDLINE)
- # Extract compile flags from the compile command line.
- string(REGEX MATCHALL "(^| )-[Df]([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_FLAGS "${MPI_COMPILE_CMDLINE}")
- set(MPI_COMPILE_FLAGS_WORK)
-
- foreach(FLAG ${MPI_ALL_COMPILE_FLAGS})
- if (MPI_COMPILE_FLAGS_WORK)
- set(MPI_COMPILE_FLAGS_WORK "${MPI_COMPILE_FLAGS_WORK} ${FLAG}")
- else()
- set(MPI_COMPILE_FLAGS_WORK ${FLAG})
- endif()
- endforeach()
-
- # Extract include paths from compile command line
- string(REGEX MATCHALL "(^| )-I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}")
- foreach(IPATH ${MPI_ALL_INCLUDE_PATHS})
- string(REGEX REPLACE "^ ?-I" "" IPATH ${IPATH})
- string(REGEX REPLACE "//" "/" IPATH ${IPATH})
- list(APPEND MPI_INCLUDE_PATH_WORK ${IPATH})
- endforeach()
-
- # try using showme:incdirs if extracting didn't work.
- if (NOT MPI_INCLUDE_PATH_WORK)
- set(MPI_INCLUDE_PATH_WORK ${MPI_INCDIRS})
- separate_arguments(MPI_INCLUDE_PATH_WORK)
- endif()
-
- # If all else fails, just search for mpi.h in the normal include paths.
- if (NOT MPI_INCLUDE_PATH_WORK)
- set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
- find_path(MPI_HEADER_PATH mpi.h
- HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
- PATH_SUFFIXES include)
- set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
- endif()
-
- # Extract linker paths from the link command line
- string(REGEX MATCHALL "(^| |-Wl,)-L([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}")
- set(MPI_LINK_PATH)
- foreach(LPATH ${MPI_ALL_LINK_PATHS})
- string(REGEX REPLACE "^(| |-Wl,)-L" "" LPATH ${LPATH})
- string(REGEX REPLACE "//" "/" LPATH ${LPATH})
- list(APPEND MPI_LINK_PATH ${LPATH})
- endforeach()
-
- # try using showme:libdirs if extracting didn't work.
- if (NOT MPI_LINK_PATH)
- set(MPI_LINK_PATH ${MPI_LIBDIRS})
- separate_arguments(MPI_LINK_PATH)
- endif()
-
- # Extract linker flags from the link command line
- string(REGEX MATCHALL "(^| )-Wl,([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}")
- set(MPI_LINK_FLAGS_WORK)
- foreach(FLAG ${MPI_ALL_LINK_FLAGS})
- if (MPI_LINK_FLAGS_WORK)
- set(MPI_LINK_FLAGS_WORK "${MPI_LINK_FLAGS_WORK} ${FLAG}")
- else()
- set(MPI_LINK_FLAGS_WORK ${FLAG})
- endif()
- endforeach()
-
- # Extract the set of libraries to link against from the link command
- # line
- string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}")
-
- # Determine full path names for all of the libraries that one needs
- # to link against in an MPI program
- foreach(LIB ${MPI_LIBNAMES})
- string(REGEX REPLACE "^ ?-l" "" LIB ${LIB})
- # MPI_LIB is cached by find_library, but we don't want that. Clear it first.
- set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
- find_library(MPI_LIB NAMES ${LIB} HINTS ${MPI_LINK_PATH})
-
- if (MPI_LIB)
- list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})
- elseif (NOT MPI_FIND_QUIETLY)
- message(WARNING "Unable to find MPI library ${LIB}")
- endif()
- endforeach()
-
- # Sanity check MPI_LIBRARIES to make sure there are enough libraries
- list(LENGTH MPI_LIBRARIES_WORK MPI_NUMLIBS)
- list(LENGTH MPI_LIBNAMES MPI_NUMLIBS_EXPECTED)
- if (NOT MPI_NUMLIBS EQUAL MPI_NUMLIBS_EXPECTED)
- set(MPI_LIBRARIES_WORK "MPI_${lang}_LIBRARIES-NOTFOUND")
- endif()
- endif()
-
- elseif(try_libs)
- # If we didn't have an MPI compiler script to interrogate, attempt to find everything
- # with plain old find functions. This is nasty because MPI implementations have LOTS of
- # different library names, so this section isn't going to be very generic. We need to
- # make sure it works for MS MPI, though, since there are no compiler wrappers for that.
- find_path(MPI_HEADER_PATH mpi.h
- HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
- PATH_SUFFIXES include Inc)
- set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
-
- # Decide between 32-bit and 64-bit libraries for Microsoft's MPI
- if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
- set(MS_MPI_ARCH_DIR amd64)
- else()
- set(MS_MPI_ARCH_DIR i386)
- endif()
-
- set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
- find_library(MPI_LIB
- NAMES mpi mpich mpich2 msmpi
- HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
- PATH_SUFFIXES lib lib/${MS_MPI_ARCH_DIR} Lib Lib/${MS_MPI_ARCH_DIR})
- set(MPI_LIBRARIES_WORK ${MPI_LIB})
-
- # Right now, we only know about the extra libs for C++.
- # We could add Fortran here (as there is usually libfmpich, etc.), but
- # this really only has to work with MS MPI on Windows.
- # Assume that other MPI's are covered by the compiler wrappers.
- if (${lang} STREQUAL CXX)
- set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
- find_library(MPI_LIB
- NAMES mpi++ mpicxx cxx mpi_cxx
- HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
- PATH_SUFFIXES lib)
- if (MPI_LIBRARIES_WORK AND MPI_LIB)
- set(MPI_LIBRARIES_WORK "${MPI_LIBRARIES_WORK};${MPI_LIB}")
- endif()
- endif()
-
- if (NOT MPI_LIBRARIES_WORK)
- set(MPI_LIBRARIES_WORK "MPI_${lang}_LIBRARIES-NOTFOUND")
- endif()
- endif()
-
- # If we found MPI, set up all of the appropriate cache entries
- set(MPI_${lang}_COMPILE_FLAGS ${MPI_COMPILE_FLAGS_WORK} CACHE STRING "MPI ${lang} compilation flags" FORCE)
- set(MPI_${lang}_INCLUDE_PATH ${MPI_INCLUDE_PATH_WORK} CACHE STRING "MPI ${lang} include path" FORCE)
- set(MPI_${lang}_LINK_FLAGS ${MPI_LINK_FLAGS_WORK} CACHE STRING "MPI ${lang} linking flags" FORCE)
- set(MPI_${lang}_LIBRARIES ${MPI_LIBRARIES_WORK} CACHE STRING "MPI ${lang} libraries to link against" FORCE)
- mark_as_advanced(MPI_${lang}_COMPILE_FLAGS MPI_${lang}_INCLUDE_PATH MPI_${lang}_LINK_FLAGS MPI_${lang}_LIBRARIES)
-
- # clear out our temporary lib/header detectionv variable here.
- set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE INTERNAL "Scratch variable for MPI lib detection" FORCE)
- set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE INTERNAL "Scratch variable for MPI header detection" FORCE)
- endif()
-
- # finally set a found variable for each MPI language
- if (MPI_${lang}_INCLUDE_PATH AND MPI_${lang}_LIBRARIES)
- set(MPI_${lang}_FOUND TRUE PARENT_SCOPE)
- else()
- set(MPI_${lang}_FOUND FALSE PARENT_SCOPE)
- endif()
-endfunction()
-
-
-# This function attempts to compile with the regular compiler, to see if MPI programs
-# work with it. This is a last ditch attempt after we've tried interrogating mpicc and
-# friends, and after we've tried to find generic libraries. Works on machines like
-# Cray XE6, where the modules environment changes what MPI version cc, CC, and ftn use.
-function(try_regular_compiler lang success)
- set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
- if (${lang} STREQUAL Fortran)
- set(test_file ${scratch_directory}/cmake_mpi_test.f90)
- file(WRITE ${test_file}
- "program hello\n"
- "include 'mpif.h'\n"
- "integer ierror\n"
- "call MPI_INIT(ierror)\n"
- "call MPI_FINALIZE(ierror)\n"
- "end\n")
- else()
- if (${lang} STREQUAL CXX)
- set(test_file ${scratch_directory}/cmake_mpi_test.cpp)
- else()
- set(test_file ${scratch_directory}/cmake_mpi_test.c)
- endif()
- file(WRITE ${test_file}
- "#include <mpi.h>\n"
- "int main(int argc, char **argv) {\n"
- " MPI_Init(&argc, &argv);\n"
- " MPI_Finalize();\n"
- "}\n")
- endif()
- try_compile(compiler_has_mpi ${scratch_directory} ${test_file})
- if (compiler_has_mpi)
- set(MPI_${lang}_NO_INTERROGATE ${CMAKE_${lang}_COMPILER} CACHE STRING "Whether to interrogate MPI ${lang} compiler" FORCE)
- set(MPI_${lang}_COMPILER ${CMAKE_${lang}_COMPILER} CACHE STRING "MPI ${lang} compiler" FORCE)
- set(MPI_${lang}_COMPILE_FLAGS "" CACHE STRING "MPI ${lang} compilation flags" FORCE)
- set(MPI_${lang}_INCLUDE_PATH "" CACHE STRING "MPI ${lang} include path" FORCE)
- set(MPI_${lang}_LINK_FLAGS "" CACHE STRING "MPI ${lang} linking flags" FORCE)
- set(MPI_${lang}_LIBRARIES "" CACHE STRING "MPI ${lang} libraries to link against" FORCE)
- endif()
- set(${success} ${compiler_has_mpi} PARENT_SCOPE)
- unset(compiler_has_mpi CACHE)
-endfunction()
-
-# End definitions, commence real work here.
-
-# Most mpi distros have some form of mpiexec which gives us something we can reliably look for.
-find_program(MPIEXEC
- NAMES ${_MPI_EXEC_NAMES}
- PATHS ${_MPI_PREFIX_PATH}
- PATH_SUFFIXES bin
- DOC "Executable for running MPI programs.")
-
-# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin).
-# This gives us a fairly reliable base directory to search for /bin /lib and /include from.
-get_filename_component(_MPI_BASE_DIR "${MPIEXEC}" PATH)
-get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH)
-
-set(MPIEXEC_NUMPROC_FLAG "-np" CACHE STRING "Flag used by MPI to specify the number of processes for MPIEXEC; the next option will be the number of processes.")
-set(MPIEXEC_PREFLAGS "" CACHE STRING "These flags will be directly before the executable that is being run by MPIEXEC.")
-set(MPIEXEC_POSTFLAGS "" CACHE STRING "These flags will come after all flags given to MPIEXEC.")
-set(MPIEXEC_MAX_NUMPROCS "2" CACHE STRING "Maximum number of processors available to run MPI applications.")
-mark_as_advanced(MPIEXEC MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS)
-
-
-#=============================================================================
-# Backward compatibility input hacks. Propagate the FindMPI hints to C and
-# CXX if the respective new versions are not defined. Translate the old
-# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${lang}_LIBRARIES.
-#
-# Once we find the new variables, we translate them back into their old
-# equivalents below.
-foreach (lang C CXX)
- # Old input variables.
- set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS)
-
- # Set new vars based on their old equivalents, if the new versions are not already set.
- foreach (var ${_MPI_OLD_INPUT_VARS})
- if (NOT MPI_${lang}_${var} AND MPI_${var})
- set(MPI_${lang}_${var} "${MPI_${var}}")
- endif()
- endforeach()
-
- # Special handling for MPI_LIBRARY and MPI_EXTRA_LIBRARY, which we nixed in the
- # new FindMPI. These need to be merged into MPI_<lang>_LIBRARIES
- if (NOT MPI_${lang}_LIBRARIES AND (MPI_LIBRARY OR MPI_EXTRA_LIBRARY))
- set(MPI_${lang}_LIBRARIES ${MPI_LIBRARY} ${MPI_EXTRA_LIBRARY})
- endif()
-endforeach()
-#=============================================================================
-
-
-# This loop finds the compilers and sends them off for interrogation.
-foreach (lang C CXX Fortran)
- if (CMAKE_${lang}_COMPILER_WORKS)
- # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler.
- if (MPI_${lang}_COMPILER)
- is_file_executable(MPI_${lang}_COMPILER MPI_COMPILER_IS_EXECUTABLE)
- if (NOT MPI_COMPILER_IS_EXECUTABLE)
- # Get rid of our default list of names and just search for the name the user wants.
- set(_MPI_${lang}_COMPILER_NAMES ${MPI_${lang}_COMPILER})
- set(MPI_${lang}_COMPILER "MPI_${lang}_COMPILER-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
- # If the user specifies a compiler, we don't want to try to search libraries either.
- set(try_libs FALSE)
- endif()
- else()
- set(try_libs TRUE)
- endif()
-
- find_program(MPI_${lang}_COMPILER
- NAMES ${_MPI_${lang}_COMPILER_NAMES}
- PATHS "${MPI_HOME}/bin" "$ENV{MPI_HOME}/bin" ${_MPI_PREFIX_PATH})
- interrogate_mpi_compiler(${lang} ${try_libs})
- mark_as_advanced(MPI_${lang}_COMPILER)
-
- # last ditch try -- if nothing works so far, just try running the regular compiler and
- # see if we can create an MPI executable.
- set(regular_compiler_worked 0)
- if (NOT MPI_${lang}_LIBRARIES OR NOT MPI_${lang}_INCLUDE_PATH)
- try_regular_compiler(${lang} regular_compiler_worked)
- endif()
-
- if (regular_compiler_worked)
- find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_COMPILER)
- else()
- find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_LIBRARIES MPI_${lang}_INCLUDE_PATH)
- endif()
- endif()
-endforeach()
-
-
-#=============================================================================
-# More backward compatibility stuff
-#
-# Bare MPI sans ${lang} vars are set to CXX then C, depending on what was found.
-# This mimics the behavior of the old language-oblivious FindMPI.
-set(_MPI_OLD_VARS FOUND COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES)
-if (MPI_CXX_FOUND)
- foreach (var ${_MPI_OLD_VARS})
- set(MPI_${var} ${MPI_CXX_${var}})
- endforeach()
-elseif (MPI_C_FOUND)
- foreach (var ${_MPI_OLD_VARS})
- set(MPI_${var} ${MPI_C_${var}})
- endforeach()
-else()
- # Note that we might still have found Fortran, but you'll need to use MPI_Fortran_FOUND
- set(MPI_FOUND FALSE)
-endif()
-
-# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache.
-if (MPI_LIBRARIES)
- list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK)
- set(MPI_LIBRARY ${MPI_LIBRARY_WORK} CACHE FILEPATH "MPI library to link against" FORCE)
-else()
- set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND" CACHE FILEPATH "MPI library to link against" FORCE)
-endif()
-
-list(LENGTH MPI_LIBRARIES MPI_NUMLIBS)
-if (MPI_NUMLIBS GREATER 1)
- set(MPI_EXTRA_LIBRARY_WORK ${MPI_LIBRARIES})
- list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0)
- set(MPI_EXTRA_LIBRARY ${MPI_EXTRA_LIBRARY_WORK} CACHE STRING "Extra MPI libraries to link against" FORCE)
-else()
- set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND" CACHE STRING "Extra MPI libraries to link against" FORCE)
-endif()
-#=============================================================================
-
-# unset these vars to cleanup namespace
-unset(_MPI_OLD_VARS)
-unset(_MPI_PREFIX_PATH)
-unset(_MPI_BASE_DIR)
-foreach (lang C CXX Fortran)
- unset(_MPI_${lang}_COMPILER_NAMES)
-endforeach()
# OPENNI_INCLUDE_DIRS - Directories containing the OPENNI include files.
# OPENNI_LIBRARIES - Libraries needed to use OPENNI.
# OPENNI_DEFINITIONS - Compiler flags for OPENNI.
-#
+#
# For libusb-1.0, add USB_10_ROOT if not found
find_package(PkgConfig QUIET)
PATH_SUFFIXES libusb-1.0)
find_library(USB_10_LIBRARY
- NAMES usb-1.0
+ NAMES usb-1.0
HINTS ${PC_USB_10_LIBDIR} ${PC_USB_10_LIBRARY_DIRS} "${USB_10_ROOT}" "$ENV{USB_10_ROOT}"
PATH_SUFFIXES lib)
-
+
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(USB_10 DEFAULT_MSG USB_10_LIBRARY USB_10_INCLUDE_DIR)
-
+
if(NOT USB_10_FOUND)
- message(STATUS "OpenNI disabled because libusb-1.0 not found.")
+ message(STATUS "OpenNI disabled because libusb-1.0 not found.")
return()
else()
include_directories(SYSTEM ${USB_10_INCLUDE_DIR})
endif()
endif(NOT WIN32)
-
+
if(${CMAKE_VERSION} VERSION_LESS 2.8.2)
pkg_check_modules(PC_OPENNI openni-dev)
else()
#add a hint so that it can find it without the pkg-config
find_path(OPENNI_INCLUDE_DIR XnStatus.h
- HINTS ${PC_OPENNI_INCLUDEDIR} ${PC_OPENNI_INCLUDE_DIRS} /usr/include/openni /usr/include/ni "${OPENNI_ROOT}" "$ENV{OPENNI_ROOT}"
+ HINTS ${PC_OPENNI_INCLUDEDIR} ${PC_OPENNI_INCLUDE_DIRS} /usr/include/openni /usr/include/ni /opt/local/include/ni "${OPENNI_ROOT}" "$ENV{OPENNI_ROOT}"
PATHS "$ENV{OPEN_NI_INSTALL_PATH${OPENNI_SUFFIX}}/Include"
PATH_SUFFIXES openni include Include)
#add a hint so that it can find it without the pkg-config
-find_library(OPENNI_LIBRARY
+find_library(OPENNI_LIBRARY
NAMES OpenNI${OPENNI_SUFFIX}
HINTS ${PC_OPENNI_LIBDIR} ${PC_OPENNI_LIBRARY_DIRS} /usr/lib "${OPENNI_ROOT}" "$ENV{OPENNI_ROOT}"
PATHS "$ENV{OPEN_NI_LIB${OPENNI_SUFFIX}}"
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(OpenNI DEFAULT_MSG OPENNI_LIBRARY OPENNI_INCLUDE_DIR)
-
+
mark_as_advanced(OPENNI_LIBRARY OPENNI_INCLUDE_DIR)
-if(OPENNI_FOUND)
+if(OPENNI_FOUND)
# Add the include directories
- set(OPENNI_INCLUDE_DIRS ${OPENNI_INCLUDE_DIR})
+ set(OPENNI_INCLUDE_DIRS ${OPENNI_INCLUDE_DIR})
message(STATUS "OpenNI found (include: ${OPENNI_INCLUDE_DIRS}, lib: ${OPENNI_LIBRARY})")
endif(OPENNI_FOUND)
-
--- /dev/null
+###############################################################################
+# Find OpenNI 2
+#
+# This sets the following variables:
+# OPENNI2_FOUND - True if OPENNI 2 was found.
+# OPENNI2_INCLUDE_DIRS - Directories containing the OPENNI 2 include files.
+# OPENNI2_LIBRARIES - Libraries needed to use OPENNI 2.
+# OPENNI2_DEFINITIONS - Compiler flags for OPENNI 2.
+#
+# For libusb-1.0, add USB_10_ROOT if not found
+
+find_package(PkgConfig QUIET)
+
+# Find LibUSB
+if(NOT WIN32)
+ pkg_check_modules(PC_USB_10 libusb-1.0)
+ find_path(USB_10_INCLUDE_DIR libusb-1.0/libusb.h
+ HINTS ${PC_USB_10_INCLUDEDIR} ${PC_USB_10_INCLUDE_DIRS} "${USB_10_ROOT}" "$ENV{USB_10_ROOT}"
+ PATH_SUFFIXES libusb-1.0)
+
+ find_library(USB_10_LIBRARY
+ NAMES usb-1.0
+ HINTS ${PC_USB_10_LIBDIR} ${PC_USB_10_LIBRARY_DIRS} "${USB_10_ROOT}" "$ENV{USB_10_ROOT}"
+ PATH_SUFFIXES lib)
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(USB_10 DEFAULT_MSG USB_10_LIBRARY USB_10_INCLUDE_DIR)
+
+ if(NOT USB_10_FOUND)
+ message(STATUS "OpenNI 2 disabled because libusb-1.0 not found.")
+ return()
+ else()
+ include_directories(SYSTEM ${USB_10_INCLUDE_DIR})
+ endif()
+endif(NOT WIN32)
+
+if(${CMAKE_VERSION} VERSION_LESS 2.8.2)
+ pkg_check_modules(PC_OPENNI2 openni2-dev)
+else()
+ pkg_check_modules(PC_OPENNI2 QUIET openni2-dev)
+endif()
+
+set(OPENNI2_DEFINITIONS ${PC_OPENNI_CFLAGS_OTHER})
+
+set(OPENNI2_SUFFIX)
+if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(OPENNI2_SUFFIX 64)
+endif(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+
+find_path(OPENNI2_INCLUDE_DIRS OpenNI.h
+ PATHS
+ "$ENV{OPENNI2_INCLUDE${OPENNI2_SUFFIX}}" # Win64 needs '64' suffix
+ /usr/include/openni2 # common path for deb packages
+)
+
+find_library(OPENNI2_LIBRARY
+ NAMES OpenNI2 # No suffix needed on Win64
+ libOpenNI2 # Linux
+ PATHS "$ENV{OPENNI2_LIB${OPENNI2_SUFFIX}}" # Windows default path, Win64 needs '64' suffix
+ "$ENV{OPENNI2_REDIST}" # Linux install does not use a separate 'lib' directory
+ )
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ set(OPENNI2_LIBRARIES ${OPENNI2_LIBRARY} ${LIBUSB_1_LIBRARIES})
+else()
+ set(OPENNI2_LIBRARIES ${OPENNI2_LIBRARY})
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(OpenNI2 DEFAULT_MSG OPENNI2_LIBRARY OPENNI2_INCLUDE_DIRS)
+
+mark_as_advanced(OPENNI2_LIBRARY OPENNI2_INCLUDE_DIRS)
+
+if(OPENNI2_FOUND)
+ # Add the include directories
+ set(OPENNI2_INCLUDE_DIRS ${OPENNI2_INCLUDE_DIR})
+ set(OPENNI2_REDIST_DIR $ENV{OPENNI2_REDIST${OPENNI2_SUFFIX}})
+ message(STATUS "OpenNI 2 found (include: ${OPENNI2_INCLUDE_DIRS}, lib: ${OPENNI2_LIBRARY}, redist: ${OPENNI2_REDIST_DIR})")
+endif(OPENNI2_FOUND)
+
# PXCAPI_FOUND - True if PXCAPI was found.
# PXCAPI_INCLUDE_DIRS - Directories containing the PXCAPI include files.
# PXCAPI_LIBRARIES - Libraries needed to use PXCAPI.
-
-#MESSAGE("Searching for PXCAPI in: ${PXCAPI_DIR}")
+
+find_path(PXCAPI_DIR include/pxcimage.h
+ PATHS "${PXCAPI_DIR}" "C:/Program Files/Intel/PCSDK" "C:/Program Files (x86)/Intel/PCSDK"
+ DOC "PXCAPI include directories")
if(PXCAPI_DIR)
set(PXCAPI_INCLUDE_DIRS ${PXCAPI_DIR}/include ${PXCAPI_DIR}/sample/common/include)
- set(PXCAPI_LIB_DIRS ${PXCAPI_DIR}/lib/x64 ${PXCAPI_DIR}/sample/common/lib/x64/v100)
- set(PXCAPI_LIBS ${PXCAPI_DIR}/lib/x64/libpxc.lib ${PXCAPI_DIR}/sample/common/lib/x64/v100/libpxcutils.lib)
-else()
- MESSAGE("Searching PXCAPI includes: ${PXCAPI_DIR}")
- find_path(PXCAPI_DIR include/pxcimage.h
- PATHS "${PXCAPI_DIR}" "C:/Program Files/Intel/PCSDK" "C:/Program Files (x86)/Intel/PCSDK"
- DOC "PXCAPI include directories")
- if(PXCAPI_DIR)
- set(PXCAPI_INCLUDE_DIRS ${PXCAPI_DIR}/include ${PXCAPI_DIR}/sample/common/include)
- set(PXCAPI_LIB_DIRS ${PXCAPI_DIR}/lib/x64 ${PXCAPI_DIR}/sample/common/lib/x64/v100)
- set(PXCAPI_LIBS ${PXCAPI_DIR}/lib/x64/libpxc.lib ${PXCAPI_DIR}/sample/common/lib/x64/v100/libpxcutils.lib)
- else()
- set(PXCAPI_DIR "directory not found (please enter)" CACHE FILEPATH "directory of PXCAPI")
- endif()
+ find_library(PXCAPI_LIB libpxc.lib
+ PATHS "${PXCAPI_DIR}/lib/" NO_DEFAULT_PATH
+ PATH_SUFFIXES x64 Win32)
+ find_library(PXCAPI_SAMPLE_LIB libpxcutils.lib
+ PATHS "${PXCAPI_DIR}/sample/common/lib" NO_DEFAULT_PATH
+ PATH_SUFFIXES x64/v100 Win32/v100)
+ set(PXCAPI_LIBS ${PXCAPI_LIB} ${PXCAPI_SAMPLE_LIB})
endif()
-MESSAGE("PXCAPI_INCLUDE_DIR: ${PXCAPI_INCLUDE_DIRS}")
-MESSAGE("PXCAPI_LIBS: ${PXCAPI_LIBS}")
-
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PXCAPI DEFAULT_MSG
- PXCAPI_LIBS PXCAPI_INCLUDE_DIRS PXCAPI_LIB_DIRS)
-
+ PXCAPI_LIBS PXCAPI_INCLUDE_DIRS)
+
+mark_as_advanced(PXCAPI_LIB PXCAPI_SAMPLE_LIB)
+
if(MSVC)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT")
endif()
-
\ No newline at end of file
SET(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARIES})
#Is pcap found ?
-IF(PCAP_INCLUDE_DIRS AND PCAP_LIBRARIES)
-SET( PCAP_FOUND "YES" )
-message(STATUS "PCAP found (include: ${PCAP_INCLUDE_DIRS}, lib: ${PCAP_LIBRARIES})")
-ELSE()
-SET( PCAP_FOUND "NO" )
-message(STATUS "PCAP NOT found")
-ENDIF(PCAP_INCLUDE_DIRS AND PCAP_LIBRARIES)
-
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(PCAP DEFAULT_MSG
+ PCAP_LIBRARIES PCAP_INCLUDE_DIRS)
MARK_AS_ADVANCED(
PCAP_LIBRARIES
# QVTK_LIBRARY - QVTK library.
# if QVTK_FOUND then QVTK_INCLUDE_DIR is appended to VTK_INCLUDE_DIRS and
# QVTK_LIBRARY is appended to QVTK_LIBRARY_DIR
-
-find_library (QVTK_LIBRARY QVTK HINTS ${VTK_DIR} ${VTK_DIR}/bin)
-find_path (QVTK_INCLUDE_DIR QVTKWidget.h HINT ${VTK_INCLUDE_DIRS})
-find_package_handle_standard_args(QVTK DEFAULT_MSG
- QVTK_LIBRARY QVTK_INCLUDE_DIR)
-
-if(NOT QVTK_FOUND)
- set (VTK_USE_QVTK OFF)
-else(NOT QVTK_FOUND)
- get_filename_component (QVTK_LIBRARY_DIR ${QVTK_LIBRARY} PATH)
- set (VTK_LIBRARY_DIRS ${VTK_LIBRARY_DIRS} ${QVTK_LIBRARY_DIR})
- set (VTK_INCLUDE_DIRS ${VTK_INCLUDE_DIRS} ${QVTK_INCLUDE_DIR})
- set (VTK_USE_QVTK ON)
-endif(NOT QVTK_FOUND)
+if (${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
+ find_library (QVTK_LIBRARY QVTK HINTS ${VTK_DIR} ${VTK_DIR}/bin)
+ find_path (QVTK_INCLUDE_DIR QVTKWidget.h HINT ${VTK_INCLUDE_DIRS})
+ find_package_handle_standard_args(QVTK DEFAULT_MSG
+ QVTK_LIBRARY QVTK_INCLUDE_DIR)
+ if(NOT QVTK_FOUND)
+ set (VTK_USE_QVTK OFF)
+ else(NOT QVTK_FOUND)
+ get_filename_component (QVTK_LIBRARY_DIR ${QVTK_LIBRARY} PATH)
+ set (VTK_LIBRARY_DIRS ${VTK_LIBRARY_DIRS} ${QVTK_LIBRARY_DIR})
+ set (VTK_INCLUDE_DIRS ${VTK_INCLUDE_DIRS} ${QVTK_INCLUDE_DIR})
+ set (VTK_USE_QVTK ON)
+ endif(NOT QVTK_FOUND)
+else (${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
+ list (FIND VTK_MODULES_ENABLED vtkGUISupportQt GUI_SUPPORT_QT_FOUND)
+ list (FIND VTK_MODULES_ENABLED vtkRenderingQt RENDERING_QT_FOUND)
+ if (GUI_SUPPORT_QT_FOUND AND RENDERING_QT_FOUND)
+ set (VTK_USE_QVTK ON)
+ set (QVTK_LIBRARY vtkRenderingQt vtkGUISupportQt)
+ else (GUI_SUPPORT_QT_FOUND AND RENDERING_QT_FOUND)
+ unset(QVTK_FOUND)
+ endif (GUI_SUPPORT_QT_FOUND AND RENDERING_QT_FOUND)
+endif (${VTK_MAJOR_VERSION} VERSION_LESS "6.0")
set(QHULL_RELEASE_NAME qhullstatic)
set(QHULL_DEBUG_NAME qhullstatic_d)
else(QHULL_USE_STATIC)
- set(QHULL_RELEASE_NAME qhull qhull${QHULL_MAJOR_VERSION})
- set(QHULL_DEBUG_NAME qhull_d qhull${QHULL_MAJOR_VERSION}_d qhull_d${QHULL_MAJOR_VERSION})
+ set(QHULL_RELEASE_NAME qhull_p qhull${QHULL_MAJOR_VERSION} qhull)
+ set(QHULL_DEBUG_NAME qhull_pd qhull${QHULL_MAJOR_VERSION}_d qhull_d${QHULL_MAJOR_VERSION} qhull_d)
endif(QHULL_USE_STATIC)
find_file(QHULL_HEADER
PATHS "$ENV{PROGRAMFILES}/QHull" "$ENV{PROGRAMW6432}/QHull"
PATH_SUFFIXES project build bin lib)
+get_filename_component(QHULL_LIBRARY_NAME "${QHULL_LIBRARY}" NAME)
+
find_library(QHULL_LIBRARY_DEBUG
NAMES ${QHULL_DEBUG_NAME} ${QHULL_RELEASE_NAME}
HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}"
set(QHULL_LIBRARY_DEBUG ${QHULL_LIBRARY})
endif(NOT QHULL_LIBRARY_DEBUG)
+get_filename_component(QHULL_LIBRARY_DEBUG_NAME "${QHULL_LIBRARY_DEBUG}" NAME)
+
set(QHULL_INCLUDE_DIRS ${QHULL_INCLUDE_DIR})
set(QHULL_LIBRARIES optimized ${QHULL_LIBRARY} debug ${QHULL_LIBRARY_DEBUG})
# Find and set Boost flags
-if(NOT PCL_SHARED_LIBS OR WIN32)
- set(Boost_USE_STATIC_LIBS ON)
- set(Boost_USE_STATIC ON)
-endif(NOT PCL_SHARED_LIBS OR WIN32)
+# If we would like to compile against a dynamically linked Boost
+if(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 AND WIN32)
+ set(Boost_USE_STATIC_LIBS OFF)
+ set(Boost_USE_STATIC OFF)
+ set(Boost_USE_MULTITHREAD ON)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBOOST_ALL_DYN_LINK -DBOOST_ALL_NO_LIB")
+else(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 AND WIN32)
+ if(NOT PCL_SHARED_LIBS OR WIN32)
+ set(Boost_USE_STATIC_LIBS ON)
+ set(Boost_USE_STATIC ON)
+ endif(NOT PCL_SHARED_LIBS OR WIN32)
+endif(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 AND WIN32)
if(${CMAKE_VERSION} VERSION_LESS 2.8.5)
SET(Boost_ADDITIONAL_VERSIONS "1.43" "1.43.0" "1.44" "1.44.0" "1.45" "1.45.0" "1.46.1" "1.46.0" "1.46" "1.47" "1.47.0")
set(Boost_NO_BOOST_CMAKE ON)
# Optional boost modules
-find_package(Boost 1.40.0 QUIET COMPONENTS serialization mpi)
-if(Boost_MPI_FOUND)
- set(BOOST_MPI_FOUND TRUE)
-endif(Boost_MPI_FOUND)
+find_package(Boost 1.47.0 QUIET COMPONENTS serialization mpi)
if(Boost_SERIALIZATION_FOUND)
set(BOOST_SERIALIZATION_FOUND TRUE)
endif(Boost_SERIALIZATION_FOUND)
# Required boost modules
-set(BOOST_REQUIRED_MODULES system filesystem thread date_time iostreams)
-# Starting with Boost 1.50, boost_thread depends on chrono. As this is not
-# taken care of automatically on Windows, we add an explicit dependency as a
-# workaround.
-if(WIN32 AND Boost_VERSION VERSION_GREATER "104900")
- set(BOOST_REQUIRED_MODULES ${BOOST_REQUIRED_MODULES} chrono)
-endif(WIN32 AND Boost_VERSION VERSION_GREATER "104900")
+set(BOOST_REQUIRED_MODULES system filesystem thread date_time iostreams chrono)
-find_package(Boost 1.40.0 REQUIRED COMPONENTS ${BOOST_REQUIRED_MODULES})
+find_package(Boost 1.47.0 REQUIRED COMPONENTS ${BOOST_REQUIRED_MODULES})
if(Boost_FOUND)
set(BOOST_FOUND TRUE)
--- /dev/null
+# Try to Find OpenGL and GLUT silently
+# In addition sets two flags if the found versions are Apple frameworks
+# OPENGL_IS_A_FRAMEWORK
+# GLUT_IS_A_FRAMEWORK
+
+find_package(OpenGL QUIET REQUIRED)
+
+if(APPLE AND OPENGL_FOUND)
+ if ("${OPENGL_INCLUDE_DIR}" MATCHES "\\.framework")
+ set(OPENGL_IS_A_FRAMEWORK TRUE)
+ endif ("${OPENGL_INCLUDE_DIR}" MATCHES "\\.framework")
+endif(APPLE AND OPENGL_FOUND)
+
+find_package(GLUT QUIET)
+
+if(APPLE AND GLUT_FOUND)
+ if ("${GLUT_INCLUDE_DIR}" MATCHES "\\.framework")
+ set(GLUT_IS_A_FRAMEWORK TRUE)
+ endif ("${GLUT_INCLUDE_DIR}" MATCHES "\\.framework")
+endif(APPLE AND GLUT_FOUND)
endif(PCL_SHARED_LIBS)
mark_as_advanced(PCL_SHARED_LIBS)
+# Build with dynamic linking for Boost (advanced users)
+option(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 "Build against a dynamically linked Boost on Win32 platforms." OFF)
+mark_as_advanced(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32)
+
# Precompile for a minimal set of point types instead of all.
option(PCL_ONLY_CORE_POINT_TYPES "Compile explicitly only for a small subset of point types (e.g., pcl::PointXYZ instead of PCL_XYZ_POINT_TYPES)." OFF)
mark_as_advanced(PCL_ONLY_CORE_POINT_TYPES)
option(CMAKE_MSVC_CODE_LINK_OPTIMIZATION "Enable the /GL and /LTCG code and link optimization options for MSVC. Enabled by default." ON)
mark_as_advanced(CMAKE_MSVC_CODE_LINK_OPTIMIZATION)
+# Project folders
+option(USE_PROJECT_FOLDERS "Use folders to organize PCL projects in an IDE." OFF)
+mark_as_advanced(USE_PROJECT_FOLDERS)
+if(USE_PROJECT_FOLDERS)
+ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+endif(USE_PROJECT_FOLDERS)
+
+option(BUILD_tools "Useful PCL-based command line tools" ON)
+
+option(WITH_DOCS "Build doxygen documentation" OFF)
endforeach(_opt_dep)
set(PCLCONFIG_OPTIONAL_DEPENDENCIES "${PCLCONFIG_OPTIONAL_DEPENDENCIES})\n")
endif(_opt_deps)
+
+ #look for subsystems
+ string(TOUPPER "PCL_${_ss}_SUBSYS" PCL_SUBSYS_SUBSYS)
+ if (${PCL_SUBSYS_SUBSYS})
+ string(TOUPPER "PCL_${_ss}_SUBSYS_STATUS" PCL_SUBSYS_SUBSYS_STATUS)
+ foreach(_sub ${${PCL_SUBSYS_SUBSYS}})
+ PCL_GET_SUBSUBSYS_STATUS(_sub_status ${_ss} ${_sub})
+ if (_sub_status)
+ set(PCLCONFIG_AVAILABLE_COMPONENTS "${PCLCONFIG_AVAILABLE_COMPONENTS} ${_sub}")
+ set(PCLCONFIG_AVAILABLE_COMPONENTS_LIST "${PCLCONFIG_AVAILABLE_COMPONENTS_LIST}\n# - ${_sub}")
+ GET_IN_MAP(_deps PCL_SUBSYS_DEPS ${_ss}_${sub})
+ if(_deps)
+ set(PCLCONFIG_INTERNAL_DEPENDENCIES "${PCLCONFIG_INTERNAL_DEPENDENCIES}set(pcl_${_sub}_int_dep ")
+ foreach(_dep ${_deps})
+ set(PCLCONFIG_INTERNAL_DEPENDENCIES "${PCLCONFIG_INTERNAL_DEPENDENCIES}${_dep} ")
+ endforeach(_dep)
+ set(PCLCONFIG_INTERNAL_DEPENDENCIES "${PCLCONFIG_INTERNAL_DEPENDENCIES})\n")
+ endif(_deps)
+ endif (_sub_status)
+ endforeach(_sub)
+ endif (${PCL_SUBSYS_SUBSYS})
endif(_status)
endforeach(_ss)
#Boost modules
set(PCLCONFIG_AVAILABLE_BOOST_MODULES "system filesystem thread date_time iostreams")
-if(Boost_MPI_FOUND)
- set(PCLCONFIG_AVAILABLE_BOOST_MODULES "${PCLCONFIG_AVAILABLE_BOOST_MODULES} mpi")
-endif(Boost_MPI_FOUND)
if(Boost_SERIALIZATION_FOUND)
set(PCLCONFIG_AVAILABLE_BOOST_MODULES "${PCLCONFIG_AVAILABLE_BOOST_MODULES} serialization")
endif(Boost_SERIALIZATION_FOUND)
PCL_GET_SUBSYS_HYPERSTATUS(subsys_status ${_name})
if(NOT ("${subsys_status}" STREQUAL "AUTO_OFF"))
option(${_opt_name} ${_desc} ${_default})
- if(NOT ${_default} AND NOT ${_opt_name})
+ if((NOT ${_default} AND NOT ${_opt_name}) OR ("${_default}" STREQUAL "AUTO_OFF"))
set(${_var} FALSE)
if(${ARGC} GREATER 4)
set(_reason ${ARGV4})
set(${_var} TRUE)
PCL_SET_SUBSYS_STATUS(${_name} TRUE)
PCL_ENABLE_DEPENDIES(${_name})
- endif(NOT ${_default} AND NOT ${_opt_name})
+ endif((NOT ${_default} AND NOT ${_opt_name}) OR ("${_default}" STREQUAL "AUTO_OFF"))
endif(NOT ("${subsys_status}" STREQUAL "AUTO_OFF"))
PCL_ADD_SUBSYSTEM(${_name} ${_desc})
endmacro(PCL_SUBSYS_OPTION)
+###############################################################################
+# Add an option to build a subsystem or not.
+# _var The name of the variable to store the option in.
+# _parent The name of the parent subsystem
+# _name The name of the option's target subsubsystem.
+# _desc The description of the subsubsystem.
+# _default The default value (TRUE or FALSE)
+# ARGV5 The reason for disabling if the default is FALSE.
+macro(PCL_SUBSUBSYS_OPTION _var _parent _name _desc _default)
+ set(_opt_name "BUILD_${_parent}_${_name}")
+ PCL_GET_SUBSYS_HYPERSTATUS(parent_status ${_parent})
+ if(NOT ("${parent_status}" STREQUAL "AUTO_OFF") AND NOT ("${parent_status}" STREQUAL "OFF"))
+ PCL_GET_SUBSYS_HYPERSTATUS(subsys_status ${_parent}_${_name})
+ if(NOT ("${subsys_status}" STREQUAL "AUTO_OFF"))
+ option(${_opt_name} ${_desc} ${_default})
+ if((NOT ${_default} AND NOT ${_opt_name}) OR ("${_default}" STREQUAL "AUTO_OFF"))
+ set(${_var} FALSE)
+ if(${ARGC} GREATER 5)
+ set(_reason ${ARGV5})
+ else(${ARGC} GREATER 5)
+ set(_reason "Disabled by default.")
+ endif(${ARGC} GREATER 5)
+ PCL_SET_SUBSYS_STATUS(${_parent}_${_name} FALSE ${_reason})
+ PCL_DISABLE_DEPENDIES(${_parent}_${_name})
+ elseif(NOT ${_opt_name})
+ set(${_var} FALSE)
+ PCL_SET_SUBSYS_STATUS(${_parent}_${_name} FALSE "Disabled manually.")
+ PCL_DISABLE_DEPENDIES(${_parent}_${_name})
+ else(NOT ${_default} AND NOT ${_opt_name})
+ set(${_var} TRUE)
+ PCL_SET_SUBSYS_STATUS(${_parent}_${_name} TRUE)
+ PCL_ENABLE_DEPENDIES(${_parent}_${_name})
+ endif((NOT ${_default} AND NOT ${_opt_name}) OR ("${_default}" STREQUAL "AUTO_OFF"))
+ endif(NOT ("${subsys_status}" STREQUAL "AUTO_OFF"))
+ endif(NOT ("${parent_status}" STREQUAL "AUTO_OFF") AND NOT ("${parent_status}" STREQUAL "OFF"))
+ PCL_ADD_SUBSUBSYSTEM(${_parent} ${_name} ${_desc})
+endmacro(PCL_SUBSUBSYS_OPTION)
###############################################################################
# Make one subsystem depend on one or more other subsystems, and disable it if
endif(${_var} AND (NOT ("${subsys_status}" STREQUAL "AUTO_OFF")))
endmacro(PCL_SUBSYS_DEPEND)
+###############################################################################
+# Make one subsystem depend on one or more other subsystems, and disable it if
+# they are not being built.
+# _var The cumulative build variable. This will be set to FALSE if the
+# dependencies are not met.
+# _parent The parent subsystem name.
+# _name The name of the subsubsystem.
+# ARGN The subsystems and external libraries to depend on.
+macro(PCL_SUBSUBSYS_DEPEND _var _parent _name)
+ set(options)
+ set(parentArg)
+ set(nameArg)
+ set(multiValueArgs DEPS EXT_DEPS OPT_DEPS)
+ cmake_parse_arguments(SUBSYS "${options}" "${parentArg}" "${nameArg}" "${multiValueArgs}" ${ARGN} )
+ if(SUBSUBSYS_DEPS)
+ SET_IN_GLOBAL_MAP(PCL_SUBSYS_DEPS ${_parent}_${_name} "${SUBSUBSYS_DEPS}")
+ endif(SUBSUBSYS_DEPS)
+ if(SUBSUBSYS_EXT_DEPS)
+ SET_IN_GLOBAL_MAP(PCL_SUBSYS_EXT_DEPS ${_parent}_${_name} "${SUBSUBSYS_EXT_DEPS}")
+ endif(SUBSUBSYS_EXT_DEPS)
+ if(SUBSUBSYS_OPT_DEPS)
+ SET_IN_GLOBAL_MAP(PCL_SUBSYS_OPT_DEPS ${_parent}_${_name} "${SUBSUBSYS_OPT_DEPS}")
+ endif(SUBSUBSYS_OPT_DEPS)
+ GET_IN_MAP(subsys_status PCL_SUBSYS_HYPERSTATUS ${_parent}_${_name})
+ if(${_var} AND (NOT ("${subsys_status}" STREQUAL "AUTO_OFF")))
+ if(SUBSUBSYS_DEPS)
+ foreach(_dep ${SUBSUBSYS_DEPS})
+ PCL_GET_SUBSYS_STATUS(_status ${_dep})
+ if(NOT _status)
+ set(${_var} FALSE)
+ PCL_SET_SUBSYS_STATUS(${_parent}_${_name} FALSE "Requires ${_dep}.")
+ else(NOT _status)
+ PCL_GET_SUBSYS_INCLUDE_DIR(_include_dir ${_dep})
+ include_directories(${PROJECT_SOURCE_DIR}/${_include_dir}/include)
+ endif(NOT _status)
+ endforeach(_dep)
+ endif(SUBSUBSYS_DEPS)
+ if(SUBSUBSYS_EXT_DEPS)
+ foreach(_dep ${SUBSUBSYS_EXT_DEPS})
+ string(TOUPPER "${_dep}_found" EXT_DEP_FOUND)
+ if(NOT ${EXT_DEP_FOUND} OR (NOT ("${EXT_DEP_FOUND}" STREQUAL "TRUE")))
+ set(${_var} FALSE)
+ PCL_SET_SUBSYS_STATUS(${_parent}_${_name} FALSE "Requires external library ${_dep}.")
+ endif(NOT ${EXT_DEP_FOUND} OR (NOT ("${EXT_DEP_FOUND}" STREQUAL "TRUE")))
+ endforeach(_dep)
+ endif(SUBSUBSYS_EXT_DEPS)
+ endif(${_var} AND (NOT ("${subsys_status}" STREQUAL "AUTO_OFF")))
+endmacro(PCL_SUBSUBSYS_DEPEND)
###############################################################################
# Add a set of include files to install.
else(${CMAKE_VERSION} VERSION_LESS 2.8.4)
add_test(NAME ${_name} COMMAND ${_exename} ${PCL_ADD_TEST_ARGUMENTS})
endif(${CMAKE_VERSION} VERSION_LESS 2.8.4)
+
+ add_dependencies(tests ${_exename})
endmacro(PCL_ADD_TEST)
###############################################################################
###############################################################################
# Reset the subsystem status map.
macro(PCL_RESET_MAPS)
+ foreach(_ss ${PCL_SUBSYSTEMS})
+ string(TOUPPER "PCL_${_ss}_SUBSYS" PCL_SUBSYS_SUBSYS)
+ if (${PCL_SUBSYS_SUBSYS})
+ string(TOUPPER "PCL_${_ss}_SUBSYS_DESC" PCL_PARENT_SUBSYS_DESC)
+ set(${PCL_SUBSYS_SUBSYS_DESC} "" CACHE INTERNAL "" FORCE)
+ set(${PCL_SUBSYS_SUBSYS} "" CACHE INTERNAL "" FORCE)
+ endif (${PCL_SUBSYS_SUBSYS})
+ endforeach(_ss)
+
set(PCL_SUBSYS_HYPERSTATUS "" CACHE INTERNAL
"To Build Or Not To Build, That Is The Question." FORCE)
set(PCL_SUBSYS_STATUS "" CACHE INTERNAL
SET_IN_GLOBAL_MAP(PCL_SUBSYS_DESC ${_name} ${_desc})
endmacro(PCL_ADD_SUBSYSTEM)
+###############################################################################
+# Register a subsubsystem.
+# _name Subsystem name.
+# _desc Description of the subsystem
+macro(PCL_ADD_SUBSUBSYSTEM _parent _name _desc)
+ string(TOUPPER "PCL_${_parent}_SUBSYS" PCL_PARENT_SUBSYS)
+ string(TOUPPER "PCL_${_parent}_SUBSYS_DESC" PCL_PARENT_SUBSYS_DESC)
+ set(_temp ${${PCL_PARENT_SUBSYS}})
+ list(APPEND _temp ${_name})
+ set(${PCL_PARENT_SUBSYS} ${_temp} CACHE INTERNAL "Internal list of ${_parenr} subsystems"
+ FORCE)
+ set_in_global_map(${PCL_PARENT_SUBSYS_DESC} ${_name} ${_desc})
+endmacro(PCL_ADD_SUBSUBSYSTEM)
+
###############################################################################
# Set the status of a subsystem.
SET_IN_GLOBAL_MAP(PCL_SUBSYS_REASONS ${_name} ${_reason})
endmacro(PCL_SET_SUBSYS_STATUS)
+###############################################################################
+# Set the status of a subsystem.
+# _name Subsystem name.
+# _status TRUE if being built, FALSE otherwise.
+# ARGN[0] Reason for not building.
+macro(PCL_SET_SUBSUBSYS_STATUS _parent _name _status)
+ if(${ARGC} EQUAL 4)
+ set(_reason ${ARGV2})
+ else(${ARGC} EQUAL 4)
+ set(_reason "No reason")
+ endif(${ARGC} EQUAL 4)
+ SET_IN_GLOBAL_MAP(PCL_SUBSYS_STATUS ${_parent}_${_name} ${_status})
+ SET_IN_GLOBAL_MAP(PCL_SUBSYS_REASONS ${_parent}_${_name} ${_reason})
+endmacro(PCL_SET_SUBSUBSYS_STATUS)
+
+
###############################################################################
# Get the status of a subsystem
# _var Destination variable.
GET_IN_MAP(${_var} PCL_SUBSYS_STATUS ${_name})
endmacro(PCL_GET_SUBSYS_STATUS)
+###############################################################################
+# Get the status of a subsystem
+# _var Destination variable.
+# _name Name of the subsystem.
+macro(PCL_GET_SUBSUBSYS_STATUS _var _parent _name)
+ GET_IN_MAP(${_var} PCL_SUBSYS_STATUS ${_parent}_${_name})
+endmacro(PCL_GET_SUBSUBSYS_STATUS)
+
+
###############################################################################
# Set the hyperstatus of a subsystem and its dependee
# _name Subsystem name.
foreach(_ss ${PCL_SUBSYSTEMS})
PCL_GET_SUBSYS_STATUS(_status ${_ss})
if(_status)
- message(STATUS " ${_ss}")
+ set(message_text " ${_ss}")
+ string(TOUPPER "PCL_${_ss}_SUBSYS" PCL_SUBSYS_SUBSYS)
+ if (${PCL_SUBSYS_SUBSYS})
+ set(will_build)
+ foreach(_sub ${${PCL_SUBSYS_SUBSYS}})
+ PCL_GET_SUBSYS_STATUS(_sub_status ${_ss}_${_sub})
+ if (_sub_status)
+ set(will_build "${will_build}\n |_ ${_sub}")
+ endif (_sub_status)
+ endforeach(_sub)
+ if (NOT ("${will_build}" STREQUAL ""))
+ set(message_text "${message_text}\n building: ${will_build}")
+ endif (NOT ("${will_build}" STREQUAL ""))
+ set(wont_build)
+ foreach(_sub ${${PCL_SUBSYS_SUBSYS}})
+ PCL_GET_SUBSYS_STATUS(_sub_status ${_ss}_${_sub})
+ PCL_GET_SUBSYS_HYPERSTATUS(_sub_hyper_status ${_ss}_${sub})
+ if (NOT _sub_status OR ("${_sub_hyper_status}" STREQUAL "AUTO_OFF"))
+ GET_IN_MAP(_reason PCL_SUBSYS_REASONS ${_ss}_${_sub})
+ set(wont_build "${wont_build}\n |_ ${_sub}: ${_reason}")
+ endif (NOT _sub_status OR ("${_sub_hyper_status}" STREQUAL "AUTO_OFF"))
+ endforeach(_sub)
+ if (NOT ("${wont_build}" STREQUAL ""))
+ set(message_text "${message_text}\n not building: ${wont_build}")
+ endif (NOT ("${wont_build}" STREQUAL ""))
+ endif (${PCL_SUBSYS_SUBSYS})
+ message(STATUS "${message_text}")
endif(_status)
endforeach(_ss)
# exception_list OPTIONAL and contains list of subdirectories not to account
macro(collect_subproject_directory_names dirname filename names dirs)
file(GLOB globbed RELATIVE "${dirname}" "${dirname}/*/${filename}")
- if(${ARGC} GREATER 3)
+ if(${ARGC} GREATER 4)
set(exclusion_list ${ARGN})
foreach(file ${globbed})
get_filename_component(dir ${file} PATH)
set(${dirs} ${${dirs}} ${dir})
endif(excluded EQUAL -1)
endforeach()
- else(${ARGC} GREATER 3)
+ else(${ARGC} GREATER 4)
foreach(file ${globbed})
get_filename_component(dir ${file} PATH)
set(${dirs} ${${dirs}} ${dir})
endforeach(file)
- endif(${ARGC} GREATER 3)
+ endif(${ARGC} GREATER 4)
foreach(subdir ${${dirs}})
- file(STRINGS ${dirname}/${subdir}/CMakeLists.txt name REGEX "set.*SUBSYS_NAME .*\\)$")
- string(REGEX REPLACE "set.*SUBSYS_NAME" "" name "${name}")
- string(REPLACE ")" "" name "${name}")
- string(STRIP "${name}" name)
-# message(STATUS "setting ${subdir} component name to ${name}")
+ file(STRINGS ${dirname}/${subdir}/CMakeLists.txt name REGEX "[setSET ]+\\(.*SUBSYS_NAME .*\\)$")
+ string(REGEX REPLACE "[setSET ]+\\(.*SUBSYS_NAME[ ]+([A-Za-z0-9_]+)[ ]*\\)" "\\1" name "${name}")
set(${names} ${${names}} ${name})
file(STRINGS ${dirname}/${subdir}/CMakeLists.txt DEPENDENCIES REGEX "set.*SUBSYS_DEPS .*\\)")
string(REGEX REPLACE "set.*SUBSYS_DEPS" "" DEPENDENCIES "${DEPENDENCIES}")
endforeach(_item)
endmacro(PREFIX_LIST)
+###############################################################################
+# Remove vtk definitions
+# This is used for CUDA targets, because nvcc does not like VTK 6+ definitions
+# style.
+macro(REMOVE_VTK_DEFINITIONS)
+ get_directory_property(_dir_defs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS)
+ set(_vtk_definitions)
+ foreach(_item ${_dir_defs})
+ if(_item MATCHES "vtk*")
+ list(APPEND _vtk_definitions -D${_item})
+ endif()
+ endforeach()
+ remove_definitions(${_vtk_definitions})
+endmacro(REMOVE_VTK_DEFINITIONS)
###############################################################################
# Pull the component parts out of the version number.
if (NOT DEFINED LIB_INSTALL_DIR)
set(LIB_INSTALL_DIR "lib")
endif (NOT DEFINED LIB_INSTALL_DIR)
- set(INCLUDE_INSTALL_ROOT
- "include/${PROJECT_NAME_LOWER}-${PCL_MAJOR_VERSION}.${PCL_MINOR_VERSION}")
+ if(NOT ANDROID)
+ set(INCLUDE_INSTALL_ROOT
+ "include/${PROJECT_NAME_LOWER}-${PCL_MAJOR_VERSION}.${PCL_MINOR_VERSION}")
+ else(NOT ANDROID)
+ set(INCLUDE_INSTALL_ROOT "include") # Android, don't put into subdir
+ endif(NOT ANDROID)
set(INCLUDE_INSTALL_DIR "${INCLUDE_INSTALL_ROOT}/pcl")
set(DOC_INSTALL_DIR "share/doc/${PROJECT_NAME_LOWER}-${PCL_MAJOR_VERSION}.${PCL_MINOR_VERSION}")
set(BIN_INSTALL_DIR "bin")
file(READ "@PROJECT_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
- message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
if(EXISTS "$ENV{DESTDIR}${file}" OR IS_SYMLINK "$ENV{DESTDIR}${file}")
exec_program("@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
"Directory \"@CMAKE_INSTALL_PREFIX@/@PCLCONFIG_INSTALL_DIR@\" does not exist.")
endif(EXISTS "@CMAKE_INSTALL_PREFIX@/@PCLCONFIG_INSTALL_DIR@")
-# remove pcl directory in share (removes all files in it!)
-# created by CMakeLists.txt for PCLConfig.cmake
-message(STATUS "Uninstalling \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\"")
-if(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
- exec_program("@CMAKE_COMMAND@"
- ARGS "-E remove_directory \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\""
- OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval)
- if(NOT "${rm_retval}" STREQUAL 0)
- message(FATAL_ERROR
- "Problem when removing \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\"")
- endif(NOT "${rm_retval}" STREQUAL 0)
-else(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
- message(STATUS
- "Directory \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\" does not exist.")
-endif(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
+# remove pcl directory in share/doc (removes all files in it!)
+if(@WITH_DOCS@)
+ message(STATUS "Uninstalling \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\"")
+ if(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
+ exec_program("@CMAKE_COMMAND@"
+ ARGS "-E remove_directory \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\""
+ OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval)
+ if(NOT "${rm_retval}" STREQUAL 0)
+ message(FATAL_ERROR
+ "Problem when removing \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\"")
+ endif(NOT "${rm_retval}" STREQUAL 0)
+ else(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
+ message(STATUS
+ "Directory \"@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@\" does not exist.")
+ endif(EXISTS "@CMAKE_INSTALL_PREFIX@/@DOC_INSTALL_DIR@")
+endif()
set(SUBSYS_DEPS)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS eigen boost)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS eigen boost)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(range_image_incs
+ include/pcl/range_image/bearing_angle_image.h
include/pcl/range_image/range_image.h
include/pcl/range_image/range_image_planar.h
include/pcl/range_image/range_image_spherical.h
)
set(range_image_srcs
+ src/bearing_angle_image.cpp
src/range_image.cpp
src/range_image_planar.cpp
)
src/common.cpp
src/correspondence.cpp
src/distances.cpp
- src/intersections.cpp
src/parse.cpp
src/poses_from_matches.cpp
src/print.cpp
include/pcl/point_traits.h
include/pcl/point_types_conversion.h
include/pcl/point_representation.h
- include/pcl/correspondence.h
include/pcl/point_types.h
include/pcl/for_each_type.h
include/pcl/pcl_tests.h
include/pcl/common/common_headers.h
include/pcl/common/distances.h
include/pcl/common/eigen.h
+ include/pcl/common/copy_point.h
include/pcl/common/io.h
include/pcl/common/file_io.h
include/pcl/common/intersections.h
include/pcl/common/impl/centroid.hpp
include/pcl/common/impl/common.hpp
include/pcl/common/impl/eigen.hpp
+ include/pcl/common/impl/intersections.hpp
+ include/pcl/common/impl/copy_point.hpp
include/pcl/common/impl/io.hpp
include/pcl/common/impl/file_io.hpp
include/pcl/common/impl/norms.hpp
include/pcl/common/impl/random.hpp
include/pcl/common/impl/generate.hpp
include/pcl/common/impl/projection_matrix.hpp
+ include/pcl/common/impl/accumulators.hpp
)
set(impl_incs
src/fft/kiss_fft.c
src/fft/kiss_fftr.c)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${kissfft_srcs} ${incs} ${common_incs} ${impl_incs} ${ros_incs} ${tools_incs} ${kissfft_incs} ${common_incs_impl} ${range_image_incs} ${range_image_incs_impl})
- #PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${common_incs} ${impl_incs} ${ros_incs} ${tools_incs} ${common_incs_impl} ${range_image_incs} ${range_image_incs_impl})
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" ""
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${kissfft_srcs} ${incs} ${common_incs} ${impl_incs} ${ros_incs} ${tools_incs} ${kissfft_incs} ${common_incs_impl} ${range_image_incs} ${range_image_incs_impl})
+ #PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${common_incs} ${impl_incs} ${ros_incs} ${tools_incs} ${common_incs_impl} ${range_image_incs} ${range_image_incs_impl})
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "" ""
"" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} "" ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} common ${common_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} common/fft ${kissfft_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} common/impl ${common_incs_impl})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} impl ${impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ros ${ros_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} console ${tools_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} range_image ${range_image_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} range_image/impl ${range_image_incs_impl})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" common ${common_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" common/fft ${kissfft_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" common/impl ${common_incs_impl})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" ros ${ros_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" console ${tools_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" range_image ${range_image_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" range_image/impl ${range_image_incs_impl})
endif(build)
PCLHeader (): seq (0), stamp (), frame_id ()
{}
+ /** \brief Sequence number */
pcl::uint32_t seq;
+ /** \brief A timestamp associated with the time when the data was acquired
+ *
+ * The value represents microseconds since 1970-01-01 00:00:00 (the UNIX epoch).
+ */
pcl::uint64_t stamp;
-
+ /** \brief Coordinate frame ID */
std::string frame_id;
typedef boost::shared_ptr<PCLHeader> Ptr;
* \param[out] centroid the output centroid
* \return number of valid point used to determine the centroid. In case of dense point clouds, this is the same as the size of input cloud.
* \note if return value is 0, the centroid is not changed, thus not valid.
+ * The last compononent of the vector is set to 1, this allow to transform the centroid vector with 4x4 matrices.
* \ingroup common
*/
template <typename PointT, typename Scalar> inline unsigned int
* \param[out] centroid the output centroid
* \return number of valid point used to determine the centroid. In case of dense point clouds, this is the same as the size of input cloud.
* \note if return value is 0, the centroid is not changed, thus not valid.
+ * The last compononent of the vector is set to 1, this allow to transform the centroid vector with 4x4 matrices.
* \ingroup common
*/
template <typename PointT, typename Scalar> inline unsigned int
* \param[out] centroid the output centroid
* \return number of valid point used to determine the centroid. In case of dense point clouds, this is the same as the size of input cloud.
* \note if return value is 0, the centroid is not changed, thus not valid.
+ * The last compononent of the vector is set to 1, this allow to transform the centroid vector with 4x4 matrices.
* \ingroup common
*/
template <typename PointT, typename Scalar> inline unsigned int
* \param[out] centroid the output centroid
* \return number of valid point used to determine the centroid. In case of dense point clouds, this is the same as the size of input cloud.
* \note if return value is 0, the centroid is not changed, thus not valid.
+ * The last compononent of the vector is set to 1, this allow to transform the centroid vector with 4x4 matrices.
* \ingroup common
*/
template <typename PointT, typename Scalar> inline unsigned int
return (computeNDCentroid<PointT, double> (cloud, indices, centroid));
}
+}
+
+#include <pcl/common/impl/accumulators.hpp>
+
+namespace pcl
+{
+
+ /** A generic class that computes the centroid of points fed to it.
+ *
+ * Here by "centroid" we denote not just the mean of 3D point coordinates,
+ * but also mean of values in the other data fields. The general-purpose
+ * \ref computeNDCentroid() function also implements this sort of
+ * functionality, however it does it in a "dumb" way, i.e. regardless of the
+ * semantics of the data inside a field it simply averages the values. In
+ * certain cases (e.g. for \c x, \c y, \c z, \c intensity fields) this
+ * behavior is reasonable, however in other cases (e.g. \c rgb, \c rgba,
+ * \c label fields) this does not lead to meaningful results.
+ *
+ * This class is capable of computing the centroid in a "smart" way, i.e.
+ * taking into account the meaning of the data inside fields. Currently the
+ * following fields are supported:
+ *
+ * - XYZ (\c x, \c y, \c z)
+ *
+ * Separate average for each field.
+ *
+ * - Normal (\c normal_x, \c normal_y, \c normal_z)
+ *
+ * Separate average for each field, and the resulting vector is normalized.
+ *
+ * - Curvature (\c curvature)
+ *
+ * Average.
+ *
+ * - RGB/RGBA (\c rgb or \c rgba)
+ *
+ * Separate average for R, G, B, and alpha channels.
+ *
+ * - Intensity (\c intensity)
+ *
+ * Average.
+ *
+ * - Label (\c label)
+ *
+ * Majority vote. If several labels have the same largest support then the
+ * smaller label wins.
+ *
+ * The template parameter defines the type of points that may be accumulated
+ * with this class. This may be an arbitrary PCL point type, and centroid
+ * computation will happen only for the fields that are present in it and are
+ * supported.
+ *
+ * Current centroid may be retrieved at any time using get(). Note that the
+ * function is templated on point type, so it is possible to fetch the
+ * centroid into a point type that differs from the type of points that are
+ * being accumulated. All the "extra" fields for which the centroid is not
+ * being calculated will be left untouched.
+ *
+ * Example usage:
+ *
+ * \code
+ * // Create and accumulate points
+ * CentroidPoint<pcl::PointXYZ> centroid;
+ * centroid.add (pcl::PointXYZ (1, 2, 3);
+ * centroid.add (pcl::PointXYZ (5, 6, 7);
+ * // Fetch centroid using `get()`
+ * pcl::PointXYZ c1;
+ * centroid.get (c1);
+ * // The expected result is: c1.x == 3, c1.y == 4, c1.z == 5
+ * // It is also okay to use `get()` with a different point type
+ * pcl::PointXYZRGB c2;
+ * centroid.get (c2);
+ * // The expected result is: c2.x == 3, c2.y == 4, c2.z == 5,
+ * // and c2.rgb is left untouched
+ * \endcode
+ *
+ * \note Assumes that the points being inserted are valid.
+ *
+ * \note This class template can be successfully instantiated for *any*
+ * PCL point type. Of course, each of the field averages is computed only if
+ * the point type has the corresponding field.
+ *
+ * \ingroup common
+ * \author Sergey Alexandrov */
+ template <typename PointT>
+ class CentroidPoint
+ {
+
+ public:
+
+ CentroidPoint ()
+ : num_points_ (0)
+ {
+ }
+
+ /** Add a new point to the centroid computation.
+ *
+ * In this function only the accumulators and point counter are updated,
+ * actual centroid computation does not happen until get() is called. */
+ void
+ add (const PointT& point)
+ {
+ // Invoke add point on each accumulator
+ boost::fusion::for_each (accumulators_, detail::AddPoint<PointT> (point));
+ ++num_points_;
+ }
+
+ /** Retrieve the current centroid.
+ *
+ * Computation (division of accumulated values by the number of points
+ * and normalization where applicable) happens here. The result is not
+ * cached, so any subsequent call to this function will trigger
+ * re-computation.
+ *
+ * If the number of accumulated points is zero, then the point will be
+ * left untouched. */
+ template <typename PointOutT> void
+ get (PointOutT& point) const
+ {
+ if (num_points_ != 0)
+ {
+ // Filter accumulators so that only those that are compatible with
+ // both PointT and requested point type remain
+ typename pcl::detail::Accumulators<PointT, PointOutT>::type ca (accumulators_);
+ // Invoke get point on each accumulator in filtered list
+ boost::fusion::for_each (ca, detail::GetPoint<PointOutT> (point, num_points_));
+ }
+ }
+
+ /** Get the total number of points that were added. */
+ size_t
+ getSize () const
+ {
+ return (num_points_);
+ }
+
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+
+ private:
+
+ size_t num_points_;
+ typename pcl::detail::Accumulators<PointT>::type accumulators_;
+
+ };
+
+ /** Compute the centroid of a set of points and return it as a point.
+ *
+ * Implementation leverages \ref CentroidPoint class and therefore behaves
+ * differently from \ref compute3DCentroid() and \ref computeNDCentroid().
+ * See \ref CentroidPoint documentation for explanation.
+ *
+ * \param[in] cloud input point cloud
+ * \param[out] centroid output centroid
+ *
+ * \return number of valid points used to determine the centroid (will be the
+ * same as the size of the cloud if it is dense)
+ *
+ * \note If return value is \c 0, then the centroid is not changed, thus is
+ * not valid.
+ *
+ * \ingroup common */
+ template <typename PointInT, typename PointOutT> size_t
+ computeCentroid (const pcl::PointCloud<PointInT>& cloud,
+ PointOutT& centroid);
+
+ /** Compute the centroid of a set of points and return it as a point.
+ * \param[in] cloud
+ * \param[in] indices point cloud indices that need to be used
+ * \param[out] centroid
+ * This is an overloaded function provided for convenience. See the
+ * documentation for computeCentroid().
+ *
+ * \ingroup common */
+ template <typename PointInT, typename PointOutT> size_t
+ computeCentroid (const pcl::PointCloud<PointInT>& cloud,
+ const std::vector<int>& indices,
+ PointOutT& centroid);
+
}
/*@}*/
#include <pcl/common/impl/centroid.hpp>
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_COMMON_COPY_POINT_H_
+#define PCL_COMMON_COPY_POINT_H_
+
+namespace pcl
+{
+
+ /** \brief Copy the fields of a source point into a target point.
+ *
+ * If the source and the target point types are the same, then a complete
+ * copy is made. Otherwise only those fields that the two point types share
+ * in common are copied.
+ *
+ * \param[in] point_in the source point
+ * \param[out] point_out the target point
+ *
+ * \ingroup common */
+ template <typename PointInT, typename PointOutT> void
+ copyPoint (const PointInT& point_in, PointOutT& point_out);
+
+}
+
+#include <pcl/common/impl/copy_point.hpp>
+
+#endif // PCL_COMMON_COPY_POINT_H_
+
#endif
#include <cmath>
+#include <pcl/ModelCoefficients.h>
#include <Eigen/StdVector>
#include <Eigen/Core>
* \param[in] c constant parameter
* \param[out] roots solutions of x^2 + b*x + c = 0
*/
- template<typename Scalar, typename Roots> inline void
- computeRoots2 (const Scalar& b, const Scalar& c, Roots& roots)
- {
- roots (0) = Scalar (0);
- Scalar d = Scalar (b * b - 4.0 * c);
- if (d < 0.0) // no real roots!!!! THIS SHOULD NOT HAPPEN!
- d = 0.0;
-
- Scalar sd = ::std::sqrt (d);
-
- roots (2) = 0.5f * (b + sd);
- roots (1) = 0.5f * (b - sd);
- }
+ template <typename Scalar, typename Roots> void
+ computeRoots2 (const Scalar &b, const Scalar &c, Roots &roots);
/** \brief computes the roots of the characteristic polynomial of the input matrix m, which are the eigenvalues
* \param[in] m input matrix
* \param[out] roots roots of the characteristic polynomial of the input matrix m, which are the eigenvalues
*/
- template<typename Matrix, typename Roots> inline void
- computeRoots (const Matrix& m, Roots& roots)
- {
- typedef typename Matrix::Scalar Scalar;
-
- // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0. The
- // eigenvalues are the roots to this equation, all guaranteed to be
- // real-valued, because the matrix is symmetric.
- Scalar c0 = m (0, 0) * m (1, 1) * m (2, 2)
- + Scalar (2) * m (0, 1) * m (0, 2) * m (1, 2)
- - m (0, 0) * m (1, 2) * m (1, 2)
- - m (1, 1) * m (0, 2) * m (0, 2)
- - m (2, 2) * m (0, 1) * m (0, 1);
- Scalar c1 = m (0, 0) * m (1, 1) -
- m (0, 1) * m (0, 1) +
- m (0, 0) * m (2, 2) -
- m (0, 2) * m (0, 2) +
- m (1, 1) * m (2, 2) -
- m (1, 2) * m (1, 2);
- Scalar c2 = m (0, 0) + m (1, 1) + m (2, 2);
-
-
- if (fabs (c0) < Eigen::NumTraits<Scalar>::epsilon ())// one root is 0 -> quadratic equation
- computeRoots2 (c2, c1, roots);
- else
- {
- const Scalar s_inv3 = Scalar (1.0 / 3.0);
- const Scalar s_sqrt3 = std::sqrt (Scalar (3.0));
- // Construct the parameters used in classifying the roots of the equation
- // and in solving the equation for the roots in closed form.
- Scalar c2_over_3 = c2*s_inv3;
- Scalar a_over_3 = (c1 - c2 * c2_over_3) * s_inv3;
- if (a_over_3 > Scalar (0))
- a_over_3 = Scalar (0);
-
- Scalar half_b = Scalar (0.5) * (c0 + c2_over_3 * (Scalar (2) * c2_over_3 * c2_over_3 - c1));
-
- Scalar q = half_b * half_b + a_over_3 * a_over_3*a_over_3;
- if (q > Scalar (0))
- q = Scalar (0);
-
- // Compute the eigenvalues by solving for the roots of the polynomial.
- Scalar rho = std::sqrt (-a_over_3);
- Scalar theta = std::atan2 (std::sqrt (-q), half_b) * s_inv3;
- Scalar cos_theta = std::cos (theta);
- Scalar sin_theta = std::sin (theta);
- roots (0) = c2_over_3 + Scalar (2) * rho * cos_theta;
- roots (1) = c2_over_3 - rho * (cos_theta + s_sqrt3 * sin_theta);
- roots (2) = c2_over_3 - rho * (cos_theta - s_sqrt3 * sin_theta);
-
- // Sort in increasing order.
- if (roots (0) >= roots (1))
- std::swap (roots (0), roots (1));
- if (roots (1) >= roots (2))
- {
- std::swap (roots (1), roots (2));
- if (roots (0) >= roots (1))
- std::swap (roots (0), roots (1));
- }
-
- if (roots (0) <= 0) // eigenval for symetric positive semi-definite matrix can not be negative! Set it to 0
- computeRoots2 (c2, c1, roots);
- }
- }
+ template <typename Matrix, typename Roots> void
+ computeRoots (const Matrix &m, Roots &roots);
/** \brief determine the smallest eigenvalue and its corresponding eigenvector
* \param[in] mat input matrix that needs to be symmetric and positive semi definite
* \param[out] eigenvector the corresponding eigenvector to the smallest eigenvalue of the input matrix
* \ingroup common
*/
- template <typename Matrix, typename Vector> inline void
- eigen22 (const Matrix& mat, typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
- {
- // if diagonal matrix, the eigenvalues are the diagonal elements
- // and the eigenvectors are not unique, thus set to Identity
- if (fabs(mat.coeff (1)) <= std::numeric_limits<typename Matrix::Scalar>::min ())
- {
- if (mat.coeff (0) < mat.coeff (2))
- {
- eigenvalue = mat.coeff (0);
- eigenvector [0] = 1.0;
- eigenvector [1] = 0.0;
- }
- else
- {
- eigenvalue = mat.coeff (2);
- eigenvector [0] = 0.0;
- eigenvector [1] = 1.0;
- }
- return;
- }
-
- // 0.5 to optimize further calculations
- typename Matrix::Scalar trace = static_cast<typename Matrix::Scalar> (0.5) * (mat.coeff (0) + mat.coeff (3));
- typename Matrix::Scalar determinant = mat.coeff (0) * mat.coeff (3) - mat.coeff (1) * mat.coeff (1);
-
- typename Matrix::Scalar temp = trace * trace - determinant;
-
- if (temp < 0)
- temp = 0;
-
- eigenvalue = trace - ::std::sqrt (temp);
-
- eigenvector [0] = - mat.coeff (1);
- eigenvector [1] = mat.coeff (0) - eigenvalue;
- eigenvector.normalize ();
- }
+ template <typename Matrix, typename Vector> void
+ eigen22 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector);
/** \brief determine the smallest eigenvalue and its corresponding eigenvector
* \param[in] mat input matrix that needs to be symmetric and positive semi definite
* \param[out] eigenvalues the smallest eigenvalue of the input matrix
* \ingroup common
*/
- template <typename Matrix, typename Vector> inline void
- eigen22 (const Matrix& mat, Matrix& eigenvectors, Vector& eigenvalues)
- {
- // if diagonal matrix, the eigenvalues are the diagonal elements
- // and the eigenvectors are not unique, thus set to Identity
- if (fabs(mat.coeff (1)) <= std::numeric_limits<typename Matrix::Scalar>::min ())
- {
- if (mat.coeff (0) < mat.coeff (3))
- {
- eigenvalues.coeffRef (0) = mat.coeff (0);
- eigenvalues.coeffRef (1) = mat.coeff (3);
- eigenvectors.coeffRef (0) = 1.0;
- eigenvectors.coeffRef (1) = 0.0;
- eigenvectors.coeffRef (2) = 0.0;
- eigenvectors.coeffRef (3) = 1.0;
- }
- else
- {
- eigenvalues.coeffRef (0) = mat.coeff (3);
- eigenvalues.coeffRef (1) = mat.coeff (0);
- eigenvectors.coeffRef (0) = 0.0;
- eigenvectors.coeffRef (1) = 1.0;
- eigenvectors.coeffRef (2) = 1.0;
- eigenvectors.coeffRef (3) = 0.0;
- }
- return;
- }
-
- // 0.5 to optimize further calculations
- typename Matrix::Scalar trace = static_cast<typename Matrix::Scalar> (0.5) * (mat.coeff (0) + mat.coeff (3));
- typename Matrix::Scalar determinant = mat.coeff (0) * mat.coeff (3) - mat.coeff (1) * mat.coeff (1);
-
- typename Matrix::Scalar temp = trace * trace - determinant;
-
- if (temp < 0)
- temp = 0;
- else
- temp = ::std::sqrt (temp);
-
- eigenvalues.coeffRef (0) = trace - temp;
- eigenvalues.coeffRef (1) = trace + temp;
-
- // either this is in a row or column depending on RowMajor or ColumnMajor
- eigenvectors.coeffRef (0) = - mat.coeff (1);
- eigenvectors.coeffRef (2) = mat.coeff (0) - eigenvalues.coeff (0);
- typename Matrix::Scalar norm = static_cast<typename Matrix::Scalar> (1.0) /
- static_cast<typename Matrix::Scalar> (::std::sqrt (eigenvectors.coeffRef (0) * eigenvectors.coeffRef (0) + eigenvectors.coeffRef (2) * eigenvectors.coeffRef (2)));
- eigenvectors.coeffRef (0) *= norm;
- eigenvectors.coeffRef (2) *= norm;
- eigenvectors.coeffRef (1) = eigenvectors.coeffRef (2);
- eigenvectors.coeffRef (3) = -eigenvectors.coeffRef (0);
- }
+ template <typename Matrix, typename Vector> void
+ eigen22 (const Matrix &mat, Matrix &eigenvectors, Vector &eigenvalues);
/** \brief determines the corresponding eigenvector to the given eigenvalue of the symmetric positive semi definite input matrix
* \param[in] mat symmetric positive semi definite input matrix
* \param[out] eigenvector the corresponding eigenvector for the input eigenvalue
* \ingroup common
*/
- template<typename Matrix, typename Vector> inline void
- computeCorrespondingEigenVector (const Matrix& mat, const typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
- {
- typedef typename Matrix::Scalar Scalar;
- // Scale the matrix so its entries are in [-1,1]. The scaling is applied
- // only when at least one matrix entry has magnitude larger than 1.
-
- Scalar scale = mat.cwiseAbs ().maxCoeff ();
- if (scale <= std::numeric_limits<Scalar>::min ())
- scale = Scalar (1.0);
-
- Matrix scaledMat = mat / scale;
-
- scaledMat.diagonal ().array () -= eigenvalue / scale;
-
- Vector vec1 = scaledMat.row (0).cross (scaledMat.row (1));
- Vector vec2 = scaledMat.row (0).cross (scaledMat.row (2));
- Vector vec3 = scaledMat.row (1).cross (scaledMat.row (2));
-
- Scalar len1 = vec1.squaredNorm ();
- Scalar len2 = vec2.squaredNorm ();
- Scalar len3 = vec3.squaredNorm ();
-
- if (len1 >= len2 && len1 >= len3)
- eigenvector = vec1 / std::sqrt (len1);
- else if (len2 >= len1 && len2 >= len3)
- eigenvector = vec2 / std::sqrt (len2);
- else
- eigenvector = vec3 / std::sqrt (len3);
- }
+ template <typename Matrix, typename Vector> void
+ computeCorrespondingEigenVector (const Matrix &mat, const typename Matrix::Scalar &eigenvalue, Vector &eigenvector);
/** \brief determines the eigenvector and eigenvalue of the smallest eigenvalue of the symmetric positive semi definite input matrix
* \param[in] mat symmetric positive semi definite input matrix
* \note if the smallest eigenvalue is not unique, this function may return any eigenvector that is consistent to the eigenvalue.
* \ingroup common
*/
- template<typename Matrix, typename Vector> inline void
- eigen33 (const Matrix& mat, typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
- {
- typedef typename Matrix::Scalar Scalar;
- // Scale the matrix so its entries are in [-1,1]. The scaling is applied
- // only when at least one matrix entry has magnitude larger than 1.
-
- Scalar scale = mat.cwiseAbs ().maxCoeff ();
- if (scale <= std::numeric_limits<Scalar>::min ())
- scale = Scalar (1.0);
-
- Matrix scaledMat = mat / scale;
-
- Vector eigenvalues;
- computeRoots (scaledMat, eigenvalues);
-
- eigenvalue = eigenvalues (0) * scale;
-
- scaledMat.diagonal ().array () -= eigenvalues (0);
-
- Vector vec1 = scaledMat.row (0).cross (scaledMat.row (1));
- Vector vec2 = scaledMat.row (0).cross (scaledMat.row (2));
- Vector vec3 = scaledMat.row (1).cross (scaledMat.row (2));
-
- Scalar len1 = vec1.squaredNorm ();
- Scalar len2 = vec2.squaredNorm ();
- Scalar len3 = vec3.squaredNorm ();
-
- if (len1 >= len2 && len1 >= len3)
- eigenvector = vec1 / std::sqrt (len1);
- else if (len2 >= len1 && len2 >= len3)
- eigenvector = vec2 / std::sqrt (len2);
- else
- eigenvector = vec3 / std::sqrt (len3);
- }
+ template <typename Matrix, typename Vector> void
+ eigen33 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector);
/** \brief determines the eigenvalues of the symmetric positive semi definite input matrix
* \param[in] mat symmetric positive semi definite input matrix
* \param[out] evals resulting eigenvalues in ascending order
* \ingroup common
*/
- template<typename Matrix, typename Vector> inline void
- eigen33 (const Matrix& mat, Vector& evals)
- {
- typedef typename Matrix::Scalar Scalar;
- Scalar scale = mat.cwiseAbs ().maxCoeff ();
- if (scale <= std::numeric_limits<Scalar>::min ())
- scale = Scalar (1.0);
-
- Matrix scaledMat = mat / scale;
- computeRoots (scaledMat, evals);
- evals *= scale;
- }
+ template <typename Matrix, typename Vector> void
+ eigen33 (const Matrix &mat, Vector &evals);
/** \brief determines the eigenvalues and corresponding eigenvectors of the symmetric positive semi definite input matrix
* \param[in] mat symmetric positive semi definite input matrix
* \param[out] evals corresponding eigenvectors in correct order according to eigenvalues
* \ingroup common
*/
- template<typename Matrix, typename Vector> inline void
- eigen33 (const Matrix& mat, Matrix& evecs, Vector& evals)
- {
- typedef typename Matrix::Scalar Scalar;
- // Scale the matrix so its entries are in [-1,1]. The scaling is applied
- // only when at least one matrix entry has magnitude larger than 1.
-
- Scalar scale = mat.cwiseAbs ().maxCoeff ();
- if (scale <= std::numeric_limits<Scalar>::min ())
- scale = Scalar (1.0);
-
- Matrix scaledMat = mat / scale;
-
- // Compute the eigenvalues
- computeRoots (scaledMat, evals);
-
- if ((evals (2) - evals (0)) <= Eigen::NumTraits<Scalar>::epsilon ())
- {
- // all three equal
- evecs.setIdentity ();
- }
- else if ((evals (1) - evals (0)) <= Eigen::NumTraits<Scalar>::epsilon () )
- {
- // first and second equal
- Matrix tmp;
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (2);
-
- Vector vec1 = tmp.row (0).cross (tmp.row (1));
- Vector vec2 = tmp.row (0).cross (tmp.row (2));
- Vector vec3 = tmp.row (1).cross (tmp.row (2));
-
- Scalar len1 = vec1.squaredNorm ();
- Scalar len2 = vec2.squaredNorm ();
- Scalar len3 = vec3.squaredNorm ();
-
- if (len1 >= len2 && len1 >= len3)
- evecs.col (2) = vec1 / std::sqrt (len1);
- else if (len2 >= len1 && len2 >= len3)
- evecs.col (2) = vec2 / std::sqrt (len2);
- else
- evecs.col (2) = vec3 / std::sqrt (len3);
-
- evecs.col (1) = evecs.col (2).unitOrthogonal ();
- evecs.col (0) = evecs.col (1).cross (evecs.col (2));
- }
- else if ((evals (2) - evals (1)) <= Eigen::NumTraits<Scalar>::epsilon () )
- {
- // second and third equal
- Matrix tmp;
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (0);
-
- Vector vec1 = tmp.row (0).cross (tmp.row (1));
- Vector vec2 = tmp.row (0).cross (tmp.row (2));
- Vector vec3 = tmp.row (1).cross (tmp.row (2));
-
- Scalar len1 = vec1.squaredNorm ();
- Scalar len2 = vec2.squaredNorm ();
- Scalar len3 = vec3.squaredNorm ();
-
- if (len1 >= len2 && len1 >= len3)
- evecs.col (0) = vec1 / std::sqrt (len1);
- else if (len2 >= len1 && len2 >= len3)
- evecs.col (0) = vec2 / std::sqrt (len2);
- else
- evecs.col (0) = vec3 / std::sqrt (len3);
-
- evecs.col (1) = evecs.col (0).unitOrthogonal ();
- evecs.col (2) = evecs.col (0).cross (evecs.col (1));
- }
- else
- {
- Matrix tmp;
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (2);
-
- Vector vec1 = tmp.row (0).cross (tmp.row (1));
- Vector vec2 = tmp.row (0).cross (tmp.row (2));
- Vector vec3 = tmp.row (1).cross (tmp.row (2));
-
- Scalar len1 = vec1.squaredNorm ();
- Scalar len2 = vec2.squaredNorm ();
- Scalar len3 = vec3.squaredNorm ();
-#ifdef _WIN32
- Scalar *mmax = new Scalar[3];
-#else
- Scalar mmax[3];
-#endif
- unsigned int min_el = 2;
- unsigned int max_el = 2;
- if (len1 >= len2 && len1 >= len3)
- {
- mmax[2] = len1;
- evecs.col (2) = vec1 / std::sqrt (len1);
- }
- else if (len2 >= len1 && len2 >= len3)
- {
- mmax[2] = len2;
- evecs.col (2) = vec2 / std::sqrt (len2);
- }
- else
- {
- mmax[2] = len3;
- evecs.col (2) = vec3 / std::sqrt (len3);
- }
-
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (1);
-
- vec1 = tmp.row (0).cross (tmp.row (1));
- vec2 = tmp.row (0).cross (tmp.row (2));
- vec3 = tmp.row (1).cross (tmp.row (2));
-
- len1 = vec1.squaredNorm ();
- len2 = vec2.squaredNorm ();
- len3 = vec3.squaredNorm ();
- if (len1 >= len2 && len1 >= len3)
- {
- mmax[1] = len1;
- evecs.col (1) = vec1 / std::sqrt (len1);
- min_el = len1 <= mmax[min_el] ? 1 : min_el;
- max_el = len1 > mmax[max_el] ? 1 : max_el;
- }
- else if (len2 >= len1 && len2 >= len3)
- {
- mmax[1] = len2;
- evecs.col (1) = vec2 / std::sqrt (len2);
- min_el = len2 <= mmax[min_el] ? 1 : min_el;
- max_el = len2 > mmax[max_el] ? 1 : max_el;
- }
- else
- {
- mmax[1] = len3;
- evecs.col (1) = vec3 / std::sqrt (len3);
- min_el = len3 <= mmax[min_el] ? 1 : min_el;
- max_el = len3 > mmax[max_el] ? 1 : max_el;
- }
-
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (0);
-
- vec1 = tmp.row (0).cross (tmp.row (1));
- vec2 = tmp.row (0).cross (tmp.row (2));
- vec3 = tmp.row (1).cross (tmp.row (2));
-
- len1 = vec1.squaredNorm ();
- len2 = vec2.squaredNorm ();
- len3 = vec3.squaredNorm ();
- if (len1 >= len2 && len1 >= len3)
- {
- mmax[0] = len1;
- evecs.col (0) = vec1 / std::sqrt (len1);
- min_el = len3 <= mmax[min_el] ? 0 : min_el;
- max_el = len3 > mmax[max_el] ? 0 : max_el;
- }
- else if (len2 >= len1 && len2 >= len3)
- {
- mmax[0] = len2;
- evecs.col (0) = vec2 / std::sqrt (len2);
- min_el = len3 <= mmax[min_el] ? 0 : min_el;
- max_el = len3 > mmax[max_el] ? 0 : max_el;
- }
- else
- {
- mmax[0] = len3;
- evecs.col (0) = vec3 / std::sqrt (len3);
- min_el = len3 <= mmax[min_el] ? 0 : min_el;
- max_el = len3 > mmax[max_el] ? 0 : max_el;
- }
-
- unsigned mid_el = 3 - min_el - max_el;
- evecs.col (min_el) = evecs.col ((min_el + 1) % 3).cross ( evecs.col ((min_el + 2) % 3) ).normalized ();
- evecs.col (mid_el) = evecs.col ((mid_el + 1) % 3).cross ( evecs.col ((mid_el + 2) % 3) ).normalized ();
-#ifdef _WIN32
- delete [] mmax;
-#endif
- }
- // Rescale back to the original size.
- evals *= scale;
- }
+ template <typename Matrix, typename Vector> void
+ eigen33 (const Matrix &mat, Matrix &evecs, Vector &evals);
/** \brief Calculate the inverse of a 2x2 matrix
* \param[in] matrix matrix to be inverted
* \return determinant of the original matrix => if 0 no inverse exists => result is invalid
* \ingroup common
*/
- template<typename Matrix> inline typename Matrix::Scalar
- invert2x2 (const Matrix& matrix, Matrix& inverse)
- {
- typedef typename Matrix::Scalar Scalar;
- Scalar det = matrix.coeff (0) * matrix.coeff (3) - matrix.coeff (1) * matrix.coeff (2) ;
-
- if (det != 0)
- {
- //Scalar inv_det = Scalar (1.0) / det;
- inverse.coeffRef (0) = matrix.coeff (3);
- inverse.coeffRef (1) = - matrix.coeff (1);
- inverse.coeffRef (2) = - matrix.coeff (2);
- inverse.coeffRef (3) = matrix.coeff (0);
- inverse /= det;
- }
- return det;
- }
+ template <typename Matrix> typename Matrix::Scalar
+ invert2x2 (const Matrix &matrix, Matrix &inverse);
/** \brief Calculate the inverse of a 3x3 symmetric matrix.
* \param[in] matrix matrix to be inverted
* \return determinant of the original matrix => if 0 no inverse exists => result is invalid
* \ingroup common
*/
- template<typename Matrix> inline typename Matrix::Scalar
- invert3x3SymMatrix (const Matrix& matrix, Matrix& inverse)
- {
- typedef typename Matrix::Scalar Scalar;
- // elements
- // a b c
- // b d e
- // c e f
- //| a b c |-1 | fd-ee ce-bf be-cd |
- //| b d e | = 1/det * | ce-bf af-cc bc-ae |
- //| c e f | | be-cd bc-ae ad-bb |
-
- //det = a(fd-ee) + b(ec-fb) + c(eb-dc)
-
- Scalar fd_ee = matrix.coeff (4) * matrix.coeff (8) - matrix.coeff (7) * matrix.coeff (5);
- Scalar ce_bf = matrix.coeff (2) * matrix.coeff (5) - matrix.coeff (1) * matrix.coeff (8);
- Scalar be_cd = matrix.coeff (1) * matrix.coeff (5) - matrix.coeff (2) * matrix.coeff (4);
-
- Scalar det = matrix.coeff (0) * fd_ee + matrix.coeff (1) * ce_bf + matrix.coeff (2) * be_cd;
-
- if (det != 0)
- {
- //Scalar inv_det = Scalar (1.0) / det;
- inverse.coeffRef (0) = fd_ee;
- inverse.coeffRef (1) = inverse.coeffRef (3) = ce_bf;
- inverse.coeffRef (2) = inverse.coeffRef (6) = be_cd;
- inverse.coeffRef (4) = (matrix.coeff (0) * matrix.coeff (8) - matrix.coeff (2) * matrix.coeff (2));
- inverse.coeffRef (5) = inverse.coeffRef (7) = (matrix.coeff (1) * matrix.coeff (2) - matrix.coeff (0) * matrix.coeff (5));
- inverse.coeffRef (8) = (matrix.coeff (0) * matrix.coeff (4) - matrix.coeff (1) * matrix.coeff (1));
- inverse /= det;
- }
- return det;
- }
+ template <typename Matrix> typename Matrix::Scalar
+ invert3x3SymMatrix (const Matrix &matrix, Matrix &inverse);
/** \brief Calculate the inverse of a general 3x3 matrix.
* \param[in] matrix matrix to be inverted
* \return determinant of the original matrix => if 0 no inverse exists => result is invalid
* \ingroup common
*/
- template<typename Matrix> inline typename Matrix::Scalar
- invert3x3Matrix (const Matrix& matrix, Matrix& inverse)
- {
- typedef typename Matrix::Scalar Scalar;
-
- //| a b c |-1 | ie-hf hc-ib fb-ec |
- //| d e f | = 1/det * | gf-id ia-gc dc-fa |
- //| g h i | | hd-ge gb-ha ea-db |
- //det = a(ie-hf) + d(hc-ib) + g(fb-ec)
-
- Scalar ie_hf = matrix.coeff (8) * matrix.coeff (4) - matrix.coeff (7) * matrix.coeff (5);
- Scalar hc_ib = matrix.coeff (7) * matrix.coeff (2) - matrix.coeff (8) * matrix.coeff (1);
- Scalar fb_ec = matrix.coeff (5) * matrix.coeff (1) - matrix.coeff (4) * matrix.coeff (2);
- Scalar det = matrix.coeff (0) * (ie_hf) + matrix.coeff (3) * (hc_ib) + matrix.coeff (6) * (fb_ec) ;
-
- if (det != 0)
- {
- inverse.coeffRef (0) = ie_hf;
- inverse.coeffRef (1) = hc_ib;
- inverse.coeffRef (2) = fb_ec;
- inverse.coeffRef (3) = matrix.coeff (6) * matrix.coeff (5) - matrix.coeff (8) * matrix.coeff (3);
- inverse.coeffRef (4) = matrix.coeff (8) * matrix.coeff (0) - matrix.coeff (6) * matrix.coeff (2);
- inverse.coeffRef (5) = matrix.coeff (3) * matrix.coeff (2) - matrix.coeff (5) * matrix.coeff (0);
- inverse.coeffRef (6) = matrix.coeff (7) * matrix.coeff (3) - matrix.coeff (6) * matrix.coeff (4);
- inverse.coeffRef (7) = matrix.coeff (6) * matrix.coeff (1) - matrix.coeff (7) * matrix.coeff (0);
- inverse.coeffRef (8) = matrix.coeff (4) * matrix.coeff (0) - matrix.coeff (3) * matrix.coeff (1);
-
- inverse /= det;
- }
- return det;
- }
+ template <typename Matrix> typename Matrix::Scalar
+ invert3x3Matrix (const Matrix &matrix, Matrix &inverse);
- template<typename Matrix> inline typename Matrix::Scalar
- determinant3x3Matrix (const Matrix& matrix)
- {
- // result is independent of Row/Col Major storage!
- return matrix.coeff (0) * (matrix.coeff (4) * matrix.coeff (8) - matrix.coeff (5) * matrix.coeff (7)) +
- matrix.coeff (1) * (matrix.coeff (5) * matrix.coeff (6) - matrix.coeff (3) * matrix.coeff (8)) +
- matrix.coeff (2) * (matrix.coeff (3) * matrix.coeff (7) - matrix.coeff (4) * matrix.coeff (6)) ;
- }
+ /** \brief Calculate the determinant of a 3x3 matrix.
+ * \param[in] matrix matrix
+ * \return determinant of the matrix
+ * \ingroup common
+ */
+ template <typename Matrix> typename Matrix::Scalar
+ determinant3x3Matrix (const Matrix &matrix);
/** \brief Get the unique 3D rotation that will rotate \a z_axis into (0,0,1) and \a y_direction into a vector
* with x=0 (or into (0,1,0) should \a y_direction be orthogonal to \a z_axis)
* \param[in] yaw the resulting yaw angle
* \ingroup common
*/
+ template <typename Scalar> void
+ getEulerAngles (const Eigen::Transform<Scalar, 3, Eigen::Affine> &t, Scalar &roll, Scalar &pitch, Scalar &yaw);
+
+ inline void
+ getEulerAngles (const Eigen::Affine3f &t, float &roll, float &pitch, float &yaw)
+ {
+ getEulerAngles<float> (t, roll, pitch, yaw);
+ }
+
inline void
- getEulerAngles (const Eigen::Affine3f& t, float& roll, float& pitch, float& yaw);
+ getEulerAngles (const Eigen::Affine3d &t, double &roll, double &pitch, double &yaw)
+ {
+ getEulerAngles<double> (t, roll, pitch, yaw);
+ }
/** Extract x,y,z and the Euler angles (XYZ-convention) from the given transformation
* \param[in] t the input transformation matrix
* \param[out] yaw the resulting yaw angle
* \ingroup common
*/
+ template <typename Scalar> void
+ getTranslationAndEulerAngles (const Eigen::Transform<Scalar, 3, Eigen::Affine> &t,
+ Scalar &x, Scalar &y, Scalar &z,
+ Scalar &roll, Scalar &pitch, Scalar &yaw);
+
+ inline void
+ getTranslationAndEulerAngles (const Eigen::Affine3f &t,
+ float &x, float &y, float &z,
+ float &roll, float &pitch, float &yaw)
+ {
+ getTranslationAndEulerAngles<float> (t, x, y, z, roll, pitch, yaw);
+ }
+
inline void
- getTranslationAndEulerAngles (const Eigen::Affine3f& t,
- float& x, float& y, float& z,
- float& roll, float& pitch, float& yaw);
+ getTranslationAndEulerAngles (const Eigen::Affine3d &t,
+ double &x, double &y, double &z,
+ double &roll, double &pitch, double &yaw)
+ {
+ getTranslationAndEulerAngles<double> (t, x, y, z, roll, pitch, yaw);
+ }
/** \brief Create a transformation from the given translation and Euler angles (XYZ-convention)
* \param[in] x the input x translation
* \param[out] t the resulting transformation matrix
* \ingroup common
*/
- template <typename Scalar> inline void
+ template <typename Scalar> void
getTransformation (Scalar x, Scalar y, Scalar z, Scalar roll, Scalar pitch, Scalar yaw,
Eigen::Transform<Scalar, 3, Eigen::Affine> &t);
* \ingroup common
*/
inline Eigen::Affine3f
- getTransformation (float x, float y, float z, float roll, float pitch, float yaw);
+ getTransformation (float x, float y, float z, float roll, float pitch, float yaw)
+ {
+ Eigen::Affine3f t;
+ getTransformation<float> (x, y, z, roll, pitch, yaw, t);
+ return (t);
+ }
/** \brief Write a matrix to an output stream
* \param[in] matrix the matrix to output
template <typename Derived, typename OtherDerived>
typename Eigen::internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type
umeyama (const Eigen::MatrixBase<Derived>& src, const Eigen::MatrixBase<OtherDerived>& dst, bool with_scaling = false);
+
+/** \brief Transform a point using an affine matrix
+ * \param[in] point_in the vector to be transformed
+ * \param[out] point_out the transformed vector
+ * \param[in] transformation the transformation matrix
+ *
+ * \note Can be used with \c point_in = \c point_out
+ */
+ template<typename Scalar> inline void
+ transformPoint (const Eigen::Matrix<Scalar, 3, 1> &point_in,
+ Eigen::Matrix<Scalar, 3, 1> &point_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+ {
+ Eigen::Matrix<Scalar, 4, 1> point;
+ point << point_in, 1.0;
+ point_out = (transformation * point).template head<3> ();
+ }
+
+ inline void
+ transformPoint (const Eigen::Vector3f &point_in,
+ Eigen::Vector3f &point_out,
+ const Eigen::Affine3f &transformation)
+ {
+ transformPoint<float> (point_in, point_out, transformation);
+ }
+
+ inline void
+ transformPoint (const Eigen::Vector3d &point_in,
+ Eigen::Vector3d &point_out,
+ const Eigen::Affine3d &transformation)
+ {
+ transformPoint<double> (point_in, point_out, transformation);
+ }
+
+/** \brief Transform a vector using an affine matrix
+ * \param[in] vector_in the vector to be transformed
+ * \param[out] vector_out the transformed vector
+ * \param[in] transformation the transformation matrix
+ *
+ * \note Can be used with \c vector_in = \c vector_out
+ */
+ template <typename Scalar> inline void
+ transformVector (const Eigen::Matrix<Scalar, 3, 1> &vector_in,
+ Eigen::Matrix<Scalar, 3, 1> &vector_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+ {
+ vector_out = transformation.linear () * vector_in;
+ }
+
+ inline void
+ transformVector (const Eigen::Vector3f &vector_in,
+ Eigen::Vector3f &vector_out,
+ const Eigen::Affine3f &transformation)
+ {
+ transformVector<float> (vector_in, vector_out, transformation);
+ }
+
+ inline void
+ transformVector (const Eigen::Vector3d &vector_in,
+ Eigen::Vector3d &vector_out,
+ const Eigen::Affine3d &transformation)
+ {
+ transformVector<double> (vector_in, vector_out, transformation);
+ }
+
+/** \brief Transform a line using an affine matrix
+ * \param[in] line_in the line to be transformed
+ * \param[out] line_out the transformed line
+ * \param[in] transformation the transformation matrix
+ *
+ * Lines must be filled in this form:\n
+ * line[0-2] = Origin coordinates of the vector\n
+ * line[3-5] = Direction vector
+ *
+ * \note Can be used with \c line_in = \c line_out
+ */
+ template <typename Scalar> bool
+ transformLine (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_in,
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation);
+
+ inline bool
+ transformLine (const Eigen::VectorXf &line_in,
+ Eigen::VectorXf &line_out,
+ const Eigen::Affine3f &transformation)
+ {
+ return (transformLine<float> (line_in, line_out, transformation));
+ }
+
+ inline bool
+ transformLine (const Eigen::VectorXd &line_in,
+ Eigen::VectorXd &line_out,
+ const Eigen::Affine3d &transformation)
+ {
+ return (transformLine<double> (line_in, line_out, transformation));
+ }
+
+/** \brief Transform plane vectors using an affine matrix
+ * \param[in] plane_in the plane coefficients to be transformed
+ * \param[out] plane_out the transformed plane coefficients to fill
+ * \param[in] transformation the transformation matrix
+ *
+ * The plane vectors are filled in the form ax+by+cz+d=0
+ * Can be used with non Hessian form planes coefficients
+ * Can be used with \c plane_in = \c plane_out
+ */
+ template <typename Scalar> void
+ transformPlane (const Eigen::Matrix<Scalar, 4, 1> &plane_in,
+ Eigen::Matrix<Scalar, 4, 1> &plane_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation);
+
+ inline void
+ transformPlane (const Eigen::Matrix<double, 4, 1> &plane_in,
+ Eigen::Matrix<double, 4, 1> &plane_out,
+ const Eigen::Transform<double, 3, Eigen::Affine> &transformation)
+ {
+ transformPlane<double> (plane_in, plane_out, transformation);
+ }
+
+ inline void
+ transformPlane (const Eigen::Matrix<float, 4, 1> &plane_in,
+ Eigen::Matrix<float, 4, 1> &plane_out,
+ const Eigen::Transform<float, 3, Eigen::Affine> &transformation)
+ {
+ transformPlane<float> (plane_in, plane_out, transformation);
+ }
+
+/** \brief Transform plane vectors using an affine matrix
+ * \param[in] plane_in the plane coefficients to be transformed
+ * \param[out] plane_out the transformed plane coefficients to fill
+ * \param[in] transformation the transformation matrix
+ *
+ * The plane vectors are filled in the form ax+by+cz+d=0
+ * Can be used with non Hessian form planes coefficients
+ * Can be used with \c plane_in = \c plane_out
+ * \warning ModelCoefficients stores floats only !
+ */
+ template<typename Scalar> void
+ transformPlane (const pcl::ModelCoefficients::Ptr plane_in,
+ pcl::ModelCoefficients::Ptr plane_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation);
+
+ inline void
+ transformPlane (const pcl::ModelCoefficients::Ptr plane_in,
+ pcl::ModelCoefficients::Ptr plane_out,
+ const Eigen::Transform<double, 3, Eigen::Affine> &transformation)
+ {
+ transformPlane<double> (plane_in, plane_out, transformation);
+ }
+
+ inline void
+ transformPlane (const pcl::ModelCoefficients::Ptr plane_in,
+ pcl::ModelCoefficients::Ptr plane_out,
+ const Eigen::Transform<float, 3, Eigen::Affine> &transformation)
+ {
+ transformPlane<float> (plane_in, plane_out, transformation);
+ }
+
+/** \brief Check coordinate system integrity
+ * \param[in] line_x the first axis
+ * \param[in] line_y the second axis
+ * \param[in] norm_limit the limit to ignore norm rounding errors
+ * \param[in] dot_limit the limit to ignore dot product rounding errors
+ * \return True if the coordinate system is consistent, false otherwise.
+ *
+ * Lines must be filled in this form:\n
+ * line[0-2] = Origin coordinates of the vector\n
+ * line[3-5] = Direction vector
+ *
+ * Can be used like this :\n
+ * line_x = X axis and line_y = Y axis\n
+ * line_x = Z axis and line_y = X axis\n
+ * line_x = Y axis and line_y = Z axis\n
+ * Because X^Y = Z, Z^X = Y and Y^Z = X.
+ * Do NOT invert line order !
+ *
+ * Determine whether a coordinate system is consistent or not by checking :\n
+ * Line origins: They must be the same for the 2 lines\n
+ * Norm: The 2 lines must be normalized\n
+ * Dot products: Must be 0 or perpendicular vectors
+ */
+ template<typename Scalar> bool
+ checkCoordinateSystem (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_y,
+ const Scalar norm_limit = 1e-3,
+ const Scalar dot_limit = 1e-3);
+
+ inline bool
+ checkCoordinateSystem (const Eigen::Matrix<double, Eigen::Dynamic, 1> &line_x,
+ const Eigen::Matrix<double, Eigen::Dynamic, 1> &line_y,
+ const double norm_limit = 1e-3,
+ const double dot_limit = 1e-3)
+ {
+ return (checkCoordinateSystem<double> (line_x, line_y, norm_limit, dot_limit));
+ }
+
+ inline bool
+ checkCoordinateSystem (const Eigen::Matrix<float, Eigen::Dynamic, 1> &line_x,
+ const Eigen::Matrix<float, Eigen::Dynamic, 1> &line_y,
+ const float norm_limit = 1e-3,
+ const float dot_limit = 1e-3)
+ {
+ return (checkCoordinateSystem<float> (line_x, line_y, norm_limit, dot_limit));
+ }
+
+/** \brief Check coordinate system integrity
+ * \param[in] origin the origin of the coordinate system
+ * \param[in] x_direction the first axis
+ * \param[in] y_direction the second axis
+ * \param[in] norm_limit the limit to ignore norm rounding errors
+ * \param[in] dot_limit the limit to ignore dot product rounding errors
+ * \return True if the coordinate system is consistent, false otherwise.
+ *
+ * Read the other variant for more information
+ */
+ template <typename Scalar> inline bool
+ checkCoordinateSystem (const Eigen::Matrix<Scalar, 3, 1> &origin,
+ const Eigen::Matrix<Scalar, 3, 1> &x_direction,
+ const Eigen::Matrix<Scalar, 3, 1> &y_direction,
+ const Scalar norm_limit = 1e-3,
+ const Scalar dot_limit = 1e-3)
+ {
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> line_x;
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> line_y;
+ line_x << origin, x_direction;
+ line_y << origin, y_direction;
+ return (checkCoordinateSystem<Scalar> (line_x, line_y, norm_limit, dot_limit));
+ }
+
+ inline bool
+ checkCoordinateSystem (const Eigen::Matrix<double, 3, 1> &origin,
+ const Eigen::Matrix<double, 3, 1> &x_direction,
+ const Eigen::Matrix<double, 3, 1> &y_direction,
+ const double norm_limit = 1e-3,
+ const double dot_limit = 1e-3)
+ {
+ Eigen::Matrix<double, Eigen::Dynamic, 1> line_x;
+ Eigen::Matrix<double, Eigen::Dynamic, 1> line_y;
+ line_x.resize (6);
+ line_y.resize (6);
+ line_x << origin, x_direction;
+ line_y << origin, y_direction;
+ return (checkCoordinateSystem<double> (line_x, line_y, norm_limit, dot_limit));
+ }
+
+ inline bool
+ checkCoordinateSystem (const Eigen::Matrix<float, 3, 1> &origin,
+ const Eigen::Matrix<float, 3, 1> &x_direction,
+ const Eigen::Matrix<float, 3, 1> &y_direction,
+ const float norm_limit = 1e-3,
+ const float dot_limit = 1e-3)
+ {
+ Eigen::Matrix<float, Eigen::Dynamic, 1> line_x;
+ Eigen::Matrix<float, Eigen::Dynamic, 1> line_y;
+ line_x.resize (6);
+ line_y.resize (6);
+ line_x << origin, x_direction;
+ line_y << origin, y_direction;
+ return (checkCoordinateSystem<float> (line_x, line_y, norm_limit, dot_limit));
+ }
+
+/** \brief Compute the transformation between two coordinate systems
+ * \param[in] from_line_x X axis from the origin coordinate system
+ * \param[in] from_line_y Y axis from the origin coordinate system
+ * \param[in] to_line_x X axis from the destination coordinate system
+ * \param[in] to_line_y Y axis from the destination coordinate system
+ * \param[out] transformation the transformation matrix to fill
+ * \return true if transformation was filled, false otherwise.
+ *
+ * Line must be filled in this form:\n
+ * line[0-2] = Coordinate system origin coordinates \n
+ * line[3-5] = Direction vector (norm doesn't matter)
+ */
+ template <typename Scalar> bool
+ transformBetween2CoordinateSystems (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> from_line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> from_line_y,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> to_line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> to_line_y,
+ Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation);
+
+ inline bool
+ transformBetween2CoordinateSystems (const Eigen::Matrix<double, Eigen::Dynamic, 1> from_line_x,
+ const Eigen::Matrix<double, Eigen::Dynamic, 1> from_line_y,
+ const Eigen::Matrix<double, Eigen::Dynamic, 1> to_line_x,
+ const Eigen::Matrix<double, Eigen::Dynamic, 1> to_line_y,
+ Eigen::Transform<double, 3, Eigen::Affine> &transformation)
+ {
+ return (transformBetween2CoordinateSystems<double> (from_line_x, from_line_y, to_line_x, to_line_y, transformation));
+ }
+
+ inline bool
+ transformBetween2CoordinateSystems (const Eigen::Matrix<float, Eigen::Dynamic, 1> from_line_x,
+ const Eigen::Matrix<float, Eigen::Dynamic, 1> from_line_y,
+ const Eigen::Matrix<float, Eigen::Dynamic, 1> to_line_x,
+ const Eigen::Matrix<float, Eigen::Dynamic, 1> to_line_y,
+ Eigen::Transform<float, 3, Eigen::Affine> &transformation)
+ {
+ return (transformBetween2CoordinateSystems<float> (from_line_x, from_line_y, to_line_x, to_line_y, transformation));
+ }
+
}
#include <pcl/common/impl/eigen.hpp>
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_COMMON_IMPL_DETAIL_ACCUMULATORS_HPP
+#define PCL_COMMON_IMPL_DETAIL_ACCUMULATORS_HPP
+
+#include <map>
+
+#include <boost/mpl/filter_view.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+#include <pcl/point_types.h>
+
+namespace pcl
+{
+
+ namespace detail
+ {
+
+ /* Below are several helper accumulator structures that are used by the
+ * `CentroidPoint` class. Each of them is capable of accumulating
+ * information from a particular field(s) of a point. The points are
+ * inserted via `add()` and extracted via `get()` functions. Note that the
+ * accumulators are not templated on point type, so in principle it is
+ * possible to insert and extract points of different types. It is the
+ * responsibility of the user to make sure that points have corresponding
+ * fields. */
+
+ struct AccumulatorXYZ
+ {
+
+ // Requires that point type has x, y, and z fields
+ typedef pcl::traits::has_xyz<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ Eigen::Vector3f xyz;
+
+ AccumulatorXYZ () : xyz (Eigen::Vector3f::Zero ()) { }
+
+ template <typename PointT> void
+ add (const PointT& t) { xyz += t.getVector3fMap (); }
+
+ template <typename PointT> void
+ get (PointT& t, size_t n) const { t.getVector3fMap () = xyz / n; }
+
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+
+ };
+
+ struct AccumulatorNormal
+ {
+
+ // Requires that point type has normal_x, normal_y, and normal_z fields
+ typedef pcl::traits::has_normal<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ Eigen::Vector4f normal;
+
+ AccumulatorNormal () : normal (Eigen::Vector4f::Zero ()) { }
+
+ // Requires that the normal of the given point is normalized, otherwise it
+ // does not make sense to sum it up with the accumulated value.
+ template <typename PointT> void
+ add (const PointT& t) { normal += t.getNormalVector4fMap (); }
+
+ template <typename PointT> void
+ get (PointT& t, size_t) const
+ {
+ t.getNormalVector4fMap () = normal;
+ t.getNormalVector4fMap ().normalize ();
+ }
+
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+
+ };
+
+ struct AccumulatorCurvature
+ {
+
+ // Requires that point type has curvature field
+ typedef pcl::traits::has_curvature<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ float curvature;
+
+ AccumulatorCurvature () : curvature (0) { }
+
+ template <typename PointT> void
+ add (const PointT& t) { curvature += t.curvature; }
+
+ template <typename PointT> void
+ get (PointT& t, size_t n) const { t.curvature = curvature / n; }
+
+ };
+
+ struct AccumulatorRGBA
+ {
+
+ // Requires that point type has rgb or rgba field
+ typedef pcl::traits::has_color<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ float r, g, b, a;
+
+ AccumulatorRGBA () : r (0), g (0), b (0), a (0) { }
+
+ template <typename PointT> void
+ add (const PointT& t)
+ {
+ r += static_cast<float> (t.r);
+ g += static_cast<float> (t.g);
+ b += static_cast<float> (t.b);
+ a += static_cast<float> (t.a);
+ }
+
+ template <typename PointT> void
+ get (PointT& t, size_t n) const
+ {
+ t.rgba = static_cast<uint32_t> (a / n) << 24 |
+ static_cast<uint32_t> (r / n) << 16 |
+ static_cast<uint32_t> (g / n) << 8 |
+ static_cast<uint32_t> (b / n);
+ }
+
+ };
+
+ struct AccumulatorIntensity
+ {
+
+ // Requires that point type has intensity field
+ typedef pcl::traits::has_intensity<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ float intensity;
+
+ AccumulatorIntensity () : intensity (0) { }
+
+ template <typename PointT> void
+ add (const PointT& t) { intensity += t.intensity; }
+
+ template <typename PointT> void
+ get (PointT& t, size_t n) const { t.intensity = intensity / n; }
+
+ };
+
+ struct AccumulatorLabel
+ {
+
+ // Requires that point type has label field
+ typedef pcl::traits::has_label<boost::mpl::_1> IsCompatible;
+
+ // Storage
+ // A better performance may be achieved with a heap structure
+ std::map<uint32_t, size_t> labels;
+
+ AccumulatorLabel () { }
+
+ template <typename PointT> void
+ add (const PointT& t)
+ {
+ std::map<uint32_t, size_t>::iterator itr = labels.find (t.label);
+ if (itr == labels.end ())
+ labels.insert (std::make_pair (t.label, 1));
+ else
+ ++itr->second;
+ }
+
+ template <typename PointT> void
+ get (PointT& t, size_t) const
+ {
+ size_t max = 0;
+ std::map<uint32_t, size_t>::const_iterator itr;
+ for (itr = labels.begin (); itr != labels.end (); ++itr)
+ if (itr->second > max)
+ {
+ max = itr->second;
+ t.label = itr->first;
+ }
+ }
+
+ };
+
+ /* This is a meta-function that may be used to create a Fusion vector of
+ * those accumulator types that are compatible with given point type(s). */
+
+ template <typename Point1T, typename Point2T = Point1T>
+ struct Accumulators
+ {
+
+ // Check if a given accumulator type is compatible with a given point type
+ template <typename AccumulatorT, typename PointT>
+ struct IsCompatible : boost::mpl::apply<typename AccumulatorT::IsCompatible, PointT> { };
+
+ // A Fusion vector with accumulator types that are compatible with given
+ // point types
+ typedef
+ typename boost::fusion::result_of::as_vector<
+ typename boost::mpl::filter_view<
+ boost::mpl::vector<
+ AccumulatorXYZ
+ , AccumulatorNormal
+ , AccumulatorCurvature
+ , AccumulatorRGBA
+ , AccumulatorIntensity
+ , AccumulatorLabel
+ >
+ , boost::mpl::and_<
+ IsCompatible<boost::mpl::_1, Point1T>
+ , IsCompatible<boost::mpl::_1, Point2T>
+ >
+ >
+ >::type
+ type;
+ };
+
+ /* Fusion function object to invoke point addition on every accumulator in
+ * a fusion sequence. */
+
+ template <typename PointT>
+ struct AddPoint
+ {
+
+ const PointT& p;
+
+ AddPoint (const PointT& point) : p (point) { }
+
+ template <typename AccumulatorT> void
+ operator () (AccumulatorT& accumulator) const
+ {
+ accumulator.add (p);
+ }
+
+ };
+
+ /* Fusion function object to invoke get point on every accumulator in a
+ * fusion sequence. */
+
+ template <typename PointT>
+ struct GetPoint
+ {
+
+ PointT& p;
+ size_t n;
+
+ GetPoint (PointT& point, size_t num) : p (point), n (num) { }
+
+ template <typename AccumulatorT> void
+ operator () (AccumulatorT& accumulator) const
+ {
+ accumulator.get (p, n);
+ }
+
+ };
+
+ }
+
+}
+
+#endif /* PCL_COMMON_IMPL_DETAIL_ACCUMULATORS_HPP */
+
++cp;
++cloud_iterator;
}
- centroid[3] = 0;
centroid /= static_cast<Scalar> (cp);
+ centroid[3] = 1;
return (cp);
}
centroid[1] += cloud[i].y;
centroid[2] += cloud[i].z;
}
- centroid[3] = 0;
centroid /= static_cast<Scalar> (cloud.size ());
+ centroid[3] = 1;
return (static_cast<unsigned int> (cloud.size ()));
}
centroid[2] += cloud[i].z;
++cp;
}
- centroid[3] = 0;
centroid /= static_cast<Scalar> (cp);
+ centroid[3] = 1;
return (cp);
}
centroid[1] += cloud[indices[i]].y;
centroid[2] += cloud[indices[i]].z;
}
- centroid[3] = 0;
centroid /= static_cast<Scalar> (indices.size ());
+ centroid[3] = 1;
return (static_cast<unsigned int> (indices.size ()));
}
// NaN or Inf values could exist => check for them
centroid[2] += cloud[indices[i]].z;
++cp;
}
- centroid[3] = 0;
centroid /= static_cast<Scalar> (cp);
+ centroid[3] = 1;
return (cp);
}
}
{
//centroid.head<3> () = accu.tail<3> (); -- does not compile with Clang 3.0
centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8];
- centroid[3] = 0;
+ centroid[3] = 1;
covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
//centroid.head<3> () = vec;//= accu.tail<3> ();
//centroid.head<3> () = accu.tail<3> (); -- does not compile with Clang 3.0
centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8];
- centroid[3] = 0;
+ centroid[3] = 1;
covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
return (pcl::computeNDCentroid (cloud, indices.indices, centroid));
}
+/////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> size_t
+pcl::computeCentroid (const pcl::PointCloud<PointInT>& cloud,
+ PointOutT& centroid)
+{
+ pcl::CentroidPoint<PointInT> cp;
+
+ if (cloud.is_dense)
+ for (size_t i = 0; i < cloud.size (); ++i)
+ cp.add (cloud[i]);
+ else
+ for (size_t i = 0; i < cloud.size (); ++i)
+ if (pcl::isFinite (cloud[i]))
+ cp.add (cloud[i]);
+
+ cp.get (centroid);
+ return (cp.getSize ());
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> size_t
+pcl::computeCentroid (const pcl::PointCloud<PointInT>& cloud,
+ const std::vector<int>& indices,
+ PointOutT& centroid)
+{
+ pcl::CentroidPoint<PointInT> cp;
+
+ if (cloud.is_dense)
+ for (size_t i = 0; i < indices.size (); ++i)
+ cp.add (cloud[indices[i]]);
+ else
+ for (size_t i = 0; i < indices.size (); ++i)
+ if (pcl::isFinite (cloud[indices[i]]))
+ cp.add (cloud[indices[i]]);
+
+ cp.get (centroid);
+ return (cp.getSize ());
+}
+
#endif //#ifndef PCL_COMMON_IMPL_CENTROID_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_COMMON_IMPL_COPY_POINT_HPP_
+#define PCL_COMMON_IMPL_COPY_POINT_HPP_
+
+#include <pcl/point_types.h>
+#include <pcl/point_traits.h>
+#include <pcl/for_each_type.h>
+#include <pcl/common/concatenate.h>
+
+namespace pcl
+{
+
+ namespace detail
+ {
+
+ /* CopyPointHelper and its specializations copy the contents of a source
+ * point to a target point. There are three cases:
+ *
+ * - Points have the same type.
+ * In this case a single `memcpy` is used.
+ *
+ * - Points have different types and one of the following is true:
+ * * both have RGB fields;
+ * * both have RGBA fields;
+ * * one or both have no RGB/RGBA fields.
+ * In this case we find the list of common fields and copy their
+ * contents one by one with `NdConcatenateFunctor`.
+ *
+ * - Points have different types and one of these types has RGB field, and
+ * the other has RGBA field.
+ * In this case we also find the list of common fields and copy their
+ * contents. In order to account for the fact that RGB and RGBA do not
+ * match we have an additional `memcpy` to copy the contents of one into
+ * another.
+ *
+ * An appropriate version of CopyPointHelper is instantiated during
+ * compilation time automatically, so there is absolutely no run-time
+ * overhead. */
+
+ template <typename PointInT, typename PointOutT, typename Enable = void>
+ struct CopyPointHelper { };
+
+ template <typename PointInT, typename PointOutT>
+ struct CopyPointHelper<PointInT, PointOutT, typename boost::enable_if<boost::is_same<PointInT, PointOutT> >::type>
+ {
+ void operator () (const PointInT& point_in, PointOutT& point_out) const
+ {
+ memcpy (&point_out, &point_in, sizeof (PointInT));
+ }
+ };
+
+ template <typename PointInT, typename PointOutT>
+ struct CopyPointHelper<PointInT, PointOutT,
+ typename boost::enable_if<boost::mpl::and_<boost::mpl::not_<boost::is_same<PointInT, PointOutT> >,
+ boost::mpl::or_<boost::mpl::not_<pcl::traits::has_color<PointInT> >,
+ boost::mpl::not_<pcl::traits::has_color<PointOutT> >,
+ boost::mpl::and_<pcl::traits::has_field<PointInT, pcl::fields::rgb>,
+ pcl::traits::has_field<PointOutT, pcl::fields::rgb> >,
+ boost::mpl::and_<pcl::traits::has_field<PointInT, pcl::fields::rgba>,
+ pcl::traits::has_field<PointOutT, pcl::fields::rgba> > > > >::type>
+ {
+ void operator () (const PointInT& point_in, PointOutT& point_out) const
+ {
+ typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
+ typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
+ typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
+ pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (point_in, point_out));
+ }
+ };
+
+ template <typename PointInT, typename PointOutT>
+ struct CopyPointHelper<PointInT, PointOutT,
+ typename boost::enable_if<boost::mpl::and_<boost::mpl::not_<boost::is_same<PointInT, PointOutT> >,
+ boost::mpl::or_<boost::mpl::and_<pcl::traits::has_field<PointInT, pcl::fields::rgb>,
+ pcl::traits::has_field<PointOutT, pcl::fields::rgba> >,
+ boost::mpl::and_<pcl::traits::has_field<PointInT, pcl::fields::rgba>,
+ pcl::traits::has_field<PointOutT, pcl::fields::rgb> > > > >::type>
+ {
+ void operator () (const PointInT& point_in, PointOutT& point_out) const
+ {
+ typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
+ typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
+ typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
+ const uint32_t offset_in = boost::mpl::if_<pcl::traits::has_field<PointInT, pcl::fields::rgb>,
+ pcl::traits::offset<PointInT, pcl::fields::rgb>,
+ pcl::traits::offset<PointInT, pcl::fields::rgba> >::type::value;
+ const uint32_t offset_out = boost::mpl::if_<pcl::traits::has_field<PointOutT, pcl::fields::rgb>,
+ pcl::traits::offset<PointOutT, pcl::fields::rgb>,
+ pcl::traits::offset<PointOutT, pcl::fields::rgba> >::type::value;
+ pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (point_in, point_out));
+ memcpy (reinterpret_cast<char*> (&point_out) + offset_out,
+ reinterpret_cast<const char*> (&point_in) + offset_in,
+ 4);
+ }
+ };
+
+ }
+
+}
+
+template <typename PointInT, typename PointOutT> void
+pcl::copyPoint (const PointInT& point_in, PointOutT& point_out)
+{
+ detail::CopyPointHelper<PointInT, PointOutT> copy;
+ copy (point_in, point_out);
+}
+
+#endif //PCL_COMMON_IMPL_COPY_POINT_HPP_
+
#ifndef PCL_COMMON_EIGEN_IMPL_HPP_
#define PCL_COMMON_EIGEN_IMPL_HPP_
-#include <pcl/pcl_macros.h>
+#include <pcl/console/print.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar, typename Roots> inline void
+pcl::computeRoots2 (const Scalar& b, const Scalar& c, Roots& roots)
+{
+ roots (0) = Scalar (0);
+ Scalar d = Scalar (b * b - 4.0 * c);
+ if (d < 0.0) // no real roots ! THIS SHOULD NOT HAPPEN!
+ d = 0.0;
+
+ Scalar sd = ::std::sqrt (d);
+
+ roots (2) = 0.5f * (b + sd);
+ roots (1) = 0.5f * (b - sd);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Roots> inline void
+pcl::computeRoots (const Matrix& m, Roots& roots)
+{
+ typedef typename Matrix::Scalar Scalar;
+
+ // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0. The
+ // eigenvalues are the roots to this equation, all guaranteed to be
+ // real-valued, because the matrix is symmetric.
+ Scalar c0 = m (0, 0) * m (1, 1) * m (2, 2)
+ + Scalar (2) * m (0, 1) * m (0, 2) * m (1, 2)
+ - m (0, 0) * m (1, 2) * m (1, 2)
+ - m (1, 1) * m (0, 2) * m (0, 2)
+ - m (2, 2) * m (0, 1) * m (0, 1);
+ Scalar c1 = m (0, 0) * m (1, 1) -
+ m (0, 1) * m (0, 1) +
+ m (0, 0) * m (2, 2) -
+ m (0, 2) * m (0, 2) +
+ m (1, 1) * m (2, 2) -
+ m (1, 2) * m (1, 2);
+ Scalar c2 = m (0, 0) + m (1, 1) + m (2, 2);
+
+ if (fabs (c0) < Eigen::NumTraits < Scalar > ::epsilon ()) // one root is 0 -> quadratic equation
+ computeRoots2 (c2, c1, roots);
+ else
+ {
+ const Scalar s_inv3 = Scalar (1.0 / 3.0);
+ const Scalar s_sqrt3 = std::sqrt (Scalar (3.0));
+ // Construct the parameters used in classifying the roots of the equation
+ // and in solving the equation for the roots in closed form.
+ Scalar c2_over_3 = c2 * s_inv3;
+ Scalar a_over_3 = (c1 - c2 * c2_over_3) * s_inv3;
+ if (a_over_3 > Scalar (0))
+ a_over_3 = Scalar (0);
+
+ Scalar half_b = Scalar (0.5) * (c0 + c2_over_3 * (Scalar (2) * c2_over_3 * c2_over_3 - c1));
+
+ Scalar q = half_b * half_b + a_over_3 * a_over_3 * a_over_3;
+ if (q > Scalar (0))
+ q = Scalar (0);
+
+ // Compute the eigenvalues by solving for the roots of the polynomial.
+ Scalar rho = std::sqrt (-a_over_3);
+ Scalar theta = std::atan2 (std::sqrt (-q), half_b) * s_inv3;
+ Scalar cos_theta = std::cos (theta);
+ Scalar sin_theta = std::sin (theta);
+ roots (0) = c2_over_3 + Scalar (2) * rho * cos_theta;
+ roots (1) = c2_over_3 - rho * (cos_theta + s_sqrt3 * sin_theta);
+ roots (2) = c2_over_3 - rho * (cos_theta - s_sqrt3 * sin_theta);
+
+ // Sort in increasing order.
+ if (roots (0) >= roots (1))
+ std::swap (roots (0), roots (1));
+ if (roots (1) >= roots (2))
+ {
+ std::swap (roots (1), roots (2));
+ if (roots (0) >= roots (1))
+ std::swap (roots (0), roots (1));
+ }
+
+ if (roots (0) <= 0) // eigenval for symetric positive semi-definite matrix can not be negative! Set it to 0
+ computeRoots2 (c2, c1, roots);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::eigen22 (const Matrix& mat, typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
+{
+ // if diagonal matrix, the eigenvalues are the diagonal elements
+ // and the eigenvectors are not unique, thus set to Identity
+ if (fabs (mat.coeff (1)) <= std::numeric_limits<typename Matrix::Scalar>::min ())
+ {
+ if (mat.coeff (0) < mat.coeff (2))
+ {
+ eigenvalue = mat.coeff (0);
+ eigenvector[0] = 1.0;
+ eigenvector[1] = 0.0;
+ }
+ else
+ {
+ eigenvalue = mat.coeff (2);
+ eigenvector[0] = 0.0;
+ eigenvector[1] = 1.0;
+ }
+ return;
+ }
+
+ // 0.5 to optimize further calculations
+ typename Matrix::Scalar trace = static_cast<typename Matrix::Scalar> (0.5) * (mat.coeff (0) + mat.coeff (3));
+ typename Matrix::Scalar determinant = mat.coeff (0) * mat.coeff (3) - mat.coeff (1) * mat.coeff (1);
+
+ typename Matrix::Scalar temp = trace * trace - determinant;
+
+ if (temp < 0)
+ temp = 0;
+
+ eigenvalue = trace - ::std::sqrt (temp);
+
+ eigenvector[0] = -mat.coeff (1);
+ eigenvector[1] = mat.coeff (0) - eigenvalue;
+ eigenvector.normalize ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::eigen22 (const Matrix& mat, Matrix& eigenvectors, Vector& eigenvalues)
+{
+ // if diagonal matrix, the eigenvalues are the diagonal elements
+ // and the eigenvectors are not unique, thus set to Identity
+ if (fabs (mat.coeff (1)) <= std::numeric_limits<typename Matrix::Scalar>::min ())
+ {
+ if (mat.coeff (0) < mat.coeff (3))
+ {
+ eigenvalues.coeffRef (0) = mat.coeff (0);
+ eigenvalues.coeffRef (1) = mat.coeff (3);
+ eigenvectors.coeffRef (0) = 1.0;
+ eigenvectors.coeffRef (1) = 0.0;
+ eigenvectors.coeffRef (2) = 0.0;
+ eigenvectors.coeffRef (3) = 1.0;
+ }
+ else
+ {
+ eigenvalues.coeffRef (0) = mat.coeff (3);
+ eigenvalues.coeffRef (1) = mat.coeff (0);
+ eigenvectors.coeffRef (0) = 0.0;
+ eigenvectors.coeffRef (1) = 1.0;
+ eigenvectors.coeffRef (2) = 1.0;
+ eigenvectors.coeffRef (3) = 0.0;
+ }
+ return;
+ }
+
+ // 0.5 to optimize further calculations
+ typename Matrix::Scalar trace = static_cast<typename Matrix::Scalar> (0.5) * (mat.coeff (0) + mat.coeff (3));
+ typename Matrix::Scalar determinant = mat.coeff (0) * mat.coeff (3) - mat.coeff (1) * mat.coeff (1);
+
+ typename Matrix::Scalar temp = trace * trace - determinant;
+
+ if (temp < 0)
+ temp = 0;
+ else
+ temp = ::std::sqrt (temp);
+
+ eigenvalues.coeffRef (0) = trace - temp;
+ eigenvalues.coeffRef (1) = trace + temp;
+
+ // either this is in a row or column depending on RowMajor or ColumnMajor
+ eigenvectors.coeffRef (0) = -mat.coeff (1);
+ eigenvectors.coeffRef (2) = mat.coeff (0) - eigenvalues.coeff (0);
+ typename Matrix::Scalar norm = static_cast<typename Matrix::Scalar> (1.0)
+ / static_cast<typename Matrix::Scalar> (::std::sqrt (eigenvectors.coeffRef (0) * eigenvectors.coeffRef (0) + eigenvectors.coeffRef (2) * eigenvectors.coeffRef (2)));
+ eigenvectors.coeffRef (0) *= norm;
+ eigenvectors.coeffRef (2) *= norm;
+ eigenvectors.coeffRef (1) = eigenvectors.coeffRef (2);
+ eigenvectors.coeffRef (3) = -eigenvectors.coeffRef (0);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::computeCorrespondingEigenVector (const Matrix& mat, const typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
+{
+ typedef typename Matrix::Scalar Scalar;
+ // Scale the matrix so its entries are in [-1,1]. The scaling is applied
+ // only when at least one matrix entry has magnitude larger than 1.
+
+ Scalar scale = mat.cwiseAbs ().maxCoeff ();
+ if (scale <= std::numeric_limits < Scalar > ::min ())
+ scale = Scalar (1.0);
+
+ Matrix scaledMat = mat / scale;
+
+ scaledMat.diagonal ().array () -= eigenvalue / scale;
+
+ Vector vec1 = scaledMat.row (0).cross (scaledMat.row (1));
+ Vector vec2 = scaledMat.row (0).cross (scaledMat.row (2));
+ Vector vec3 = scaledMat.row (1).cross (scaledMat.row (2));
+
+ Scalar len1 = vec1.squaredNorm ();
+ Scalar len2 = vec2.squaredNorm ();
+ Scalar len3 = vec3.squaredNorm ();
+
+ if (len1 >= len2 && len1 >= len3)
+ eigenvector = vec1 / std::sqrt (len1);
+ else if (len2 >= len1 && len2 >= len3)
+ eigenvector = vec2 / std::sqrt (len2);
+ else
+ eigenvector = vec3 / std::sqrt (len3);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::eigen33 (const Matrix& mat, typename Matrix::Scalar& eigenvalue, Vector& eigenvector)
+{
+ typedef typename Matrix::Scalar Scalar;
+ // Scale the matrix so its entries are in [-1,1]. The scaling is applied
+ // only when at least one matrix entry has magnitude larger than 1.
+
+ Scalar scale = mat.cwiseAbs ().maxCoeff ();
+ if (scale <= std::numeric_limits < Scalar > ::min ())
+ scale = Scalar (1.0);
+
+ Matrix scaledMat = mat / scale;
+
+ Vector eigenvalues;
+ computeRoots (scaledMat, eigenvalues);
+
+ eigenvalue = eigenvalues (0) * scale;
+
+ scaledMat.diagonal ().array () -= eigenvalues (0);
+
+ Vector vec1 = scaledMat.row (0).cross (scaledMat.row (1));
+ Vector vec2 = scaledMat.row (0).cross (scaledMat.row (2));
+ Vector vec3 = scaledMat.row (1).cross (scaledMat.row (2));
+
+ Scalar len1 = vec1.squaredNorm ();
+ Scalar len2 = vec2.squaredNorm ();
+ Scalar len3 = vec3.squaredNorm ();
+
+ if (len1 >= len2 && len1 >= len3)
+ eigenvector = vec1 / std::sqrt (len1);
+ else if (len2 >= len1 && len2 >= len3)
+ eigenvector = vec2 / std::sqrt (len2);
+ else
+ eigenvector = vec3 / std::sqrt (len3);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::eigen33 (const Matrix& mat, Vector& evals)
+{
+ typedef typename Matrix::Scalar Scalar;
+ Scalar scale = mat.cwiseAbs ().maxCoeff ();
+ if (scale <= std::numeric_limits < Scalar > ::min ())
+ scale = Scalar (1.0);
+
+ Matrix scaledMat = mat / scale;
+ computeRoots (scaledMat, evals);
+ evals *= scale;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix, typename Vector> inline void
+pcl::eigen33 (const Matrix& mat, Matrix& evecs, Vector& evals)
+{
+ typedef typename Matrix::Scalar Scalar;
+ // Scale the matrix so its entries are in [-1,1]. The scaling is applied
+ // only when at least one matrix entry has magnitude larger than 1.
+
+ Scalar scale = mat.cwiseAbs ().maxCoeff ();
+ if (scale <= std::numeric_limits < Scalar > ::min ())
+ scale = Scalar (1.0);
+
+ Matrix scaledMat = mat / scale;
+
+ // Compute the eigenvalues
+ computeRoots (scaledMat, evals);
+
+ if ( (evals (2) - evals (0)) <= Eigen::NumTraits < Scalar > ::epsilon ())
+ {
+ // all three equal
+ evecs.setIdentity ();
+ }
+ else if ( (evals (1) - evals (0)) <= Eigen::NumTraits < Scalar > ::epsilon ())
+ {
+ // first and second equal
+ Matrix tmp;
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (2);
+
+ Vector vec1 = tmp.row (0).cross (tmp.row (1));
+ Vector vec2 = tmp.row (0).cross (tmp.row (2));
+ Vector vec3 = tmp.row (1).cross (tmp.row (2));
+
+ Scalar len1 = vec1.squaredNorm ();
+ Scalar len2 = vec2.squaredNorm ();
+ Scalar len3 = vec3.squaredNorm ();
+
+ if (len1 >= len2 && len1 >= len3)
+ evecs.col (2) = vec1 / std::sqrt (len1);
+ else if (len2 >= len1 && len2 >= len3)
+ evecs.col (2) = vec2 / std::sqrt (len2);
+ else
+ evecs.col (2) = vec3 / std::sqrt (len3);
+
+ evecs.col (1) = evecs.col (2).unitOrthogonal ();
+ evecs.col (0) = evecs.col (1).cross (evecs.col (2));
+ }
+ else if ( (evals (2) - evals (1)) <= Eigen::NumTraits < Scalar > ::epsilon ())
+ {
+ // second and third equal
+ Matrix tmp;
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (0);
+
+ Vector vec1 = tmp.row (0).cross (tmp.row (1));
+ Vector vec2 = tmp.row (0).cross (tmp.row (2));
+ Vector vec3 = tmp.row (1).cross (tmp.row (2));
+
+ Scalar len1 = vec1.squaredNorm ();
+ Scalar len2 = vec2.squaredNorm ();
+ Scalar len3 = vec3.squaredNorm ();
+
+ if (len1 >= len2 && len1 >= len3)
+ evecs.col (0) = vec1 / std::sqrt (len1);
+ else if (len2 >= len1 && len2 >= len3)
+ evecs.col (0) = vec2 / std::sqrt (len2);
+ else
+ evecs.col (0) = vec3 / std::sqrt (len3);
+
+ evecs.col (1) = evecs.col (0).unitOrthogonal ();
+ evecs.col (2) = evecs.col (0).cross (evecs.col (1));
+ }
+ else
+ {
+ Matrix tmp;
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (2);
+
+ Vector vec1 = tmp.row (0).cross (tmp.row (1));
+ Vector vec2 = tmp.row (0).cross (tmp.row (2));
+ Vector vec3 = tmp.row (1).cross (tmp.row (2));
+
+ Scalar len1 = vec1.squaredNorm ();
+ Scalar len2 = vec2.squaredNorm ();
+ Scalar len3 = vec3.squaredNorm ();
+#ifdef _WIN32
+ Scalar *mmax = new Scalar[3];
+#else
+ Scalar mmax[3];
+#endif
+ unsigned int min_el = 2;
+ unsigned int max_el = 2;
+ if (len1 >= len2 && len1 >= len3)
+ {
+ mmax[2] = len1;
+ evecs.col (2) = vec1 / std::sqrt (len1);
+ }
+ else if (len2 >= len1 && len2 >= len3)
+ {
+ mmax[2] = len2;
+ evecs.col (2) = vec2 / std::sqrt (len2);
+ }
+ else
+ {
+ mmax[2] = len3;
+ evecs.col (2) = vec3 / std::sqrt (len3);
+ }
+
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (1);
+
+ vec1 = tmp.row (0).cross (tmp.row (1));
+ vec2 = tmp.row (0).cross (tmp.row (2));
+ vec3 = tmp.row (1).cross (tmp.row (2));
+
+ len1 = vec1.squaredNorm ();
+ len2 = vec2.squaredNorm ();
+ len3 = vec3.squaredNorm ();
+ if (len1 >= len2 && len1 >= len3)
+ {
+ mmax[1] = len1;
+ evecs.col (1) = vec1 / std::sqrt (len1);
+ min_el = len1 <= mmax[min_el] ? 1 : min_el;
+ max_el = len1 > mmax[max_el] ? 1 : max_el;
+ }
+ else if (len2 >= len1 && len2 >= len3)
+ {
+ mmax[1] = len2;
+ evecs.col (1) = vec2 / std::sqrt (len2);
+ min_el = len2 <= mmax[min_el] ? 1 : min_el;
+ max_el = len2 > mmax[max_el] ? 1 : max_el;
+ }
+ else
+ {
+ mmax[1] = len3;
+ evecs.col (1) = vec3 / std::sqrt (len3);
+ min_el = len3 <= mmax[min_el] ? 1 : min_el;
+ max_el = len3 > mmax[max_el] ? 1 : max_el;
+ }
+
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (0);
+
+ vec1 = tmp.row (0).cross (tmp.row (1));
+ vec2 = tmp.row (0).cross (tmp.row (2));
+ vec3 = tmp.row (1).cross (tmp.row (2));
+
+ len1 = vec1.squaredNorm ();
+ len2 = vec2.squaredNorm ();
+ len3 = vec3.squaredNorm ();
+ if (len1 >= len2 && len1 >= len3)
+ {
+ mmax[0] = len1;
+ evecs.col (0) = vec1 / std::sqrt (len1);
+ min_el = len3 <= mmax[min_el] ? 0 : min_el;
+ max_el = len3 > mmax[max_el] ? 0 : max_el;
+ }
+ else if (len2 >= len1 && len2 >= len3)
+ {
+ mmax[0] = len2;
+ evecs.col (0) = vec2 / std::sqrt (len2);
+ min_el = len3 <= mmax[min_el] ? 0 : min_el;
+ max_el = len3 > mmax[max_el] ? 0 : max_el;
+ }
+ else
+ {
+ mmax[0] = len3;
+ evecs.col (0) = vec3 / std::sqrt (len3);
+ min_el = len3 <= mmax[min_el] ? 0 : min_el;
+ max_el = len3 > mmax[max_el] ? 0 : max_el;
+ }
+
+ unsigned mid_el = 3 - min_el - max_el;
+ evecs.col (min_el) = evecs.col ( (min_el + 1) % 3).cross (evecs.col ( (min_el + 2) % 3)).normalized ();
+ evecs.col (mid_el) = evecs.col ( (mid_el + 1) % 3).cross (evecs.col ( (mid_el + 2) % 3)).normalized ();
+#ifdef _WIN32
+ delete [] mmax;
+#endif
+ }
+ // Rescale back to the original size.
+ evals *= scale;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix> inline typename Matrix::Scalar
+pcl::invert2x2 (const Matrix& matrix, Matrix& inverse)
+{
+ typedef typename Matrix::Scalar Scalar;
+ Scalar det = matrix.coeff (0) * matrix.coeff (3) - matrix.coeff (1) * matrix.coeff (2);
+
+ if (det != 0)
+ {
+ //Scalar inv_det = Scalar (1.0) / det;
+ inverse.coeffRef (0) = matrix.coeff (3);
+ inverse.coeffRef (1) = -matrix.coeff (1);
+ inverse.coeffRef (2) = -matrix.coeff (2);
+ inverse.coeffRef (3) = matrix.coeff (0);
+ inverse /= det;
+ }
+ return det;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix> inline typename Matrix::Scalar
+pcl::invert3x3SymMatrix (const Matrix& matrix, Matrix& inverse)
+{
+ typedef typename Matrix::Scalar Scalar;
+ // elements
+ // a b c
+ // b d e
+ // c e f
+ //| a b c |-1 | fd-ee ce-bf be-cd |
+ //| b d e | = 1/det * | ce-bf af-cc bc-ae |
+ //| c e f | | be-cd bc-ae ad-bb |
+
+ //det = a(fd-ee) + b(ec-fb) + c(eb-dc)
+
+ Scalar fd_ee = matrix.coeff (4) * matrix.coeff (8) - matrix.coeff (7) * matrix.coeff (5);
+ Scalar ce_bf = matrix.coeff (2) * matrix.coeff (5) - matrix.coeff (1) * matrix.coeff (8);
+ Scalar be_cd = matrix.coeff (1) * matrix.coeff (5) - matrix.coeff (2) * matrix.coeff (4);
+
+ Scalar det = matrix.coeff (0) * fd_ee + matrix.coeff (1) * ce_bf + matrix.coeff (2) * be_cd;
+
+ if (det != 0)
+ {
+ //Scalar inv_det = Scalar (1.0) / det;
+ inverse.coeffRef (0) = fd_ee;
+ inverse.coeffRef (1) = inverse.coeffRef (3) = ce_bf;
+ inverse.coeffRef (2) = inverse.coeffRef (6) = be_cd;
+ inverse.coeffRef (4) = (matrix.coeff (0) * matrix.coeff (8) - matrix.coeff (2) * matrix.coeff (2));
+ inverse.coeffRef (5) = inverse.coeffRef (7) = (matrix.coeff (1) * matrix.coeff (2) - matrix.coeff (0) * matrix.coeff (5));
+ inverse.coeffRef (8) = (matrix.coeff (0) * matrix.coeff (4) - matrix.coeff (1) * matrix.coeff (1));
+ inverse /= det;
+ }
+ return det;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix> inline typename Matrix::Scalar
+pcl::invert3x3Matrix (const Matrix& matrix, Matrix& inverse)
+{
+ typedef typename Matrix::Scalar Scalar;
+
+ //| a b c |-1 | ie-hf hc-ib fb-ec |
+ //| d e f | = 1/det * | gf-id ia-gc dc-fa |
+ //| g h i | | hd-ge gb-ha ea-db |
+ //det = a(ie-hf) + d(hc-ib) + g(fb-ec)
+
+ Scalar ie_hf = matrix.coeff (8) * matrix.coeff (4) - matrix.coeff (7) * matrix.coeff (5);
+ Scalar hc_ib = matrix.coeff (7) * matrix.coeff (2) - matrix.coeff (8) * matrix.coeff (1);
+ Scalar fb_ec = matrix.coeff (5) * matrix.coeff (1) - matrix.coeff (4) * matrix.coeff (2);
+ Scalar det = matrix.coeff (0) * (ie_hf) + matrix.coeff (3) * (hc_ib) + matrix.coeff (6) * (fb_ec);
+
+ if (det != 0)
+ {
+ inverse.coeffRef (0) = ie_hf;
+ inverse.coeffRef (1) = hc_ib;
+ inverse.coeffRef (2) = fb_ec;
+ inverse.coeffRef (3) = matrix.coeff (6) * matrix.coeff (5) - matrix.coeff (8) * matrix.coeff (3);
+ inverse.coeffRef (4) = matrix.coeff (8) * matrix.coeff (0) - matrix.coeff (6) * matrix.coeff (2);
+ inverse.coeffRef (5) = matrix.coeff (3) * matrix.coeff (2) - matrix.coeff (5) * matrix.coeff (0);
+ inverse.coeffRef (6) = matrix.coeff (7) * matrix.coeff (3) - matrix.coeff (6) * matrix.coeff (4);
+ inverse.coeffRef (7) = matrix.coeff (6) * matrix.coeff (1) - matrix.coeff (7) * matrix.coeff (0);
+ inverse.coeffRef (8) = matrix.coeff (4) * matrix.coeff (0) - matrix.coeff (3) * matrix.coeff (1);
+
+ inverse /= det;
+ }
+ return det;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Matrix> inline typename Matrix::Scalar
+pcl::determinant3x3Matrix (const Matrix& matrix)
+{
+ // result is independent of Row/Col Major storage!
+ return matrix.coeff (0) * (matrix.coeff (4) * matrix.coeff (8) - matrix.coeff (5) * matrix.coeff (7)) +
+ matrix.coeff (1) * (matrix.coeff (5) * matrix.coeff (6) - matrix.coeff (3) * matrix.coeff (8)) +
+ matrix.coeff (2) * (matrix.coeff (3) * matrix.coeff (7) - matrix.coeff (4) * matrix.coeff (6)) ;
+}
//////////////////////////////////////////////////////////////////////////////////////////
void
}
//////////////////////////////////////////////////////////////////////////////////////////
-void
-pcl::getEulerAngles (const Eigen::Affine3f& t, float& roll, float& pitch, float& yaw)
+template <typename Scalar> void
+pcl::getEulerAngles (const Eigen::Transform<Scalar, 3, Eigen::Affine> &t, Scalar &roll, Scalar &pitch, Scalar &yaw)
{
- roll = atan2f(t(2,1), t(2,2));
- pitch = asinf(-t(2,0));
- yaw = atan2f(t(1,0), t(0,0));
+ roll = atan2 (t (2, 1), t (2, 2));
+ pitch = asin (-t (2, 0));
+ yaw = atan2 (t (1, 0), t (0, 0));
}
//////////////////////////////////////////////////////////////////////////////////////////
-void
-pcl::getTranslationAndEulerAngles (const Eigen::Affine3f& t,
- float& x, float& y, float& z,
- float& roll, float& pitch, float& yaw)
+template <typename Scalar> void
+pcl::getTranslationAndEulerAngles (const Eigen::Transform<Scalar, 3, Eigen::Affine> &t,
+ Scalar &x, Scalar &y, Scalar &z,
+ Scalar &roll, Scalar &pitch, Scalar &yaw)
{
- x = t(0,3);
- y = t(1,3);
- z = t(2,3);
- roll = atan2f(t(2,1), t(2,2));
- pitch = asinf(-t(2,0));
- yaw = atan2f(t(1,0), t(0,0));
+ x = t (0, 3);
+ y = t (1, 3);
+ z = t (2, 3);
+ roll = atan2 (t (2, 1), t (2, 2));
+ pitch = asin (-t (2, 0));
+ yaw = atan2 (t (1, 0), t (0, 0));
}
//////////////////////////////////////////////////////////////////////////////////////////
t (3, 0) = 0; t (3, 1) = 0; t (3, 2) = 0; t (3, 3) = 1;
}
-//////////////////////////////////////////////////////////////////////////////////////////
-Eigen::Affine3f
-pcl::getTransformation (float x, float y, float z, float roll, float pitch, float yaw)
-{
- Eigen::Affine3f t;
- getTransformation (x, y, z, roll, pitch, yaw, t);
- return (t);
-}
-
//////////////////////////////////////////////////////////////////////////////////////////
template <typename Derived> void
pcl::saveBinary (const Eigen::MatrixBase<Derived>& matrix, std::ostream& file)
return (Rt);
}
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar> bool
+pcl::transformLine (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_in,
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+{
+ if (line_in.innerSize () != 6 || line_out.innerSize () != 6)
+ {
+ PCL_DEBUG ("transformLine: lines size != 6\n");
+ return (false);
+ }
+
+ Eigen::Matrix<Scalar, 3, 1> point, vector;
+ point << line_in.template head<3> ();
+ vector << line_out.template tail<3> ();
+
+ pcl::transformPoint (point, point, transformation);
+ pcl::transformVector (vector, vector, transformation);
+ line_out << point, vector;
+ return (true);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar> void
+pcl::transformPlane (const Eigen::Matrix<Scalar, 4, 1> &plane_in,
+ Eigen::Matrix<Scalar, 4, 1> &plane_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+{
+ Eigen::Hyperplane < Scalar, 3 > plane;
+ plane.coeffs () << plane_in;
+ plane.transform (transformation);
+ plane_out << plane.coeffs ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar> void
+pcl::transformPlane (const pcl::ModelCoefficients::Ptr plane_in,
+ pcl::ModelCoefficients::Ptr plane_out,
+ const Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+{
+ Eigen::Matrix < Scalar, 4, 1 > v_plane_in (std::vector < Scalar > (plane_in->values.begin (), plane_in->values.end ()).data ());
+ pcl::transformPlane (v_plane_in, v_plane_in, transformation);
+ plane_out->values.resize (4);
+ for (int i = 0; i < 4; i++)
+ plane_in->values[i] = v_plane_in[i];
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar> bool
+pcl::checkCoordinateSystem (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line_y,
+ const Scalar norm_limit,
+ const Scalar dot_limit)
+{
+ if (line_x.innerSize () != 6 || line_y.innerSize () != 6)
+ {
+ PCL_DEBUG ("checkCoordinateSystem: lines size != 6\n");
+ return (false);
+ }
+
+ if (line_x.template head<3> () != line_y.template head<3> ())
+ {
+ PCL_DEBUG ("checkCoorZdinateSystem: vector origins are different !\n");
+ return (false);
+ }
+
+ // Make a copy of vector directions
+ // X^Y = Z | Y^Z = X | Z^X = Y
+ Eigen::Matrix<Scalar, 3, 1> v_line_x (line_x.template tail<3> ()),
+ v_line_y (line_y.template tail<3> ()),
+ v_line_z (v_line_x.cross (v_line_y));
+
+ // Check vectors norms
+ if (v_line_x.norm () < 1 - norm_limit || v_line_x.norm () > 1 + norm_limit)
+ {
+ PCL_DEBUG ("checkCoordinateSystem: line_x norm %d != 1\n", v_line_x.norm ());
+ return (false);
+ }
+
+ if (v_line_y.norm () < 1 - norm_limit || v_line_y.norm () > 1 + norm_limit)
+ {
+ PCL_DEBUG ("checkCoordinateSystem: line_y norm %d != 1\n", v_line_y.norm ());
+ return (false);
+ }
+
+ if (v_line_z.norm () < 1 - norm_limit || v_line_z.norm () > 1 + norm_limit)
+ {
+ PCL_DEBUG ("checkCoordinateSystem: line_z norm %d != 1\n", v_line_z.norm ());
+ return (false);
+ }
+
+ // Check vectors perendicularity
+ if (std::abs (v_line_x.dot (v_line_y)) > dot_limit)
+ {
+ PCL_DEBUG ("checkCSAxis: line_x dot line_y %e = > %e\n", v_line_x.dot (v_line_y), dot_limit);
+ return (false);
+ }
+
+ if (std::abs (v_line_x.dot (v_line_z)) > dot_limit)
+ {
+ PCL_DEBUG ("checkCSAxis: line_x dot line_z = %e > %e\n", v_line_x.dot (v_line_z), dot_limit);
+ return (false);
+ }
+
+ if (std::abs (v_line_y.dot (v_line_z)) > dot_limit)
+ {
+ PCL_DEBUG ("checkCSAxis: line_y dot line_z = %e > %e\n", v_line_y.dot (v_line_z), dot_limit);
+ return (false);
+ }
+
+ return (true);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename Scalar> bool
+pcl::transformBetween2CoordinateSystems (const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> from_line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> from_line_y,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> to_line_x,
+ const Eigen::Matrix<Scalar, Eigen::Dynamic, 1> to_line_y,
+ Eigen::Transform<Scalar, 3, Eigen::Affine> &transformation)
+{
+ if (from_line_x.innerSize () != 6 || from_line_y.innerSize () != 6 || to_line_x.innerSize () != 6 || to_line_y.innerSize () != 6)
+ {
+ PCL_DEBUG ("transformBetween2CoordinateSystems: lines size != 6\n");
+ return (false);
+ }
+
+ // Check if coordinate systems are valid
+ if (!pcl::checkCoordinateSystem (from_line_x, from_line_y) || !pcl::checkCoordinateSystem (to_line_x, to_line_y))
+ {
+ PCL_DEBUG ("transformBetween2CoordinateSystems: coordinate systems invalid !\n");
+ return (false);
+ }
+
+ // Convert lines into Vector3 :
+ Eigen::Matrix<Scalar, 3, 1> fr0 (from_line_x.template head<3>()),
+ fr1 (from_line_x.template head<3>() + from_line_x.template tail<3>()),
+ fr2 (from_line_y.template head<3>() + from_line_y.template tail<3>()),
+
+ to0 (to_line_x.template head<3>()),
+ to1 (to_line_x.template head<3>() + to_line_x.template tail<3>()),
+ to2 (to_line_y.template head<3>() + to_line_y.template tail<3>());
+
+ // Code is inspired from http://stackoverflow.com/a/15277421/1816078
+ // Define matrices and points :
+ Eigen::Transform<Scalar, 3, Eigen::Affine> T2, T3 = Eigen::Transform<Scalar, 3, Eigen::Affine>::Identity ();
+ Eigen::Matrix<Scalar, 3, 1> x1, y1, z1, x2, y2, z2;
+
+ // Axes of the coordinate system "fr"
+ x1 = (fr1 - fr0).normalized (); // the versor (unitary vector) of the (fr1-fr0) axis vector
+ y1 = (fr2 - fr0).normalized ();
+
+ // Axes of the coordinate system "to"
+ x2 = (to1 - to0).normalized ();
+ y2 = (to2 - to0).normalized ();
+
+ // Transform from CS1 to CS2
+ // Note: if fr0 == (0,0,0) --> CS1 == CS2 --> T2 = Identity
+ T2.linear () << x1, y1, x1.cross (y1);
+
+ // Transform from CS1 to CS3
+ T3.linear () << x2, y2, x2.cross (y2);
+
+ // Identity matrix = transform to CS2 to CS3
+ // Note: if CS1 == CS2 --> transformation = T3
+ transformation = Eigen::Transform<Scalar, 3, Eigen::Affine>::Identity ();
+ transformation.linear () = T3.linear () * T2.linear ().inverse ();
+ transformation.translation () = to0 - (transformation.linear () * fr0);
+ return (true);
+}
+
#endif //PCL_COMMON_EIGEN_IMPL_HPP_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2010, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_COMMON_INTERSECTIONS_IMPL_HPP_
+#define PCL_COMMON_INTERSECTIONS_IMPL_HPP_
+
+#include <pcl/pcl_macros.h>
+#include <pcl/console/print.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+bool
+pcl::lineWithLineIntersection (const Eigen::VectorXf &line_a,
+ const Eigen::VectorXf &line_b,
+ Eigen::Vector4f &point, double sqr_eps)
+{
+ Eigen::Vector4f p1, p2;
+ lineToLineSegment (line_a, line_b, p1, p2);
+
+ // If the segment size is smaller than a pre-given epsilon...
+ double sqr_dist = (p1 - p2).squaredNorm ();
+ if (sqr_dist < sqr_eps)
+ {
+ point = p1;
+ return (true);
+ }
+ point.setZero ();
+ return (false);
+}
+
+bool
+pcl::lineWithLineIntersection (const pcl::ModelCoefficients &line_a,
+ const pcl::ModelCoefficients &line_b,
+ Eigen::Vector4f &point, double sqr_eps)
+{
+ Eigen::VectorXf coeff1 = Eigen::VectorXf::Map (&line_a.values[0], line_a.values.size ());
+ Eigen::VectorXf coeff2 = Eigen::VectorXf::Map (&line_b.values[0], line_b.values.size ());
+ return (lineWithLineIntersection (coeff1, coeff2, point, sqr_eps));
+}
+
+template <typename Scalar> bool
+pcl::planeWithPlaneIntersection (const Eigen::Matrix<Scalar, 4, 1> &plane_a,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_b,
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line,
+ double angular_tolerance)
+{
+ typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
+ typedef Eigen::Matrix<Scalar, 4, 1> Vector4;
+ typedef Eigen::Matrix<Scalar, 5, 1> Vector5;
+ typedef Eigen::Matrix<Scalar, 5, 5> Matrix5;
+
+ // Normalize plane normals
+ Vector3 plane_a_norm (plane_a.template head<3> ());
+ Vector3 plane_b_norm (plane_b.template head<3> ());
+ plane_a_norm.normalize ();
+ plane_b_norm.normalize ();
+
+ // Test if planes are parallel (test_cos == 1)
+ double test_cos = plane_a_norm.dot (plane_b_norm);
+ double upper_limit = 1 + angular_tolerance;
+ double lower_limit = 1 - angular_tolerance;
+
+ if ((test_cos > lower_limit) && (test_cos < upper_limit))
+ {
+ PCL_DEBUG ("Plane A and Plane B are parallel.\n");
+ return (false);
+ }
+
+ Vector4 line_direction = plane_a.cross3 (plane_b);
+ line_direction.normalized();
+
+ // Construct system of equations using lagrange multipliers with one objective function and two constraints
+ Matrix5 langrange_coefs;
+ langrange_coefs << 2,0,0, plane_a[0], plane_b[0],
+ 0,2,0, plane_a[1], plane_b[1],
+ 0,0,2, plane_a[2], plane_b[2],
+ plane_a[0], plane_a[1], plane_a[2], 0, 0,
+ plane_b[0], plane_b[1], plane_b[2], 0, 0;
+
+ Vector5 b;
+ b << 0, 0, 0, -plane_a[3], -plane_b[3];
+
+ line.resize(6);
+ // Solve for the lagrange multipliers
+ line.template head<3>() = langrange_coefs.colPivHouseholderQr().solve(b).template head<3> ();
+ line.template tail<3>() = line_direction.template head<3>();
+ return (true);
+}
+
+template <typename Scalar> bool
+pcl::threePlanesIntersection (const Eigen::Matrix<Scalar, 4, 1> &plane_a,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_b,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_c,
+ Eigen::Matrix<Scalar, 3, 1> &intersection_point,
+ double determinant_tolerance)
+{
+ typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
+ typedef Eigen::Matrix<Scalar, 3, 3> Matrix3;
+
+ // TODO: Using Eigen::HyperPlanes is better to solve this problem
+ // Check if some planes are parallel
+ Matrix3 normals_in_lines;
+
+ for (int i = 0; i < 3; i++)
+ {
+ normals_in_lines (i, 0) = plane_a[i];
+ normals_in_lines (i, 1) = plane_b[i];
+ normals_in_lines (i, 2) = plane_c[i];
+ }
+
+ Scalar determinant = normals_in_lines.determinant ();
+ if (fabs (determinant) < determinant_tolerance)
+ {
+ // det ~= 0
+ PCL_DEBUG ("At least two planes are parralel.\n");
+ return (false);
+ }
+
+ // Left part of the 3 equations
+ Matrix3 left_member;
+
+ for (int i = 0; i < 3; i++)
+ {
+ left_member (0, i) = plane_a[i];
+ left_member (1, i) = plane_b[i];
+ left_member (2, i) = plane_c[i];
+ }
+
+ // Right side of the 3 equations
+ Vector3 right_member;
+ right_member << -plane_a[3], -plane_b[3], -plane_c[3];
+
+ // Solve the system
+ intersection_point = left_member.fullPivLu ().solve (right_member);
+ return (true);
+}
+
+#endif //PCL_COMMON_INTERSECTIONS_IMPL_HPP
#define PCL_IO_IMPL_IO_HPP_
#include <pcl/common/concatenate.h>
+#include <pcl/common/copy_point.h>
#include <pcl/point_types.h>
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT> void
-pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
+pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
pcl::PointCloud<PointOutT> &cloud_out)
{
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
-
+ // Allocate enough space and copy the basics
cloud_out.header = cloud_in.header;
cloud_out.width = cloud_in.width;
cloud_out.height = cloud_in.height;
cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
cloud_out.points.resize (cloud_in.points.size ());
- // If the point types are the same, don't copy one by one
if (isSamePointType<PointInT, PointOutT> ())
- {
+ // Copy the whole memory block
memcpy (&cloud_out.points[0], &cloud_in.points[0], cloud_in.points.size () * sizeof (PointInT));
- return;
- }
-
- std::vector<pcl::PCLPointField> fields_in, fields_out;
- pcl::for_each_type<FieldListInT> (pcl::detail::FieldAdder<PointInT> (fields_in));
- pcl::for_each_type<FieldListOutT> (pcl::detail::FieldAdder<PointOutT> (fields_out));
-
- // RGB vs RGBA is an official missmatch until PCL 2.0, so we need to search for it and
- // fix it manually
- int rgb_idx_in = -1, rgb_idx_out = -1;
- for (size_t i = 0; i < fields_in.size (); ++i)
- if (fields_in[i].name == "rgb" || fields_in[i].name == "rgba")
- {
- rgb_idx_in = int (i);
- break;
- }
- for (size_t i = 0; i < fields_out.size (); ++i)
- if (fields_out[i].name == "rgb" || fields_out[i].name == "rgba")
- {
- rgb_idx_out = int (i);
- break;
- }
-
- // We have one of the two cases: RGB vs RGBA or RGBA vs RGB
- if (rgb_idx_in != -1 && rgb_idx_out != -1 &&
- fields_in[rgb_idx_in].name != fields_out[rgb_idx_out].name)
- {
- size_t field_size_in = getFieldSize (fields_in[rgb_idx_in].datatype),
- field_size_out = getFieldSize (fields_out[rgb_idx_out].datatype);
-
- if (field_size_in == field_size_out)
- {
- for (size_t i = 0; i < cloud_in.points.size (); ++i)
- {
- // Copy the rest
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[i], cloud_out.points[i]));
- // Copy RGB<->RGBA
- memcpy (reinterpret_cast<char*> (&cloud_out.points[i]) + fields_out[rgb_idx_out].offset, reinterpret_cast<const char*> (&cloud_in.points[i]) + fields_in[rgb_idx_in].offset, field_size_in);
- }
- return;
- }
- }
-
- // Iterate over each point if no RGB/RGBA or if their size is different
- for (size_t i = 0; i < cloud_in.points.size (); ++i)
- // Iterate over each dimension
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[i], cloud_out.points[i]));
+ else
+ // Iterate over each point
+ for (size_t i = 0; i < cloud_in.points.size (); ++i)
+ copyPoint (cloud_in.points[i], cloud_out.points[i]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT> void
-pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
+pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
const std::vector<int> &indices,
pcl::PointCloud<PointOutT> &cloud_out)
{
cloud_out.sensor_orientation_ = cloud_in.sensor_orientation_;
cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
-
- // If the point types are the same, don't copy one by one
- if (isSamePointType<PointInT, PointOutT> ())
- {
- // Iterate over each point
- for (size_t i = 0; i < indices.size (); ++i)
- memcpy (&cloud_out.points[i], &cloud_in.points[indices[i]], sizeof (PointInT));
- return;
- }
-
- std::vector<pcl::PCLPointField> fields_in, fields_out;
- pcl::for_each_type<FieldListInT> (pcl::detail::FieldAdder<PointInT> (fields_in));
- pcl::for_each_type<FieldListOutT> (pcl::detail::FieldAdder<PointOutT> (fields_out));
-
- // RGB vs RGBA is an official missmatch until PCL 2.0, so we need to search for it and
- // fix it manually
- int rgb_idx_in = -1, rgb_idx_out = -1;
- for (size_t i = 0; i < fields_in.size (); ++i)
- if (fields_in[i].name == "rgb" || fields_in[i].name == "rgba")
- {
- rgb_idx_in = int (i);
- break;
- }
- for (size_t i = 0; int (i) < fields_out.size (); ++i)
- if (fields_out[i].name == "rgb" || fields_out[i].name == "rgba")
- {
- rgb_idx_out = int (i);
- break;
- }
-
- // We have one of the two cases: RGB vs RGBA or RGBA vs RGB
- if (rgb_idx_in != -1 && rgb_idx_out != -1 &&
- fields_in[rgb_idx_in].name != fields_out[rgb_idx_out].name)
- {
- size_t field_size_in = getFieldSize (fields_in[rgb_idx_in].datatype),
- field_size_out = getFieldSize (fields_out[rgb_idx_out].datatype);
-
- if (field_size_in == field_size_out)
- {
- for (size_t i = 0; i < indices.size (); ++i)
- {
- // Copy the rest
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[i]], cloud_out.points[i]));
- // Copy RGB<->RGBA
- memcpy (reinterpret_cast<char*> (&cloud_out.points[indices[i]]) + fields_out[rgb_idx_out].offset, reinterpret_cast<const char*> (&cloud_in.points[i]) + fields_in[rgb_idx_in].offset, field_size_in);
- }
- return;
- }
- }
-
- // Iterate over each point if no RGB/RGBA or if their size is different
+ // Iterate over each point
for (size_t i = 0; i < indices.size (); ++i)
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[i]], cloud_out.points[i]));
+ copyPoint (cloud_in.points[indices[i]], cloud_out.points[i]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT> void
-pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
+pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
const std::vector<int, Eigen::aligned_allocator<int> > &indices,
pcl::PointCloud<PointOutT> &cloud_out)
{
cloud_out.sensor_orientation_ = cloud_in.sensor_orientation_;
cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
-
- // If the point types are the same, don't copy one by one
- if (isSamePointType<PointInT, PointOutT> ())
- {
- // Iterate over each point
- for (size_t i = 0; i < indices.size (); ++i)
- memcpy (&cloud_out.points[i], &cloud_in.points[indices[i]], sizeof (PointInT));
- return;
- }
-
- std::vector<pcl::PCLPointField> fields_in, fields_out;
- pcl::for_each_type<FieldListInT> (pcl::detail::FieldAdder<PointInT> (fields_in));
- pcl::for_each_type<FieldListOutT> (pcl::detail::FieldAdder<PointOutT> (fields_out));
-
- // RGB vs RGBA is an official missmatch until PCL 2.0, so we need to search for it and
- // fix it manually
- int rgb_idx_in = -1, rgb_idx_out = -1;
- for (size_t i = 0; i < fields_in.size (); ++i)
- if (fields_in[i].name == "rgb" || fields_in[i].name == "rgba")
- {
- rgb_idx_in = int (i);
- break;
- }
- for (size_t i = 0; i < fields_out.size (); ++i)
- if (fields_out[i].name == "rgb" || fields_out[i].name == "rgba")
- {
- rgb_idx_out = int (i);
- break;
- }
-
- // We have one of the two cases: RGB vs RGBA or RGBA vs RGB
- if (rgb_idx_in != -1 && rgb_idx_out != -1 &&
- fields_in[rgb_idx_in].name != fields_out[rgb_idx_out].name)
- {
- size_t field_size_in = getFieldSize (fields_in[rgb_idx_in].datatype),
- field_size_out = getFieldSize (fields_out[rgb_idx_out].datatype);
-
- if (field_size_in == field_size_out)
- {
- for (size_t i = 0; i < indices.size (); ++i)
- {
- // Copy the rest
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[i]], cloud_out.points[i]));
- // Copy RGB<->RGBA
- memcpy (reinterpret_cast<char*> (&cloud_out.points[i]) + fields_out[rgb_idx_out].offset, reinterpret_cast<const char*> (&cloud_in.points[indices[i]]) + fields_in[rgb_idx_in].offset, field_size_in);
- }
- return;
- }
- }
-
- // Iterate over each point if no RGB/RGBA or if their size is different
+ // Iterate over each point
for (size_t i = 0; i < indices.size (); ++i)
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[i]], cloud_out.points[i]));
+ copyPoint (cloud_in.points[indices[i]], cloud_out.points[i]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT> void
-pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
+pcl::copyPointCloud (const pcl::PointCloud<PointInT> &cloud_in,
const pcl::PointIndices &indices,
pcl::PointCloud<PointOutT> &cloud_out)
{
- // Allocate enough space and copy the basics
- cloud_out.points.resize (indices.indices.size ());
- cloud_out.header = cloud_in.header;
- cloud_out.width = indices.indices.size ();
- cloud_out.height = 1;
- cloud_out.is_dense = cloud_in.is_dense;
- cloud_out.sensor_orientation_ = cloud_in.sensor_orientation_;
- cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
-
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
-
- // If the point types are the same, don't copy one by one
- if (isSamePointType<PointInT, PointOutT> ())
- {
- // Iterate over each point
- for (size_t i = 0; i < indices.indices.size (); ++i)
- memcpy (&cloud_out.points[i], &cloud_in.points[indices.indices[i]], sizeof (PointInT));
- return;
- }
-
- std::vector<pcl::PCLPointField> fields_in, fields_out;
- pcl::for_each_type<FieldListInT> (pcl::detail::FieldAdder<PointInT> (fields_in));
- pcl::for_each_type<FieldListOutT> (pcl::detail::FieldAdder<PointOutT> (fields_out));
-
- // RGB vs RGBA is an official missmatch until PCL 2.0, so we need to search for it and
- // fix it manually
- int rgb_idx_in = -1, rgb_idx_out = -1;
- for (size_t i = 0; i < fields_in.size (); ++i)
- if (fields_in[i].name == "rgb" || fields_in[i].name == "rgba")
- {
- rgb_idx_in = int (i);
- break;
- }
- for (size_t i = 0; i < fields_out.size (); ++i)
- if (fields_out[i].name == "rgb" || fields_out[i].name == "rgba")
- {
- rgb_idx_out = int (i);
- break;
- }
-
- // We have one of the two cases: RGB vs RGBA or RGBA vs RGB
- if (rgb_idx_in != -1 && rgb_idx_out != -1 &&
- fields_in[rgb_idx_in].name != fields_out[rgb_idx_out].name)
- {
- size_t field_size_in = getFieldSize (fields_in[rgb_idx_in].datatype),
- field_size_out = getFieldSize (fields_out[rgb_idx_out].datatype);
-
- if (field_size_in == field_size_out)
- {
- for (size_t i = 0; i < indices.indices.size (); ++i)
- {
- // Copy the rest
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices.indices[i]], cloud_out.points[i]));
- // Copy RGB<->RGBA
- memcpy (reinterpret_cast<char*> (&cloud_out.points[indices.indices[i]]) + fields_out[rgb_idx_out].offset, reinterpret_cast<const char*> (&cloud_in.points[i]) + fields_in[rgb_idx_in].offset, field_size_in);
- }
- return;
- }
- }
-
- // Iterate over each point if no RGB/RGBA or if their size is different
- for (size_t i = 0; i < indices.indices.size (); ++i)
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices.indices[i]], cloud_out.points[i]));
+ copyPointCloud (cloud_in, indices.indices, cloud_out);
}
//////////////////////////////////////////////////////////////////////////////////////////////
cloud_out.sensor_orientation_ = cloud_in.sensor_orientation_;
cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointInT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointOutT>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
-
- // If the point types are the same, don't copy one by one
- if (isSamePointType<PointInT, PointOutT> ())
- {
- // Iterate over each cluster
- int cp = 0;
- for (size_t cc = 0; cc < indices.size (); ++cc)
- {
- // Iterate over each idx
- for (size_t i = 0; i < indices[cc].indices.size (); ++i)
- {
- cloud_out.points[cp] = cloud_in.points[indices[cc].indices[i]];
- ++cp;
- }
- }
- return;
- }
-
- std::vector<pcl::PCLPointField> fields_in, fields_out;
- pcl::for_each_type<FieldListInT> (pcl::detail::FieldAdder<PointInT> (fields_in));
- pcl::for_each_type<FieldListOutT> (pcl::detail::FieldAdder<PointOutT> (fields_out));
-
- // RGB vs RGBA is an official missmatch until PCL 2.0, so we need to search for it and
- // fix it manually
- int rgb_idx_in = -1, rgb_idx_out = -1;
- for (size_t i = 0; i < fields_in.size (); ++i)
- if (fields_in[i].name == "rgb" || fields_in[i].name == "rgba")
- {
- rgb_idx_in = int (i);
- break;
- }
- for (size_t i = 0; i < fields_out.size (); ++i)
- if (fields_out[i].name == "rgb" || fields_out[i].name == "rgba")
- {
- rgb_idx_out = int (i);
- break;
- }
-
- // We have one of the two cases: RGB vs RGBA or RGBA vs RGB
- if (rgb_idx_in != -1 && rgb_idx_out != -1 &&
- fields_in[rgb_idx_in].name != fields_out[rgb_idx_out].name)
- {
- size_t field_size_in = getFieldSize (fields_in[rgb_idx_in].datatype),
- field_size_out = getFieldSize (fields_out[rgb_idx_out].datatype);
-
- if (field_size_in == field_size_out)
- {
- // Iterate over each cluster
- int cp = 0;
- for (size_t cc = 0; cc < indices.size (); ++cc)
- {
- // Iterate over each idx
- for (size_t i = 0; i < indices[cc].indices.size (); ++i)
- {
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[cc].indices[i]], cloud_out.points[cp]));
- // Copy RGB<->RGBA
- memcpy (reinterpret_cast<char*> (&cloud_out.points[cp]) + fields_out[rgb_idx_out].offset, reinterpret_cast<const char*> (&cloud_in.points[indices[cp].indices[i]]) + fields_in[rgb_idx_in].offset, field_size_in);
- ++cp;
- }
- }
- return;
- }
- }
-
// Iterate over each cluster
int cp = 0;
for (size_t cc = 0; cc < indices.size (); ++cc)
// Iterate over each idx
for (size_t i = 0; i < indices[cc].indices.size (); ++i)
{
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (cloud_in.points[indices[cc].indices[i]], cloud_out.points[cp]));
+ copyPoint (cloud_in.points[indices[cc].indices[i]], cloud_out.points[cp]);
++cp;
}
}
}
}
+//////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::copyPointCloud (const pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_out,
+ int top, int bottom, int left, int right, pcl::InterpolationType border_type, const PointT& value)
+{
+ if (top < 0 || left < 0 || bottom < 0 || right < 0)
+ {
+ std::string faulty = (top < 0) ? "top" : (left < 0) ? "left" : (bottom < 0) ? "bottom" : "right";
+ PCL_THROW_EXCEPTION (pcl::BadArgumentException, "[pcl::copyPointCloud] error: " << faulty << " must be positive!");
+ return;
+ }
+
+ if (top == 0 && left == 0 && bottom == 0 && right == 0)
+ cloud_out = cloud_in;
+ else
+ {
+ // Allocate enough space and copy the basics
+ cloud_out.header = cloud_in.header;
+ cloud_out.width = cloud_in.width + left + right;
+ cloud_out.height = cloud_in.height + top + bottom;
+ if (cloud_out.size () != cloud_out.width * cloud_out.height)
+ cloud_out.resize (cloud_out.width * cloud_out.height);
+ cloud_out.is_dense = cloud_in.is_dense;
+ cloud_out.sensor_orientation_ = cloud_in.sensor_orientation_;
+ cloud_out.sensor_origin_ = cloud_in.sensor_origin_;
+
+ if (border_type == pcl::BORDER_TRANSPARENT)
+ {
+ const PointT* in = &(cloud_in.points[0]);
+ PointT* out = &(cloud_out.points[0]);
+ PointT* out_inner = out + cloud_out.width*top + left;
+ for (uint32_t i = 0; i < cloud_in.height; i++, out_inner += cloud_out.width, in += cloud_in.width)
+ {
+ if (out_inner != in)
+ memcpy (out_inner, in, cloud_in.width * sizeof (PointT));
+ }
+ }
+ else
+ {
+ // Copy the data
+ if (border_type != pcl::BORDER_CONSTANT)
+ {
+ try
+ {
+ std::vector<int> padding (cloud_out.width - cloud_in.width);
+ int right = cloud_out.width - cloud_in.width - left;
+ int bottom = cloud_out.height - cloud_in.height - top;
+
+ for (int i = 0; i < left; i++)
+ padding[i] = pcl::interpolatePointIndex (i-left, cloud_in.width, border_type);
+
+ for (int i = 0; i < right; i++)
+ padding[i+left] = pcl::interpolatePointIndex (cloud_in.width+i, cloud_in.width, border_type);
+
+ const PointT* in = &(cloud_in.points[0]);
+ PointT* out = &(cloud_out.points[0]);
+ PointT* out_inner = out + cloud_out.width*top + left;
+
+ for (uint32_t i = 0; i < cloud_in.height; i++, out_inner += cloud_out.width, in += cloud_in.width)
+ {
+ if (out_inner != in)
+ memcpy (out_inner, in, cloud_in.width * sizeof (PointT));
+
+ for (int j = 0; j < left; j++)
+ out_inner[j - left] = in[padding[j]];
+
+ for (int j = 0; j < right; j++)
+ out_inner[j + cloud_in.width] = in[padding[j + left]];
+ }
+
+ for (int i = 0; i < top; i++)
+ {
+ int j = pcl::interpolatePointIndex (i - top, cloud_in.height, border_type);
+ memcpy (out + i*cloud_out.width,
+ out + (j+top) * cloud_out.width,
+ sizeof (PointT) * cloud_out.width);
+ }
+
+ for (int i = 0; i < bottom; i++)
+ {
+ int j = pcl::interpolatePointIndex (i + cloud_in.height, cloud_in.height, border_type);
+ memcpy (out + (i + cloud_in.height + top)*cloud_out.width,
+ out + (j+top)*cloud_out.width,
+ cloud_out.width * sizeof (PointT));
+ }
+ }
+ catch (pcl::BadArgumentException &e)
+ {
+ PCL_ERROR ("[pcl::copyPointCloud] Unhandled interpolation type %d!\n", border_type);
+ }
+ }
+ else
+ {
+ int right = cloud_out.width - cloud_in.width - left;
+ int bottom = cloud_out.height - cloud_in.height - top;
+ std::vector<PointT> buff (cloud_out.width, value);
+ PointT* buff_ptr = &(buff[0]);
+ const PointT* in = &(cloud_in.points[0]);
+ PointT* out = &(cloud_out.points[0]);
+ PointT* out_inner = out + cloud_out.width*top + left;
+
+ for (uint32_t i = 0; i < cloud_in.height; i++, out_inner += cloud_out.width, in += cloud_in.width)
+ {
+ if (out_inner != in)
+ memcpy (out_inner, in, cloud_in.width * sizeof (PointT));
+
+ memcpy (out_inner - left, buff_ptr, left * sizeof (PointT));
+ memcpy (out_inner + cloud_in.width, buff_ptr, right * sizeof (PointT));
+ }
+
+ for (int i = 0; i < top; i++)
+ {
+ memcpy (out + i*cloud_out.width, buff_ptr, cloud_out.width * sizeof (PointT));
+ }
+
+ for (int i = 0; i < bottom; i++)
+ {
+ memcpy (out + (i + cloud_in.height + top)*cloud_out.width,
+ buff_ptr,
+ cloud_out.width * sizeof (PointT));
+ }
+ }
+ }
+ }
+}
+
#endif // PCL_IO_IMPL_IO_H_
/////////////////////////////////////////////////////////////////////////////////////////
/** \brief Constructor with direct computation
- * \param[in] X input m*n matrix (ie n vectors of R(m))
+ * \param[in] cloud input m*n matrix (ie n vectors of R(m))
* \param[in] basis_only flag to compute only the PCA basis
*/
template<typename PointT>
-pcl::PCA<PointT>::PCA (const pcl::PointCloud<PointT>& X, bool basis_only)
+pcl::PCA<PointT>::PCA (const pcl::PointCloud<PointT> &cloud, bool basis_only)
{
Base ();
basis_only_ = basis_only;
- setInputCloud (X.makeShared ());
+ setInputCloud (cloud.makeShared ());
compute_done_ = initCompute ();
}
struct IntensityFieldAccessor
{
/** \brief get intensity field
- * \param[in] point p
+ * \param[in] p point
* \return p.intensity
*/
inline float
return p.intensity;
}
/** \brief gets the intensity value of a point
- * \param[in/out] p point for which intensity to be get
+ * \param p point for which intensity to be get
* \param[in] intensity value of the intensity field
*/
inline void
intensity = p.intensity;
}
/** \brief sets the intensity value of a point
- * \param[in/out] p point for which intensity to be set
+ * \param p point for which intensity to be set
* \param[in] intensity value of the intensity field
*/
inline void
p.intensity = intensity;
}
/** \brief subtract value from intensity field
- * \param[in/out] p point for which to modify inetnsity
+ * \param p point for which to modify inetnsity
* \param[in] value value to be subtracted from point intensity
*/
inline void
p.intensity -= value;
}
/** \brief add value to intensity field
- * \param[in/out] p point for which to modify inetnsity
+ * \param p point for which to modify inetnsity
* \param[in] value value to be added to point intensity
*/
inline void
* $Id$
*
*/
+
#ifndef PCL_INTERSECTIONS_H_
#define PCL_INTERSECTIONS_H_
* \param[in] sqr_eps maximum allowable squared distance to the true solution
* \ingroup common
*/
- PCL_EXPORTS bool
+ PCL_EXPORTS inline bool
lineWithLineIntersection (const Eigen::VectorXf &line_a,
const Eigen::VectorXf &line_b,
- Eigen::Vector4f &point, double sqr_eps = 1e-4);
+ Eigen::Vector4f &point,
+ double sqr_eps = 1e-4);
/** \brief Get the intersection of a two 3D lines in space as a 3D point
* \param[in] line_a the coefficients of the first line (point, direction)
* \param[in] sqr_eps maximum allowable squared distance to the true solution
* \ingroup common
*/
- PCL_EXPORTS bool
+
+ PCL_EXPORTS inline bool
lineWithLineIntersection (const pcl::ModelCoefficients &line_a,
const pcl::ModelCoefficients &line_b,
- Eigen::Vector4f &point, double sqr_eps = 1e-4);
+ Eigen::Vector4f &point,
+ double sqr_eps = 1e-4);
/** \brief Determine the line of intersection of two non-parallel planes using lagrange multipliers
* \note Described in: "Intersection of Two Planes, John Krumm, Microsoft Research, Redmond, WA, USA"
* \param[in] plane_a coefficients of plane A and plane B in the form ax + by + cz + d = 0
- * \param[out] plane_b coefficients of line where line.tail<3>() = direction vector and
+ * \param[in] plane_b coefficients of line where line.tail<3>() = direction vector and
* line.head<3>() the point on the line clossest to (0, 0, 0)
+ * \param[out] line the intersected line to be filled
+ * \param[in] angular_tolerance tolerance in radians
* \return true if succeeded/planes aren't parallel
*/
- PCL_EXPORTS bool
+ PCL_EXPORTS template <typename Scalar> bool
+ planeWithPlaneIntersection (const Eigen::Matrix<Scalar, 4, 1> &plane_a,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_b,
+ Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &line,
+ double angular_tolerance = 0.1);
+
+ PCL_EXPORTS inline bool
planeWithPlaneIntersection (const Eigen::Vector4f &plane_a,
- const Eigen::Vector4f &fplane_b,
+ const Eigen::Vector4f &plane_b,
Eigen::VectorXf &line,
- double angular_tolerance = 0.1);
+ double angular_tolerance = 0.1)
+ {
+ return (planeWithPlaneIntersection<float> (plane_a, plane_b, line, angular_tolerance));
+ }
+
+ PCL_EXPORTS inline bool
+ planeWithPlaneIntersection (const Eigen::Vector4d &plane_a,
+ const Eigen::Vector4d &plane_b,
+ Eigen::VectorXd &line,
+ double angular_tolerance = 0.1)
+ {
+ return (planeWithPlaneIntersection<double> (plane_a, plane_b, line, angular_tolerance));
+ }
+
+ /** \brief Determine the point of intersection of three non-parallel planes by solving the equations.
+ * \note If using nearly parralel planes you can lower the determinant_tolerance value. This can
+ * lead to inconsistent results.
+ * If the three planes intersects in a line the point will be anywhere on the line.
+ * \param[in] plane_a are the coefficients of the first plane in the form ax + by + cz + d = 0
+ * \param[in] plane_b are the coefficients of the second plane
+ * \param[in] plane_c are the coefficients of the third plane
+ * \param[in] determinant_tolerance is a limit to determine whether planes are parallel or not
+ * \param[out] intersection_point the three coordinates x, y, z of the intersection point
+ * \return true if succeeded/planes aren't parallel
+ */
+ PCL_EXPORTS template <typename Scalar> bool
+ threePlanesIntersection (const Eigen::Matrix<Scalar, 4, 1> &plane_a,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_b,
+ const Eigen::Matrix<Scalar, 4, 1> &plane_c,
+ Eigen::Matrix<Scalar, 3, 1> &intersection_point,
+ double determinant_tolerance = 1e-6);
+
+
+ PCL_EXPORTS inline bool
+ threePlanesIntersection (const Eigen::Vector4f &plane_a,
+ const Eigen::Vector4f &plane_b,
+ const Eigen::Vector4f &plane_c,
+ Eigen::Vector3f &intersection_point,
+ double determinant_tolerance = 1e-6)
+ {
+ return (threePlanesIntersection<float> (plane_a, plane_b, plane_c,
+ intersection_point, determinant_tolerance));
+ }
+
+ PCL_EXPORTS inline bool
+ threePlanesIntersection (const Eigen::Vector4d &plane_a,
+ const Eigen::Vector4d &plane_b,
+ const Eigen::Vector4d &plane_c,
+ Eigen::Vector3d &intersection_point,
+ double determinant_tolerance = 1e-6)
+ {
+ return (threePlanesIntersection<double> (plane_a, plane_b, plane_c,
+ intersection_point, determinant_tolerance));
+ }
+
}
/*@}*/
-#endif //#ifndef PCL_INTERSECTIONS_H_
+#include <pcl/common/impl/intersections.hpp>
+
+#endif //#ifndef PCL_INTERSECTIONS_H_
#include <pcl/pcl_base.h>
#include <pcl/PointIndices.h>
#include <pcl/conversions.h>
+#include <pcl/exceptions.h>
#include <locale>
namespace pcl
}
}
+ typedef enum
+ {
+ BORDER_CONSTANT = 0, BORDER_REPLICATE = 1,
+ BORDER_REFLECT = 2, BORDER_WRAP = 3,
+ BORDER_REFLECT_101 = 4, BORDER_TRANSPARENT = 5,
+ BORDER_DEFAULT = BORDER_REFLECT_101
+ } InterpolationType;
+
+ /** \brief \return the right index according to the interpolation type.
+ * \note this is adapted from OpenCV
+ * \param p the index of point to interpolate
+ * \param length the top/bottom row or left/right column index
+ * \param type the requested interpolation
+ * \throws pcl::BadArgumentException if type is unknown
+ */
+ PCL_EXPORTS int
+ interpolatePointIndex (int p, int length, InterpolationType type);
+
/** \brief Concatenate two pcl::PCLPointCloud2.
* \param[in] cloud1 the first input point cloud dataset
* \param[in] cloud2 the second input point cloud dataset
const std::vector<pcl::PointIndices> &indices,
pcl::PointCloud<PointOutT> &cloud_out);
+ /** \brief Copy a point cloud inside a larger one interpolating borders.
+ * \param[in] cloud_in the input point cloud dataset
+ * \param[out] cloud_out the resultant output point cloud dataset
+ * \param top
+ * \param bottom
+ * \param left
+ * \param right
+ * Position of cloud_in inside cloud_out is given by \a top, \a left, \a bottom \a right.
+ * \param[in] border_type the interpolating method (pcl::BORDER_XXX)
+ * BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
+ * BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
+ * BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
+ * BORDER_WRAP: cdefgh|abcdefgh|abcdefg
+ * BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
+ * BORDER_TRANSPARENT: mnopqr|abcdefgh|tuvwxyz where m-r and t-z are orignal values of cloud_out
+ * \param value
+ * \throw pcl::BadArgumentException if any of top, bottom, left or right is negative.
+ * \ingroup common
+ */
+ template <typename PointT> void
+ copyPointCloud (const pcl::PointCloud<PointT> &cloud_in,
+ pcl::PointCloud<PointT> &cloud_out,
+ int top, int bottom, int left, int right,
+ pcl::InterpolationType border_type, const PointT& value);
+
/** \brief Concatenate two datasets representing different fields.
*
* \note If the input datasets have overlapping fields (i.e., both contain
* X input m*n matrix (ie n vectors of R(m))
* basis_only flag to compute only the PCA basis
*/
- PCL_DEPRECATED (PCA (const pcl::PointCloud<PointT>& X, bool basis_only = false),
- "Use PCA (bool basis_only); setInputCloud (X.makeShared ()); instead");
+ PCL_DEPRECATED ("Use PCA (bool basis_only); setInputCloud (X.makeShared ()); instead")
+ PCA (const pcl::PointCloud<PointT>& X, bool basis_only = false);
/** Copy Constructor
* \param[in] pca PCA object
template<> inline bool isFinite<pcl::RGB> (const pcl::RGB&) { return (true); }
template<> inline bool isFinite<pcl::Label> (const pcl::Label&) { return (true); }
template<> inline bool isFinite<pcl::Axis> (const pcl::Axis&) { return (true); }
+ template<> inline bool isFinite<pcl::Intensity> (const pcl::Intensity&) { return (true); }
template<> inline bool isFinite<pcl::MomentInvariants> (const pcl::MomentInvariants&) { return (true); }
template<> inline bool isFinite<pcl::PrincipalRadiiRSD> (const pcl::PrincipalRadiiRSD&) { return (true); }
template<> inline bool isFinite<pcl::Boundary> (const pcl::Boundary&) { return (true); }
/** Constructor
* \param parameters uniform distribution parameters and generator seed
*/
- UniformGenerator(const Parameters& paramters);
+ UniformGenerator(const Parameters& parameters);
/** Change seed value
* \param[in] seed new generator seed value
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] argument_name the string value to search for
- * \return index of found argument or -1 of arguments does not appear in list
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
find_argument (int argc, char** argv, const char* argument_name);
* \param[in] argv the command line arguments
* \param[in] argument_name the name of the argument to search for
* \param[out] value The value of the argument
- * \return index of found argument or -1 of arguments does not appear in list
+ * \return index of found argument or -1 if arguments do not appear in list
*/
template<typename Type> int
parse (int argc, char** argv, const char* argument_name, Type& value)
return (index - 1);
}
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as a string.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, std::string &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as a boolean.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, bool &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as a double.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, float &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as a double.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, double &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as an int.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, int &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as an unsigned int.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, unsigned int &val);
- /** \brief Parse for a specific given command line argument. Returns the value
- * sent as an int.
+ /** \brief Parse for a specific given command line argument.
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] val the resultant value
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_argument (int argc, char** argv, const char* str, char &val);
/** \brief Parse for specific given command line arguments (2x values comma
- * separated). Returns the values sent as doubles.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] f the first output value
* \param[out] s the second output value
* \param[in] debug whether to print debug info or not
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_2x_arguments (int argc, char** argv, const char* str, float &f, float &s, bool debug = true);
/** \brief Parse for specific given command line arguments (2x values comma
- * separated). Returns the values sent as doubles.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] f the first output value
* \param[out] s the second output value
* \param[in] debug whether to print debug info or not
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_2x_arguments (int argc, char** argv, const char* str, double &f, double &s, bool debug = true);
/** \brief Parse for specific given command line arguments (2x values comma
- * separated). Returns the values sent as ints.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] f the first output value
* \param[out] s the second output value
* \param[in] debug whether to print debug info or not
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_2x_arguments (int argc, char** argv, const char* str, int &f, int &s, bool debug = true);
/** \brief Parse for specific given command line arguments (3x values comma
- * separated). Returns the values sent as doubles.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] s the second output value
* \param[out] t the third output value
* \param[in] debug whether to print debug info or not
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_3x_arguments (int argc, char** argv, const char* str, float &f, float &s, float &t, bool debug = true);
/** \brief Parse for specific given command line arguments (3x values comma
- * separated). Returns the values sent as doubles.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] s the second output value
* \param[out] t the third output value
* \param[in] debug whether to print debug info or not
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_3x_arguments (int argc, char** argv, const char* str, double &f, double &s, double &t, bool debug = true);
/** \brief Parse for specific given command line arguments (3x values comma
- * separated). Returns the values sent as ints.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] s the second output value
* \param[out] t the third output value
* \param[in] debug whether to print debug info or not
+ * return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_3x_arguments (int argc, char** argv, const char* str, int &f, int &s, int &t, bool debug = true);
/** \brief Parse for specific given command line arguments (3x values comma
- * separated). Returns the values sent as doubles.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] v the vector into which the parsed values will be copied
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_x_arguments (int argc, char** argv, const char* str, std::vector<double>& v);
/** \brief Parse for specific given command line arguments (N values comma
- * separated). Returns the values sent as ints.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] v the vector into which the parsed values will be copied
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_x_arguments (int argc, char** argv, const char* str, std::vector<float>& v);
/** \brief Parse for specific given command line arguments (N values comma
- * separated). Returns the values sent as ints.
+ * separated).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] v the vector into which the parsed values will be copied
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS int
parse_x_arguments (int argc, char** argv, const char* str, std::vector<int>& v);
- /** \brief Parse for specific given command line arguments (multiple occurances
- * of the same command line parameter). Returns the values sent as a vector.
+ /** \brief Parse for specific given command line arguments (multiple occurences
+ * of the same command line parameter).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] values the resultant output values
+ * \return index of found argument or -1 if arguments do not appear in list
*/
PCL_EXPORTS bool
parse_multiple_arguments (int argc, char** argv, const char* str, std::vector<int> &values);
- /** \brief Parse for specific given command line arguments (multiple occurances
- * of the same command line parameter). Returns the values sent as a vector.
+ /** \brief Parse for specific given command line arguments (multiple occurences
+ * of the same command line parameter).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] values the resultant output values
+ * \return true if found, false otherwise
*/
PCL_EXPORTS bool
parse_multiple_arguments (int argc, char** argv, const char* str, std::vector<float> &values);
- /** \brief Parse for specific given command line arguments (multiple occurances
- * of the same command line parameter). Returns the values sent as a vector.
+ /** \brief Parse for specific given command line arguments (multiple occurences
+ * of the same command line parameter).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] values the resultant output values
+ * \return true if found, false otherwise
*/
PCL_EXPORTS bool
parse_multiple_arguments (int argc, char** argv, const char* str, std::vector<double> &values);
/** \brief Parse for a specific given command line argument (multiple occurences
- * of the same command line parameter). Returns the value sent as a vector.
+ * of the same command line parameter).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the string value to search for
* \param[out] values the resultant output values
+ * \return true if found, false otherwise
*/
PCL_EXPORTS bool
parse_multiple_arguments (int argc, char** argv, const char* str, std::vector<std::string> &values);
- /** \brief Parse for specific given command line arguments (multiple occurances
- * of 2x argument groups, separated by commas). Returns 2 vectors holding the
- * given values.
+ /** \brief Parse command line arguments for file names with given extension (multiple occurences
+ * of 2x argument groups, separated by commas).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] values_f the first vector of output values
* \param[out] values_s the second vector of output values
+ * \return true if found, false otherwise
*/
PCL_EXPORTS bool
parse_multiple_2x_arguments (int argc, char** argv, const char* str,
std::vector<double> &values_f,
std::vector<double> &values_s);
- /** \brief Parse for specific given command line arguments (multiple occurances
- * of 3x argument groups, separated by commas). Returns 3 vectors holding the
- * given values.
+ /** \brief Parse command line arguments for file names with given extension (multiple occurences
+ * of 3x argument groups, separated by commas).
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] str the command line argument to search for
* \param[out] values_f the first vector of output values
* \param[out] values_s the second vector of output values
* \param[out] values_t the third vector of output values
+ * \return true if found, false otherwise
*/
PCL_EXPORTS bool
parse_multiple_3x_arguments (int argc, char** argv, const char* str,
std::vector<double> &values_s,
std::vector<double> &values_t);
- /** \brief Parse command line arguments for file names. Returns a vector with
- * file names indices.
+ /** \brief Parse command line arguments for file names with given extension
* \param[in] argc the number of command line arguments
* \param[in] argv the command line arguments
* \param[in] ext the extension to search for
+ * \return a vector with file names indices
*/
PCL_EXPORTS std::vector<int>
parse_file_extension_argument (int argc, char** argv, const std::string &ext);
: pcl::PCLException (error_description, file_name, function_name, line_number) { }
};
+ /** \class BadArgumentException
+ * \brief An exception that is thrown when the argments number or type is wrong/unhandled.
+ */
+ class BadArgumentException : public PCLException
+ {
+ public:
+ BadArgumentException (const std::string& error_description,
+ const std::string& file_name = "",
+ const std::string& function_name = "" ,
+ unsigned line_number = 0) throw ()
+ : pcl::PCLException (error_description, file_name, function_name, line_number) { }
+ };
}
}
catch (std::bad_alloc)
{
- PCL_ERROR ("[initCompute] Failed to allocate %zu indices.\n", input_->points.size ());
+ PCL_ERROR ("[initCompute] Failed to allocate %lu indices.\n", input_->points.size ());
}
for (size_t i = 0; i < indices_->size (); ++i) { (*indices_)[i] = static_cast<int>(i); }
}
(pcl::PFHSignature125) \
(pcl::PFHRGBSignature250) \
(pcl::PPFSignature) \
+ (pcl::CPPFSignature) \
(pcl::PPFRGBSignature) \
(pcl::NormalBasedSignature12) \
(pcl::FPFHSignature33) \
(pcl::PFHSignature125) \
(pcl::PFHRGBSignature250) \
(pcl::PPFSignature) \
+ (pcl::CPPFSignature) \
(pcl::PPFRGBSignature) \
(pcl::NormalBasedSignature12) \
(pcl::FPFHSignature33) \
namespace pcl
{
-#define PCL_ADD_POINT4D \
+ typedef Eigen::Map<Eigen::Array3f> Array3fMap;
+ typedef const Eigen::Map<const Eigen::Array3f> Array3fMapConst;
+ typedef Eigen::Map<Eigen::Array4f, Eigen::Aligned> Array4fMap;
+ typedef const Eigen::Map<const Eigen::Array4f, Eigen::Aligned> Array4fMapConst;
+ typedef Eigen::Map<Eigen::Vector3f> Vector3fMap;
+ typedef const Eigen::Map<const Eigen::Vector3f> Vector3fMapConst;
+ typedef Eigen::Map<Eigen::Vector4f, Eigen::Aligned> Vector4fMap;
+ typedef const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> Vector4fMapConst;
+
+ typedef Eigen::Matrix<uint8_t, 3, 1> Vector3c;
+ typedef Eigen::Map<Vector3c> Vector3cMap;
+ typedef const Eigen::Map<const Vector3c> Vector3cMapConst;
+ typedef Eigen::Matrix<uint8_t, 4, 1> Vector4c;
+ typedef Eigen::Map<Vector4c, Eigen::Aligned> Vector4cMap;
+ typedef const Eigen::Map<const Vector4c, Eigen::Aligned> Vector4cMapConst;
+
+#define PCL_ADD_UNION_POINT4D \
union EIGEN_ALIGN16 { \
float data[4]; \
struct { \
float y; \
float z; \
}; \
- }; \
- inline Eigen::Map<Eigen::Vector3f> getVector3fMap () { return (Eigen::Vector3f::Map (data)); } \
- inline const Eigen::Map<const Eigen::Vector3f> getVector3fMap () const { return (Eigen::Vector3f::Map (data)); } \
- inline Eigen::Map<Eigen::Vector4f, Eigen::Aligned> getVector4fMap () { return (Eigen::Vector4f::MapAligned (data)); } \
- inline const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> getVector4fMap () const { return (Eigen::Vector4f::MapAligned (data)); } \
- inline Eigen::Map<Eigen::Array3f> getArray3fMap () { return (Eigen::Array3f::Map (data)); } \
- inline const Eigen::Map<const Eigen::Array3f> getArray3fMap () const { return (Eigen::Array3f::Map (data)); } \
- inline Eigen::Map<Eigen::Array4f, Eigen::Aligned> getArray4fMap () { return (Eigen::Array4f::MapAligned (data)); } \
- inline const Eigen::Map<const Eigen::Array4f, Eigen::Aligned> getArray4fMap () const { return (Eigen::Array4f::MapAligned (data)); }
+ };
-#define PCL_ADD_NORMAL4D \
+#define PCL_ADD_EIGEN_MAPS_POINT4D \
+ inline pcl::Vector3fMap getVector3fMap () { return (pcl::Vector3fMap (data)); } \
+ inline pcl::Vector3fMapConst getVector3fMap () const { return (pcl::Vector3fMapConst (data)); } \
+ inline pcl::Vector4fMap getVector4fMap () { return (pcl::Vector4fMap (data)); } \
+ inline pcl::Vector4fMapConst getVector4fMap () const { return (pcl::Vector4fMapConst (data)); } \
+ inline pcl::Array3fMap getArray3fMap () { return (pcl::Array3fMap (data)); } \
+ inline pcl::Array3fMapConst getArray3fMap () const { return (pcl::Array3fMapConst (data)); } \
+ inline pcl::Array4fMap getArray4fMap () { return (pcl::Array4fMap (data)); } \
+ inline pcl::Array4fMapConst getArray4fMap () const { return (pcl::Array4fMapConst (data)); }
+
+#define PCL_ADD_POINT4D \
+ PCL_ADD_UNION_POINT4D \
+ PCL_ADD_EIGEN_MAPS_POINT4D
+
+#define PCL_ADD_UNION_NORMAL4D \
union EIGEN_ALIGN16 { \
float data_n[4]; \
float normal[3]; \
float normal_y; \
float normal_z; \
}; \
- }; \
- inline Eigen::Map<Eigen::Vector3f> getNormalVector3fMap () { return (Eigen::Vector3f::Map (data_n)); } \
- inline const Eigen::Map<const Eigen::Vector3f> getNormalVector3fMap () const { return (Eigen::Vector3f::Map (data_n)); } \
- inline Eigen::Map<Eigen::Vector4f, Eigen::Aligned> getNormalVector4fMap () { return (Eigen::Vector4f::MapAligned (data_n)); } \
- inline const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> getNormalVector4fMap () const { return (Eigen::Vector4f::MapAligned (data_n)); }
+ };
-#define PCL_ADD_RGB \
+#define PCL_ADD_EIGEN_MAPS_NORMAL4D \
+ inline pcl::Vector3fMap getNormalVector3fMap () { return (pcl::Vector3fMap (data_n)); } \
+ inline pcl::Vector3fMapConst getNormalVector3fMap () const { return (pcl::Vector3fMapConst (data_n)); } \
+ inline pcl::Vector4fMap getNormalVector4fMap () { return (pcl::Vector4fMap (data_n)); } \
+ inline pcl::Vector4fMapConst getNormalVector4fMap () const { return (pcl::Vector4fMapConst (data_n)); }
+
+#define PCL_ADD_NORMAL4D \
+ PCL_ADD_UNION_NORMAL4D \
+ PCL_ADD_EIGEN_MAPS_NORMAL4D
+
+#define PCL_ADD_UNION_RGB \
union \
{ \
union \
uint32_t rgba; \
};
+#define PCL_ADD_EIGEN_MAPS_RGB \
+ inline Eigen::Vector3i getRGBVector3i () { return (Eigen::Vector3i (r, g, b)); } \
+ inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); } \
+ inline Eigen::Vector4i getRGBVector4i () { return (Eigen::Vector4i (r, g, b, a)); } \
+ inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, a)); } \
+ inline Eigen::Vector4i getRGBAVector4i () { return (Eigen::Vector4i (r, g, b, a)); } \
+ inline const Eigen::Vector4i getRGBAVector4i () const { return (Eigen::Vector4i (r, g, b, a)); } \
+ inline pcl::Vector3cMap getBGRVector3cMap () { return (pcl::Vector3cMap (reinterpret_cast<uint8_t*> (&rgba))); } \
+ inline pcl::Vector3cMapConst getBGRVector3cMap () const { return (pcl::Vector3cMapConst (reinterpret_cast<const uint8_t*> (&rgba))); } \
+ inline pcl::Vector4cMap getBGRAVector4cMap () { return (pcl::Vector4cMap (reinterpret_cast<uint8_t*> (&rgba))); } \
+ inline pcl::Vector4cMapConst getBGRAVector4cMap () const { return (pcl::Vector4cMapConst (reinterpret_cast<const uint8_t*> (&rgba))); }
+
+#define PCL_ADD_RGB \
+ PCL_ADD_UNION_RGB \
+ PCL_ADD_EIGEN_MAPS_RGB
+
#define PCL_ADD_INTENSITY \
struct \
{ \
uint32_t intensity; \
}; \
- typedef Eigen::Map<Eigen::Array3f> Array3fMap;
- typedef const Eigen::Map<const Eigen::Array3f> Array3fMapConst;
- typedef Eigen::Map<Eigen::Array4f, Eigen::Aligned> Array4fMap;
- typedef const Eigen::Map<const Eigen::Array4f, Eigen::Aligned> Array4fMapConst;
- typedef Eigen::Map<Eigen::Vector3f> Vector3fMap;
- typedef const Eigen::Map<const Eigen::Vector3f> Vector3fMapConst;
- typedef Eigen::Map<Eigen::Vector4f, Eigen::Aligned> Vector4fMap;
- typedef const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> Vector4fMapConst;
-
struct _PointXYZ
{
intensity = 0;
}
+#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 1101
+ operator unsigned char() const
+ {
+ return intensity;
+ }
+#endif
+
friend std::ostream& operator << (std::ostream& os, const Intensity8u& p);
};
{
x = y = z = 0.0f;
data[3] = 1.0f;
- r = g = b = a = 0;
- }
- inline Eigen::Vector3i getRGBVector3i ()
- {
- return (Eigen::Vector3i (r, g, b));
- }
- inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
- inline Eigen::Vector4i getRGBVector4i ()
- {
- return (Eigen::Vector4i (r, g, b, a));
+ r = g = b = 0;
+ a = 255;
}
- inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, a)); }
-
+
friend std::ostream& operator << (std::ostream& os, const PointXYZRGBA& p);
};
a = 0;
}
- inline Eigen::Vector3i getRGBVector3i ()
- {
- return (Eigen::Vector3i (r, g, b));
- }
- inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
- inline Eigen::Vector4i getRGBVector4i ()
- {
- return (Eigen::Vector4i (r, g, b, a));
- }
- inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, a)); }
-
-
friend std::ostream& operator << (std::ostream& os, const PointXYZRGB& p);
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
{
struct
{
- // RGB union
- union
- {
- struct
- {
- uint8_t b;
- uint8_t g;
- uint8_t r;
- uint8_t a;
- };
- float rgb;
- uint32_t rgba;
- };
+ PCL_ADD_UNION_RGB;
float curvature;
};
float data_c[4];
};
+ PCL_ADD_EIGEN_MAPS_RGB;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
curvature = 0;
}
- inline Eigen::Vector3i getRGBVector3i ()
- {
- return (Eigen::Vector3i (r, g, b));
- }
- inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
- inline Eigen::Vector4i getRGBVector4i ()
- {
- return (Eigen::Vector4i (r, g, b, a));
- }
- inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, a)); }
-
friend std::ostream& operator << (std::ostream& os, const PointXYZRGBNormal& p);
};
struct Boundary
{
uint8_t boundary_point;
+
+#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 1101
+ operator unsigned char() const
+ {
+ return boundary_point;
+ }
+#endif
friend std::ostream& operator << (std::ostream& os, const Boundary& p);
};
struct PFHSignature125
{
float histogram[125];
+ static int descriptorSize () { return 125; }
friend std::ostream& operator << (std::ostream& os, const PFHSignature125& p);
};
struct PFHRGBSignature250
{
float histogram[250];
-
+ static int descriptorSize () { return 250; }
+
friend std::ostream& operator << (std::ostream& os, const PFHRGBSignature250& p);
};
friend std::ostream& operator << (std::ostream& os, const PPFSignature& p);
};
+ PCL_EXPORTS std::ostream& operator << (std::ostream& os, const CPPFSignature& p);
+ /** \brief A point structure for storing the Point Pair Feature (CPPF) values
+ * \ingroup common
+ */
+ struct CPPFSignature
+ {
+ float f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
+ float alpha_m;
+
+ friend std::ostream& operator << (std::ostream& os, const CPPFSignature& p);
+ };
+
PCL_EXPORTS std::ostream& operator << (std::ostream& os, const PPFRGBSignature& p);
/** \brief A point structure for storing the Point Pair Color Feature (PPFRGB) values
* \ingroup common
{
float descriptor[1980];
float rf[9];
-
+ static int descriptorSize () { return 1980; }
+
friend std::ostream& operator << (std::ostream& os, const ShapeContext1980& p);
};
{
float descriptor[352];
float rf[9];
-
+ static int descriptorSize () { return 352; }
+
friend std::ostream& operator << (std::ostream& os, const SHOT352& p);
};
{
float descriptor[1344];
float rf[9];
-
+ static int descriptorSize () { return 1344; }
+
friend std::ostream& operator << (std::ostream& os, const SHOT1344& p);
};
struct FPFHSignature33
{
float histogram[33];
-
+ static int descriptorSize () { return 33; }
+
friend std::ostream& operator << (std::ostream& os, const FPFHSignature33& p);
};
struct VFHSignature308
{
float histogram[308];
-
+ static int descriptorSize () { return 308; }
+
friend std::ostream& operator << (std::ostream& os, const VFHSignature308& p);
};
struct ESFSignature640
{
float histogram[640];
-
+ static int descriptorSize () { return 640; }
+
friend std::ostream& operator << (std::ostream& os, const ESFSignature640& p);
};
struct GFPFHSignature16
{
float histogram[16];
- static int descriptorSize() { return 16; }
+ static int descriptorSize () { return 16; }
friend std::ostream& operator << (std::ostream& os, const GFPFHSignature16& p);
};
{
float x, y, z, roll, pitch, yaw;
float descriptor[36];
-
+ static int descriptorSize () { return 36; }
+
friend std::ostream& operator << (std::ostream& os, const Narf36& p);
};
struct Histogram
{
float histogram[N];
+ static int descriptorSize () { return N; }
};
struct EIGEN_ALIGN16 _PointWithScale
{
struct
{
- // RGB union
- union
- {
- struct
- {
- uint8_t b;
- uint8_t g;
- uint8_t r;
- uint8_t a;
- };
- float rgb;
- uint32_t rgba;
- };
+ PCL_ADD_UNION_RGB;
float radius;
float confidence;
float curvature;
};
float data_c[4];
};
+ PCL_ADD_EIGEN_MAPS_RGB;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
/** \brief Get a pointer to the input point cloud dataset. */
inline PointCloudConstPtr const
- getInputCloud () { return (input_); }
+ getInputCloud () const { return (input_); }
/** \brief Provide a pointer to the vector of indices that represents the input data.
* \param[in] indices a pointer to the indices that represent the input data.
inline IndicesPtr const
getIndices () { return (indices_); }
+ /** \brief Get a pointer to the vector of indices used. */
+ inline IndicesConstPtr const
+ getIndices () const { return (indices_); }
+
/** \brief Override PointCloud operator[] to shorten code
* \note this method can be called instead of (*input_)[(*indices_)[pos]]
* or input_->points[(*indices_)[pos]]
* \param[in] pos position in indices_ vector
*/
- inline const PointT& operator[] (size_t pos)
+ inline const PointT& operator[] (size_t pos) const
{
return ((*input_)[(*indices_)[pos]]);
}
#elif ANDROID
// Use the math.h macros
# include <math.h>
-# define pcl_isnan(x) isnan(x)
-# define pcl_isfinite(x) isfinite(x)
-# define pcl_isinf(x) isinf(x)
+# define pcl_isnan(x) std::isnan(x)
+# define pcl_isfinite(x) std::isfinite(x)
+# define pcl_isinf(x) std::isinf(x)
#elif _GLIBCXX_USE_C99_MATH
// Are the C++ cmath functions enabled?
#endif
#if (defined(__GNUC__) && PCL_LINEAR_VERSION(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) < PCL_LINEAR_VERSION(4,5,0) && ! defined(__clang__)) || defined(__INTEL_COMPILER)
-#define PCL_DEPRECATED(func, message) func __attribute__ ((deprecated))
+#define PCL_DEPRECATED(message) __attribute__ ((deprecated))
#endif
// gcc supports this starting from 4.5 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43666
#if (defined(__GNUC__) && PCL_LINEAR_VERSION(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) >= PCL_LINEAR_VERSION(4,5,0)) || (defined(__clang__) && __has_extension(attribute_deprecated_with_message))
-#define PCL_DEPRECATED(func, message) func __attribute__ ((deprecated(message)))
+#define PCL_DEPRECATED(message) __attribute__ ((deprecated(message)))
#endif
#ifdef _MSC_VER
-#define PCL_DEPRECATED(func, message) __declspec(deprecated(message)) func
+#define PCL_DEPRECATED(message) __declspec(deprecated(message))
#endif
#ifndef PCL_DEPRECATED
#pragma message("WARNING: You need to implement PCL_DEPRECATED for this compiler")
-#define PCL_DEPRECATED(func) func
+#define PCL_DEPRECATED(message)
#endif
#ifndef PCL_TEST_MACROS
#define PCL_TEST_MACROS
+#include <Eigen/Core>
+
+/** \file pcl_tests.h
+ * Helper macros for testing equality of various data fields in PCL points */
+
namespace pcl
{
+
/** test_macros.h provide helper macros for testing vectors, matrices etc.
* We took some liberty with upcasing names to make them look like googletest
* macros names so that reader is not confused.
*
- * \author Nizar Sallem
+ * This file also provides a family of googletest-style macros for asserting
+ * equality or nearness of xyz, normal, and rgba fields.
+ *
+ * \author Nizar Sallem, Sergey Alexandrov
*/
+
namespace test
{
+
template <typename V1, typename V2>
void EXPECT_EQ_VECTORS (const V1& v1, const V2& v2)
{
for (size_t i = 0; i < length; ++i)
EXPECT_NEAR (v1[i], v2[i], epsilon);
}
+
+ namespace internal
+ {
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult XYZEQ (const char* expr1,
+ const char* expr2,
+ const Point1T& p1,
+ const Point2T& p2)
+ {
+ if ((p1).getVector3fMap ().cwiseEqual ((p2).getVector3fMap ()).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Value of: " << expr2 << ".getVector3fMap ()" << std::endl
+ << " Actual: " << p2.getVector3fMap ().transpose () << std::endl
+ << "Expected: " << expr1 << ".getVector3fMap ()" << std::endl
+ << "Which is: " << p1.getVector3fMap ().transpose ();
+ }
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult XYZNear (const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ const Point1T& p1,
+ const Point2T& p2,
+ double abs_error)
+ {
+ const Eigen::Vector3f diff = ((p1).getVector3fMap () -
+ (p2).getVector3fMap ()).cwiseAbs ();
+ if ((diff.array () < abs_error).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Some of the element-wise differences exceed " << abs_error_expr
+ << " (which evaluates to " << abs_error << ")" << std::endl
+ << "Difference: " << diff.transpose () << std::endl
+ << " Value of: " << expr2 << ".getVector3fMap ()" << std::endl
+ << " Actual: " << p2.getVector3fMap ().transpose () << std::endl
+ << " Expected: " << expr1 << ".getVector3fMap ()" << std::endl
+ << " Which is: " << p1.getVector3fMap ().transpose ();
+ }
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult NormalEQ (const char* expr1,
+ const char* expr2,
+ const Point1T& p1,
+ const Point2T& p2)
+ {
+ if ((p1).getNormalVector3fMap ().cwiseEqual ((p2).getNormalVector3fMap ()).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Value of: " << expr2 << ".getNormalVector3fMap ()" << std::endl
+ << " Actual: " << p2.getNormalVector3fMap ().transpose () << std::endl
+ << "Expected: " << expr1 << ".getNormalVector3fMap ()" << std::endl
+ << "Which is: " << p1.getNormalVector3fMap ().transpose ();
+ }
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult NormalNear (const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ const Point1T& p1,
+ const Point2T& p2,
+ double abs_error)
+ {
+ const Eigen::Vector3f diff = ((p1).getNormalVector3fMap () -
+ (p2).getNormalVector3fMap ()).cwiseAbs ();
+ if ((diff.array () < abs_error).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Some of the element-wise differences exceed " << abs_error_expr
+ << " (which evaluates to " << abs_error << ")" << std::endl
+ << "Difference: " << diff.transpose () << std::endl
+ << " Value of: " << expr2 << ".getNormalVector3fMap ()" << std::endl
+ << " Actual: " << p2.getNormalVector3fMap ().transpose () << std::endl
+ << " Expected: " << expr1 << ".getNormalVector3fMap ()" << std::endl
+ << " Which is: " << p1.getNormalVector3fMap ().transpose ();
+ }
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult RGBEQ (const char* expr1,
+ const char* expr2,
+ const Point1T& p1,
+ const Point2T& p2)
+ {
+ if ((p1).getRGBVector3i ().cwiseEqual ((p2).getRGBVector3i ()).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Value of: " << expr2 << ".getRGBVector3i ()" << std::endl
+ << " Actual: " << p2.getRGBVector3i ().transpose () << std::endl
+ << "Expected: " << expr1 << ".getRGBVector3i ()" << std::endl
+ << "Which is: " << p1.getRGBVector3i ().transpose ();
+ }
+
+ template <typename Point1T, typename Point2T>
+ ::testing::AssertionResult RGBAEQ (const char* expr1,
+ const char* expr2,
+ const Point1T& p1,
+ const Point2T& p2)
+ {
+ if ((p1).getRGBAVector4i ().cwiseEqual ((p2).getRGBAVector4i ()).all ())
+ return ::testing::AssertionSuccess ();
+ return ::testing::AssertionFailure ()
+ << "Value of: " << expr2 << ".getRGBAVector4i ()" << std::endl
+ << " Actual: " << p2.getRGBAVector4i ().transpose () << std::endl
+ << "Expected: " << expr1 << ".getRGBAVector4i ()" << std::endl
+ << "Which is: " << p1.getRGBAVector4i ().transpose ();
+ }
+
+ }
+
}
+
}
+/// Expect that each of x, y, and z fields are equal in
+/// two points.
+#define EXPECT_XYZ_EQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::pcl::test::internal::XYZEQ, \
+ (expected), (actual))
+
+/// Assert that each of x, y, and z fields are equal in
+/// two points.
+#define ASSERT_XYZ_EQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::pcl::test::internal::XYZEQ, \
+ (expected), (actual))
+
+/// Expect that differences between x, y, and z fields in
+/// two points are each within abs_error.
+#define EXPECT_XYZ_NEAR(expected, actual, abs_error) \
+ EXPECT_PRED_FORMAT3(::pcl::test::internal::XYZNear, \
+ (expected), (actual), abs_error)
+
+/// Assert that differences between x, y, and z fields in
+/// two points are each within abs_error.
+#define ASSERT_XYZ_NEAR(expected, actual, abs_error) \
+ EXPECT_PRED_FORMAT3(::pcl::test::internal::XYZNear, \
+ (expected), (actual), abs_error)
+
+/// Expect that each of normal_x, normal_y, and normal_z
+/// fields are equal in two points.
+#define EXPECT_NORMAL_EQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::pcl::test::internal::NormalEQ, \
+ (expected), (actual))
+
+/// Assert that each of normal_x, normal_y, and normal_z
+/// fields are equal in two points.
+#define ASSERT_NORMAL_EQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::pcl::test::internal::NormalEQ, \
+ (expected), (actual))
+
+/// Expect that differences between normal_x, normal_y,
+/// and normal_z fields in two points are each within
+/// abs_error.
+#define EXPECT_NORMAL_NEAR(expected, actual, abs_error) \
+ EXPECT_PRED_FORMAT3(::pcl::test::internal::NormalNear, \
+ (expected), (actual), abs_error)
+
+/// Assert that differences between normal_x, normal_y,
+/// and normal_z fields in two points are each within
+/// abs_error.
+#define ASSERT_NORMAL_NEAR(expected, actual, abs_error) \
+ EXPECT_PRED_FORMAT3(::pcl::test::internal::NormalNear, \
+ (expected), (actual), abs_error)
+
+/// Expect that each of r, g, and b fields are equal in
+/// two points.
+#define EXPECT_RGB_EQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::pcl::test::internal::RGBEQ, \
+ (expected), (actual))
+
+/// Assert that each of r, g, and b fields are equal in
+/// two points.
+#define ASSERT_RGB_EQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::pcl::test::internal::RGBEQ, \
+ (expected), (actual))
+
+/// Expect that each of r, g, b, and a fields are equal
+/// in two points.
+#define EXPECT_RGBA_EQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::pcl::test::internal::RGBAEQ, \
+ (expected), (actual))
+
+/// Assert that each of r, g, b, and a fields are equal
+/// in two points.
+#define ASSERT_RGBA_EQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::pcl::test::internal::RGBAEQ, \
+ (expected), (actual))
+
#endif
#include <boost/mpl/bool.hpp>
#endif
+// This is required for the workaround at line 109
+#ifdef _MSC_VER
+#include <Eigen/Core>
+#include <Eigen/src/StlSupport/details.h>
+#endif
+
namespace pcl
{
typedef PointT type;
};
+#ifdef _MSC_VER
+
+ /* Sometimes when calling functions like `copyPoint()` or `copyPointCloud`
+ * without explicitly specifying point types, MSVC deduces them to be e.g.
+ * `Eigen::internal::workaround_msvc_stl_support<pcl::PointXYZ>` instead of
+ * plain `pcl::PointXYZ`. Subsequently these types are passed to meta-
+ * functions like `has_field` or `fieldList` and make them choke. This hack
+ * makes use of the fact that internally `fieldList` always applies `POD` to
+ * its argument type. This specialization therefore allows to unwrap the
+ * contained point type. */
+ template<typename PointT>
+ struct POD<Eigen::internal::workaround_msvc_stl_support<PointT> >
+ {
+ typedef PointT type;
+ };
+
+#endif
+
// name
/* This really only depends on Tag, but we go through some gymnastics to avoid ODR violations.
We template it on the point type PointT to avoid ODR violations when registering multiple
}
};
- /** \brief A helper functor that can copy a specific value if the given field exists. */
+ /** \brief A helper functor that can copy a specific value if the given field exists.
+ *
+ * \note In order to actually copy the value an instance of this functor should be passed
+ * to a pcl::for_each_type loop. See the example below.
+ *
+ * \code
+ * PointInT p;
+ * bool exists;
+ * float value;
+ * typedef typename pcl::traits::fieldList<PointInT>::type FieldList;
+ * pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<PointT, float> (p, "intensity", exists, value));
+ * \endcode
+ */
template <typename PointInT, typename OutT>
struct CopyIfFieldExists
{
OutT &value_;
};
- /** \brief A helper functor that can set a specific value in a field if the field exists. */
+ /** \brief A helper functor that can set a specific value in a field if the field exists.
+ *
+ * \note In order to actually set the value an instance of this functor should be passed
+ * to a pcl::for_each_type loop. See the example below.
+ *
+ * \code
+ * PointT p;
+ * typedef typename pcl::traits::fieldList<PointT>::type FieldList;
+ * pcl::for_each_type<FieldList> (pcl::SetIfFieldExists<PointT, float> (p, "intensity", 42.0f));
+ * \endcode
+ */
template <typename PointOutT, typename InT>
struct SetIfFieldExists
{
#include <pcl/pcl_macros.h>
#include <bitset>
#include <pcl/register_point_struct.h>
+#include <boost/mpl/contains.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/vector.hpp>
/**
* \file pcl/point_types.h
*/
struct PPFSignature;
+ /** \brief Members: float f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, alpha_m
+ * \ingroup common
+ */
+ struct CPPFSignature;
+
/** \brief Members: float f1, f2, f3, f4, r_ratio, g_ratio, b_ratio, alpha_m
* \ingroup common
*/
(float, alpha_m, alpha_m)
)
+POINT_CLOUD_REGISTER_POINT_STRUCT (pcl::CPPFSignature,
+ (float, f1, f1)
+ (float, f2, f2)
+ (float, f3, f3)
+ (float, f4, f4)
+ (float, f5, f5)
+ (float, f6, f6)
+ (float, f7, f7)
+ (float, f8, f8)
+ (float, f9, f9)
+ (float, f10, f10)
+ (float, alpha_m, alpha_m)
+)
+
POINT_CLOUD_REGISTER_POINT_STRUCT (pcl::PPFRGBSignature,
(float, f1, f1)
(float, f2, f2)
}
}
};
+
+ namespace traits
+ {
+
+ /** \brief Metafunction to check if a given point type has a given field.
+ *
+ * Example usage at run-time:
+ *
+ * \code
+ * bool curvature_available = pcl::traits::has_field<PointT, pcl::fields::curvature>::value;
+ * \endcode
+ *
+ * Example usage at compile-time:
+ *
+ * \code
+ * BOOST_MPL_ASSERT_MSG ((pcl::traits::has_field<PointT, pcl::fields::label>::value),
+ * POINT_TYPE_SHOULD_HAVE_LABEL_FIELD,
+ * (PointT));
+ * \endcode
+ */
+ template <typename PointT, typename Field>
+ struct has_field : boost::mpl::contains<typename pcl::traits::fieldList<PointT>::type, Field>::type
+ { };
+
+ /** Metafunction to check if a given point type has all given fields. */
+ template <typename PointT, typename Field>
+ struct has_all_fields : boost::mpl::fold<Field,
+ boost::mpl::bool_<true>,
+ boost::mpl::and_<boost::mpl::_1,
+ has_field<PointT, boost::mpl::_2> > >::type
+ { };
+
+ /** Metafunction to check if a given point type has any of the given fields. */
+ template <typename PointT, typename Field>
+ struct has_any_field : boost::mpl::fold<Field,
+ boost::mpl::bool_<false>,
+ boost::mpl::or_<boost::mpl::_1,
+ has_field<PointT, boost::mpl::_2> > >::type
+ { };
+
+ /** Metafunction to check if a given point type has x, y, and z fields. */
+ template <typename PointT>
+ struct has_xyz : has_all_fields<PointT, boost::mpl::vector<pcl::fields::x,
+ pcl::fields::y,
+ pcl::fields::z> >
+ { };
+
+ /** Metafunction to check if a given point type has normal_x, normal_y, and
+ * normal_z fields. */
+ template <typename PointT>
+ struct has_normal : has_all_fields<PointT, boost::mpl::vector<pcl::fields::normal_x,
+ pcl::fields::normal_y,
+ pcl::fields::normal_z> >
+ { };
+
+ /** Metafunction to check if a given point type has curvature field. */
+ template <typename PointT>
+ struct has_curvature : has_field<PointT, pcl::fields::curvature>
+ { };
+
+ /** Metafunction to check if a given point type has intensity field. */
+ template <typename PointT>
+ struct has_intensity : has_field<PointT, pcl::fields::intensity>
+ { };
+
+ /** Metafunction to check if a given point type has either rgb or rgba field. */
+ template <typename PointT>
+ struct has_color : has_any_field<PointT, boost::mpl::vector<pcl::fields::rgb,
+ pcl::fields::rgba> >
+ { };
+
+ /** Metafunction to check if a given point type has label field. */
+ template <typename PointT>
+ struct has_label : has_field<PointT, pcl::fields::label>
+ { };
+
+ }
+
} // namespace pcl
#if defined _MSC_VER
out.x = in.x; out.y = in.y; out.z = in.z;
if (in.s == 0)
{
- out.r = out.g = out.b = static_cast<uint8_t> (in.v);
+ out.r = out.g = out.b = static_cast<uint8_t> (255 * in.v);
return;
}
float a = in.h / 60;
* \param[in] focal the focal length
* \param[out] out the output pointcloud
* **/
- void
+ inline void
PointCloudDepthAndRGBtoXYZRGBA (PointCloud<Intensity>& depth,
PointCloud<RGB>& image,
float& focal,
PointCloud<PointXYZRGBA>& out)
{
float bad_point = std::numeric_limits<float>::quiet_NaN();
- int width_ = depth.width;
- int height_ = depth.height;
+ size_t width_ = depth.width;
+ size_t height_ = depth.height;
float constant_ = 1.0f / focal;
- for(unsigned int v = 0; v < height_; v++)
+ for (size_t v = 0; v < height_; v++)
{
- for(unsigned int u = 0; u < width_; u++)
+ for (size_t u = 0; u < width_; u++)
{
PointXYZRGBA pt;
pt.a = 0;
- float depth_ = depth.at(u,v).intensity;
+ float depth_ = depth.at (u, v).intensity;
if (depth_ == 0)
{
pt.x = static_cast<float> (u) * pt.z * constant_;
pt.y = static_cast<float> (v) * pt.z * constant_;
}
- pt.r = image.at(u,v).r;
- pt.g = image.at(u,v).g;
- pt.b = image.at(u,v).b;
+ pt.r = image.at (u, v).r;
+ pt.g = image.at (u, v).g;
+ pt.b = image.at (u, v).b;
- out.points.push_back(pt);
+ out.points.push_back (pt);
}
}
out.width = width_;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2013, Intelligent Robotics Lab, DLUT.
+ * Author: Qinghua Li, Yan Zhuang, Fei Yan
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Intelligent Robotics Lab, DLUT. nor the names
+ * of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file bearing_angle_image.h
+ * \Created on: July 07, 2012
+ */
+
+#ifndef PCL_BEARING_ANGLE_IMAGE_H_
+#define PCL_BEARING_ANGLE_IMAGE_H_
+
+#include <cmath>
+#include <pcl/point_types.h>
+#include <pcl/point_cloud.h>
+
+namespace pcl
+{
+ /** \brief class BearingAngleImage is used as an interface to generate Bearing Angle(BA) image.
+ * \author: Qinghua Li (qinghua__li@163.com)
+ */
+ class BearingAngleImage : public pcl::PointCloud<PointXYZRGBA>
+ {
+ public:
+ // ===== TYPEDEFS =====
+ typedef pcl::PointCloud<PointXYZRGBA> BaseClass;
+
+ // =====CONSTRUCTOR & DESTRUCTOR=====
+ /** Constructor */
+ BearingAngleImage ();
+ /** Destructor */
+ virtual ~BearingAngleImage ();
+
+ public:
+ /** \brief Reset all values to an empty Bearing Angle image */
+ void
+ reset ();
+
+ /** \brief Calculate the angle between the laser beam and the segment joining two consecutive
+ * measurement points.
+ * \param point1
+ * \param point2
+ */
+ double
+ getAngle (const PointXYZ &point1, const PointXYZ &point2);
+
+ /** \brief Transform 3D point cloud into a 2D Bearing Angle(BA) image */
+ void
+ generateBAImage (PointCloud<PointXYZ>& point_cloud);
+
+ protected:
+ /**< This point is used to be able to return a reference to a unknown gray point */
+ PointXYZRGBA unobserved_point_;
+ };
+}
+
+#endif // PCL_BEARING_ANGLE_IMAGE_H_
* individual pixels in the image in the x-direction
* \param angular_resolution_y the angular difference (in radians) between the
* individual pixels in the image in the y-direction
- * \param angular_resolution the angle (in radians) between each sample in the depth image
* \param point_cloud_center the center of bounding sphere
* \param point_cloud_radius the radius of the bounding sphere
* \param sensor_pose an affine matrix defining the pose of the sensor (defaults to
* createMapping<PointT> (msg.fields, field_map);
* \endcode
*/
- PCL_DEPRECATED (template <typename PointT> void fromROSMsg (
- const pcl::PCLPointCloud2& msg, pcl::PointCloud<PointT>& cloud,
- const MsgFieldMap& field_map),
- "pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.");
-
- template <typename PointT> void
+ template <typename PointT>
+ PCL_DEPRECATED ("pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.")
+ void
fromROSMsg (const pcl::PCLPointCloud2& msg, pcl::PointCloud<PointT>& cloud,
const MsgFieldMap& field_map)
{
* \param[in] msg the PCLPointCloud2 binary blob
* \param[out] cloud the resultant pcl::PointCloud<T>
*/
- PCL_DEPRECATED (template<typename PointT> void fromROSMsg (
- const pcl::PCLPointCloud2& msg, pcl::PointCloud<PointT>& cloud),
- "pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.");
- template<typename PointT> void
+ template<typename PointT>
+ PCL_DEPRECATED ("pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.")
+ void
fromROSMsg (const pcl::PCLPointCloud2& msg, pcl::PointCloud<PointT>& cloud)
{
fromPCLPointCloud2 (msg, cloud);
* \param[in] cloud the input pcl::PointCloud<T>
* \param[out] msg the resultant PCLPointCloud2 binary blob
*/
- PCL_DEPRECATED (template<typename PointT> void toROSMsg (
- const pcl::PointCloud<PointT>& cloud, pcl::PCLPointCloud2& msg),
- "pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.");
- template<typename PointT> void
+ template<typename PointT>
+ PCL_DEPRECATED ("pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.")
+ void
toROSMsg (const pcl::PointCloud<PointT>& cloud, pcl::PCLPointCloud2& msg)
{
toPCLPointCloud2 (cloud, msg);
* CloudT cloud type, CloudT should be akin to pcl::PointCloud<pcl::PointXYZRGBA>
* \note will throw std::runtime_error if there is a problem
*/
- PCL_DEPRECATED (template<typename CloudT> void toROSMsg (
- const CloudT& cloud, pcl::PCLImage& msg),
- "pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.");
- template<typename CloudT> void
+ template<typename CloudT>
+ PCL_DEPRECATED ("pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.")
+ void
toROSMsg (const CloudT& cloud, pcl::PCLImage& msg)
{
toPCLPointCloud2 (cloud, msg);
* \param msg the resultant pcl::PCLImage
* will throw std::runtime_error if there is a problem
*/
- PCL_DEPRECATED (inline void toROSMsg (
- const pcl::PCLPointCloud2& cloud, pcl::PCLImage& msg),
- "pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.");
inline void
+ PCL_DEPRECATED ("pcl::fromROSMsg is deprecated, please use fromPCLPointCloud2 instead.")
toROSMsg (const pcl::PCLPointCloud2& cloud, pcl::PCLImage& msg)
{
toPCLPointCloud2 (cloud, msg);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2013, Intelligent Robotics Lab, DLUT.
+ * Author: Qinghua Li, Yan Zhuang, Fei Yan
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Intelligent Robotics Lab, DLUT. nor the names
+ * of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file bearing_angle_image.cpp
+ * \created on: July 07, 2012
+ * \author: Qinghua Li (qinghua__li@163.com)
+ */
+
+#include <pcl/common/eigen.h>
+#include <pcl/range_image/bearing_angle_image.h>
+
+namespace pcl
+{
+/////////////////////////////////////////////////////////
+BearingAngleImage::BearingAngleImage () :
+ BearingAngleImage::BaseClass (),
+ unobserved_point_ ()
+{
+ reset ();
+ unobserved_point_.x = unobserved_point_.y = unobserved_point_.z = 0.0;
+ unobserved_point_.rgba = 255;
+}
+
+/////////////////////////////////////////////////////////
+BearingAngleImage::~BearingAngleImage ()
+{
+}
+
+/////////////////////////////////////////////////////////
+void
+BearingAngleImage::reset ()
+{
+ width = height = 0;
+ points.clear ();
+}
+
+/////////////////////////////////////////////////////////
+double
+BearingAngleImage::getAngle (const PointXYZ &point1, const PointXYZ &point2)
+{
+ double a, b, c;
+ double theta;
+ const Eigen::Vector3f& p1 = point1.getVector3fMap ();
+ const Eigen::Vector3f& p2 = point2.getVector3fMap ();
+ a = p1.squaredNorm ();
+ b = (p1 - p2).squaredNorm ();
+ c = p2.squaredNorm ();
+
+ if (a != 0 && b != 0)
+ {
+ theta = acos ((a + b - c) / (2 * sqrt (a) * sqrt (b))) * 180 / M_PI;
+ }
+ else
+ {
+ theta = 0.0;
+ }
+
+ return theta;
+}
+
+/////////////////////////////////////////////////////////
+void
+BearingAngleImage::generateBAImage (PointCloud<PointXYZ>& point_cloud)
+{
+ width = point_cloud.width;
+ height = point_cloud.height;
+ unsigned int size = width * height;
+ points.clear ();
+ points.resize (size, unobserved_point_);
+
+ double theta;
+ uint8_t r, g, b, gray;
+
+ // primary transformation process
+ for (int i = 0; i < static_cast<int> (height) - 1; ++i)
+ {
+ for (int j = 0; j < static_cast<int> (width) - 1; ++j)
+ {
+ theta = getAngle (point_cloud.at (j, i + 1), point_cloud.at (j + 1, i));
+
+ // based on the theta, calculate the gray value of every pixel point
+ gray = theta * 255 / 180;
+ r = gray;
+ g = gray;
+ b = gray;
+
+ points[(i + 1) * width + j].x = point_cloud.at (j, i + 1).x;
+ points[(i + 1) * width + j].y = point_cloud.at (j, i + 1).y;
+ points[(i + 1) * width + j].z = point_cloud.at (j, i + 1).z;
+ // set the gray value for every pixel point
+ points[(i + 1) * width + j].rgba = ((int)r) << 24 | ((int)g) << 16 | ((int)b) << 8 | 0xff;
+ }
+ }
+}
+
+} // namespace end
+++ /dev/null
-/*
- * Software License Agreement (BSD License)
- *
- * Copyright (c) 2010, Willow Garage, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of the copyright holder(s) nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id$
- *
- */
-
-#include <pcl/common/intersections.h>
-#include <pcl/console/print.h>
-
-bool
-pcl::lineWithLineIntersection (const Eigen::VectorXf &line_a,
- const Eigen::VectorXf &line_b,
- Eigen::Vector4f &point, double sqr_eps)
-{
- Eigen::Vector4f p1, p2;
- lineToLineSegment (line_a, line_b, p1, p2);
-
- // If the segment size is smaller than a pre-given epsilon...
- double sqr_dist = (p1 - p2).squaredNorm ();
- if (sqr_dist < sqr_eps)
- {
- point = p1;
- return (true);
- }
- point.setZero ();
- return (false);
-}
-
-bool
-pcl::lineWithLineIntersection (const pcl::ModelCoefficients &line_a,
- const pcl::ModelCoefficients &line_b,
- Eigen::Vector4f &point, double sqr_eps)
-{
- Eigen::VectorXf coeff1 = Eigen::VectorXf::Map (&line_a.values[0], line_a.values.size ());
- Eigen::VectorXf coeff2 = Eigen::VectorXf::Map (&line_b.values[0], line_b.values.size ());
- return (lineWithLineIntersection (coeff1, coeff2, point, sqr_eps));
-}
-
-bool
-pcl::planeWithPlaneIntersection (const Eigen::Vector4f &plane_a,
- const Eigen::Vector4f &plane_b,
- Eigen::VectorXf &line,
- double angular_tolerance)
-{
- //planes shouldn't be parallel
- double test_cosine = plane_a.head<3>().dot(plane_b.head<3>());
- double upper_limit = 1 + angular_tolerance;
- double lower_limit = 1 - angular_tolerance;
-
- if ((test_cosine < upper_limit) && (test_cosine > lower_limit))
- {
- PCL_ERROR ("Plane A and Plane B are Parallel");
- return (false);
- }
-
- if ((test_cosine > -upper_limit) && (test_cosine < -lower_limit))
- {
- PCL_ERROR ("Plane A and Plane B are Parallel");
- return (false);
- }
-
- Eigen::Vector4f line_direction = plane_a.cross3(plane_b);
- line_direction.normalized();
-
- //construct system of equations using lagrange multipliers with one objective function and two constraints
- Eigen::MatrixXf langegrange_coefs(5,5);
- langegrange_coefs << 2,0,0,plane_a[0],plane_b[0], 0,2,0,plane_a[1],plane_b[1], 0,0,2, plane_a[2], plane_b[2], plane_a[0], plane_a[1] , plane_a[2], 0,0, plane_b[0], plane_b[1], plane_b[2], 0,0;
-
- Eigen::VectorXf b;
- b.resize(5);
- b << 0, 0, 0, -plane_a[3], -plane_b[3];
-
- //solve for the lagrange Multipliers
- Eigen::VectorXf x;
- x.resize(5);
- x = langegrange_coefs.colPivHouseholderQr().solve(b);
-
- line.resize(6);
- line.head<3>() = x.head<3>(); // the x[3] and x[4] are the values of the lagrange multipliers and are neglected
- line[3] = line_direction[0];
- line[4] = line_direction[1];
- line[5] = line_direction[2];
- return true;
-}
cloud_out.data = cloud_in.data;
}
+////////////////////////////////////////////////////////////////////////////////
+int
+pcl::interpolatePointIndex (int p, int len, InterpolationType type)
+{
+ if (static_cast<unsigned> (p) >= static_cast<unsigned> (len))
+ {
+ if (type == BORDER_REPLICATE)
+ p = p < 0 ? 0 : len - 1;
+ else if (type == BORDER_REFLECT || type == BORDER_REFLECT_101)
+ {
+ int delta = type == BORDER_REFLECT_101;
+ if (len == 1)
+ return 0;
+ do
+ {
+ if (p < 0)
+ p = -p - 1 + delta;
+ else
+ p = len - 1 - (p - len) - delta;
+ }
+ while (static_cast<unsigned> (p) >= static_cast<unsigned> (len));
+ }
+ else if (type == BORDER_WRAP)
+ {
+ if (p < 0)
+ p -= ((p-len+1)/len)*len;
+ if (p >= len)
+ p %= len;
+ }
+ else if (type == BORDER_CONSTANT)
+ p = -1;
+ else
+ {
+ PCL_THROW_EXCEPTION (BadArgumentException,
+ "[pcl::interpolate_point_index] error: Unhandled interpolation type "
+ << type << " !");
+ }
+ }
+
+ return (p);
+}
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 2 && debug)
{
- print_error ("[parse_2x_arguments] Number of values for %s (%zu) different than 2!\n", str, values.size ());
+ print_error ("[parse_2x_arguments] Number of values for %s (%lu) different than 2!\n", str, values.size ());
return (-2);
}
f = static_cast<float> (atof (values.at (0).c_str ()));
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 2 && debug)
{
- print_error ("[parse_2x_arguments] Number of values for %s (%zu) different than 2!\n", str, values.size ());
+ print_error ("[parse_2x_arguments] Number of values for %s (%lu) different than 2!\n", str, values.size ());
return (-2);
}
f = atof (values.at (0).c_str ());
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 2 && debug)
{
- print_error ("[parse_2x_arguments] Number of values for %s (%zu) different than 2!\n", str, values.size ());
+ print_error ("[parse_2x_arguments] Number of values for %s (%lu) different than 2!\n", str, values.size ());
return (-2);
}
f = atoi (values.at (0).c_str ());
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 3 && debug)
{
- print_error ("[parse_3x_arguments] Number of values for %s (%zu) different than 3!\n", str, values.size ());
+ print_error ("[parse_3x_arguments] Number of values for %s (%lu) different than 3!\n", str, values.size ());
return (-2);
}
f = static_cast<float> (atof (values.at (0).c_str ()));
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 3 && debug)
{
- print_error ("[parse_3x_arguments] Number of values for %s (%zu) different than 3!\n", str, values.size ());
+ print_error ("[parse_3x_arguments] Number of values for %s (%lu) different than 3!\n", str, values.size ());
return (-2);
}
f = atof (values.at (0).c_str ());
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 3 && debug)
{
- print_error ("[parse_3x_arguments] Number of values for %s (%zu) different than 3!\n", str, values.size ());
+ print_error ("[parse_3x_arguments] Number of values for %s (%lu) different than 3!\n", str, values.size ());
return (-2);
}
f = atoi (values.at (0).c_str ());
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 2)
{
- print_error ("[parse_multiple_2x_arguments] Number of values for %s (%zu) different than 2!\n", str, values.size ());
+ print_error ("[parse_multiple_2x_arguments] Number of values for %s (%lu) different than 2!\n", str, values.size ());
return (false);
}
f = atof (values.at (0).c_str ());
boost::split (values, argv[i], boost::is_any_of (","), boost::token_compress_on);
if (values.size () != 3)
{
- print_error ("[parse_multiple_3x_arguments] Number of values for %s (%zu) different than 3!\n", str, values.size ());
+ print_error ("[parse_multiple_3x_arguments] Number of values for %s (%lu) different than 3!\n", str, values.size ());
return (false);
}
f = atof (values.at (0).c_str ());
}
catch (std::bad_alloc)
{
- PCL_ERROR ("[initCompute] Failed to allocate %zu indices.\n", (input_->width * input_->height));
+ PCL_ERROR ("[initCompute] Failed to allocate %lu indices.\n", (input_->width * input_->height));
}
for (size_t i = 0; i < indices_->size (); ++i) { (*indices_)[i] = static_cast<int>(i); }
}
return (os);
}
+ std::ostream&
+ operator << (std::ostream& os, const CPPFSignature& p)
+ {
+ os << "(" << p.f1 << ", " << p.f2 << ", " << p.f3 << ", " << p.f4 << ", " << p.f5 << ", " << p.f6 << ", " << p.f7 << ", " << p.f8 << ", " << p.f9 << ", " << p.f10 << ", " << p.alpha_m << ")";
+ return (os);
+ }
+
std::ostream&
operator << (std::ostream& os, const PPFRGBSignature& p)
{
+include(CMakeDependentOption)
+
+cmake_dependent_option(WITH_TUTORIALS "Build tutorials (requires Sphinx)" FALSE "WITH_DOCS" FALSE)
+if(WITH_TUTORIALS)
+ find_package(Sphinx)
+ if(SPHINX_FOUND)
+ set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees")
+ set(SPHINX_HTML_FILE_SUFFIX "html" CACHE STRING "Suffix (extension) of the HTML files generated by Sphinx")
+ endif(SPHINX_FOUND)
+endif(WITH_TUTORIALS)
+
add_subdirectory(doxygen)
+add_subdirectory(advanced)
add_subdirectory(tutorials)
--- /dev/null
+if(SPHINX_FOUND)
+ add_custom_target(advanced ALL
+ COMMAND "${SPHINX_EXECUTABLE}" -b html -a -d "${SPHINX_CACHE_DIR}" -D html_file_suffix=".${SPHINX_HTML_FILE_SUFFIX}" "${CMAKE_CURRENT_SOURCE_DIR}/content" html)
+ add_dependencies(advanced doc)
+ if(USE_PROJECT_FOLDERS)
+ set_target_properties(advanced PROPERTIES FOLDER "Documentation (Advanced)")
+ endif(USE_PROJECT_FOLDERS)
+ install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html"
+ DESTINATION "${DOC_INSTALL_DIR}/advanced"
+ COMPONENT doc)
+ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/content/files"
+ DESTINATION "${DOC_INSTALL_DIR}/advanced"
+ COMPONENT doc)
+endif(SPHINX_FOUND)
+++ /dev/null
-.PHONY: html
-
-html:
- -rm -rf html /tmp/doctrees
- sphinx-build -b html -a -d /tmp/doctrees content html
-
--- /dev/null
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+img {
+ border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+font-family: "Droid Serif", "DejaVu Serif", "Garamond", serif;
+font-size: 1.3em;
+color: #64794c;
+margin-bottom: 0;
+ margin-top: 0 !important;
+}
+
+.first img {
+max-width: none !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ clear: both;
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dt:target, .highlighted {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.refcount {
+ color: #060;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+white-space : pre-wrap; /*for Mozilla*/
+word-wrap: break-word; /*for IE*/
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+tt.descclassname {
+ background-color: transparent;
+}
+
+tt.xref, a tt {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
--- /dev/null
+/*
+ * sphinxdoc.css_t
+ * ~~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- sphinxdoc theme. Originally created by
+ * Armin Ronacher for Werkzeug.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ color: black;
+ padding: 0;
+ margin: 0px 80px 0px 80px;
+ min-width: 740px;
+}
+
+div.document {
+
+ text-align: left;
+
+
+}
+
+div.bodywrapper {
+ margin: 0 240px 0 0;
+ border-right: 1px solid #ccc;
+}
+
+div.body {
+ margin: 0;
+ padding: 0.5em 20px 20px 20px;
+}
+
+div.related {
+ font-size: 1em;
+}
+
+div.related ul {
+ background-image: url(navigation.png);
+ height: 2em;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+
+div.related ul li {
+ margin: 0;
+ padding: 0;
+ height: 2em;
+ float: left;
+}
+
+div.related ul li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related ul li a {
+ margin: 0;
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: #EE9816;
+}
+
+div.related ul li a:hover {
+ color: #3CA8E7;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ margin: 0;
+ padding: 0.5em 15px 15px 0;
+ width: 210px;
+ float: right;
+ font-size: 1em;
+ text-align: left;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin: 1em 0 0.5em 0;
+ font-size: 1em;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border: 1px solid #86989B;
+ background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+ color: white;
+}
+
+div.sphinxsidebar ul {
+ padding-left: 1.5em;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 20px;
+}
+
+div.footer {
+ background-color: #E3EFF1;
+ color: #86989B;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-size: 0.8em;
+ text-align: right;
+}
+
+div.footer a {
+ color: #86989B;
+ text-decoration: underline;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+div.body a {
+ text-decoration: underline;
+}
+
+h2 {
+/* color: #11557C;*/
+ margin: 1.3em 0 0.2em 0;
+ font-size: 1.35em;
+ padding: 0;
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+ color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+ display: none;
+ margin: 0 0 0 0.3em;
+ padding: 0 0.2em 0 0.2em;
+ color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+ display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+ color: #777;
+ background-color: #eee;
+}
+
+a.headerlink {
+ color: #c60f0f!important;
+ font-size: 1em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+cite, code, tt {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.01em;
+}
+
+tt {
+ background-color: #f2f2f2;
+ border-bottom: 1px solid #ddd;
+ color: #333;
+}
+
+tt.descname, tt.descclassname, tt.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+a tt {
+ border: 0;
+ color: #CA7900;
+}
+
+a tt:hover {
+ color: #2491CF;
+}
+
+pre {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.015em;
+ line-height: 120%;
+ padding: 0.5em;
+ border: 1px solid #ccc;
+ background-color: #f8f8f8;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 2px 7px;
+ border: 1px solid #ccc;
+}
+
+div.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition, div.warning {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 1px solid #86989B;
+ background-color: #f7f7f7;
+ padding: 0;
+}
+
+div.admonition p, div.warning p {
+ margin: 0.5em 1em 0.5em 1em;
+ padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+ margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+ margin: 0;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border-bottom: 1px solid #86989B;
+ font-weight: bold;
+ background-color: #AFC1C4;
+}
+
+div.warning {
+ border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+ background-color: #CF0000;
+ border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.versioninfo {
+ margin: 1em 0 0 0;
+ border: 1px solid #ccc;
+ background-color: #DDEAF0;
+ padding: 8px;
+ line-height: 1.3em;
+ font-size: 0.9em;
+}
+
+.viewcode-back {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<title>Documentation - Point Cloud Library (PCL)</title>
+</head>
{% extends "!layout.html" %}
{% block extrahead %}
+<?php
+define('MODX_CORE_PATH', '/var/www/pointclouds.org/core/');
+define('MODX_CONFIG_KEY', 'config');
+
+require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
+require_once MODX_CORE_PATH.'model/modx/modx.class.php';
+$modx = new modX();
+$modx->initialize('web');
+
+$snip = $modx->runSnippet("getSiteNavigation", array('id'=>5, 'phLevels'=>'sitenav.level0,sitenav.level1', 'showPageNav'=>'n'));
+$chunkOutput = $modx->getChunk("site-header", array('sitenav'=>$snip));
+$bodytag = str_replace("[[+showSubmenus:notempty=`", "", $chunkOutput);
+$bodytag = str_replace("`]]", "", $bodytag);
+echo $bodytag;
+echo "\n";
+?>
+<div id="pagetitle">
+<h1>Documentation</h1>
+<a id="donate" href="http://www.openperception.org/support/"><img src="/assets/images/donate-button.png" alt="Donate to the Open Perception foundation"/></a>
+</div>
+<div id="page-content">
{% endblock %}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
{% block rootrellink %}{% endblock %}
{% block sidebarsearch %}{% endblock %}
+
+{% block footer %}
+</div> <!-- #page-content -->
+
+<?php
+$chunkOutput = $modx->getChunk("site-footer");
+echo $chunkOutput;
+?>
+{% endblock %}
+</html>
+
+++ /dev/null
-.. _branches_repository:
-
-How to commit concurrently to trunk and branches
-------------------------------------------------
-
-Most often as a developer you will have to deal with the problem of either applying a commit to a particular branch, or pushing a modification that you just made on your machine to more than one branch. This simple example will show you one of the many ways of doing this.
-
-The example is given for a piece of code/patch that has to be committed to both **trunk** and one of the **branches** (1.x in this case).
-
-Before continuing, make sure your code compiles and tests carefully, and follows the indentation guidelines/C++ programming style (see :ref:`pcl_style_guide`). Then, follow this set of simple steps:
-
- 1. In case you checked out only one of the branches or trunk, go ahead and check out **svn+ssh://svn@svn.pointclouds.org/pcl** instead. As a developer you shouldn't worry too much for the extra space that the tags/branches will consume on your hard drive, but if you do, visit **http://svn.pointclouds.org** and check out all the branches that you want to work on individually. For the former::
-
- svn+ssh://svn@svn.pointclouds.org/pcl pcl
-
-
- This will give you both trunk, and all the branches, and tags.
-
- 2. Assuming that you're working in trunk, go ahead and do the following::
-
-
- cd pcl/trunk # change directory to where trunk is
- svn st -q # check to see what the commit queue contains
- svn diff . > /tmp/a.patch # obtain a patch of your code
-
- At this point */tmp/a.patch* will contain the patch that has to be pushed in the repository.
-
- 3. Change directory to the branch that you want to commit the same patch to, and do::
-
-
- cd pcl/branches/pcl-1.x # change directory to where the branch is
- patch -p0 < /tmp/a.patch # apply the patch
-
-
- One problem that we will have to deal with now is adding new files that have been added by your patch::
-
- svn st # check to see which files have "?" in the branch but should have "A" instead
- svn add <filename> # add all files that need to be added
-
- 4. If possible, commit both patches at the same time. Here, we're assuming that branches/pcl-1.x and trunk have the same root directory::
-
- cd pcl # change directory to where trunk+branches is
- svn st -q
- svn commit branches/ trunk/
-
- Alternatively, you can perform two individual commits in steps 2 and 3.
-
-
Using colorgcc to colorize output
---------------------------------
-`colorgcc<https://github.com/johannes/colorgcc>`_ is a colorizer for the output
+`colorgcc <https://github.com/johannes/colorgcc>`_ is a colorizer for the output
of GCC, and allows you to better interpret the compiler warnings/errors.
To enable both colorgcc and ccache, perform the following steps:
[pcl] $ mkdir build && cd build
[pcl/build] $ CC="distcc gcc" CXX="distcc g++" cmake ..
+ Sometimes compiling on systems supporting different SSE extensions will lead
+ to problems. Setting PCL_ENABLE_SSE to false will solve this, like::
+
+ [pcl/build] $ CC="distcc gcc" CXX="distcc g++" cmake -DPCL_ENABLE_SSE:BOOL=FALSE ../pcl
+
The output of ``CC="distcc gcc" CXX="distcc g++" cmake ..`` will generate
something like this. Please note that this is just an example and that the
messages might vary depending on your operating system and the way your
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="1">
<profile kind="CodeFormatterProfile" name="PCL" version="1">
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.lineSplit" value="80"/>
+<setting id="org.eclipse.cdt.core.formatter.lineSplit" value="160"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_member_access" value="0"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list" value="0"/>
<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list" value="83"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.tabulation.size" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_enumerator_list" value="48"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_declarator_list" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_declarator_list" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.join_wrapped_lines" value="true"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration" value="83"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block" value="next_line"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.continuation_indentation" value="2"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_expression_list" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression" value="34"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header" value="true"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration" value="80"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header" value="false"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_block" value="true"/>
-<setting id="org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="83"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.compact_else_if" value="true"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_switch" value="next_line"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain" value="16"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
-<setting id="org.eclipse.cdt.core.formatter.indentation.size" value="2"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indentation.size" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration" value="next_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
-<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
Both documentation sources are stored in our `Source repository
-<http://svn.pointclouds.org/pcl/>`_ and the web pages are generated hourly by
-our server via `crontab` jobs.
+<https://github.com/PointCloudLibrary/pcl>`_ and the web pages are generated
+hourly by our server via `crontab` jobs.
In the next two sections we will address both of the above, and present a small
example for each. We'll begin with the easiest of the two: adding a new
* http://www.siafoo.net/help/reST - has a nice tutorial/set of examples
Once you understand how reST works, look over our current set of tutorials for
-examples at http://svn.pointclouds.org/pcl/trunk/doc/tutorials/content/.
+examples at https://github.com/PointCloudLibrary/pcl/tree/master/doc/tutorials/content.
To add a new tutorial, simply create a new file, and send it to us together
with the images/videos that you want included in the tutorial. The best way to
-do this is to login to http://dev.pointclouds.org, create an issue on the
-tracker, and add the new tutorial as an attachement.
+do this is to login to https://github.com/PointCloudLibrary/pcl and send it as
+a pull request.
Improving the API documentation
check out the source code of PCL (we recommend trunk if you're going to start
editing the sources), like::
- svn co http://svn.pointclouds.org/pcl/trunk pcl
+ git clone https://github.com/PointCloudLibrary/pcl
Then, edit the file containing the function/class that you want to improve the
documentation for, say *common/include/pcl/point_cloud.h*, and go to the
What you have to modify is the Doxygen-style comment starting with /\*\* and
ending with \*/. See http://www.doxygen.org for more information.
-To send us the modification, please login to http://dev.pointclouds.org, create
-an issue on the tracker, and add the output of the following command to the
-issue::
-
- svn diff common/include/pcl/point_cloud.h
+To send us the modification, please send a pull request through Github.
Testing the modified API documentation
--------------------------------------
.. topic:: Rules
- * if you make any commits, please **_add the commit log_** or something similar **_to
+ * if you make important commits, please **_add the commit log_** or something similar **_to
the changelist page_**
- (http://dev.pointclouds.org/projects/pcl/wiki/ChangeList);
+ (https://github.com/PointCloudLibrary/pcl/blob/master/CHANGES.md);
* if you change anything in an existing algorithm, **_make sure that there are
unit tests_** for it and **_make sure that they pass before you commit_** the code;
Short documentation on how to add new, throw and handle exceptions in PCL.
-* :ref:`branches_repository`
-
- If you're not sure how to best make concurrent commits to the repository to both **trunk**, and any of the existing **branches**, see this example.
-
-
* :ref:`pcl2`
An in-depth discussion about the PCL 2.x API can be found here.
-Commiting changes to trunk
---------------------------
+Commiting changes to the git master
+-----------------------------------
In order to oversee the commit messages more easier and that the changelist looks homogenous please keep the following format:
"* <fixed|bugfix|changed|new> X in @<classname>@ (#<bug number>)"
documentation and tutorials/examples, please read our short guide on how to
start.
-..
- Profiling your code
+How to build a minimal example
+------------------------------
+* :ref:`minimal_example`
-Contents
---------
-
-.. toctree::
-
- c_cache
- distcc
- compiler_optimizations
- single_compile_unit
- pcl_style_guide
- branches_repository
- how_to_write_a_tutorial
+ In case you need help to debug your code, please follow this guidelines to write a minimal example.
* make sure we can access a slice of the data as a *2D image*, thus allowing fast 2D displaying, [u, v] operations, etc
* make sure we can access a slice of the data as a subpoint cloud: only certain points are chosen from the main point cloud
* implement channels (of a single type!) as data holders, e.g.:
-
* cloud["xyz"] => gets all 3D x,y,z data
* cloud["normals"] => gets all surface normal data
* etc
pos_space = ( "float with euclidean 2-norm distance", { "x", "y", "z" }, [[(0.3,0,1.3) , ... , (1.2,3.1,2)], ... , [(1,0.3,1) , ... , (2,0,3.5)] )
color_space = ( "uint8 with rgb distance", { "r", "g", "b" }, [[(0,255,0), ... , (128,255,32)] ... [(12,54,31) ... (255,0,192)]] )
-
1.2 PointTypes
^^^^^^^^^^^^^^
1.6 RANSAC
^^^^^^^^^^
- * Renaming the functions and internal variables: everything should be named with _src and _tgt: we have confusing names like indices_ and indices_tgt_ (and no indices_src_), setInputCloud and setInputTarget (duuh, everything is an input, it should be setTarget, setSource), in the code, a sample is named: selection, model_ and samples. getModelCoefficients is confusing with getModel (this one should be getBestSample).
+ * Renaming the functions and internal variables: everything should be named with _src and _tgt: we have confusing names like \indices_ and \indices_tgt_ (and no \indices_src_), setInputCloud and setInputTarget (duuh, everything is an input, it should be setTarget, setSource), in the code, a sample is named: selection, \model_ and samples. getModelCoefficients is confusing with getModel (this one should be getBestSample).
* no const-correctness all over, it's pretty scary: all the get should be const, selectWithinDistance and so on too.
* the getModel, getInliers function should not force you to fill a vector: you should just return a const reference to the internal vector: that could allow you to save a useless copy
* some private members should be made protected in the sub sac models (like sac_model_registration) so that we can inherit from them.
===============
- synthetic data
- real word data (how to get ground truth?)
- - Kinect
- - PR2 laser scanner
- - SICK laser data
- - small range 3D scanner
- - mid range 3D scanner (Faro)
- - high end 3D scanner (Riegl, Velodyne)
+ - Kinect
+ - PR2 laser scanner
+ - SICK laser data
+ - small range 3D scanner
+ - mid range 3D scanner (Faro)
+ - high end 3D scanner (Riegl, Velodyne)
- Point Types
- - 2D(?)
- - 3D
- - RGB
+ - 2D(?)
+ - 3D
+ - RGB
- dynamics
- - static scans
- - scanning while driving (e.g. robots)
+ - static scans
+ - scanning while driving (e.g. robots)
- size
- - room
- - building
- - outdoor (street)
+ - room
+ - building
+ - outdoor (street)
Architecture
============
^^^
- how does the algorithm cope with outliers
- how are the point pairs evaluated:
- - does it use normal or RGB information
- - does it weight the pairs differently
- - which kind of point pairs are used:
- - one-to-one
- - one-to-many
- - many-to-many
+
+ - does it use normal or RGB information
+ - does it weight the pairs differently
+ - which kind of point pairs are used:
+
+ - one-to-one
+ - one-to-many
+ - many-to-many
Similar Projects
================
^^^^^
This should hold the SLAM graph. I would propose to use Boost::Graph for it, as it allows us to access a lot of algorithms.
-.. todo::
+.. note::
define abstract structure.
void addConstraint (Graph &gr, PointCloud &from, PointCloud &to, Pose &pose);
}
-.. todo::
+.. note::
I'm not sure about this one.
* open .emacs
* add the following before any C/C++ custom hooks
-.. code-block:: lisp
+::
(load-file "/location/to/pcl-c-style.el")
(add-hook 'c-mode-common-hook 'pcl-set-c-style)
2.6.3 Eclipse
"""""""""""""
-You can find a PCL code style file for Eclipse here: `http://svn.pointclouds.org/pcl/trunk/doc/advanced/content/files/`
-Be warned that this can still contain errors, please mention on the user mailing list if this file needs changes. (feel free to patch)
+| You can find a PCL code style file for Eclipse `on GitHub <https://github.com/PointCloudLibrary/pcl/tree/master/doc/advanced/content/files>`_.
+| To add the new formatting style go to: Windows > Preferences > C/C++ > Code Style > Formatter
+
+| To format portion of codes, select the code and press Ctrl + Shift + F.
+| If you want to format the whole code in your project go to the tree and right click on the project: Source > Format.
+
+Note that the Eclipse formatter style is configured to wrap all arguments in a function, feel free to re-arange the arguments if you feel the need; for example,
+this improves readability:
+
+.. code-block:: cpp
+
+ int
+ displayPoint (float x, float y, float z,
+ float r, float g, float b
+ );
+
+This eclipse formatter fails to add a space before brackets when using PCL macros:
+
+.. code-block:: cpp
+
+ PCL_ERROR("Text\n");
+
+should be
+
+.. code-block:: cpp
+
+ PCL_ERROR ("Text\n");
+
+.. note::
+
+ This style sheet is not perfect, please mention errors on the user mailing list and feel free to patch!
3. Structuring
==============
The point clouds used are:
-* `capture000X.pcd <http://dev.pointclouds.org/attachments/download/742/pairwise_incremental_registration_tutorial_data.tar.gz>`_
-* `table_scene_mug_stereo_textured.pcd <http://dev.pointclouds.org/attachments/download/158/table_scene_mug_stereo_textured.pcd>`_
-* `table_scene_lms400.pcd <http://dev.pointclouds.org/attachments/download/157/table_scene_lms400.pcd>`_
+* `capture000X.pcd <https://github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise>`_
+* `table_scene_mug_stereo_textured.pcd <https://github.com/PointCloudLibrary/data/blob/master/tutorials/table_scene_lms400.pcd?raw=true>`_
+* `table_scene_lms400.pcd <https://github.com/PointCloudLibrary/data/blob/master/tutorials/table_scene_lms400.pcd?raw=true>`_
``capture0001.pcd`` (organized, 640x480, 57553 NaNs)::
+if(WITH_DOCS)
+ find_package(Doxygen)
+ if(DOXYGEN_FOUND)
+ find_package(HTMLHelp)
+ endif(DOXYGEN_FOUND)
+endif(WITH_DOCS)
+
message(STATUS "DOXYGEN_FOUND ${DOXYGEN_FOUND}")
message(STATUS "HTML_HELP_COMPILER ${HTML_HELP_COMPILER}")
+
if(DOXYGEN_FOUND)
if(HTML_HELP_COMPILER)
set(DOCUMENTATION_HTML_HELP YES)
set(HAVE_DOT NO)
endif(DOXYGEN_DOT_EXECUTABLE)
+ option(DOXYGEN_USE_SHORT_NAMES "Generate shorter (but less readable) file names" OFF)
+ if(DOXYGEN_USE_SHORT_NAMES)
+ set(SHORT_NAMES YES)
+ else(DOXYGEN_USE_SHORT_NAMES)
+ set(SHORT_NAMES NO)
+ endif(DOXYGEN_USE_SHORT_NAMES)
+
set(STRIPPED_HEADERS "${PCL_SOURCE_DIR}/${PCL_MODULES_NAMES}/include")
string(REPLACE ";" "/include \\\n\t\t\t\t\t\t\t\t\t\t\t\t ${PCL_SOURCE_DIR}/" STRIPPED_HEADERS "${STRIPPED_HEADERS}")
set(DOC_SOURCE_DIR "\"${PCL_SOURCE_DIR}\"\\")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html")
set(doxyfile "${CMAKE_CURRENT_BINARY_DIR}/doxyfile")
- configure_file("${CMAKE_CURRENT_SOURCE_DIR}/doxyfile.in" ${doxyfile})
- add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${doxyfile})
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/doxyfile.in" "${doxyfile}")
+ add_custom_target(doc ALL "${DOXYGEN_EXECUTABLE}" "${doxyfile}")
if(USE_PROJECT_FOLDERS)
- set_target_properties(doc PROPERTIES FOLDER "Documentation")
+ set_target_properties(doc PROPERTIES FOLDER "Documentation (Doxygen)")
endif(USE_PROJECT_FOLDERS)
if(DOCUMENTATION_HTML_HELP STREQUAL YES)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html"
FULL_PATH_NAMES = YES
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH = @STRIPPED_HEADERS@
-SHORT_NAMES = YES
+SHORT_NAMES = @SHORT_NAMES@
JAVADOC_AUTOBRIEF = YES
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
-SYMBOL_CACHE_SIZE = 0
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_FILES = NO
-SHOW_DIRECTORIES = NO
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE = "@PCL_SOURCE_DIR@/doc/doxygen/doxygen_layout.xml"
*.hpp \
*.doxy
RECURSIVE = YES
-EXCLUDE = */.svn \
- "@PCL_SOURCE_DIR@/cmake" \
+EXCLUDE = "@PCL_SOURCE_DIR@/cmake" \
"@PCL_SOURCE_DIR@/3rdparty" \
"@PCL_SOURCE_DIR@/test" \
"@PCL_SOURCE_DIR@/android" \
HTML_FOOTER = @PCL_SOURCE_DIR@/doc/doxygen/footer.html
HTML_STYLESHEET =
HTML_EXTRA_FILES =
-HTML_COLORSTYLE_HUE = 220
-HTML_COLORSTYLE_SAT = 100
-HTML_COLORSTYLE_GAMMA = 80
+HTML_COLORSTYLE_HUE = 87
+HTML_COLORSTYLE_SAT = 46
+HTML_COLORSTYLE_GAMMA = 73
HTML_TIMESTAMP = YES
HTML_DYNAMIC_SECTIONS = YES
GENERATE_DOCSET = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = *.h
-#PREDEFINED = protected=private \
-PREDEFINED = "HAVE_QHULL=1" \
- "HAVE_OPENNI=1"
+#PREDEFINED = protected=private \
+PREDEFINED = = "HAVE_QHULL=1" \
+ "HAVE_OPENNI=1" \
+ "PCL_DEPRECATED(x)="
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
<tab type="files" visible="yes" title=""/>
<tab type="globals" visible="yes" title=""/>
</tab>
- <tab type="dirs" visible="no" title=""/>
<tab type="examples" visible="no" title=""/>
</navindex>
<h1>Quick Links</h1>
<ul>
<li>Main website: http://www.pointclouds.org</li>
- <li>Developer Zone: http://dev.pointclouds.org</li>
- <li>SVN Repository: http://svn.pointclouds.org</li>
- <li>Build farm: http://build.pointclouds.org</li>
+ <li>Developer Zone: https://github.com/PointCloudLibrary</li>
+ <li>Build farm: https://travis-ci.org/PointCloudLibrary/pcl</li>
</ul>
<h1>References</h1>
+++ /dev/null
-.PHONY: html
-
-html:
- -rm -rf html /tmp/doctrees
- sphinx-build -b html -a -d /tmp/doctrees content html
-
+++ /dev/null
-{% extends "!layout.html" %}
-
-{% block extrahead %}
-{% endblock %}
-
-{% block rootrellink %}{% endblock %}
-
-{% block sidebarsearch %}{% endblock %}
+++ /dev/null
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys, os
-
-# -- General configuration -----------------------------------------------------
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'PCL'
-copyright = ''
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '0.0'
-# The full version, including alpha/beta/rc tags.
-release = '0.0'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of documents that shouldn't be included in the build.
-#unused_docs = []
-
-# List of directories, relative to source directory, that shouldn't be searched
-# for source files.
-exclude_trees = []
-
-# The reST default role (used for this markup: `text`) to use for all documents.
-default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-add_module_names = False
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# -- Options for HTML output ---------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. Major themes that come with
-# Sphinx are currently 'default' and 'sphinxdoc'.
-html_theme = 'sphinxdoc'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-# html_theme_options = { 'rightsidebar' : 'true' }
-
-# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = ['.']
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# "<project> v<release> documentation".
-html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-html_short_title = 'Home'
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# If false, no module index is generated.
-html_use_modindex = False
-
-# If false, no index is generated.
-html_use_index = False
-
-# If true, the index is split into individual pages for each letter.
-html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-html_show_sourcelink = False
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
-html_file_suffix = '.html'
-
-html_sidebars = {
- '**': [],
- 'using/windows': [],
-}
-html_show_copyright = False
-html_show_sphinx = False
-html_add_permalinks = None
-needs_sphinx = 1.0
-file_insertion_enabled = True
-raw_enabled = True
-
+++ /dev/null
-.. toctree::
-
-Overview
---------
-
-PCL presents an advanced and extensive approach to the subject of 3D
-perception, and it's meant to provide support for all the common 3D building
-blocks that applications need. Written from a perspective of online sensor data
-processing, PCL deals with point cloud data acquired from real sensing devices
-including laser scanners, stereo cameras, and TOF cameras.
-
-PCL is a fully templated, modern C++ library, with efficient backends for
-modern CPUs (SSE optimized), and GPUs (CUDA). The plethora of state-of-the-art
-algorithms implemented is large, with many new ones added on a weekly to
-monthly basis -- acquisition, filtering, feature estimation, surface
-reconstruction, registration, model fitting, and segmentation, are just a few
-of the many topics covered by PCL.
-
-The project is supported by an international community of robotics and perception
-researchers, and would not exist without the contributions of many people and
-companies. We thank everyone for their support!
-
-Presentation
-------------
-
-The following overview presentation was given at the ROS Fall School at TUM in
-November 2010.
-
-.. raw:: html
-
- <p>
- <iframe src="http://docs.google.com/viewer?url=http://dev.pointclouds.org/attachments/download/16/PCL_November_2010.pdf&embedded=true" style="border: none;" width="600" height="480"></iframe>
- <a href="http://dev.pointclouds.org/attachments/download/16/PCL_November_2010.pdf">(download here)</a>
- </p>
-
+++ /dev/null
-.. _visualization:
-
-PCL Visualization overview
---------------------------
-
-The **pcl_visualization** library was built for the purpose of being able to
-quickly prototype and visualize the results of algorithms operating on 3D point
-cloud data. Similar to OpenCV's **highgui** routines for displaying 2D images
-and for drawing basic 2D shapes on screen, the library offers:
-
- * methods for rendering and setting visual properties (colors, point sizes,
- opacity, etc) for any n-D point cloud datasets in pcl::PointCloud<T> format;
-
- .. image:: images/visualization/bunny.jpg
-
- * methods for drawing basic 3D shapes on screen (e.g., cylinders, spheres,
- lines, polygons, etc) either from sets of points or from parametric
- equations;
-
- .. image:: images/visualization/shapes.jpg
-
- * a histogram visualization module (PCLHistogramVisualizer) for 2D plots;
-
- .. image:: images/visualization/histogram.jpg
-
- * a multitude of Geometry and Color handler for pcl::PointCloud<T> datasets;
-
- .. image:: images/visualization/normals.jpg
- .. image:: images/visualization/pcs.jpg
-
- * a pcl::RangeImage visualization module.
-
- .. image:: images/visualization/range_image.jpg
-
-The package makes use of the VTK library for 3D rendering for
-range image and 2D operations.
-
-For implementing your own visualizers, take a look at the tests and examples
-accompanying the library.
-
-.. note::
-
- Due to historical reasons, PCL 1.x stores RGB data as a packed float (to
- preserve backward compatibility). To learn more about this, please see the
- `PointXYZRGB
- <http://docs.pointclouds.org/trunk/structpcl_1_1_point_x_y_z_r_g_b.html>`_.
-
-Simple Cloud Visualization
---------------------------
-
-If you just want to visualize something in your app with a few lines of code,
-use a snippet like the following one:
-
-.. code-block:: cpp
- :linenos:
-
- #include <pcl_visualization/cloud_viewer.h>
- //...
- void
- foo ()
- {
- pcl::PointCloud<pcl::PointXYZRGB> cloud;
- //... populate cloud
- pcl_visualization::CloudViewer viewer("Simple Cloud Viewer");
- viewer.showCloud(cloud);
- while (!viewer.wasStopped())
- {
- }
- }
-
-PCD Viewer
-----------
-
-A quick way for visualizing PCD (Point Cloud Data) files is by using
-**pcl_viewer**. As of 0.2.7, pcl_viewer's help screen looks like::
-
- Syntax is: pcl_viewer <file_name 1..N>.pcd <options>
- where options are:
- -bc r,g,b = background color
- -fc r,g,b = foreground color
- -ps X = point size (1..64)
- -opaque X = rendered point cloud opacity (0..1)
- -ax n = enable on-screen display of XYZ axes and scale them to n
- -ax_pos X,Y,Z = if axes are enabled, set their X,Y,Z position in space (default 0,0,0)
-
- -cam (*) = use given camera settings as initial view
- (*) [Clipping Range / Focal Point / Position / ViewUp / Distance / Window Size / Window Pos] or use a <filename.cam> that contains the same information.
-
- -multiview 0/1 = enable/disable auto-multi viewport rendering (default disabled)
-
-
- -normals 0/X = disable/enable the display of every Xth point's surface normal as lines (default disabled)
- -normals_scale X = resize the normal unit vector size to X (default 0.02)
-
- -pc 0/X = disable/enable the display of every Xth point's principal curvatures as lines (default disabled)
- -pc_scale X = resize the principal curvatures vectors size to X (default 0.02)
-
-
- (Note: for multiple .pcd files, provide multiple -{fc,ps} parameters; they will be automatically assigned to the right file)
-
-Usage examples
---------------
-
-.. code-block:: bash
-
- $ pcl_viewer -multiview 1 data/partial_cup_model.pcd data/partial_cup_model.pcd data/partial_cup_model.pcd
-
-
-The above will load the ``partial_cup_model.pcd`` file 3 times, and will create a
-multi-viewport rendering (``-multiview 1``).
-
-.. image:: images/visualization/ex1.jpg
-
-Pressing ``h`` while the point clouds are being rendered will output the
-following information on the console::
-
- | Help:
- -------
- p, P : switch to a point-based representation
- w, W : switch to a wireframe-based representation (where available)
- s, S : switch to a surface-based representation (where available)
-
- j, J : take a .PNG snapshot of the current window view
- c, C : display current camera/window parameters
-
- + / - : increment/decrement overall point size
-
- g, G : display scale grid (on/off)
- u, U : display lookup table (on/off)
-
- r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]
-
- ALT + s, S : turn stereo mode on/off
- ALT + f, F : switch between maximized window mode and original size
-
- l, L : list all available geometric and color handlers for the current actor map
- ALT + 0..9 [+ CTRL] : switch between different geometric handlers (where available)
- 0..9 [+ CTRL] : switch between different color handlers (where available)
-
-
-Pressing ``l`` will show the current list of available geometry/color handlers
-for the datasets that we loaded. In this example::
-
- List of available geometry handlers for actor partial_cup_model.pcd-0: xyz(1) normal_xyz(2)
- List of available color handlers for actor partial_cup_model.pcd-0: [random](1) x(2) y(3) z(4) normal_x(5) normal_y(6) normal_z(7) curvature(8) boundary(9) k(10) principal_curvature_x(11) principal_curvature_y(12) principal_curvature_z(13) pc1(14) pc2(15)
-
-Switching to a ``normal_xyz`` geometric handler using ``ALT+1`` and then
-pressing ``8`` to switch to a curvature color handler, should result in the
-following::
-
- $ pcl_viewer -normals 100 data/partial_cup_model.pcd
-
-.. image:: images/visualization/ex2.jpg
-
-
-The above will load the ``partial_cup_model.pcd`` file and render its every
-``100`` th surface normal on screen.
-
-.. code-block:: bash
-
- $ pcl_viewer -pc 100 data/partial_cup_model.pcd
-
-.. image:: images/visualization/ex3.jpg
-
-The above will load the ``partial_cup_model.pcd`` file and render its every
-``100`` th principal curvature (+surface normal) on screen.
-
-.. image:: images/visualization/ex4.jpg
-
-.. code-block:: bash
-
- $ pcl_viewer data/bun000.pcd data/bun045.pcd -ax 0.5 -ps 3 -ps 1
-
-The above assumes that the ``bun000.pcd`` and ``bun045.pcd`` datasets have been
-downloaded and are available. The results shown in the following picture were
-obtained after pressing ``u`` and ``g`` to enable the lookup table and on-grid
-display.
-
-.. image:: images/visualization/ex5.jpg
-
-
-Range Image Visualizer
-----------------------
-
-A quick way for visualizing range images is by using the binary of the tutorial
-for range_image_visualization::
-
- $ tutorial_range_image_visualization data/office_scene.pcd
-
-The above will load the ``office_scene.pcd`` point cloud file, create a range
-image from it and visualize both, the point cloud and the range image.
-
-find_package(Sphinx)
if(SPHINX_FOUND)
- file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html")
- if(WIN32)
- set(TMPDIR "$ENV{TEMP}")
- else()
- set(TMPDIR "/tmp")
- endif()
- file(TO_CMAKE_PATH "${TMPDIR}" TMPDIR)
- add_custom_target(Tutorials
- COMMAND ${CMAKE_COMMAND} -E remove_directory "${TMPDIR}/doctrees"
- COMMAND ${SPHINX_EXECUTABLE} -b html -a -d "${TMPDIR}/doctrees" "${CMAKE_CURRENT_SOURCE_DIR}/content" html
- )
+ add_custom_target(tutorials ALL
+ COMMAND "${SPHINX_EXECUTABLE}" -b html -a -d "${SPHINX_CACHE_DIR}" -D html_file_suffix=".${SPHINX_HTML_FILE_SUFFIX}" "${CMAKE_CURRENT_SOURCE_DIR}/content" html)
+ add_dependencies(tutorials doc)
if(USE_PROJECT_FOLDERS)
- set_target_properties(Tutorials PROPERTIES FOLDER "Documentation")
+ set_target_properties(tutorials PROPERTIES FOLDER "Documentation (Tutorials)")
endif(USE_PROJECT_FOLDERS)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html"
DESTINATION "${DOC_INSTALL_DIR}/tutorials"
COMPONENT doc)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/content/sources"
DESTINATION "${DOC_INSTALL_DIR}/tutorials"
- COMPONENT doc
- PATTERN ".svn" EXCLUDE)
+ COMPONENT doc)
endif(SPHINX_FOUND)
+++ /dev/null
-.PHONY: html
-
-html:
- -rm -rf html /tmp/doctrees
- sphinx-build -b html -a -d /tmp/doctrees content html
-
--- /dev/null
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+img {
+ border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+font-family: "Droid Serif", "DejaVu Serif", "Garamond", serif;
+font-size: 1.3em;
+color: #64794c;
+margin-bottom: 0;
+ margin-top: 0 !important;
+}
+
+.first img {
+max-width: none !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ clear: both;
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dt:target, .highlighted {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.refcount {
+ color: #060;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+white-space : pre-wrap; /*for Mozilla*/
+word-wrap: break-word; /*for IE*/
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+tt.descclassname {
+ background-color: transparent;
+}
+
+tt.xref, a tt {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
--- /dev/null
+/*
+ * sphinxdoc.css_t
+ * ~~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- sphinxdoc theme. Originally created by
+ * Armin Ronacher for Werkzeug.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ color: black;
+ padding: 0;
+ margin: 0px 80px 0px 80px;
+ min-width: 740px;
+}
+
+div.document {
+
+ text-align: left;
+
+
+}
+
+div.bodywrapper {
+ margin: 0 240px 0 0;
+ border-right: 1px solid #ccc;
+}
+
+div.body {
+ margin: 0;
+ padding: 0.5em 20px 20px 20px;
+}
+
+div.related {
+ font-size: 1em;
+}
+
+div.related ul {
+ background-image: url(navigation.png);
+ height: 2em;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+
+div.related ul li {
+ margin: 0;
+ padding: 0;
+ height: 2em;
+ float: left;
+}
+
+div.related ul li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related ul li a {
+ margin: 0;
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: #EE9816;
+}
+
+div.related ul li a:hover {
+ color: #3CA8E7;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ margin: 0;
+ padding: 0.5em 15px 15px 0;
+ width: 210px;
+ float: right;
+ font-size: 1em;
+ text-align: left;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin: 1em 0 0.5em 0;
+ font-size: 1em;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border: 1px solid #86989B;
+ background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+ color: white;
+}
+
+div.sphinxsidebar ul {
+ padding-left: 1.5em;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 20px;
+}
+
+div.footer {
+ background-color: #E3EFF1;
+ color: #86989B;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-size: 0.8em;
+ text-align: right;
+}
+
+div.footer a {
+ color: #86989B;
+ text-decoration: underline;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+div.body a {
+ text-decoration: underline;
+}
+
+h2 {
+/* color: #11557C;*/
+ margin: 1.3em 0 0.2em 0;
+ font-size: 1.35em;
+ padding: 0;
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+ color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+ display: none;
+ margin: 0 0 0 0.3em;
+ padding: 0 0.2em 0 0.2em;
+ color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+ display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+ color: #777;
+ background-color: #eee;
+}
+
+a.headerlink {
+ color: #c60f0f!important;
+ font-size: 1em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+cite, code, tt {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.01em;
+}
+
+tt {
+ background-color: #f2f2f2;
+ border-bottom: 1px solid #ddd;
+ color: #333;
+}
+
+tt.descname, tt.descclassname, tt.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+a tt {
+ border: 0;
+ color: #CA7900;
+}
+
+a tt:hover {
+ color: #2491CF;
+}
+
+pre {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.015em;
+ line-height: 120%;
+ padding: 0.5em;
+ border: 1px solid #ccc;
+ background-color: #f8f8f8;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 2px 7px;
+ border: 1px solid #ccc;
+}
+
+div.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition, div.warning {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 1px solid #86989B;
+ background-color: #f7f7f7;
+ padding: 0;
+}
+
+div.admonition p, div.warning p {
+ margin: 0.5em 1em 0.5em 1em;
+ padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+ margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+ margin: 0;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border-bottom: 1px solid #86989B;
+ font-weight: bold;
+ background-color: #AFC1C4;
+}
+
+div.warning {
+ border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+ background-color: #CF0000;
+ border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.versioninfo {
+ margin: 1em 0 0 0;
+ border: 1px solid #ccc;
+ background-color: #DDEAF0;
+ padding: 8px;
+ line-height: 1.3em;
+ font-size: 0.9em;
+}
+
+.viewcode-back {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<title>Documentation - Point Cloud Library (PCL)</title>
+</head>
{% extends "!layout.html" %}
{% block extrahead %}
+<?php
+define('MODX_CORE_PATH', '/var/www/pointclouds.org/core/');
+define('MODX_CONFIG_KEY', 'config');
+
+require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
+require_once MODX_CORE_PATH.'model/modx/modx.class.php';
+$modx = new modX();
+$modx->initialize('web');
+
+$snip = $modx->runSnippet("getSiteNavigation", array('id'=>5, 'phLevels'=>'sitenav.level0,sitenav.level1', 'showPageNav'=>'n'));
+$chunkOutput = $modx->getChunk("site-header", array('sitenav'=>$snip));
+$bodytag = str_replace("[[+showSubmenus:notempty=`", "", $chunkOutput);
+$bodytag = str_replace("`]]", "", $bodytag);
+echo $bodytag;
+echo "\n";
+?>
+<div id="pagetitle">
+<h1>Documentation</h1>
+<a id="donate" href="http://www.openperception.org/support/"><img src="/assets/images/donate-button.png" alt="Donate to the Open Perception foundation"/></a>
+</div>
+<div id="page-content">
{% endblock %}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
{% block rootrellink %}{% endblock %}
{% block sidebarsearch %}{% endblock %}
+
+{% block footer %}
+</div> <!-- #page-content -->
+
+<?php
+$chunkOutput = $modx->getChunk("site-footer");
+echo $chunkOutput;
+?>
+{% endblock %}
+</html>
+
To cover all possible cases that we could think of, we defined a plethora of
point types in PCL. The following might be only a snippet, please see
-`point_types.hpp <http://docs.pointclouds.org/point__types_8hpp_source.html>`_
+`point_types.hpp <https://github.com/PointCloudLibrary/pcl/blob/master/common/include/pcl/impl/point_types.hpp>`_
for the complete list.
This list is important, because before defining your own custom type, you need
for any classes that you expose (from PCL our outside PCL).
.. note::
-Starting with PCL-1.7 you need to define PCL_NO_PRECOMPILE before you include
-any PCL headers to include the templated algorithms as well.
+ Starting with PCL-1.7 you need to define PCL_NO_PRECOMPILE before you include
+ any PCL headers to include the templated algorithms as well.
Example
-------
The code
--------
-First, download the datasets from :download:`here <./sources/alignment_prerejective/data/alignment_prerejective.tar.gz>` and extract the files.
+First, download the test models: :download:`object <./sources/alignment_prerejective/chef.pcd>` and :download:`scene <./sources/alignment_prerejective/rs1.pcd>`.
Next, copy and paste the following code into your editor and save it as ``alignment_prerejective.cpp`` (or download the source file :download:`here <./sources/alignment_prerejective/alignment_prerejective.cpp>`).
.. literalinclude:: sources/alignment_prerejective/alignment_prerejective.cpp
:language: cpp
- :lines: 79-90
+ :lines: 79-91
.. note:: Apart from the usual input point clouds and features, this class takes some additional runtime parameters which have great influence on the performance of the alignment algorithm. The first two have the same meaning as in the alignment class :pcl:`SampleConsensusInitialAlignment <pcl::SampleConsensusInitialAlignment>`:
- Number of samples - *setNumberOfSamples ()*: The number of point correspondences to sample between the object and the scene. At minimum, 3 points are required to calculate a pose.
- Correspondence randomness - *setCorrespondenceRandomness ()*: Instead of matching each object FPFH descriptor to its nearest matching feature in the scene, we can choose between the *N* best matches at random. This increases the iterations necessary, but also makes the algorithm robust towards outlier matches.
- - Polygonal similarity threshold - *setSimlarityThreshold ()*: The alignment class uses the :pcl:`CorrespondenceRejectorPoly <pcl::registration::CorrespondenceRejectorPoly>` class for early elimination of bad poses based on pose-invariant geometric consistencies of the inter-distances between sampled points on the object and the scene. The closer this value is set to 1, the more greedy and thereby fast the algorithm becomes. However, this also increases the risk of eliminating good poses when noise is present.
+ - Polygonal similarity threshold - *setSimilarityThreshold ()*: The alignment class uses the :pcl:`CorrespondenceRejectorPoly <pcl::registration::CorrespondenceRejectorPoly>` class for early elimination of bad poses based on pose-invariant geometric consistencies of the inter-distances between sampled points on the object and the scene. The closer this value is set to 1, the more greedy and thereby fast the algorithm becomes. However, this also increases the risk of eliminating good poses when noise is present.
- Inlier threshold - *setMaxCorrespondenceDistance ()*: This is the Euclidean distance threshold used for determining whether a transformed object point is correctly aligned to the nearest scene point or not. In this example, we have used a heuristic value of 1.5 times the point cloud resolution.
- - Inlier fraction - *setInlierFraction ()*: In many practical scenarios, large parts of the observed object in the scene are not visible, either due to clutter, occlusions or both. In such cases, we need to allow for pose hypotheses that do not align all object points to the scene. The absolute number of correctly aligned points is determined using the inlier threshold, and if the ratio of this number to the total number of points in the object is higher than the specified inlier fraction, we accept a pose hypothesis as valid. Furthermore, if a pose generates the highest number of inliers so far, the pose is stored as the current output. In other words, this class tries to maximize the inliers instead of minimizing the fit error during the alignment process.
+ - Inlier fraction - *setInlierFraction ()*: In many practical scenarios, large parts of the observed object in the scene are not visible, either due to clutter, occlusions or both. In such cases, we need to allow for pose hypotheses that do not align all object points to the scene. The absolute number of correctly aligned points is determined using the inlier threshold, and if the ratio of this number to the total number of points in the object is higher than the specified inlier fraction, we accept a pose hypothesis as valid.
Finally, we are ready to execute the alignment process.
.. literalinclude:: sources/alignment_prerejective/alignment_prerejective.cpp
:language: cpp
- :lines: 91
+ :lines: 92-95
The aligned object is stored in the point cloud *object_aligned*. If a pose with enough inliers was found (more than 25 % of the total number of object points), the algorithm is said to converge, and we can print and visualize the results.
.. literalinclude:: sources/alignment_prerejective/alignment_prerejective.cpp
:language: cpp
- :lines: 95-109
+ :lines: 99-114
Compiling and running the program
$ ./alignment_prerejective chef.pcd rs1.pcd
After a few seconds, you will see a visualization and a terminal output similar to::
-
- | -0.003 -0.972 0.235 |
- R = | -0.993 -0.026 -0.119 |
- | 0.122 -0.233 -0.965 |
- t = < 0.095, -0.022, 0.069 >
+ Alignment took 352ms.
- Inliers: 890/3432
+ | 0.040 -0.929 -0.369 |
+ R = | -0.999 -0.035 -0.020 |
+ | 0.006 0.369 -0.929 |
+
+ t = < -0.287, 0.045, 0.126 >
+
+ Inliers: 987/3432
The visualization window should look something like the below figures. The scene is shown with green color, and the aligned object model is shown with blue color. Note the high number of non-visible object points.
--- /dev/null
+.. _bspline_fitting:
+
+Fitting trimmed B-splines to unordered point clouds
+---------------------------------------------------
+
+This tutorial explains how to run a B-spline fitting algorithm on a
+point-cloud, to obtain a smooth, parametric surface representation.
+The algorithm consists of the following steps:
+
+* Initialization of the B-spline surface by using the Principal Component Analysis (PCA). This
+ assumes that the point-cloud has two main orientations, i.e. that it is roughly planar.
+
+* Refinement and fitting of the B-spline surface.
+
+* Circular initialization of the B-spline curve. Here we assume that the point-cloud is
+ compact, i.e. no separated clusters.
+
+* Fitting of the B-spline curve.
+
+* Triangulation of the trimmed B-spline surface.
+
+In this video, the algorithm is applied to the frontal scan of the stanford bunny (204800 points):
+
+.. raw:: html
+
+ <iframe title="Trimmed B-spline surface fitting" width="480" height="390" src="http://www.youtube.com/embed/trH2kWELvyw?rel=0" frameborder="0" allowfullscreen></iframe>
+
+
+Theoretical background
+----------------------
+
+Theoretical information on the algorithm can be found in this `report
+<http://pointclouds.org/blog/trcs/moerwald/index.php>`_ and in my `PhD thesis
+<http://users.acin.tuwien.ac.at/tmoerwald/?site=3>`_.
+
+
+PCL installation settings
+-------------------------
+
+Please note that the modules for NURBS and B-splines are not enabled by default.
+Make sure you enable "BUILD_surface_on_nurbs" in your ccmake configuration, by setting it to ON.
+
+If your license permits, also enable "USE_UMFPACK" for sparse linear solving.
+This requires SuiteSparse (libsuitesparse-dev in Ubuntu) which is faster,
+allows more degrees of freedom (i.e. control points) and more data points.
+
+The program created during this tutorial is available in
+*pcl/examples/surface/example_nurbs_fitting_surface.cpp* and is built when
+"BUILD_examples" is set to ON. This will create the binary called *pcl_example_nurbs_fitting_surface*
+in your *bin* folder.
+
+
+The code
+--------
+
+The cpp file used in this tutorial can be found in *pcl/doc/tutorials/content/sources/bspline_fitting/bspline_fitting.cpp*.
+You can find the input file at *pcl/test/bunny.pcd*.
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :linenos:
+ :lines: 1-220
+
+
+The explanation
+---------------
+Now, let's break down the code piece by piece.
+Lets start with the choice of the parameters for B-spline surface fitting:
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :linenos:
+ :lines: 56-66
+
+* *order* is the polynomial order of the B-spline surface.
+
+* *refinement* is the number of refinement iterations, where for each iteration control-points
+ are inserted, approximately doubling the control points in each parametric direction
+ of the B-spline surface.
+
+* *iterations* is the number of iterations that are performed after refinement is completed.
+
+* *mesh_resolution* the number of vertices in each parametric direction,
+ used for triangulation of the B-spline surface.
+
+Fitting:
+
+* *interior_smoothness* is the smoothness of the surface interior.
+
+* *interior_weight* is the weight for optimization for the surface interior.
+
+* *boundary_smoothness* is the smoothness of the surface boundary.
+
+* *boundary_weight* is the weight for optimization for the surface boundary.
+
+Note, that the boundary in this case is not the trimming curve used later on.
+The boundary can be used when a point-set exists that defines the boundary. Those points
+can be declared in *pcl::on_nurbs::NurbsDataSurface::boundary*. In that case, when the
+*boundary_weight* is greater than 0.0, the algorithm tries to align the domain boundaries
+to these points. In our example we are trimming the surface anyway, so there is no need
+for aligning the boundary.
+
+Initialization of the B-spline surface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 68-72
+
+The command *initNurbsPCABoundingBox* uses PCA to create a coordinate systems, where the principal
+eigenvectors point into the direction of the maximum, middle and minimum extension of the point-cloud.
+The center of the coordinate system is located at the mean of the points.
+To estimate the extension of the B-spline surface domain, a bounding box is computed in the plane formed
+by the maximum and middle eigenvectors. That bounding box is used to initialize the B-spline surface with
+its minimum number of control points, according to the polynomial degree chosen.
+
+The surface fitting class *pcl::on_nurbs::FittingSurface* is initialized with the point data and the initial
+B-spline.
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 74-80
+
+The *on_nurbs::Triangulation* class allows easy conversion between the *ON_NurbsSurface* and the *PolygonMesh* class,
+for visualization of the B-spline surfaces. Note that NURBS are a generalization of B-splines,
+and are therefore a valid container for B-splines, with all control-point weights = 1.
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 82-92
+
+Refinement and fitting of the B-spline surface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+At this point of the code we have a B-spline surface with minimal number of control points.
+Typically they are not enough to represent finer details of the underlying geometry
+of the point-cloud. However, if we increase the control-points to our desired level of detail and
+subsequently fit the refined B-spline, we run into problems. For robust fitting B-spline surfaces
+the rule is:
+"The higher the degree of freedom of the B-spline surface, the closer we have to be to the points to be approximated".
+
+This is the reason why we iteratively increase the degree of freedom by refinement in both directions (line 85-86),
+and fit the B-spline surface to the point-cloud, getting closer to the final solution.
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 94-102
+
+After we reached the final level of refinement, the surface is further fitted to the point-cloud
+for a pleasing end result.
+
+Initialization of the B-spline curve
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now that we have the surface fitted to the point-cloud, we want to cut off the overlapping regions of the surface.
+To achieve this we project the point-cloud into the parametric domain using the closest points to the B-spline surface.
+In this domain of R^2 we perform the weighted B-spline curve fitting, that creates a closed trimming curve that approximately
+contains all the points.
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 107-120
+
+The topic of curve fitting goes a bit deeper into the thematics of B-splines. Here we assume that you are
+familiar with the concept of B-splines, knot vectors, control-points, and so forth.
+Please consider the curve being split into supporting regions which is bound by consecutive knots.
+Also note that points that are inside and outside the curve are distinguished.
+
+* *addCPsAccuracy* the distance of the supporting region of the curve to the closest data points has to be below
+ this value, otherwise a control point is inserted.
+
+* *addCPsIteration* inner iterations without inserting control points.
+
+* *maxCPs* the maximum total number of control-points.
+
+* *accuracy* the average fitting accuracy of the curve, w.r.t. the supporting regions.
+
+* *iterations* maximum number of iterations performed.
+
+* *closest_point_resolution* number of control points that must lie within each supporting region. (0 turns this constraint off)
+
+* *closest_point_weight* weight for fitting the curve to its closest points.
+
+* *closest_point_sigma2* threshold for closest points (disregard points that are further away from the curve).
+
+* *interior_sigma2* threshold for interior points (disregard points that are further away from and lie within the curve).
+
+* *smooth_concavity* value that leads to inward bending of the curve (0 = no bending; <0 inward bending; >0 outward bending).
+
+* *smoothness* weight of smoothness term.
+
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 122-127
+
+The curve is initialized using a minimum number of control points to represent a circle, with the center located
+at the mean of the point-cloud and the radius of the maximum distance of a point to the center.
+Please note that interior weighting is enabled for all points with the command *curve_data.interior_weight_function.push_back (true)*.
+
+Fitting of the B-spline curve
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 129-133
+
+Similar to the surface fitting approach, the curve is iteratively fitted and refined, as shown in the video.
+Note how the curve tends to bend inwards at regions where it is not supported by any points.
+
+Triangulation of the trimmed B-spline surface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 136-142
+
+After the curve fitting terminated, our geometric representation consists of a B-spline surface and a closed
+B-spline curved, defined within the parametric domain of the B-spline surface. This is called trimmed B-spline surface.
+In line 140 we can use the trimmed B-spline to create a triangular mesh. The triangulation algorithm first triangulates
+the whole domain and afterwards removes triangles that lie outside of the trimming curve. Vertices of triangles
+that intersect the trimming curve are clamped to the curve.
+
+When running this example and switch to wire-frame mode (w), you will notice that the triangles are ordered in
+a rectangular way, which is a result of the rectangular domain of the surface.
+
+Some hints
+----------
+Please bear in mind that the robustness of this algorithm heavily depends on the underlying data.
+The parameters for B-spline fitting are designed to model the characteristics of this data.
+
+* If you have holes or steps in your data, you might want to work with lower refinement levels and lower accuracy to
+ prevent the B-spline from folding and twisting. Moderately increasing of the smoothness might also work.
+
+* Try to introduce as much pre-conditioning and constraints to the parameters. E.g. if you know, that
+ the trimming curve is rather simple, then limit the number of maximum control points.
+
+* Start simple! Before giving up on gaining control over twisting and bending B-splines, I highly recommend
+ to start your fitting trials with a small number of control points (low refinement),
+ low accuracy but also low smoothness (B-splines have implicit smoothing property).
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/bspline_fitting/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do:
+
+ $ ./bspline_fitting ${PCL_ROOT}/test/bunny.pcd
+
+
+Saving and viewing the result
+-----------------------------
+
+* Saving as OpenNURBS (3dm) file
+
+You can save the B-spline surface by using the commands provided by OpenNurbs:
+
+.. literalinclude:: sources/bspline_fitting/bspline_fitting.cpp
+ :language: cpp
+ :lines: 145-163
+
+The files generated can be viewed with the pcl/examples/surface/example_nurbs_viewer_surface.cpp.
+
+* Saving as triangle mesh into a vtk file
+
+You can save the triangle mesh for example by saving into a VTK file by:
+
+ #include <pcl/io/vtk_io.h>
+ ...
+ pcl::io::saveVTKFile ("mesh.vtk", mesh);
+
+PCL also provides vtk conversion into other formats (PLY, OBJ).
+
You should see something like the following on screen::
- BUILD_TESTS ON
BUILD_common ON
BUILD_features ON
BUILD_filters ON
The explanation
---------------
-* `BUILD_TESTS`: option to enable/disable building of tests
-
* `BUILD_common`: option to enable/disable building of common library
* `BUILD_features`: option to enable/disable building of features library
Depending on your project/system, you might want to enable/disable certain
options. For example, you can prevent the building of:
-* tests: setting BUILD_TESTS and BUILD_global_tests to OFF
+* tests: setting `BUILD_global_tests` to `OFF`
-* a library: setting BUILD_LIBRARY_NAME to OFF
+* a library: setting `BUILD_LIBRARY_NAME` to `OFF`
Note that if you disable a XXX library that is required for building
YYY then XXX will be built but won't appear in the cache.
discuss each dependency entry so that you can configure/build or
update/build PCL according to your system.
-General remarks
-^^^^^^^^^^^^^^^^
+Building unit tests
+^^^^^^^^^^^^^^^^^^^
+
+If you want to contribute to PCL, or are modifying the code, you need
+to turn on building of unit tests. This is accomplished by setting the `BUILD_global_tests`
+option to `ON`, with a few caveats. If you're using `ccmake` and you find that `BUILD_global_tests`
+is reverting to `OFF` when you configure, you can move the cursor up to the `BUILD_global_tests` line to see the
+error message.
+
+Two options which will need to be turned ON before `BUILD_global_tests` are `BUILD_outofcore` and
+`BUILD_people`. Your mileage may vary.
+
+Also required for unit tests is the source code for the Google C++ Testing Framework. That is
+usually as simple as downloading the source, extracting it, and pointing the `GTEST_SRC_DIR` and `GTEST_INCLUDE_DIR`
+options to the applicable source locations. On Ubuntu, you can simply run `apt-get install libgtest-dev`.
+
+These steps enable the `tests` make target, so you can use `make tests` to run tests.
+
+General remarks
+^^^^^^^^^^^^^^^
Under ${PCL_ROOT}/cmake/Modules there is a list of FindXXX.cmake files
used to locate dependencies and set their related variables. They have
a list of default searchable paths where to look for them. In addition,
The CloudViewer class is **NOT** meant to be used in multi-threaded
applications! Please check the documentation on
- :pcl:`PCLVisualizer<pcl::PCLVisualizer>` or read the :ref:`pcl_visualizer` tutorial
+ :pcl:`PCLVisualizer<pcl::visualization::PCLVisualizer>` or read the :ref:`pcl_visualizer` tutorial
for thread safe visualization.
Simple Cloud Visualization
used as the matrix backend for SSE optimized math. **mandatory**
- - **FLANN** version >= 1.6.8 (http://www.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN)
+ - **FLANN** version >= 1.6.8 (http://www.cs.ubc.ca/research/flann/)
used in `kdtree` for fast approximate nearest neighbors search. **mandatory**
used to grab point clouds from OpenNI compliant devices. **optional**
- - **Qt** version >= 4.6 (http://qt.nokia.com/)
+ - **Qt** version >= 4.6 (http://qt.digia.com/)
used for developing applications with a graphical user interface (GUI) **optional**
- - **MPI** version >= 1.4 (http://www.mcs.anl.gov/research/projects/mpich2/)
-
- **optional**
-
.. note::
Though not a dependency per se, don't forget that you also need the CMake
- build system (http://www.cmake.org/), at least version **2.8.3**. A Subversion client for Windows, i.e. TortoiseSVN
- (http://tortoisesvn.tigris.org/), is also required to download the PCL source code.
+ build system (http://www.cmake.org/), at least version **2.8.3**. A Git
+ client for Windows is also required to download the PCL source code.
Building dependencies
---------------------
Let's start with `Boost`. We will be using the `CMake-able Boost` project which provide a CMake based build system
for Boost.
- As a dependency of MPI Boost module (optional), you need first to download and install MPI from the link above. Choose "Win IA32 binary"
- if you are building 32 bit PCL libraries, or "Win X86_64 binary" if you are building 64 bit binaries.
- If you do not need it, you can skip this, and remove "mpi" from the modules list later.
To build Boost, open the CMake-gui and fill in the fields::
then fill the **BUILD_PROJECTS** CMake entry (which is set to `ALL` by default) with a semicolon-seperated
list of boost modules::
- BUILD_PROJECTS : system;filesystem;date_time;thread;iostreams;tr1;serialization;mpi
+ BUILD_PROJECTS : system;filesystem;date_time;thread;iostreams;tr1;serialization
Also, uncheck the **ENABLE_STATIC_RUNTIME** checkbox. Then, click "Configure" again. If you get some
errors related to Python, then uncheck **WITH_PYTHON** checkbox, and click "Configure" again.
Now, in the CMake log, you should see something like::
Reading boost project directories (per BUILD_PROJECTS)
-
+
+ date_time
+ thread
+ serialization
+ system
+ filesystem
- + mpi
+-- optional python bindings disabled since PYTHON_FOUND is false.
+ tr1
in the solution file, and then will install the build libraries along with the header files to the default
installation folder (e.g. C:/Program Files (x86)/Boost).
- .. note::
-
- If you are building the mpi boost module, and you are using CMake <= 2.8.7, you may run into the following error::
-
- LINK : fatal error LNK1104: cannot open file 'C:\Program Files\MPICH2\lib\mpi.lib C:\Program Files\MPICH2\lib\cxx.lib'
-
- As a workaround (until CMake 2.8.8 is out), go back to CMake gui, check the "Advanced" checkbox at the top right of
- CMake window, and edit these entries as follows (please adjust the paths according to your system)::
-
- MPI_CXX_LIBRARIES : C:/Program Files/MPICH2/lib/cxx.lib;C:/Program Files/MPICH2/lib/mpi.lib
- MPI_LIBRARY : C:/Program Files/MPICH2/lib/mpi.lib
-
- Then, click "Generate". Visual Studio will ask you to reload the solution, then re build the **INSTALL** project.
-
.. note::
If you get some errors during the installation process, it could be caused by the UAC of MS Windows
If you don't have a Python interpreter installed CMake would probably not allow you
to generate the project files. To solve this problem you can install the Python interpreter
- (http://www.python.org/download/windows/) or comment the `add_subdirectory( test )` line
+ (https://www.python.org/download/windows/) or comment the `add_subdirectory( test )` line
from C:/PCL_dependencies/flann-1.7.1-src/CMakeLists.txt .
- **QHull** :
Before getting started download and install the following prerequisites for
Mac OS X:
-- **XCode** (http://developer.apple.com/xcode)
+- **XCode** (https://developer.apple.com/xcode/)
Apple’s powerful integrated development environment
Unified matrix library. Used as the matrix backend for SSE optimized math.
- **FLANN** version >= 1.6.8
- (http://www.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN)
+ (http://www.cs.ubc.ca/research/flann/)
Library for performing fast approximate nearest neighbor searches in high
dimensional spaces. Used in `kdtree` for fast approximate nearest neighbors
search.
A documentation system for C++, C, Java, Objective-C, Python, IDL (Corba and
Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D.
-- **Sphinx** (http://sphinx.pocoo.org/)
+- **Sphinx** (http://sphinx-doc.org/)
A tool that makes it easy to create intelligent and beautiful
documentation.
At this point you should have everything needed installed to build PCL with
almost no additional configuration.
-Checkout the PCL source from the trunk::
+Checkout the PCL source from the Github:
- $ svn co http://svn.pointclouds.org/pcl/trunk pcl
+ $ git clone https://github.com/PointCloudLibrary/pcl
$ cd pcl
Create the build directories, configure CMake, build and install::
$ easy_install -U Sphinx
The Sphinx documentation also requires the third party contrib extension
-`sphinxcontrib-doxylink` (http://pypi.python.org/pypi/sphinxcontrib-doxylink)
+`sphinxcontrib-doxylink` (https://pypi.python.org/pypi/sphinxcontrib-doxylink)
to reference the Doxygen built documentation.
To install from source you'll also need Mercurial::
.. note::
Though not a dependency per se, don't forget that you also need the CMake
- build system (http://www.cmake.org/), at least version **2.8.7**. A Subversion client
- for Windows, i.e. TortoiseSVN (http://tortoisesvn.tigris.org/), is also required
- to download the PCL source code.
+ build system (http://www.cmake.org/), at least version **2.8.7**. A Git client
+ for Windows is also required to download the PCL source code.
Downloading PCL source code
---------------------------
cd wherever/you/want/to/put/the/repo/
git clone https://github.com/PointCloudLibrary/pcl.git
-You could also use Github for Windows( http://windows.github.com/ ), but that is potentially more
+You could also use Github for Windows (https://windows.github.com/), but that is potentially more
troublesome than setting up git on windows.
-Alternatively you could use the old subversion repository:
-
-For this,
-you will need Tortoise SVN to download sources from PCL svn server.
-
-Subversion is a version control system similar to CVS which allows developers to simultaneously work on PCL.
-The download operation of the most recent source from the main development line, known as trunk, is called `checkout`.
-
-.. note::
- In this tutorial, we will build the svn trunk of PCL. If you want, you can build a PCL branch instead.
- You can also build an official release using the source archive from http://pointclouds.org/downloads/.
- You can grab PCL branches using Tortoise SVN from :
-
- - pcl-1.x branch from http://svn.pointclouds.org/pcl/branches/pcl-1.x
-
- - pcl-1.5.x branch from http://svn.pointclouds.org/pcl/branches/pcl-1.5.x
-
-First create a folder that will holds PCL source code and binaries. In the remaining of this tutorial we will be using C:\\PCL.
-To checkout PCL source code, navigate to the C:\\PCL folder using Windows file manager. Then right click and choose
-`SVN Checkout...` from the contextual menu. Set "URL of repository" to http://svn.pointclouds.org/pcl/trunk and
-"Checkout directory" to C:\\PCL\\trunk.
-
-.. image:: images/windows/SVNCheckout_pcl_trunk.png
- :alt: SVN Checkout dialog
- :align: center
-
-Click "OK" and the download should start. At the end of this process, you will have PCL source code in C:\\PCL\\trunk.
-
Configuring PCL
---------------
Run the CMake-gui application and fill in the fields::
- Where is the source code : C:/PCL/trunk
+ Where is the source code : C:/PCL/pcl
Where to build the binaries: C:/PCL
Now hit the "Configure" button. You will be asked for a `generator`. A generator is simply a compiler.
Then, you need to enable the `documentation` project in Visual Studio by checking the **BUILD_DOCUMENTATION** checkbox in CMake.
You can also build one single CHM file that will gather all the generated html files into one file. You need the `Microsoft
- HTML HELP Workshop <http://www.microsoft.com/downloads/en/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en>`_.
+ HTML HELP Workshop <http://www.microsoft.com/en-us/download/details.aspx?id=21138>`_.
After you install the `Microsoft HTML HELP Workshop`, hit `Configure`. If CMake is not able to find **HTML_HEL_COMPILER**, then fill
it manually with the path to `hhc.exe` (e.g. C:/Program Files (x86)/HTML Help Workshop/hhc.exe), then click `Configure` and `Generate`.
The code
--------
-Before you begin, you should download the dataset used in this tutorial from `github.com/PointCloudLibrary/data/tree/master/tutorials/correspondence_grouping <https://raw.github.com/PointCloudLibrary/data/master/tutorials/correspondence_grouping>`_
-and extract the files in a folder of your convenience.
+Before you begin, you should download the PCD dataset used in this tutorial from GitHub (`milk.pcd <https://github.com/PointCloudLibrary/pcl/blob/master/test/milk.pcd?raw=true>`_ and
+`milk_cartoon_all_small_clorox.pcd <https://github.com/PointCloudLibrary/pcl/blob/master/test/milk_cartoon_all_small_clorox.pcd?raw=true>`_) and put the files in a folder of your convenience.
Also, copy and paste the following code into your editor and save it as ``correspondence_grouping.cpp`` (or download the source file :download:`here <./sources/correspondence_grouping/correspondence_grouping.cpp>`).
:lines: 327-339
.. note::
- The ``recognize`` method returns a vector of ``Eigen::Matrix4f`` representing a transformation (rotation + translation) for each instance of the model found in the scene (obtained via Absolute Orientation) and a **vector** of :pcl:`Correspondences <pcl::Correspondences>` (a vector of vectors of :pcl:`Correspondence <pcl::Correspondence>`) representing the output of the clustering i.e. each element of this vector is in turn a set of correspondences, representing the correspondences associated to a specific model instance in the scene.
+ The ``recognize`` method returns a vector of ``Eigen::Matrix4f`` representing a transformation (rotation + translation) for each instance of the model found in the scene (obtained via Absolute Orientation) and a **vector** of :pcl:`Correspondences <pcl::Correspondences>` (a vector of vectors of :pcl:`Correspondence <pcl::Correspondences>`) representing the output of the clustering i.e. each element of this vector is in turn a set of correspondences, representing the correspondences associated to a specific model instance in the scene.
If you **only** need the clustered correspondences because you are planning to use them in a different way, you can use the ``cluster`` method.
:language: cpp
:lines: 344-360
-The program then shows in a :pcl:`PCLVisualizer <pcl::PCLVisualizer>` window the scene cloud with a red overlay where an instance of the model has been found.
+The program then shows in a :pcl:`PCLVisualizer <pcl::visualization::PCLVisualizer>` window the scene cloud with a red overlay where an instance of the model has been found.
If the command line switches ``-k`` and ``-c`` have been used, the program also shows a "stand-alone" rendering of the model cloud. If keypoint visualization is enabled, keypoints are displayed as blue dots and if correspondence visualization has been enabled they are shown as a green line for each correspondence which *survived* the clustering process.
.. literalinclude:: sources/correspondence_grouping/correspondence_grouping.cpp
This algorithm performs a scale based segmentation of the given input point cloud, finding points that belong within the scale parameters given.
-.. donpipeline::
.. figure:: images/donpipelinesmall.jpg
:align: center
where :math:`$r_s, r_l \in \mathbb{R}$`, :math:`$r_s<r_l$`, and :math:`$\mathbf{\hat{n}}(p, r)$` is the surface normal estimate at point :math:`$p$`, given the support radius :math:`$r$`. Notice, the response of the operator is a normalized vector field, and is thus orientable (the resulting direction is a key feature), however the operator's norm often provides an easier quantity to work with, and is always in the range :math:`(0,1)`.
-.. scalenormals_figure::
.. figure:: images/don_scalenormals.svg
:width: 60%
:align: center
The above diagram illustrates this effect in 1D. Normals, :math:`$\mathbf{\hat{n}}$`, and tangents, :math:`$T$`, estimated with a small support radius :math:`$r_s$` are affected by small-scale surface structure (and similarly by noise). On the other hand, normals and tangent planes estimated with a large support radius $r_l$ are less affected by small-scale structure, and represent the geometry of larger scale surface structures. In fact a similair set of features is seen in the DoN feature vectors for real-world street curbs in a LiDAR image shown below.
-.. doncurbcloseup::
.. figure:: images/don_curb_closeup_small.jpg
:align: center
------------------------
Fast Point Feature Histograms are implemented in PCL as part of the
-`pcl_features <http://docs.pointclouds.org/trunk/group__features.html>`_
+`pcl_features <http://docs.pointclouds.org/trunk/a02944.html>`_
library.
The default FPFH implementation uses 11 binning subdivisions (e.g., each of the
--- /dev/null
+.. _generate_local_doc:
+
+======================================
+Generate a local documentation for PCL
+======================================
+
+For practical reasons you might want to have a local documentation which corresponds to your
+PCL version. In this tutorial you will learn how to generate it and how to set up Apache so that
+the search bar works.
+
+This tutorial was written for Ubuntu 12.04 and 14.04, feel free to edit it on GitHub to add your platform.
+
+Dependencies
+============
+
+You need to install a few dependencies in order to be able to generate the documentation::
+
+ $ sudo apt-get install doxygen graphviz sphinx3 python-pip
+ $ sudo pip install sphinxcontrib-doxylink
+
+Generate the documentation
+==========================
+
+Go into the build folder of PCL where you've configured it (`see tutorial <http://www.pointclouds.org/downloads/source.html>`_) and enter::
+
+ $ make doc
+
+Then you can open the documentation with your browser, for example::
+
+ $ firefox doc/doxygen/html/index.html
+
+The documentation has been generated in your PCL build directory but it is not installed; if you wish to install it just do::
+
+ $ sudo make install
+
+The default PCL ``CMAKE_INSTALL_PREFIX`` is ``/usr/local``, this means the documentation will be located in ``/usr/local/share/doc/pcl-1.7/html/index.html``
+
+.. note::
+ You will quickly notice that the search bar doesn't work! (searching opens "search.php" instead of searching)
+
+Installing and configuring Apache
+=================================
+
+Apache (`The Apache HTTP Server <https://en.wikipedia.org/wiki/Apache_HTTP_Server>`_) is a web server application, in this section you will
+learn how to configure Apache in order to be able to use the search feature within your offline documentation.
+
+First you need to install Apache and php::
+
+ $ sudo apt-get install apache2 php5 libapache2-mod-php5
+
+Then you need to edit the default website location::
+
+ $ sudo gedit /etc/apache2/sites-available/000-default.conf
+
+Change ``DocumentRoot`` (default = ``/var/www/html``) to ``/usr/local/share/doc/pcl-1.7/html/`` (or your local PCL doc build path)
+
+After that change the Apache directory options::
+
+ $ sudo gedit +153 /etc/apache2/apache2.conf
+
+Replace the paragraph at line 153 with::
+
+ <Directory />
+ #Options FollowSymLinks
+ Options Indexes FollowSymLinks Includes ExecCGI
+ AllowOverride All
+ Order deny,allow
+ Allow from all
+ </Directory>
+
+Restart Apache and the search bar will now work if you open ``localhost``::
+
+ $ sudo /etc/init.d/apache2 restart
+ $ firefox localhost
--------------------
In this tutorial we will learn how to use the implicit shape model algorithm implemented in the ``pcl::ism::ImplicitShapeModel`` class.
-This algorithm was described in the article `"Hough Transforms and 3D SURF for robust three dimensional classification" <http://homes.esat.kuleuven.be/~rtimofte/publications/Knopp-ECCV-2010.pdf>`_ by Jan Knopp, Mukta Prasad, Geert Willems, Radu Timofte, and Luc Van Gool.
+This algorithm was described in the article `"Hough Transforms and 3D SURF for robust three dimensional classification" <http://homes.esat.kuleuven.be/~jknopp/papers/2010eccv_3d_paper.pdf>`_ by Jan Knopp, Mukta Prasad, Geert Willems, Radu Timofte, and Luc Van Gool.
This algorithm is a combination of generalized Hough transform and the Bag of Features approach and its purpose is as follows. Having some training set - point clouds of different objects of the known class - the algorithm computes a certain model which will be later used to predict an object center in the given cloud that wasn't a part of the training set.
Theoretical Primer
#. Previous step gives us a set of directions to the expected center and the power for each vote. In order to get single point that corresponds to center these votes need to be analysed. For this purpose algorithm uses the non maxima suppression approach. User just needs to pass the radius of the object of interest and the rest will be done by the ``ISMVoteList::findStrongestPeaks ()`` method.
For more comprehensive information please refer to the article
-`"Hough Transforms and 3D SURF for robust three dimensional classification" <http://homes.esat.kuleuven.be/~rtimofte/publications/Knopp-ECCV-2010.pdf>`_.
+`"Hough Transforms and 3D SURF for robust three dimensional classification" <http://homes.esat.kuleuven.be/~jknopp/papers/2010eccv_3d_paper.pdf>`_.
The code
--------
Below is the list of clouds that are well suited for this tutorial (they were borrowed from the Ohio dataset).
Clouds for training:
- * `Cat <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_cat.pcd>`_
- * `Horse <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_horse.pcd>`_
- * `Lioness <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_lioness.pcd>`_
- * `Michael <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_michael.pcd>`_
- * `Wolf <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_wolf.pcd>`_
+ * `Cat (train) <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_cat.pcd>`_
+ * `Horse (train) <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_horse.pcd>`_
+ * `Lioness (train) <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_lioness.pcd>`_
+ * `Michael (train) <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_michael.pcd>`_
+ * `Wolf (train) <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_train_wolf.pcd>`_
Clouds for testing:
* `Cat <https://raw.github.com/PointCloudLibrary/data/master/tutorials/ism_test_cat.pcd>`_
In the following section I will go through the steps to scan in a model of the 'lion' object which is about 15 cm high.
-.. image:: images/ihs_lion_photo.JPG
+.. image:: images/ihs_lion_photo.jpg
:alt: Lion object.
:width: 500px
:height: 782px
The following links describe a set of basic PCL tutorials. Please note that
their source codes may already be provided as part of the PCL regular releases,
so check there before you start copy & pasting the code. The list of tutorials
-below is automatically generated from reST files located in our SVN repository.
+below is automatically generated from reST files located in our git repository.
.. note::
* :ref:`basic_structures`
====== ======
- |mi_0| Title: **Getting Started / Basic Structures**
+ |mi_1| Title: **Getting Started / Basic Structures**
Author: *Radu B. Rusu*
Presents the basic data structures in PCL and discusses their usage with a simple code example.
====== ======
- .. |mi_0| image:: images/pcl_logo.png
+ .. |mi_1| image:: images/pcl_logo.png
:height: 75px
* :ref:`using_pcl_pcl_config`
====== ======
- |mi_1| Title: **Using PCL in your own project**
+ |mi_2| Title: **Using PCL in your own project**
Author: *Nizar Sallem*
In this tutorial, we will learn how to link your own project to PCL using cmake.
====== ======
- .. |mi_1| image:: images/pcl_logo.png
+ .. |mi_2| image:: images/pcl_logo.png
:height: 75px
* :ref:`building_pcl`
====== ======
- |mi_2| Title: **Explaining PCL's cmake options**
+ |mi_3| Title: **Explaining PCL's cmake options**
Author: *Nizar Sallem*
In this tutorial, we will explain the basic PCL cmake options, and ways to tweak them to fit your project.
====== ======
- .. |mi_2| image:: images/pcl_ccmake.png
+ .. |mi_3| image:: images/pcl_ccmake.png
:height: 100px
* :ref:`compiling_pcl_dependencies_windows`
====== ======
- |mi_3| Title: **Compiling PCL's dependencies from source on Windows**
+ |mi_4| Title: **Compiling PCL's dependencies from source on Windows**
Authors: *Alessio Placitelli* and *Mourad Boufarguine*
In this tutorial, we will explain how to compile PCL's 3rd party dependencies from source on Microsoft Windows.
====== ======
- .. |mi_3| image:: images/windows_logo.png
+ .. |mi_4| image:: images/windows_logo.png
:height: 100px
* :ref:`compiling_pcl_windows`
====== ======
- |mi_4| Title: **Compiling PCL on Windows**
+ |mi_5| Title: **Compiling PCL on Windows**
Author: *Mourad Boufarguine*
In this tutorial, we will explain how to compile PCL on Microsoft Windows.
====== ======
- .. |mi_4| image:: images/windows_logo.png
+ .. |mi_5| image:: images/windows_logo.png
:height: 100px
* :ref:`compiling_pcl_macosx`
====== ======
- |mi_5| Title: **Compiling PCL and its dependencies from MacPorts and source on Mac OS X**
+ |mi_6| Title: **Compiling PCL and its dependencies from MacPorts and source on Mac OS X**
Author: *Justin Rosen*
This tutorial explains how to build the Point Cloud Library **from MacPorts and source** on Mac OS X platforms.
====== ======
- .. |mi_5| image:: images/macosx_logo.png
+ .. |mi_6| image:: images/macosx_logo.png
:height: 100px
* :ref:`installing_homebrew`
====== ======
- |mi_6| Title: **Installing on Mac OS X using Homebrew**
+ |mi_7| Title: **Installing on Mac OS X using Homebrew**
Author: *Geoffrey Biggs*
This tutorial explains how to install the Point Cloud Library on Mac OS X using Homebrew. Both direct installation and compiling PCL from source are explained.
====== ======
- .. |mi_6| image:: images/macosx_logo.png
+ .. |mi_7| image:: images/macosx_logo.png
:height: 100px
* :ref:`using_pcl_with_eclipse`
====== ======
- |mi_7| Title: **Using Eclipse as your PCL trunk editor**
+ |mi_8| Title: **Using Eclipse as your PCL editor**
Author: *Koen Buys*
- Compatibility: > PCL 1.7
+ Compatibility: PCL git master
- This tutorial shows you how to get your PCL trunk as a project in Eclipse.
+ This tutorial shows you how to get your PCL as a project in Eclipse.
====== ======
- .. |mi_7| image:: images/pcl_logo.png
+ .. |mi_8| image:: images/pcl_with_eclipse/eclipse.png
+ :height: 100px
+
+ * :ref:`generate_local_doc`
+
+ ======= ======
+ |mi_11| Title: **Generate a local documentation for PCL**
+
+ Author: *Victor Lamoine*
+
+ Compatibility: PCL > 1.0
+
+ This tutorial shows you how to generate and use a local documentation for PCL.
+ ======= ======
+
+ .. |mi_11| image:: images/pcl_logo.png
:height: 75px
+ * :ref:`qt_visualizer`
+
+ ====== ======
+ |mi_9| Title: **Create a PCL visualizer in Qt with cmake**
+
+ Author: *Victor Lamoine*
+
+ Compatibility: > PCL 1.5
+
+ This tutorial shows you how to create a PCL visualizer within a Qt application.
+ ====== ======
+
+ .. |mi_9| image:: images/qt_visualizer/qt.png
+ :height: 128px
+
+ * :ref:`matrix_transform`
+
+ ======= ======
+ |mi_10| Title: **Using matrixes to transform a point cloud**
+
+ Author: *Victor Lamoine*
+
+ Compatibility: > PCL 1.5
+
+ This tutorial shows you how to transform a point cloud using a matrix.
+ ======= ======
+
+ .. |mi_10| image:: images/matrix_transform/cube.png
+ :height: 120px
+
.. _advanced_usage:
Advanced Usage
.. |fe_7| image:: images/narf_keypoint_extraction.png
:height: 100px
+ * :ref:`moment_of_inertia`
+
+ ====== ======
+ |fe_8| Title: **Moment of inertia and eccentricity based descriptors**
+
+ Author: *Sergey Ushakov*
+
+ Compatibility: > PCL 1.7
+
+ In this tutorial we will learn how to compute moment of inertia and eccentricity of the cloud. In addition to this we will learn how to extract AABB and OBB.
+ ====== ======
+
+ .. |fe_8| image:: images/moment_of_inertia.png
+ :height: 100px
+
+ * :ref:`rops_feature`
+
+ ====== ======
+ |fe_9| Title: **RoPs (Rotational Projection Statistics) feature**
+
+ Author: *Sergey Ushakov*
+
+ Compatibility: > PCL 1.7
+
+ In this tutorial we will learn how to compute RoPS feature.
+ ====== ======
+
+ .. |fe_9| image:: images/rops_feature.png
+ :height: 100px
+
.. _filtering_tutorial:
Filtering
.. |re_3| image:: images/iterative_closest_point.gif
:height: 100px
+ * :ref:`interactive_icp`
+
+ ====== ======
+ |re_7| Title: **Interactive ICP**
+
+ Author: *Victor Lamoine*
+
+ Compatibility: > PCL 1.5
+
+ This tutorial will teach you how to build an interactive ICP program
+ ====== ======
+
+ .. |re_7| image:: images/interactive_icp/monkey.png
+ :height: 120px
+
* :ref:`normal_distributions_transform`
====== ======
Author: *Martin Saelzle*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
This document shows how to use the In-hand scanner applications to obtain colored models of small objects with RGB-D cameras.
====== ======
Author: *Sergey Ushakov*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
In this tutorial we will learn how to use region growing segmentation algorithm.
====== ======
Author: *Sergey Ushakov*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
In this tutorial we will learn how to use color-based region growing segmentation algorithm.
====== ======
Author: *Sergey Ushakov*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
In this tutorial we will learn how to use min-cut based segmentation algorithm.
====== ======
Author: *Frits Florentinus*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
This tutorial describes how to use the Conditional Euclidean Clustering class in PCL:
A segmentation algorithm that clusters points based on Euclidean distance and a user-customizable condition that needs to hold.
Author: *Yani Ioannou*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
In this tutorial we will learn how to use the difference of normals feature for segmentation.
====== ======
Author: *Jeremie Papon*
- Compatibility: > PCL 1.7
+ Compatibility: >= PCL 1.7
In this tutorial, we show to break a pointcloud into the mid-level supervoxel representation.
====== ======
.. |se_9| image:: images/supervoxel_clustering_small.png
:height: 100px
+
+ * :ref:`progressive_morphological_filtering`
+
+ ======= ======
+ |se_10| Title: **Progressive Morphological Filtering**
+
+ Author: *Brad Chambers*
+
+ Compatibility: >= PCL 1.8
+
+ In this tutorial, we show how to segment a point cloud into ground and non-ground returns.
+ ======= ======
+
+ .. |se_10| image:: images/progressive_morphological_filter.png
+ :height: 100px
+
+ * :ref:`model_outlier_removal`
+
+ ======= ======
+ |se_11| Title: **Model outlier removal**
+
+ Author: *Timo Häckel*
+
+ Compatibility: >= PCL 1.7.2
+
+ This tutorial describes how to extract points from a point cloud using SAC models
+ ======= ======
+
+ .. |se_11| image:: images/pcl_logo.png
+ :height: 75px
.. _surface_tutorial:
.. |su_3| image:: images/greedy_triangulation.png
:height: 100px
+ * :ref:`bspline_fitting`
+
+ ====== ======
+ |su_4| Title: **Fitting trimmed B-splines to unordered point clouds**
+
+ Author: *Thomas Mörwald*
+
+ Compatibility: > PCL 1.7
+
+ In this tutorial we will learn how to reconstruct a smooth surface from an unordered point-cloud by fitting trimmed B-splines.
+ ====== ======
+
+ .. |su_4| image:: images/bspline_bunny.png
+ :height: 100px
+
+
.. _visualization_tutorial:
Visualization
.. |vi_4| image:: images/pcl_plotter_comprational.png
:height: 100px
+ * :ref:`visualization`
+
+ ====== ======
+ |vi_5| Title: **PCL Visualization overview**
+
+ Author: *Radu B. Rusu*
+
+ Compatibility: >= PCL 1.0
+
+ This tutorial will give an overview on the usage of the PCL visualization tools.
+ ====== ======
+
+ .. |vi_5| image:: images/visualization_small.png
+ :height: 120px
+
.. _applications_tutorial:
Applications
.. |ap_3| image:: images/mobile_streaming_1.jpg
:height: 100px
- * :ref:`using_kinfu_large_scale`
-
- ====== ======
- |ap_4| Title: **Using Kinfu Large Scale to generate a textured mesh**
-
- Author: *Francisco Heredia and Raphael Favier*
-
- Compatibility: > PCL 1.5
-
- This tutorial demonstrates how to use KinFu Large Scale to produce a mesh from a room, and apply texture information in post-processing for a more appealing visual result.
- ====== ======
-
- .. |ap_4| image:: images/using_kinfu_large_scale.jpg
- :height: 100px
-
* :ref:`ground_based_rgbd_people_detection`
====== ======
Author: *Matteo Munaro*
- Compatibility: > PCL 1.7 trunk
+ Compatibility: >= PCL 1.7
This tutorial presents a method for detecting people on a ground plane with RGB-D data.
====== ======
=====================================
This tutorial explains how to install the Point Cloud Library on Mac OS
-X using Homebrew. Two approaches are described: using the existing PCL
-formula to automatically install, and using Homebrew only for the
-dependencies with PCL compiled and installed from source.
+X using Homebrew.
.. image:: images/macosx_logo.png
:alt: Mac OS X logo
Prerequisites
=============
-No matter which method you choose, you will need to have Homebrew
-installed. If you do not already have a Homebrew installation, see the
+You will need to have Homebrew installed. If you do not already have a Homebrew installation, see the
`Homebrew homepage`_ for installation instructions.
.. _`Homebrew homepage`:
- http://mxcl.github.com/homebrew/
+ http://brew.sh/
.. _homebrew_all:
Using the formula
=================
-Homebrew includes a formula for installing PCL. This will automatically
-install all necessary dependencies and provides options for controlling
+The PCL formula is not in Homebrew official repositories yet, but it will be after 1.7.2.
+For now it resides at `Fran6co's repository <https://github.com/fran6co/homebrew-cv>`_ and can be tapped from there.
+This will automatically install all necessary dependencies and provides options for controlling
which parts of PCL are installed.
.. note::
- The PCL formula is currently in development. It will be submitted to
- Homebrew shortly. Until then, you can download it from
- `PCL.RB <http://dev.pointclouds.org/attachments/download/1052/pcl.rb>`_. To prepare it,
- follow these steps:
+ To prepare it, follow these steps:
#. Install Homebrew. See the Homebrew website for instructions.
#. Execute ``brew update``.
- #. Download the formula and place it in
- ``/usr/local/Library/Formula`` (or an appropriate location if you
- installed Homebrew somewhere else).
+ #. Execute ``brew tap homebrew/versions``.
+ #. Execute ``brew tap homebrew/science``.
+ #. Execute ``brew tap fran6co/cv``.
-To install using the formula, execute the following command::
+To install the latest version using the formula, execute the following command::
- $ brew install pcl
+ $ brew install pcl --HEAD
You can specify options to control which parts of PCL are installed. For
-example, to disable the Python bindings and visualisation, and enable the
-documentation, execute the following command::
+example, to build just the libraries without extra dependencies, execute the following command::
- $ brew install pcl --nopython --novis --doc
+ $ brew install pcl --HEAD --without-apps --without-tools --without-vtk --without-qvtk --without-qt
For a full list of the available options, see the formula's help::
$ brew options pcl
-You can test the installation by executing the tests included with PCL::
-
- $ brew test pcl
-
Once PCL is installed, you may wish to periodically upgrade it. Update
Homebrew and, if a PCL update is available, upgrade::
$ brew update
$ brew upgrade pcl
-
-.. _homebrew_deps:
-
-Installing from source
-======================
-
-In order to compile every component of PCL, several dependencies must be
-installed. Homebrew includes formulae for all PCL dependencies except
-OpenNI, so this step is relatively easy.
-
-Dependency information
-----------------------
-
-Required
-''''''''
-
-The following libraries are **Required** to build PCL.
-
-- **CMake** version >= 2.8.3 (http://www.cmake.org)
- Cross-platform, open-source build system.
-
- .. note::
-
- Though not a dependency per se, the PCL community relies heavily on CMake
- for the libraries build process.
-
-- **Boost** version >= 1.46.1 (http://www.boost.org/)
- Provides free peer-reviewed portable C++ source libraries. Used for shared
- pointers, and threading.
-
-- **Eigen** version >= 3.0.0 (http://eigen.tuxfamily.org/)
- Unified matrix library. Used as the matrix backend for SSE optimized math.
-
-- **FLANN** version >= 1.6.8
- (http://www.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN)
- Library for performing fast approximate nearest neighbor searches in high
- dimensional spaces. Used in `kdtree` for fast approximate nearest neighbors
- search.
-
-- **Visualization ToolKit (VTK)** version >= 5.6.1 (http://www.vtk.org/)
- Software system for 3D computer graphics, image processing and visualization.
- Used in `visualization` for 3D point cloud rendering and visualization.
-
- .. note::
-
- The current release of PCL (1.2) does not support visualisation on
- Mac OS X. PCL 1.3 is expected to correct this.
-
-Optional
-''''''''
-
-The following libraries are *optional* and provide extended functionality
-within PCL, such as Kinect support.
-
-- **Qhull** version >= 2011.1 (http://www.qhull.org/)
- computes the convex hull, Delaunay triangulation, Voronoi diagram, halfspace
- intersection about a point, furthest-site Delaunay triangulation, and
- furthest-site Voronoi diagram. Used for convex/concave hull decompositions
- in `surface`.
-
-- **libusb** (http://www.libusb.org/)
- A library that gives user level applications uniform access to USB devices
- across many different operating systems.
-
-- **PCL Patched OpenNI/Sensor** (http://www.openni.org/)
- The OpenNI Framework provides the interface for physical devices and for
- middleware components. Used to grab point clouds from OpenNI compliant
- devices.
-
-- **Doxygen** (http://www.doxygen.org)
- A documentation system for C++, C, Java, Objective-C, Python, IDL (Corba and
- Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D.
-
-- **Sphinx** (http://sphinx.pocoo.org/)
- A tool that makes it easy to create intelligent and beautiful
- documentation. PCL uses this and Doxygen to compile the
- documentation.
-
-Advanced (Developers)
-'''''''''''''''''''''
-
-The following libraries are *advanced* and provide additional functionality
-for PCL developers:
-
-- **googletest** version >= 1.6.0 (http://code.google.com/p/googletest/)
- Google's framework for writing C++ tests on a variety of platforms. Used
- to build test units.
-
-Installing dependencies
------------------------
-
-Most of the dependencies will be installed via Homebrew. The remainder,
-we will compile from source.
-
-Install CMake
-'''''''''''''
-::
-
- $ brew install cmake
-
-Install Boost
-'''''''''''''
-::
-
- $ brew install boost
-
-Install Eigen
-'''''''''''''
-::
-
- $ brew install eigen
-
-Install FLANN
-'''''''''''''
-::
-
- $ brew install flann
-
-Install VTK
-'''''''''''
-
-To install VTK, you need a modified Homebrew formula for VTK. Please
-download it from `VTK.RB <http://dev.pointclouds.org/attachments/600/vtk.rb>`_.
-
-::
-
- $ brew install vtk --qt OR --qt-extern [if you have your own Qt installation already]
-
-.. note::
-
- If you are installing PCL 1.2, you may skip this dependency.
-
-Install Qhull (optional)
-''''''''''''''''''''''''
-::
-
- $ brew install qhull
-
-Install libusb (optional)
-'''''''''''''''''''''''''
-::
-
- $ brew install libusb
-
-Install Doxygen (optional)
-''''''''''''''''''''''''''
-::
-
- $ brew install doxygen
-
-Install Sphinx (optional)
-'''''''''''''''''''''''''
-::
-
- $ brew install sphinx
-
-Install patched OpenNI and Sensor
-'''''''''''''''''''''''''''''''''
-
-Download the patched versions of OpenNI and Sensor: `openni_osx.zip
-<http://dev.pointclouds.org/attachments/download/191/openni_osx.zip>`_ and
-`ps_engine_osx.zip
-<http://dev.pointclouds.org/attachments/download/192/ps_engine_osx.zip>`_.
-
-Extract, build, fix permissions and install OpenNI::
-
- $ unzip openni_osx.zip -d openni_osx
- $ cd openni_osx/Redist
- $ chmod -R a+r Bin Include Lib
- $ chmod -R a+x Bin Lib
- $ chmod a+x Include/MacOSX Include/Linux-*
- $ sudo ./install.sh
-
-In addition the PrimeSense XML configuration file found within the
-patched OpenNI download needs its permissions fixed and to be copied to
-the correct location to for the Kinect to work on Mac OS X::
-
- $ chmod a+r openni_osx/Redist/Samples/Config/SamplesConfig.xml
- $ sudo cp openni_osx/Redist/Samples/Config/SamplesConfig.xml /etc/primesense/
-
-Extract, build, fix permissions and install Sensor::
-
- $ unzip ps_engine_osx.zip -d ps_engine_osx
- $ cd ps_engine_osx/Redist
- $ chmod -R a+r Bin Lib Config Install
- $ chmod -R a+x Bin Lib
- $ sudo ./install.sh
-
-Compiling PCL
--------------
-
-At this point you should have everything needed installed to build PCL
-with almost no additional configuration.
-
-Check out the PCL source from the trunk::
-
- $ svn co http://svn.pointclouds.org/pcl/trunk pcl
- $ cd pcl
-
-Create the build directories, configure CMake, build and install::
-
- $ mkdir build
- $ cd build
- $ cmake ..
- $ make
- $ sudo make install
-
-.. note::
-
- If you are installing PCL 1.2, disable the visualisation module, or
- compilation will fail::
-
- $ cmake .. -DBUILD_visualization:BOOL=OFF
-
-The customization of the build process is out of the scope of this tutorial and
-is covered in greater detail in the :ref:`building_pcl` tutorial.
-
-Compiling the documentation (optional)
---------------------------------------
-
-If you installed the Doxygen and Sphinx dependencies, you can compile
-the documentation after compiling PCL. To do so, use this command::
-
- $ make doc
-
-The tutorials can be built using this command::
-
- $ make Tutorials
-
-.. note::
-
- The Homebrew formula for Sphinx may not install the extension
- necessary to link to the Doxygen-generated documentation. In this
- case, you will need to install Sphinx and the extension manually.
- Start by installing Sphinx using easy_install::
-
- $ easy_install -U Sphinx
-
- Next, install Mercurial (see the Mercurial documentation) and the
- extension::
-
- $ hg clone http://bitbucket.org/birkenfeld/sphinx-contrib
- $ cd sphinx-contrib/doxylink
- $ python setup.py install
-
Using PCL
---------
Now that PCL in installed, you can start using the library in your own
projects by following the :ref:`using_pcl_pcl_config` tutorial.
-
--- /dev/null
+.. _interactive_icp:
+
+===================================
+Interactive Iterative Closest Point
+===================================
+
+This tutorial will teach you how to write an interactive ICP viewer. The program will
+load a point cloud and apply a rigid transformation on it. After that the ICP algorithm will
+align the transformed point cloud with the original. Each time the user presses "space"
+an ICP iteration is done and the viewer is refreshed.
+
+.. contents::
+
+Creating a mesh with Blender
+============================
+You can easily create a sample point cloud with Blender.
+Install and open Blender then delete the cube in the scene by pressing "Del" key :
+
+.. image:: images/interactive_icp/del_cube.png
+ :height: 285
+
+Add a monkey mesh in the scene :
+
+.. image:: images/interactive_icp/add_monkey.png
+ :height: 328
+
+Subdivide the original mesh to make it more dense :
+
+.. image:: images/interactive_icp/add_sub.png
+ :height: 500
+
+Configure the subdivision to 2 or 3 for example : dont forget to apply the modifier
+
+.. image:: images/interactive_icp/sub2.png
+ :height: 203
+
+Export the mesh into a PLY file :
+
+.. image:: images/interactive_icp/export.png
+ :height: 481
+
+The code
+========
+
+First, create a file, let's say, ``interactive_icp.cpp`` in your favorite
+editor, and place the following code inside it:
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :linenos:
+
+The explanations
+================
+
+Now, let's break down the code piece by piece.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 1-8
+
+We include all the headers we will make use of.
+**#include <pcl/registration/ia_ransac.h>** allows us to use **pcl::transformPointCloud** function.
+**#include <pcl/console/parse.h>>** allows us to use parse the arguments given to the program.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 9-12
+
+Two typedefs to simplify declarations and code reading.
+The bool will help us know when the user asks for the next iteration of ICP
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 14-24
+
+This functions takes the reference of a 4x4 matrix and prints the rigid transformation in an human
+readable way.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 25-32
+
+This function is the callback for the viewer. This function will be called whenever a key is pressed
+when the viewer window is on top. If "space" is hit; set the bool to true.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 38-41
+
+The 3 point clouds we will use to store the data.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 42-71
+
+We check the arguments of the program, set the number of initial ICP iterations
+and try to load the PLY file.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 72-91
+
+We transform the original point cloud using a rigid matrix transformation.
+See the related tutorial in PCL documentation for more information.
+**cloud_in** contains the original point cloud.
+**cloud_tr** and **cloud_icp** contains the translated/rotated point cloud.
+**cloud_tr** is a backup we will use for display (green point cloud).
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 93-101
+
+This is the creation of the ICP object. We set the parameters of the ICP algorithm.
+**setMaximumIterations(iterations)** sets the number of initial iterations to do (1
+is the default value). We then transform the point cloud into **cloud_icp**.
+After the first alignment we set ICP max iterations to 1 for all the next times this
+ICP object will be used (when the user presses "space").
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 103-115
+
+Check if the ICP algorithm converged; otherwise exit the program.
+In case of success we store the transformation matrix in a 4x4 matrix and
+then print the rigid matrix transformation. The reason why we store this
+matrix is explained later.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 117-127
+
+For the visualization we create two viewports in the visualizer vertically
+separated. **bckgr_gray_level** and **txt_gray_lvl** are variables to easily
+switch from white background & black text/point cloud to black background &
+white text/point cloud.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 129-141
+
+We add the original point cloud in the 2 viewports and display it the same color
+as **txt_gray_lvl**. We add the point cloud we transformed using the matrix in the left
+viewport in green and the point cloud aligned with ICP in red (right viewport).
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 143-150
+
+We add descriptions for the point clouds in each viewport so the user knows what is what.
+The string stream ss is needed to transform the integer **iterations** into a string.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 152-161
+
+We set the two viewports background color according to **bckgr_gray_level**.
+To get the camera parameters I simply pressed "C" in the viewer. Then I copied the
+parameters into this function to save the camera position / orientation / focal point.
+The function **registerKeyboardCallback** allows us to call a function whenever the
+users pressed a keyboard key when viewer windows is on top.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 163-166
+
+This is the normal behaviour if no key is pressed. The viewer waits to exit.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 169-172
+
+If the user press any key of the keyboard, the function **keyboardEventOccurred** is called;
+this function checks if the key is "space" or not. If yes the global bool **next_iteration**
+is set to true, allowing the viewer loop to enter the next part of the code: the ICP object
+is called to align the meshes. Remember we already configured this object input/output clouds
+and we set max iterations to 1 in lines 90-93.
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 167-194
+
+As before we check if ICP as converged, if not we exit the program.
+**printf("\033[11A");** is a little trick to go up 11 lines in the terminal to write
+over the last matrix displayed. In short it allows to replace text instead of writing
+new lines; making the ouptut more readable.
+We increment **iterations** to update the text value in the visualizer.
+
+Now we want to display the rigid transformation from the original transformed point cloud to
+the current alignment made by ICP. The function **getFinalTransformation()** returns the rigid
+matrix transformation done during the iterations (here: 1 iteration). This means that if you have already
+done 10 iterations this function returns the matrix to transform the point cloud from the iteration 10 to 11.
+
+This is not what we want. If we multiply the last matrix with the new one the result is the transformation matrix from
+the start to the current iteration. This is basically how it works ::
+
+ matrix[ICP 0->1]*matrix[ICP 1->2]*matrix[ICP 2->3] = matrix[ICP 0->3]
+
+While this is mathematically true, you will easilly notice that this is not true in this program due to roundings.
+This is why I introduced the initial ICP iteration parameters. Try to launch the program with 20 initial iterations
+and save the matrix in a text file. Launch the same program with 1 initial iteration and press space till you go to 20
+iterations. You will a notice a slight difference. The matrix with 20 initial iterations is much more accurate than the
+one multiplied 19 times.
+
+
+.. literalinclude:: sources/interactive_icp/interactive_icp.cpp
+ :language: cpp
+ :lines: 195-199
+
+We set the bool to false and the rest is the ending of the program.
+
+Compiling and running the program
+=================================
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/interactive_icp/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./interactive_icp monkey.ply 1
+
+Remember that the matrix displayed is not very accurate if you do a lot of iterations
+by pressing "space".
+
+You will see something similar to this::
+
+ $ ./interactive_icp ../monkey.ply 5
+ [pcl::PLYReader] ../monkey.ply:12: property 'list uint8 uint32 vertex_indices' of element 'face' is not handled
+
+ Loaded file ../monkey.ply (125952 points) in 578 ms
+
+ Applying this rigid transformation to: cloud_in -> cloud_icp
+ Rotation matrix :
+ | 0.924 -0.383 0.000 |
+ R = | 0.383 0.924 0.000 |
+ | 0.000 0.000 1.000 |
+ Translation vector :
+ t = < 0.000, 0.000, 0.400 >
+
+ Applied 1 ICP iteration(s) in 2109 ms
+
+ ICP has converged, score is 0.0182442
+
+ ICP transformation 1 : cloud_icp -> cloud_in
+ Rotation matrix :
+ | 0.998 0.066 -0.003 |
+ R = | -0.066 0.997 0.033 |
+ | 0.005 -0.033 0.999 |
+ Translation vector :
+ t = < 0.022, -0.017, -0.097 >
+
+If ICP did a perfect job the two matrices should have exactly the same values and
+the matrix found by ICP should have inverted signs outside the diagonal. For example ::
+
+ | 0.924 -0.383 0.000 |
+ R = | 0.383 0.924 0.000 |
+ | 0.000 0.000 1.000 |
+ Translation vector :
+ t = < 0.000, 0.000, 0.400 >
+
+ | 0.924 0.383 0.000 |
+ R = | -0.383 0.924 0.000 |
+ | 0.000 0.000 1.000 |
+ Translation vector :
+ t = < 0.000, 0.000, -0.400 >
+
+.. DANGER::
+ If you iterate several times manually using "space"; the results will become more and more erroned because
+ of the matrix multiplication (see line 181 of the original code)
+ If you seek precision, provide an initial number of iterations to the program
+
+.. image:: images/interactive_icp/icp-1.png
+ :height: 605
+
+After 25 iterations the models fits perfectly the original cloud. Remember that this is an easy job for ICP because
+you are asking to align two identical point clouds !
+
+.. image:: images/interactive_icp/animation.gif
+ :height: 630
+
--- /dev/null
+.. _matrix_transform:
+
+Using a matrix to transform a point cloud
+-----------------------------------------
+
+In this tutorial we will learn how to transform a point cloud using a 4x4 matrix.
+We will apply a rotation and a translation to a loaded point cloud and display then
+result.
+
+This program is able to load one PCD or PLY file; apply a matrix transformation on it
+and display the original and transformed point cloud.
+
+The code
+--------
+
+First, create a file, let's say, ``matrix_transform.cpp`` in your favorite
+editor, and place the following code inside it:
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :linenos:
+
+The explanation
+---------------
+
+Now, let's break down the code piece by piece.
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 1-8
+
+We include all the headers we will make use of.
+**#include <pcl/common/transforms.h>** allows us to use **pcl::transformPointCloud** function.
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 10-17
+
+This function display the help in case the user didn't provide expected arguments.
+
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 24-28
+
+We parse the arguments on the command line, either using **-h** or **--help** will
+display the help. This terminates the program
+
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 30-45
+
+We look for .ply or .pcd filenames in the arguments. If not found; terminate the program.
+The bool **file_is_pcd** will help us choose between loading PCD or PLY file.
+
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 47-62
+
+We now load the PCD/PLY file and check if the file was loaded successfuly. Otherwise terminate
+the program.
+
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 64-75
+
+This is a first approach to create a transformation. This will help you understand how transformation matrices work.
+We initialize a 4x4 matrix to identity; ::
+
+ | 1 0 0 0 |
+ i = | 0 1 0 0 |
+ | 0 0 1 0 |
+ | 0 0 0 1 |
+
+.. note::
+
+ The identity matrix is the equivalent of "1" when multiplying numbers; it changes nothing.
+ It is a square matrix with ones on the main diagonal and zeros elsewhere.
+
+This means no transformation (no rotation and no translation). We do not use the
+last row of the matrix.
+
+The first 3 rows and colums (top left) components are the rotation
+matrix. The first 3 rows of the last column is the translation.
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 77-90
+
+Here we defined a 45° (PI/4) rotation around the Z axis and a translation on the X axis.
+This is the transformation we just defined ::
+
+ | cos(θ) -sin(θ) 0.0 |
+ R = | sin(θ) cos(θ) 0.0 |
+ | 0.0 0.0 1.0 |
+
+ t = < 2.5, 0.0, 0.0 >
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 92-105
+
+This second approach is easier to understand and is less error prone.
+Be carefull if you want to apply several rotations; rotations are not commutative ! This means than in most cases:
+rotA * rotB != rotB * rotA.
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 107-110
+
+Now we apply this matrix on the point cloud **source_cloud** and we save the result in the
+newly created **transformed_cloud**.
+
+.. literalinclude:: sources/matrix_transform/matrix_transform.cpp
+ :language: cpp
+ :lines: 112-135
+
+We then visualize the result using the **PCLVisualizer**. The original point cloud will be
+displayed white and the transformed one in red. The coordoniates axis will be displayed.
+We also set the background color of the visualizer and the point display size.
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/matrix_transform/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./matrix_transform cube.ply
+
+You will see something similar to this::
+
+ ./matrix_transform cube.ply
+ [pcl::PLYReader] /home/victor/cube.ply:12: property 'list uint8 uint32 vertex_indices' of element 'face' is not handled
+ Method #1: using a Matrix4f
+ 0.707107 -0.707107 0 2.5
+ 0.707107 0.707107 0 0
+ 0 0 1 0
+ 0 0 0 1
+
+ Method #2: using an Affine3f
+ 0.707107 -0.707107 0 2.5
+ 0.707107 0.707107 0 0
+ 0 0 1 0
+ 0 0 0 1
+
+ Point cloud colors : white = original point cloud
+ red = transformed point cloud
+
+.. image:: images/matrix_transform/cube_big.png
+ :height: 614
+
+More about transformations
+--------------------------
+
+| So now you successfully transformed a point cloud using a transformation matrix.
+| What if you want to transform a single point ? A vector ?
+
+| A point is defined in 3D space with its three coordinates; x,y,z (in a cartesian coordinate system).
+| How can you multiply a vector (with 3 coordinates) with a 4x4 matrix ? You simply can't ! If you don't know why please refer to `matrix multiplications on wikipedia <https://en.wikipedia.org/wiki/Matrix_multiplication>`_.
+
+We need a vector with 4 components. What do you put in the last component ? It depends on what you want to do:
+
+* If you want to transform a point: put 1 at the end of the vector so that the translation is taken in account.
+* If you want to transform the direction of a vector: put 0 at the end of the vector to ignore the translation.
+
+Here's a quick example, we want to transform the following vector: ::
+
+ [10, 5, 0, 3, 0, -1]
+
+| Where the first 3 components defines the origin coordinates and the last 3 components the direction.
+| This vector starts at point 10, 5, 0 and ends at 13, 5, -1.
+
+This is what you need to do to transform the vector: ::
+
+ [10, 5, 0, 1] * 4x4_transformation_matrix
+ [3, 0, -1, 0] * 4x4_transformation_matrix
+
is implemented using the Android `NativeActivity <https://developer.android.com/reference/android/app/NativeActivity.html>`_.
Using *NativeActivity*, an Android app can be implemented in pure
C++ code without writing components in Java. The app uses APIs provided by the `Android
-NDK <http://developer.android.com/sdk/ndk/overview.html>`_ to handle touch events
+NDK <http://developer.android.com/tools/sdk/ndk/index.html>`_ to handle touch events
and app life cycle events. While this is suitable for an example app, apps that
demand extra features and user interface elements will require implementations that mix
native code and Java components and APIs.
--- /dev/null
+.. _model_outlier_removal:
+
+Filtering a PointCloud using ModelOutlierRemoval
+------------------------------------------------
+
+This tutorial demonstrates how to extract parametric models for example for planes or spheres
+out of a PointCloud by using SAC_Models with known coefficients.
+If you don't know the models coefficients take a look at the :ref:`random_sample_consensus` tutorial.
+
+The code
+--------
+
+First, create a file, let's call it ``model_outlier_removal.cpp``, in your favorite
+editor, and place the following inside it:
+
+.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp
+ :language: cpp
+ :linenos:
+
+The explanation
+---------------
+
+Now, let's break down the code piece by piece.
+
+In the following lines, we define the PointClouds structures, fill in noise, random points
+on a plane as well as random points on a sphere and display its content to screen.
+
+.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp
+ :language: cpp
+ :lines: 7-45
+
+Finally we extract the sphere using ModelOutlierRemoval.
+
+.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp
+ :language: cpp
+ :lines: 50-61
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/model_outlier_removal/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./model_outlier_removal
+
+You will see something similar to::
+
+ Cloud before filtering:
+ 0.352222 -0.151883 -0.106395
+ -0.397406 -0.473106 0.292602
+ -0.731898 0.667105 0.441304
+ -0.734766 0.854581 -0.0361733
+ -0.4607 -0.277468 -0.916762
+ -0.82 -0.341666 0.4592
+ -0.728589 0.667873 0.152
+ -0.3134 -0.873043 -0.3736
+ 0.62553 0.590779 0.5096
+ -0.54048 0.823588 -0.172
+ -0.707627 0.424576 0.5648
+ -0.83153 0.523556 0.1856
+ -0.513903 -0.719464 0.4672
+ 0.291534 0.692393 0.66
+ 0.258758 0.654505 -0.7104
+ Sphere after filtering:
+ -0.82 -0.341666 0.4592
+ -0.728589 0.667873 0.152
+ -0.3134 -0.873043 -0.3736
+ 0.62553 0.590779 0.5096
+ -0.54048 0.823588 -0.172
+ -0.707627 0.424576 0.5648
+ -0.83153 0.523556 0.1856
+ -0.513903 -0.719464 0.4672
+ 0.291534 0.692393 0.66
+ 0.258758 0.654505 -0.7104
+
--- /dev/null
+.. _moment_of_inertia:
+
+Moment of inertia and eccentricity based descriptors
+----------------------------------------------------
+
+In this tutorial we will learn how to use the `pcl::MomentOfInertiaEstimation` class in order to obtain descriptors based on
+eccentricity and moment of inertia. This class also allows to extract axis aligned and oriented bounding boxes of the cloud.
+But keep in mind that extracted OBB is not the minimal possible bounding box.
+
+Theoretical Primer
+------------------
+
+The idea of the feature extraction method is as follows.
+First of all the covariance matrix of the point cloud is calculated and its eigen values and vectors are extracted.
+You can consider that the resultant eigen vectors are normalized and always form the right-handed coordinate system
+(major eigen vector represents X-axis and the minor vector represents Z-axis). On the next step the iteration process takes place.
+On each iteration major eigen vector is rotated. Rotation order is always the same and is performed around the other
+eigen vectors, this provides the invariance to rotation of the point cloud. Henceforth, we will refer to this rotated major vector as current axis.
+
+.. image:: images/eigen_vectors.png
+ :height: 360px
+
+For every current axis moment of inertia is calculated. Moreover, current axis is also used for eccentricity calculation.
+For this reason current vector is treated as normal vector of the plane and the input cloud is projected onto it.
+After that eccentricity is calculated for the obtained projection.
+
+.. image:: images/projected_cloud.png
+ :height: 360px
+
+Implemented class also provides methods for getting AABB and OBB. Oriented bounding box is computed as AABB along eigen vectors.
+
+The code
+--------
+
+First of all you will need the point cloud for this tutorial.
+`This <https://github.com/PointCloudLibrary/data/blob/master/tutorials/min_cut_segmentation_tutorial.pcd>`_ is the one presented on the screenshots.
+Next what you need to do is to create a file ``moment_of_inertia.cpp`` in any editor you prefer and copy the following code inside of it:
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :linenos:
+
+The explanation
+---------------
+
+Now let's study out what is the purpose of this code. First few lines will be omitted, as they are obvious.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 13-15
+
+These lines are simply loading the cloud from the .pcd file.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 17-19
+
+Here is the line where the instantiation of the ``pcl::MomentOfInertiaEstimation`` class takes place.
+Immediately after that we set the input cloud and start the computational process, that easy.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 21-31
+
+This is were we declare all necessary variables needed to store descriptors and bounding boxes.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 33-39
+
+These lines show how to access computed descriptors and other features.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 41-46
+
+These lines simply create the instance of ``PCLVisualizer`` class for result visualization.
+Here we also add the cloud and the AABB for visualization.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 48-50
+
+Visualization of the OBB is little more complex. So here we create a quaternion from the rotational matrix, set OBBs position
+and pass it to the visualizer.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 52-58
+
+This lines are responsible for eigen vectors visualization.
+
+.. literalinclude:: sources/moment_of_inertia/moment_of_inertia.cpp
+ :language: cpp
+ :lines: 60-98
+
+This huge amount of code shows how to work with the oriented bounding box. Note that you need to rotate each of the vertices of the OBB.
+This code does the same thing as ``PCLVisualizer::addCube ()`` method. Its only purpose is to show how to work with OBB
+if you don't have such usable method as ``PCLVisualizer::addCube ()``.
+
+Few lines that left simply launch the visualization process.
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/moment_of_inertia/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./moment_of_inertia lamppost.pcd
+
+You should see something similar to this image. Here AABB is yellow, OBB is red. You can also see the eigen vectors.
+
+.. image:: images/moment_of_inertia.png
+ :height: 360px
presents how to set up and use the grabber, and since it's so simple, we can
keep it short :).
-The cameras that we have tested so far are the `Primesense Reference Design <http://www.primesense.com/?p=514>`_, `Microsoft Kinect <http://www.xbox.com/kinect/>`_ and `Asus Xtion Pro <http://event.asus.com/wavi/product/WAVI_Pro.aspx>`_ cameras:
+The cameras that we have tested so far are the `Primesense Reference Design <http://www.primesense.com/>`_, `Microsoft Kinect <http://www.xbox.com/kinect/>`_ and `Asus Xtion Pro <http://event.asus.com/wavi/product/WAVI_Pro.aspx>`_ cameras:
.. image:: images/openni_cams.jpg
| This is done by finding the best transform between each consecutive cloud, and accumulating these transforms over the whole set of clouds.
| Your data set should consist of clouds that have been roughly pre-aligned in a common frame (e.g. in a robot's odometry or map frame) and overlap with one another.
-| We provide a set of clouds at `github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise/ <https://raw.github.com/PointCloudLibrary/data/master/tutorials/pairwise/>`_.
+| We provide a set of clouds at `github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise/ <https://github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise>`_.
The code
:language: cmake
:linenos:
-Note that the line
-
-.. code-block:: cmake
-
- add_definitions(-Wno-deprecated -DEIGEN_DONT_VECTORIZE -DEIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
-
-is usefull only on 32-bit systems, that would (sometimes) trigger the following Eigen exception::
-
- Eigen::internal::plain_array<T, Size, MatrixOrArrayOptions, 16>::plain_array() [with T = float, int Size = 16, int MatrixOrArrayOptions = 0]: Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.``
-
-
Copy the files from `github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise
<https://raw.github.com/PointCloudLibrary/data/master/tutorials/pairwise/>`_ in your working folder.
PCLPlotter provides a very straightforward and easy interface for plotting graphs. One can visualize all sort of important plots -
from polynomial functions to histograms - inside the library without going to any other softwares (like MATLAB).
-Please go through the `documentation <http://docs.pointclouds.org/trunk/classpcl_1_1visualization_1_1_p_c_l_plotter.html>`_ when some specific concepts are introduced in this tutorial to know the exact method signatures.
+Please go through the `documentation <http://docs.pointclouds.org/trunk/a01175.html>`_ when some specific concepts are introduced in this tutorial to know the exact method signatures.
The code for the visualization of a plot are usually as simple as the following snippet.
'Plotting' Histogram
--------------------
-PCLPlotter provides a very convenient MATLAB like histogram plotting function (`hist() <http://www.mathworks.com/help/techdoc/ref/hist.html>`_ in MATLAB). It takes raw data and bins them according to their frequency and plot them as bar chart.
+PCLPlotter provides a very convenient MATLAB like histogram plotting function (`hist() <http://www.mathworks.fr/fr/help/matlab/ref/hist.html>`_ in MATLAB). It takes raw data and bins them according to their frequency and plot them as bar chart.
.. code-block:: cpp
<iframe width="480" height="270" src="http://www.youtube.com/embed/2Xgd67nkwzs" frameborder="0" allowfullscreen></iframe>
-
\ No newline at end of file
+
-----------------------
Point Feature Histograms are implemented in PCL as part of the `pcl_features
-<http://docs.pointclouds.org/trunk/group__features.html>`_ library.
+<http://docs.pointclouds.org/trunk/a02944.html>`_ library.
The default PFH implementation uses 5 binning subdivisions (e.g., each of the
four feature values will use this many bins from its value interval), and does
not include the distances (as explained above -- although the
**computePairFeatures** method can be called by the user to obtain the
-distances too, if desired) which results in a 125-byte array (:math:`3^5`) of
+distances too, if desired) which results in a 125-byte array (:math:`5^3`) of
float values. These are stored in a **pcl::PFHSignature125** point type.
The following code snippet will estimate a set of PFH features for all the
.. important::
- Please visit http://docs.pointclouds.org/trunk/group__sample__consensus.html
+ Please visit http://docs.pointclouds.org/trunk/a02954.html
for more information on various other implemented Sample Consensus models and
robust estimators.
--- /dev/null
+.. _progressive_morphological_filtering:
+
+Identifying ground returns using ProgressiveMorphologicalFilter segmentation
+----------------------------------------------------------------------------
+
+Implements the Progressive Morphological Filter for segmentation of ground
+points.
+
+Background
+----------
+
+A complete description of the algorithm can be found in the article `"A
+Progressive Morphological Filter for Removing Nonground Measurements from
+Airborne LIDAR Data" <http://users.cis.fiu.edu/~chens/PDF/TGRS.pdf>`_ by K.
+Zhang, S. Chen, D. Whitman, M. Shyu, J. Yan, and C. Zhang.
+
+The code
+--------
+
+First, download the dataset `samp11-utm.pcd
+<https://raw.github.com/PointCloudLibrary/data/master/terrain/samp11-utm.pcd>`_
+and save it somewhere to disk.
+
+Then, create a file, let's say, ``bare_earth.cpp`` in your favorite editor, and
+place the following inside it:
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :linenos:
+
+The explanation
+---------------
+
+Now, let's break down the code piece by piece.
+
+The following lines of code will read the point cloud data from disk.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 14-17
+
+
+Then, a *pcl::ProgressiveMorphologicalFilter* filter is created. The output
+(the indices of ground returns) is computed and stored in *ground*.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 22-29
+
+
+To extract the ground points, the ground indices are passed into a
+*pcl::ExtractIndices* filter.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 31-35
+
+
+The ground returns are written to disk for later inspection.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 40-41
+
+
+Then, the filter is called with the same parameters, but with the output
+negated, to obtain the non-ground (object) returns.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 43-45
+
+
+And the data is written back to disk.
+
+.. literalinclude:: sources/bare_earth/bare_earth.cpp
+ :language: cpp
+ :lines: 50
+
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/bare_earth/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./bare_earth
+
+You will see something similar to::
+
+ Cloud before filtering:
+ points[]: 38010
+ width: 38010
+ height: 1
+ is_dense: 1
+ sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
+
+ Ground cloud after filtering:
+ points[]: 18667
+ width: 18667
+ height: 1
+ is_dense: 1
+ sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
+
+ Object cloud after filtering:
+ points[]: 19343
+ width: 19343
+ height: 1
+ is_dense: 1
+ sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
+
+
+You can also look at your outputs samp11-utm_inliers.pcd and
+samp11-utm_outliers.pcd::
+
+ $ ./pcl_viewer samp11-utm_ground.pcd samp11-utm_object.pcd
+
+You are now able to see both the ground and object returns in one viewer. You
+should see something similar to this:
+
+.. image:: images/progressive_morphological_filter.png
+ :alt: Output Progressive Morphological Filter
+ :align: center
+ :width: 600px
--- /dev/null
+.. _qt_visualizer:
+
+========================================
+Create a PCL visualizer in Qt with cmake
+========================================
+
+In this tutorial we will learn how to create a PCL + Qt project, we will use Cmake rather than Qmake.The program we are going to
+write is a simple PCL visualizer which allow to change a randomly generated point cloud color.
+
+| The tutorial was tested on Linux Ubuntu 12.04 and 14.04. It also seems to be working fine on Windows 8.1 x64.
+| Feel free to push modifications into the git repo to make this code/tutorial compatible with your platform !
+
+.. contents::
+
+The project
+===========
+
+For this project Qt is of course mandatory, make sure it is installed and PCL deals with it.
+`qmake <http://qt-project.org/doc/qt-4.8/qmake-manual.html>`_ is a tool that helps simplify the build process for development project across different platforms,
+we will use `cmake <https://en.wikipedia.org/wiki/CMake>`_ instead because most projects in PCL uses cmake and it is simpler in my opinion.
+
+This is how I organized the project: the build folder contains all built files and the src folder holds all sources files ::
+
+ .
+ ├── build
+ └── src
+ ├── CMakeLists.txt
+ ├── main.cpp
+ ├── pclviewer.cpp
+ ├── pclviewer.h
+ ├── pclviewer.ui
+ ├── pcl_visualizer.pro
+ └── pcl_visualizer.pro.user
+
+If you want to change this layout you will have to do minor modifications in the code, especially line 2 of ``pclviewer.cpp``
+Create the folder tree and download the sources files from `github <https://github.com/PointCloudLibrary/pcl/tree/master/doc/tutorials/content/sources/qt_visualizer>`_.
+
+.. note::
+ File paths should not contain any special caracter or the compilation might fail with a ``moc: Cannot open options file specified with @`` error message.
+
+Qt configuration
+================
+
+First we will take a look at how Qt is configured to build this project. Simply open ``pcl_visualizer.pro`` with Qt (or double click on the file)
+ and go to the **Projects** tab
+
+.. image:: images/qt_visualizer/qt_config.png
+ :height: 757
+
+In this example note that I deleted the **Debug** configuration and only kept the **Release** config.
+Use relative paths like this is better than absolute paths; this project should work wherever it has been put.
+
+We specify in the general section that we want to build in the folder ``../build`` (this is a relative path from the ``.pro`` file).
+
+The first step of the building is to call ``cmake`` (from the ``build`` folder) with argument ``../src``; this is gonna create all files in the
+``build`` folder without modifying anything in the ``src`` foler; thus keeping it clean.
+
+Then we just have to compile our program; the argument ``-j2`` allow to specify how many thread of your CPU you want to use for compilation. The more thread you use
+the faster the compilation will be (especially on big projects); but if you take all threads from the CPU your OS will likely be unresponsive during
+the compilation process.
+See `compiler optimizations <http://www.pointclouds.org/documentation/advanced/compiler_optimizations.php#compiler-optimizations>`_ for more information.
+
+If you don't want to use Qt Creator but Eclipse instead; see `using PCL with Eclipse <http://www.pointclouds.org/documentation/tutorials/using_pcl_with_eclipse.php#using-pcl-with-eclipse>`_.
+
+User interface (UI)
+===================
+
+The point of using Qt for your projects is that you can easily build cross-platform UIs. The UI is held in the ``.ui`` file
+You can open it with a text editor or with Qt Creator, in this example the UI is very simple and it consists of :
+
+ * `QMainWindow <http://qt-project.org/doc/qt-4.8/qmainwindow.html>`_, QWidget: the window (frame) of your application
+ * qvtkWidget: The VTK widget which holds the PCLVisualizer
+ * `QLabel <http://qt-project.org/doc/qt-4.8/qlabel.html>`_: Display text on the user interface
+ * `QSlider <http://qt-project.org/doc/qt-4.8/qslider.html>`_: A slider to choose a value (here; an integer value)
+ * `QLCDNumber <http://qt-project.org/doc/qt-4.8/qlcdnumber.html>`_: A digital display, 8 segment styled
+
+.. image:: images/qt_visualizer/ui.png
+ :height: 518
+
+If you click on Edit `Signals/Slots <http://qt-project.org/doc/qt-4.8/signalsandslots.html>`_ at the top of the Qt window you will see the relationships
+between some of the UI objects. In our example the sliderMoved(int) signal is connected to the display(int) slot; this means that everytime we move the slider
+the digital display is updated accordingly to the slider value.
+
+The code
+========
+
+Now, let's break down the code piece by piece.
+
+main.cpp
+--------
+
+.. literalinclude:: sources/qt_visualizer/main.cpp
+ :language: cpp
+
+| Here we include the headers for the class PCLViewer and the headers for QApplication and QMainWindow.
+| Then the main functions consists of instanciating a QApplication `a` which manages the GUI application's control flow and main settings.
+| A ``PCLViewer`` object called `w` is instanciated and it's method ``show()`` is called.
+| Finally we return the state of our program exit through the QApplication `a`.
+
+pclviewer.h
+-----------
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 1-18
+
+This file is the header for the class PCLViewer; we include ``QMainWindow`` because this class contains UI elements, we include the PCL headers we will
+be using and the VTK header for the ``qvtkWidget``. We also define typedefs of the point types and point clouds, this improves readabily.
+
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 20-23
+
+We declare the namespace ``Ui`` and the class PCLViewer inside it.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 25-27
+
+This is the definition of the PCLViewer class; the macro ``Q_OBJECT`` tells the compiler that this object contains UI elements;
+this imply that this file will be processed through `the Meta-Object Compiler (moc) <http://qt-project.org/doc/qt-4.8/moc.html>`_.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 29-31
+
+The constructor and destructor of the PCLViewer class.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 33-50
+
+These are the public slots; these functions will be linked with UI elements actions.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.h
+ :language: cpp
+ :lines: 52-58
+
+| A boost shared pointer to a PCLVisualier and a pointer to a point cloud are defined here.
+| The integers ``red``, ``green``, ``blue`` will help us store the value of the sliders.
+
+pclviewer.cpp
+-------------
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 1-14
+
+We include the class header and the header for the UI object; note that this file is generated by the moc and it's path depend on
+where you call cmake !
+
+After that is the constructor implementation; we setup the ui and the window title name.
+| Then we initialize the cloud pointer member of the class at a newly allocated point cloud pointer.
+| The cloud is resized to be able to hold 200 points.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 16-31
+
+| ``red`` ``green`` and ``blue`` protected members are initialized to their default values.
+| The cloud is filled with random points (in a cube) and accordingly to ``red`` ``green`` and ``blue`` colors.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 33-37
+
+| Here we create a PCL Visualizer name ``viewer`` and we also specify that we don't want an interactor to be created.
+| We don't want an interactor to be created because our ``qvtkWidget`` is already an interactor and it's the one we want to use.
+| So the next step is to configure our newly created PCL Visualiser interactor to use the ``qvtkWidget``.
+
+The ``update()`` method of the ``qvtkWidget`` should be called each time you modify the PCL visualizer; if you don't call it you don't know if the
+visualizer will be updated before the user try to pan/spin/zoom.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 39-51
+
+Here we connect slots and signals, this links UI actions to functions. Here is a summary of what we have linked :
+ * ``pushButton_random``:
+ | if button is pressed call ``randomButtonPressed ()``
+ * ``horizontalSlider_R``:
+ | if slider value is changed call ``redSliderValueChanged(int)`` with the new value as argument
+ | if slider is released call ``RGBsliderReleased()``
+ * ``horizontalSlider_G``:
+ | if slider value is changed call ``redSliderValueChanged(int)`` with the new value as argument
+ | if slider is released call ``RGBsliderReleased()``
+ * ``horizontalSlider_B``:
+ | if slider value is changed call ``redSliderValueChanged(int)`` with the new value as argument
+ | if slider is released call ``RGBsliderReleased()``
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 53-57
+
+| This is the last part of our constructor; we add the point cloud to the visualizer, call the method ``pSliderValueChanged`` to change the point size to 2.
+
+We finaly reset the camera within the PCL Visualizer not avoid the user having to zoom out and update the qvtkwidget to be
+sure the modifications will be displayed.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 59-74
+
+| This is the public slot function member called when the push button "Random" is pressed.
+| The ``for`` loop iterates through the point cloud and changes point cloud color to a random number (between 0 and 255).
+| The point cloud is then updated and so the ``qtvtkwidget`` is.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 76-88
+
+| This is the public slot function member called whenever the red, green or blue slider is released
+| The ``for`` loop iterates through the point cloud and changes point cloud color to ``red``, ``green`` and ``blue`` member values.
+| The point cloud is then updated and so the ``qtvtkwidget`` is.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 97-116
+
+| These are the public slot function member called whenever the red, green or blue slider value is changed
+| These functions just changes the member value accordingly to the slider value.
+| Here the point cloud is not updated; so until you release the slider you won't see any change in the visualizer.
+
+.. literalinclude:: sources/qt_visualizer/pclviewer.cpp
+ :language: cpp
+ :lines: 118-121
+
+The destructor.
+
+Compiling and running
+=====================
+
+There are two options here :
+ * You have configured the Qt project and you can compile/run just by clicking on the bottom left "Play" button.
+ * You didn't configure the Qt project; just go to the build folder an run ``cmake ../src && make -j2 && ./pcl_visualizer``
+
+| Notice that when changing the slider color, the cloud is not updated until you release the slider (``sliderReleased ()`` slot).
+
+If you wanted to update the point cloud when the slider value is changed you could just call the ``RGBsliderReleased ()`` function inside the
+``*sliderValueChanged (int)`` functions. The connect between ``sliderReleased ()`` / ``RGBsliderReleased ()`` would become useless then.
+
+| When using the slider for the point size; the size of the point is updated without having to release the slider.
+
+.. image:: images/qt_visualizer/pcl_visualizer.gif
+ :height: 527
+
+More on Qt and PCL
+==================
+
+If you want to know more about Qt and PCL go take a look at `PCL apps <https://github.com/PointCloudLibrary/pcl/tree/master/apps>`_ like
+`PCD video player <https://github.com/PointCloudLibrary/pcl/tree/master/apps/src/pcd_video_player>`_
+or `manual registration <https://github.com/PointCloudLibrary/pcl/tree/master/apps/src/manual_registration>`_.
+
+Re-use the :download:`CMakeLists.txt <./sources/qt_visualizer/CMakeLists.txt>` from this tutorial if you want to compile the application outside of PCL.
.. literalinclude:: sources/region_growing_segmentation/region_growing_segmentation.cpp
:language: cpp
- :lines: 51-60
+ :lines: 51-63
These lines are simple enough, so they won't be commented. They are intended for those who are not familiar with how to work with ``pcl::PointIndices``
and how to access its elements.
.. literalinclude:: sources/region_growing_segmentation/region_growing_segmentation.cpp
:language: cpp
- :lines: 62-67
+ :lines: 65-73
The ``pcl::RegionGrowing`` class provides a method that returns the colored cloud where each cluster has its own color.
So in this part of code the ``pcl::visualization::CloudViewer`` is instanciated for viewing the result of the segmentation - the same colored cloud.
--- /dev/null
+.. _rops_feature:
+
+RoPs (Rotational Projection Statistics) feature
+-----------------------------------------------
+
+In this tutorial we will learn how to use the `pcl::ROPSEstimation` class in order to extract points features.
+The feature extraction method implemented in this class was proposed by Yulan Guo, Ferdous Sohel, Mohammed Bennamoun, Min Lu and
+Jianwei Wanalso in their article "Rotational Projection Statistics for 3D Local Surface Description and Object Recognition"
+
+Theoretical Primer
+------------------
+
+The idea of the feature extraction method is as follows.
+Having a mesh and a set of points for which feature must be computed we perform some simple steps. First of all for a given point of interest
+the local surface is cropped. Local surface consists of the points and triangles that are within the given support radius.
+For the given local surface LRF (Local Reference Frame) is computed. LRF is simply a triplet of vectors,
+the comprehensive information about how these vectors are computed you can find in the article.
+What is really important is that using these vectors we can provide the invariance to the rotation of the cloud. To do that, we simply
+translate points of the local surface in such way that point of interest became the origin, after that we rotate local surface so that the
+LRF vectors were aligned with the Ox, Oy and Oz axes. Having this done, we then start the feature extraction.
+For every axis Ox, Oy and Oz the following steps are performed, we will refer to these axes as current axis:
+
+ * local surface is rotated around the current axis by a given angle;
+ * points of the rotated local surface are projected onto three planes XY, XZ and YZ;
+ * for each projection distribution matrix is built, this matrix simply shows how much points fall onto each bin. Number of bins represents the matrix dimension and is the parameter of the algorithm, as well as the support radius;
+ * for each distribution matrix central moments are calculated: M11, M12, M21, M22, E. Here E is the Shannon entropy;
+ * calculated values are then concatenated to form the sub-feature.
+
+We iterate through these steps several times. Number of iterations depends on the given number of rotations.
+Sub-features for different axes are concatenated to form the final RoPS descriptor.
+
+The code
+--------
+
+For this tutorial we will use the model from the Queen's Dataset. You can choose any other point cloud, but in order to make the
+code work you will need to use the triangulation algorithm in order to obtain polygons. You can find the proposed model here:
+
+ * `points <https://github.com/PointCloudLibrary/data/blob/master/tutorials/min_cut_segmentation_tutorial.pcd>`_ - contains the point cloud
+ * `indices - contains indices of the points for which RoPs must be computed
+ * `triangles - contains the polygons
+
+Next what you need to do is to create a file ``rops_feature.cpp`` in any editor you prefer and copy the following code inside of it:
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :linenos:
+
+The explanation
+---------------
+
+Now let's study out what is the purpose of this code.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 9-11
+
+These lines are simply loading the cloud from the .pcd file.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 13-23
+
+Here the indices of points for which RoPS feature must be computed are loaded. You can comment it and compute features for every single point in the cloud.
+if you want.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 25-40
+
+These lines are loading the information about the polygons. You can replace them with the code for the triangulation if you have only the point cloud
+instead of the mesh.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 42-44
+
+These code defines important algorithm parameters: support radius for local surface cropping, number of partition bins
+used to form the distribution matrix and the number of rotations. The last parameter affects the length of the descriptor.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 46-47
+
+These lines set up the search method that will be used by the algorithm.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 49-58
+
+Here is the place where the instantiation of the ``pcl::ROPSEstimation`` class takes place. It has two parameters:
+
+ * PointInT - type of the input points;
+ * PointOutT - type of the output points.
+
+Immediately after that we set the input all the necessary data neede for the feature computation.
+
+.. literalinclude:: sources/rops_feature/rops_feature.cpp
+ :language: cpp
+ :lines: 60-61
+
+Here is the place where the computational process is launched.
+
+Compiling and running the program
+---------------------------------
+
+Add the following lines to your CMakeLists.txt file:
+
+.. literalinclude:: sources/rops_feature/CMakeLists.txt
+ :language: cmake
+ :linenos:
+
+After you have made the executable, you can run it. Simply do::
+
+ $ ./rops_feature points.pcd indices.txt triangles.txt
iterative_closest_point
kdtree_search
min_cut_segmentation
+ moment_of_inertia
#narf_descriptor_visualization
narf_feature_extraction
narf_keypoint_extraction
registration_api
remove_outliers
resampling
+ rops_feature
statistical_removal
stick_segmentation
supervoxel_clustering
project(alignment_prerejective)
-find_package(PCL 1.7 REQUIRED)
+find_package(PCL 1.7 REQUIRED REQUIRED COMPONENTS io registration segmentation visualization)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
align.setSourceFeatures (object_features);
align.setInputTarget (scene);
align.setTargetFeatures (scene_features);
+ align.setMaximumIterations (10000); // Number of RANSAC iterations
align.setNumberOfSamples (3); // Number of points to sample for generating/prerejecting a pose
align.setCorrespondenceRandomness (2); // Number of nearest features to use
- align.setSimilarityThreshold (0.6f); // Polygonal edge length similarity threshold
- align.setMaxCorrespondenceDistance (1.5f * leaf); // Set inlier threshold
- align.setInlierFraction (0.25f); // Set required inlier fraction
- align.align (*object_aligned);
+ align.setSimilarityThreshold (0.9f); // Polygonal edge length similarity threshold
+ align.setMaxCorrespondenceDistance (1.5f * leaf); // Inlier threshold
+ align.setInlierFraction (0.25f); // Required inlier fraction for accepting a pose hypothesis
+ {
+ pcl::ScopeTime t("Alignment");
+ align.align (*object_aligned);
+ }
if (align.hasConverged ())
{
// Print results
+ printf ("\n");
Eigen::Matrix4f transformation = align.getFinalTransformation ();
pcl::console::print_info (" | %6.3f %6.3f %6.3f | \n", transformation (0,0), transformation (0,1), transformation (0,2));
pcl::console::print_info ("R = | %6.3f %6.3f %6.3f | \n", transformation (1,0), transformation (1,1), transformation (1,2));
--- /dev/null
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+project(bare_earth)
+
+find_package(PCL 1.7.2 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (bare_earth bare_earth.cpp)
+target_link_libraries (bare_earth ${PCL_LIBRARIES})
--- /dev/null
+#include <iostream>
+#include <pcl/io/pcd_io.h>
+#include <pcl/point_types.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+
+int
+main (int argc, char** argv)
+{
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointIndicesPtr ground (new pcl::PointIndices);
+
+ // Fill in the cloud data
+ pcl::PCDReader reader;
+ // Replace the path below with the path where you saved your file
+ reader.read<pcl::PointXYZ> ("samp11-utm.pcd", *cloud);
+
+ std::cerr << "Cloud before filtering: " << std::endl;
+ std::cerr << *cloud << std::endl;
+
+ // Create the filtering object
+ pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
+ pmf.setInputCloud (cloud);
+ pmf.setMaxWindowSize (20);
+ pmf.setSlope (1.0f);
+ pmf.setInitialDistance (0.5f);
+ pmf.setMaxDistance (3.0f);
+ pmf.extract (ground->indices);
+
+ // Create the filtering object
+ pcl::ExtractIndices<pcl::PointXYZ> extract;
+ extract.setInputCloud (cloud);
+ extract.setIndices (ground);
+ extract.filter (*cloud_filtered);
+
+ std::cerr << "Ground cloud after filtering: " << std::endl;
+ std::cerr << *cloud_filtered << std::endl;
+
+ pcl::PCDWriter writer;
+ writer.write<pcl::PointXYZ> ("samp11-utm_ground.pcd", *cloud_filtered, false);
+
+ // Extract non-ground returns
+ extract.setNegative (true);
+ extract.filter (*cloud_filtered);
+
+ std::cerr << "Object cloud after filtering: " << std::endl;
+ std::cerr << *cloud_filtered << std::endl;
+
+ writer.write<pcl::PointXYZ> ("samp11-utm_object.pcd", *cloud_filtered, false);
+
+ return (0);
+}
+
--- /dev/null
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+project(bspline_fitting)
+
+find_package(PCL 1.7 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (bspline_fitting bspline_fitting.cpp)
+target_link_libraries (bspline_fitting ${PCL_LIBRARIES})
+
--- /dev/null
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/surface/on_nurbs/fitting_surface_tdm.h>
+#include <pcl/surface/on_nurbs/fitting_curve_2d_asdm.h>
+#include <pcl/surface/on_nurbs/triangulation.h>
+
+typedef pcl::PointXYZ Point;
+
+void
+PointCloud2Vector3d (pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data);
+
+void
+visualizeCurve (ON_NurbsCurve &curve,
+ ON_NurbsSurface &surface,
+ pcl::visualization::PCLVisualizer &viewer);
+
+int
+main (int argc, char *argv[])
+{
+ std::string pcd_file, file_3dm;
+
+ if (argc < 3)
+ {
+ printf ("\nUsage: pcl_example_nurbs_fitting_surface pcd<PointXYZ>-in-file 3dm-out-file\n\n");
+ exit (0);
+ }
+ pcd_file = argv[1];
+ file_3dm = argv[2];
+
+ pcl::visualization::PCLVisualizer viewer ("B-spline surface fitting");
+ viewer.setSize (800, 600);
+
+ // ############################################################################
+ // load point cloud
+
+ printf (" loading %s\n", pcd_file.c_str ());
+ pcl::PointCloud<Point>::Ptr cloud (new pcl::PointCloud<Point>);
+ pcl::PCLPointCloud2 cloud2;
+ pcl::on_nurbs::NurbsDataSurface data;
+
+ if (pcl::io::loadPCDFile (pcd_file, cloud2) == -1)
+ throw std::runtime_error (" PCD file not found.");
+
+ fromPCLPointCloud2 (cloud2, *cloud);
+ PointCloud2Vector3d (cloud, data.interior);
+ pcl::visualization::PointCloudColorHandlerCustom<Point> handler (cloud, 0, 255, 0);
+ viewer.addPointCloud<Point> (cloud, handler, "cloud_cylinder");
+ printf (" %lu points in data set\n", cloud->size ());
+
+ // ############################################################################
+ // fit B-spline surface
+
+ // parameters
+ unsigned order (3);
+ unsigned refinement (5);
+ unsigned iterations (10);
+ unsigned mesh_resolution (256);
+
+ pcl::on_nurbs::FittingSurface::Parameter params;
+ params.interior_smoothness = 0.2;
+ params.interior_weight = 1.0;
+ params.boundary_smoothness = 0.2;
+ params.boundary_weight = 0.0;
+
+ // initialize
+ printf (" surface fitting ...\n");
+ ON_NurbsSurface nurbs = pcl::on_nurbs::FittingSurface::initNurbsPCABoundingBox (order, &data);
+ pcl::on_nurbs::FittingSurface fit (&data, nurbs);
+ // fit.setQuiet (false); // enable/disable debug output
+
+ // mesh for visualization
+ pcl::PolygonMesh mesh;
+ pcl::PointCloud<pcl::PointXYZ>::Ptr mesh_cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ std::vector<pcl::Vertices> mesh_vertices;
+ std::string mesh_id = "mesh_nurbs";
+ pcl::on_nurbs::Triangulation::convertSurface2PolygonMesh (fit.m_nurbs, mesh, mesh_resolution);
+ viewer.addPolygonMesh (mesh, mesh_id);
+
+ // surface refinement
+ for (unsigned i = 0; i < refinement; i++)
+ {
+ fit.refine (0);
+ fit.refine (1);
+ fit.assemble (params);
+ fit.solve ();
+ pcl::on_nurbs::Triangulation::convertSurface2Vertices (fit.m_nurbs, mesh_cloud, mesh_vertices, mesh_resolution);
+ viewer.updatePolygonMesh<pcl::PointXYZ> (mesh_cloud, mesh_vertices, mesh_id);
+ viewer.spinOnce ();
+ }
+
+ // surface fitting with final refinement level
+ for (unsigned i = 0; i < iterations; i++)
+ {
+ fit.assemble (params);
+ fit.solve ();
+ pcl::on_nurbs::Triangulation::convertSurface2Vertices (fit.m_nurbs, mesh_cloud, mesh_vertices, mesh_resolution);
+ viewer.updatePolygonMesh<pcl::PointXYZ> (mesh_cloud, mesh_vertices, mesh_id);
+ viewer.spinOnce ();
+ }
+
+ // ############################################################################
+ // fit B-spline curve
+
+ // parameters
+ pcl::on_nurbs::FittingCurve2dAPDM::FitParameter curve_params;
+ curve_params.addCPsAccuracy = 5e-2;
+ curve_params.addCPsIteration = 3;
+ curve_params.maxCPs = 200;
+ curve_params.accuracy = 1e-3;
+ curve_params.iterations = 100;
+
+ curve_params.param.closest_point_resolution = 0;
+ curve_params.param.closest_point_weight = 1.0;
+ curve_params.param.closest_point_sigma2 = 0.1;
+ curve_params.param.interior_sigma2 = 0.00001;
+ curve_params.param.smooth_concavity = 1.0;
+ curve_params.param.smoothness = 1.0;
+
+ // initialisation (circular)
+ printf (" curve fitting ...\n");
+ pcl::on_nurbs::NurbsDataCurve2d curve_data;
+ curve_data.interior = data.interior_param;
+ curve_data.interior_weight_function.push_back (true);
+ ON_NurbsCurve curve_nurbs = pcl::on_nurbs::FittingCurve2dAPDM::initNurbsCurve2D (order, curve_data.interior);
+
+ // curve fitting
+ pcl::on_nurbs::FittingCurve2dASDM curve_fit (&curve_data, curve_nurbs);
+ // curve_fit.setQuiet (false); // enable/disable debug output
+ curve_fit.fitting (curve_params);
+ visualizeCurve (curve_fit.m_nurbs, fit.m_nurbs, viewer);
+
+ // ############################################################################
+ // triangulation of trimmed surface
+
+ printf (" triangulate trimmed surface ...\n");
+ viewer.removePolygonMesh (mesh_id);
+ pcl::on_nurbs::Triangulation::convertTrimmedSurface2PolygonMesh (fit.m_nurbs, curve_fit.m_nurbs, mesh,
+ mesh_resolution);
+ viewer.addPolygonMesh (mesh, mesh_id);
+
+
+ // save trimmed B-spline surface
+ if ( fit.m_nurbs.IsValid() )
+ {
+ ONX_Model model;
+ ONX_Model_Object& surf = model.m_object_table.AppendNew();
+ surf.m_object = new ON_NurbsSurface(fit.m_nurbs);
+ surf.m_bDeleteObject = true;
+ surf.m_attributes.m_layer_index = 1;
+ surf.m_attributes.m_name = "surface";
+
+ ONX_Model_Object& curv = model.m_object_table.AppendNew();
+ curv.m_object = new ON_NurbsCurve(curve_fit.m_nurbs);
+ curv.m_bDeleteObject = true;
+ curv.m_attributes.m_layer_index = 2;
+ curv.m_attributes.m_name = "trimming curve";
+
+ model.Write(file_3dm.c_str());
+ printf(" model saved: %s\n", file_3dm.c_str());
+ }
+
+ printf (" ... done.\n");
+
+ viewer.spin ();
+ return 0;
+}
+
+void
+PointCloud2Vector3d (pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data)
+{
+ for (unsigned i = 0; i < cloud->size (); i++)
+ {
+ Point &p = cloud->at (i);
+ if (!pcl_isnan (p.x) && !pcl_isnan (p.y) && !pcl_isnan (p.z))
+ data.push_back (Eigen::Vector3d (p.x, p.y, p.z));
+ }
+}
+
+void
+visualizeCurve (ON_NurbsCurve &curve, ON_NurbsSurface &surface, pcl::visualization::PCLVisualizer &viewer)
+{
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
+
+ pcl::on_nurbs::Triangulation::convertCurve2PointCloud (curve, surface, curve_cloud, 4);
+ for (std::size_t i = 0; i < curve_cloud->size () - 1; i++)
+ {
+ pcl::PointXYZRGB &p1 = curve_cloud->at (i);
+ pcl::PointXYZRGB &p2 = curve_cloud->at (i + 1);
+ std::ostringstream os;
+ os << "line" << i;
+ viewer.removeShape (os.str ());
+ viewer.addLine<pcl::PointXYZRGB> (p1, p2, 1.0, 0.0, 0.0, os.str ());
+ }
+
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cps (new pcl::PointCloud<pcl::PointXYZRGB>);
+ for (int i = 0; i < curve.CVCount (); i++)
+ {
+ ON_3dPoint p1;
+ curve.GetCV (i, p1);
+
+ double pnt[3];
+ surface.Evaluate (p1.x, p1.y, 0, 3, pnt);
+ pcl::PointXYZRGB p2;
+ p2.x = float (pnt[0]);
+ p2.y = float (pnt[1]);
+ p2.z = float (pnt[2]);
+
+ p2.r = 255;
+ p2.g = 0;
+ p2.b = 0;
+
+ curve_cps->push_back (p2);
+ }
+ viewer.removePointCloud ("cloud_cps");
+ viewer.addPointCloud (curve_cps, "cloud_cps");
+}
boost::shared_ptr<pcl::PointCloud<PointT> > output (new pcl::PointCloud<PointT>);
filename.append (suffix);
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_points.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
SurfaceNormalsPtr output (new SurfaceNormals);
filename.append ("_normals.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_keypoints.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
LocalDescriptorsPtr output (new LocalDescriptors);
filename.append ("_localdesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
GlobalDescriptorsPtr output (new GlobalDescriptors);
filename.append ("_globaldesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
filename.append(files[i]);
PointCloudPtr input (new PointCloud);
pcl::io::loadPCDFile (filename, *input);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str(), input->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str(), input->size ());
std::cout << files[i] << std::endl;
// Construct the object model
// Load input file
PointCloudPtr input (new PointCloud);
pcl::io::loadPCDFile (argv[1], *input);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], input->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], input->size ());
ObjectRecognitionParameters params;
ifstream params_stream;
PointCloudPtr output (new PointCloud);
filename.append (".pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_keypoints.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
LocalDescriptorsPtr output (new LocalDescriptors);
filename.append ("_localdesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Estimate surface normals
SurfaceNormalsPtr normals;
int nr_scales = atoi(tokens[2].c_str ());
float min_contrast = atof(tokens[3].c_str ());
keypoints = detectKeypoints (cloud, normals, min_scale, nr_octaves, nr_scales, min_contrast);
- pcl::console::print_info ("Detected %zu keypoints\n", keypoints->size ());
+ pcl::console::print_info ("Detected %lu keypoints\n", keypoints->size ());
}
// Compute local descriptors
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Threshold depth
double min_depth, max_depth;
{
size_t n = cloud->size ();
cloud = thresholdDepth (cloud, min_depth, max_depth);
- pcl::console::print_info ("Eliminated %zu points outside depth limits\n", n - cloud->size ());
+ pcl::console::print_info ("Eliminated %lu points outside depth limits\n", n - cloud->size ());
}
// Downsample and threshold depth
{
size_t n = cloud->size ();
cloud = downsample (cloud, leaf_size);
- pcl::console::print_info ("Downsampled from %zu to %zu points\n", n, cloud->size ());
+ pcl::console::print_info ("Downsampled from %lu to %lu points\n", n, cloud->size ());
}
// Remove outliers
{
size_t n = cloud->size ();
cloud = removeOutliers (cloud, radius, (int)min_neighbors);
- pcl::console::print_info ("Removed %zu outliers\n", n - cloud->size ());
+ pcl::console::print_info ("Removed %lu outliers\n", n - cloud->size ());
}
// Save output
// Load input file
PointCloudPtr query (new PointCloud);
pcl::io::loadPCDFile (argv[1], *query);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], query->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], query->size ());
ifstream input_stream;
ObjectRecognitionParameters params;
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Subtract the dominant plane
double dist_threshold, max_iters;
{
size_t n = cloud->size ();
cloud = findAndSubtractPlane (cloud, dist_threshold, (int)max_iters);
- pcl::console::print_info ("Subtracted %zu points along the detected plane\n", n - cloud->size ());
+ pcl::console::print_info ("Subtracted %lu points along the detected plane\n", n - cloud->size ());
}
// Cluster points
if (cluster_points)
{
clusterObjects (cloud, tolerance, (int)min_size, (int)max_size, cluster_indices);
- pcl::console::print_info ("Found %zu clusters\n", cluster_indices.size ());
+ pcl::console::print_info ("Found %lu clusters\n", cluster_indices.size ());
}
// Save output
// Load the points
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Compute surface elements
SurfaceElementsPtr surfels (new SurfaceElements);
--- /dev/null
+cmake_minimum_required(VERSION 2.6 FATAL_ERROR)\r
+\r
+project(pcl-interactive_icp)\r
+\r
+find_package(PCL 1.5 REQUIRED)\r
+\r
+include_directories(${PCL_INCLUDE_DIRS})\r
+link_directories(${PCL_LIBRARY_DIRS})\r
+add_definitions(${PCL_DEFINITIONS})\r
+\r
+add_executable (interactive_icp interactive_icp.cpp)\r
+target_link_libraries (interactive_icp ${PCL_LIBRARIES})\r
--- /dev/null
+#include <iostream>
+#include <string>
+
+#include <pcl/io/ply_io.h>
+#include <pcl/point_types.h>
+#include <pcl/registration/icp.h>
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/console/time.h> // TicToc
+
+typedef pcl::PointXYZ PointT;
+typedef pcl::PointCloud<PointT> PointCloudT;
+
+bool next_iteration = false;
+
+void
+print4x4Matrix (const Eigen::Matrix4d & matrix)
+{
+ printf ("Rotation matrix :\n");
+ printf (" | %6.3f %6.3f %6.3f | \n", matrix (0, 0), matrix (0, 1), matrix (0, 2));
+ printf ("R = | %6.3f %6.3f %6.3f | \n", matrix (1, 0), matrix (1, 1), matrix (1, 2));
+ printf (" | %6.3f %6.3f %6.3f | \n", matrix (2, 0), matrix (2, 1), matrix (2, 2));
+ printf ("Translation vector :\n");
+ printf ("t = < %6.3f, %6.3f, %6.3f >\n\n", matrix (0, 3), matrix (1, 3), matrix (2, 3));
+}
+
+void
+keyboardEventOccurred (const pcl::visualization::KeyboardEvent& event,
+ void* nothing)
+{
+ if (event.getKeySym () == "space" && event.keyDown ())
+ next_iteration = true;
+}
+
+int
+main (int argc,
+ char* argv[])
+{
+ // The point clouds we will be using
+ PointCloudT::Ptr cloud_in (new PointCloudT); // Original point cloud
+ PointCloudT::Ptr cloud_tr (new PointCloudT); // Transformed point cloud
+ PointCloudT::Ptr cloud_icp (new PointCloudT); // ICP output point cloud
+
+ // Checking program arguments
+ if (argc < 2)
+ {
+ printf ("Usage :\n");
+ printf ("\t\t%s file.ply number_of_ICP_iterations\n", argv[0]);
+ PCL_ERROR ("Provide one ply file.\n");
+ return (-1);
+ }
+
+ int iterations = 1; // Default number of ICP iterations
+ if (argc > 2)
+ {
+ // If the user passed the number of iteration as an argument
+ iterations = atoi (argv[2]);
+ if (iterations < 1)
+ {
+ PCL_ERROR ("Number of initial iterations must be >= 1\n");
+ return (-1);
+ }
+ }
+
+ pcl::console::TicToc time;
+ time.tic ();
+ if (pcl::io::loadPLYFile (argv[1], *cloud_in) < 0)
+ {
+ PCL_ERROR ("Error loading cloud %s.\n", argv[1]);
+ return (-1);
+ }
+ std::cout << "\nLoaded file " << argv[1] << " (" << cloud_in->size () << " points) in " << time.toc () << " ms\n" << std::endl;
+
+ // Defining a rotation matrix and translation vector
+ Eigen::Matrix4d transformation_matrix = Eigen::Matrix4d::Identity ();
+
+ // A rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix)
+ double theta = M_PI / 8; // The angle of rotation in radians
+ transformation_matrix (0, 0) = cos (theta);
+ transformation_matrix (0, 1) = -sin (theta);
+ transformation_matrix (1, 0) = sin (theta);
+ transformation_matrix (1, 1) = cos (theta);
+
+ // A translation on Z axis (0.4 meters)
+ transformation_matrix (2, 3) = 0.4;
+
+ // Display in terminal the transformation matrix
+ std::cout << "Applying this rigid transformation to: cloud_in -> cloud_icp" << std::endl;
+ print4x4Matrix (transformation_matrix);
+
+ // Executing the transformation
+ pcl::transformPointCloud (*cloud_in, *cloud_icp, transformation_matrix);
+ *cloud_tr = *cloud_icp; // We backup cloud_icp into cloud_tr for later use
+
+ // The Iterative Closest Point algorithm
+ time.tic ();
+ pcl::IterativeClosestPoint<PointT, PointT> icp;
+ icp.setMaximumIterations (iterations);
+ icp.setInputSource (cloud_icp);
+ icp.setInputTarget (cloud_in);
+ icp.align (*cloud_icp);
+ icp.setMaximumIterations (1); // We set this variable to 1 for the next time we will call .align () function
+ std::cout << "Applied " << iterations << " ICP iteration(s) in " << time.toc () << " ms" << std::endl;
+
+ if (icp.hasConverged ())
+ {
+ std::cout << "\nICP has converged, score is " << icp.getFitnessScore () << std::endl;
+ std::cout << "\nICP transformation " << iterations << " : cloud_icp -> cloud_in" << std::endl;
+ transformation_matrix = icp.getFinalTransformation ().cast<double>();
+ print4x4Matrix (transformation_matrix);
+ }
+ else
+ {
+ PCL_ERROR ("\nICP has not converged.\n");
+ return (-1);
+ }
+
+ // Visualization
+ pcl::visualization::PCLVisualizer viewer ("ICP demo");
+ // Create two verticaly separated viewports
+ int v1 (0);
+ int v2 (1);
+ viewer.createViewPort (0.0, 0.0, 0.5, 1.0, v1);
+ viewer.createViewPort (0.5, 0.0, 1.0, 1.0, v2);
+
+ // The color we will be using
+ float bckgr_gray_level = 0.0; // Black
+ float txt_gray_lvl = 1.0 - bckgr_gray_level;
+
+ // Original point cloud is white
+ pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_in_color_h (cloud_in, (int) 255 * txt_gray_lvl, (int) 255 * txt_gray_lvl,
+ (int) 255 * txt_gray_lvl);
+ viewer.addPointCloud (cloud_in, cloud_in_color_h, "cloud_in_v1", v1);
+ viewer.addPointCloud (cloud_in, cloud_in_color_h, "cloud_in_v2", v2);
+
+ // Transformed point cloud is green
+ pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_tr_color_h (cloud_tr, 20, 180, 20);
+ viewer.addPointCloud (cloud_tr, cloud_tr_color_h, "cloud_tr_v1", v1);
+
+ // ICP aligned point cloud is red
+ pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_icp_color_h (cloud_icp, 180, 20, 20);
+ viewer.addPointCloud (cloud_icp, cloud_icp_color_h, "cloud_icp_v2", v2);
+
+ // Adding text descriptions in each viewport
+ viewer.addText ("White: Original point cloud\nGreen: Matrix transformed point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_1", v1);
+ viewer.addText ("White: Original point cloud\nRed: ICP aligned point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_2", v2);
+
+ std::stringstream ss;
+ ss << iterations;
+ std::string iterations_cnt = "ICP iterations = " + ss.str ();
+ viewer.addText (iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt", v2);
+
+ // Set background color
+ viewer.setBackgroundColor (bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v1);
+ viewer.setBackgroundColor (bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2);
+
+ // Set camera position and orientation
+ viewer.setCameraPosition (-3.68332, 2.94092, 5.71266, 0.289847, 0.921947, -0.256907, 0);
+ viewer.setSize (1280, 1024); // Visualiser window size
+
+ // Register keyboard callback :
+ viewer.registerKeyboardCallback (&keyboardEventOccurred, (void*) NULL);
+
+ // Display the visualiser
+ while (!viewer.wasStopped ())
+ {
+ viewer.spinOnce ();
+
+ // The user pressed "space" :
+ if (next_iteration)
+ {
+ // The Iterative Closest Point algorithm
+ time.tic ();
+ icp.align (*cloud_icp);
+ std::cout << "Applied 1 ICP iteration in " << time.toc () << " ms" << std::endl;
+
+ if (icp.hasConverged ())
+ {
+ printf ("\033[11A"); // Go up 11 lines in terminal output.
+ printf ("\nICP has converged, score is %+.0e\n", icp.getFitnessScore ());
+ std::cout << "\nICP transformation " << ++iterations << " : cloud_icp -> cloud_in" << std::endl;
+ transformation_matrix *= icp.getFinalTransformation ().cast<double>(); // WARNING /!\ This is not accurate! For "educational" purpose only!
+ print4x4Matrix (transformation_matrix); // Print the transformation between original pose and current pose
+
+ ss.str ("");
+ ss << iterations;
+ std::string iterations_cnt = "ICP iterations = " + ss.str ();
+ viewer.updateText (iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt");
+ viewer.updatePointCloud (cloud_icp, cloud_icp_color_h, "cloud_icp_v2");
+ }
+ else
+ {
+ PCL_ERROR ("\nICP has not converged.\n");
+ return (-1);
+ }
+ }
+ next_iteration = false;
+ }
+ return (0);
+}
+
boost::shared_ptr<pcl::PointCloud<PointT> > output (new pcl::PointCloud<PointT>);
filename.append (suffix);
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_points.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
SurfaceNormalsPtr output (new SurfaceNormals);
filename.append ("_normals.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_keypoints.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
LocalDescriptorsPtr output (new LocalDescriptors);
filename.append ("_localdesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
GlobalDescriptorsPtr output (new GlobalDescriptors);
filename.append ("_globaldesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
filename.append(files[i]);
PointCloudPtr input (new PointCloud);
pcl::io::loadPCDFile (filename, *input);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str(), input->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str(), input->size ());
std::cout << files[i] << std::endl;
// Construct the object model
// Load input file
PointCloudPtr input (new PointCloud);
pcl::io::loadPCDFile (argv[1], *input);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], input->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], input->size ());
ObjectRecognitionParameters params;
ifstream params_stream;
PointCloudPtr output (new PointCloud);
filename.append (".pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
PointCloudPtr output (new PointCloud);
filename.append ("_keypoints.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
LocalDescriptorsPtr output (new LocalDescriptors);
filename.append ("_localdesc.pcd");
pcl::io::loadPCDFile (filename, *output);
- pcl::console::print_info ("Loaded %s (%zu points)\n", filename.c_str (), output->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", filename.c_str (), output->size ());
return (output);
}
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Estimate surface normals
SurfaceNormalsPtr normals;
int nr_scales = atoi(tokens[2].c_str ());
float min_contrast = atof(tokens[3].c_str ());
keypoints = detectKeypoints (cloud, normals, min_scale, nr_octaves, nr_scales, min_contrast);
- pcl::console::print_info ("Detected %zu keypoints\n", keypoints->size ());
+ pcl::console::print_info ("Detected %lu keypoints\n", keypoints->size ());
}
// Compute local descriptors
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Threshold depth
double min_depth, max_depth;
{
size_t n = cloud->size ();
cloud = thresholdDepth (cloud, min_depth, max_depth);
- pcl::console::print_info ("Eliminated %zu points outside depth limits\n", n - cloud->size ());
+ pcl::console::print_info ("Eliminated %lu points outside depth limits\n", n - cloud->size ());
}
// Downsample and threshold depth
{
size_t n = cloud->size ();
cloud = downsample (cloud, leaf_size);
- pcl::console::print_info ("Downsampled from %zu to %zu points\n", n, cloud->size ());
+ pcl::console::print_info ("Downsampled from %lu to %lu points\n", n, cloud->size ());
}
// Remove outliers
{
size_t n = cloud->size ();
cloud = removeOutliers (cloud, radius, (int)min_neighbors);
- pcl::console::print_info ("Removed %zu outliers\n", n - cloud->size ());
+ pcl::console::print_info ("Removed %lu outliers\n", n - cloud->size ());
}
// Save output
// Load input file
PointCloudPtr query (new PointCloud);
pcl::io::loadPCDFile (argv[1], *query);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], query->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], query->size ());
ifstream input_stream;
ObjectRecognitionParameters params;
// Load the input file
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Subtract the dominant plane
double dist_threshold, max_iters;
{
size_t n = cloud->size ();
cloud = findAndSubtractPlane (cloud, dist_threshold, (int)max_iters);
- pcl::console::print_info ("Subtracted %zu points along the detected plane\n", n - cloud->size ());
+ pcl::console::print_info ("Subtracted %lu points along the detected plane\n", n - cloud->size ());
}
// Cluster points
if (cluster_points)
{
clusterObjects (cloud, tolerance, (int)min_size, (int)max_size, cluster_indices);
- pcl::console::print_info ("Found %zu clusters\n", cluster_indices.size ());
+ pcl::console::print_info ("Found %lu clusters\n", cluster_indices.size ());
}
// Save output
// Load the points
PointCloudPtr cloud (new PointCloud);
pcl::io::loadPCDFile (argv[1], *cloud);
- pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
+ pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
// Compute surface elements
SurfaceElementsPtr surfels (new SurfaceElements);
--- /dev/null
+cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+
+project(pcl-matrix_transform)
+
+find_package(PCL 1.7 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (matrix_transform matrix_transform.cpp)
+target_link_libraries (matrix_transform ${PCL_LIBRARIES})
--- /dev/null
+#include <iostream>
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/ply_io.h>
+#include <pcl/point_cloud.h>
+#include <pcl/console/parse.h>
+#include <pcl/common/transforms.h>
+#include <pcl/visualization/pcl_visualizer.h>
+
+// This function displays the help
+void
+showHelp(char * program_name)
+{
+ std::cout << std::endl;
+ std::cout << "Usage: " << program_name << " cloud_filename.[pcd|ply]" << std::endl;
+ std::cout << "-h: Show this help." << std::endl;
+}
+
+// This is the main function
+int
+main (int argc, char** argv)
+{
+
+ // Show help
+ if (pcl::console::find_switch (argc, argv, "-h") || pcl::console::find_switch (argc, argv, "--help")) {
+ showHelp (argv[0]);
+ return 0;
+ }
+
+ // Fetch point cloud filename in arguments | Works with PCD and PLY files
+ std::vector<int> filenames;
+ bool file_is_pcd = false;
+
+ filenames = pcl::console::parse_file_extension_argument (argc, argv, ".ply");
+
+ if (filenames.size () != 1) {
+ filenames = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
+
+ if (filenames.size () != 1) {
+ showHelp (argv[0]);
+ return -1;
+ } else {
+ file_is_pcd = true;
+ }
+ }
+
+ // Load file | Works with PCD and PLY files
+ pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
+
+ if (file_is_pcd) {
+ if (pcl::io::loadPCDFile (argv[filenames[0]], *source_cloud) < 0) {
+ std::cout << "Error loading point cloud " << argv[filenames[0]] << std::endl << std::endl;
+ showHelp (argv[0]);
+ return -1;
+ }
+ } else {
+ if (pcl::io::loadPLYFile (argv[filenames[0]], *source_cloud) < 0) {
+ std::cout << "Error loading point cloud " << argv[filenames[0]] << std::endl << std::endl;
+ showHelp (argv[0]);
+ return -1;
+ }
+ }
+
+ /* Reminder: how transformation matrices work :
+
+ |-------> This column is the translation
+ | 1 0 0 x | \
+ | 0 1 0 y | }-> The identity 3x3 matrix (no rotation) on the left
+ | 0 0 1 z | /
+ | 0 0 0 1 | -> We do not use this line (and it has to stay 0,0,0,1)
+
+ METHOD #1: Using a Matrix4f
+ This is the "manual" method, perfect to understand but error prone !
+ */
+ Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
+
+ // Define a rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix)
+ float theta = M_PI/4; // The angle of rotation in radians
+ transform_1 (0,0) = cos (theta);
+ transform_1 (0,1) = -sin(theta);
+ transform_1 (1,0) = sin (theta);
+ transform_1 (1,1) = cos (theta);
+ // (row, column)
+
+ // Define a translation of 2.5 meters on the x axis.
+ transform_1 (0,3) = 2.5;
+
+ // Print the transformation
+ printf ("Method #1: using a Matrix4f\n");
+ std::cout << transform_1 << std::endl;
+
+ /* METHOD #2: Using a Affine3f
+ This method is easier and less error prone
+ */
+ Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();
+
+ // Define a translation of 2.5 meters on the x axis.
+ transform_2.translation() << 2.5, 0.0, 0.0;
+
+ // The same rotation matrix as before; tetha radians arround Z axis
+ transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ()));
+
+ // Print the transformation
+ printf ("\nMethod #2: using an Affine3f\n");
+ std::cout << transform_2.matrix() << std::endl;
+
+ // Executing the transformation
+ pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
+ // You can either apply transform_1 or transform_2; they are the same
+ pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2);
+
+ // Visualization
+ printf( "\nPoint cloud colors : white = original point cloud\n"
+ " red = transformed point cloud\n");
+ pcl::visualization::PCLVisualizer viewer ("Matrix transformation example");
+
+ // Define R,G,B colors for the point cloud
+ pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler (source_cloud, 255, 255, 255);
+ // We add the point cloud to the viewer and pass the color handler
+ viewer.addPointCloud (source_cloud, source_cloud_color_handler, "original_cloud");
+
+ pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler (transformed_cloud, 230, 20, 20); // Red
+ viewer.addPointCloud (transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");
+
+ viewer.addCoordinateSystem (1.0, "cloud", 0);
+ viewer.setBackgroundColor(0.05, 0.05, 0.05, 0); // Setting background to a dark grey
+ viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud");
+ viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "transformed_cloud");
+ //viewer.setPosition(800, 400); // Setting visualiser window position
+
+ while (!viewer.wasStopped ()) { // Display the visualiser until 'q' key is pressed
+ viewer.spinOnce ();
+ }
+
+ return 0;
+}
+
--- /dev/null
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+project(model_outlier_removal)
+
+find_package(PCL 1.7 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (model_outlier_removal model_outlier_removal.cpp)
+target_link_libraries (model_outlier_removal ${PCL_LIBRARIES})
--- /dev/null
+#include <iostream>
+#include <pcl/point_types.h>
+#include <pcl/filters/model_outlier_removal.h>
+
+int
+main ()
+{
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_sphere_filtered (new pcl::PointCloud<pcl::PointXYZ>);
+
+ // 1. Generate cloud data
+ int noise_size = 5;
+ int sphere_data_size = 10;
+ cloud->width = noise_size + sphere_data_size;
+ cloud->height = 1;
+ cloud->points.resize (cloud->width * cloud->height);
+ // 1.1 Add noise
+ for (size_t i = 0; i < noise_size; ++i)
+ {
+ cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
+ }
+ // 1.2 Add sphere:
+ double rand_x1 = 1;
+ double rand_x2 = 1;
+ for (size_t i = noise_size; i < noise_size + sphere_data_size; ++i)
+ {
+ // See: http://mathworld.wolfram.com/SpherePointPicking.html
+ while (pow (rand_x1, 2) + pow (rand_x2, 2) >= 1)
+ {
+ rand_x1 = (rand () % 100) / (50.0f) - 1;
+ rand_x2 = (rand () % 100) / (50.0f) - 1;
+ }
+ double pre_calc = sqrt (1 - pow (rand_x1, 2) - pow (rand_x2, 2));
+ cloud->points[i].x = 2 * rand_x1 * pre_calc;
+ cloud->points[i].y = 2 * rand_x2 * pre_calc;
+ cloud->points[i].z = 1 - 2 * (pow (rand_x1, 2) + pow (rand_x2, 2));
+ rand_x1 = 1;
+ rand_x2 = 1;
+ }
+
+ std::cerr << "Cloud before filtering: " << std::endl;
+ for (size_t i = 0; i < cloud->points.size (); ++i)
+ std::cout << " " << cloud->points[i].x << " " << cloud->points[i].y << " " << cloud->points[i].z << std::endl;
+
+ // 2. filter sphere:
+ // 2.1 generate model:
+ // modelparameter for this sphere:
+ // position.x: 0, position.y: 0, position.z:0, radius: 1
+ pcl::ModelCoefficients sphere_coeff;
+ sphere_coeff.values.resize (4);
+ sphere_coeff.values[0] = 0;
+ sphere_coeff.values[1] = 0;
+ sphere_coeff.values[2] = 0;
+ sphere_coeff.values[3] = 1;
+
+ pcl::ModelOutlierRemoval<pcl::PointXYZ> sphere_filter;
+ sphere_filter.setModelCoefficients (sphere_coeff);
+ sphere_filter.setThreshold (0.05);
+ sphere_filter.setModelType (pcl::SACMODEL_SPHERE);
+ sphere_filter.setInputCloud (cloud);
+ sphere_filter.filter (*cloud_sphere_filtered);
+
+ std::cerr << "Sphere after filtering: " << std::endl;
+ for (size_t i = 0; i < cloud_sphere_filtered->points.size (); ++i)
+ std::cout << " " << cloud_sphere_filtered->points[i].x << " " << cloud_sphere_filtered->points[i].y << " " << cloud_sphere_filtered->points[i].z
+ << std::endl;
+
+ return (0);
+}
--- /dev/null
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+project(moment_of_inertia)
+
+find_package(PCL 1.8 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (moment_of_inertia moment_of_inertia.cpp)
+target_link_libraries (moment_of_inertia ${PCL_LIBRARIES})
+
+
--- /dev/null
+#include <pcl/features/moment_of_inertia_estimation.h>
+#include <vector>
+#include <pcl/io/pcd_io.h>
+#include <pcl/point_types.h>
+#include <pcl/visualization/cloud_viewer.h>
+#include <boost/thread/thread.hpp>
+
+int main (int argc, char** argv)
+{
+ if (argc != 2)
+ return (0);
+
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
+ if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)
+ return (-1);
+
+ pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
+ feature_extractor.setInputCloud (cloud);
+ feature_extractor.compute ();
+
+ std::vector <float> moment_of_inertia;
+ std::vector <float> eccentricity;
+ pcl::PointXYZ min_point_AABB;
+ pcl::PointXYZ max_point_AABB;
+ pcl::PointXYZ min_point_OBB;
+ pcl::PointXYZ max_point_OBB;
+ pcl::PointXYZ position_OBB;
+ Eigen::Matrix3f rotational_matrix_OBB;
+ float major_value, middle_value, minor_value;
+ Eigen::Vector3f major_vector, middle_vector, minor_vector;
+ Eigen::Vector3f mass_center;
+
+ feature_extractor.getMomentOfInertia (moment_of_inertia);
+ feature_extractor.getEccentricity (eccentricity);
+ feature_extractor.getAABB (min_point_AABB, max_point_AABB);
+ feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
+ feature_extractor.getEigenValues (major_value, middle_value, minor_value);
+ feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
+ feature_extractor.getMassCenter (mass_center);
+
+ boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
+ viewer->setBackgroundColor (0, 0, 0);
+ viewer->addCoordinateSystem (1.0);
+ viewer->initCameraParameters ();
+ viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
+ viewer->addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");
+
+ Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);
+ Eigen::Quaternionf quat (rotational_matrix_OBB);
+ viewer->addCube (position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");
+
+ pcl::PointXYZ center (mass_center (0), mass_center (1), mass_center (2));
+ pcl::PointXYZ x_axis (major_vector (0) + mass_center (0), major_vector (1) + mass_center (1), major_vector (2) + mass_center (2));
+ pcl::PointXYZ y_axis (middle_vector (0) + mass_center (0), middle_vector (1) + mass_center (1), middle_vector (2) + mass_center (2));
+ pcl::PointXYZ z_axis (minor_vector (0) + mass_center (0), minor_vector (1) + mass_center (1), minor_vector (2) + mass_center (2));
+ viewer->addLine (center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");
+ viewer->addLine (center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");
+ viewer->addLine (center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");
+
+ //Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
+ //Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
+ //Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
+ //Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
+ //Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
+ //Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
+ //Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
+ //Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
+
+ //p1 = rotational_matrix_OBB * p1 + position;
+ //p2 = rotational_matrix_OBB * p2 + position;
+ //p3 = rotational_matrix_OBB * p3 + position;
+ //p4 = rotational_matrix_OBB * p4 + position;
+ //p5 = rotational_matrix_OBB * p5 + position;
+ //p6 = rotational_matrix_OBB * p6 + position;
+ //p7 = rotational_matrix_OBB * p7 + position;
+ //p8 = rotational_matrix_OBB * p8 + position;
+
+ //pcl::PointXYZ pt1 (p1 (0), p1 (1), p1 (2));
+ //pcl::PointXYZ pt2 (p2 (0), p2 (1), p2 (2));
+ //pcl::PointXYZ pt3 (p3 (0), p3 (1), p3 (2));
+ //pcl::PointXYZ pt4 (p4 (0), p4 (1), p4 (2));
+ //pcl::PointXYZ pt5 (p5 (0), p5 (1), p5 (2));
+ //pcl::PointXYZ pt6 (p6 (0), p6 (1), p6 (2));
+ //pcl::PointXYZ pt7 (p7 (0), p7 (1), p7 (2));
+ //pcl::PointXYZ pt8 (p8 (0), p8 (1), p8 (2));
+
+ //viewer->addLine (pt1, pt2, 1.0, 0.0, 0.0, "1 edge");
+ //viewer->addLine (pt1, pt4, 1.0, 0.0, 0.0, "2 edge");
+ //viewer->addLine (pt1, pt5, 1.0, 0.0, 0.0, "3 edge");
+ //viewer->addLine (pt5, pt6, 1.0, 0.0, 0.0, "4 edge");
+ //viewer->addLine (pt5, pt8, 1.0, 0.0, 0.0, "5 edge");
+ //viewer->addLine (pt2, pt6, 1.0, 0.0, 0.0, "6 edge");
+ //viewer->addLine (pt6, pt7, 1.0, 0.0, 0.0, "7 edge");
+ //viewer->addLine (pt7, pt8, 1.0, 0.0, 0.0, "8 edge");
+ //viewer->addLine (pt2, pt3, 1.0, 0.0, 0.0, "9 edge");
+ //viewer->addLine (pt4, pt8, 1.0, 0.0, 0.0, "10 edge");
+ //viewer->addLine (pt3, pt4, 1.0, 0.0, 0.0, "11 edge");
+ //viewer->addLine (pt3, pt7, 1.0, 0.0, 0.0, "12 edge");
+
+ while(!viewer->wasStopped())
+ {
+ viewer->spinOnce (100);
+ boost::this_thread::sleep (boost::posix_time::microseconds (100000));
+ }
+
+ return (0);
+}
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 0, 0, 0);
viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "range image");
- //viewer.addCoordinateSystem (1.0f);
+ //viewer.addCoordinateSystem (1.0f, "global");
//PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 150, 150, 150);
//viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");
viewer.initCameraParameters ();
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 0, 0, 0);
viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "range image");
- //viewer.addCoordinateSystem (1.0f);
+ //viewer.addCoordinateSystem (1.0f, "global");
//PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 150, 150, 150);
//viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");
viewer.initCameraParameters ();
1, "output cloud");
// Starting visualizer
- viewer_final->addCoordinateSystem (1.0);
+ viewer_final->addCoordinateSystem (1.0, "global");
viewer_final->initCameraParameters ();
// Wait until visualizer window is closed.
pcl::visualization::RangeImageVisualizer range_image_widget ("Range Image");
pcl::visualization::PCLVisualizer viewer ("3D Viewer");
- viewer.addCoordinateSystem (1.0f);
+ viewer.addCoordinateSystem (1.0f, "global");
viewer.setBackgroundColor (1, 1, 1);
viewer.initCameraParameters ();
pcl::visualization::RangeImageVisualizer range_image_widget ("Range Image");
pcl::visualization::PCLVisualizer viewer ("3D Viewer");
- viewer.addCoordinateSystem (1.0f);
+ viewer.addCoordinateSystem (1.0f, "global");
viewer.setBackgroundColor (1, 1, 1);
// Set the viewing pose so that the openni cloud is visible
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
-add_definitions(-Wno-deprecated -DEIGEN_DONT_VECTORIZE -DEIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
add_executable (pairwise_incremental_registration pairwise_incremental_registration.cpp)
target_link_libraries (pairwise_incremental_registration ${PCL_LIBRARIES})
pcl::transformPointCloud (*temp, *result, GlobalTransform);
//update the global transform
- GlobalTransform = pairTransform * GlobalTransform;
+ GlobalTransform = GlobalTransform * pairTransform;
//save aligned pair, transformed into the first cloud's frame
std::stringstream ss;
int
main (int argc, char** argv)
{
- pcl::PointCloud<pcl::PointXYZ> cloud;
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// Fill in the cloud data
- cloud.width = 15;
- cloud.height = 1;
- cloud.points.resize (cloud.width * cloud.height);
+ cloud->width = 15;
+ cloud->height = 1;
+ cloud->points.resize (cloud->width * cloud->height);
// Generate the data
- for (size_t i = 0; i < cloud.points.size (); ++i)
+ for (size_t i = 0; i < cloud->points.size (); ++i)
{
- cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
- cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
- cloud.points[i].z = 1.0;
+ cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].z = 1.0;
}
// Set a few outliers
- cloud.points[0].z = 2.0;
- cloud.points[3].z = -2.0;
- cloud.points[6].z = 4.0;
+ cloud->points[0].z = 2.0;
+ cloud->points[3].z = -2.0;
+ cloud->points[6].z = 4.0;
- std::cerr << "Point cloud data: " << cloud.points.size () << " points" << std::endl;
- for (size_t i = 0; i < cloud.points.size (); ++i)
- std::cerr << " " << cloud.points[i].x << " "
- << cloud.points[i].y << " "
- << cloud.points[i].z << std::endl;
+ std::cerr << "Point cloud data: " << cloud->points.size () << " points" << std::endl;
+ for (size_t i = 0; i < cloud->points.size (); ++i)
+ std::cerr << " " << cloud->points[i].x << " "
+ << cloud->points[i].y << " "
+ << cloud->points[i].z << std::endl;
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
seg.setMethodType (pcl::SAC_RANSAC);
seg.setDistanceThreshold (0.01);
- seg.setInputCloud (cloud.makeShared ());
+ seg.setInputCloud (cloud);
seg.segment (*inliers, *coefficients);
if (inliers->indices.size () == 0)
std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
for (size_t i = 0; i < inliers->indices.size (); ++i)
- std::cerr << inliers->indices[i] << " " << cloud.points[inliers->indices[i]].x << " "
- << cloud.points[inliers->indices[i]].y << " "
- << cloud.points[inliers->indices[i]].z << std::endl;
+ std::cerr << inliers->indices[i] << " " << cloud->points[inliers->indices[i]].x << " "
+ << cloud->points[inliers->indices[i]].y << " "
+ << cloud->points[inliers->indices[i]].z << std::endl;
return (0);
}
--- /dev/null
+cmake_minimum_required (VERSION 2.6 FATAL_ERROR)
+
+project (pcl-visualizer)
+find_package (Qt4 REQUIRED)
+find_package (VTK REQUIRED)
+find_package (PCL 1.7.1 REQUIRED)
+
+include_directories (${PCL_INCLUDE_DIRS})
+link_directories (${PCL_LIBRARY_DIRS})
+add_definitions (${PCL_DEFINITIONS})
+
+set (project_SOURCES main.cpp pclviewer.cpp)
+set (project_HEADERS pclviewer.h)
+set (project_FORMS pclviewer.ui)
+set (VTK_LIBRARIES vtkRendering vtkGraphics vtkHybrid QVTK)
+
+QT4_WRAP_CPP (project_HEADERS_MOC ${project_HEADERS})
+QT4_WRAP_UI (project_FORMS_HEADERS ${project_FORMS})
+
+INCLUDE (${QT_USE_FILE})
+ADD_DEFINITIONS (${QT_DEFINITIONS})
+
+ADD_EXECUTABLE (pcl_visualizer ${project_SOURCES}
+ ${project_FORMS_HEADERS}
+ ${project_HEADERS_MOC})
+
+TARGET_LINK_LIBRARIES (pcl_visualizer ${QT_LIBRARIES} ${PCL_LIBRARIES} ${VTK_LIBRARIES})
+
--- /dev/null
+#include "pclviewer.h"
+#include <QApplication>
+#include <QMainWindow>
+
+int main (int argc, char *argv[])
+{
+ QApplication a (argc, argv);
+ PCLViewer w;
+ w.show ();
+
+ return a.exec ();
+}
--- /dev/null
+#-------------------------------------------------
+#
+# Project created by QtCreator 2014-05-01T14:24:33
+#
+#-------------------------------------------------
+
+QT += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = pcl_visualizer
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+ pclviewer.cpp
+
+HEADERS += pclviewer.h
+
+FORMS += pclviewer.ui
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 3.0.1, 2014-05-01T16:44:18. -->
+<qtcreator>
+ <data>
+ <variable>ProjectExplorer.Project.ActiveTarget</variable>
+ <value type="int">0</value>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.EditorSettings</variable>
+ <valuemap type="QVariantMap">
+ <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+ <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+ <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+ <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+ <value type="QString" key="language">Cpp</value>
+ <valuemap type="QVariantMap" key="value">
+ <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+ </valuemap>
+ </valuemap>
+ <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+ <value type="QString" key="language">QmlJS</value>
+ <valuemap type="QVariantMap" key="value">
+ <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+ </valuemap>
+ </valuemap>
+ <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
+ <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+ <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+ <value type="int" key="EditorConfiguration.IndentSize">4</value>
+ <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+ <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+ <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+ <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+ <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+ <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+ <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+ <value type="int" key="EditorConfiguration.TabSize">8</value>
+ <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+ <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+ <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+ <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+ <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+ <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+ </valuemap>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.PluginSettings</variable>
+ <valuemap type="QVariantMap"/>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.Target.0</variable>
+ <valuemap type="QVariantMap">
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{7fcc8410-2f07-4a1b-8f7e-75865afc8bab}</value>
+ <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+ <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+ <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+ <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">../build</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+ <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">../src</value>
+ <value type="QString" key="ProjectExplorer.ProcessStep.Command">cmake</value>
+ <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}/../build</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Process Step</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
+ </valuemap>
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+ <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+ <value type="QString">-w</value>
+ <value type="QString">-r</value>
+ </valuelist>
+ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-j2</value>
+ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+ </valuemap>
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+ <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+ <value type="QString">-w</value>
+ <value type="QString">-r</value>
+ </valuelist>
+ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+ <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+ <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+ <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+ <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+ <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+ <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+ <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+ <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+ <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+ <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+ <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+ <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+ <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+ <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+ <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+ <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+ <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+ <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+ <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+ <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+ <value type="int">0</value>
+ <value type="int">1</value>
+ <value type="int">2</value>
+ <value type="int">3</value>
+ <value type="int">4</value>
+ <value type="int">5</value>
+ <value type="int">6</value>
+ <value type="int">7</value>
+ <value type="int">8</value>
+ <value type="int">9</value>
+ <value type="int">10</value>
+ <value type="int">11</value>
+ <value type="int">12</value>
+ <value type="int">13</value>
+ <value type="int">14</value>
+ </valuelist>
+ <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+ <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">pcl_visualizer</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/victor/Copy/qt_visualizer/src/pcl_visualizer.pro</value>
+ <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+ <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">pcl_visualizer.pro</value>
+ <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
+ <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
+ <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+ <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+ <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
+ <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
+ <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+ <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+ <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+ </valuemap>
+ <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+ </valuemap>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.TargetCount</variable>
+ <value type="int">1</value>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
+ <value type="QByteArray">{8d8c9016-62ac-401a-82aa-bc1e1c77c433}</value>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+ <value type="int">15</value>
+ </data>
+</qtcreator>
--- /dev/null
+#include "pclviewer.h"
+#include "../build/ui_pclviewer.h"
+
+PCLViewer::PCLViewer (QWidget *parent) :
+ QMainWindow (parent),
+ ui (new Ui::PCLViewer)
+{
+ ui->setupUi (this);
+ this->setWindowTitle ("PCL viewer");
+
+ // Setup the cloud pointer
+ cloud.reset (new PointCloudT);
+ // The number of points in the cloud
+ cloud->points.resize (200);
+
+ // The default color
+ red = 128;
+ green = 128;
+ blue = 128;
+
+ // Fill the cloud with some points
+ for (size_t i = 0; i < cloud->points.size (); ++i)
+ {
+ cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
+ cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
+
+ cloud->points[i].r = red;
+ cloud->points[i].g = green;
+ cloud->points[i].b = blue;
+ }
+
+ // Set up the QVTK window
+ viewer.reset (new pcl::visualization::PCLVisualizer ("viewer", false));
+ ui->qvtkWidget->SetRenderWindow (viewer->getRenderWindow ());
+ viewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());
+ ui->qvtkWidget->update ();
+
+ // Connect "random" button and the function
+ connect (ui->pushButton_random, SIGNAL (clicked ()), this, SLOT (randomButtonPressed ()));
+
+ // Connect R,G,B sliders and their functions
+ connect (ui->horizontalSlider_R, SIGNAL (valueChanged (int)), this, SLOT (redSliderValueChanged (int)));
+ connect (ui->horizontalSlider_G, SIGNAL (valueChanged (int)), this, SLOT (greenSliderValueChanged (int)));
+ connect (ui->horizontalSlider_B, SIGNAL (valueChanged (int)), this, SLOT (blueSliderValueChanged (int)));
+ connect (ui->horizontalSlider_R, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
+ connect (ui->horizontalSlider_G, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
+ connect (ui->horizontalSlider_B, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
+
+ // Connect point size slider
+ connect (ui->horizontalSlider_p, SIGNAL (valueChanged (int)), this, SLOT (pSliderValueChanged (int)));
+
+ viewer->addPointCloud (cloud, "cloud");
+ pSliderValueChanged (2);
+ viewer->resetCamera ();
+ ui->qvtkWidget->update ();
+}
+
+void
+PCLViewer::randomButtonPressed ()
+{
+ printf ("Random button was pressed\n");
+
+ // Set the new color
+ for (size_t i = 0; i < cloud->size(); i++)
+ {
+ cloud->points[i].r = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
+ cloud->points[i].g = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
+ cloud->points[i].b = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
+ }
+
+ viewer->updatePointCloud (cloud, "cloud");
+ ui->qvtkWidget->update ();
+}
+
+void
+PCLViewer::RGBsliderReleased ()
+{
+ // Set the new color
+ for (size_t i = 0; i < cloud->size (); i++)
+ {
+ cloud->points[i].r = red;
+ cloud->points[i].g = green;
+ cloud->points[i].b = blue;
+ }
+ viewer->updatePointCloud (cloud, "cloud");
+ ui->qvtkWidget->update ();
+}
+
+void
+PCLViewer::pSliderValueChanged (int value)
+{
+ viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, value, "cloud");
+ ui->qvtkWidget->update ();
+}
+
+void
+PCLViewer::redSliderValueChanged (int value)
+{
+ red = value;
+ printf ("redSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
+}
+
+void
+PCLViewer::greenSliderValueChanged (int value)
+{
+ green = value;
+ printf ("greenSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
+}
+
+void
+PCLViewer::blueSliderValueChanged (int value)
+{
+ blue = value;
+ printf("blueSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
+}
+
+PCLViewer::~PCLViewer ()
+{
+ delete ui;
+}
--- /dev/null
+#ifndef PCLVIEWER_H
+#define PCLVIEWER_H
+
+#include <iostream>
+
+// Qt
+#include <QMainWindow>
+
+// Point Cloud Library
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+#include <pcl/visualization/pcl_visualizer.h>
+
+// Visualization Toolkit (VTK)
+#include <vtkRenderWindow.h>
+
+typedef pcl::PointXYZRGBA PointT;
+typedef pcl::PointCloud<PointT> PointCloudT;
+
+namespace Ui
+{
+ class PCLViewer;
+}
+
+class PCLViewer : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit PCLViewer (QWidget *parent = 0);
+ ~PCLViewer ();
+
+public slots:
+ void
+ randomButtonPressed ();
+
+ void
+ RGBsliderReleased ();
+
+ void
+ pSliderValueChanged (int value);
+
+ void
+ redSliderValueChanged (int value);
+
+ void
+ greenSliderValueChanged (int value);
+
+ void
+ blueSliderValueChanged (int value);
+
+protected:
+ boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
+ PointCloudT::Ptr cloud;
+
+ unsigned int red;
+ unsigned int green;
+ unsigned int blue;
+
+private:
+ Ui::PCLViewer *ui;
+
+};
+
+#endif // PCLVIEWER_H
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PCLViewer</class>
+ <widget class="QMainWindow" name="PCLViewer">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>966</width>
+ <height>499</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>5000</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>PCLViewer</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <widget class="QVTKWidget" name="qvtkWidget" native="true">
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>10</y>
+ <width>640</width>
+ <height>480</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QSlider" name="horizontalSlider_R">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>60</y>
+ <width>160</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="value">
+ <number>128</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QSlider" name="horizontalSlider_G">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>140</y>
+ <width>160</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="value">
+ <number>128</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QSlider" name="horizontalSlider_B">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>220</y>
+ <width>160</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="value">
+ <number>128</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLCDNumber" name="lcdNumber_R">
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>50</y>
+ <width>81</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="digitCount">
+ <number>3</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ <property name="intValue" stdset="0">
+ <number>128</number>
+ </property>
+ </widget>
+ <widget class="QLCDNumber" name="lcdNumber_G">
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>130</y>
+ <width>81</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="digitCount">
+ <number>3</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ <property name="intValue" stdset="0">
+ <number>128</number>
+ </property>
+ </widget>
+ <widget class="QLCDNumber" name="lcdNumber_B">
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>210</y>
+ <width>81</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="digitCount">
+ <number>3</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ <property name="intValue" stdset="0">
+ <number>128</number>
+ </property>
+ </widget>
+ <widget class="QSlider" name="horizontalSlider_p">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>320</y>
+ <width>160</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>6</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLCDNumber" name="lcdNumber_p">
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>310</y>
+ <width>81</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="digitCount">
+ <number>1</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ <property name="intValue" stdset="0">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>20</y>
+ <width>191</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Red component</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>100</y>
+ <width>191</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Green component</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>190</y>
+ <width>191</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Blue component</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>280</y>
+ <width>141</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Point size</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton_random">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>370</y>
+ <width>201</width>
+ <height>81</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Random colors</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QVTKWidget</class>
+ <extends>QWidget</extends>
+ <header>QVTKWidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>horizontalSlider_R</sender>
+ <signal>sliderMoved(int)</signal>
+ <receiver>lcdNumber_R</receiver>
+ <slot>display(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>136</x>
+ <y>111</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>222</x>
+ <y>115</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>horizontalSlider_G</sender>
+ <signal>sliderMoved(int)</signal>
+ <receiver>lcdNumber_G</receiver>
+ <slot>display(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>166</x>
+ <y>193</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>235</x>
+ <y>195</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>horizontalSlider_B</sender>
+ <signal>sliderMoved(int)</signal>
+ <receiver>lcdNumber_B</receiver>
+ <slot>display(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>185</x>
+ <y>273</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>224</x>
+ <y>275</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>horizontalSlider_p</sender>
+ <signal>sliderMoved(int)</signal>
+ <receiver>lcdNumber_p</receiver>
+ <slot>display(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>136</x>
+ <y>352</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>253</x>
+ <y>342</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
viewer->setBackgroundColor (0, 0, 0);
viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
- //viewer->addCoordinateSystem (1.0);
+ //viewer->addCoordinateSystem (1.0, "global");
viewer->initCameraParameters ();
return (viewer);
}
// --------------------------------------------
pcl::visualization::PCLVisualizer viewer ("3D Viewer");
viewer.setBackgroundColor (1, 1, 1);
- viewer.addCoordinateSystem (1.0f);
+ viewer.addCoordinateSystem (1.0f, "global");
pcl::visualization::PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 0, 0, 0);
viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");
//PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 150, 150, 150);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 0, 0, 0);
viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "range image");
- //viewer.addCoordinateSystem (1.0f);
+ //viewer.addCoordinateSystem (1.0f, "global");
//PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 150, 150, 150);
//viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");
viewer.initCameraParameters ();
pass.filter (*indices);
pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
- reg.setMinClusterSize (100);
- reg.setMaxClusterSize (10000);
+ reg.setMinClusterSize (50);
+ reg.setMaxClusterSize (1000000);
reg.setSearchMethod (tree);
reg.setNumberOfNeighbours (30);
reg.setInputCloud (cloud);
//reg.setIndices (indices);
reg.setInputNormals (normals);
- reg.setSmoothnessThreshold (7.0 / 180.0 * M_PI);
+ reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);
reg.setCurvatureThreshold (1.0);
std::vector <pcl::PointIndices> clusters;
std::cout << "These are the indices of the points of the initial" <<
std::endl << "cloud that belong to the first cluster:" << std::endl;
int counter = 0;
- while (counter < 5 || counter > clusters[0].indices.size ())
+ while (counter < clusters[0].indices.size ())
{
- std::cout << clusters[0].indices[counter] << std::endl;
+ std::cout << clusters[0].indices[counter] << ", ";
counter++;
+ if (counter % 10 == 0)
+ std::cout << std::endl;
}
+ std::cout << std::endl;
pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();
pcl::visualization::CloudViewer viewer ("Cluster viewer");
return (0);
}
+
keypoints_tgt (new PointCloud<PointXYZ>);
estimateKeypoints (src, tgt, *keypoints_src, *keypoints_tgt);
- print_info ("Found %zu and %zu keypoints for the source and target datasets.\n", keypoints_src->points.size (), keypoints_tgt->points.size ());
+ print_info ("Found %lu and %lu keypoints for the source and target datasets.\n", keypoints_src->points.size (), keypoints_tgt->points.size ());
// Compute normals for all points keypoint
PointCloud<Normal>::Ptr normals_src (new PointCloud<Normal>),
normals_tgt (new PointCloud<Normal>);
estimateNormals (src, tgt, *normals_src, *normals_tgt);
- print_info ("Estimated %zu and %zu normals for the source and target datasets.\n", normals_src->points.size (), normals_tgt->points.size ());
+ print_info ("Estimated %lu and %lu normals for the source and target datasets.\n", normals_src->points.size (), normals_tgt->points.size ());
// Compute FPFH features at each keypoint
PointCloud<FPFHSignature33>::Ptr fpfhs_src (new PointCloud<FPFHSignature33>),
--- /dev/null
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+project(rops_feature)
+
+find_package(PCL 1.8 REQUIRED)
+
+include_directories(${PCL_INCLUDE_DIRS})
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+
+add_executable (rops_feature rops_feature.cpp)
+target_link_libraries (rops_feature ${PCL_LIBRARIES})
+
+
--- /dev/null
+#include <pcl/features/rops_estimation.h>
+#include <pcl/io/pcd_io.h>
+
+int main (int argc, char** argv)
+{
+ if (argc != 4)
+ return (-1);
+
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
+ if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)
+ return (-1);
+
+ pcl::PointIndicesPtr indices = boost::shared_ptr <pcl::PointIndices> (new pcl::PointIndices ());
+ std::ifstream indices_file;
+ indices_file.open (argv[2], std::ifstream::in);
+ for (std::string line; std::getline (indices_file, line);)
+ {
+ std::istringstream in (line);
+ unsigned int index = 0;
+ in >> index;
+ indices->indices.push_back (index - 1);
+ }
+ indices_file.close ();
+
+ std::vector <pcl::Vertices> triangles;
+ std::ifstream triangles_file;
+ triangles_file.open (argv[3], std::ifstream::in);
+ for (std::string line; std::getline (triangles_file, line);)
+ {
+ pcl::Vertices triangle;
+ std::istringstream in (line);
+ unsigned int vertex = 0;
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ triangles.push_back (triangle);
+ }
+
+ float support_radius = 0.0285f;
+ unsigned int number_of_partition_bins = 5;
+ unsigned int number_of_rotations = 3;
+
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
+ search_method->setInputCloud (cloud);
+
+ pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
+ feature_estimator.setSearchMethod (search_method);
+ feature_estimator.setSearchSurface (cloud);
+ feature_estimator.setInputCloud (cloud);
+ feature_estimator.setIndices (indices);
+ feature_estimator.setTriangles (triangles);
+ feature_estimator.setRadiusSearch (support_radius);
+ feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
+ feature_estimator.setNumberOfRotations (number_of_rotations);
+ feature_estimator.setSupportRadius (support_radius);
+
+ pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
+ feature_estimator.compute (*histograms);
+
+ return (0);
+}
}
// Display
- PCL_INFO ("Found %zu inliers.\n", inliers.indices.size ());
+ PCL_INFO ("Found %lu inliers.\n", inliers.indices.size ());
pcl::PointCloud<pcl::PointXYZ>::Ptr line (new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud (*cloud_f, inliers, *line);
p.addText (cloud_name, 20, 10, cloud_name, viewport);
}
// Add coordianate systems to all viewports
- p.addCoordinateSystem (0.1, 0);
+ p.addCoordinateSystem (0.1, "global", 0);
p.spin ();
return (0);
The code
--------
-First, grab a pcd file made from a kinect or similar device - here we shall use ``milk_cartoon_all_small_clorox.pcd`` which is available in the pcl trunk :download:`here <http://github.com/PointCloudLibrary/pcl/blob/master/test/milk_cartoon_all_small_clorox.pcd?raw=true>`).
-
+First, grab a pcd file made from a kinect or similar device - here we shall use ``milk_cartoon_all_small_clorox.pcd`` which is available in the pcl git
+`here <https://github.com/PointCloudLibrary/data/blob/master/tutorials/correspondence_grouping/milk_cartoon_all_small_clorox.pcd?raw=true>`_).
Next, copy and paste the following code into your editor and save it as ``supervoxel_clustering.cpp`` (or download the source file :download:`here <./sources/supervoxel_clustering/supervoxel_clustering.cpp>`).
.. literalinclude:: sources/supervoxel_clustering/supervoxel_clustering.cpp
We are now ready to setup the supervoxel clustering. We use the class :pcl:`SupervoxelClustering <pcl::SupervoxelClustering>`, which implements the clustering process and give it the parameters.
+.. important::
+
+ You MUST set use_transform to false if you are using a cloud which doesn't have the camera at (0,0,0). The transform is specifically designed to help improve Kinect data by increasing voxel bin size as distance from the camera increases. If your data is artificial, made from combining multiple clouds from cameras at different viewpoints, or doesn't have the camera at (0,0,0), the transform MUST be set to false.
+
.. literalinclude:: sources/supervoxel_clustering/supervoxel_clustering.cpp
:language: cpp
:lines: 73-77
The code
--------
-First, download the datasets from `github.com/PointCloudLibrary/data/tree/master/tutorials/template_alignment/ <https://raw.github.com/PointCloudLibrary/data/master/tutorials/template_alignment/>`_
+First, download the datasets from `github.com/PointCloudLibrary/data/tree/master/tutorials/template_alignment/ <https://github.com/PointCloudLibrary/data/tree/master/tutorials/template_alignment>`_
and extract the files.
Next, copy and paste the following code into your editor and save it as ``template_alignment.cpp`` (or download the source file :download:`here <./sources/template_alignment/template_alignment.cpp>`).
.. note::
- Because we are including an Eigen::Matrix4f in this struct, we need to include the EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro, which will overload the struct's "operator new" so that it will generate 16-bytes-aligned pointers. If you're curious, you can find more information about this issue `here <http://eigen.tuxfamily.org/api/TopicStructHavingEigenMembers.html>`_.
+ Because we are including an Eigen::Matrix4f in this struct, we need to include the EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro, which will overload the struct's "operator new" so that it will generate 16-bytes-aligned pointers. If you're curious, you can find more information about this issue `here <http://eigen.tuxfamily.org/dox/group__TopicStructHavingEigenMembers.html>`_.
.. literalinclude:: sources/template_alignment/template_alignment.cpp
:language: cpp
*Running pcl_kinfu_largeScale*
-Finally, we are ready to start KinFu Large Scale. After building the trunk, we will call the application::
+Finally, we are ready to start KinFu Large Scale. After building the git master, we will call the application::
$ ./bin/pcl_kinfu_largeScale -r -et
Conclusion
----------
-In this tutorial we have shown the pipeline from scanning to final texturing using KinFu Large Scale. The - *experimental* - code is available in PCL trunk.
+In this tutorial we have shown the pipeline from scanning to final texturing using KinFu Large Scale. The - *experimental* - code is available in the master branch of PCL.
.. _using_pcl_with_eclipse:
-Using PCL from trunk with Eclipse
----------------------------------
+======================
+Using PCL with Eclipse
+======================
-This tutorial explains how to use Eclipse as a PCL editor
+This tutorial explains how to use Eclipse as an IDE to manage your PCL projects. It was tested under Ubuntu 14.04 with Eclipse Luna;
+do not hesitate to modify this tutorial by submitting a pull request on GitHub to add other configurations etc.
+
+.. contents::
Prerequisites
--------------
+=============
-We assume you have downloaded, compiled and installed PCL from trunk (see Downloads, experimental) on your machine.
+We assume you have downloaded and extracted a PCL version (either PCL trunk or a stable version) on your machine.
+For the example, we will use the `pcl visualizer <http://www.pointclouds.org/documentation/tutorials/pcl_visualizer.php>`_ code.
Creating the eclipse project files
-----------------------------------
-
-Open a terminal window and do::
-
- $ cd /PATH/TO/MY/TRUNK/ROOT
- $ cmake -G"Eclipse CDT4 - Unix Makefiles" .
-
-You will see something similar to::
-
--- The C compiler identification is GNU
--- The CXX compiler identification is GNU
--- Could not determine Eclipse version, assuming at least 3.6 (Helios). Adjust CMAKE_ECLIPSE_VERSION if this is wrong.
--- Check for working C compiler: /home/u0062536/bin/gcc
--- Check for working C compiler: /home/u0062536/bin/gcc -- works
--- Detecting C compiler ABI info
--- Detecting C compiler ABI info - done
--- Check for working CXX compiler: /home/u0062536/bin/c++
--- Check for working CXX compiler: /home/u0062536/bin/c++ -- works
--- Detecting CXX compiler ABI info
--- Detecting CXX compiler ABI info - done
--- -- GCC > 4.3 found, enabling -Wabi
--- Using CPU native flags for SSE optimization: -march=native
--- Performing Test HAVE_MM_MALLOC
--- Performing Test HAVE_MM_MALLOC - Success
--- Performing Test HAVE_POSIX_MEMALIGN
--- Performing Test HAVE_POSIX_MEMALIGN - Success
--- Performing Test HAVE_SSE4_2_EXTENSIONS
--- Performing Test HAVE_SSE4_2_EXTENSIONS - Success
--- Performing Test HAVE_SSE4_1_EXTENSIONS
--- Performing Test HAVE_SSE4_1_EXTENSIONS - Success
--- Performing Test HAVE_SSE3_EXTENSIONS
--- Performing Test HAVE_SSE3_EXTENSIONS - Success
--- Performing Test HAVE_SSE2_EXTENSIONS
--- Performing Test HAVE_SSE2_EXTENSIONS - Success
--- Performing Test HAVE_SSE_EXTENSIONS
--- Performing Test HAVE_SSE_EXTENSIONS - Success
--- Found SSE4.2 extensions, using flags: -march=native -msse4.2 -mfpmath=sse
--- Try OpenMP C flag = [-fopenmp]
--- Performing Test OpenMP_FLAG_DETECTED
--- Performing Test OpenMP_FLAG_DETECTED - Success
--- Try OpenMP CXX flag = [-fopenmp]
--- Performing Test OpenMP_FLAG_DETECTED
--- Performing Test OpenMP_FLAG_DETECTED - Success
--- Found OpenMP: -fopenmp
--- Found OpenMP
--- Boost version: 1.46.1
--- The following subsystems will be built:
--- common
--- kdtree
--- octree
--- io
--- search
--- sample_consensus
--- filters
--- 2d
--- features
--- keypoints
--- geometry
--- ml
--- segmentation
--- visualization
--- outofcore
--- stereo
--- surface
--- tracking
--- registration
--- people
--- recognition
--- global_tests
--- tools
--- The following subsystems will not be built:
--- examples: Code examples are disabled by default.
--- simulation: Disabled by default.
--- apps: Disabled by default.
--- Configuring done
--- Generating done
--- Build files have been written to: /data/git/pcl
+==================================
+
+The files are organized like the following tree::
+
+ .
+ ├── build
+ └── src
+ ├── CMakeLists.txt
+ └── pcl_visualizer_demo.cpp
+
+Open a terminal, navigate to your project root folder and configure the project::
+
+ $ cd /path_to_my_project/build
+ $ cmake -G "Eclipse CDT4 - Unix Makefiles" ../src
+
+You will see something that should look like::
+
+ -- The C compiler identification is GNU 4.8.2
+ -- The CXX compiler identification is GNU 4.8.2
+ -- Could not determine Eclipse version, assuming at least 3.6 (Helios). Adjust CMAKE_ECLIPSE_VERSION if this is wrong.
+ -- Check for working C compiler: /usr/lib/ccache/cc
+ -- Check for working C compiler: /usr/lib/ccache/cc -- works
+ -- Detecting C compiler ABI info
+ -- Detecting C compiler ABI info - done
+ -- Check for working CXX compiler: /usr/lib/ccache/c++
+ -- Check for working CXX compiler: /usr/lib/ccache/c++ -- works
+ -- Detecting CXX compiler ABI info
+ -- Detecting CXX compiler ABI info - done
+ -- checking for module 'eigen3'
+ -- found eigen3, version 3.2.0
+ -- Found eigen: /usr/include/eigen3
+ -- Boost version: 1.54.0
+ -- Found the following Boost libraries:
+ -- system
+ -- filesystem
+ -- thread
+ -- date_time
+ -- iostreams
+ -- mpi
+ -- serialization
+ -- chrono
+ -- checking for module 'openni-dev'
+ -- package 'openni-dev' not found
+ -- Found openni: /usr/lib/libOpenNI.so
+ -- checking for module 'openni2-dev'
+ -- package 'openni2-dev' not found
+ -- Found OpenNI2: /usr/lib/libOpenNI2.so
+ ** WARNING ** io features related to pcap will be disabled
+ ** WARNING ** io features related to png will be disabled
+ -- Found libusb-1.0: /usr/include
+ -- checking for module 'flann'
+ -- found flann, version 1.8.4
+ -- Found Flann: /usr/lib/x86_64-linux-gnu/libflann_cpp_s.a
+ -- Found qhull: /usr/lib/x86_64-linux-gnu/libqhull.so
+ -- checking for module 'openni-dev'
+ -- package 'openni-dev' not found
+ -- checking for module 'openni2-dev'
+ -- package 'openni2-dev' not found
+ -- looking for PCL_COMMON
+ -- Found PCL_COMMON: /usr/local/lib/libpcl_common.so
+ -- looking for PCL_OCTREE
+ -- Found PCL_OCTREE: /usr/local/lib/libpcl_octree.so
+ -- looking for PCL_IO
+ -- Found PCL_IO: /usr/local/lib/libpcl_io.so
+ -- looking for PCL_KDTREE
+ -- Found PCL_KDTREE: /usr/local/lib/libpcl_kdtree.so
+ -- looking for PCL_SEARCH
+ -- Found PCL_SEARCH: /usr/local/lib/libpcl_search.so
+ -- looking for PCL_SAMPLE_CONSENSUS
+ -- Found PCL_SAMPLE_CONSENSUS: /usr/local/lib/libpcl_sample_consensus.so
+ -- looking for PCL_FILTERS
+ -- Found PCL_FILTERS: /usr/local/lib/libpcl_filters.so
+ -- looking for PCL_2D
+ -- Found PCL_2D: /usr/local/include/pcl-1.7
+ -- looking for PCL_FEATURES
+ -- Found PCL_FEATURES: /usr/local/lib/libpcl_features.so
+ -- looking for PCL_GEOMETRY
+ -- Found PCL_GEOMETRY: /usr/local/include/pcl-1.7
+ -- looking for PCL_KEYPOINTS
+ -- Found PCL_KEYPOINTS: /usr/local/lib/libpcl_keypoints.so
+ -- looking for PCL_SURFACE
+ -- Found PCL_SURFACE: /usr/local/lib/libpcl_surface.so
+ -- looking for PCL_REGISTRATION
+ -- Found PCL_REGISTRATION: /usr/local/lib/libpcl_registration.so
+ -- looking for PCL_ML
+ -- Found PCL_ML: /usr/local/lib/libpcl_ml.so
+ -- looking for PCL_SEGMENTATION
+ -- Found PCL_SEGMENTATION: /usr/local/lib/libpcl_segmentation.so
+ -- looking for PCL_RECOGNITION
+ -- Found PCL_RECOGNITION: /usr/local/lib/libpcl_recognition.so
+ -- looking for PCL_VISUALIZATION
+ -- Found PCL_VISUALIZATION: /usr/local/lib/libpcl_visualization.so
+ -- looking for PCL_PEOPLE
+ -- Found PCL_PEOPLE: /usr/local/lib/libpcl_people.so
+ -- looking for PCL_OUTOFCORE
+ -- Found PCL_OUTOFCORE: /usr/local/lib/libpcl_outofcore.so
+ -- looking for PCL_TRACKING
+ -- Found PCL_TRACKING: /usr/local/lib/libpcl_tracking.so
+ -- looking for PCL_STEREO
+ -- Found PCL_STEREO: /usr/local/lib/libpcl_stereo.so
+ -- looking for PCL_GPU_CONTAINERS
+ -- Found PCL_GPU_CONTAINERS: /usr/local/lib/libpcl_gpu_containers.so
+ -- looking for PCL_GPU_UTILS
+ -- Found PCL_GPU_UTILS: /usr/local/lib/libpcl_gpu_utils.so
+ -- looking for PCL_GPU_OCTREE
+ -- Found PCL_GPU_OCTREE: /usr/local/lib/libpcl_gpu_octree.so
+ -- looking for PCL_GPU_FEATURES
+ -- Found PCL_GPU_FEATURES: /usr/local/lib/libpcl_gpu_features.so
+ -- looking for PCL_GPU_KINFU
+ -- Found PCL_GPU_KINFU: /usr/local/lib/libpcl_gpu_kinfu.so
+ -- looking for PCL_GPU_KINFU_LARGE_SCALE
+ -- Found PCL_GPU_KINFU_LARGE_SCALE: /usr/local/lib/libpcl_gpu_kinfu_large_scale.so
+ -- looking for PCL_GPU_SEGMENTATION
+ -- Found PCL_GPU_SEGMENTATION: /usr/local/lib/libpcl_gpu_segmentation.so
+ -- looking for PCL_CUDA_COMMON
+ -- Found PCL_CUDA_COMMON: /usr/local/include/pcl-1.7
+ -- looking for PCL_CUDA_FEATURES
+ -- Found PCL_CUDA_FEATURES: /usr/local/lib/libpcl_cuda_features.so
+ -- looking for PCL_CUDA_SEGMENTATION
+ -- Found PCL_CUDA_SEGMENTATION: /usr/local/lib/libpcl_cuda_segmentation.so
+ -- looking for PCL_CUDA_SAMPLE_CONSENSUS
+ -- Found PCL_CUDA_SAMPLE_CONSENSUS: /usr/local/lib/libpcl_cuda_sample_consensus.so
+ -- Found PCL: /usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_thread.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_mpi.so;/usr/lib/x86_64-linux-gnu/libboost_serialization.so;/usr/lib/x86_64-linux-gnu/libboost_chrono.so;/usr/lib/x86_64-linux-gnu/libpthread.so;optimized;/usr/local/lib/libpcl_common.so;debug;/usr/local/lib/libpcl_common.so;optimized;/usr/local/lib/libpcl_octree.so;debug;/usr/local/lib/libpcl_octree.so;/usr/lib/libOpenNI.so;/usr/lib/libOpenNI2.so;vtkCommon;vtkFiltering;vtkImaging;vtkGraphics;vtkGenericFiltering;vtkIO;vtkRendering;vtkVolumeRendering;vtkHybrid;vtkWidgets;vtkParallel;vtkInfovis;vtkGeovis;vtkViews;vtkCharts;optimized;/usr/local/lib/libpcl_io.so;debug;/usr/local/lib/libpcl_io.so;optimized;/usr/lib/x86_64-linux-gnu/libflann_cpp_s.a;debug;/usr/lib/x86_64-linux-gnu/libflann_cpp_s.a;optimized;/usr/local/lib/libpcl_kdtree.so;debug;/usr/local/lib/libpcl_kdtree.so;optimized;/usr/local/lib/libpcl_search.so;debug;/usr/local/lib/libpcl_search.so;optimized;/usr/local/lib/libpcl_sample_consensus.so;debug;/usr/local/lib/libpcl_sample_consensus.so;optimized;/usr/local/lib/libpcl_filters.so;debug;/usr/local/lib/libpcl_filters.so;optimized;/usr/local/lib/libpcl_features.so;debug;/usr/local/lib/libpcl_features.so;optimized;/usr/local/lib/libpcl_keypoints.so;debug;/usr/local/lib/libpcl_keypoints.so;optimized;/usr/lib/x86_64-linux-gnu/libqhull.so;debug;/usr/lib/x86_64-linux-gnu/libqhull.so;optimized;/usr/local/lib/libpcl_surface.so;debug;/usr/local/lib/libpcl_surface.so;optimized;/usr/local/lib/libpcl_registration.so;debug;/usr/local/lib/libpcl_registration.so;optimized;/usr/local/lib/libpcl_ml.so;debug;/usr/local/lib/libpcl_ml.so;optimized;/usr/local/lib/libpcl_segmentation.so;debug;/usr/local/lib/libpcl_segmentation.so;optimized;/usr/local/lib/libpcl_recognition.so;debug;/usr/local/lib/libpcl_recognition.so;optimized;/usr/local/lib/libpcl_visualization.so;debug;/usr/local/lib/libpcl_visualization.so;optimized;/usr/local/lib/libpcl_people.so;debug;/usr/local/lib/libpcl_people.so;optimized;/usr/local/lib/libpcl_outofcore.so;debug;/usr/local/lib/libpcl_outofcore.so;optimized;/usr/local/lib/libpcl_tracking.so;debug;/usr/local/lib/libpcl_tracking.so;optimized;/usr/local/lib/libpcl_stereo.so;debug;/usr/local/lib/libpcl_stereo.so;optimized;/usr/local/lib/libpcl_gpu_containers.so;debug;/usr/local/lib/libpcl_gpu_containers.so;optimized;/usr/local/lib/libpcl_gpu_utils.so;debug;/usr/local/lib/libpcl_gpu_utils.so;optimized;/usr/local/lib/libpcl_gpu_octree.so;debug;/usr/local/lib/libpcl_gpu_octree.so;optimized;/usr/local/lib/libpcl_gpu_features.so;debug;/usr/local/lib/libpcl_gpu_features.so;optimized;/usr/local/lib/libpcl_gpu_kinfu.so;debug;/usr/local/lib/libpcl_gpu_kinfu.so;optimized;/usr/local/lib/libpcl_gpu_kinfu_large_scale.so;debug;/usr/local/lib/libpcl_gpu_kinfu_large_scale.so;optimized;/usr/local/lib/libpcl_gpu_segmentation.so;debug;/usr/local/lib/libpcl_gpu_segmentation.so;optimized;/usr/local/lib/libpcl_cuda_features.so;debug;/usr/local/lib/libpcl_cuda_features.so;optimized;/usr/local/lib/libpcl_cuda_segmentation.so;debug;/usr/local/lib/libpcl_cuda_segmentation.so;optimized;/usr/local/lib/libpcl_cuda_sample_consensus.so;debug;/usr/local/lib/libpcl_cuda_sample_consensus.so;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_thread.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_mpi.so;/usr/lib/x86_64-linux-gnu/libboost_serialization.so;/usr/lib/x86_64-linux-gnu/libboost_chrono.so;/usr/lib/x86_64-linux-gnu/libpthread.so;optimized;/usr/lib/x86_64-linux-gnu/libqhull.so;debug;/usr/lib/x86_64-linux-gnu/libqhull.so;/usr/lib/libOpenNI.so;/usr/lib/libOpenNI2.so;optimized;/usr/lib/x86_64-linux-gnu/libflann_cpp_s.a;debug;/usr/lib/x86_64-linux-gnu/libflann_cpp_s.a;vtkCommon;vtkFiltering;vtkImaging;vtkGraphics;vtkGenericFiltering;vtkIO;vtkRendering;vtkVolumeRendering;vtkHybrid;vtkWidgets;vtkParallel;vtkInfovis;vtkGeovis;vtkViews;vtkCharts (Required is at least version "1.7")
+ -- Configuring done
+ -- Generating done
+ -- Build files have been written to: /home/dell/visualizer/build
Importing into Eclipse
-----------------------
+======================
+
+- Launch `Eclipse CDT <http://eclipse.org/cdt/>`_ and select ``File > Import``.
+- In the list select ``General > Existing Projects into Workspace`` and then next.
+- Browse (``Select root directory``) to the root folder of the project and select the ``build`` folder (in the example case, ``/home/dell/visualizer/build``).
+- Click ``Finish``.
+
+.. WARNING::
+ The Eclipse indexer is going to parse the files in the project (and all the includes), this can take a lot of time and might crash Eclipse if it's not configured for big projects.
+ Take a look at the bottom right of Eclipse's window to see the indexer status; it is advised not to do anything until the indexer has finished it's job.
+
+Configuring Eclipse
+-------------------
+
+If Eclipse fails to open your PCL project you might need to change Eclipse configuration; here are some values that should solve all problems
+(but might not work on light hardware configurations)::
+
+ $ sudo gedit /usr/lib/eclipse/eclipse.ini
-Now you launch your Eclipse editor and you select File->Import...
-Out of the list you select General->Existing Projects into Workspace and then next.
-At the top you select Select root directory to be the root of your pcl trunk installation and press Finish.
+Change the values in the last lines::
+
+ org.eclipse.platform
+ --launcher.XXMaxPermSize
+ 1024m
+ --launcher.defaultAction
+ openFile
+ --launcher.appendVmargs
+ -vmargs
+ -Dosgi.requiredJavaVersion=1.7
+ -XX:MaxPermSize=512m
+ -Xms1024m
+ -Xmx1024m
+
+Restart Eclipse and go to ``Windows > Preferences``, then ``C/C++ > Indexer > Cache Limits``. Set the limits to [50% | 512 | 512].
Setting the PCL code style in Eclipse
--------------------------------------
+=====================================
+
+You can find a PCL code style file for Eclipse in `PCL GitHub trunk <https://github.com/PointCloudLibrary/pcl/blob/master/doc/advanced/content/files/PCL_eclipse_profile.xml>`_
+
+Global
+------
+If you want to apply the PCL style guide to all projects:
+``Windows > Preferences > C/C++ > Code Style > Formatter``
+
+Project specific
+----------------
+If you want to apply the style guide only to one project:
+Go to ``Project > Properties``, then select ``Code Style`` in the left field and Enable ``project specific settings``, then ``Import`` and select where you profile file (.xml) is.
+
+How to format the code
+----------------------
+If you want to format the whole project use ``Source > Format``. If you want to format only your selection use the shortcut ``Ctrl + Shift + F``
+
+Launching the program
+=====================
+
+To build the project, click on the build icon
+
+.. image:: images/pcl_with_eclipse/build_tab.gif
+ :height: 16
+
+- Create a launch configuration, select the project on the left panel (left click on the project name); ``Run > Run Configurations..``.
+- Create a new ``C/C++ Application`` click on ``Search Project`` and choose the executable to be launched.
+- Go the second tab (``Arguments``) and enter your arguments; remember this is not a terminal and ``~`` won't work to get to your home folder for example !
+
+Run the program by clicking on the run icon
-You can find a PCL code style file for Eclipse in trunk/doc/advanced/content/files/.
-In Eclipse go to Project->Properties, then select Code Style in the left field and Enable project specific settings, then Import and select where your trunk/doc/advanced/content/files/PCL_eclipse_profile.xml file is.
+.. image:: images/pcl_with_eclipse/lrun_obj.gif
+ :height: 16
Where to get more information
------------------------------
+=============================
-You can get more information here: http://www.vtk.org/Wiki/Eclipse_CDT4_Generator
+You can get more information about the Eclipse CDT4 Generator `here <http://www.vtk.org/Wiki/Eclipse_CDT4_Generator>`_.
-----------------------
The Viewpoint Feature Histogram is implemented in PCL as part of the
-`pcl_features <http://docs.pointclouds.org/trunk/group__features.html>`_
+`pcl_features <http://docs.pointclouds.org/trunk/a02944.html>`_
library.
The default VFH implementation uses 45 binning subdivisions for each of the
Our Kd-Tree implementation of choice for the purpose of this tutorial is of
-course, `FLANN <http://www.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN>`_.
+course, `FLANN <http://www.cs.ubc.ca/research/flann/>`_.
Training
.. note::
- If you are running this tutorial on Windows, you have to install (`HDF5 1.8.7 Shared Library <http://www.hdfgroup.org/ftp/HDF5/hdf5-1.8.7/bin/windows/>`_). If CMake is not able to find HDF5,
+ If you are running this tutorial on Windows, you have to install (`HDF5 1.8.7 Shared Library <http://www.hdfgroup.org/ftp/HDF5/current/bin/windows/>`_). If CMake is not able to find HDF5,
you can manually supply the include directory in HDF5_INCLUDE_DIR variable and the full path of **hdf5dll.lib** in HDF5_hdf5_LIBRARY variable.
Make sure that the needed dlls are in the same folder as the executables.
--- /dev/null
+.. _visualization:
+
+PCL Visualization overview
+--------------------------
+
+The **pcl_visualization** library was built for the purpose of being able to
+quickly prototype and visualize the results of algorithms operating on 3D point
+cloud data. Similar to OpenCV's **highgui** routines for displaying 2D images
+and for drawing basic 2D shapes on screen, the library offers:
+
+ * methods for rendering and setting visual properties (colors, point sizes,
+ opacity, etc) for any n-D point cloud datasets in pcl::PointCloud<T> format;
+
+ .. image:: images/visualization/bunny.jpg
+
+ * methods for drawing basic 3D shapes on screen (e.g., cylinders, spheres,
+ lines, polygons, etc) either from sets of points or from parametric
+ equations;
+
+ .. image:: images/visualization/shapes.jpg
+
+ * a histogram visualization module (PCLHistogramVisualizer) for 2D plots;
+
+ .. image:: images/visualization/histogram.jpg
+
+ * a multitude of Geometry and Color handler for pcl::PointCloud<T> datasets;
+
+ .. image:: images/visualization/normals.jpg
+ .. image:: images/visualization/pcs.jpg
+
+ * a pcl::RangeImage visualization module.
+
+ .. image:: images/visualization/range_image.jpg
+
+The package makes use of the VTK library for 3D rendering for
+range image and 2D operations.
+
+For implementing your own visualizers, take a look at the tests and examples
+accompanying the library.
+
+.. note::
+
+ Due to historical reasons, PCL 1.x stores RGB data as a packed float (to
+ preserve backward compatibility). To learn more about this, please see the
+ `PointXYZRGB
+ <http://docs.pointclouds.org/trunk/structpcl_1_1_point_x_y_z_r_g_b.html>`_.
+
+Simple Cloud Visualization
+--------------------------
+
+If you just want to visualize something in your app with a few lines of code,
+use a snippet like the following one:
+
+.. code-block:: cpp
+ :linenos:
+
+ #include <pcl_visualization/cloud_viewer.h>
+ //...
+ void
+ foo ()
+ {
+ pcl::PointCloud<pcl::PointXYZRGB> cloud;
+ //... populate cloud
+ pcl_visualization::CloudViewer viewer("Simple Cloud Viewer");
+ viewer.showCloud(cloud);
+ while (!viewer.wasStopped())
+ {
+ }
+ }
+
+PCD Viewer
+----------
+
+A quick way for visualizing PCD (Point Cloud Data) files is by using
+**pcl_viewer**. As of 0.2.7, pcl_viewer's help screen looks like::
+
+ Syntax is: pcl_viewer <file_name 1..N>.pcd <options>
+ where options are:
+ -bc r,g,b = background color
+ -fc r,g,b = foreground color
+ -ps X = point size (1..64)
+ -opaque X = rendered point cloud opacity (0..1)
+ -ax n = enable on-screen display of XYZ axes and scale them to n
+ -ax_pos X,Y,Z = if axes are enabled, set their X,Y,Z position in space (default 0,0,0)
+
+ -cam (*) = use given camera settings as initial view
+ (*) [Clipping Range / Focal Point / Position / ViewUp / Distance / Window Size / Window Pos] or use a <filename.cam> that contains the same information.
+
+ -multiview 0/1 = enable/disable auto-multi viewport rendering (default disabled)
+
+
+ -normals 0/X = disable/enable the display of every Xth point's surface normal as lines (default disabled)
+ -normals_scale X = resize the normal unit vector size to X (default 0.02)
+
+ -pc 0/X = disable/enable the display of every Xth point's principal curvatures as lines (default disabled)
+ -pc_scale X = resize the principal curvatures vectors size to X (default 0.02)
+
+
+ (Note: for multiple .pcd files, provide multiple -{fc,ps} parameters; they will be automatically assigned to the right file)
+
+Usage examples
+--------------
+
+.. code-block:: bash
+
+ $ pcl_viewer -multiview 1 data/partial_cup_model.pcd data/partial_cup_model.pcd data/partial_cup_model.pcd
+
+
+The above will load the ``partial_cup_model.pcd`` file 3 times, and will create a
+multi-viewport rendering (``-multiview 1``).
+
+.. image:: images/visualization/ex1.jpg
+
+Pressing ``h`` while the point clouds are being rendered will output the
+following information on the console::
+
+ | Help:
+ -------
+ p, P : switch to a point-based representation
+ w, W : switch to a wireframe-based representation (where available)
+ s, S : switch to a surface-based representation (where available)
+
+ j, J : take a .PNG snapshot of the current window view
+ c, C : display current camera/window parameters
+
+ + / - : increment/decrement overall point size
+
+ g, G : display scale grid (on/off)
+ u, U : display lookup table (on/off)
+
+ r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]
+
+ ALT + s, S : turn stereo mode on/off
+ ALT + f, F : switch between maximized window mode and original size
+
+ l, L : list all available geometric and color handlers for the current actor map
+ ALT + 0..9 [+ CTRL] : switch between different geometric handlers (where available)
+ 0..9 [+ CTRL] : switch between different color handlers (where available)
+
+
+Pressing ``l`` will show the current list of available geometry/color handlers
+for the datasets that we loaded. In this example::
+
+ List of available geometry handlers for actor partial_cup_model.pcd-0: xyz(1) normal_xyz(2)
+ List of available color handlers for actor partial_cup_model.pcd-0: [random](1) x(2) y(3) z(4) normal_x(5) normal_y(6) normal_z(7) curvature(8) boundary(9) k(10) principal_curvature_x(11) principal_curvature_y(12) principal_curvature_z(13) pc1(14) pc2(15)
+
+Switching to a ``normal_xyz`` geometric handler using ``ALT+1`` and then
+pressing ``8`` to switch to a curvature color handler, should result in the
+following::
+
+ $ pcl_viewer -normals 100 data/partial_cup_model.pcd
+
+.. image:: images/visualization/ex2.jpg
+
+
+The above will load the ``partial_cup_model.pcd`` file and render its every
+``100`` th surface normal on screen.
+
+.. code-block:: bash
+
+ $ pcl_viewer -pc 100 data/partial_cup_model.pcd
+
+.. image:: images/visualization/ex3.jpg
+
+The above will load the ``partial_cup_model.pcd`` file and render its every
+``100`` th principal curvature (+surface normal) on screen.
+
+.. image:: images/visualization/ex4.jpg
+
+.. code-block:: bash
+
+ $ pcl_viewer data/bun000.pcd data/bun045.pcd -ax 0.5 -ps 3 -ps 1
+
+The above assumes that the ``bun000.pcd`` and ``bun045.pcd`` datasets have been
+downloaded and are available. The results shown in the following picture were
+obtained after pressing ``u`` and ``g`` to enable the lookup table and on-grid
+display.
+
+.. image:: images/visualization/ex5.jpg
+
+
+Range Image Visualizer
+----------------------
+
+A quick way for visualizing range images is by using the binary of the tutorial
+for range_image_visualization::
+
+ $ tutorial_range_image_visualization data/office_scene.pcd
+
+The above will load the ``office_scene.pcd`` point cloud file, create a range
+image from it and visualize both, the point cloud and the range image.
+
.. image:: images/statistical_removal_2.jpg
-**Documentation:** http://docs.pointclouds.org/trunk/group__filters.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02945.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#filtering-tutorial
**Background**
A theoretical primer explaining how features work in PCL can be found in the `3D Features tutorial
- <http:/pointclouds.org/documentation/tutorials/how_features_work.php#how-3d-features-work>`_.
+ <http://pointclouds.org/documentation/tutorials/how_features_work.php>`_.
The *features* library contains data structures and mechanisms for 3D feature estimation from point cloud data. 3D features are representations at certain 3D points, or positions, in space, which describe geometrical patterns based on the information available around the point. The data space selected around the query point is usually referred to as the *k-neighborhood*.
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__features.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02944.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#features-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__keypoints.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02949.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#keypoints-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__registration.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02953.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#registration-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__kdtree.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02948.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#kdtree-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__octree.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02950.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#octree-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__segmentation.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02956.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#segmentation-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__sample__consensus.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02954.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#sample-consensus
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__surface.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02957.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#surface-tutorial
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__range__image.html
+**Documentation:** http://docs.pointclouds.org/trunk/a01344.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#range-images
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__io.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02947.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#i-o
|
-**Documentation:** http://docs.pointclouds.org/trunk/group__visualization.html
+**Documentation:** http://docs.pointclouds.org/trunk/a02958.html
**Tutorials:** http://pointclouds.org/documentation/tutorials/#visualization-tutorial
PCL_ADD_EXAMPLE(pcl_example_sift_z_keypoint_estimation FILES example_sift_z_keypoint_estimation.cpp
LINK_WITH pcl_common pcl_visualization pcl_keypoints pcl_io)
+ PCL_ADD_EXAMPLE(pcl_example_get_keypoints_indices FILES example_get_keypoints_indices.cpp
+ LINK_WITH pcl_common pcl_keypoints pcl_io)
+
endif(BUILD_visualization)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <iostream>
+
+#include <pcl/console/parse.h>
+#include <pcl/console/print.h>
+#include <pcl/point_types.h>
+#include <pcl/point_cloud.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/keypoints/harris_3d.h>
+
+int
+main(int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ pcl::console::print_info ("Keypoints indices example application.\n");
+ pcl::console::print_info ("Syntax is: %s <source-pcd-file>\n", argv[0]);
+ return (1);
+ }
+
+ pcl::console::print_info ("Reading %s\n", argv[1]);
+
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
+ if(pcl::io::loadPCDFile<pcl::PointXYZRGB> (argv[1], *cloud) == -1) // load the file
+ {
+ pcl::console::print_error ("Couldn't read file %s!\n", argv[1]);
+ return (-1);
+ }
+
+ pcl::HarrisKeypoint3D <pcl::PointXYZRGB, pcl::PointXYZI> detector;
+ pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints (new pcl::PointCloud<pcl::PointXYZI>);
+ detector.setNonMaxSupression (true);
+ detector.setInputCloud (cloud);
+ detector.setThreshold (1e-6);
+ pcl::StopWatch watch;
+ detector.compute (*keypoints);
+ pcl::console::print_highlight ("Detected %zd points in %lfs\n", keypoints->size (), watch.getTimeSeconds ());
+ pcl::PointIndicesConstPtr keypoints_indices = detector.getKeypointsIndices ();
+ if (!keypoints_indices->indices.empty ())
+ {
+ pcl::io::savePCDFile ("keypoints.pcd", *cloud, keypoints_indices->indices, true);
+ pcl::console::print_info ("Saved keypoints to keypoints.pcd\n");
+ }
+ else
+ pcl::console::print_warn ("Keypoints indices are empty!\n");
+}
return -1;
}
- pcl::console::print_highlight ("Loaded cloud %s of size %zu\n", av[1], cloud_ptr->points.size ());
+ pcl::console::print_highlight ("Loaded cloud %s of size %lu\n", av[1], cloud_ptr->points.size ());
// Remove the nans
cloud_ptr->is_dense = false;
cloud_no_nans->is_dense = false;
std::vector<int> indices;
pcl::removeNaNFromPointCloud (*cloud_ptr, *cloud_no_nans, indices);
- pcl::console::print_highlight ("Removed nans from %zu to %zu\n", cloud_ptr->points.size (), cloud_no_nans->points.size ());
+ pcl::console::print_highlight ("Removed nans from %lu to %lu\n", cloud_ptr->points.size (), cloud_no_nans->points.size ());
// Estimate the normals
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setSearchMethod (tree_n);
ne.setRadiusSearch (0.03);
ne.compute (*cloud_normals);
- pcl::console::print_highlight ("Normals are computed and size is %zu\n", cloud_normals->points.size ());
+ pcl::console::print_highlight ("Normals are computed and size is %lu\n", cloud_normals->points.size ());
// Region growing
pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> rg;
cloud_segmented = rg.getColoredCloud ();
// Writing the resulting cloud into a pcd file
- pcl::console::print_highlight ("Number of segments done is %zu\n", clusters.size ());
+ pcl::console::print_highlight ("Number of segments done is %lu\n", clusters.size ());
writer.write<pcl::PointXYZRGB> ("segment_result.pcd", *cloud_segmented, false);
if (pcl::console::find_switch (argc, av, "-dump"))
depth_pixel = static_cast<unsigned short*>(depth_image->GetScalarPointer (depth_dims[0]-1,depth_dims[1]-1,0));
color_pixel = static_cast<unsigned char*> (rgb_image->GetScalarPointer (depth_dims[0]-1,depth_dims[1]-1,0));
- for (int y=0; y<cloud->height; ++y)
+ for (size_t y=0; y<cloud->height; ++y)
{
- for (int x=0; x<cloud->width; ++x, --depth_pixel, color_pixel-=3)
+ for (size_t x=0; x<cloud->width; ++x, --depth_pixel, color_pixel-=3)
{
PointT new_point;
// uint8_t* p_i = &(cloud_blob->data[y * cloud_blob->row_step + x * cloud_blob->point_step]);
}
else
{
- new_point.x = (static_cast<float>(x - centerX)) * depth * fl_const;
- new_point.y = (static_cast<float>(centerY - y)) * depth * fl_const; // vtk seems to start at the bottom left image corner
+ new_point.x = (static_cast<float> (x) - centerX) * depth * fl_const;
+ new_point.y = (static_cast<float> (centerY) - y) * depth * fl_const; // vtk seems to start at the bottom left image corner
new_point.z = depth;
}
PointNCloudT::Ptr sv_normal_cloud = super.makeSupervoxelNormalCloud (supervoxel_clusters);
PointLCloudT::Ptr full_labeled_cloud = super.getLabeledCloud ();
+ std::cout << "Getting supervoxel adjacency\n";
+ std::multimap<uint32_t, uint32_t> label_adjacency;
+ super.getSupervoxelAdjacency (label_adjacency);
+
std::map <uint32_t, pcl::Supervoxel<PointT>::Ptr > refined_supervoxel_clusters;
std::cout << "Refining supervoxels \n";
super.refineSupervoxels (3, refined_supervoxel_clusters);
PointLCloudT::Ptr refined_full_labeled_cloud = super.getLabeledCloud ();
PointCloudT::Ptr refined_full_colored_cloud = super.getColoredCloud ();
- std::cout << "Getting supervoxel adjacency\n";
- std::multimap<uint32_t, uint32_t> label_adjacency;
- super.getSupervoxelAdjacency (label_adjacency);
-
// THESE ONLY MAKE SENSE FOR ORGANIZED CLOUDS
pcl::io::savePNGFile (out_path, *full_colored_cloud, "rgb");
pcl::io::savePNGFile (refined_out_path, *refined_full_colored_cloud, "rgb");
PCL_ADD_EXAMPLE(pcl_example_nurbs_fitting_surface
FILES example_nurbs_fitting_surface.cpp
LINK_WITH pcl_common pcl_io pcl_surface pcl_visualization)
+
+ PCL_ADD_EXAMPLE(pcl_example_nurbs_viewer_surface
+ FILES example_nurbs_viewer_surface.cpp
+ LINK_WITH pcl_common pcl_io pcl_surface pcl_visualization)
PCL_ADD_EXAMPLE(pcl_example_nurbs_fitting_closed_curve
FILES example_nurbs_fitting_closed_curve.cpp
typedef pcl::PointXYZ Point;
void
-PointCloud2Vector3d (pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data)
-{
- for (unsigned i = 0; i < cloud->size (); i++)
- {
- Point &p = cloud->at (i);
- if (!pcl_isnan (p.x) && !pcl_isnan (p.y) && !pcl_isnan (p.z))
- data.push_back (Eigen::Vector3d (p.x, p.y, p.z));
- }
-}
+PointCloud2Vector3d (pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data);
void
-visualizeCurve (ON_NurbsCurve &curve, ON_NurbsSurface &surface, pcl::visualization::PCLVisualizer &viewer)
-{
- pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
-
- pcl::on_nurbs::Triangulation::convertCurve2PointCloud (curve, surface, curve_cloud, 4);
- for (std::size_t i = 0; i < curve_cloud->size () - 1; i++)
- {
- pcl::PointXYZRGB &p1 = curve_cloud->at (i);
- pcl::PointXYZRGB &p2 = curve_cloud->at (i + 1);
- std::ostringstream os;
- os << "line" << i;
- viewer.removeShape (os.str ());
- viewer.addLine<pcl::PointXYZRGB> (p1, p2, 1.0, 0.0, 0.0, os.str ());
- }
-
- pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cps (new pcl::PointCloud<pcl::PointXYZRGB>);
- for (int i = 0; i < curve.CVCount (); i++)
- {
- ON_3dPoint p1;
- curve.GetCV (i, p1);
-
- double pnt[3];
- surface.Evaluate (p1.x, p1.y, 0, 3, pnt);
- pcl::PointXYZRGB p2;
- p2.x = float (pnt[0]);
- p2.y = float (pnt[1]);
- p2.z = float (pnt[2]);
-
- p2.r = 255;
- p2.g = 0;
- p2.b = 0;
-
- curve_cps->push_back (p2);
- }
- viewer.removePointCloud ("cloud_cps");
- viewer.addPointCloud (curve_cps, "cloud_cps");
-}
+visualizeCurve (ON_NurbsCurve &curve,
+ ON_NurbsSurface &surface,
+ pcl::visualization::PCLVisualizer &viewer);
int
main (int argc, char *argv[])
{
- std::string pcd_file;
+ std::string pcd_file, file_3dm;
- if (argc < 2)
+ if (argc < 3)
{
- printf ("\nUsage: pcl_example_nurbs_fitting_surface pcd<PointXYZ>-file\n\n");
+ printf ("\nUsage: pcl_example_nurbs_fitting_surface pcd<PointXYZ>-in-file 3dm-out-file\n\n");
exit (0);
}
-
pcd_file = argv[1];
+ file_3dm = argv[2];
- unsigned order (3);
- unsigned refinement (6);
- unsigned iterations (10);
- unsigned mesh_resolution (256);
-
- pcl::visualization::PCLVisualizer viewer ("Test: NURBS surface fitting");
+ pcl::visualization::PCLVisualizer viewer ("B-spline surface fitting");
viewer.setSize (800, 600);
// ############################################################################
// load point cloud
+
printf (" loading %s\n", pcd_file.c_str ());
pcl::PointCloud<Point>::Ptr cloud (new pcl::PointCloud<Point>);
pcl::PCLPointCloud2 cloud2;
PointCloud2Vector3d (cloud, data.interior);
pcl::visualization::PointCloudColorHandlerCustom<Point> handler (cloud, 0, 255, 0);
viewer.addPointCloud<Point> (cloud, handler, "cloud_cylinder");
- printf (" %zu points in data set\n", cloud->size ());
+ printf (" %lu points in data set\n", cloud->size ());
// ############################################################################
- // fit NURBS surface
+ // fit B-spline surface
+
+ // parameters
+ unsigned order (3);
+ unsigned refinement (5);
+ unsigned iterations (10);
+ unsigned mesh_resolution (256);
+
+ pcl::on_nurbs::FittingSurface::Parameter params;
+ params.interior_smoothness = 0.2;
+ params.interior_weight = 1.0;
+ params.boundary_smoothness = 0.2;
+ params.boundary_weight = 0.0;
+
+ // initialize
printf (" surface fitting ...\n");
ON_NurbsSurface nurbs = pcl::on_nurbs::FittingSurface::initNurbsPCABoundingBox (order, &data);
pcl::on_nurbs::FittingSurface fit (&data, nurbs);
- // fit.setQuiet (false);
+ // fit.setQuiet (false); // enable/disable debug output
+ // mesh for visualization
pcl::PolygonMesh mesh;
pcl::PointCloud<pcl::PointXYZ>::Ptr mesh_cloud (new pcl::PointCloud<pcl::PointXYZ>);
std::vector<pcl::Vertices> mesh_vertices;
-
std::string mesh_id = "mesh_nurbs";
pcl::on_nurbs::Triangulation::convertSurface2PolygonMesh (fit.m_nurbs, mesh, mesh_resolution);
viewer.addPolygonMesh (mesh, mesh_id);
- pcl::on_nurbs::FittingSurface::Parameter params;
- params.interior_smoothness = 0.15;
- params.interior_weight = 1.0;
- params.boundary_smoothness = 0.15;
- params.boundary_weight = 0.0;
-
- // NURBS refinement
+ // surface refinement
for (unsigned i = 0; i < refinement; i++)
{
fit.refine (0);
viewer.spinOnce ();
}
- // fitting iterations
+ // surface fitting with final refinement level
for (unsigned i = 0; i < iterations; i++)
{
fit.assemble (params);
}
// ############################################################################
- // fit NURBS curve
+ // fit B-spline curve
+
+ // parameters
pcl::on_nurbs::FittingCurve2dAPDM::FitParameter curve_params;
- curve_params.addCPsAccuracy = 3e-2;
+ curve_params.addCPsAccuracy = 5e-2;
curve_params.addCPsIteration = 3;
curve_params.maxCPs = 200;
curve_params.accuracy = 1e-3;
- curve_params.iterations = 10000;
+ curve_params.iterations = 100;
curve_params.param.closest_point_resolution = 0;
curve_params.param.closest_point_weight = 1.0;
curve_params.param.closest_point_sigma2 = 0.1;
- curve_params.param.interior_sigma2 = 0.0001;
+ curve_params.param.interior_sigma2 = 0.00001;
curve_params.param.smooth_concavity = 1.0;
curve_params.param.smoothness = 1.0;
+ // initialisation (circular)
+ printf (" curve fitting ...\n");
pcl::on_nurbs::NurbsDataCurve2d curve_data;
curve_data.interior = data.interior_param;
curve_data.interior_weight_function.push_back (true);
-
ON_NurbsCurve curve_nurbs = pcl::on_nurbs::FittingCurve2dAPDM::initNurbsCurve2D (order, curve_data.interior);
+ // curve fitting
pcl::on_nurbs::FittingCurve2dASDM curve_fit (&curve_data, curve_nurbs);
-// curve_fit.setQuiet (false);
-
- // ############################### FITTING ###############################
+ // curve_fit.setQuiet (false); // enable/disable debug output
curve_fit.fitting (curve_params);
visualizeCurve (curve_fit.m_nurbs, fit.m_nurbs, viewer);
// ############################################################################
// triangulation of trimmed surface
+
printf (" triangulate trimmed surface ...\n");
viewer.removePolygonMesh (mesh_id);
pcl::on_nurbs::Triangulation::convertTrimmedSurface2PolygonMesh (fit.m_nurbs, curve_fit.m_nurbs, mesh,
mesh_resolution);
viewer.addPolygonMesh (mesh, mesh_id);
+
+ // save trimmed B-spline surface
+ if ( fit.m_nurbs.IsValid() )
+ {
+ ONX_Model model;
+ ONX_Model_Object& surf = model.m_object_table.AppendNew();
+ surf.m_object = new ON_NurbsSurface(fit.m_nurbs);
+ surf.m_bDeleteObject = true;
+ surf.m_attributes.m_layer_index = 1;
+ surf.m_attributes.m_name = "surface";
+
+ ONX_Model_Object& curv = model.m_object_table.AppendNew();
+ curv.m_object = new ON_NurbsCurve(curve_fit.m_nurbs);
+ curv.m_bDeleteObject = true;
+ curv.m_attributes.m_layer_index = 2;
+ curv.m_attributes.m_name = "trimming curve";
+
+ model.Write(file_3dm.c_str());
+ printf(" model saved: %s\n", file_3dm.c_str());
+ }
+
printf (" ... done.\n");
viewer.spin ();
return 0;
}
+
+void
+PointCloud2Vector3d (pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data)
+{
+ for (unsigned i = 0; i < cloud->size (); i++)
+ {
+ Point &p = cloud->at (i);
+ if (!pcl_isnan (p.x) && !pcl_isnan (p.y) && !pcl_isnan (p.z))
+ data.push_back (Eigen::Vector3d (p.x, p.y, p.z));
+ }
+}
+
+void
+visualizeCurve (ON_NurbsCurve &curve, ON_NurbsSurface &surface, pcl::visualization::PCLVisualizer &viewer)
+{
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
+
+ pcl::on_nurbs::Triangulation::convertCurve2PointCloud (curve, surface, curve_cloud, 4);
+ for (std::size_t i = 0; i < curve_cloud->size () - 1; i++)
+ {
+ pcl::PointXYZRGB &p1 = curve_cloud->at (i);
+ pcl::PointXYZRGB &p2 = curve_cloud->at (i + 1);
+ std::ostringstream os;
+ os << "line" << i;
+ viewer.removeShape (os.str ());
+ viewer.addLine<pcl::PointXYZRGB> (p1, p2, 1.0, 0.0, 0.0, os.str ());
+ }
+
+ pcl::PointCloud<pcl::PointXYZRGB>::Ptr curve_cps (new pcl::PointCloud<pcl::PointXYZRGB>);
+ for (int i = 0; i < curve.CVCount (); i++)
+ {
+ ON_3dPoint p1;
+ curve.GetCV (i, p1);
+
+ double pnt[3];
+ surface.Evaluate (p1.x, p1.y, 0, 3, pnt);
+ pcl::PointXYZRGB p2;
+ p2.x = float (pnt[0]);
+ p2.y = float (pnt[1]);
+ p2.z = float (pnt[2]);
+
+ p2.r = 255;
+ p2.g = 0;
+ p2.b = 0;
+
+ curve_cps->push_back (p2);
+ }
+ viewer.removePointCloud ("cloud_cps");
+ viewer.addPointCloud (curve_cps, "cloud_cps");
+}
--- /dev/null
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/surface/on_nurbs/fitting_surface_tdm.h>
+#include <pcl/surface/on_nurbs/fitting_curve_2d_asdm.h>
+#include <pcl/surface/on_nurbs/triangulation.h>
+
+typedef pcl::PointXYZ Point;
+
+int
+main (int argc, char *argv[])
+{
+ std::string file_3dm;
+
+ if (argc < 2)
+ {
+ printf ("\nUsage: pcl_example_nurbs_viewer_surface 3dm-out-file\n\n");
+ exit (0);
+ }
+ file_3dm = argv[1];
+
+ pcl::visualization::PCLVisualizer viewer ("B-spline surface viewer");
+ viewer.setSize (800, 600);
+
+ int mesh_resolution = 128;
+
+ ON::Begin();
+
+ // load surface
+ ONX_Model on_model;
+ bool rc = on_model.Read(file_3dm.c_str());
+
+ // print diagnostic
+ if ( rc )
+ std::cout << "Successfully read: " << file_3dm << std::endl;
+ else
+ std::cout << "Errors during reading: " << file_3dm << std::endl;
+
+// ON_TextLog out;
+// on_model.Dump(out);
+
+ if(on_model.m_object_table.Count()==0)
+ {
+ std::cout << "3dm file does not contain any objects: " << file_3dm << std::endl;
+ return -1;
+ }
+
+ const ON_Object* on_object = on_model.m_object_table[0].m_object;
+ if(on_object==NULL)
+ {
+ std::cout << "object[0] not valid." << std::endl;
+ return -1;
+ }
+
+ const ON_NurbsSurface& on_surf = *(ON_NurbsSurface*)on_object;
+
+ pcl::PolygonMesh mesh;
+ std::string mesh_id = "mesh_nurbs";
+ if(on_model.m_object_table.Count()==1)
+ {
+ std::cout << "3dm file does not contain a trimming curve: " << file_3dm << std::endl;
+
+
+ pcl::on_nurbs::Triangulation::convertSurface2PolygonMesh (on_surf, mesh, mesh_resolution);
+ }
+ else
+ {
+ on_object = on_model.m_object_table[1].m_object;
+ if(on_object==NULL)
+ {
+ std::cout << "object[1] not valid." << std::endl;
+ return -1;
+ }
+
+ const ON_NurbsCurve& on_curv = *(ON_NurbsCurve*)on_object;
+
+ pcl::on_nurbs::Triangulation::convertTrimmedSurface2PolygonMesh (on_surf, on_curv, mesh,
+ mesh_resolution);
+ }
+
+ viewer.addPolygonMesh (mesh, mesh_id);
+
+ viewer.spin ();
+ return 0;
+}
+
set(SUBSYS_DEPS common search kdtree octree filters)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/board.h
- include/pcl/${SUBSYS_NAME}/cvfh.h
- include/pcl/${SUBSYS_NAME}/our_cvfh.h
- include/pcl/${SUBSYS_NAME}/crh.h
- include/pcl/${SUBSYS_NAME}/don.h
- include/pcl/${SUBSYS_NAME}/feature.h
- include/pcl/${SUBSYS_NAME}/fpfh.h
- include/pcl/${SUBSYS_NAME}/fpfh_omp.h
- include/pcl/${SUBSYS_NAME}/gfpfh.h
- include/pcl/${SUBSYS_NAME}/integral_image2D.h
- include/pcl/${SUBSYS_NAME}/integral_image_normal.h
- include/pcl/${SUBSYS_NAME}/intensity_gradient.h
- include/pcl/${SUBSYS_NAME}/intensity_spin.h
- include/pcl/${SUBSYS_NAME}/linear_least_squares_normal.h
- include/pcl/${SUBSYS_NAME}/moment_invariants.h
- include/pcl/${SUBSYS_NAME}/multiscale_feature_persistence.h
- include/pcl/${SUBSYS_NAME}/narf.h
- include/pcl/${SUBSYS_NAME}/narf_descriptor.h
- include/pcl/${SUBSYS_NAME}/normal_3d.h
- include/pcl/${SUBSYS_NAME}/normal_3d_omp.h
- include/pcl/${SUBSYS_NAME}/normal_based_signature.h
- include/pcl/${SUBSYS_NAME}/pfh.h
- include/pcl/${SUBSYS_NAME}/pfh_tools.h
- include/pcl/${SUBSYS_NAME}/pfhrgb.h
- include/pcl/${SUBSYS_NAME}/ppf.h
- include/pcl/${SUBSYS_NAME}/ppfrgb.h
- include/pcl/${SUBSYS_NAME}/shot.h
- include/pcl/${SUBSYS_NAME}/shot_lrf.h
- include/pcl/${SUBSYS_NAME}/shot_lrf_omp.h
- include/pcl/${SUBSYS_NAME}/shot_omp.h
- include/pcl/${SUBSYS_NAME}/spin_image.h
- include/pcl/${SUBSYS_NAME}/principal_curvatures.h
- include/pcl/${SUBSYS_NAME}/rift.h
- #include/pcl/${SUBSYS_NAME}/rsd.h
- include/pcl/${SUBSYS_NAME}/statistical_multiscale_interest_region_extraction.h
- include/pcl/${SUBSYS_NAME}/vfh.h
- include/pcl/${SUBSYS_NAME}/esf.h
- include/pcl/${SUBSYS_NAME}/3dsc.h
- include/pcl/${SUBSYS_NAME}/usc.h
- include/pcl/${SUBSYS_NAME}/boundary.h
- include/pcl/${SUBSYS_NAME}/range_image_border_extractor.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/board.h"
+ "include/pcl/${SUBSYS_NAME}/cppf.h"
+ "include/pcl/${SUBSYS_NAME}/cvfh.h"
+ "include/pcl/${SUBSYS_NAME}/our_cvfh.h"
+ "include/pcl/${SUBSYS_NAME}/crh.h"
+ "include/pcl/${SUBSYS_NAME}/don.h"
+ "include/pcl/${SUBSYS_NAME}/feature.h"
+ "include/pcl/${SUBSYS_NAME}/fpfh.h"
+ "include/pcl/${SUBSYS_NAME}/fpfh_omp.h"
+ "include/pcl/${SUBSYS_NAME}/gfpfh.h"
+ "include/pcl/${SUBSYS_NAME}/integral_image2D.h"
+ "include/pcl/${SUBSYS_NAME}/integral_image_normal.h"
+ "include/pcl/${SUBSYS_NAME}/intensity_gradient.h"
+ "include/pcl/${SUBSYS_NAME}/intensity_spin.h"
+ "include/pcl/${SUBSYS_NAME}/linear_least_squares_normal.h"
+ "include/pcl/${SUBSYS_NAME}/moment_invariants.h"
+ "include/pcl/${SUBSYS_NAME}/moment_of_inertia_estimation.h"
+ "include/pcl/${SUBSYS_NAME}/multiscale_feature_persistence.h"
+ "include/pcl/${SUBSYS_NAME}/narf.h"
+ "include/pcl/${SUBSYS_NAME}/narf_descriptor.h"
+ "include/pcl/${SUBSYS_NAME}/normal_3d.h"
+ "include/pcl/${SUBSYS_NAME}/normal_3d_omp.h"
+ "include/pcl/${SUBSYS_NAME}/normal_based_signature.h"
+ "include/pcl/${SUBSYS_NAME}/pfh.h"
+ "include/pcl/${SUBSYS_NAME}/pfh_tools.h"
+ "include/pcl/${SUBSYS_NAME}/pfhrgb.h"
+ "include/pcl/${SUBSYS_NAME}/ppf.h"
+ "include/pcl/${SUBSYS_NAME}/ppfrgb.h"
+ "include/pcl/${SUBSYS_NAME}/shot.h"
+ "include/pcl/${SUBSYS_NAME}/shot_lrf.h"
+ "include/pcl/${SUBSYS_NAME}/shot_lrf_omp.h"
+ "include/pcl/${SUBSYS_NAME}/shot_omp.h"
+ "include/pcl/${SUBSYS_NAME}/spin_image.h"
+ "include/pcl/${SUBSYS_NAME}/principal_curvatures.h"
+ "include/pcl/${SUBSYS_NAME}/rift.h"
+ "include/pcl/${SUBSYS_NAME}/rops_estimation.h"
+ #"include/pcl/${SUBSYS_NAME}/rsd.h"
+ "include/pcl/${SUBSYS_NAME}/statistical_multiscale_interest_region_extraction.h"
+ "include/pcl/${SUBSYS_NAME}/vfh.h"
+ "include/pcl/${SUBSYS_NAME}/esf.h"
+ "include/pcl/${SUBSYS_NAME}/3dsc.h"
+ "include/pcl/${SUBSYS_NAME}/usc.h"
+ "include/pcl/${SUBSYS_NAME}/boundary.h"
+ "include/pcl/${SUBSYS_NAME}/range_image_border_extractor.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/board.hpp
- include/pcl/${SUBSYS_NAME}/impl/cvfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/our_cvfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/crh.hpp
- include/pcl/${SUBSYS_NAME}/impl/don.hpp
- include/pcl/${SUBSYS_NAME}/impl/feature.hpp
- include/pcl/${SUBSYS_NAME}/impl/fpfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/fpfh_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/gfpfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/integral_image2D.hpp
- include/pcl/${SUBSYS_NAME}/impl/integral_image_normal.hpp
- include/pcl/${SUBSYS_NAME}/impl/intensity_gradient.hpp
- include/pcl/${SUBSYS_NAME}/impl/intensity_spin.hpp
- include/pcl/${SUBSYS_NAME}/impl/linear_least_squares_normal.hpp
- include/pcl/${SUBSYS_NAME}/impl/moment_invariants.hpp
- include/pcl/${SUBSYS_NAME}/impl/multiscale_feature_persistence.hpp
- include/pcl/${SUBSYS_NAME}/impl/narf.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_3d.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_3d_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_based_signature.hpp
- include/pcl/${SUBSYS_NAME}/impl/pfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/pfhrgb.hpp
- include/pcl/${SUBSYS_NAME}/impl/ppf.hpp
- include/pcl/${SUBSYS_NAME}/impl/ppfrgb.hpp
- include/pcl/${SUBSYS_NAME}/impl/shot.hpp
- include/pcl/${SUBSYS_NAME}/impl/shot_lrf.hpp
- include/pcl/${SUBSYS_NAME}/impl/shot_lrf_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/shot_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/spin_image.hpp
- include/pcl/${SUBSYS_NAME}/impl/principal_curvatures.hpp
- include/pcl/${SUBSYS_NAME}/impl/rift.hpp
- #include/pcl/${SUBSYS_NAME}/impl/rsd.hpp
- include/pcl/${SUBSYS_NAME}/impl/statistical_multiscale_interest_region_extraction.hpp
- include/pcl/${SUBSYS_NAME}/impl/vfh.hpp
- include/pcl/${SUBSYS_NAME}/impl/esf.hpp
- include/pcl/${SUBSYS_NAME}/impl/3dsc.hpp
- include/pcl/${SUBSYS_NAME}/impl/usc.hpp
- include/pcl/${SUBSYS_NAME}/impl/boundary.hpp
- include/pcl/${SUBSYS_NAME}/impl/range_image_border_extractor.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/board.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/cppf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/cvfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/our_cvfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/crh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/don.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/feature.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/fpfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/fpfh_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/gfpfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/integral_image2D.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/integral_image_normal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/intensity_gradient.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/intensity_spin.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/linear_least_squares_normal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/moment_invariants.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/moment_of_inertia_estimation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/multiscale_feature_persistence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/narf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_3d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_3d_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_based_signature.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/pfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/pfhrgb.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ppf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ppfrgb.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/shot.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/shot_lrf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/shot_lrf_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/shot_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/spin_image.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/principal_curvatures.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/rift.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/rops_estimation.hpp"
+ #"include/pcl/${SUBSYS_NAME}/impl/rsd.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/statistical_multiscale_interest_region_extraction.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/vfh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/esf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/3dsc.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/usc.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/boundary.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/range_image_border_extractor.hpp"
)
set(srcs
src/board.cpp
src/boundary.cpp
+ src/cppf.cpp
src/cvfh.cpp
src/our_cvfh.cpp
src/crh.cpp
src/intensity_spin.cpp
src/linear_least_squares_normal.cpp
src/moment_invariants.cpp
+ src/moment_of_inertia_estimation.cpp
src/multiscale_feature_persistence.cpp
src/narf.cpp
src/normal_3d.cpp
src/spin_image.cpp
src/principal_curvatures.cpp
src/rift.cpp
+ src/rops_estimation.cpp
#src/rsd.cpp
src/statistical_multiscale_interest_region_extraction.cpp
src/vfh.cpp
src/usc.cpp
src/range_image_border_extractor.cpp
)
-
- set(LIB_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common pcl_search pcl_kdtree pcl_octree pcl_filters)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+
+ if(MSVC)
+ # Workaround to aviod hitting the MSVC 4GB linker memory limit when building pcl_features.
+ # Disable whole program optimization (/GL) and link-time code generation (/LTCG).
+ string(REPLACE "/GL" "" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
+ string(REPLACE "/LTCG" "" CMAKE_SHARED_LINKER_FLAGS_RELEASE ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})
+ endif(MSVC)
+
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_search pcl_kdtree pcl_octree pcl_filters)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install headers
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
underlying surface's estimated curvature and normal at a query point <b>p</b>.
Both of them are considered local features, as they characterize a point using
the information provided by its k closest point neighbors. For determining
-these neighbors efficienctly, the input dataset is usually split into smaller
+these neighbors efficiently, the input dataset is usually split into smaller
chunks using spatial decomposition techniques such as octrees or kD-trees (see
the figure below - left: kD-tree, right: octree), and then closest point
searches are performed in that space. Depending on the application one can opt
-for either determining a fixed number of k points in the vecinity of p, or all
+for either determining a fixed number of k points in the vicinity of p, or all
points which are found inside of a sphere of radius r centered at p.
Unarguably, one the easiest methods for estimating the surface normals and
curvature changes at a point p is to perform an eigendecomposition (i.e.
- \ref search "search"
- \ref kdtree "kdtree"
- \ref octree "octree"
- - \ref range_image "range_image"
+ - \ref pcl::RangeImage "range_image"
*/
/** \brief Boost-based random number generator distribution. */
boost::shared_ptr<boost::uniform_01<boost::mt19937> > rng_;
- /** \brief Shift computed descriptor "L" times along the azimuthal direction
- * \param[in] block_size the size of each azimuthal block
- * \param[in] desc at input desc == original descriptor and on output it contains
- * shifted descriptor resized descriptor_length_ * azimuth_bins_
- */
+ /* \brief Shift computed descriptor "L" times along the azimuthal direction
+ * \param[in] block_size the size of each azimuthal block
+ * \param[in] desc at input desc == original descriptor and on output it contains
+ * shifted descriptor resized descriptor_length_ * azimuth_bins_
+ */
//void
//shiftAlongAzimuth (size_t block_size, std::vector<float>& desc);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2011, Alexandru-Eugen Ichim
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2013, Martin Szarski
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_CPPF_H_
+#define PCL_CPPF_H_
+
+#include <pcl/features/feature.h>
+#include <pcl/features/boost.h>
+
+namespace pcl
+{
+ /** \brief
+ * \param[in] p1
+ * \param[in] n1
+ * \param[in] p2
+ * \param[in] n2
+ * \param[in] c1
+ * \param[in] c2
+ * \param[out] f1
+ * \param[out] f2
+ * \param[out] f3
+ * \param[out] f4
+ * \param[out] f5
+ * \param[out] f6
+ * \param[out] f7
+ * \param[out] f8
+ * \param[out] f9
+ * \param[out] f10
+ */
+ PCL_EXPORTS bool
+ computeCPPFPairFeature (const Eigen::Vector4f &p1, const Eigen::Vector4f &n1, const Eigen::Vector4i &c1,
+ const Eigen::Vector4f &p2, const Eigen::Vector4f &n2, const Eigen::Vector4i &c2,
+ float &f1, float &f2, float &f3, float &f4, float &f5, float &f6, float &f7, float &f8, float &f9, float &f10);
+
+
+
+ /** \brief Class that calculates the "surflet" features for each pair in the given
+ * pointcloud. Please refer to the following publication for more details:
+ * C. Choi, Henrik Christensen
+ * 3D Pose Estimation of Daily Objects Using an RGB-D Camera
+ * Proceedings of IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)
+ * 2012
+ *
+ * PointOutT is meant to be pcl::CPPFSignature - contains the 10 values of the Surflet
+ * feature and in addition, alpha_m for the respective pair - optimization proposed by
+ * the authors (see above)
+ *
+ * \author Martin Szarski, Alexandru-Eugen Ichim
+ */
+
+ template <typename PointInT, typename PointNT, typename PointOutT>
+ class CPPFEstimation : public FeatureFromNormals<PointInT, PointNT, PointOutT>
+ {
+ public:
+ typedef boost::shared_ptr<CPPFEstimation<PointInT, PointNT, PointOutT> > Ptr;
+ typedef boost::shared_ptr<const CPPFEstimation<PointInT, PointNT, PointOutT> > ConstPtr;
+ using PCLBase<PointInT>::indices_;
+ using Feature<PointInT, PointOutT>::input_;
+ using Feature<PointInT, PointOutT>::feature_name_;
+ using Feature<PointInT, PointOutT>::getClassName;
+ using FeatureFromNormals<PointInT, PointNT, PointOutT>::normals_;
+
+ typedef pcl::PointCloud<PointOutT> PointCloudOut;
+
+ /** \brief Empty Constructor. */
+ CPPFEstimation ();
+
+
+ private:
+ /** \brief The method called for actually doing the computations
+ * \param[out] output the resulting point cloud (which should be of type pcl::CPPFSignature);
+ * its size is the size of the input cloud, squared (i.e., one point for each pair in
+ * the input cloud);
+ */
+ void
+ computeFeature (PointCloudOut &output);
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/features/impl/cppf.hpp>
+#endif
+
+#endif // PCL_CPPF_H_
/** \brief Removes normals with high curvature caused by real edges or noisy data
* \param[in] cloud pointcloud to be filtered
+ * \param[in] indices_to_use the indices to use
* \param[out] indices_out the indices of the points with higher curvature than threshold
* \param[out] indices_in the indices of the remaining points after filtering
* \param[in] threshold threshold value for curvature
protected:
/** \brief Estimate the set of all SPFH (Simple Point Feature Histograms) signatures for the input cloud
- * \param[out] spfh_hist_lookup a lookup table for all the SPF feature indices
+ * \param[out] spf_hist_lookup a lookup table for all the SPF feature indices
* \param[out] hist_f1 the resultant SPFH histogram for feature f1
* \param[out] hist_f2 the resultant SPFH histogram for feature f2
* \param[out] hist_f3 the resultant SPFH histogram for feature f3
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2011, Alexandru-Eugen Ichim
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2013, Martin Szarski
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#ifndef PCL_FEATURES_IMPL_CPPF_H_
+#define PCL_FEATURES_IMPL_CPPF_H_
+
+#include <pcl/features/cppf.h>
+#include <pcl/features/pfh.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointNT, typename PointOutT>
+pcl::CPPFEstimation<PointInT, PointNT, PointOutT>::CPPFEstimation ()
+ : FeatureFromNormals <PointInT, PointNT, PointOutT> ()
+{
+ feature_name_ = "CPPFEstimation";
+ // Slight hack in order to pass the check for the presence of a search method in Feature::initCompute ()
+ Feature<PointInT, PointOutT>::tree_.reset (new pcl::search::KdTree <PointInT> ());
+ Feature<PointInT, PointOutT>::search_radius_ = 1.0f;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointNT, typename PointOutT> void
+pcl::CPPFEstimation<PointInT, PointNT, PointOutT>::computeFeature (PointCloudOut &output)
+{
+ // Initialize output container - overwrite the sizes done by Feature::initCompute ()
+ output.points.resize (indices_->size () * input_->points.size ());
+ output.height = 1;
+ output.width = static_cast<uint32_t> (output.points.size ());
+ output.is_dense = true;
+
+ // Compute point pair features for every pair of points in the cloud
+ for (size_t index_i = 0; index_i < indices_->size (); ++index_i)
+ {
+ size_t i = (*indices_)[index_i];
+ for (size_t j = 0 ; j < input_->points.size (); ++j)
+ {
+ PointOutT p;
+ if (i != j)
+ {
+ if (
+ pcl::computeCPPFPairFeature (input_->points[i].getVector4fMap (),
+ normals_->points[i].getNormalVector4fMap (),
+ input_->points[i].getRGBVector4i (),
+ input_->points[j].getVector4fMap (),
+ normals_->points[j].getNormalVector4fMap (),
+ input_->points[j].getRGBVector4i (),
+ p.f1, p.f2, p.f3, p.f4, p.f5, p.f6, p.f7, p.f8, p.f9, p.f10))
+ {
+ // Calculate alpha_m angle
+ Eigen::Vector3f model_reference_point = input_->points[i].getVector3fMap (),
+ model_reference_normal = normals_->points[i].getNormalVector3fMap (),
+ model_point = input_->points[j].getVector3fMap ();
+ Eigen::AngleAxisf rotation_mg (acosf (model_reference_normal.dot (Eigen::Vector3f::UnitX ())),
+ model_reference_normal.cross (Eigen::Vector3f::UnitX ()).normalized ());
+ Eigen::Affine3f transform_mg = Eigen::Translation3f ( rotation_mg * ((-1) * model_reference_point)) * rotation_mg;
+
+ Eigen::Vector3f model_point_transformed = transform_mg * model_point;
+ float angle = atan2f ( -model_point_transformed(2), model_point_transformed(1));
+ if (sin (angle) * model_point_transformed(2) < 0.0f)
+ angle *= (-1);
+ p.alpha_m = -angle;
+ }
+ else
+ {
+ PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %lu and %lu went wrong.\n", getClassName ().c_str (), i, j);
+ p.f1 = p.f2 = p.f3 = p.f4 = p.f5 = p.f6 = p.f7 = p.f8 = p.f9 = p.f10 = p.alpha_m = std::numeric_limits<float>::quiet_NaN ();
+ output.is_dense = false;
+ }
+ }
+ // Do not calculate the feature for identity pairs (i, i) as they are not used
+ // in the following computations
+ else
+ {
+ p.f1 = p.f2 = p.f3 = p.f4 = p.f5 = p.f6 = p.f7 = p.f8 = p.f9 = p.f10 = p.alpha_m = std::numeric_limits<float>::quiet_NaN ();
+ output.is_dense = false;
+ }
+
+ output.points[index_i*input_->points.size () + j] = p;
+ }
+ }
+}
+
+#define PCL_INSTANTIATE_CPPFEstimation(T,NT,OutT) template class PCL_EXPORTS pcl::CPPFEstimation<T,NT,OutT>;
+
+
+#endif // PCL_FEATURES_IMPL_CPPF_H_
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
if (cloud.points.size () != normals.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%zu) different than normals (%zu)!\n", cloud.points.size (), normals.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%lu) different than normals (%lu)!\n", cloud.points.size (), normals.points.size ());
return;
}
float h_a3_in[binsize] = {0};
float h_a3_out[binsize] = {0};
float h_a3_mix[binsize] = {0};
- float h_d1[binsize] = {0};
float h_d3_in[binsize] = {0};
float h_d3_out[binsize] = {0};
// Resize the output dataset
if (output.points.size () != indices_->size ())
output.points.resize (indices_->size ());
+
// Check if the output will be computed for all points or only a subset
- if (indices_->size () != input_->points.size ())
+ // If the input width or height are not set, set output width as size
+ if (indices_->size () != input_->points.size () || input_->width * input_->height == 0)
{
- output.width = static_cast<int> (indices_->size ());
+ output.width = static_cast<uint32_t> (indices_->size ());
output.height = 1;
}
else
current_row -= input_->width;
}
+ if (indices_->size () < input_->size ())
+ computeFeaturePart (distanceMap, bad_point, output);
+ else
+ computeFeatureFull (distanceMap, bad_point, output);
+
+ delete[] depthChangeMap;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::IntegralImageNormalEstimation<PointInT, PointOutT>::computeFeatureFull (const float *distanceMap,
+ const float &bad_point,
+ PointCloudOut &output)
+{
+ unsigned index = 0;
+
if (border_policy_ == BORDER_POLICY_IGNORE)
{
// Set all normals that we do not touch to NaN
}
}
}
+}
- delete[] depthChangeMap;
- //delete[] distanceMap;
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::IntegralImageNormalEstimation<PointInT, PointOutT>::computeFeaturePart (const float *distanceMap,
+ const float &bad_point,
+ PointCloudOut &output)
+{
+ if (border_policy_ == BORDER_POLICY_IGNORE)
+ {
+ output.is_dense = false;
+ unsigned border = int(normal_smoothing_size_);
+ unsigned bottom = input_->height > border ? input_->height - border : 0;
+ unsigned right = input_->width > border ? input_->width - border : 0;
+ if (use_depth_dependent_smoothing_)
+ {
+ // Iterating over the entire index vector
+ for (std::size_t idx = 0; idx < indices_->size (); ++idx)
+ {
+ unsigned pt_index = (*indices_)[idx];
+ unsigned u = pt_index % input_->width;
+ unsigned v = pt_index / input_->width;
+ if (v < border || v > bottom)
+ {
+ output.points[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output.points[idx].curvature = bad_point;
+ continue;
+ }
+
+ if (u < border || v > right)
+ {
+ output.points[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output.points[idx].curvature = bad_point;
+ continue;
+ }
+
+ const float depth = input_->points[pt_index].z;
+ if (!pcl_isfinite (depth))
+ {
+ output.points[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output.points[idx].curvature = bad_point;
+ continue;
+ }
+
+ float smoothing = (std::min)(distanceMap[pt_index], normal_smoothing_size_ + static_cast<float>(depth)/10.0f);
+ if (smoothing > 2.0f)
+ {
+ setRectSize (static_cast<int> (smoothing), static_cast<int> (smoothing));
+ computePointNormal (u, v, pt_index, output [idx]);
+ }
+ else
+ {
+ output[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output[idx].curvature = bad_point;
+ }
+ }
+ }
+ else
+ {
+ float smoothing_constant = normal_smoothing_size_;
+ // Iterating over the entire index vector
+ for (std::size_t idx = 0; idx < indices_->size (); ++idx)
+ {
+ unsigned pt_index = (*indices_)[idx];
+ unsigned u = pt_index % input_->width;
+ unsigned v = pt_index / input_->width;
+ if (v < border || v > bottom)
+ {
+ output.points[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output.points[idx].curvature = bad_point;
+ continue;
+ }
+
+ if (u < border || v > right)
+ {
+ output.points[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output.points[idx].curvature = bad_point;
+ continue;
+ }
+
+ if (!pcl_isfinite (input_->points[pt_index].z))
+ {
+ output [idx].getNormalVector3fMap ().setConstant (bad_point);
+ output [idx].curvature = bad_point;
+ continue;
+ }
+
+ float smoothing = (std::min)(distanceMap[pt_index], smoothing_constant);
+
+ if (smoothing > 2.0f)
+ {
+ setRectSize (static_cast<int> (smoothing), static_cast<int> (smoothing));
+ computePointNormal (u, v, pt_index, output [idx]);
+ }
+ else
+ {
+ output [pt_index].getNormalVector3fMap ().setConstant (bad_point);
+ output [pt_index].curvature = bad_point;
+ }
+ }
+ }
+ }// border_policy_ == BORDER_POLICY_IGNORE
+ else if (border_policy_ == BORDER_POLICY_MIRROR)
+ {
+ output.is_dense = false;
+
+ if (use_depth_dependent_smoothing_)
+ {
+ for (std::size_t idx = 0; idx < indices_->size (); ++idx)
+ {
+ unsigned pt_index = (*indices_)[idx];
+ unsigned u = pt_index % input_->width;
+ unsigned v = pt_index / input_->width;
+
+ const float depth = input_->points[pt_index].z;
+ if (!pcl_isfinite (depth))
+ {
+ output[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output[idx].curvature = bad_point;
+ continue;
+ }
+
+ float smoothing = (std::min)(distanceMap[pt_index], normal_smoothing_size_ + static_cast<float>(depth)/10.0f);
+
+ if (smoothing > 2.0f)
+ {
+ setRectSize (static_cast<int> (smoothing), static_cast<int> (smoothing));
+ computePointNormalMirror (u, v, pt_index, output [idx]);
+ }
+ else
+ {
+ output[idx].getNormalVector3fMap ().setConstant (bad_point);
+ output[idx].curvature = bad_point;
+ }
+ }
+ }
+ else
+ {
+ float smoothing_constant = normal_smoothing_size_;
+ for (size_t idx = 0; idx < indices_->size (); ++idx)
+ {
+ unsigned pt_index = (*indices_)[idx];
+ unsigned u = pt_index % input_->width;
+ unsigned v = pt_index / input_->width;
+
+ if (!pcl_isfinite (input_->points[pt_index].z))
+ {
+ output [idx].getNormalVector3fMap ().setConstant (bad_point);
+ output [idx].curvature = bad_point;
+ continue;
+ }
+
+ float smoothing = (std::min)(distanceMap[pt_index], smoothing_constant);
+
+ if (smoothing > 2.0f)
+ {
+ setRectSize (static_cast<int> (smoothing), static_cast<int> (smoothing));
+ computePointNormalMirror (u, v, pt_index, output [idx]);
+ }
+ else
+ {
+ output [idx].getNormalVector3fMap ().setConstant (bad_point);
+ output [idx].curvature = bad_point;
+ }
+ }
+ }
+ } // border_policy_ == BORDER_POLICY_MIRROR
}
//////////////////////////////////////////////////////////////////////////////////////////
// Find the min and max intensity values in the given neighborhood
float min_intensity = std::numeric_limits<float>::max ();
- float max_intensity = std::numeric_limits<float>::min ();
+ float max_intensity = -std::numeric_limits<float>::max ();
for (int idx = 0; idx < k; ++idx)
{
min_intensity = (std::min) (min_intensity, cloud.points[indices[idx]].intensity);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#ifndef PCL_MOMENT_OF_INERTIA_ESTIMATION_HPP_
+#define PCL_MOMENT_OF_INERTIA_ESTIMATION_HPP_
+
+#include <pcl/features/moment_of_inertia_estimation.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::MomentOfInertiaEstimation<PointT>::MomentOfInertiaEstimation () :
+ is_valid_ (false),
+ step_ (10.0f),
+ point_mass_ (0.0001f),
+ normalize_ (true),
+ mean_value_ (0.0f, 0.0f, 0.0f),
+ major_axis_ (0.0f, 0.0f, 0.0f),
+ middle_axis_ (0.0f, 0.0f, 0.0f),
+ minor_axis_ (0.0f, 0.0f, 0.0f),
+ major_value_ (0.0f),
+ middle_value_ (0.0f),
+ minor_value_ (0.0f),
+ moment_of_inertia_ (),
+ eccentricity_ (),
+ aabb_min_point_ (),
+ aabb_max_point_ (),
+ obb_min_point_ (),
+ obb_max_point_ (),
+ obb_position_ (0.0f, 0.0f, 0.0f),
+ obb_rotational_matrix_ ()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::MomentOfInertiaEstimation<PointT>::~MomentOfInertiaEstimation ()
+{
+ moment_of_inertia_.clear ();
+ eccentricity_.clear ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setAngleStep (const float step)
+{
+ if (step <= 0.0f)
+ return;
+
+ step_ = step;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> float
+pcl::MomentOfInertiaEstimation<PointT>::getAngleStep () const
+{
+ return (step_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setNormalizePointMassFlag (bool need_to_normalize)
+{
+ normalize_ = need_to_normalize;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getNormalizePointMassFlag () const
+{
+ return (normalize_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setPointMass (const float point_mass)
+{
+ if (point_mass <= 0.0f)
+ return;
+
+ point_mass_ = point_mass;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> float
+pcl::MomentOfInertiaEstimation<PointT>::getPointMass () const
+{
+ return (point_mass_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::compute ()
+{
+ moment_of_inertia_.clear ();
+ eccentricity_.clear ();
+
+ if (!initCompute ())
+ {
+ deinitCompute ();
+ return;
+ }
+
+ if (normalize_)
+ {
+ if (indices_->size () > 0)
+ point_mass_ = 1.0f / static_cast <float> (indices_->size () * indices_->size ());
+ else
+ point_mass_ = 1.0f;
+ }
+
+ computeMeanValue ();
+
+ Eigen::Matrix <float, 3, 3> covariance_matrix;
+ covariance_matrix.setZero ();
+ computeCovarianceMatrix (covariance_matrix);
+
+ computeEigenVectors (covariance_matrix, major_axis_, middle_axis_, minor_axis_, major_value_, middle_value_, minor_value_);
+
+ float theta = 0.0f;
+ while (theta <= 90.0f)
+ {
+ float phi = 0.0f;
+ Eigen::Vector3f rotated_vector;
+ rotateVector (major_axis_, middle_axis_, theta, rotated_vector);
+ while (phi <= 360.0f)
+ {
+ Eigen::Vector3f current_axis;
+ rotateVector (rotated_vector, minor_axis_, phi, current_axis);
+ current_axis.normalize ();
+
+ //compute moment of inertia for the current axis
+ float current_moment_of_inertia = calculateMomentOfInertia (current_axis, mean_value_);
+ moment_of_inertia_.push_back (current_moment_of_inertia);
+
+ //compute eccentricity for the current plane
+ typename pcl::PointCloud<PointT>::Ptr projected_cloud (new pcl::PointCloud<PointT> ());
+ getProjectedCloud (current_axis, mean_value_, projected_cloud);
+ Eigen::Matrix <float, 3, 3> covariance_matrix;
+ covariance_matrix.setZero ();
+ computeCovarianceMatrix (projected_cloud, covariance_matrix);
+ projected_cloud.reset ();
+ float current_eccentricity = computeEccentricity (covariance_matrix, current_axis);
+ eccentricity_.push_back (current_eccentricity);
+
+ phi += step_;
+ }
+ theta += step_;
+ }
+
+ computeOBB ();
+
+ is_valid_ = true;
+
+ deinitCompute ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getAABB (PointT& min_point, PointT& max_point) const
+{
+ min_point = aabb_min_point_;
+ max_point = aabb_max_point_;
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getOBB (PointT& min_point, PointT& max_point, PointT& position, Eigen::Matrix3f& rotational_matrix) const
+{
+ min_point = obb_min_point_;
+ max_point = obb_max_point_;
+ position.x = obb_position_ (0);
+ position.y = obb_position_ (1);
+ position.z = obb_position_ (2);
+ rotational_matrix = obb_rotational_matrix_;
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::computeOBB ()
+{
+ obb_min_point_.x = std::numeric_limits <float>::max ();
+ obb_min_point_.y = std::numeric_limits <float>::max ();
+ obb_min_point_.z = std::numeric_limits <float>::max ();
+
+ obb_max_point_.x = std::numeric_limits <float>::min ();
+ obb_max_point_.y = std::numeric_limits <float>::min ();
+ obb_max_point_.z = std::numeric_limits <float>::min ();
+
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ float x = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * major_axis_ (0) +
+ (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * major_axis_ (1) +
+ (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * major_axis_ (2);
+ float y = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * middle_axis_ (0) +
+ (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * middle_axis_ (1) +
+ (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * middle_axis_ (2);
+ float z = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * minor_axis_ (0) +
+ (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * minor_axis_ (1) +
+ (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * minor_axis_ (2);
+
+ if (x <= obb_min_point_.x) obb_min_point_.x = x;
+ if (y <= obb_min_point_.y) obb_min_point_.y = y;
+ if (z <= obb_min_point_.z) obb_min_point_.z = z;
+
+ if (x >= obb_max_point_.x) obb_max_point_.x = x;
+ if (y >= obb_max_point_.y) obb_max_point_.y = y;
+ if (z >= obb_max_point_.z) obb_max_point_.z = z;
+ }
+
+ obb_rotational_matrix_ << major_axis_ (0), middle_axis_ (0), minor_axis_ (0),
+ major_axis_ (1), middle_axis_ (1), minor_axis_ (1),
+ major_axis_ (2), middle_axis_ (2), minor_axis_ (2);
+
+ Eigen::Vector3f shift (
+ (obb_max_point_.x + obb_min_point_.x) / 2.0f,
+ (obb_max_point_.y + obb_min_point_.y) / 2.0f,
+ (obb_max_point_.z + obb_min_point_.z) / 2.0f);
+
+ obb_min_point_.x -= shift (0);
+ obb_min_point_.y -= shift (1);
+ obb_min_point_.z -= shift (2);
+
+ obb_max_point_.x -= shift (0);
+ obb_max_point_.y -= shift (1);
+ obb_max_point_.z -= shift (2);
+
+ obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getEigenValues (float& major, float& middle, float& minor) const
+{
+ major = major_value_;
+ middle = middle_value_;
+ minor = minor_value_;
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getEigenVectors (Eigen::Vector3f& major, Eigen::Vector3f& middle, Eigen::Vector3f& minor) const
+{
+ major = major_axis_;
+ middle = middle_axis_;
+ minor = minor_axis_;
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getMomentOfInertia (std::vector <float>& moment_of_inertia) const
+{
+ moment_of_inertia.resize (moment_of_inertia_.size (), 0.0f);
+ std::copy (moment_of_inertia_.begin (), moment_of_inertia_.end (), moment_of_inertia.begin ());
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getEccentricity (std::vector <float>& eccentricity) const
+{
+ eccentricity.resize (eccentricity_.size (), 0.0f);
+ std::copy (eccentricity_.begin (), eccentricity_.end (), eccentricity.begin ());
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::computeMeanValue ()
+{
+ mean_value_ (0) = 0.0f;
+ mean_value_ (1) = 0.0f;
+ mean_value_ (2) = 0.0f;
+
+ aabb_min_point_.x = std::numeric_limits <float>::max ();
+ aabb_min_point_.y = std::numeric_limits <float>::max ();
+ aabb_min_point_.z = std::numeric_limits <float>::max ();
+
+ aabb_max_point_.x = -std::numeric_limits <float>::max ();
+ aabb_max_point_.y = -std::numeric_limits <float>::max ();
+ aabb_max_point_.z = -std::numeric_limits <float>::max ();
+
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ mean_value_ (0) += input_->points[(*indices_)[i_point]].x;
+ mean_value_ (1) += input_->points[(*indices_)[i_point]].y;
+ mean_value_ (2) += input_->points[(*indices_)[i_point]].z;
+
+ if (input_->points[(*indices_)[i_point]].x <= aabb_min_point_.x) aabb_min_point_.x = input_->points[(*indices_)[i_point]].x;
+ if (input_->points[(*indices_)[i_point]].y <= aabb_min_point_.y) aabb_min_point_.y = input_->points[(*indices_)[i_point]].y;
+ if (input_->points[(*indices_)[i_point]].z <= aabb_min_point_.z) aabb_min_point_.z = input_->points[(*indices_)[i_point]].z;
+
+ if (input_->points[(*indices_)[i_point]].x >= aabb_max_point_.x) aabb_max_point_.x = input_->points[(*indices_)[i_point]].x;
+ if (input_->points[(*indices_)[i_point]].y >= aabb_max_point_.y) aabb_max_point_.y = input_->points[(*indices_)[i_point]].y;
+ if (input_->points[(*indices_)[i_point]].z >= aabb_max_point_.z) aabb_max_point_.z = input_->points[(*indices_)[i_point]].z;
+ }
+
+ if (number_of_points == 0)
+ number_of_points = 1;
+
+ mean_value_ (0) /= number_of_points;
+ mean_value_ (1) /= number_of_points;
+ mean_value_ (2) /= number_of_points;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::computeCovarianceMatrix (Eigen::Matrix <float, 3, 3>& covariance_matrix) const
+{
+ covariance_matrix.setZero ();
+
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ float factor = 1.0f / static_cast <float> ((number_of_points - 1 > 0)?(number_of_points - 1):1);
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ Eigen::Vector3f current_point (0.0f, 0.0f, 0.0f);
+ current_point (0) = input_->points[(*indices_)[i_point]].x - mean_value_ (0);
+ current_point (1) = input_->points[(*indices_)[i_point]].y - mean_value_ (1);
+ current_point (2) = input_->points[(*indices_)[i_point]].z - mean_value_ (2);
+
+ covariance_matrix += current_point * current_point.transpose ();
+ }
+
+ covariance_matrix *= factor;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::computeCovarianceMatrix (PointCloudConstPtr cloud, Eigen::Matrix <float, 3, 3>& covariance_matrix) const
+{
+ covariance_matrix.setZero ();
+
+ unsigned int number_of_points = static_cast <unsigned int> (cloud->points.size ());
+ float factor = 1.0f / static_cast <float> ((number_of_points - 1 > 0)?(number_of_points - 1):1);
+ Eigen::Vector3f current_point;
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ current_point (0) = cloud->points[i_point].x - mean_value_ (0);
+ current_point (1) = cloud->points[i_point].y - mean_value_ (1);
+ current_point (2) = cloud->points[i_point].z - mean_value_ (2);
+
+ covariance_matrix += current_point * current_point.transpose ();
+ }
+
+ covariance_matrix *= factor;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::computeEigenVectors (const Eigen::Matrix <float, 3, 3>& covariance_matrix,
+ Eigen::Vector3f& major_axis, Eigen::Vector3f& middle_axis, Eigen::Vector3f& minor_axis, float& major_value,
+ float& middle_value, float& minor_value)
+{
+ Eigen::EigenSolver <Eigen::Matrix <float, 3, 3> > eigen_solver;
+ eigen_solver.compute (covariance_matrix);
+
+ Eigen::EigenSolver <Eigen::Matrix <float, 3, 3> >::EigenvectorsType eigen_vectors;
+ Eigen::EigenSolver <Eigen::Matrix <float, 3, 3> >::EigenvalueType eigen_values;
+ eigen_vectors = eigen_solver.eigenvectors ();
+ eigen_values = eigen_solver.eigenvalues ();
+
+ unsigned int temp = 0;
+ unsigned int major_index = 0;
+ unsigned int middle_index = 1;
+ unsigned int minor_index = 2;
+
+ if (eigen_values.real () (major_index) < eigen_values.real () (middle_index))
+ {
+ temp = major_index;
+ major_index = middle_index;
+ middle_index = temp;
+ }
+
+ if (eigen_values.real () (major_index) < eigen_values.real () (minor_index))
+ {
+ temp = major_index;
+ major_index = minor_index;
+ minor_index = temp;
+ }
+
+ if (eigen_values.real () (middle_index) < eigen_values.real () (minor_index))
+ {
+ temp = minor_index;
+ minor_index = middle_index;
+ middle_index = temp;
+ }
+
+ major_value = eigen_values.real () (major_index);
+ middle_value = eigen_values.real () (middle_index);
+ minor_value = eigen_values.real () (minor_index);
+
+ major_axis = eigen_vectors.col (major_index).real ();
+ middle_axis = eigen_vectors.col (middle_index).real ();
+ minor_axis = eigen_vectors.col (minor_index).real ();
+
+ major_axis.normalize ();
+ middle_axis.normalize ();
+ minor_axis.normalize ();
+
+ float det = major_axis.dot (middle_axis.cross (minor_axis));
+ if (det <= 0.0f)
+ {
+ major_axis (0) = -major_axis (0);
+ major_axis (1) = -major_axis (1);
+ major_axis (2) = -major_axis (2);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::rotateVector (const Eigen::Vector3f& vector, const Eigen::Vector3f& axis, const float angle, Eigen::Vector3f& rotated_vector) const
+{
+ Eigen::Matrix <float, 3, 3> rotation_matrix;
+ const float x = axis (0);
+ const float y = axis (1);
+ const float z = axis (2);
+ const float rad = M_PI / 180.0f;
+ const float cosine = cos (angle * rad);
+ const float sine = sin (angle * rad);
+ rotation_matrix << cosine + (1 - cosine) * x * x, (1 - cosine) * x * y - sine * z, (1 - cosine) * x * z + sine * y,
+ (1 - cosine) * y * x + sine * z, cosine + (1 - cosine) * y * y, (1 - cosine) * y * z - sine * x,
+ (1 - cosine) * z * x - sine * y, (1 - cosine) * z * y + sine * x, cosine + (1 - cosine) * z * z;
+
+ rotated_vector = rotation_matrix * vector;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> float
+pcl::MomentOfInertiaEstimation<PointT>::calculateMomentOfInertia (const Eigen::Vector3f& current_axis, const Eigen::Vector3f& mean_value) const
+{
+ float moment_of_inertia = 0.0f;
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ Eigen::Vector3f vector;
+ vector (0) = mean_value (0) - input_->points[(*indices_)[i_point]].x;
+ vector (1) = mean_value (1) - input_->points[(*indices_)[i_point]].y;
+ vector (2) = mean_value (2) - input_->points[(*indices_)[i_point]].z;
+
+ Eigen::Vector3f product = vector.cross (current_axis);
+
+ float distance = product (0) * product (0) + product (1) * product (1) + product (2) * product (2);
+
+ moment_of_inertia += distance;
+ }
+
+ return (point_mass_ * moment_of_inertia);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::getProjectedCloud (const Eigen::Vector3f& normal_vector, const Eigen::Vector3f& point, typename pcl::PointCloud <PointT>::Ptr projected_cloud) const
+{
+ const float D = - normal_vector.dot (point);
+
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ projected_cloud->points.resize (number_of_points, PointT ());
+
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ const unsigned int index = (*indices_)[i_point];
+ float K = - (D + normal_vector (0) * input_->points[index].x + normal_vector (1) * input_->points[index].y + normal_vector (2) * input_->points[index].z);
+ PointT projected_point;
+ projected_point.x = input_->points[index].x + K * normal_vector (0);
+ projected_point.y = input_->points[index].y + K * normal_vector (1);
+ projected_point.z = input_->points[index].z + K * normal_vector (2);
+ projected_cloud->points[i_point] = projected_point;
+ }
+ projected_cloud->width = number_of_points;
+ projected_cloud->height = 1;
+ projected_cloud->header = input_->header;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> float
+pcl::MomentOfInertiaEstimation<PointT>::computeEccentricity (const Eigen::Matrix <float, 3, 3>& covariance_matrix, const Eigen::Vector3f& normal_vector)
+{
+ Eigen::Vector3f major_axis (0.0f, 0.0f, 0.0f);
+ Eigen::Vector3f middle_axis (0.0f, 0.0f, 0.0f);
+ Eigen::Vector3f minor_axis (0.0f, 0.0f, 0.0f);
+ float major_value = 0.0f;
+ float middle_value = 0.0f;
+ float minor_value = 0.0f;
+ computeEigenVectors (covariance_matrix, major_axis, middle_axis, minor_axis, major_value, middle_value, minor_value);
+
+ float major = abs (major_axis.dot (normal_vector));
+ float middle = abs (middle_axis.dot (normal_vector));
+ float minor = abs (minor_axis.dot (normal_vector));
+
+ float eccentricity = 0.0f;
+
+ if (major >= middle && major >= minor && middle_value != 0.0f)
+ eccentricity = pow (1.0f - (minor_value * minor_value) / (middle_value * middle_value), 0.5f);
+
+ if (middle >= major && middle >= minor && major_value != 0.0f)
+ eccentricity = pow (1.0f - (minor_value * minor_value) / (major_value * major_value), 0.5f);
+
+ if (minor >= major && minor >= middle && major_value != 0.0f)
+ eccentricity = pow (1.0f - (middle_value * middle_value) / (major_value * major_value), 0.5f);
+
+ return (eccentricity);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::MomentOfInertiaEstimation<PointT>::getMassCenter (Eigen::Vector3f& mass_center) const
+{
+ mass_center = mean_value_;
+
+ return (is_valid_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setInputCloud (const PointCloudConstPtr& cloud)
+{
+ input_ = cloud;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setIndices (const IndicesPtr& indices)
+{
+ indices_ = indices;
+ fake_indices_ = false;
+ use_indices_ = true;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setIndices (const IndicesConstPtr& indices)
+{
+ indices_.reset (new std::vector<int> (*indices));
+ fake_indices_ = false;
+ use_indices_ = true;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setIndices (const PointIndicesConstPtr& indices)
+{
+ indices_.reset (new std::vector<int> (indices->indices));
+ fake_indices_ = false;
+ use_indices_ = true;
+
+ is_valid_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::MomentOfInertiaEstimation<PointT>::setIndices (size_t row_start, size_t col_start, size_t nb_rows, size_t nb_cols)
+{
+ if ((nb_rows > input_->height) || (row_start > input_->height))
+ {
+ PCL_ERROR ("[PCLBase::setIndices] cloud is only %d height", input_->height);
+ return;
+ }
+
+ if ((nb_cols > input_->width) || (col_start > input_->width))
+ {
+ PCL_ERROR ("[PCLBase::setIndices] cloud is only %d width", input_->width);
+ return;
+ }
+
+ size_t row_end = row_start + nb_rows;
+ if (row_end > input_->height)
+ {
+ PCL_ERROR ("[PCLBase::setIndices] %d is out of rows range %d", row_end, input_->height);
+ return;
+ }
+
+ size_t col_end = col_start + nb_cols;
+ if (col_end > input_->width)
+ {
+ PCL_ERROR ("[PCLBase::setIndices] %d is out of columns range %d", col_end, input_->width);
+ return;
+ }
+
+ indices_.reset (new std::vector<int>);
+ indices_->reserve (nb_cols * nb_rows);
+ for(size_t i = row_start; i < row_end; i++)
+ for(size_t j = col_start; j < col_end; j++)
+ indices_->push_back (static_cast<int> ((i * input_->width) + j));
+ fake_indices_ = false;
+ use_indices_ = true;
+
+ is_valid_ = false;
+}
+
+#endif // PCL_MOMENT_OF_INERTIA_ESTIMATION_HPP_
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
if (cloud.points.size () != normals.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%zu) different than normals (%zu)!\n", cloud.points.size (), normals.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%lu) different than normals (%lu)!\n", cloud.points.size (), normals.points.size ());
return;
}
if ((min_axis / max_axis) > axis_ratio_)
{
- PCL_WARN("Both axis are equally easy/difficult to disambiguate\n");
+ PCL_WARN ("Both axes are equally easy/difficult to disambiguate\n");
Eigen::Vector3f evy_copy = evy;
Eigen::Vector3f evxminus = evx * -1;
std::vector<pcl::PointIndices> & cluster_indices)
{
PointCloudOut ourcvfh_output;
+
+ cluster_axes_.clear ();
+ cluster_axes_.resize (centroids_dominant_orientations_.size ());
+
for (size_t i = 0; i < centroids_dominant_orientations_.size (); i++)
{
PointInTPtr grid (new pcl::PointCloud<PointInT>);
sgurf (centroids_dominant_orientations_[i], dominant_normals_[i], processed, transformations, grid, cluster_indices[i]);
+ // Make a note of how many transformations correspond to each cluster
+ cluster_axes_[i] = transformations.size ();
+
for (size_t t = 0; t < transformations.size (); t++)
{
weights[ii] *= 0.5f - wz * 0.5f;
}
- int h_index = static_cast<int> (std::floor (size_hists * (d / distance_normalization_factor)));
+ int h_index = (d <= 0) ? 0 : std::ceil (size_hists * (d / distance_normalization_factor)) - 1;
for (int j = 0; j < num_hists; j++)
quadrants[j][h_index] += hist_incr * weights[j];
}
ourcvfh_output.points.push_back (vfh_signature.points[0]);
-
+ ourcvfh_output.width = ourcvfh_output.points.size ();
delete[] weights;
}
}
+ if (ourcvfh_output.points.size ())
+ {
+ ourcvfh_output.height = 1;
+ }
output = ourcvfh_output;
}
//remove last cluster if no points found...
if (clusters_[cluster_filtered_idx].indices.size () == 0)
{
- clusters_.erase (clusters_.end ());
- clusters_filtered.erase (clusters_filtered.end ());
+ clusters_.pop_back ();
+ clusters_filtered.pop_back ();
}
else
cluster_filtered_idx++;
Eigen::Vector3f model_reference_point = input_->points[i].getVector3fMap (),
model_reference_normal = normals_->points[i].getNormalVector3fMap (),
model_point = input_->points[j].getVector3fMap ();
- Eigen::AngleAxisf rotation_mg (acosf (model_reference_normal.dot (Eigen::Vector3f::UnitX ())),
- model_reference_normal.cross (Eigen::Vector3f::UnitX ()).normalized ());
- Eigen::Affine3f transform_mg = Eigen::Translation3f ( rotation_mg * ((-1) * model_reference_point)) * rotation_mg;
+ float rotation_angle = acosf (model_reference_normal.dot (Eigen::Vector3f::UnitX ()));
+ bool parallel_to_x = (model_reference_normal.y() == 0.0f && model_reference_normal.z() == 0.0f);
+ Eigen::Vector3f rotation_axis = (parallel_to_x)?(Eigen::Vector3f::UnitY ()):(model_reference_normal.cross (Eigen::Vector3f::UnitX ()). normalized());
+ Eigen::AngleAxisf rotation_mg (rotation_angle, rotation_axis);
+ Eigen::Affine3f transform_mg (Eigen::Translation3f ( rotation_mg * ((-1) * model_reference_point)) * rotation_mg);
Eigen::Vector3f model_point_transformed = transform_mg * model_point;
float angle = atan2f ( -model_point_transformed(2), model_point_transformed(1));
}
else
{
- PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %zu and %zu went wrong.\n", getClassName ().c_str (), i, j);
+ PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %u and %u went wrong.\n", getClassName ().c_str (), i, j);
p.f1 = p.f2 = p.f3 = p.f4 = p.alpha_m = std::numeric_limits<float>::quiet_NaN ();
output.is_dense = false;
}
}
else
{
- PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %zu and %zu went wrong.\n", getClassName ().c_str (), i, j);
+ PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %lu and %lu went wrong.\n", getClassName ().c_str (), i, j);
p.f1 = p.f2 = p.f3 = p.f4 = p.alpha_m = p.r_ratio = p.g_ratio = p.b_ratio = 0.f;
}
}
}
else
{
- PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %zu and %zu went wrong.\n", getClassName ().c_str (), i, j);
+ PCL_ERROR ("[pcl::%s::computeFeature] Computing pair feature vector between points %lu and %lu went wrong.\n", getClassName ().c_str (), i, j);
}
}
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#ifndef PCL_ROPS_ESTIMATION_HPP_
+#define PCL_ROPS_ESTIMATION_HPP_
+
+#include <pcl/features/rops_estimation.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT>
+pcl::ROPSEstimation <PointInT, PointOutT>::ROPSEstimation () :
+ number_of_bins_ (5),
+ number_of_rotations_ (3),
+ support_radius_ (1.0f),
+ sqr_support_radius_ (1.0f),
+ step_ (30.0f),
+ triangles_ (0),
+ triangles_of_the_point_ (0)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT>
+pcl::ROPSEstimation <PointInT, PointOutT>::~ROPSEstimation ()
+{
+ triangles_.clear ();
+ triangles_of_the_point_.clear ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::setNumberOfPartitionBins (unsigned int number_of_bins)
+{
+ if (number_of_bins != 0)
+ number_of_bins_ = number_of_bins;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> unsigned int
+pcl::ROPSEstimation <PointInT, PointOutT>::getNumberOfPartitionBins () const
+{
+ return (number_of_bins_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::setNumberOfRotations (unsigned int number_of_rotations)
+{
+ if (number_of_rotations != 0)
+ {
+ number_of_rotations_ = number_of_rotations;
+ step_ = 90.0f / static_cast <float> (number_of_rotations_ + 1);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> unsigned int
+pcl::ROPSEstimation <PointInT, PointOutT>::getNumberOfRotations () const
+{
+ return (number_of_rotations_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::setSupportRadius (float support_radius)
+{
+ if (support_radius > 0.0f)
+ {
+ support_radius_ = support_radius;
+ sqr_support_radius_ = support_radius * support_radius;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> float
+pcl::ROPSEstimation <PointInT, PointOutT>::getSupportRadius () const
+{
+ return (support_radius_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::setTriangles (const std::vector <pcl::Vertices>& triangles)
+{
+ triangles_ = triangles;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::getTriangles (std::vector <pcl::Vertices>& triangles) const
+{
+ triangles = triangles_;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::computeFeature (PointCloudOut &output)
+{
+ if (triangles_.size () == 0)
+ {
+ output.points.clear ();
+ return;
+ }
+
+ buildListOfPointsTriangles ();
+
+ //feature size = number_of_rotations * number_of_axis_to_rotate_around * number_of_projections * number_of_central_moments
+ unsigned int feature_size = number_of_rotations_ * 3 * 3 * 5;
+ unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
+ output.points.resize (number_of_points, PointOutT ());
+
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ std::set <unsigned int> local_triangles;
+ std::vector <int> local_points;
+ getLocalSurface (input_->points[(*indices_)[i_point]], local_triangles, local_points);
+
+ Eigen::Matrix3f lrf_matrix;
+ computeLRF (input_->points[(*indices_)[i_point]], local_triangles, lrf_matrix);
+
+ PointCloudIn transformed_cloud;
+ transformCloud (input_->points[(*indices_)[i_point]], lrf_matrix, local_points, transformed_cloud);
+
+ PointInT axis[3];
+ axis[0].x = 1.0f; axis[0].y = 0.0f; axis[0].z = 0.0f;
+ axis[1].x = 0.0f; axis[1].y = 1.0f; axis[1].z = 0.0f;
+ axis[2].x = 0.0f; axis[2].y = 0.0f; axis[2].z = 1.0f;
+ std::vector <float> feature;
+ for (unsigned int i_axis = 0; i_axis < 3; i_axis++)
+ {
+ float theta = step_;
+ do
+ {
+ //rotate local surface and get bounding box
+ PointCloudIn rotated_cloud;
+ Eigen::Vector3f min, max;
+ rotateCloud (axis[i_axis], theta, transformed_cloud, rotated_cloud, min, max);
+
+ //for each projection (XY, XZ and YZ) compute distribution matrix and central moments
+ for (unsigned int i_proj = 0; i_proj < 3; i_proj++)
+ {
+ Eigen::MatrixXf distribution_matrix;
+ distribution_matrix.resize (number_of_bins_, number_of_bins_);
+ getDistributionMatrix (i_proj, min, max, rotated_cloud, distribution_matrix);
+
+ std::vector <float> moments;
+ computeCentralMoments (distribution_matrix, moments);
+
+ feature.insert (feature.end (), moments.begin (), moments.end ());
+ }
+
+ theta += step_;
+ } while (theta < 90.0f);
+ }
+
+ float norm = 0.0f;
+ for (unsigned int i_dim = 0; i_dim < feature_size; i_dim++)
+ norm += feature[i_dim];
+ if (abs (norm) < std::numeric_limits <float>::epsilon ())
+ norm = 1.0f / norm;
+ else
+ norm = 1.0f;
+
+ for (unsigned int i_dim = 0; i_dim < feature_size; i_dim++)
+ output.points[i_point].histogram[i_dim] = feature[i_dim] * norm;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::buildListOfPointsTriangles ()
+{
+ triangles_of_the_point_.clear ();
+
+ const unsigned int number_of_triangles = static_cast <unsigned int> (triangles_.size ());
+
+ std::vector <unsigned int> dummy;
+ dummy.reserve (100);
+ triangles_of_the_point_.resize (surface_->points. size (), dummy);
+
+ for (unsigned int i_triangle = 0; i_triangle < number_of_triangles; i_triangle++)
+ for (unsigned int i_vertex = 0; i_vertex < 3; i_vertex++)
+ triangles_of_the_point_[triangles_[i_triangle].vertices[i_vertex]].push_back (i_triangle);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::getLocalSurface (const PointInT& point, std::set <unsigned int>& local_triangles, std::vector <int>& local_points) const
+{
+ std::vector <float> distances;
+ tree_->radiusSearch (point, support_radius_, local_points, distances);
+
+ const unsigned int number_of_indices = static_cast <unsigned int> (local_points.size ());
+ for (unsigned int i = 0; i < number_of_indices; i++)
+ local_triangles.insert (triangles_of_the_point_[local_points[i]].begin (), triangles_of_the_point_[local_points[i]].end ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::computeLRF (const PointInT& point, const std::set <unsigned int>& local_triangles, Eigen::Matrix3f& lrf_matrix) const
+{
+ const unsigned int number_of_triangles = static_cast <unsigned int> (local_triangles.size ());
+
+ std::vector <Eigen::Matrix3f> scatter_matrices (number_of_triangles);
+ std::vector <float> triangle_area (number_of_triangles);
+ std::vector <float> distance_weight (number_of_triangles);
+
+ float total_area = 0.0f;
+ const float coeff = 1.0f / 12.0f;
+ const float coeff_1_div_3 = 1.0f / 3.0f;
+
+ Eigen::Vector3f feature_point (point.x, point.y, point.z);
+
+ std::set <unsigned int>::const_iterator it;
+ unsigned int i_triangle = 0;
+ for (it = local_triangles.begin (), i_triangle = 0; it != local_triangles.end (); it++, i_triangle++)
+ {
+ Eigen::Vector3f pt[3];
+ for (unsigned int i_vertex = 0; i_vertex < 3; i_vertex++)
+ {
+ const unsigned int index = triangles_[*it].vertices[i_vertex];
+ pt[i_vertex] (0) = surface_->points[index].x;
+ pt[i_vertex] (1) = surface_->points[index].y;
+ pt[i_vertex] (2) = surface_->points[index].z;
+ }
+
+ const float curr_area = ((pt[1] - pt[0]).cross (pt[2] - pt[0])).norm ();
+ triangle_area[i_triangle] = curr_area;
+ total_area += curr_area;
+
+ distance_weight[i_triangle] = pow (support_radius_ - (feature_point - (pt[0] + pt[1] + pt[2]) * coeff_1_div_3).norm (), 2.0f);
+
+ Eigen::Matrix3f curr_scatter_matrix;
+ curr_scatter_matrix.setZero ();
+ for (unsigned int i_pt = 0; i_pt < 3; i_pt++)
+ {
+ Eigen::Vector3f vec = pt[i_pt] - feature_point;
+ curr_scatter_matrix += vec * (vec.transpose ());
+ for (unsigned int j_pt = 0; j_pt < 3; j_pt++)
+ curr_scatter_matrix += vec * ((pt[j_pt] - feature_point).transpose ());
+ }
+ scatter_matrices[i_triangle] = coeff * curr_scatter_matrix;
+ }
+
+ if (abs (total_area) < std::numeric_limits <float>::epsilon ())
+ total_area = 1.0f / total_area;
+ else
+ total_area = 1.0f;
+
+ Eigen::Matrix3f overall_scatter_matrix;
+ overall_scatter_matrix.setZero ();
+ std::vector<float> total_weight (number_of_triangles);
+ const float denominator = 1.0f / 6.0f;
+ for (unsigned int i_triangle = 0; i_triangle < number_of_triangles; i_triangle++)
+ {
+ float factor = distance_weight[i_triangle] * triangle_area[i_triangle] * total_area;
+ overall_scatter_matrix += factor * scatter_matrices[i_triangle];
+ total_weight[i_triangle] = factor * denominator;
+ }
+
+ Eigen::Vector3f v1, v2, v3;
+ computeEigenVectors (overall_scatter_matrix, v1, v2, v3);
+
+ float h1 = 0.0f;
+ float h3 = 0.0f;
+ for (it = local_triangles.begin (), i_triangle = 0; it != local_triangles.end (); it++, i_triangle++)
+ {
+ Eigen::Vector3f pt[3];
+ for (unsigned int i_vertex = 0; i_vertex < 3; i_vertex++)
+ {
+ const unsigned int index = triangles_[*it].vertices[i_vertex];
+ pt[i_vertex] (0) = surface_->points[index].x;
+ pt[i_vertex] (1) = surface_->points[index].y;
+ pt[i_vertex] (2) = surface_->points[index].z;
+ }
+
+ float factor1 = 0.0f;
+ float factor3 = 0.0f;
+ for (unsigned int i_pt = 0; i_pt < 3; i_pt++)
+ {
+ Eigen::Vector3f vec = pt[i_pt] - feature_point;
+ factor1 += vec.dot (v1);
+ factor3 += vec.dot (v3);
+ }
+ h1 += total_weight[i_triangle] * factor1;
+ h3 += total_weight[i_triangle] * factor3;
+ }
+
+ if (h1 < 0.0f) v1 = -v1;
+ if (h3 < 0.0f) v3 = -v3;
+
+ v2 = v3.cross (v1);
+
+ lrf_matrix.row (0) = v1;
+ lrf_matrix.row (1) = v2;
+ lrf_matrix.row (2) = v3;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::computeEigenVectors (const Eigen::Matrix3f& matrix,
+ Eigen::Vector3f& major_axis, Eigen::Vector3f& middle_axis, Eigen::Vector3f& minor_axis) const
+{
+ Eigen::EigenSolver <Eigen::Matrix3f> eigen_solver;
+ eigen_solver.compute (matrix);
+
+ Eigen::EigenSolver <Eigen::Matrix3f>::EigenvectorsType eigen_vectors;
+ Eigen::EigenSolver <Eigen::Matrix3f>::EigenvalueType eigen_values;
+ eigen_vectors = eigen_solver.eigenvectors ();
+ eigen_values = eigen_solver.eigenvalues ();
+
+ unsigned int temp = 0;
+ unsigned int major_index = 0;
+ unsigned int middle_index = 1;
+ unsigned int minor_index = 2;
+
+ if (eigen_values.real () (major_index) < eigen_values.real () (middle_index))
+ {
+ temp = major_index;
+ major_index = middle_index;
+ middle_index = temp;
+ }
+
+ if (eigen_values.real () (major_index) < eigen_values.real () (minor_index))
+ {
+ temp = major_index;
+ major_index = minor_index;
+ minor_index = temp;
+ }
+
+ if (eigen_values.real () (middle_index) < eigen_values.real () (minor_index))
+ {
+ temp = minor_index;
+ minor_index = middle_index;
+ middle_index = temp;
+ }
+
+ major_axis = eigen_vectors.col (major_index).real ();
+ middle_axis = eigen_vectors.col (middle_index).real ();
+ minor_axis = eigen_vectors.col (minor_index).real ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::transformCloud (const PointInT& point, const Eigen::Matrix3f& matrix, const std::vector <int>& local_points, PointCloudIn& transformed_cloud) const
+{
+ const unsigned int number_of_points = static_cast <unsigned int> (local_points.size ());
+ transformed_cloud.points.resize (number_of_points, PointInT ());
+
+ for (unsigned int i = 0; i < number_of_points; i++)
+ {
+ Eigen::Vector3f transformed_point (
+ surface_->points[local_points[i]].x - point.x,
+ surface_->points[local_points[i]].y - point.y,
+ surface_->points[local_points[i]].z - point.z);
+
+ transformed_point = matrix * transformed_point;
+
+ PointInT new_point;
+ new_point.x = transformed_point (0);
+ new_point.y = transformed_point (1);
+ new_point.z = transformed_point (2);
+ transformed_cloud.points[i] = new_point;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::rotateCloud (const PointInT& axis, const float angle, const PointCloudIn& cloud, PointCloudIn& rotated_cloud, Eigen::Vector3f& min, Eigen::Vector3f& max) const
+{
+ Eigen::Matrix3f rotation_matrix;
+ const float x = axis.x;
+ const float y = axis.y;
+ const float z = axis.z;
+ const float rad = M_PI / 180.0f;
+ const float cosine = cos (angle * rad);
+ const float sine = sin (angle * rad);
+ rotation_matrix << cosine + (1 - cosine) * x * x, (1 - cosine) * x * y - sine * z, (1 - cosine) * x * z + sine * y,
+ (1 - cosine) * y * x + sine * z, cosine + (1 - cosine) * y * y, (1 - cosine) * y * z - sine * x,
+ (1 - cosine) * z * x - sine * y, (1 - cosine) * z * y + sine * x, cosine + (1 - cosine) * z * z;
+
+ const unsigned int number_of_points = static_cast <unsigned int> (cloud.points.size ());
+
+ rotated_cloud.header = cloud.header;
+ rotated_cloud.width = number_of_points;
+ rotated_cloud.height = 1;
+ rotated_cloud.points.resize (number_of_points, PointInT ());
+
+ min (0) = std::numeric_limits <float>::max ();
+ min (1) = std::numeric_limits <float>::max ();
+ min (2) = std::numeric_limits <float>::max ();
+ max (0) = -std::numeric_limits <float>::max ();
+ max (1) = -std::numeric_limits <float>::max ();
+ max (2) = -std::numeric_limits <float>::max ();
+
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ Eigen::Vector3f point (
+ cloud.points[i_point].x,
+ cloud.points[i_point].y,
+ cloud.points[i_point].z);
+
+ point = rotation_matrix * point;
+ PointInT rotated_point;
+ rotated_point.x = point (0);
+ rotated_point.y = point (1);
+ rotated_point.z = point (2);
+ rotated_cloud.points[i_point] = rotated_point;
+
+ if (min (0) > rotated_point.x) min (0) = rotated_point.x;
+ if (min (1) > rotated_point.y) min (1) = rotated_point.y;
+ if (min (2) > rotated_point.z) min (2) = rotated_point.z;
+
+ if (max (0) < rotated_point.x) max (0) = rotated_point.x;
+ if (max (1) < rotated_point.y) max (1) = rotated_point.y;
+ if (max (2) < rotated_point.z) max (2) = rotated_point.z;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::getDistributionMatrix (const unsigned int projection, const Eigen::Vector3f& min, const Eigen::Vector3f& max, const PointCloudIn& cloud, Eigen::MatrixXf& matrix) const
+{
+ matrix.setZero ();
+
+ const unsigned int number_of_points = static_cast <unsigned int> (cloud.points.size ());
+
+ const unsigned int coord[3][2] = {
+ {0, 1},
+ {0, 2},
+ {1, 2}};
+
+ const float u_bin_length = (max (coord[projection][0]) - min (coord[projection][0])) / number_of_bins_;
+ const float v_bin_length = (max (coord[projection][1]) - min (coord[projection][1])) / number_of_bins_;
+
+ for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
+ {
+ Eigen::Vector3f point (
+ cloud.points[i_point].x,
+ cloud.points[i_point].y,
+ cloud.points[i_point].z);
+
+ const float u_length = point (coord[projection][0]) - min[coord[projection][0]];
+ const float v_length = point (coord[projection][1]) - min[coord[projection][1]];
+
+ const float u_ratio = u_length / u_bin_length;
+ unsigned int row = static_cast <unsigned int> (u_ratio);
+ if (row == number_of_bins_) row--;
+
+ const float v_ratio = v_length / v_bin_length;
+ unsigned int col = static_cast <unsigned int> (v_ratio);
+ if (col == number_of_bins_) col--;
+
+ matrix (row, col) += 1.0f;
+ }
+
+ matrix /= static_cast <float> (number_of_points);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT> void
+pcl::ROPSEstimation <PointInT, PointOutT>::computeCentralMoments (const Eigen::MatrixXf& matrix, std::vector <float>& moments) const
+{
+ float mean_i = 0.0f;
+ float mean_j = 0.0f;
+
+ for (unsigned int i = 0; i < number_of_bins_; i++)
+ for (unsigned int j = 0; j < number_of_bins_; j++)
+ {
+ const float m = matrix (i, j);
+ mean_i += static_cast <float> (i + 1) * m;
+ mean_j += static_cast <float> (j + 1) * m;
+ }
+
+ const unsigned int number_of_moments_to_compute = 4;
+ const float power[number_of_moments_to_compute][2] = {
+ {1.0f, 1.0f},
+ {2.0f, 1.0f},
+ {1.0f, 2.0f},
+ {2.0f, 2.0f}};
+
+ float entropy = 0.0f;
+ moments.resize (number_of_moments_to_compute + 1, 0.0f);
+ for (unsigned int i = 0; i < number_of_bins_; i++)
+ {
+ const float i_factor = static_cast <float> (i + 1) - mean_i;
+ for (unsigned int j = 0; j < number_of_bins_; j++)
+ {
+ const float j_factor = static_cast <float> (j + 1) - mean_j;
+ const float m = matrix (i, j);
+ if (m > 0.0f)
+ entropy -= m * log (m);
+ for (unsigned int i_moment = 0; i_moment < number_of_moments_to_compute; i_moment++)
+ moments[i_moment] += pow (i_factor, power[i_moment][0]) * pow (j_factor, power[i_moment][1]) * m;
+ }
+ }
+
+ moments[number_of_moments_to_compute] = entropy;
+}
+
+#endif // PCL_ROPS_ESTIMATION_HPP_
}
}
+#define PCL_INSTANTIATE_SHOTEstimationBase(T,NT,OutT,RFT) template class PCL_EXPORTS pcl::SHOTEstimationBase<T,NT,OutT,RFT>;
#define PCL_INSTANTIATE_SHOTEstimation(T,NT,OutT,RFT) template class PCL_EXPORTS pcl::SHOTEstimation<T,NT,OutT,RFT>;
#define PCL_INSTANTIATE_SHOTColorEstimation(T,NT,OutT,RFT) template class PCL_EXPORTS pcl::SHOTColorEstimation<T,NT,OutT,RFT>;
namespace pcl
{
/** \brief Surface normal estimation on organized data using integral images.
+ *
+ * For detailed information about this method see:
+ *
+ * S. Holzer and R. B. Rusu and M. Dixon and S. Gedikli and N. Navab,
+ * Adaptive Neighborhood Selection for Real-Time Surface Normal Estimation
+ * from Organized Point Cloud Data Using Integral Images, IROS 2012.
+ *
+ * D. Holz, S. Holzer, R. B. Rusu, and S. Behnke (2011, July).
+ * Real-Time Plane Segmentation using RGB-D Cameras. In Proceedings of
+ * the 15th RoboCup International Symposium, Istanbul, Turkey.
+ * http://www.ais.uni-bonn.de/~holz/papers/holz_2011_robocup.pdf
+ *
* \author Stefan Holzer
*/
template <typename PointInT, typename PointOutT>
using Feature<PointInT, PointOutT>::feature_name_;
using Feature<PointInT, PointOutT>::tree_;
using Feature<PointInT, PointOutT>::k_;
+ using Feature<PointInT, PointOutT>::indices_;
public:
typedef boost::shared_ptr<IntegralImageNormalEstimation<PointInT, PointOutT> > Ptr;
protected:
- /** \brief Computes the normal for the complete cloud.
+ /** \brief Computes the normal for the complete cloud or only \a indices_ if provided.
* \param[out] output the resultant normals
*/
void
computeFeature (PointCloudOut &output);
+ /** \brief Computes the normal for the complete cloud.
+ * \param[in] distance_map distance map
+ * \param[in] bad_point constant given to invalid normal components
+ * \param[out] output the resultant normals
+ */
+ void
+ computeFeatureFull (const float* distance_map, const float& bad_point, PointCloudOut& output);
+
+ /** \brief Computes the normal for part of the cloud specified by \a indices_
+ * \param[in] distance_map distance map
+ * \param[in] bad_point constant given to invalid normal components
+ * \param[out] output the resultant normals
+ */
+ void
+ computeFeaturePart (const float* distance_map, const float& bad_point, PointCloudOut& output);
+
/** \brief Initialize the data structures, based on the normal estimation method chosen. */
void
initData ();
* \param cloud a point cloud dataset containing XYZI coordinates (Cartesian coordinates + intensity)
* \param indices the indices of the neighoring points in the dataset
* \param point the 3D Cartesian coordinates of the point at which to estimate the gradient
+ * \param mean_intensity
* \param normal the 3D surface normal of the given point
* \param gradient the resultant 3D gradient vector
*/
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#ifndef PCL_MOMENT_OF_INERTIA_ESIMATION_H_
+#define PCL_MOMENT_OF_INERTIA_ESIMATION_H_
+
+#include <vector>
+#include <math.h>
+#include <pcl/features/feature.h>
+#include <pcl/PointIndices.h>
+
+namespace pcl
+{
+ /** \brief
+ * Implements the method for extracting features based on moment of inertia. It also
+ * calculates AABB, OBB and eccentricity of the projected cloud.
+ */
+ template <typename PointT>
+ class PCL_EXPORTS MomentOfInertiaEstimation : public pcl::PCLBase <PointT>
+ {
+ public:
+
+ using PCLBase <PointT>::input_;
+ using PCLBase <PointT>::indices_;
+ using PCLBase <PointT>::fake_indices_;
+ using PCLBase <PointT>::use_indices_;
+ using PCLBase <PointT>::initCompute;
+ using PCLBase <PointT>::deinitCompute;
+
+ typedef typename pcl::PCLBase <PointT>::PointCloudConstPtr PointCloudConstPtr;
+ typedef typename pcl::PCLBase <PointT>::PointIndicesConstPtr PointIndicesConstPtr;
+
+ public:
+
+ /** \brief Provide a pointer to the input dataset
+ * \param[in] cloud the const boost shared pointer to a PointCloud message
+ */
+ virtual void
+ setInputCloud (const PointCloudConstPtr& cloud);
+
+ /** \brief Provide a pointer to the vector of indices that represents the input data.
+ * \param[in] indices a pointer to the vector of indices that represents the input data.
+ */
+ virtual void
+ setIndices (const IndicesPtr& indices);
+
+ /** \brief Provide a pointer to the vector of indices that represents the input data.
+ * \param[in] indices a pointer to the vector of indices that represents the input data.
+ */
+ virtual void
+ setIndices (const IndicesConstPtr& indices);
+
+ /** \brief Provide a pointer to the vector of indices that represents the input data.
+ * \param[in] indices a pointer to the vector of indices that represents the input data.
+ */
+ virtual void
+ setIndices (const PointIndicesConstPtr& indices);
+
+ /** \brief Set the indices for the points laying within an interest region of
+ * the point cloud.
+ * \note you shouldn't call this method on unorganized point clouds!
+ * \param[in] row_start the offset on rows
+ * \param[in] col_start the offset on columns
+ * \param[in] nb_rows the number of rows to be considered row_start included
+ * \param[in] nb_cols the number of columns to be considered col_start included
+ */
+ virtual void
+ setIndices (size_t row_start, size_t col_start, size_t nb_rows, size_t nb_cols);
+
+ /** \brief Constructor that sets default values for member variables. */
+ MomentOfInertiaEstimation ();
+
+ /** \brief Virtual destructor which frees the memory. */
+ virtual
+ ~MomentOfInertiaEstimation ();
+
+ /** \brief This method allows to set the angle step. It is used for the rotation
+ * of the axis which is used for moment of inertia/eccentricity calculation.
+ * \param[in] step angle step
+ */
+ void
+ setAngleStep (const float step);
+
+ /** \brief Returns the angle step. */
+ float
+ getAngleStep () const;
+
+ /** \brief This method allows to set the normalize_ flag. If set to false, then
+ * point_mass_ will be used to scale the moment of inertia values. Otherwise,
+ * point_mass_ will be set to 1 / number_of_points. Default value is true.
+ * \param[in] need_to_normalize desired value
+ */
+ void
+ setNormalizePointMassFlag (bool need_to_normalize);
+
+ /** \brief Returns the normalize_ flag. */
+ bool
+ getNormalizePointMassFlag () const;
+
+ /** \brief This method allows to set point mass that will be used for
+ * moment of inertia calculation. It is needed to scale moment of inertia values.
+ * default value is 0.0001.
+ * \param[in] point_mass point mass
+ */
+ void
+ setPointMass (const float point_mass);
+
+ /** \brief Returns the mass of point. */
+ float
+ getPointMass () const;
+
+ /** \brief This method launches the computation of all features. After execution
+ * it sets is_valid_ flag to true and each feature can be accessed with the
+ * corresponding get method.
+ */
+ void
+ compute ();
+
+ /** \brief This method gives access to the computed axis aligned bounding box. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * \param[out] min_point min point of the AABB
+ * \param[out] max_point max point of the AABB
+ */
+ bool
+ getAABB (PointT& min_point, PointT& max_point) const;
+
+ /** \brief This method gives access to the computed oriented bounding box. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * Note that in order to get the OBB, each vertex of the given AABB (specified with min_point and max_point)
+ * must be rotated with the given rotational matrix (rotation transform) and then positioned.
+ * Also pay attention to the fact that this is not the minimal possible bounding box. This is the bounding box
+ * which is oriented in accordance with the eigen vectors.
+ * \param[out] min_point min point of the OBB
+ * \param[out] max_point max point of the OBB
+ * \param[out] position position of the OBB
+ * \param[out] rotational_matrix this matrix represents the rotation transform
+ */
+ bool
+ getOBB (PointT& min_point, PointT& max_point, PointT& position, Eigen::Matrix3f& rotational_matrix) const;
+
+ /** \brief This method gives access to the computed eigen values. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * \param[out] major major eigen value
+ * \param[out] middle middle eigen value
+ * \param[out] minor minor eigen value
+ */
+ bool
+ getEigenValues (float& major, float& middle, float& minor) const;
+
+ /** \brief This method gives access to the computed eigen vectors. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * \param[out] major axis which corresponds to the eigen vector with the major eigen value
+ * \param[out] middle axis which corresponds to the eigen vector with the middle eigen value
+ * \param[out] minor axis which corresponds to the eigen vector with the minor eigen value
+ */
+ bool
+ getEigenVectors (Eigen::Vector3f& major, Eigen::Vector3f& middle, Eigen::Vector3f& minor) const;
+
+ /** \brief This method gives access to the computed moments of inertia. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * \param[out] moment_of_inertia computed moments of inertia
+ */
+ bool
+ getMomentOfInertia (std::vector <float>& moment_of_inertia) const;
+
+ /** \brief This method gives access to the computed ecentricities. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * \param[out] eccentricity computed eccentricities
+ */
+ bool
+ getEccentricity (std::vector <float>& eccentricity) const;
+
+ /** \brief This method gives access to the computed mass center. It returns true
+ * if the current values (eccentricity, moment of inertia etc) are valid and false otherwise.
+ * Note that when mass center of a cloud is computed, mass point is always considered equal 1.
+ * \param[out] mass_center computed mass center
+ */
+ bool
+ getMassCenter (Eigen::Vector3f& mass_center) const;
+
+ private:
+
+ /** \brief This method rotates the given vector around the given axis.
+ * \param[in] vector vector that must be rotated
+ * \param[in] axis axis around which vector must be rotated
+ * \param[in] angle angle in degrees
+ * \param[out] rotated_vector resultant vector
+ */
+ void
+ rotateVector (const Eigen::Vector3f& vector, const Eigen::Vector3f& axis, const float angle, Eigen::Vector3f& rotated_vector) const;
+
+ /** \brief This method computes center of mass and axis aligned bounding box. */
+ void
+ computeMeanValue ();
+
+ /** \brief This method computes the oriented bounding box. */
+ void
+ computeOBB ();
+
+ /** \brief This method computes the covariance matrix for the input_ cloud.
+ * \param[out] covariance_matrix stores the computed covariance matrix
+ */
+ void
+ computeCovarianceMatrix (Eigen::Matrix <float, 3, 3>& covariance_matrix) const;
+
+ /** \brief This method computes the covariance matrix for the given cloud.
+ * It uses all points in the cloud, unlike the previous method that uses indices.
+ * \param[in] cloud cloud for which covariance matrix will be computed
+ * \param[out] covariance_matrix stores the computed covariance matrix
+ */
+ void
+ computeCovarianceMatrix (PointCloudConstPtr cloud, Eigen::Matrix <float, 3, 3>& covariance_matrix) const;
+
+ /** \brief This method calculates the eigen values and eigen vectors
+ * for the given covariance matrix. Note that it returns normalized eigen
+ * vectors that always form the right-handed coordinate system.
+ * \param[in] covariance_matrix covariance matrix
+ * \param[out] major_axis eigen vector which corresponds to a major eigen value
+ * \param[out] middle_axis eigen vector which corresponds to a middle eigen value
+ * \param[out] minor_axis eigen vector which corresponds to a minor eigen value
+ * \param[out] major_value major eigen value
+ * \param[out] middle_value middle eigen value
+ * \param[out] minor_value minor eigen value
+ */
+ void
+ computeEigenVectors (const Eigen::Matrix <float, 3, 3>& covariance_matrix, Eigen::Vector3f& major_axis,
+ Eigen::Vector3f& middle_axis, Eigen::Vector3f& minor_axis, float& major_value, float& middle_value,
+ float& minor_value);
+
+ /** \brief This method returns the moment of inertia of a given input_ cloud.
+ * Note that when moment of inertia is computed it is multiplied by the point mass.
+ * Point mass can be accessed with the corresponding get/set methods.
+ * \param[in] current_axis axis that will be used in moment of inertia computation
+ * \param[in] mean_value mean value(center of mass) of the cloud
+ */
+ float
+ calculateMomentOfInertia (const Eigen::Vector3f& current_axis, const Eigen::Vector3f& mean_value) const;
+
+ /** \brief This method simply projects the given input_ cloud on the plane specified with
+ * the normal vector.
+ * \param[in] normal_vector nrmal vector of the plane
+ * \param[in] point point belonging to the plane
+ * \param[out] projected_cloud projected cloud
+ */
+ void
+ getProjectedCloud (const Eigen::Vector3f& normal_vector, const Eigen::Vector3f& point, typename pcl::PointCloud <PointT>::Ptr projected_cloud) const;
+
+ /** \brief This method returns the eccentricity of the projected cloud.
+ * \param[in] covariance_matrix covariance matrix of the projected cloud
+ * \param[in] normal_vector normal vector of the plane, it is used to discard the
+ * third eigen vector and eigen value*/
+ float
+ computeEccentricity (const Eigen::Matrix <float, 3, 3>& covariance_matrix, const Eigen::Vector3f& normal_vector);
+
+ private:
+
+ /** \brief Indicates if the stored values (eccentricity, moment of inertia, AABB etc.)
+ * are valid when accessed with the get methods. */
+ bool is_valid_;
+
+ /** \brief Stores the angle step */
+ float step_;
+
+ /** \brief Stores the mass of point in the cloud */
+ float point_mass_;
+
+ /** \brief Stores the flag for mass normalization */
+ bool normalize_;
+
+ /** \brief Stores the mean value (center of mass) of the cloud */
+ Eigen::Vector3f mean_value_;
+
+ /** \brief Major eigen vector */
+ Eigen::Vector3f major_axis_;
+
+ /** \brief Middle eigen vector */
+ Eigen::Vector3f middle_axis_;
+
+ /** \brief Minor eigen vector */
+ Eigen::Vector3f minor_axis_;
+
+ /** \brief Major eigen value */
+ float major_value_;
+
+ /** \brief Middle eigen value */
+ float middle_value_;
+
+ /** \brief Minor eigen value */
+ float minor_value_;
+
+ /** \brief Stores calculated moments of inertia */
+ std::vector <float> moment_of_inertia_;
+
+ /** \brief Stores calculated eccentricities */
+ std::vector <float> eccentricity_;
+
+ /** \brief Min point of the axis aligned bounding box */
+ PointT aabb_min_point_;
+
+ /** \brief Max point of the axis aligned bounding box */
+ PointT aabb_max_point_;
+
+ /** \brief Min point of the oriented bounding box */
+ PointT obb_min_point_;
+
+ /** \brief Max point of the oriented bounding box */
+ PointT obb_max_point_;
+
+ /** \brief Stores position of the oriented bounding box */
+ Eigen::Vector3f obb_position_;
+
+ /** \brief Stores the rotational matrix of the oriented bounding box */
+ Eigen::Matrix3f obb_rotational_matrix_;
+
+ public:
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+}
+
+#define PCL_INSTANTIATE_MomentOfInertiaEstimation(T) template class pcl::MomentOfInertiaEstimation<T>;
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/features/impl/moment_of_inertia_estimation.hpp>
+#endif
+
+#endif
/** \brief Creates an affine transformation from the RF axes
* \param[in] evx the x-axis
- * \param[in] evy the z-axis
+ * \param[in] evy the y-axis
* \param[in] evz the z-axis
* \param[out] transformPC the resulting transformation
* \param[in] center_mat 4x4 matrix concatenated to the resulting transformation
/** \brief Removes normals with high curvature caused by real edges or noisy data
* \param[in] cloud pointcloud to be filtered
+ * \param[in] indices_to_use
* \param[out] indices_out the indices of the points with higher curvature than threshold
* \param[out] indices_in the indices of the remaining points after filtering
* \param[in] threshold threshold value for curvature
{
indices = clusters_;
}
+
+ /** \brief Gets the number of non-disambiguable axes that correspond to each centroid
+ * \param[out] cluster_axes vector mapping each centroid to the number of signatures
+ */
+ inline void
+ getClusterAxes (std::vector<short> & cluster_axes)
+ {
+ cluster_axes = cluster_axes_;
+ }
/** \brief Sets the refinement factor for the clusters
* \param[in] rc the factor used to decide if a point is used to estimate a stable cluster
std::vector<Eigen::Vector3f> dominant_normals_;
/** \brief Indices to the points representing the stable clusters */
std::vector<pcl::PointIndices> clusters_;
+ /** \brief Mapping from clusters to OUR-CVFH descriptors */
+ std::vector<short> cluster_axes_;
};
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#ifndef PCL_ROPS_ESIMATION_H_
+#define PCL_ROPS_ESIMATION_H_
+
+#include <pcl/PolygonMesh.h>
+#include <pcl/features/feature.h>
+#include <set>
+
+namespace pcl
+{
+ /** \brief
+ * This class implements the method for extracting RoPS features presented in the article
+ * "Rotational Projection Statistics for 3D Local Surface Description and Object Recognition" by
+ * Yulan Guo, Ferdous Sohel, Mohammed Bennamoun, Min Lu and Jianwei Wan.
+ */
+ template <typename PointInT, typename PointOutT>
+ class PCL_EXPORTS ROPSEstimation : public pcl::Feature <PointInT, PointOutT>
+ {
+ public:
+
+ using Feature <PointInT, PointOutT>::input_;
+ using Feature <PointInT, PointOutT>::indices_;
+ using Feature <PointInT, PointOutT>::surface_;
+ using Feature <PointInT, PointOutT>::tree_;
+
+ typedef typename pcl::Feature <PointInT, PointOutT>::PointCloudOut PointCloudOut;
+ typedef typename pcl::Feature <PointInT, PointOutT>::PointCloudIn PointCloudIn;
+
+ public:
+
+ /** \brief Simple constructor. */
+ ROPSEstimation ();
+
+ /** \brief Virtual destructor. */
+ virtual
+ ~ROPSEstimation ();
+
+ /** \brief Allows to set the number of partition bins that is used for distribution matrix calculation.
+ * \param[in] number_of_bins number of partition bins
+ */
+ void
+ setNumberOfPartitionBins (unsigned int number_of_bins);
+
+ /** \brief Returns the nmber of partition bins. */
+ unsigned int
+ getNumberOfPartitionBins () const;
+
+ /** \brief This method sets the number of rotations.
+ * \param[in] number_of_rotations number of rotations
+ */
+ void
+ setNumberOfRotations (unsigned int number_of_rotations);
+
+ /** \brief returns the number of rotations. */
+ unsigned int
+ getNumberOfRotations () const;
+
+ /** \brief Allows to set the support radius that is used to crop the local surface of the point.
+ * \param[in] support_radius support radius
+ */
+ void
+ setSupportRadius (float support_radius);
+
+ /** \brief Returns the support radius. */
+ float
+ getSupportRadius () const;
+
+ /** \brief This method sets the triangles of the mesh.
+ * \param[in] triangles list of triangles of the mesh
+ */
+ void
+ setTriangles (const std::vector <pcl::Vertices>& triangles);
+
+ /** \brief Returns the triangles of the mesh.
+ * \param[out] triangles triangles of tthe mesh
+ */
+ void
+ getTriangles (std::vector <pcl::Vertices>& triangles) const;
+
+ private:
+
+ /** \brief Abstract feature estimation method.
+ * \param[out] output the resultant features
+ */
+ virtual void
+ computeFeature (PointCloudOut& output);
+
+ /** \brief This method simply builds the list of triangles for every point.
+ * The list of triangles for each point consists of indices of triangles it belongs to.
+ * The only purpose of this method is to improve perfomance of the algorithm.
+ */
+ void
+ buildListOfPointsTriangles ();
+
+ /** \brief This method crops all the triangles within the given radius of the given point.
+ * \param[in] point point for which the local surface is computed
+ * \param[out] local_triangles strores the indices of the triangles that belong to the local surface
+ * \param[out] local_points stores the indices of the points that belong to the local surface
+ */
+ void
+ getLocalSurface (const PointInT& point, std::set <unsigned int>& local_triangles, std::vector <int>& local_points) const;
+
+ /** \brief This method computes LRF (Local Reference Frame) matrix for the given point.
+ * \param[in] point point for which the LRF is computed
+ * \param[in] local_triangles list of triangles that represents the local surface of the point
+ * \paran[out] lrf_matrix strores computed LRF matrix for the given point
+ */
+ void
+ computeLRF (const PointInT& point, const std::set <unsigned int>& local_triangles, Eigen::Matrix3f& lrf_matrix) const;
+
+ /** \brief This method calculates the eigen values and eigen vectors
+ * for the given covariance matrix. Note that it returns normalized eigen
+ * vectors that always form the right-handed coordinate system.
+ * \param[in] matrix covariance matrix of the cloud
+ * \param[out] major_axis eigen vector which corresponds to a major eigen value
+ * \param[out] middle_axis eigen vector which corresponds to a middle eigen value
+ * \param[out] minor_axis eigen vector which corresponds to a minor eigen value
+ */
+ void
+ computeEigenVectors (const Eigen::Matrix3f& matrix, Eigen::Vector3f& major_axis, Eigen::Vector3f& middle_axis,
+ Eigen::Vector3f& minor_axis) const;
+
+ /** \brief This method translates the cloud so that the given point becomes the origin.
+ * After that the cloud is rotated with the help of the given matrix.
+ * \param[in] point point which stores the translation information
+ * \param[in] matrix rotation matrix
+ * \param[in] local_points point to transform
+ * \param[out] transformed_cloud stores the transformed cloud
+ */
+ void
+ transformCloud (const PointInT& point, const Eigen::Matrix3f& matrix, const std::vector <int>& local_points, PointCloudIn& transformed_cloud) const;
+
+ /** \brief This method rotates the cloud around the given axis and computes AABB of the rotated cloud.
+ * \param[in] axis axis around which cloud must be rotated
+ * \param[in] angle angle in degrees
+ * \param[in] cloud cloud to rotate
+ * \param[out] rotated_cloud stores the rotated cloud
+ * \param[out] min stores the min point of the AABB
+ * \param[out] max stores the max point of the AABB
+ */
+ void
+ rotateCloud (const PointInT& axis, const float angle, const PointCloudIn& cloud, PointCloudIn& rotated_cloud,
+ Eigen::Vector3f& min, Eigen::Vector3f& max) const;
+
+ /** \brief This method projects the local surface onto the XY, XZ or YZ plane
+ * and computes the distribution matrix.
+ * \param[in] projection represents the case of projection. 1 - XY, 2 - XZ, 3 - YZ
+ * \param[in] min min point of the AABB
+ * \param[in] max max point of the AABB
+ * \param[in] cloud cloud containing the points of the local surface
+ * \param[out] matrix stores computed distribution matrix
+ */
+ void
+ getDistributionMatrix (const unsigned int projection, const Eigen::Vector3f& min, const Eigen::Vector3f& max, const PointCloudIn& cloud, Eigen::MatrixXf& matrix) const;
+
+ /** \brief This method computes the set ofcentral moments for the given matrix.
+ * \param[in] matrix input matrix
+ * \param[out] moments set of computed moments
+ */
+ void
+ computeCentralMoments (const Eigen::MatrixXf& matrix, std::vector <float>& moments) const;
+
+ private:
+
+ /** \brief Stores the number of partition bins that is used for distribution matrix calculation. */
+ unsigned int number_of_bins_;
+
+ /** \brief Stores number of rotations. Central moments are calculated for every rotation. */
+ unsigned int number_of_rotations_;
+
+ /** \brief Support radius that is used to crop the local surface of the point. */
+ float support_radius_;
+
+ /** \brief Stores the squared support radius. Used to improve performance. */
+ float sqr_support_radius_;
+
+ /** \brief Stores the angle step. Step is calculated with respect to number of rotations. */
+ float step_;
+
+ /** \brief Stores the set of triangles reprsenting the mesh. */
+ std::vector <pcl::Vertices> triangles_;
+
+ /** \brief Stores the set of triangles for each point. Its purpose is to improve perfomance. */
+ std::vector <std::vector <unsigned int> > triangles_of_the_point_;
+
+ public:
+
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+}
+
+#define PCL_INSTANTIATE_ROPSEstimation(InT, OutT) template class pcl::ROPSEstimation<InT, OutT>;
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/features/impl/rops_estimation.hpp>
+#endif
+
+#endif
/** \brief Create a binned distance shape histogram
* \param[in] index the index of the point in indices_
* \param[in] indices the k-neighborhood point indices in surface_
- * \param[in] sqr_dists the k-neighborhood point distances in surface_
* \param[out] bin_distance_shape the resultant histogram
*/
void
typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut;
/** \brief Computes disambiguated local RF for a point index
- * \param[in] cloud input point cloud
- * \param[in] search_radius the neighborhood radius
- * \param[in] central_point the point from the input_ cloud at which the local RF is computed
- * \param[in] indices the neighbours indices
- * \param[in] dists the squared distances to the neighbours
+ * \param[in] index the index
* \param[out] rf reference frame to compute
*/
float
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2011, Alexandru-Eugen Ichim
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2013, Martin Szarski
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/features/impl/cppf.hpp>
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+ inline void
+ RGBtoHSV (const Eigen::Vector4i &in,
+ Eigen::Vector4f &out)
+ {
+ const unsigned char max = std::max (in[0], std::max (in[1], in[2]));
+ const unsigned char min = std::min (in[0], std::min (in[1], in[2]));
+
+ out[2] = static_cast <float> (max) / 255.f;
+
+ if (max == 0) // division by zero
+ {
+ out[1] = 0.f;
+ out[0] = 0.f; // h = -1.f;
+ return;
+ }
+
+ const float diff = static_cast <float> (max - min);
+ out[1] = diff / static_cast <float> (max);
+
+ if (min == max) // diff == 0 -> division by zero
+ {
+ out[0] = 0;
+ return;
+ }
+
+ if (max == in[0]) out[0] = 60.f * ( static_cast <float> (in[1] - in[2]) / diff);
+ else if (max == in[1]) out[0] = 60.f * (2.f + static_cast <float> (in[2] - in[0]) / diff);
+ else out[0] = 60.f * (4.f + static_cast <float> (in[0] - in[1]) / diff); // max == b
+
+ if (out[0] < 0.f) out[0] += 360.f;
+ }
+
+bool
+pcl::computeCPPFPairFeature (const Eigen::Vector4f &p1, const Eigen::Vector4f &n1, const Eigen::Vector4i &c1,
+ const Eigen::Vector4f &p2, const Eigen::Vector4f &n2, const Eigen::Vector4i &c2,
+ float &f1, float &f2, float &f3, float &f4, float &f5, float &f6, float &f7, float &f8, float &f9, float &f10)
+{
+ Eigen::Vector4f delta = p2 - p1;
+ delta[3] = 0.0f;
+ // f4 = ||delta||
+ f4 = delta.norm ();
+
+ delta /= f4;
+
+ // f1 = n1 dot delta
+ f1 = n1[0] * delta[0] + n1[1] * delta[1] + n1[2] * delta[2];
+ // f2 = n2 dot delta
+ f2 = n2[0] * delta[0] + n2[1] * delta[1] + n2[2] * delta[2];
+ // f3 = n1 dot n2
+ f3 = n1[0] * n2[0] + n1[1] * n2[1] + n1[2] * n2[2];
+
+ // f5-f7 is hsv component of p1
+ // f8-f10 is hsv component of p2
+ Eigen::Vector4f hsv1;
+ Eigen::Vector4f hsv2;
+
+ RGBtoHSV (c1,hsv1);
+ RGBtoHSV (c2,hsv2);
+
+ f5 = hsv1[0] / 360.0; //normalise to [0-1]
+ f6 = hsv1[1];
+ f7 = hsv1[2];
+
+ f8 = hsv2[0] / 360.0; //normalise to [0-1]
+ f9 = hsv2[1];
+ f10 = hsv2[2];
+
+ return (true);
+}
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE_PRODUCT(CPPFEstimation, ((pcl::PointXYZRGBA) (pcl::PointXYZRGBNormal))
+ ((pcl::Normal) (pcl::PointNormal) (pcl::PointXYZRGBNormal))
+ ((pcl::CPPFSignature)))
+#else
+ PCL_INSTANTIATE_PRODUCT(CPPFEstimation, ((pcl::PointXYZRGBA) (pcl::PointXYZRGBNormal))
+ ((pcl::Normal) (pcl::PointNormal) (pcl::PointXYZRGBNormal))
+ ((pcl::CPPFSignature)))
+#endif
+#endif // PCL_NO_PRECOMPILE
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#include <pcl/features/moment_of_inertia_estimation.h>
+#include <pcl/features/impl/moment_of_inertia_estimation.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE_PRODUCT(MomentOfInertiaEstimation, ((pcl::PointXYZ)))
+ PCL_INSTANTIATE_PRODUCT(MomentOfInertiaEstimation, ((pcl::PointXYZI)))
+ PCL_INSTANTIATE_PRODUCT(MomentOfInertiaEstimation, ((pcl::PointXYZRGBA)))
+ PCL_INSTANTIATE_PRODUCT(MomentOfInertiaEstimation, ((pcl::PointNormal)))
+#else
+ PCL_INSTANTIATE_PRODUCT(MomentOfInertiaEstimation, (PCL_XYZ_POINT_TYPES))
+#endif
+#endif // PCL_NO_PRECOMPILE
// everything before was standard 4D-Darboux frame feature pair
// now, for the experimental color stuff
- f5 = (colors2[0] != 0) ? static_cast<float> (colors1[0] / colors2[0]) : 1.0f;
- f6 = (colors2[1] != 0) ? static_cast<float> (colors1[1] / colors2[1]) : 1.0f;
- f7 = (colors2[2] != 0) ? static_cast<float> (colors1[2] / colors2[2]) : 1.0f;
+ f5 = (colors2[0] != 0) ? static_cast<float> (colors1[0]) / colors2[0] : 1.0f;
+ f6 = (colors2[1] != 0) ? static_cast<float> (colors1[1]) / colors2[1] : 1.0f;
+ f7 = (colors2[2] != 0) ? static_cast<float> (colors1[2]) / colors2[2] : 1.0f;
// make sure the ratios are in the [-1, 1] interval
if (f5 > 1.0f) f5 = - 1.0f / f5;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author : Sergey Ushakov
+ * Email : sergey.s.ushakov@mail.ru
+ *
+ */
+
+#include <pcl/features/rops_estimation.h>
+#include <pcl/features/impl/rops_estimation.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE_PRODUCT(ROPSEstimation, ((pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointNormal))((pcl::Histogram<135>)))
+#else
+ PCL_INSTANTIATE_PRODUCT(ROPSEstimation, (PCL_XYZ_POINT_TYPES)((pcl::Histogram<135>)))
+#endif
+#endif // PCL_NO_PRECOMPILE
#include <pcl/impl/instantiate.hpp>
// Instantiations of specific point types
#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE_PRODUCT(SHOTEstimationBase, ((pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA))((pcl::Normal))((pcl::SHOT352)(pcl::SHOT1344))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTEstimation, ((pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA))((pcl::Normal))((pcl::SHOT352))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTColorEstimation, ((pcl::PointXYZRGB)(pcl::PointXYZRGBA))((pcl::Normal))((pcl::SHOT1344))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTEstimationOMP, ((pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA))((pcl::Normal))((pcl::SHOT352))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTColorEstimationOMP, ((pcl::PointXYZRGB)(pcl::PointXYZRGBA))((pcl::Normal))((pcl::SHOT1344))((pcl::ReferenceFrame)))
#else
+ PCL_INSTANTIATE_PRODUCT(SHOTEstimationBase, (PCL_XYZ_POINT_TYPES)(PCL_NORMAL_POINT_TYPES)((pcl::SHOT352)(pcl::SHOT1344))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTEstimation, (PCL_XYZ_POINT_TYPES)(PCL_NORMAL_POINT_TYPES)((pcl::SHOT352))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTColorEstimation, ((pcl::PointXYZRGBA)(pcl::PointXYZRGB)(pcl::PointXYZRGBL)(pcl::PointXYZRGBNormal))(PCL_NORMAL_POINT_TYPES)((pcl::SHOT1344))((pcl::ReferenceFrame)))
PCL_INSTANTIATE_PRODUCT(SHOTEstimationOMP, (PCL_XYZ_POINT_TYPES)(PCL_NORMAL_POINT_TYPES)((pcl::SHOT352))((pcl::ReferenceFrame)))
set(SUBSYS_DEPS common sample_consensus search kdtree octree)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
src/median_filter.cpp
src/voxel_grid_occlusion_estimation.cpp
src/normal_refinement.cpp
+ src/grid_minimum.cpp
+ src/morphological_filter.cpp
+ src/local_maximum.cpp
+ src/model_outlier_removal.cpp
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/conditional_removal.h
- include/pcl/${SUBSYS_NAME}/crop_box.h
- include/pcl/${SUBSYS_NAME}/clipper3D.h
- include/pcl/${SUBSYS_NAME}/plane_clipper3D.h
- include/pcl/${SUBSYS_NAME}/box_clipper3D.h
- include/pcl/${SUBSYS_NAME}/crop_hull.h
- include/pcl/${SUBSYS_NAME}/extract_indices.h
- include/pcl/${SUBSYS_NAME}/filter.h
- include/pcl/${SUBSYS_NAME}/filter_indices.h
- include/pcl/${SUBSYS_NAME}/passthrough.h
- include/pcl/${SUBSYS_NAME}/shadowpoints.h
- include/pcl/${SUBSYS_NAME}/project_inliers.h
- include/pcl/${SUBSYS_NAME}/radius_outlier_removal.h
- include/pcl/${SUBSYS_NAME}/random_sample.h
- include/pcl/${SUBSYS_NAME}/normal_space.h
- include/pcl/${SUBSYS_NAME}/sampling_surface_normal.h
- include/pcl/${SUBSYS_NAME}/statistical_outlier_removal.h
- include/pcl/${SUBSYS_NAME}/voxel_grid.h
- include/pcl/${SUBSYS_NAME}/approximate_voxel_grid.h
- include/pcl/${SUBSYS_NAME}/bilateral.h
- include/pcl/${SUBSYS_NAME}/fast_bilateral.h
- include/pcl/${SUBSYS_NAME}/fast_bilateral_omp.h
- include/pcl/${SUBSYS_NAME}/voxel_grid_covariance.h
- include/pcl/${SUBSYS_NAME}/convolution.h
- include/pcl/${SUBSYS_NAME}/convolution_3d.h
- include/pcl/${SUBSYS_NAME}/voxel_grid_label.h
- include/pcl/${SUBSYS_NAME}/voxel_grid_occlusion_estimation.h
- include/pcl/${SUBSYS_NAME}/frustum_culling.h
- include/pcl/${SUBSYS_NAME}/covariance_sampling.h
- include/pcl/${SUBSYS_NAME}/median_filter.h
- include/pcl/${SUBSYS_NAME}/normal_refinement.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/conditional_removal.h"
+ "include/pcl/${SUBSYS_NAME}/crop_box.h"
+ "include/pcl/${SUBSYS_NAME}/clipper3D.h"
+ "include/pcl/${SUBSYS_NAME}/plane_clipper3D.h"
+ "include/pcl/${SUBSYS_NAME}/box_clipper3D.h"
+ "include/pcl/${SUBSYS_NAME}/crop_hull.h"
+ "include/pcl/${SUBSYS_NAME}/extract_indices.h"
+ "include/pcl/${SUBSYS_NAME}/filter.h"
+ "include/pcl/${SUBSYS_NAME}/filter_indices.h"
+ "include/pcl/${SUBSYS_NAME}/passthrough.h"
+ "include/pcl/${SUBSYS_NAME}/shadowpoints.h"
+ "include/pcl/${SUBSYS_NAME}/project_inliers.h"
+ "include/pcl/${SUBSYS_NAME}/radius_outlier_removal.h"
+ "include/pcl/${SUBSYS_NAME}/random_sample.h"
+ "include/pcl/${SUBSYS_NAME}/normal_space.h"
+ "include/pcl/${SUBSYS_NAME}/sampling_surface_normal.h"
+ "include/pcl/${SUBSYS_NAME}/statistical_outlier_removal.h"
+ "include/pcl/${SUBSYS_NAME}/voxel_grid.h"
+ "include/pcl/${SUBSYS_NAME}/approximate_voxel_grid.h"
+ "include/pcl/${SUBSYS_NAME}/bilateral.h"
+ "include/pcl/${SUBSYS_NAME}/fast_bilateral.h"
+ "include/pcl/${SUBSYS_NAME}/fast_bilateral_omp.h"
+ "include/pcl/${SUBSYS_NAME}/voxel_grid_covariance.h"
+ "include/pcl/${SUBSYS_NAME}/convolution.h"
+ "include/pcl/${SUBSYS_NAME}/convolution_3d.h"
+ "include/pcl/${SUBSYS_NAME}/voxel_grid_label.h"
+ "include/pcl/${SUBSYS_NAME}/voxel_grid_occlusion_estimation.h"
+ "include/pcl/${SUBSYS_NAME}/frustum_culling.h"
+ "include/pcl/${SUBSYS_NAME}/covariance_sampling.h"
+ "include/pcl/${SUBSYS_NAME}/median_filter.h"
+ "include/pcl/${SUBSYS_NAME}/normal_refinement.h"
+ "include/pcl/${SUBSYS_NAME}/grid_minimum.h"
+ "include/pcl/${SUBSYS_NAME}/morphological_filter.h"
+ "include/pcl/${SUBSYS_NAME}/local_maximum.h"
+ "include/pcl/${SUBSYS_NAME}/model_outlier_removal.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/conditional_removal.hpp
- include/pcl/${SUBSYS_NAME}/impl/crop_box.hpp
- include/pcl/${SUBSYS_NAME}/impl/crop_hull.hpp
- include/pcl/${SUBSYS_NAME}/impl/plane_clipper3D.hpp
- include/pcl/${SUBSYS_NAME}/impl/box_clipper3D.hpp
- include/pcl/${SUBSYS_NAME}/impl/extract_indices.hpp
- include/pcl/${SUBSYS_NAME}/impl/filter.hpp
- include/pcl/${SUBSYS_NAME}/impl/filter_indices.hpp
- include/pcl/${SUBSYS_NAME}/impl/passthrough.hpp
- include/pcl/${SUBSYS_NAME}/impl/shadowpoints.hpp
- include/pcl/${SUBSYS_NAME}/impl/project_inliers.hpp
- include/pcl/${SUBSYS_NAME}/impl/radius_outlier_removal.hpp
- include/pcl/${SUBSYS_NAME}/impl/random_sample.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_space.hpp
- include/pcl/${SUBSYS_NAME}/impl/sampling_surface_normal.hpp
- include/pcl/${SUBSYS_NAME}/impl/statistical_outlier_removal.hpp
- include/pcl/${SUBSYS_NAME}/impl/voxel_grid.hpp
- include/pcl/${SUBSYS_NAME}/impl/approximate_voxel_grid.hpp
- include/pcl/${SUBSYS_NAME}/impl/bilateral.hpp
- include/pcl/${SUBSYS_NAME}/impl/fast_bilateral.hpp
- include/pcl/${SUBSYS_NAME}/impl/fast_bilateral_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/voxel_grid_covariance.hpp
- include/pcl/${SUBSYS_NAME}/impl/convolution.hpp
- include/pcl/${SUBSYS_NAME}/impl/convolution_3d.hpp
- include/pcl/${SUBSYS_NAME}/impl/voxel_grid_occlusion_estimation.hpp
- include/pcl/${SUBSYS_NAME}/impl/frustum_culling.hpp
- include/pcl/${SUBSYS_NAME}/impl/covariance_sampling.hpp
- include/pcl/${SUBSYS_NAME}/impl/median_filter.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_refinement.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/conditional_removal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/crop_box.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/crop_hull.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/plane_clipper3D.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/box_clipper3D.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/extract_indices.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/filter_indices.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/passthrough.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/shadowpoints.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/project_inliers.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/radius_outlier_removal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/random_sample.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_space.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sampling_surface_normal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/statistical_outlier_removal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/voxel_grid.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/approximate_voxel_grid.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/bilateral.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/fast_bilateral.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/fast_bilateral_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/voxel_grid_covariance.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/convolution.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/convolution_3d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/voxel_grid_occlusion_estimation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/frustum_culling.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/covariance_sampling.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/median_filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_refinement.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/grid_minimum.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/morphological_filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/local_maximum.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/model_outlier_removal.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common pcl_sample_consensus pcl_search pcl_kdtree pcl_octree)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_sample_consensus pcl_search pcl_kdtree pcl_octree)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
clipLineSegment3D (PointT& from, PointT& to) const;
virtual void
- clipPlanarPolygon3D (std::vector<PointT>& polygon) const;
+ clipPlanarPolygon3D (std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon) const;
virtual void
- clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const;
+ clipPlanarPolygon3D (const std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon, std::vector<PointT>& clipped_polygon) const;
virtual void
clipPointCloud3D (const pcl::PointCloud<PointT> &cloud_in, std::vector<int>& clipped, const std::vector<int>& indices = std::vector<int> ()) const;
};
}
-#ifdef PCL_NO_PRECOMPILE
#include <pcl/filters/impl/box_clipper3D.hpp>
-#endif
#endif // PCL_BOX_CLIPPER3D_H_
#define PCL_CLIPPER3D_H_
#include <pcl/point_cloud.h>
#include <vector>
+#include <Eigen/StdVector>
namespace pcl
{
* \param[in,out] polygon the polygon in any direction (ccw or cw) but ordered, thus two neighboring points define an edge of the polygon
*/
virtual void
- clipPlanarPolygon3D (std::vector<PointT>& polygon) const = 0;
+ clipPlanarPolygon3D (std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon) const = 0;
/**
* \brief interface to clip a planar polygon given by an ordered list of points
* \param[out] clipped_polygon the clipped polygon
*/
virtual void
- clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const = 0;
+ clipPlanarPolygon3D (const std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon, std::vector<PointT, Eigen::aligned_allocator<PointT> >& clipped_polygon) const = 0;
/**
* \brief interface to clip a point cloud
};
}
-#ifdef PCL_NO_PRECOMPILE
-#include <pcl/filters/impl/clipper3D.hpp>
-#endif
-
#endif // PCL_CLIPPER3D_H_
* being removed by the filter
* \param extract_removed_indices extract filtered indices from indices vector
*/
+ PCL_DEPRECATED ("ConditionalRemoval(ConditionBasePtr condition, bool extract_removed_indices = false) is deprecated, "
+ "please use the setCondition (ConditionBasePtr condition) function instead.")
ConditionalRemoval (ConditionBasePtr condition, bool extract_removed_indices = false) :
Filter<PointT>::Filter (extract_removed_indices), capable_ (false), keep_organized_ (false), condition_ (),
user_filter_value_ (std::numeric_limits<float>::quiet_NaN ())
void
applyFilter (PointCloud &output);
- typedef typename pcl::traits::fieldList<PointT>::type FieldList;
-
/** \brief True if capable. */
bool capable_;
* In 3D the next point in (u,v) coordinate can be really far so a distance
* threshold is used to keep us from ghost points.
* The value you set here is strongly related to the sensor. A good value for
- * kinect data is 0.001 \default is std::numeric<float>::infinity ()
+ * kinect data is 0.001. Default is std::numeric<float>::infinity ()
* \param[in] threshold maximum allowed distance between 2 juxtaposed points
*/
inline void
inline void
setNumberOfThreads (unsigned int nr_threads = 0) { threads_ = nr_threads; }
/** Convolve a float image rows by a given kernel.
- * \param[in] kernel convolution kernel
* \param[out] output the convolved cloud
* \note if output doesn't fit in input i.e. output.rows () < input.rows () or
* output.cols () < input.cols () then output is resized to input sizes.
inline void
convolveRows (PointCloudOut& output);
/** Convolve a float image columns by a given kernel.
- * \param[in] kernel convolution kernel
* \param[out] output the convolved image
* \note if output doesn't fit in input i.e. output.rows () < input.rows () or
* output.cols () < input.cols () then output is resized to input sizes.
void
convolve_cols_duplicate (PointCloudOut& output);
/** init compute is an internal method called before computation
- * \param[in] kernel convolution kernel to be used
+ * \param[in] output
* \throw pcl::InitFailedException
*/
void
initCompute () { return false; }
/** \brief Utility function that annihilates a point making it fail the \ref pcl::isFinite test
- * \param[in/out] p point to annihilate
+ * \param p point to annihilate
*/
static void
makeInfinite (PointOutT& p)
{ filter_name_ = "CovarianceSampling"; }
/** \brief Set number of indices to be sampled.
- * \param[in] sample the number of sample indices
+ * \param[in] samples the number of sample indices
*/
inline void
setNumberOfSamples (unsigned int samples)
}
protected:
+
using Filter<PointT>::initCompute;
using Filter<PointT>::deinitCompute;
/** \brief Abstract filter method for point cloud indices. */
virtual void
applyFilter (std::vector<int> &indices) = 0;
+
+ /** \brief Abstract filter method for point cloud. */
+ virtual void
+ applyFilter (PointCloud &output) = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
protected:
+
/** \brief False = normal filter behavior (default), true = inverted behavior. */
bool negative_;
/** \brief Abstract filter method for point cloud indices. */
virtual void
applyFilter (std::vector<int> &indices) = 0;
+
+ /** \brief Abstract filter method for point cloud. */
+ virtual void
+ applyFilter (PCLPointCloud2 &output) = 0;
};
}
};
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/frustum_culling.hpp>
+#endif
+
#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_VOXEL_GRID_MINIMUM_H_
+#define PCL_FILTERS_VOXEL_GRID_MINIMUM_H_
+
+#include <pcl/filters/boost.h>
+#include <pcl/filters/filter.h>
+#include <pcl/filters/filter_indices.h>
+
+namespace pcl
+{
+ /** \brief GridMinimum assembles a local 2D grid over a given PointCloud, and downsamples the data.
+ *
+ * The GridMinimum class creates a *2D grid* over the input point cloud
+ * data. Then, in each *cell* (i.e., 2D grid element), all the points
+ * present will be *downsampled* with the minimum z value. This grid minimum
+ * can be useful in a number of topographic processing tasks such as crudely
+ * estimating ground returns, especially under foliage.
+ *
+ * \author Bradley J Chambers
+ * \ingroup filters
+ */
+ template <typename PointT>
+ class GridMinimum: public FilterIndices<PointT>
+ {
+ protected:
+ using Filter<PointT>::filter_name_;
+ using Filter<PointT>::getClassName;
+ using Filter<PointT>::input_;
+ using Filter<PointT>::indices_;
+
+ typedef typename FilterIndices<PointT>::PointCloud PointCloud;
+
+ public:
+ /** \brief Empty constructor. */
+ GridMinimum (const float resolution)
+ {
+ setResolution (resolution);
+ filter_name_ = "GridMinimum";
+ }
+
+ /** \brief Destructor. */
+ virtual ~GridMinimum ()
+ {
+ }
+
+ /** \brief Set the grid resolution.
+ * \param[in] resolution the grid resolution
+ */
+ inline void
+ setResolution (const float resolution)
+ {
+ resolution_ = resolution;
+ // Use multiplications instead of divisions
+ inverse_resolution_ = 1.0f / resolution_;
+ }
+
+ /** \brief Get the grid resolution. */
+ inline float
+ getResolution () { return (resolution_); }
+
+ protected:
+ /** \brief The resolution. */
+ float resolution_;
+
+ /** \brief Internal resolution stored as 1/resolution_ for efficiency reasons. */
+ float inverse_resolution_;
+
+ /** \brief Downsample a Point Cloud using a 2D grid approach
+ * \param[out] output the resultant point cloud message
+ */
+ void
+ applyFilter (PointCloud &output);
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilter (std::vector<int> &indices)
+ {
+ applyFilterIndices (indices);
+ }
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilterIndices (std::vector<int> &indices);
+
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/grid_minimum.hpp>
+#endif
+
+#endif //#ifndef PCL_FILTERS_VOXEL_GRID_MINIMUM_H_
+
* @attention untested code
*/
template<typename PointT> void
-pcl::BoxClipper3D<PointT>::clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const
+pcl::BoxClipper3D<PointT>::clipPlanarPolygon3D (const std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon, std::vector<PointT, Eigen::aligned_allocator<PointT> >& clipped_polygon) const
{
// not implemented -> clip everything
clipped_polygon.clear ();
* @attention untested code
*/
template<typename PointT> void
-pcl::BoxClipper3D<PointT>::clipPlanarPolygon3D (std::vector<PointT>& polygon) const
+pcl::BoxClipper3D<PointT>::clipPlanarPolygon3D (std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon) const
{
// not implemented -> clip everything
polygon.clear ();
#define PCL_FILTER_IMPL_FIELD_VAL_CONDITION_H_
#include <pcl/common/io.h>
+#include <pcl/common/copy_point.h>
#include <pcl/filters/conditional_removal.h>
//////////////////////////////////////////////////////////////////////////
if (condition_->evaluate (input_->points[(*Filter < PointT > ::indices_)[cp]]))
{
- pcl::for_each_type<FieldList> (
- pcl::NdConcatenateFunctor<PointT, PointT> (
- input_->points[(*Filter < PointT > ::indices_)[cp]],
- output.points[nr_p]));
+ copyPoint (input_->points[(*Filter < PointT > ::indices_)[cp]], output.points[nr_p]);
nr_p++;
}
else
}
// copy all the fields
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor<PointT, PointT> (input_->points[cp],
- output.points[cp]));
+ copyPoint (input_->points[cp], output.points[cp]);
+
if (!condition_->evaluate (input_->points[cp]))
{
output.points[cp].getVector4fMap ().setConstant (user_filter_value_);
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int j = 0; j < height; ++j)
{
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
if (input_->is_dense)
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
else
{
#ifdef _OPENMP
-#pragma omp parallel for shared (output, last) num_threads (threads_)
+#pragma omp parallel for shared (output) num_threads (threads_)
#endif
for(int i = 0; i < width; ++i)
{
if (num_samples_ > indices_->size ())
{
- PCL_ERROR ("[pcl::CovarianceSampling::initCompute] The number of samples you asked for (%d) is larger than the number of input indices (%zu)\n",
+ PCL_ERROR ("[pcl::CovarianceSampling::initCompute] The number of samples you asked for (%d) is larger than the number of input indices (%lu)\n",
num_samples_, indices_->size ());
return false;
}
Eigen::MatrixXcd complex_eigenvalues = eigen_solver.eigenvalues ();
- double max_ev = std::numeric_limits<double>::min (),
+ double max_ev = -std::numeric_limits<double>::max (),
min_ev = std::numeric_limits<double>::max ();
for (size_t i = 0; i < 6; ++i)
{
Eigen::MatrixXcd complex_eigenvalues = eigen_solver.eigenvalues ();
- double max_ev = std::numeric_limits<double>::min (),
+ double max_ev = -std::numeric_limits<double>::max (),
min_ev = std::numeric_limits<double>::max ();
for (size_t i = 0; i < 6; ++i)
{
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_IMPL_VOXEL_GRID_MINIMUM_H_
+#define PCL_FILTERS_IMPL_VOXEL_GRID_MINIMUM_H_
+
+#include <pcl/common/common.h>
+#include <pcl/common/io.h>
+#include <pcl/filters/grid_minimum.h>
+
+struct point_index_idx
+{
+ unsigned int idx;
+ unsigned int cloud_point_index;
+
+ point_index_idx (unsigned int idx_, unsigned int cloud_point_index_) : idx (idx_), cloud_point_index (cloud_point_index_) {}
+ bool operator < (const point_index_idx &p) const { return (idx < p.idx); }
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::GridMinimum<PointT>::applyFilter (PointCloud &output)
+{
+ // Has the input dataset been set already?
+ if (!input_)
+ {
+ PCL_WARN ("[pcl::%s::applyFilter] No input dataset given!\n", getClassName ().c_str ());
+ output.width = output.height = 0;
+ output.points.clear ();
+ return;
+ }
+
+ std::vector<int> indices;
+
+ output.is_dense = true;
+ applyFilterIndices (indices);
+ pcl::copyPointCloud<PointT> (*input_, indices, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::GridMinimum<PointT>::applyFilterIndices (std::vector<int> &indices)
+{
+ indices.resize (indices_->size ());
+ int oii = 0;
+
+ // Get the minimum and maximum dimensions
+ Eigen::Vector4f min_p, max_p;
+ getMinMax3D<PointT> (*input_, *indices_, min_p, max_p);
+
+ // Check that the resolution is not too small, given the size of the data
+ int64_t dx = static_cast<int64_t> ((max_p[0] - min_p[0]) * inverse_resolution_)+1;
+ int64_t dy = static_cast<int64_t> ((max_p[1] - min_p[1]) * inverse_resolution_)+1;
+
+ if ((dx*dy) > static_cast<int64_t> (std::numeric_limits<int32_t>::max ()))
+ {
+ PCL_WARN ("[pcl::%s::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow.", getClassName ().c_str ());
+ return;
+ }
+
+ Eigen::Vector4i min_b, max_b, div_b, divb_mul;
+
+ // Compute the minimum and maximum bounding box values
+ min_b[0] = static_cast<int> (floor (min_p[0] * inverse_resolution_));
+ max_b[0] = static_cast<int> (floor (max_p[0] * inverse_resolution_));
+ min_b[1] = static_cast<int> (floor (min_p[1] * inverse_resolution_));
+ max_b[1] = static_cast<int> (floor (max_p[1] * inverse_resolution_));
+
+ // Compute the number of divisions needed along all axis
+ div_b = max_b - min_b + Eigen::Vector4i::Ones ();
+ div_b[3] = 0;
+
+ // Set up the division multiplier
+ divb_mul = Eigen::Vector4i (1, div_b[0], 0, 0);
+
+ std::vector<point_index_idx> index_vector;
+ index_vector.reserve (indices_->size ());
+
+ // First pass: go over all points and insert them into the index_vector vector
+ // with calculated idx. Points with the same idx value will contribute to the
+ // same point of resulting CloudPoint
+ for (std::vector<int>::const_iterator it = indices_->begin (); it != indices_->end (); ++it)
+ {
+ if (!input_->is_dense)
+ // Check if the point is invalid
+ if (!pcl_isfinite (input_->points[*it].x) ||
+ !pcl_isfinite (input_->points[*it].y) ||
+ !pcl_isfinite (input_->points[*it].z))
+ continue;
+
+ int ijk0 = static_cast<int> (floor (input_->points[*it].x * inverse_resolution_) - static_cast<float> (min_b[0]));
+ int ijk1 = static_cast<int> (floor (input_->points[*it].y * inverse_resolution_) - static_cast<float> (min_b[1]));
+
+ // Compute the grid cell index
+ int idx = ijk0 * divb_mul[0] + ijk1 * divb_mul[1];
+ index_vector.push_back (point_index_idx (static_cast<unsigned int> (idx), *it));
+ }
+
+ // Second pass: sort the index_vector vector using value representing target cell as index
+ // in effect all points belonging to the same output cell will be next to each other
+ std::sort (index_vector.begin (), index_vector.end (), std::less<point_index_idx> ());
+
+ // Third pass: count output cells
+ // we need to skip all the same, adjacenent idx values
+ unsigned int total = 0;
+ unsigned int index = 0;
+
+ // first_and_last_indices_vector[i] represents the index in index_vector of the first point in
+ // index_vector belonging to the voxel which corresponds to the i-th output point,
+ // and of the first point not belonging to.
+ std::vector<std::pair<unsigned int, unsigned int> > first_and_last_indices_vector;
+
+ // Worst case size
+ first_and_last_indices_vector.reserve (index_vector.size ());
+ while (index < index_vector.size ())
+ {
+ unsigned int i = index + 1;
+ while (i < index_vector.size () && index_vector[i].idx == index_vector[index].idx)
+ ++i;
+ ++total;
+ first_and_last_indices_vector.push_back (std::pair<unsigned int, unsigned int> (index, i));
+ index = i;
+ }
+
+ // Fourth pass: locate grid minimums
+ indices.resize (total);
+
+ index = 0;
+
+ for (unsigned int cp = 0; cp < first_and_last_indices_vector.size (); ++cp)
+ {
+ unsigned int first_index = first_and_last_indices_vector[cp].first;
+ unsigned int last_index = first_and_last_indices_vector[cp].second;
+ unsigned int min_index = index_vector[first_index].cloud_point_index;
+ float min_z = input_->points[index_vector[first_index].cloud_point_index].z;
+
+ for (unsigned int i = first_index + 1; i < last_index; ++i)
+ {
+ if (input_->points[index_vector[i].cloud_point_index].z < min_z)
+ {
+ min_z = input_->points[index_vector[i].cloud_point_index].z;
+ min_index = index_vector[i].cloud_point_index;
+ }
+ }
+
+ indices[index] = min_index;
+
+ ++index;
+ }
+
+ oii = indices.size ();
+
+ // Resize the output arrays
+ indices.resize (oii);
+}
+
+#define PCL_INSTANTIATE_GridMinimum(T) template class PCL_EXPORTS pcl::GridMinimum<T>;
+
+#endif // PCL_FILTERS_IMPL_VOXEL_GRID_MINIMUM_H_
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_IMPL_LOCAL_MAXIMUM_H_
+#define PCL_FILTERS_IMPL_LOCAL_MAXIMUM_H_
+
+#include <pcl/common/io.h>
+#include <pcl/filters/local_maximum.h>
+#include <pcl/filters/project_inliers.h>
+#include <pcl/ModelCoefficients.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::LocalMaximum<PointT>::applyFilter (PointCloud &output)
+{
+ // Has the input dataset been set already?
+ if (!input_)
+ {
+ PCL_WARN ("[pcl::%s::applyFilter] No input dataset given!\n", getClassName ().c_str ());
+ output.width = output.height = 0;
+ output.points.clear ();
+ return;
+ }
+
+ std::vector<int> indices;
+
+ output.is_dense = true;
+ applyFilterIndices (indices);
+ pcl::copyPointCloud<PointT> (*input_, indices, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::LocalMaximum<PointT>::applyFilterIndices (std::vector<int> &indices)
+{
+ typename PointCloud::Ptr cloud_projected (new PointCloud);
+
+ // Create a set of planar coefficients with X=Y=0,Z=1
+ pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
+ coefficients->values.resize (4);
+ coefficients->values[0] = coefficients->values[1] = 0;
+ coefficients->values[2] = 1.0;
+ coefficients->values[3] = 0;
+
+ // Create the filtering object and project input into xy plane
+ pcl::ProjectInliers<PointT> proj;
+ proj.setModelType (pcl::SACMODEL_PLANE);
+ proj.setInputCloud (input_);
+ proj.setModelCoefficients (coefficients);
+ proj.filter (*cloud_projected);
+
+ // Initialize the search class
+ if (!searcher_)
+ {
+ if (input_->isOrganized ())
+ searcher_.reset (new pcl::search::OrganizedNeighbor<PointT> ());
+ else
+ searcher_.reset (new pcl::search::KdTree<PointT> (false));
+ }
+ searcher_->setInputCloud (cloud_projected);
+
+ // The arrays to be used
+ indices.resize (indices_->size ());
+ removed_indices_->resize (indices_->size ());
+ int oii = 0, rii = 0; // oii = output indices iterator, rii = removed indices iterator
+
+ std::vector<bool> point_is_max (indices_->size (), false);
+ std::vector<bool> point_is_visited (indices_->size (), false);
+
+ // Find all points within xy radius (i.e., a vertical cylinder) of the query
+ // point, removing those that are locally maximal (i.e., highest z within the
+ // cylinder)
+ for (int iii = 0; iii < static_cast<int> (indices_->size ()); ++iii)
+ {
+ if (!isFinite (input_->points[(*indices_)[iii]]))
+ {
+ continue;
+ }
+
+ // Points in the neighborhood of a previously identified local max, will
+ // not be maximal in their own neighborhood
+ if (point_is_visited[(*indices_)[iii]] && !point_is_max[(*indices_)[iii]])
+ {
+ continue;
+ }
+
+ // Assume the current query point is the maximum, mark as visited
+ point_is_max[(*indices_)[iii]] = true;
+ point_is_visited[(*indices_)[iii]] = true;
+
+ // Perform the radius search in the projected cloud
+ std::vector<int> radius_indices;
+ std::vector<float> radius_dists;
+ PointT p = cloud_projected->points[(*indices_)[iii]];
+ if (searcher_->radiusSearch (p, radius_, radius_indices, radius_dists) == 0)
+ {
+ PCL_WARN ("[pcl::%s::applyFilter] Searching for neighbors within radius %f failed.\n", getClassName ().c_str (), radius_);
+ continue;
+ }
+
+ // If query point is alone, we retain it regardless
+ if (radius_indices.size () == 1)
+ {
+ point_is_max[(*indices_)[iii]] = false;
+ }
+
+ // Check to see if a neighbor is higher than the query point
+ float query_z = input_->points[(*indices_)[iii]].z;
+ for (size_t k = 1; k < radius_indices.size (); ++k) // k = 1 is the first neighbor
+ {
+ if (input_->points[radius_indices[k]].z > query_z)
+ {
+ // Query point is not the local max, no need to check others
+ point_is_max[(*indices_)[iii]] = false;
+ break;
+ }
+ }
+
+ // If the query point was a local max, all neighbors can be marked as
+ // visited, excluding them from future consideration as local maxima
+ if (point_is_max[(*indices_)[iii]])
+ {
+ for (size_t k = 1; k < radius_indices.size (); ++k) // k = 1 is the first neighbor
+ {
+ point_is_visited[radius_indices[k]] = true;
+ }
+ }
+
+ // Points that are local maxima are passed to removed indices
+ // Unless negative was set, then it's the opposite condition
+ if ((!negative_ && point_is_max[(*indices_)[iii]]) || (negative_ && !point_is_max[(*indices_)[iii]]))
+ {
+ if (extract_removed_indices_)
+ {
+ (*removed_indices_)[rii++] = (*indices_)[iii];
+ }
+
+ continue;
+ }
+
+ // Otherwise it was a normal point for output (inlier)
+ indices[oii++] = (*indices_)[iii];
+ }
+
+ // Resize the output arrays
+ indices.resize (oii);
+ removed_indices_->resize (rii);
+}
+
+#define PCL_INSTANTIATE_LocalMaximum(T) template class PCL_EXPORTS pcl::LocalMaximum<T>;
+
+#endif // PCL_FILTERS_IMPL_LOCAL_MAXIMUM_H_
+
// Copy everything from the input cloud to the output cloud (takes care of all the fields)
copyPointCloud (*input_, output);
- for (int y = 0; y < output.height; ++y)
- for (int x = 0; x < output.width; ++x)
+ int height = static_cast<int> (output.height);
+ int width = static_cast<int> (output.width);
+ for (int y = 0; y < height; ++y)
+ for (int x = 0; x < width; ++x)
if (pcl::isFinite ((*input_)(x, y)))
{
std::vector<float> vals;
for (int y_dev = -window_size_/2; y_dev <= window_size_/2; ++y_dev)
for (int x_dev = -window_size_/2; x_dev <= window_size_/2; ++x_dev)
{
- if (x + x_dev >= 0 && x + x_dev < output.width &&
- y + y_dev >= 0 && y + y_dev < output.height &&
+ if (x + x_dev >= 0 && x + x_dev < width &&
+ y + y_dev >= 0 && y + y_dev < height &&
pcl::isFinite ((*input_)(x+x_dev, y+y_dev)))
vals.push_back ((*input_)(x+x_dev, y+y_dev).z);
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_FILTERS_IMPL_MODEL_OUTLIER_REMOVAL_HPP_
+#define PCL_FILTERS_IMPL_MODEL_OUTLIER_REMOVAL_HPP_
+
+#include <pcl/filters/model_outlier_removal.h>
+#include <pcl/common/io.h>
+#include <pcl/sample_consensus/sac_model_circle.h>
+#include <pcl/sample_consensus/sac_model_cylinder.h>
+#include <pcl/sample_consensus/sac_model_cone.h>
+#include <pcl/sample_consensus/sac_model_line.h>
+#include <pcl/sample_consensus/sac_model_normal_plane.h>
+#include <pcl/sample_consensus/sac_model_normal_sphere.h>
+#include <pcl/sample_consensus/sac_model_parallel_plane.h>
+#include <pcl/sample_consensus/sac_model_normal_parallel_plane.h>
+#include <pcl/sample_consensus/sac_model_parallel_line.h>
+#include <pcl/sample_consensus/sac_model_perpendicular_plane.h>
+#include <pcl/sample_consensus/sac_model_plane.h>
+#include <pcl/sample_consensus/sac_model_sphere.h>
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::ModelOutlierRemoval<PointT>::initSACModel (pcl::SacModel model_type)
+{
+ // Build the model
+ switch (model_type)
+ {
+ case SACMODEL_PLANE:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelPLANE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelPlane<PointT> (input_));
+ break;
+ }
+ case SACMODEL_LINE:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelLINE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelLine<PointT> (input_));
+ break;
+ }
+ case SACMODEL_CIRCLE2D:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelCIRCLE2D\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelCircle2D<PointT> (input_));
+ break;
+ }
+ case SACMODEL_SPHERE:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelSPHERE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelSphere<PointT> (input_));
+ break;
+ }
+ case SACMODEL_PARALLEL_LINE:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelPARALLEL_LINE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelParallelLine<PointT> (input_));
+ break;
+ }
+ case SACMODEL_PERPENDICULAR_PLANE:
+ {
+ PCL_DEBUG ("[pcl::%s::initSACModel] Using a model of type: modelPERPENDICULAR_PLANE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelPerpendicularPlane<PointT> (input_));
+ break;
+ }
+ case SACMODEL_CYLINDER:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelCYLINDER\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelCylinder<PointT, pcl::Normal> (input_));
+ break;
+ }
+ case SACMODEL_NORMAL_PLANE:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelNORMAL_PLANE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelNormalPlane<PointT, pcl::Normal> (input_));
+ break;
+ }
+ case SACMODEL_CONE:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelCONE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelCone<PointT, pcl::Normal> (input_));
+ break;
+ }
+ case SACMODEL_NORMAL_SPHERE:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelNORMAL_SPHERE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelNormalSphere<PointT, pcl::Normal> (input_));
+ break;
+ }
+ case SACMODEL_NORMAL_PARALLEL_PLANE:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelNORMAL_PARALLEL_PLANE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelNormalParallelPlane<PointT, pcl::Normal> (input_));
+ break;
+ }
+ case SACMODEL_PARALLEL_PLANE:
+ {
+ PCL_DEBUG ("[pcl::%s::segment] Using a model of type: modelPARALLEL_PLANE\n", getClassName ().c_str ());
+ model_.reset (new SampleConsensusModelParallelPlane<PointT> (input_));
+ break;
+ }
+ default:
+ {
+ PCL_ERROR ("[pcl::%s::initSACModel] No valid model given!\n", getClassName ().c_str ());
+ return (false);
+ }
+ }
+ return (true);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::ModelOutlierRemoval<PointT>::applyFilter (PointCloud &output)
+{
+ std::vector<int> indices;
+ if (keep_organized_)
+ {
+ bool temp = extract_removed_indices_;
+ extract_removed_indices_ = true;
+ applyFilterIndices (indices);
+ extract_removed_indices_ = temp;
+
+ output = *input_;
+ for (int rii = 0; rii < static_cast<int> (removed_indices_->size ()); ++rii) // rii = removed indices iterator
+ output.points[ (*removed_indices_)[rii]].x = output.points[ (*removed_indices_)[rii]].y = output.points[ (*removed_indices_)[rii]].z = user_filter_value_;
+ if (!pcl_isfinite (user_filter_value_))
+ output.is_dense = false;
+ }
+ else
+ {
+ applyFilterIndices (indices);
+ copyPointCloud (*input_, indices, output);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::ModelOutlierRemoval<PointT>::applyFilterIndices (std::vector<int> &indices)
+{
+ //The arrays to be used
+ indices.resize (indices_->size ());
+ removed_indices_->resize (indices_->size ());
+ int oii = 0, rii = 0; // oii = output indices iterator, rii = removed indices iterator
+ //is the filtersetup correct?
+ bool valid_setup = true;
+
+ valid_setup &= initSACModel (model_type_);
+
+ typedef SampleConsensusModelFromNormals<PointT, pcl::Normal> SACModelFromNormals;
+ // Returns NULL if cast isn't possible
+ SACModelFromNormals *model_from_normals = dynamic_cast<SACModelFromNormals *> (& (*model_));
+
+ if (model_from_normals)
+ {
+ if (!cloud_normals_)
+ {
+ valid_setup = false;
+ PCL_ERROR ("[pcl::ModelOutlierRemoval::applyFilterIndices]: no normals cloud set.\n");
+ }
+ else
+ {
+ model_from_normals->setNormalDistanceWeight (normals_distance_weight_);
+ model_from_normals->setInputNormals (cloud_normals_);
+ }
+ }
+
+ //if the filter setup is invalid filter for nan and return;
+ if (!valid_setup)
+ {
+ for (int iii = 0; iii < static_cast<int> (indices_->size ()); ++iii) // iii = input indices iterator
+ {
+ // Non-finite entries are always passed to removed indices
+ if (!isFinite (input_->points[ (*indices_)[iii]]))
+ {
+ if (extract_removed_indices_)
+ (*removed_indices_)[rii++] = (*indices_)[iii];
+ continue;
+ }
+ indices[oii++] = (*indices_)[iii];
+ }
+ return;
+ }
+ // check distance of pointcloud to model
+ std::vector<double> distances;
+ //TODO: get signed distances !
+ model_->getDistancesToModel (model_coefficients_, distances);
+ bool thresh_result;
+
+ // Filter for non-finite entries and the specified field limits
+ for (int iii = 0; iii < static_cast<int> (indices_->size ()); ++iii) // iii = input indices iterator
+ {
+ // Non-finite entries are always passed to removed indices
+ if (!isFinite (input_->points[ (*indices_)[iii]]))
+ {
+ if (extract_removed_indices_)
+ (*removed_indices_)[rii++] = (*indices_)[iii];
+ continue;
+ }
+
+ // use threshold function to seperate outliers from inliers:
+ thresh_result = threshold_function_ (distances[iii]);
+
+ // in normal mode: define outliers as false thresh_result
+ if (!negative_ && !thresh_result)
+ {
+ if (extract_removed_indices_)
+ (*removed_indices_)[rii++] = (*indices_)[iii];
+ continue;
+ }
+
+ // in negative_ mode: define outliers as true thresh_result
+ if (negative_ && thresh_result)
+ {
+ if (extract_removed_indices_)
+ (*removed_indices_)[rii++] = (*indices_)[iii];
+ continue;
+ }
+
+ // Otherwise it was a normal point for output (inlier)
+ indices[oii++] = (*indices_)[iii];
+
+ }
+
+ // Resize the output arrays
+ indices.resize (oii);
+ removed_indices_->resize (rii);
+
+}
+
+#define PCL_INSTANTIATE_ModelOutlierRemoval(T) template class PCL_EXPORTS pcl::ModelOutlierRemoval<T>;
+
+#endif // PCL_FILTERS_IMPL_MODEL_OUTLIER_REMOVAL_HPP_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_IMPL_MORPHOLOGICAL_FILTER_H_
+#define PCL_FILTERS_IMPL_MORPHOLOGICAL_FILTER_H_
+
+#include <limits>
+#include <vector>
+
+#include <Eigen/Core>
+
+#include <pcl/common/common.h>
+#include <pcl/common/io.h>
+#include <pcl/filters/morphological_filter.h>
+#include <pcl/octree/octree.h>
+
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::applyMorphologicalOperator (const typename pcl::PointCloud<PointT>::ConstPtr &cloud_in,
+ float resolution, const int morphological_operator,
+ pcl::PointCloud<PointT> &cloud_out)
+{
+ if (cloud_in->empty ())
+ return;
+
+ pcl::copyPointCloud<PointT, PointT> (*cloud_in, cloud_out);
+
+ pcl::octree::OctreePointCloudSearch<PointT> tree (resolution);
+
+ tree.setInputCloud (cloud_in);
+ tree.addPointsFromInputCloud ();
+
+ float half_res = resolution / 2.0f;
+
+ switch (morphological_operator)
+ {
+ case MORPH_DILATE:
+ case MORPH_ERODE:
+ {
+ for (size_t p_idx = 0; p_idx < cloud_in->points.size (); ++p_idx)
+ {
+ Eigen::Vector3f bbox_min, bbox_max;
+ std::vector<int> pt_indices;
+ float minx = cloud_in->points[p_idx].x - half_res;
+ float miny = cloud_in->points[p_idx].y - half_res;
+ float minz = -std::numeric_limits<float>::max ();
+ float maxx = cloud_in->points[p_idx].x + half_res;
+ float maxy = cloud_in->points[p_idx].y + half_res;
+ float maxz = std::numeric_limits<float>::max ();
+ bbox_min = Eigen::Vector3f (minx, miny, minz);
+ bbox_max = Eigen::Vector3f (maxx, maxy, maxz);
+ tree.boxSearch (bbox_min, bbox_max, pt_indices);
+
+ if (pt_indices.size () > 0)
+ {
+ Eigen::Vector4f min_pt, max_pt;
+ pcl::getMinMax3D<PointT> (*cloud_in, pt_indices, min_pt, max_pt);
+
+ switch (morphological_operator)
+ {
+ case MORPH_DILATE:
+ {
+ cloud_out.points[p_idx].z = max_pt.z ();
+ break;
+ }
+ case MORPH_ERODE:
+ {
+ cloud_out.points[p_idx].z = min_pt.z ();
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ case MORPH_OPEN:
+ case MORPH_CLOSE:
+ {
+ pcl::PointCloud<PointT> cloud_temp;
+
+ pcl::copyPointCloud<PointT, PointT> (*cloud_in, cloud_temp);
+
+ for (size_t p_idx = 0; p_idx < cloud_temp.points.size (); ++p_idx)
+ {
+ Eigen::Vector3f bbox_min, bbox_max;
+ std::vector<int> pt_indices;
+ float minx = cloud_temp.points[p_idx].x - half_res;
+ float miny = cloud_temp.points[p_idx].y - half_res;
+ float minz = -std::numeric_limits<float>::max ();
+ float maxx = cloud_temp.points[p_idx].x + half_res;
+ float maxy = cloud_temp.points[p_idx].y + half_res;
+ float maxz = std::numeric_limits<float>::max ();
+ bbox_min = Eigen::Vector3f (minx, miny, minz);
+ bbox_max = Eigen::Vector3f (maxx, maxy, maxz);
+ tree.boxSearch (bbox_min, bbox_max, pt_indices);
+
+ if (pt_indices.size () > 0)
+ {
+ Eigen::Vector4f min_pt, max_pt;
+ pcl::getMinMax3D<PointT> (cloud_temp, pt_indices, min_pt, max_pt);
+
+ switch (morphological_operator)
+ {
+ case MORPH_OPEN:
+ {
+ cloud_out.points[p_idx].z = min_pt.z ();
+ break;
+ }
+ case MORPH_CLOSE:
+ {
+ cloud_out.points[p_idx].z = max_pt.z ();
+ break;
+ }
+ }
+ }
+ }
+
+ cloud_temp.swap (cloud_out);
+
+ for (size_t p_idx = 0; p_idx < cloud_temp.points.size (); ++p_idx)
+ {
+ Eigen::Vector3f bbox_min, bbox_max;
+ std::vector<int> pt_indices;
+ float minx = cloud_temp.points[p_idx].x - half_res;
+ float miny = cloud_temp.points[p_idx].y - half_res;
+ float minz = -std::numeric_limits<float>::max ();
+ float maxx = cloud_temp.points[p_idx].x + half_res;
+ float maxy = cloud_temp.points[p_idx].y + half_res;
+ float maxz = std::numeric_limits<float>::max ();
+ bbox_min = Eigen::Vector3f (minx, miny, minz);
+ bbox_max = Eigen::Vector3f (maxx, maxy, maxz);
+ tree.boxSearch (bbox_min, bbox_max, pt_indices);
+
+ if (pt_indices.size () > 0)
+ {
+ Eigen::Vector4f min_pt, max_pt;
+ pcl::getMinMax3D<PointT> (cloud_temp, pt_indices, min_pt, max_pt);
+
+ switch (morphological_operator)
+ {
+ case MORPH_OPEN:
+ default:
+ {
+ cloud_out.points[p_idx].z = max_pt.z ();
+ break;
+ }
+ case MORPH_CLOSE:
+ {
+ cloud_out.points[p_idx].z = min_pt.z ();
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ PCL_ERROR ("Morphological operator is not supported!\n");
+ break;
+ }
+ }
+
+ return;
+}
+
+#define PCL_INSTANTIATE_applyMorphologicalOperator(T) template PCL_EXPORTS void pcl::applyMorphologicalOperator<T> (const pcl::PointCloud<T>::ConstPtr &, float, const int, pcl::PointCloud<T> &);
+
+#endif //#ifndef PCL_FILTERS_IMPL_MORPHOLOGICAL_FILTER_H_
+
// If sample size is 0 or if the sample size is greater then input cloud size then return entire copy of cloud
if (sample_ >= input_->size ())
{
- PCL_ERROR ("[NormalSpaceSampling::initCompute] Requested more samples than the input cloud size: %d vs %zu\n",
+ PCL_ERROR ("[NormalSpaceSampling::initCompute] Requested more samples than the input cloud size: %d vs %lu\n",
sample_, input_->size ());
return false;
}
}
// Inside of the field limits are passed to removed indices if negative was set
- if (negative_ && field_value > filter_limit_min_ && field_value < filter_limit_max_)
+ if (negative_ && field_value >= filter_limit_min_ && field_value <= filter_limit_max_)
{
if (extract_removed_indices_)
(*removed_indices_)[rii++] = (*indices_)[iii];
* @attention untested code
*/
template<typename PointT> void
-pcl::PlaneClipper3D<PointT>::clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const
+pcl::PlaneClipper3D<PointT>::clipPlanarPolygon3D (const std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon, std::vector<PointT, Eigen::aligned_allocator<PointT> >& clipped_polygon) const
{
clipped_polygon.clear ();
clipped_polygon.reserve (polygon.size ());
if (previous_distance > 0)
clipped_polygon.push_back (polygon [0]);
- typename std::vector<PointT>::const_iterator prev_it = polygon.begin ();
+ typename std::vector<PointT, Eigen::aligned_allocator<PointT> >::const_iterator prev_it = polygon.begin ();
- for (typename std::vector<PointT>::const_iterator pIt = prev_it + 1; pIt != polygon.end (); prev_it = pIt++)
+ for (typename std::vector<PointT, Eigen::aligned_allocator<PointT> >::const_iterator pIt = prev_it + 1; pIt != polygon.end (); prev_it = pIt++)
{
// if we intersect plane
float distance = getDistance (*pIt);
* @attention untested code
*/
template<typename PointT> void
-pcl::PlaneClipper3D<PointT>::clipPlanarPolygon3D (std::vector<PointT>& polygon) const
+pcl::PlaneClipper3D<PointT>::clipPlanarPolygon3D (std::vector<PointT, Eigen::aligned_allocator<PointT> > &polygon) const
{
- std::vector<PointT> clipped;
+ std::vector<PointT, Eigen::aligned_allocator<PointT> > clipped;
clipPlanarPolygon3D (polygon, clipped);
polygon = clipped;
}
clipped.push_back (*iIt);
}
}
-#endif //PCL_FILTERS_IMPL_PLANE_CLIPPER3D_HPP
\ No newline at end of file
+#endif //PCL_FILTERS_IMPL_PLANE_CLIPPER3D_HPP
pcl::SamplingSurfaceNormal<PointT>::applyFilter (PointCloud &output)
{
std::vector <int> indices;
- int npts = int (input_->points.size ());
+ size_t npts = input_->points.size ();
for (unsigned int i = 0; i < npts; i++)
indices.push_back (i);
std::vector<int>& indices, PointCloud& output)
{
const int count (last - first);
- if (count <= sample_)
+ if (count <= static_cast<int> (sample_))
{
samplePartition (cloud, first, last, indices, output);
return;
{
pcl::PointCloud <PointT> cloud;
- for (unsigned int i = first; i < last; i++)
+ for (int i = first; i < last; i++)
{
PointT pt;
pt.x = data.points[indices[i]].x;
int64_t dy = static_cast<int64_t>((max_p[1] - min_p[1]) * inverse_leaf_size_[1])+1;
int64_t dz = static_cast<int64_t>((max_p[2] - min_p[2]) * inverse_leaf_size_[2])+1;
- if( (dx*dy*dz) > static_cast<int64_t>(std::numeric_limits<int32_t>::max()) )
+ if ((dx*dy*dz) > static_cast<int64_t>(std::numeric_limits<int32_t>::max()))
{
PCL_WARN("[pcl::%s::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow.", getClassName().c_str());
output = *input_;
// we need to skip all the same, adjacenent idx values
unsigned int total = 0;
unsigned int index = 0;
+ // first_and_last_indices_vector[i] represents the index in index_vector of the first point in
+ // index_vector belonging to the voxel which corresponds to the i-th output point,
+ // and of the first point not belonging to.
+ std::vector<std::pair<unsigned int, unsigned int> > first_and_last_indices_vector;
+ // Worst case size
+ first_and_last_indices_vector.reserve (index_vector.size ());
while (index < index_vector.size ())
{
unsigned int i = index + 1;
while (i < index_vector.size () && index_vector[i].idx == index_vector[index].idx)
++i;
- ++total;
+ if (i - index >= min_points_per_voxel_)
+ {
+ ++total;
+ first_and_last_indices_vector.push_back (std::pair<unsigned int, unsigned int> (index, i));
+ }
index = i;
}
Eigen::VectorXf centroid = Eigen::VectorXf::Zero (centroid_size);
Eigen::VectorXf temporary = Eigen::VectorXf::Zero (centroid_size);
- for (unsigned int cp = 0; cp < index_vector.size ();)
+ for (unsigned int cp = 0; cp < first_and_last_indices_vector.size (); ++cp)
{
// calculate centroid - sum values from all input points, that have the same idx value in index_vector array
+ unsigned int first_index = first_and_last_indices_vector[cp].first;
+ unsigned int last_index = first_and_last_indices_vector[cp].second;
if (!downsample_all_data_)
{
- centroid[0] = input_->points[index_vector[cp].cloud_point_index].x;
- centroid[1] = input_->points[index_vector[cp].cloud_point_index].y;
- centroid[2] = input_->points[index_vector[cp].cloud_point_index].z;
+ centroid[0] = input_->points[index_vector[first_index].cloud_point_index].x;
+ centroid[1] = input_->points[index_vector[first_index].cloud_point_index].y;
+ centroid[2] = input_->points[index_vector[first_index].cloud_point_index].z;
}
else
{
{
// Fill r/g/b data, assuming that the order is BGRA
pcl::RGB rgb;
- memcpy (&rgb, reinterpret_cast<const char*> (&input_->points[index_vector[cp].cloud_point_index]) + rgba_index, sizeof (RGB));
+ memcpy (&rgb, reinterpret_cast<const char*> (&input_->points[index_vector[first_index].cloud_point_index]) + rgba_index, sizeof (RGB));
centroid[centroid_size-3] = rgb.r;
centroid[centroid_size-2] = rgb.g;
centroid[centroid_size-1] = rgb.b;
}
- pcl::for_each_type <FieldList> (NdCopyPointEigenFunctor <PointT> (input_->points[index_vector[cp].cloud_point_index], centroid));
+ pcl::for_each_type <FieldList> (NdCopyPointEigenFunctor <PointT> (input_->points[index_vector[first_index].cloud_point_index], centroid));
}
- unsigned int i = cp + 1;
- while (i < index_vector.size () && index_vector[i].idx == index_vector[cp].idx)
+ for (unsigned int i = first_index + 1; i < last_index; ++i)
{
if (!downsample_all_data_)
{
pcl::for_each_type <FieldList> (NdCopyPointEigenFunctor <PointT> (input_->points[index_vector[i].cloud_point_index], temporary));
centroid += temporary;
}
- ++i;
}
// index is centroid final position in resulting PointCloud
if (save_leaf_layout_)
- leaf_layout_[index_vector[cp].idx] = index;
+ leaf_layout_[index_vector[first_index].idx] = index;
- centroid /= static_cast<float> (i - cp);
+ centroid /= static_cast<float> (last_index - first_index);
// store centroid
// Do we need to process all the fields?
memcpy (reinterpret_cast<char*> (&output.points[index]) + rgba_index, &rgb, sizeof (float));
}
}
- cp = i;
++index;
}
output.width = static_cast<uint32_t> (output.points.size ());
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_LOCAL_MAXIMUM_H_
+#define PCL_FILTERS_LOCAL_MAXIMUM_H_
+
+#include <pcl/filters/filter_indices.h>
+#include <pcl/search/pcl_search.h>
+
+namespace pcl
+{
+ /** \brief LocalMaximum downsamples the cloud, by eliminating points that are locally maximal.
+ *
+ * The LocalMaximum class analyzes each point and removes those that are
+ * found to be locally maximal with respect to their neighbors (found via
+ * radius search). The comparison is made in the z dimension only at this
+ * time.
+ *
+ * \author Bradley J Chambers
+ * \ingroup filters
+ */
+ template <typename PointT>
+ class LocalMaximum: public FilterIndices<PointT>
+ {
+ protected:
+ typedef typename FilterIndices<PointT>::PointCloud PointCloud;
+ typedef typename pcl::search::Search<PointT>::Ptr SearcherPtr;
+
+ public:
+ /** \brief Empty constructor. */
+ LocalMaximum (bool extract_removed_indices = false) :
+ FilterIndices<PointT>::FilterIndices (extract_removed_indices),
+ searcher_ (),
+ radius_ (1)
+ {
+ filter_name_ = "LocalMaximum";
+ }
+
+ /** \brief Set the radius to use to determine if a point is the local max.
+ * \param[in] radius The radius to use to determine if a point is the local max.
+ */
+ inline void
+ setRadius (float radius) { radius_ = radius; }
+
+ /** \brief Get the radius to use to determine if a point is the local max.
+ * \return The radius to use to determine if a point is the local max.
+ */
+ inline float
+ getRadius () const { return (radius_); }
+
+ protected:
+ using PCLBase<PointT>::input_;
+ using PCLBase<PointT>::indices_;
+ using Filter<PointT>::filter_name_;
+ using Filter<PointT>::getClassName;
+ using FilterIndices<PointT>::negative_;
+ using FilterIndices<PointT>::extract_removed_indices_;
+ using FilterIndices<PointT>::removed_indices_;
+
+ /** \brief Downsample a Point Cloud by eliminating points that are locally maximal in z
+ * \param[out] output the resultant point cloud message
+ */
+ void
+ applyFilter (PointCloud &output);
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilter (std::vector<int> &indices)
+ {
+ applyFilterIndices (indices);
+ }
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilterIndices (std::vector<int> &indices);
+
+ private:
+ /** \brief A pointer to the spatial search object. */
+ SearcherPtr searcher_;
+
+ /** \brief The radius to use to determine if a point is the local max. */
+ float radius_;
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/local_maximum.hpp>
+#endif
+
+#endif //#ifndef PCL_FILTERS_LOCAL_MAXIMUM_H_
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_FILTERS_MODEL_OUTLIER_REMOVAL_H_
+#define PCL_FILTERS_MODEL_OUTLIER_REMOVAL_H_
+
+#include <pcl/filters/filter_indices.h>
+#include <pcl/ModelCoefficients.h>
+
+// Sample Consensus models
+#include <pcl/sample_consensus/model_types.h>
+#include <pcl/sample_consensus/sac_model.h>
+
+namespace pcl
+{
+ /** \brief @b ModelOutlierRemoval filters points in a cloud based on the distance between model and point.
+ * \details Iterates through the entire input once, automatically filtering non-finite points and the points outside
+ * the model specified by setSampleConsensusModelPointer() and the threshold specified by setThreholdFunctionPointer().
+ * <br><br>
+ * Usage example:
+ * \code
+ * pcl::ModelCoefficients model_coeff;
+ * model_coeff.values.resize(4);
+ * model_coeff.values[0] = 0; model_coeff.values[1] = 0; model_coeff.values[2] = 1.5; model_coeff.values[3] = 0.5;
+ * pcl::ModelOutlierRemoval<pcl::PointXYZ> filter;
+ * filter.setModelCoefficients (model_coeff);
+ * filter.setThreshold (0.1);
+ * filter.setModelType (pcl::SACMODEL_PLANE);
+ * filter.setInputCloud (*cloud_in);
+ * filter.setFilterLimitsNegative (false);
+ * filter.filter (*cloud_out);
+ * \endcode
+ */
+ template <typename PointT>
+ class ModelOutlierRemoval : public FilterIndices<PointT>
+ {
+ protected:
+ typedef typename FilterIndices<PointT>::PointCloud PointCloud;
+ typedef typename PointCloud::Ptr PointCloudPtr;
+ typedef typename PointCloud::ConstPtr PointCloudConstPtr;
+ typedef typename SampleConsensusModel<PointT>::Ptr SampleConsensusModelPtr;
+
+ public:
+ typedef typename pcl::PointCloud<pcl::Normal>::Ptr PointCloudNPtr;
+ typedef typename pcl::PointCloud<pcl::Normal>::ConstPtr PointCloudNConstPtr;
+
+ /** \brief Constructor.
+ * \param[in] extract_removed_indices Set to true if you want to be able to extract the indices of points being removed (default = false).
+ */
+ inline
+ ModelOutlierRemoval (bool extract_removed_indices = false) :
+ FilterIndices<PointT>::FilterIndices (extract_removed_indices)
+ {
+ thresh_ = 0;
+ normals_distance_weight_ = 0;
+ filter_name_ = "ModelOutlierRemoval";
+ setThresholdFunction (&pcl::ModelOutlierRemoval<PointT>::checkSingleThreshold, *this);
+ }
+
+ /** \brief sets the models coefficients */
+ inline void
+ setModelCoefficients (const pcl::ModelCoefficients model_coefficients)
+ {
+ model_coefficients_.resize (model_coefficients.values.size ());
+ for (unsigned int i = 0; i < model_coefficients.values.size (); i++)
+ {
+ model_coefficients_[i] = model_coefficients.values[i];
+ }
+ }
+
+ /** \brief returns the models coefficients
+ */
+ inline pcl::ModelCoefficients
+ getModelCoefficients () const
+ {
+ pcl::ModelCoefficients mc;
+ mc.values.resize (model_coefficients_.size ());
+ for (unsigned int i = 0; i < mc.values.size (); i++)
+ mc.values[i] = model_coefficients_[i];
+ return (mc);
+ }
+
+ /** \brief Set the type of SAC model used. */
+ inline void
+ setModelType (pcl::SacModel model)
+ {
+ model_type_ = model;
+ }
+
+ /** \brief Get the type of SAC model used. */
+ inline pcl::SacModel
+ getModelType () const
+ {
+ return (model_type_);
+ }
+
+ /** \brief Set the thresholdfunction*/
+ inline void
+ setThreshold (float thresh)
+ {
+ thresh_ = thresh;
+ }
+
+ /** \brief Get the thresholdfunction*/
+ inline float
+ getThreshold () const
+ {
+ return (thresh_);
+ }
+
+ /** \brief Set the normals cloud*/
+ inline void
+ setInputNormals (const PointCloudNConstPtr normals_ptr)
+ {
+ cloud_normals_ = normals_ptr;
+ }
+
+ /** \brief Get the normals cloud*/
+ inline PointCloudNConstPtr
+ getInputNormals () const
+ {
+ return (cloud_normals_);
+ }
+
+ /** \brief Set the normals distance weight*/
+ inline void
+ setNormalDistanceWeight (const double weight)
+ {
+ normals_distance_weight_ = weight;
+ }
+
+ /** \brief get the normal distance weight*/
+ inline double
+ getNormalDistanceWeight () const
+ {
+ return (normals_distance_weight_);
+ }
+
+ /** \brief Register a different threshold function
+ * \param[in] pointer to a threshold function
+ */
+ void
+ setThresholdFunction (boost::function<bool (double)> thresh)
+ {
+ threshold_function_ = thresh;
+ }
+
+ /** \brief Register a different threshold function
+ * \param[in] pointer to a threshold function
+ * \param[in] instance
+ */
+ template <typename T> void
+ setThresholdFunction (bool (T::*thresh_function) (double), T& instance)
+ {
+ setThresholdFunction (boost::bind (thresh_function, boost::ref (instance), _1));
+ }
+
+ protected:
+ using PCLBase<PointT>::input_;
+ using PCLBase<PointT>::indices_;
+ using Filter<PointT>::filter_name_;
+ using Filter<PointT>::getClassName;
+ using FilterIndices<PointT>::negative_;
+ using FilterIndices<PointT>::keep_organized_;
+ using FilterIndices<PointT>::user_filter_value_;
+ using FilterIndices<PointT>::extract_removed_indices_;
+ using FilterIndices<PointT>::removed_indices_;
+
+ /** \brief Filtered results are stored in a separate point cloud.
+ * \param[out] output The resultant point cloud.
+ */
+ void
+ applyFilter (PointCloud &output);
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilter (std::vector<int> &indices)
+ {
+ applyFilterIndices (indices);
+ }
+
+ /** \brief Filtered results are indexed by an indices array.
+ * \param[out] indices The resultant indices.
+ */
+ void
+ applyFilterIndices (std::vector<int> &indices);
+
+ protected:
+ double normals_distance_weight_;
+ PointCloudNConstPtr cloud_normals_;
+
+ /** \brief The model used to calculate distances */
+ SampleConsensusModelPtr model_;
+
+ /** \brief The threshold used to seperate outliers (removed_indices) from inliers (indices) */
+ float thresh_;
+
+ /** \brief The model coefficients */
+ Eigen::VectorXf model_coefficients_;
+
+ /** \brief The type of model to use (user given parameter). */
+ pcl::SacModel model_type_;
+ boost::function<bool (double)> threshold_function_;
+
+ inline bool
+ checkSingleThreshold (double value)
+ {
+ return (value < thresh_);
+ }
+
+ private:
+ virtual bool
+ initSACModel (pcl::SacModel model_type);
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/model_outlier_removal.hpp>
+#endif
+
+#endif // PCL_FILTERS_MODEL_OUTLIER_REMOVAL_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_FILTERS_MORPHOLOGICAL_FILTER_H_
+#define PCL_FILTERS_MORPHOLOGICAL_FILTER_H_
+
+#include <string>
+#include <pcl/pcl_base.h>
+#include <pcl/PointIndices.h>
+#include <pcl/conversions.h>
+#include <locale>
+
+namespace pcl
+{
+ enum MorphologicalOperators
+ {
+ MORPH_OPEN,
+ MORPH_CLOSE,
+ MORPH_DILATE,
+ MORPH_ERODE
+ };
+}
+
+namespace pcl
+{
+ /** \brief Apply morphological operator to the z dimension of the input point cloud
+ * \param[in] cloud_in the input point cloud dataset
+ * \param[in] resolution the window size to be used for the morphological operation
+ * \param[in] morphological_operator the morphological operator to apply (open, close, dilate, erode)
+ * \param[out] cloud_out the resultant output point cloud dataset
+ * \ingroup filters
+ */
+ template <typename PointT> PCL_EXPORTS void
+ applyMorphologicalOperator (const typename pcl::PointCloud<PointT>::ConstPtr &cloud_in,
+ float resolution, const int morphological_operator,
+ pcl::PointCloud<PointT> &cloud_out);
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/morphological_filter.hpp>
+#endif
+
+#endif //#ifndef PCL_FILTERS_MORPHOLOGICAL_FILTER_H_
+
clipLineSegment3D (PointT& from, PointT& to) const;
virtual void
- clipPlanarPolygon3D (std::vector<PointT>& polygon) const;
+ clipPlanarPolygon3D (std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon) const;
virtual void
- clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const;
+ clipPlanarPolygon3D (const std::vector<PointT, Eigen::aligned_allocator<PointT> >& polygon, std::vector<PointT, Eigen::aligned_allocator<PointT> >& clipped_polygon) const;
virtual void
clipPointCloud3D (const pcl::PointCloud<PointT> &cloud_in, std::vector<int>& clipped, const std::vector<int>& indices = std::vector<int> ()) const;
};
}
-#ifdef PCL_NO_PRECOMPILE
#include <pcl/filters/impl/plane_clipper3D.hpp>
-#endif
#endif // PCL_PLANE_CLIPPER3D_H_
/** \brief Get the number of neighbors that need to be present in order to be classified as an inlier.
* \details The number of points within setRadiusSearch() from the query point will need to be equal or greater
* than this number in order to be classified as an inlier point (i.e. will not be filtered).
- * \param min_pts The minimum number of neighbors (default = 1).
+ * \return The minimum number of neighbors (default = 1).
*/
inline int
getMinNeighborsInRadius ()
getNormals () const { return (input_normals_); }
/** \brief Set the threshold for shadow points rejection
- * \param[in] thresold the threshold
+ * \param[in] threshold the threshold
*/
inline void
setThreshold (float threshold) { threshold_ = threshold; }
/** \brief Get the standard deviation multiplier for the distance threshold calculation.
* \details The distance threshold will be equal to: mean + stddev_mult * stddev.
* Points will be classified as inlier or outlier if their average neighbor distance is below or above this threshold respectively.
- * \param[in] stddev_mult The standard deviation multiplier.
*/
inline double
getStddevMulThresh ()
filter_field_name_ (""),
filter_limit_min_ (-FLT_MAX),
filter_limit_max_ (FLT_MAX),
- filter_limit_negative_ (false)
+ filter_limit_negative_ (false),
+ min_points_per_voxel_ (0)
{
filter_name_ = "VoxelGrid";
}
inline bool
getDownsampleAllData () { return (downsample_all_data_); }
+ /** \brief Set the minimum number of points required for a voxel to be used.
+ * \param[in] min_points_per_voxel the minimum number of points for required for a voxel to be used
+ */
+ inline void
+ setMinimumPointsNumberPerVoxel (unsigned int min_points_per_voxel) { min_points_per_voxel_ = min_points_per_voxel; }
+
+ /** \brief Return the minimum number of points required for a voxel to be used.
+ */
+ inline unsigned int
+ getMinimumPointsNumberPerVoxel () { return min_points_per_voxel_; }
+
/** \brief Set to true if leaf layout information needs to be saved for later access.
* \param[in] save_leaf_layout the new value (true/false)
*/
/** \brief Set to true if we want to return the data outside (\a filter_limit_min_;\a filter_limit_max_). Default: false. */
bool filter_limit_negative_;
+ /** \brief Minimum number of points per voxel for the centroid to be computed */
+ unsigned int min_points_per_voxel_;
+
typedef typename pcl::traits::fieldList<PointT>::type FieldList;
/** \brief Downsample a Point Cloud using a voxelized grid approach
filter_field_name_ (""),
filter_limit_min_ (-FLT_MAX),
filter_limit_max_ (FLT_MAX),
- filter_limit_negative_ (false)
+ filter_limit_negative_ (false),
+ min_points_per_voxel_ (0)
{
filter_name_ = "VoxelGrid";
}
inline bool
getDownsampleAllData () { return (downsample_all_data_); }
+ /** \brief Set the minimum number of points required for a voxel to be used.
+ * \param[in] min_points_per_voxel the minimum number of points for required for a voxel to be used
+ */
+ inline void
+ setMinimumPointsNumberPerVoxel (unsigned int min_points_per_voxel) { min_points_per_voxel_ = min_points_per_voxel; }
+
+ /** \brief Return the minimum number of points required for a voxel to be used.
+ */
+ inline unsigned int
+ getMinimumPointsNumberPerVoxel () { return min_points_per_voxel_; }
+
/** \brief Set to true if leaf layout information needs to be saved for later access.
* \param[in] save_leaf_layout the new value (true/false)
*/
/** \brief Set to true if we want to return the data outside (\a filter_limit_min_;\a filter_limit_max_). Default: false. */
bool filter_limit_negative_;
+ /** \brief Minimum number of points per voxel for the centroid to be computed */
+ unsigned int min_points_per_voxel_;
+
/** \brief Downsample a Point Cloud using a voxelized grid approach
* \param[out] output the resultant point cloud
*/
}
/** \brief Set the minimum allowable ratio between eigenvalues to prevent singular covariance matrices.
- * \param[in] min_points_per_voxel the minimum allowable ratio between eigenvalues
+ * \param[in] min_covar_eigvalue_mult the minimum allowable ratio between eigenvalues
*/
inline void
setCovEigValueInflationRatio (double min_covar_eigvalue_mult)
/** \brief Get a cloud to visualize each voxels normal distribution.
- * \param[out] a cloud created by sampling the normal distributions of each voxel
+ * \param[out] cell_cloud a cloud created by sampling the normal distributions of each voxel
*/
void
getDisplayCloud (pcl::PointCloud<PointXYZ>& cell_cloud);
/** \brief Search for the k-nearest occupied voxels for the given query point.
* \note Only voxels containing a sufficient number of points are used.
- * \param[in] point the given query point
+ * \param[in] cloud the given query point
+ * \param[in] index the index
* \param[in] k the number of neighbors to search for
* \param[out] k_leaves the resultant leaves of the neighboring points
* \param[out] k_sqr_distances the resultant squared distances to the neighboring points
* \param[in] radius the radius of the sphere bounding all of p_q's neighbors
* \param[out] k_leaves the resultant leaves of the neighboring points
* \param[out] k_sqr_distances the resultant squared distances to the neighboring points
+ * \param[in] max_nn
* \return number of neighbors found
*/
int
* \param[in] radius the radius of the sphere bounding all of p_q's neighbors
* \param[out] k_leaves the resultant leaves of the neighboring points
* \param[out] k_sqr_distances the resultant squared distances to the neighboring points
+ * \param[in] max_nn
* \return number of neighbors found
*/
inline int
/** \brief Returns the state (free = 0, occluded = 1) of the voxel
* after utilizing a ray traversal algorithm to a target voxel
* in (i, j, k) coordinates.
- * \param[out] The state of the voxel.
- * \param[in] The target voxel coordinate (i, j, k) of the voxel.
+ * \param[out] out_state The state of the voxel.
+ * \param[in] in_target_voxel The target voxel coordinate (i, j, k) of the voxel.
+ * \return the state (free = 0, occluded = 1) of the voxel
*/
int
occlusionEstimation (int& out_state,
* in (i, j, k) coordinates. Additionally, this function returns
* the voxels penetrated of the ray-traversal algorithm till reaching
* the target voxel.
- * \param[out] The state of the voxel.
- * \param[out] The voxels penetrated of the ray-traversal algorithm.
- * \param[in] The target voxel coordinate (i, j, k) of the voxel.
+ * \param[out] out_state The state of the voxel.
+ * \param[out] out_ray The voxels penetrated of the ray-traversal algorithm.
+ * \param[in] in_target_voxel The target voxel coordinate (i, j, k) of the voxel.
+ * \return the state (free = 0, occluded = 1) of the voxel
*/
int
occlusionEstimation (int& out_state,
/** \brief Returns the voxel coordinates (i, j, k) of all occluded
* voxels in the voxel gird.
- * \param[out] the coordinates (i, j, k) of all occluded voxels
+ * \param[out] occluded_voxels the coordinates (i, j, k) of all occluded voxels
+ * \return the voxel coordinates (i, j, k)
*/
int
occlusionEstimationAll (std::vector<Eigen::Vector3i>& occluded_voxels);
/** \brief Returns the voxel grid filtered point cloud
- * \param[out] The voxel grid filtered point cloud
+ * \return The voxel grid filtered point cloud
*/
inline PointCloud
getFilteredPointCloud () { return filtered_cloud_; }
/** \brief Returns the corresponding centroid (x,y,z) coordinates
* in the grid of voxel (i,j,k).
- * \param[in] the coordinate (i, j, k) of the voxel
+ * \param[in] ijk the coordinate (i, j, k) of the voxel
* \return the (x,y,z) coordinate of the voxel centroid
*/
inline Eigen::Vector4f
/** \brief Returns the scaling value (tmin) were the ray intersects with the
* voxel grid bounding box. (p_entry = origin + tmin * orientation)
- * \param[in] The sensor origin
- * \param[in] The sensor orientation
+ * \param[in] origin The sensor origin
+ * \param[in] direction The sensor orientation
* \return the scaling value
*/
float
/** \brief Returns the state of the target voxel (0 = visible, 1 = occupied)
* unsing a ray traversal algorithm.
- * \param[in] The target voxel in the voxel grid with coordinate (i, j, k).
- * \param[in] The sensor origin.
- * \param[in] The sensor orientation
- * \param[in] The scaling value (tmin).
+ * \param[in] target_voxel The target voxel in the voxel grid with coordinate (i, j, k).
+ * \param[in] origin The sensor origin.
+ * \param[in] direction The sensor orientation
+ * \param[in] t_min The scaling value (tmin).
* \return The estimated voxel state.
*/
int
/** \brief Returns the state of the target voxel (0 = visible, 1 = occupied) and
* the voxels penetrated by the ray unsing a ray traversal algorithm.
- * \param[out] The voxels penetrated by the ray in (i, j, k) coordinates
- * \param[in] The target voxel in the voxel grid with coordinate (i, j, k).
- * \param[in] The sensor origin.
- * \param[in] The sensor orientation
- * \param[in] The scaling value (tmin).
+ * \param[out] out_ray The voxels penetrated by the ray in (i, j, k) coordinates
+ * \param[in] target_voxel The target voxel in the voxel grid with coordinate (i, j, k).
+ * \param[in] origin The sensor origin.
+ * \param[in] direction The sensor orientation
+ * \param[in] t_min The scaling value (tmin).
* \return The estimated voxel state.
*/
int
const float t_min);
/** \brief Returns a rounded value.
- * \param[in] value
+ * \param[in] d
* \return rounded value
*/
inline float
};
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/filters/impl/voxel_grid_occlusion_estimation.hpp>
+#endif
+
#endif //#ifndef PCL_FILTERS_VOXEL_GRID_OCCLUSION_ESTIMATION_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/filters/impl/grid_minimum.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+
+// Instantiations of specific point types
+PCL_INSTANTIATE(GridMinimum, PCL_XYZ_POINT_TYPES)
+
+#endif // PCL_NO_PRECOMPILE
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/filters/impl/local_maximum.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE(LocalMaximum, (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA))
+#else
+ PCL_INSTANTIATE(LocalMaximum, PCL_XYZ_POINT_TYPES)
+#endif
+
+#endif // PCL_NO_PRECOMPILE
+
#include <pcl/point_types.h>
#include <pcl/impl/instantiate.hpp>
-PCL_INSTANTIATE (MedianFilter, (pcl::PointXYZ)(pcl::PointXYZRGB)(pcl::PointXYZRGBA)(pcl::PointXYZRGBNormal))
+PCL_INSTANTIATE (MedianFilter, PCL_XYZ_POINT_TYPES)
#endif // PCL_NO_PRECOMPILE
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pcl/filters/impl/model_outlier_removal.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
+
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE (ModelOutlierRemoval, (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointXYZRGB))
+#else
+ PCL_INSTANTIATE (ModelOutlierRemoval, PCL_XYZ_POINT_TYPES)
+#endif
+
+#endif // PCL_NO_PRECOMPILE
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/filters/impl/morphological_filter.hpp>
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
+
+// Instantiations of specific point types
+PCL_INSTANTIATE(applyMorphologicalOperator, PCL_XYZ_POINT_TYPES)
+
+#endif // PCL_NO_PRECOMPILE
+
set(SUBSYS_DEPS common)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/line_iterator.h
- include/pcl/${SUBSYS_NAME}/mesh_base.h
- include/pcl/${SUBSYS_NAME}/mesh_circulators.h
- include/pcl/${SUBSYS_NAME}/mesh_conversion.h
- include/pcl/${SUBSYS_NAME}/mesh_elements.h
- include/pcl/${SUBSYS_NAME}/mesh_indices.h
- include/pcl/${SUBSYS_NAME}/mesh_io.h
- include/pcl/${SUBSYS_NAME}/mesh_traits.h
- include/pcl/${SUBSYS_NAME}/organized_index_iterator.h
- include/pcl/${SUBSYS_NAME}/planar_polygon.h
- include/pcl/${SUBSYS_NAME}/polygon_operations.h
- include/pcl/${SUBSYS_NAME}/polygon_mesh.h
- include/pcl/${SUBSYS_NAME}/triangle_mesh.h
- include/pcl/${SUBSYS_NAME}/quad_mesh.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/get_boundary.h"
+ "include/pcl/${SUBSYS_NAME}/line_iterator.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_base.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_circulators.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_conversion.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_elements.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_indices.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_io.h"
+ "include/pcl/${SUBSYS_NAME}/mesh_traits.h"
+ "include/pcl/${SUBSYS_NAME}/organized_index_iterator.h"
+ "include/pcl/${SUBSYS_NAME}/planar_polygon.h"
+ "include/pcl/${SUBSYS_NAME}/polygon_mesh.h"
+ "include/pcl/${SUBSYS_NAME}/polygon_operations.h"
+ "include/pcl/${SUBSYS_NAME}/quad_mesh.h"
+ "include/pcl/${SUBSYS_NAME}/triangle_mesh.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/polygon_operations.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/polygon_operations.hpp"
)
# set(srcs
# src/geometry.cpp
# )
-set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
-# PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
-# target_link_libraries(${LIB_NAME} pcl_common)
-PCL_MAKE_PKGCONFIG_HEADER_ONLY(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "")
+set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+# PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+# target_link_libraries("${LIB_NAME}" pcl_common)
+ PCL_MAKE_PKGCONFIG_HEADER_ONLY("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
return (this->isBoundary (idx_face, boost::integral_constant <bool, CheckVerticesT> ()));
}
- /** \brief Check if the given face lies on the boundary. This method uses isBoundary <true> which checks if any vertex lies on the boundary. */
+ /** \brief Check if the given face lies on the boundary. This method uses isBoundary \c true which checks if any vertex lies on the boundary. */
inline bool
isBoundary (const FaceIndex& idx_face) const
{
/** \brief Check if the half-edge bc is the next half-edge of ab.
* \param[in] idx_he_ab Index to the half-edge between the vertices a and b.
- * \param[in] idx_ha_bc Index to the half-edge between the vertices b and c.
+ * \param[in] idx_he_bc Index to the half-edge between the vertices b and c.
* \param[in] is_new_ab Half-edge ab is new.
* \param[in] is_new_bc Half-edge bc is new.
* \param[out] make_adjacent_ab_bc Half-edges ab and bc need to be made adjacent.
/** \brief Make the half-edges bc the next half-edge of ab.
* \param[in] idx_he_ab Index to the half-edge between the vertices a and b.
- * \param[in] idx_ha_bc Index to the half-edge between the vertices b and c.
+ * \param[in] idx_he_bc Index to the half-edge between the vertices b and c.
* \param[in, out] idx_free_half_edge Free half-edge needed to re-connect the half-edges around vertex b.
*/
void
////////////////////////////////////////////////////////////////////////
/** \brief Removes mesh elements and data that are marked as deleted from the container.
- * \IndexContainerT e.g. std::vector <VertexIndex>
- * \ElementContainerT e.g. std::vector <Vertex>
- * \DataContainerT e.g. std::vector <VertexData>
- * \HasDataT Integral constant specifying if the mesh has data associated with the elements.
+ * \param IndexContainerT e.g. std::vector \<VertexIndex\>
+ * \param ElementContainerT e.g. std::vector \<Vertex\>
+ * \param DataContainerT e.g. std::vector \<VertexData\>
+ * \param HasDataT Integral constant specifying if the mesh has data associated with the elements.
* \param[in, out] elements Container for the mesh elements. Resized to the new size.
* \param[in, out] data_cloud Container for the mesh data. Resized to the new size.
* \return Container with the same size as the old input data. Holds the indices to the new elements for each non-deleted element and an invalid index if it is deleted.
/** \brief Resize the mesh data. */
template <class DataCloudT> inline void
- resizeData (DataCloudT& data_cloud, const size_t n, const typename DataCloudT::value_type& data, boost::true_type /*has_data*/) const
+ resizeData (DataCloudT& /*data_cloud*/, const size_t n, const typename DataCloudT::value_type& data, boost::true_type /*has_data*/) const
{
data.resize (n, data);
}
}
/** \brief Convert the given edge index to a half-edge index.
+ * \param index
* \param[in] get_first The first half-edge of the edge is returned if this variable is true; elsewise the second.
*/
inline pcl::geometry::HalfEdgeIndex
namespace geometry
{
/** \brief No data is associated with the vertices / half-edges / edges / faces. */
- struct NoData {};
+ struct NoData
+ {
+#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 1101
+ operator unsigned char() const
+ {
+ return 0;
+ }
+#endif
+ };
/** \brief The mesh traits are used to set up compile time settings for the mesh.
* \tparam VertexDataT Data stored for each vertex. Defaults to pcl::NoData.
* \param [in] polygon input polygon
* \param [out] approx_polygon approximate polygon
* \param [in] threshold maximum allowed distance of an input vertex to an output edge
+ * \param refine
* \param [in] closed whether it is a closed polygon or a polyline
* \author Suat Gedikli <gedikli@willowgarage.com>
*/
set(SUBSYS_DEPS common octree)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
if(WIN32)
- PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni vtk)
+ PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 pcap png vtk)
else(WIN32)
- PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni vtk libusb-1.0)
+ PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 pcap png vtk libusb-1.0)
endif(WIN32)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
+ set(IMAGE_INCLUDES
+ include/pcl/io/image_metadata_wrapper.h
+ include/pcl/io/image.h
+ include/pcl/io/image_rgb24.h
+ include/pcl/io/image_yuv422.h
+ include/pcl/io/image_ir.h
+ include/pcl/io/image_depth.h
+ )
+
+ set(IMAGE_SOURCES
+ src/image_rgb24.cpp
+ src/image_yuv422.cpp
+ src/image_ir.cpp
+ src/image_depth.cpp
+ )
+
+ ## OpenNI 2.x
+ OPTION(BUILD_OPENNI2 "Build the OpenNI 2 Grabber." OFF)
+ MARK_AS_ADVANCED(BUILD_OPENNI2)
+ if(NOT BUILD_OPENNI2)
+ # Set OPENNI2_FOUND to false locally to avoid building anything OpenNI 2 related
+ # Remember that other modules (libraries) need to check explicitly for BUILD_OPENNI2
+ set(OPENNI2_FOUND FALSE)
+ endif()
+ if(OPENNI2_FOUND)
+ set(OPENNI2_GRABBER_INCLUDES
+ include/pcl/io/openni2_grabber.h
+ )
+ set(OPENNI2_INCLUDES
+ include/pcl/io/openni2/openni.h
+ include/pcl/io/openni2/openni2_metadata_wrapper.h
+ include/pcl/io/openni2/openni2_frame_listener.h
+ include/pcl/io/openni2/openni2_timer_filter.h
+ include/pcl/io/openni2/openni2_video_mode.h
+ include/pcl/io/openni2/openni2_convert.h
+ include/pcl/io/openni2/openni2_device.h
+ include/pcl/io/openni2/openni2_device_info.h
+ include/pcl/io/openni2/openni2_device_manager.h
+ )
+
+ set(OPENNI2_GRABBER_SOURCES
+ src/openni2_grabber.cpp
+ src/openni2/openni2_timer_filter.cpp
+ src/openni2/openni2_video_mode.cpp
+ src/openni2/openni2_convert.cpp
+ src/openni2/openni2_device.cpp
+ src/openni2/openni2_device_info.cpp
+ src/openni2/openni2_device_manager.cpp
+ )
+
+ source_group("OpenNI 2\\Header Files" FILES ${OPENNI2_GRABBER_INCLUDES} ${OPENNI2_INCLUDES} ${IMAGE_INCLUDES})
+ source_group("OpenNI 2\\Source Files" FILES ${OPENNI2_GRABBER_SOURCES} ${IMAGE_SOURCES})
+
+ # Copy OpenNI2 redist directory to bin. Needed for driver modules. Only tested on Windows.
+ if(MSVC)
+ file(COPY ${OPENNI2_REDIST_DIR} DESTINATION ${CMAKE_BINARY_DIR}/bin PATTERN *.*)
+ endif(MSVC)
+ endif(OPENNI2_FOUND)
+
+ ## OpenNI 1.x
OPTION(BUILD_OPENNI "Build the OpenNI Grabber." ON)
MARK_AS_ADVANCED(BUILD_OPENNI)
if(NOT BUILD_OPENNI)
# Set OPENNI_FOUND to false locally to avoid building anything OpenNI related
# Remember that other modules (libraries) need to check explicitly for BUILD_OPENNI
- set(OPENNI_FOUND FALSE)
+ set(OPENNI_FOUND FALSE)
endif()
if(OPENNI_FOUND)
set(OPENNI_GRABBER_INCLUDES
include/pcl/io/openni_camera/openni_image_yuv_422.h
include/pcl/io/openni_camera/openni_image_rgb24.h
include/pcl/io/openni_camera/openni_ir_image.h
- )
- set(OPENNI_GRABBER_SOURCES src/openni_camera/openni_device.cpp
+ ${IMAGE_INCLUDES}
+ )
+ set(OPENNI_GRABBER_SOURCES
+ src/openni_camera/openni_device.cpp
src/openni_camera/openni_device_primesense.cpp
src/openni_camera/openni_image_bayer_grbg.cpp
src/openni_camera/openni_depth_image.cpp
src/openni_camera/openni_image_rgb24.cpp
src/openni_grabber.cpp
src/oni_grabber.cpp
- )
+ ${IMAGE_SOURCES}
+ )
endif(OPENNI_FOUND)
+ source_group("Image Headers" FILES ${IMAGE_INCLUDES})
+ source_group("Image Sources" FILES ${IMAGE_SOURCES})
+
if(FZAPI_FOUND)
set(FZAPI_GRABBER_INCLUDES
include/pcl/io/fotonic_grabber.h
# set(FZAPI_INCLUDES
# include/pcl/io/openni_camera/openni.h
# )
- set(FZAPI_GRABBER_SOURCES
+ set(FZAPI_GRABBER_SOURCES
src/fotonic_grabber.cpp
)
endif(FZAPI_FOUND)
-
+
if(PXCAPI_FOUND)
set(PXC_GRABBER_INCLUDES
include/pcl/io/pxc_grabber.h
src/pxc_grabber.cpp
)
endif(PXCAPI_FOUND)
-
+
if(LIBUSB_1_FOUND)
set(DINAST_GRABBER_INCLUDES
include/pcl/io/dinast_grabber.h
endif(LIBUSB_1_FOUND)
if (VTK_FOUND AND NOT ANDROID)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
- set(VTK_IO_INCLUDES
- include/pcl/${SUBSYS_NAME}/vtk_lib_io.h
- include/pcl/${SUBSYS_NAME}/png_io.h
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
+ set(VTK_IO_INCLUDES
+ "include/pcl/${SUBSYS_NAME}/vtk_lib_io.h"
+ "include/pcl/${SUBSYS_NAME}/png_io.h"
)
set(VTK_IO_INCLUDES_IMPL
- include/pcl/${SUBSYS_NAME}/impl/vtk_lib_io.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/vtk_lib_io.hpp"
)
- set(VTK_IO_SOURCE
+ set(VTK_IO_SOURCE
src/vtk_lib_io.cpp
src/png_io.cpp
)
endif ()
set(PLY_SOURCES src/ply/ply_parser.cpp)
- set(PLY_INCLUDES
- include/pcl/${SUBSYS_NAME}/ply/byte_order.h
- include/pcl/${SUBSYS_NAME}/ply/io_operators.h
- include/pcl/${SUBSYS_NAME}/ply/ply.h
- include/pcl/${SUBSYS_NAME}/ply/ply_parser.h
+ set(PLY_INCLUDES
+ "include/pcl/${SUBSYS_NAME}/ply/byte_order.h"
+ "include/pcl/${SUBSYS_NAME}/ply/io_operators.h"
+ "include/pcl/${SUBSYS_NAME}/ply/ply.h"
+ "include/pcl/${SUBSYS_NAME}/ply/ply_parser.h"
)
- PCL_ADD_LIBRARY(pcl_io_ply ${SUBSYS_NAME} ${PLY_SOURCES} ${PLY_INCLUDES})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/ply ${PLY_INCLUDES})
+ PCL_ADD_LIBRARY(pcl_io_ply "${SUBSYS_NAME}" ${PLY_SOURCES} ${PLY_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/ply" ${PLY_INCLUDES})
- set(srcs
+ set(srcs
src/debayer.cpp
src/pcd_grabber.cpp
src/pcd_io.cpp
src/lzf.cpp
src/lzf_image_io.cpp
src/obj_io.cpp
+ src/ifs_io.cpp
src/image_grabber.cpp
src/hdl_grabber.cpp
src/robot_eye_grabber.cpp
+ src/file_io.cpp
+ src/io_exception.cpp
${VTK_IO_SOURCE}
${OPENNI_GRABBER_SOURCES}
+ ${OPENNI2_GRABBER_SOURCES}
+ ${IMAGE_SOURCES}
${DINAST_GRABBER_SOURCES}
${FZAPI_GRABBER_SOURCES}
- ${PXC_GRABBER_SOURCES}
+ ${PXC_GRABBER_SOURCES}
)
if(PNG_FOUND)
- set(srcs
- ${srcs}
+ list(APPEND srcs
src/libpng_wrapper.cpp
)
endif(PNG_FOUND)
add_definitions(${PCAP_DEFINES})
endif(PCAP_FOUND)
- set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/debayer.h
- include/pcl/${SUBSYS_NAME}/file_io.h
- include/pcl/${SUBSYS_NAME}/lzf.h
- include/pcl/${SUBSYS_NAME}/lzf_image_io.h
- include/pcl/${SUBSYS_NAME}/io.h
- include/pcl/${SUBSYS_NAME}/grabber.h
- include/pcl/${SUBSYS_NAME}/file_grabber.h
- include/pcl/${SUBSYS_NAME}/pcd_grabber.h
- include/pcl/${SUBSYS_NAME}/pcd_io.h
- include/pcl/${SUBSYS_NAME}/vtk_io.h
- include/pcl/${SUBSYS_NAME}/ply_io.h
- include/pcl/${SUBSYS_NAME}/tar.h
- include/pcl/${SUBSYS_NAME}/obj_io.h
- include/pcl/${SUBSYS_NAME}/ascii_io.h
- include/pcl/${SUBSYS_NAME}/image_grabber.h
- include/pcl/${SUBSYS_NAME}/hdl_grabber.h
- include/pcl/${SUBSYS_NAME}/robot_eye_grabber.h
- include/pcl/${SUBSYS_NAME}/point_cloud_image_extractors.h
+ set(incs
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/debayer.h"
+ "include/pcl/${SUBSYS_NAME}/file_io.h"
+ "include/pcl/${SUBSYS_NAME}/lzf.h"
+ "include/pcl/${SUBSYS_NAME}/lzf_image_io.h"
+ "include/pcl/${SUBSYS_NAME}/io.h"
+ "include/pcl/${SUBSYS_NAME}/grabber.h"
+ "include/pcl/${SUBSYS_NAME}/file_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/pcd_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/pcd_io.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_io.h"
+ "include/pcl/${SUBSYS_NAME}/ply_io.h"
+ "include/pcl/${SUBSYS_NAME}/tar.h"
+ "include/pcl/${SUBSYS_NAME}/obj_io.h"
+ "include/pcl/${SUBSYS_NAME}/ascii_io.h"
+ "include/pcl/${SUBSYS_NAME}/ifs_io.h"
+ "include/pcl/${SUBSYS_NAME}/image_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/hdl_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/robot_eye_grabber.h"
+ "include/pcl/${SUBSYS_NAME}/point_cloud_image_extractors.h"
+ "include/pcl/${SUBSYS_NAME}/io_exception.h"
${VTK_IO_INCLUDES}
${OPENNI_GRABBER_INCLUDES}
+ ${OPENNI2_GRABBER_INCLUDES}
+ ${IMAGE_INCLUDES}
${DINAST_GRABBER_INCLUDES}
${FZAPI_GRABBER_INCLUDES}
- ${PXC_GRABBER_INCLUDES}
+ ${PXC_GRABBER_INCLUDES}
)
set(compression_incs
include/pcl/compression/point_coding.h
)
if(PNG_FOUND)
- set(compression_incs
- ${compression_incs}
+ list(APPEND compression_incs
include/pcl/compression/organized_pointcloud_conversion.h
include/pcl/compression/libpng_wrapper.h
)
- if(OPENNI_FOUND)
- set(compression_incs
- ${compression_incs}
+ if(OPENNI_FOUND OR OPENNI2_FOUND)
+ list(APPEND compression_incs
include/pcl/compression/organized_pointcloud_compression.h
)
- endif(OPENNI_FOUND)
+ endif(OPENNI_FOUND OR OPENNI2_FOUND)
endif(PNG_FOUND)
- set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/pcd_io.hpp
- include/pcl/${SUBSYS_NAME}/impl/lzf_image_io.hpp
- include/pcl/${SUBSYS_NAME}/impl/synchronized_queue.hpp
- include/pcl/${SUBSYS_NAME}/impl/point_cloud_image_extractors.hpp
+ set(impl_incs
+ "include/pcl/${SUBSYS_NAME}/impl/pcd_io.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/lzf_image_io.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/synchronized_queue.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/point_cloud_image_extractors.hpp"
include/pcl/compression/impl/entropy_range_coder.hpp
include/pcl/compression/impl/octree_pointcloud_compression.hpp
${VTK_IO_INCLUDES_IMPL}
)
- if(PNG_FOUND AND OPENNI_FOUND)
- set(impl_incs
- ${impl_incs}
+ if(PNG_FOUND AND (OPENNI_FOUND OR OPENNI2_FOUND) )
+ list(APPEND impl_incs
include/pcl/compression/impl/organized_pointcloud_compression.hpp
)
- endif(PNG_FOUND AND OPENNI_FOUND)
+ endif(PNG_FOUND AND (OPENNI_FOUND OR OPENNI2_FOUND) )
- set(LIB_NAME pcl_${SUBSYS_NAME})
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${VTK_INCLUDE_DIRECTORIES})
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include" ${VTK_INCLUDE_DIRECTORIES})
add_definitions(${VTK_DEFINES})
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${compression_incs} ${impl_incs} ${OPENNI_INCLUDES})
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${compression_incs} ${impl_incs} ${OPENNI_INCLUDES} ${OPENNI2_INCLUDES})
link_directories(${VTK_LINK_DIRECTORIES})
- target_link_libraries(${LIB_NAME} pcl_common pcl_io_ply ${VTK_IO_TARGET_LINK_LIBRARIES} )
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_io_ply ${VTK_LIBRARIES} )
if(PNG_FOUND)
- target_link_libraries(${LIB_NAME} ${PNG_LIBRARY})
+ target_link_libraries("${LIB_NAME}" "${PNG_LIBRARY}")
endif(PNG_FOUND)
if(LIBUSB_1_FOUND)
- target_link_libraries(${LIB_NAME} ${LIBUSB_1_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" ${LIBUSB_1_LIBRARIES})
endif(LIBUSB_1_FOUND)
+ if(OPENNI2_FOUND)
+ target_link_libraries(${LIB_NAME} ${OPENNI2_LIBRARIES})
+ endif(OPENNI2_FOUND)
+
if(OPENNI_FOUND)
- target_link_libraries(${LIB_NAME} ${OPENNI_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" ${OPENNI_LIBRARIES})
endif(OPENNI_FOUND)
-
+
if(FZAPI_FOUND)
- target_link_libraries(${LIB_NAME} ${FZAPI_LIBS})
+ target_link_libraries("${LIB_NAME}" ${FZAPI_LIBS})
if(WIN32)
- target_link_libraries(${LIB_NAME} Version.lib)
+ target_link_libraries("${LIB_NAME}" Version.lib)
endif(WIN32)
endif(FZAPI_FOUND)
-
+
if(PXCAPI_FOUND)
link_directories(${PXCAPI_LIB_DIRS})
- target_link_libraries(${LIB_NAME} ${PXCAPI_LIBS})
+ target_link_libraries("${LIB_NAME}" ${PXCAPI_LIBS})
endif(PXCAPI_FOUND)
-
+
if (PCAP_FOUND)
- target_link_libraries(${LIB_NAME} ${PCAP_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" ${PCAP_LIBRARIES})
endif(PCAP_FOUND)
set(EXT_DEPS eigen3)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+
+ if(OPENNI_FOUND)
+ list(APPEND EXT_DEPS openni-dev)
+ endif(OPENNI_FOUND)
+ if(OPENNI2_FOUND)
+ list(APPEND EXT_DEPS openni2-dev)
+ endif(OPENNI2_FOUND)
+
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "${EXT_DEPS}" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} compression ${compression_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/openni_camera ${OPENNI_INCLUDES})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
-
- add_subdirectory(tools)
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" compression ${compression_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/openni_camera" ${OPENNI_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/openni2" ${OPENNI2_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
+
+ if(BUILD_tools)
+ add_subdirectory(tools)
+ endif(BUILD_tools)
endif(build)
{
uint32_t cloud_width;
uint32_t cloud_height;
- float maxDepth, focalLength, disparityShift, disparityScale;
+ float maxDepth;
+ float focalLength;
+ float disparityShift = 0.0f;
+ float disparityScale;
// disparity and rgb image data
std::vector<uint16_t> disparityData;
* \param[in] image_arg input image data
* \param[in] width_arg image width
* \param[in] height_arg image height
- * \param[out] pngData PNG compressed image data
+ * \param[out] pngData_arg PNG compressed image data
* \param[in] png_level_arg zLib compression level (default level: -1)
* \ingroup io
*/
* \param[in] image_arg input image data
* \param[in] width_arg image width
* \param[in] height_arg image height
- * \param[out] pngData PNG compressed image data
+ * \param[out] pngData_arg PNG compressed image data
* \param[in] png_level_arg zLib compression level (default level: -1)
* \ingroup io
*/
* \param[in] image_arg input image data
* \param[in] width_arg image width
* \param[in] height_arg image height
- * \param[out] pngData PNG compressed image data
+ * \param[out] pngData_arg PNG compressed image data
* \param[in] png_level_arg zLib compression level (default level: -1)
* \ingroup io
*/
* \param[in] image_arg input image data
* \param[in] width_arg image width
* \param[in] height_arg image height
- * \param[out] pngData PNG compressed image data
+ * \param[out] pngData_arg PNG compressed image data
* \param[in] png_level_arg zLib compression level (default level: -1)
* \ingroup io
*/
int png_level_arg = -1);
/** \brief Decode compressed PNG to 8-bit image
- * \param[in] pngData PNG compressed input data
- * \param[in] imageData image output data
- * \param[out] width image width
- * \param[out] height image height
- * \param[out] channels number of channels
+ * \param[in] pngData_arg PNG compressed input data
+ * \param[in] imageData_arg image output data
+ * \param[out] width_arg image width
+ * \param[out] heigh_argt image height
+ * \param[out] channels_arg number of channels
* \ingroup io
*/
PCL_EXPORTS void
unsigned int& channels_arg);
/** \brief Decode compressed PNG to 16-bit image
- * \param[in] pngData PNG compressed input data
- * \param[in] imageData image output data
- * \param[out] width image width
- * \param[out] height image height
- * \param[out] channels number of channels
+ * \param[in] pngData_arg PNG compressed input data
+ * \param[in] imageData_arg image output data
+ * \param[out] width_arg image width
+ * \param[out] height_arg image height
+ * \param[out] channels_arg number of channels
* \ingroup io
*/
PCL_EXPORTS void
serializeTreeCallback (LeafT &leaf_arg, const OctreeKey& key_arg);
/** \brief Decode leaf nodes information during deserialization
- * \param leaf_arg: reference to new leaf node
- * \param key_arg: octree key of new leaf node
+ * \param key_arg octree key of new leaf node
*/
+ // param leaf_arg reference to new leaf node
virtual void
deserializeTreeCallback (LeafT&, const OctreeKey& key_arg);
/** \brief Encode raw disparity map and color image.
* \note Default values are configured according to the kinect/asus device specifications
* \param[in] disparityMap_arg: pointer to raw 16-bit disparity map
- * \param[in] disparityMap_arg: pointer to raw 8-bit rgb color image
+ * \param[in] colorImage_arg: pointer to raw 8-bit rgb color image
* \param[in] width_arg: width of disparity map/color image
* \param[in] height_arg: height of disparity map/color image
* \param[out] compressedDataOut_arg: binary output stream containing compressed data
#include <boost/mpl/vector.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/chrono.hpp>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
#include <boost/shared_array.hpp>
#if BOOST_VERSION >= 104900
#include <boost/interprocess/permissions.hpp>
#endif
+#include <boost/iostreams/device/mapped_file.hpp>
#define BOOST_PARAMETER_MAX_ARITY 7
#include <boost/signals2.hpp>
#include <boost/signals2/slot.hpp>
/** \brief Send a RX data packet request
* \param[in] req_code the request to send (the request field for the setup packet)
+ * \param buffer
* \param[in] length the length field for the setup packet. The data buffer should be at least this size.
*/
bool
/** \brief Send a TX data packet request
* \param[in] req_code the request to send (the request field for the setup packet)
+ * \param buffer
* \param[in] length the length field for the setup packet. The data buffer should be at least this size.
*/
bool
readImage ();
/** \brief Obtains XYZI Point Cloud from the image of the camera
- * \param[out] the point cloud from the image data
+ * \return the point cloud from the image data
*/
pcl::PointCloud<pcl::PointXYZI>::Ptr
getXYZIPointCloud ();
#include <pcl/io/boost.h>
#include <cmath>
#include <sstream>
+#include <pcl/PolygonMesh.h>
+#include <pcl/TextureMesh.h>
namespace pcl
{
cloud.fields[field_idx].offset +
fields_count * sizeof (uint8_t)], reinterpret_cast<char*> (&value), sizeof (uint8_t));
}
+
+ namespace io
+ {
+ /** \brief Load a file into a PointCloud2 according to extension.
+ * \param[in] file_name the name of the file to load
+ * \param[out] blob the resultant pcl::PointCloud2 blob
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ load (const std::string& file_name, pcl::PCLPointCloud2& blob);
+
+ /** \brief Load a file into a template PointCloud type according to extension.
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \ingroup io
+ */
+ template<typename PointT> int
+ load (const std::string& file_name, pcl::PointCloud<PointT>& cloud);
+
+ /** \brief Load a file into a PolygonMesh according to extension.
+ * \param[in] file_name the name of the file to load
+ * \param[out] mesh the resultant pcl::PolygonMesh
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ load (const std::string& file_name, pcl::PolygonMesh& mesh);
+
+ /** \brief Load a file into a TextureMesh according to extension.
+ * \param[in] file_name the name of the file to load
+ * \param[out] mesh the resultant pcl::TextureMesh
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ load (const std::string& file_name, pcl::TextureMesh& mesh);
+
+ /** \brief Save point cloud data to a binary file when available else to ASCII.
+ * \param[in] file_name the output file name
+ * \param[in] blob the point cloud data message
+ * \param[in] precision float precision when saving to ASCII files
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ save (const std::string& file_name, const pcl::PCLPointCloud2& blob, unsigned precision = 5);
+
+ /** \brief Save point cloud to a binary file when available else to ASCII.
+ * \param[in] file_name the output file name
+ * \param[in] cloud the point cloud
+ * \param[in] precision float precision when saving to ASCII files
+ * \ingroup io
+ */
+ template<typename PointT> int
+ save (const std::string& file_name, const pcl::PointCloud<PointT>& cloud, unsigned precision = 5);
+
+ /** \brief Saves a TextureMesh to a binary file when available else to ASCII.
+ * \param[in] file_name the name of the file to write to disk
+ * \param[in] tex_mesh the texture mesh to save
+ * \param[in] precision float precision when saving to ASCII files
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ save (const std::string &file_name, const pcl::TextureMesh &tex_mesh, unsigned precision = 5);
+
+ /** \brief Saves a PolygonMesh to a binary file when available else to ASCII.
+ * \param[in] file_name the name of the file to write to disk
+ * \param[in] mesh the polygonal mesh to save
+ * \param[in] precision float precision when saving to ASCII files
+ * \ingroup io
+ */
+ PCL_EXPORTS int
+ save (const std::string &file_name, const pcl::PolygonMesh &mesh, unsigned precision = 5);
+ }
}
#endif //#ifndef PCL_IO_FILE_IO_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_IO_IFS_IO_H_
+#define PCL_IO_IFS_IO_H_
+
+#include <pcl/point_cloud.h>
+#include <pcl/PCLPointCloud2.h>
+#include <pcl/conversions.h>
+#include <pcl/io/boost.h>
+#include <pcl/PolygonMesh.h>
+
+namespace pcl
+{
+ /** \brief Indexed Face set (IFS) file format reader. This file format is used for
+ * the Brown Mesh Set for instance.
+ * \author Nizar Sallem
+ * \ingroup io
+ */
+ class PCL_EXPORTS IFSReader
+ {
+ public:
+ /** Empty constructor */
+ IFSReader () {}
+ /** Empty destructor */
+ ~IFSReader () {}
+
+ /** \brief we support two versions
+ * 1.0 classic
+ * 1.1 with texture coordinates addon
+ */
+ enum
+ {
+ IFS_V1_0 = 0,
+ IFS_V1_1 = 1
+ };
+
+ /** \brief Read a point cloud data header from an IFS file.
+ *
+ * Load only the meta information (number of points, their types, etc),
+ * and not the points themselves, from a given IFS file. Useful for fast
+ * evaluation of the underlying data structure.
+ *
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant point cloud dataset (only header will be filled)
+ * \param[out] ifs_version the IFS version of the file (IFS_V1_0 or IFS_V1_1)
+ * \param[out] data_idx the offset of cloud data within the file
+ *
+ * \return
+ * * < 0 (-1) on error
+ * * == 0 on success
+ */
+ int
+ readHeader (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ int &ifs_version, unsigned int &data_idx);
+
+ /** \brief Read a point cloud data from an IFS file and store it into a pcl/PCLPointCloud2.
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PCLPointCloud2 blob read from disk
+ * \param[out] ifs_version the IFS version of the file (either IFS_V1_0 or IFS_V1_1)
+ *
+ * \return
+ * * < 0 (-1) on error
+ * * == 0 on success
+ */
+ int
+ read (const std::string &file_name, pcl::PCLPointCloud2 &cloud, int &ifs_version);
+
+ /** \brief Read a point cloud data from an IFS file and store it into a PolygonMesh.
+ * \param[in] file_name the name of the file containing the mesh data
+ * \param[out] mesh the resultant PolygonMesh
+ * \param[out] ifs_version the IFS version of the file (either IFS_V1_0 or IFS_V1_1)
+ *
+ * \return
+ * * < 0 (-1) on error
+ * * == 0 on success
+ */
+ int
+ read (const std::string &file_name, pcl::PolygonMesh &mesh, int &ifs_version);
+
+ /** \brief Read a point cloud data from an IFS file, and convert it to the
+ * given template pcl::PointCloud format.
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PointCloud message read from disk
+ *
+ * \return
+ * * < 0 (-1) on error
+ * * == 0 on success
+ */
+ template<typename PointT> int
+ read (const std::string &file_name, pcl::PointCloud<PointT> &cloud)
+ {
+ pcl::PCLPointCloud2 blob;
+ int ifs_version;
+ cloud.sensor_origin_ = Eigen::Vector4f::Zero ();
+ cloud.sensor_orientation_ = Eigen::Quaternionf::Identity ();
+ int res = read (file_name, blob, ifs_version);
+
+ // If no error, convert the data
+ if (res == 0)
+ pcl::fromPCLPointCloud2 (blob, cloud);
+ return (res);
+ }
+ };
+
+ /** \brief Point Cloud Data (IFS) file format writer.
+ * \author Nizar Sallem
+ * \ingroup io
+ */
+ class PCL_EXPORTS IFSWriter
+ {
+ public:
+ IFSWriter() {}
+ ~IFSWriter() {}
+
+ /** \brief Save point cloud data to an IFS file containing 3D points.
+ * \param[in] file_name the output file name
+ * \param[in] cloud the point cloud data
+ * \param[in] cloud_name the point cloud name to be stored inside the IFS file.
+ *
+ * \return
+ * * 0 on success
+ * * < 0 on error
+ */
+ int
+ write (const std::string &file_name, const pcl::PCLPointCloud2 &cloud,
+ const std::string &cloud_name = "cloud");
+
+ /** \brief Save point cloud data to an IFS file containing 3D points.
+ * \param[in] file_name the output file name
+ * \param[in] cloud the point cloud
+ * \param[in] cloud_name the point cloud name to be stored inside the IFS file.
+ *
+ * \return
+ * * 0 on success
+ * * < 0 on error
+ */
+ template<typename PointT> int
+ write (const std::string &file_name, const pcl::PointCloud<PointT> &cloud,
+ const std::string &cloud_name = "cloud")
+ {
+ pcl::PCLPointCloud2 blob;
+ pcl::fromPCLPointCloud2<PointT> (blob, cloud);
+ return (write (file_name, blob, cloud_name));
+ }
+ };
+
+ namespace io
+ {
+ /** \brief Load an IFS file into a PCLPointCloud2 blob type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ loadIFSFile (const std::string &file_name, pcl::PCLPointCloud2 &cloud)
+ {
+ pcl::IFSReader p;
+ int ifs_version;
+ return (p.read (file_name, cloud, ifs_version));
+ }
+
+ /** \brief Load any IFS file into a templated PointCloud type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ template<typename PointT> inline int
+ loadIFSFile (const std::string &file_name, pcl::PointCloud<PointT> &cloud)
+ {
+ pcl::IFSReader p;
+ return (p.read<PointT> (file_name, cloud));
+ }
+
+ /** \brief Load any IFS file into a PolygonMesh type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] mesh the resultant mesh
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ loadIFSFile (const std::string &file_name, pcl::PolygonMesh &mesh)
+ {
+ pcl::IFSReader p;
+ int ifs_version;
+ return (p.read (file_name, mesh, ifs_version));
+ }
+
+ /** \brief Save point cloud data to an IFS file containing 3D points
+ * \param[in] file_name the output file name
+ * \param[in] cloud the point cloud data message
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ saveIFSFile (const std::string &file_name, const pcl::PCLPointCloud2 &cloud)
+ {
+ pcl::IFSWriter w;
+ return (w.write (file_name, cloud));
+ }
+
+ /** \brief Save point cloud data to an IFS file containing 3D points
+ * \param[in] file_name the output file name
+ * \param[in] cloud the point cloud
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ template<typename PointT> int
+ saveIFSFile (const std::string &file_name, const pcl::PointCloud<PointT> &cloud)
+ {
+ pcl::IFSWriter w;
+ return (w.write<PointT> (file_name, cloud));
+ }
+ }
+}
+
+#endif //#ifndef PCL_IO_IFS_IO_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <pcl/pcl_config.h>
+#ifndef PCL_IO_IMAGE_H_
+#define PCL_IO_IMAGE_H_
+
+#include <pcl/pcl_exports.h>
+#include <pcl/io/boost.h>
+#include <boost/chrono.hpp>
+
+#include <pcl/io/image_metadata_wrapper.h>
+
+namespace pcl
+{
+ namespace io
+ {
+
+ /**
+ * @brief Image interface class providing an interface to fill a RGB or Grayscale image buffer.
+ * @param[in] image_metadata
+ * @ingroup io
+ */
+ class PCL_EXPORTS Image
+ {
+ public:
+ typedef boost::shared_ptr<Image> Ptr;
+ typedef boost::shared_ptr<const Image> ConstPtr;
+
+ typedef boost::chrono::high_resolution_clock Clock;
+ typedef boost::chrono::high_resolution_clock::time_point Timestamp;
+
+ typedef enum
+ {
+ BAYER_GRBG,
+ YUV422,
+ RGB
+ } Encoding;
+
+ Image (FrameWrapper::Ptr image_metadata)
+ : wrapper_ (image_metadata)
+ , timestamp_ (Clock::now ())
+ {}
+
+ Image (FrameWrapper::Ptr image_metadata, Timestamp time)
+ : wrapper_ (image_metadata)
+ , timestamp_ (time)
+ {}
+
+ /**
+ * @brief virtual Destructor that never throws an exception.
+ */
+ inline virtual ~Image ()
+ {}
+
+ /**
+ * @param[in] input_width width of input image
+ * @param[in] input_height height of input image
+ * @param[in] output_width width of desired output image
+ * @param[in] output_height height of desired output image
+ * @return wheter the resizing is supported or not.
+ */
+ virtual bool
+ isResizingSupported (unsigned input_width, unsigned input_height,
+ unsigned output_width, unsigned output_height) const = 0;
+
+ /**
+ * @brief fills a user given buffer with the RGB values, with an optional nearest-neighbor down sampling and an optional subregion
+ * @param[in] width desired width of output image.
+ * @param[in] height desired height of output image.
+ * @param[in,out] rgb_buffer the output RGB buffer.
+ * @param[in] rgb_line_step optional line step in bytes to allow the output in a rectangular subregion of the output buffer.
+ */
+ virtual void
+ fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step = 0) const = 0;
+
+ /**
+ * @brief returns the encoding of the native data.
+ * @return encoding
+ */
+ virtual Encoding
+ getEncoding () const = 0;
+
+ /**
+ * @brief fills a user given buffer with the raw values.
+ * @param[in,out] rgb_buffer
+ */
+ virtual void
+ fillRaw (unsigned char* rgb_buffer) const
+ {
+ memcpy (rgb_buffer, wrapper_->getData (), wrapper_->getDataSize ());
+ }
+
+ /**
+ * @brief fills a user given buffer with the gray values, with an optional nearest-neighbor down sampling and an optional subregion
+ * @param[in] width desired width of output image.
+ * @param[in] height desired height of output image.
+ * @param[in,out] gray_buffer the output gray buffer.
+ * @param[in] gray_line_step optional line step in bytes to allow the output in a rectangular subregion of the output buffer.
+ */
+ virtual void
+ fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer,
+ unsigned gray_line_step = 0) const = 0;
+
+ /**
+ * @return width of the image
+ */
+ unsigned
+ getWidth () const
+ {
+ return (wrapper_->getWidth ());
+ }
+
+ /**
+ * @return height of the image
+ */
+ unsigned
+ getHeight () const
+ {
+ return (wrapper_->getHeight ());
+ }
+
+ /**
+ * @return frame id of the image.
+ * @note frame ids are ascending, but not necessarily synchronized with other streams
+ */
+ unsigned
+ getFrameID () const
+ {
+ return (wrapper_->getFrameID ());
+ }
+
+ /**
+ * @return the timestamp of the image
+ * @note the time value is not synchronized with the system time
+ */
+ pcl::uint64_t
+ getTimestamp () const
+ {
+ return (wrapper_->getTimestamp ());
+ }
+
+
+ /**
+ * @return the timestamp of the image
+ * @note the time value *is* synchronized with the system time.
+ */
+ Timestamp
+ getSystemTimestamp () const
+ {
+ return (timestamp_);
+ }
+
+ // Get a const pointer to the raw depth buffer
+ const void*
+ getData ()
+ {
+ return (wrapper_->getData ());
+ }
+
+ // Data buffer size in bytes
+ int
+ getDataSize () const
+ {
+ return (wrapper_->getDataSize ());
+ }
+
+ // Size of each row, including any padding
+ inline unsigned
+ getStep() const
+ {
+ return (getDataSize() / getHeight());
+ }
+
+ protected:
+ FrameWrapper::Ptr wrapper_;
+ Timestamp timestamp_;
+ };
+
+ } // namespace
+}
+
+#endif //PCL_IO_IMAGE_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2011 Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#pragma once
+#include <pcl/pcl_config.h>
+
+#ifndef PCL_IO_IMAGE_DEPTH_H_
+#define PCL_IO_IMAGE_DEPTH_H_
+
+#include <pcl/pcl_exports.h>
+#include <pcl/io/boost.h>
+#include <boost/chrono.hpp>
+
+#include<pcl/io/image_metadata_wrapper.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ /** \brief This class provides methods to fill a depth or disparity image.
+ */
+ class PCL_EXPORTS DepthImage
+ {
+ public:
+ typedef boost::shared_ptr<DepthImage> Ptr;
+ typedef boost::shared_ptr<const DepthImage> ConstPtr;
+
+ typedef boost::chrono::high_resolution_clock Clock;
+ typedef boost::chrono::high_resolution_clock::time_point Timestamp;
+
+ /** \brief Constructor
+ * \param[in] depth_meta_data the actual data from the OpenNI library
+ * \param[in] baseline the baseline of the "stereo" camera, i.e. the distance between the projector and the IR camera for
+ * Primesense like cameras. e.g. 7.5cm for PSDK5 and PSDK6 reference design.
+ * \param[in] focal_length focal length of the "stereo" frame.
+ * \param[in] shadow_value defines which values in the depth data are indicating shadow (resulting from the parallax between projector and IR camera)
+ * \param[in] no_sample_value defines which values in the depth data are indicating that no depth (disparity) could be determined .
+ * \attention The focal length may change, depending whether the depth stream is registered/mapped to the RGB stream or not.
+ */
+ DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, pcl::uint64_t shadow_value, pcl::uint64_t no_sample_value);
+ DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, pcl::uint64_t shadow_value, pcl::uint64_t no_sample_value, Timestamp time);
+
+ /** \brief Destructor. Never throws an exception. */
+ ~DepthImage ();
+
+ /** \brief method to access the internal data structure from OpenNI. If the data is accessed just read-only, then this method is faster than a fillXXX method
+ * \return the actual depth data of type openni::VideoFrameRef.
+ */
+ const FrameWrapper::Ptr
+ getMetaData () const;
+
+ /** \brief fills a user given block of memory with the disparity values with additional nearest-neighbor down-scaling.
+ * \param[in] width the width of the desired disparity image.
+ * \param[in] height the height of the desired disparity image.
+ * \param[in,out] disparity_buffer the float pointer to the actual memory buffer to be filled with the disparity values.
+ * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
+ * width in bytes (not floats) of the original width of the depth buffer.
+ */
+ void
+ fillDisparityImage (unsigned width, unsigned height, float* disparity_buffer, unsigned line_step = 0) const;
+
+ /** \brief fills a user given block of memory with the disparity values with additional nearest-neighbor down-scaling.
+ * \param[in] width width the width of the desired depth image.
+ * \param[in] height height the height of the desired depth image.
+ * \param[in,out] depth_buffer the float pointer to the actual memory buffer to be filled with the depth values.
+ * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
+ * width in bytes (not floats) of the original width of the depth buffer.
+ */
+ void
+ fillDepthImage (unsigned width, unsigned height, float* depth_buffer, unsigned line_step = 0) const;
+
+ /** \brief fills a user given block of memory with the raw values with additional nearest-neighbor down-scaling.
+ * \param[in] width width the width of the desired raw image.
+ * \param[in] height height the height of the desired raw image.
+ * \param[in,out] depth_buffer the unsigned short pointer to the actual memory buffer to be filled with the raw values.
+ * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
+ * width in bytes (not floats) of the original width of the depth buffer.
+ */
+ void
+ fillDepthImageRaw (unsigned width, unsigned height, unsigned short* depth_buffer, unsigned line_step = 0) const;
+
+ /** \brief method to access the baseline of the "stereo" frame that was used to retrieve the depth image.
+ * \return baseline in meters
+ */
+ float
+ getBaseline () const;
+
+ /** \brief method to access the focal length of the "stereo" frame that was used to retrieve the depth image.
+ * \return focal length in pixels
+ */
+ float
+ getFocalLength () const;
+
+ /** \brief method to access the shadow value, that indicates pixels lying in shadow in the depth image.
+ * \return shadow value
+ */
+ pcl::uint64_t
+ getShadowValue () const;
+
+ /** \brief method to access the no-sample value, that indicates pixels where no disparity could be determined for the depth image.
+ * \return no-sample value
+ */
+ pcl::uint64_t
+ getNoSampleValue () const;
+
+ /** \return the width of the depth image */
+ unsigned
+ getWidth () const;
+
+ /** \return the height of the depth image */
+ unsigned
+ getHeight () const;
+
+ /** \return an ascending id for the depth frame
+ * \attention not necessarily synchronized with other streams
+ */
+ unsigned
+ getFrameID () const;
+
+ /** \return a ascending timestamp for the depth frame
+ * \attention its not the system time, thus can not be used directly to synchronize different sensors.
+ * But definitely synchronized with other streams
+ */
+ pcl::uint64_t
+ getTimestamp () const;
+
+ Timestamp
+ getSystemTimestamp () const;
+
+ // Get a const pointer to the raw depth buffer
+ const unsigned short*
+ getData ();
+
+ // Data buffer size in bytes
+ int
+ getDataSize () const;
+
+ // Size of each row, including any padding
+ inline unsigned
+ getStep() const
+ {
+ return (getDataSize() / getHeight());
+ }
+
+ protected:
+ pcl::io::FrameWrapper::Ptr wrapper_;
+
+ float baseline_;
+ float focal_length_;
+ pcl::uint64_t shadow_value_;
+ pcl::uint64_t no_sample_value_;
+ Timestamp timestamp_;
+ };
+
+}} // namespace
+
+#endif // PCL_IO_IMAGE_DEPTH_H_
* \param[in] directory Directory which contains an ordered set of images corresponding to an [RGB]D video, stored as TIFF, PNG, JPG, or PPM files. The naming convention is: frame_[timestamp]_["depth"/"rgb"].[extension]
* \param[in] frames_per_second frames per second. If 0, start() functions like a trigger, publishing the next PCD in the list.
* \param[in] repeat whether to play PCD file in an endless loop or not.
+ * \param pclzf_mode
*/
ImageGrabberBase (const std::string& directory, float frames_per_second, bool repeat, bool pclzf_mode);
/** \brief Query only the timestamp of an index, if it exists */
bool
- getTimestampAtIndex (size_t idx, uint64_t ×tamp) const;
+ getTimestampAtIndex (size_t idx, pcl::uint64_t ×tamp) const;
/** \brief Manually set RGB image files.
* \param[in] rgb_image_files A vector of [tiff/png/jpg/ppm] files to use as input. There must be a 1-to-1 correspondence between these and the depth images you set
const double principal_point_x,
const double principal_point_y);
- /** \brief Get the current focal length and center pixel. If the intrinsics have been manually set with @setCameraIntrinsics@, this will return those values. Else, if start () has been called and the grabber has found a frame_[timestamp].xml file, this will return the most recent values read. Else, returns factory defaults.
+ /** \brief Get the current focal length and center pixel. If the intrinsics have been manually set with setCameraIntrinsics, this will return those values. Else, if start () has been called and the grabber has found a frame_[timestamp].xml file, this will return the most recent values read. Else, returns factory defaults.
* \param[out] focal_length_x Horizontal focal length (fx)
* \param[out] focal_length_y Vertical focal length (fy)
* \param[out] principal_point_x Horizontal coordinates of the principal point (cx)
setNumberOfThreads (unsigned int nr_threads = 0);
protected:
- /** \brief Convenience function to see how many frames this consists of */
+ /** \brief Convenience function to see how many frames this consists of
+ */
size_t
numFrames () const;
--- /dev/null
+/*
+* Software License Agreement (BSD License)
+*
+* Copyright (c) 2011 Willow Garage, Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of the copyright holder(s) nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+#ifndef PCL_IO_IMAGE_IR_H_
+#define PCL_IO_IMAGE_IR_H_
+
+#include <pcl/pcl_macros.h>
+#include <pcl/io/boost.h>
+
+#include <pcl/io/image_metadata_wrapper.h>
+
+namespace pcl
+{
+ namespace io
+ {
+
+ /**
+ * @brief Class containing just a reference to IR meta data.
+ */
+ class PCL_EXPORTS IRImage
+ {
+ public:
+ typedef boost::shared_ptr<IRImage> Ptr;
+ typedef boost::shared_ptr<const IRImage> ConstPtr;
+
+ typedef boost::chrono::high_resolution_clock Clock;
+ typedef boost::chrono::high_resolution_clock::time_point Timestamp;
+
+ IRImage (FrameWrapper::Ptr ir_metadata);
+ IRImage (FrameWrapper::Ptr ir_metadata, Timestamp time);
+
+ ~IRImage () throw ()
+ {}
+
+ void
+ fillRaw (unsigned width, unsigned height, unsigned short* ir_buffer, unsigned line_step = 0) const;
+
+ unsigned
+ getWidth () const;
+
+ unsigned
+ getHeight () const;
+
+ unsigned
+ getFrameID () const;
+
+ pcl::uint64_t
+ getTimestamp () const;
+
+ Timestamp
+ getSystemTimestamp () const;
+
+ // Get a const pointer to the raw depth buffer. If the data is accessed just read-only, then this method is faster than a fillXXX method
+ const unsigned short*
+ getData ();
+
+ // Data buffer size in bytes
+ int
+ getDataSize () const;
+
+ // Size of each row, including any padding
+ inline unsigned
+ getStep() const
+ {
+ return (getDataSize() / getHeight());
+ }
+
+ /** \brief method to access the internal data structure wrapper, which needs to be cast to an
+ * approperate subclass before the getMetadata(..) function is available to access the native data type.
+ */
+ const FrameWrapper::Ptr
+ getMetaData () const;
+
+ protected:
+ FrameWrapper::Ptr wrapper_;
+ Timestamp timestamp_;
+ };
+
+ } // namespace
+}
+
+#endif // PCL_IO_IMAGE_IR_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, respective authors.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#pragma once
+#ifndef PCL_IO_IMAGE_METADATA_WRAPPER_H_
+#define PCL_IO_IMAGE_METADATA_WRAPPER_H_
+
+#include <pcl/pcl_config.h>
+#include <pcl/pcl_macros.h>
+
+namespace pcl
+{
+ namespace io
+ {
+
+ /**
+ * Pure abstract interface to wrap native frame data types.
+ */
+ class FrameWrapper
+ {
+ public:
+ typedef boost::shared_ptr<FrameWrapper> Ptr;
+
+ virtual const void*
+ getData () const = 0;
+
+ virtual unsigned
+ getDataSize () const = 0;
+
+ virtual unsigned
+ getWidth () const = 0;
+
+ virtual unsigned
+ getHeight () const = 0;
+
+ virtual unsigned
+ getFrameID () const = 0;
+
+ // Microseconds from some arbitrary start point
+ virtual pcl::uint64_t
+ getTimestamp () const = 0;
+ };
+
+ } // namespace
+}
+
+#endif // PCL_IO_IMAGE_METADATA_WRAPPER_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <pcl/pcl_config.h>
+
+#ifndef PCL_IO_IMAGE_RGB_H_
+#define PCL_IO_IMAGE_RGB_H_
+
+#include <pcl/pcl_macros.h>
+#include <boost/chrono.hpp>
+
+#include <pcl/io/image.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ /**
+ * @brief This class provides methods to fill a RGB or Grayscale image buffer from underlying RGB24 image.
+ * @ingroup io
+ */
+ class PCL_EXPORTS ImageRGB24 : public pcl::io::Image
+ {
+ public:
+
+ ImageRGB24 (FrameWrapper::Ptr image_metadata);
+ ImageRGB24 (FrameWrapper::Ptr image_metadata, Timestamp timestamp);
+ virtual ~ImageRGB24 () throw ();
+
+ inline virtual Encoding
+ getEncoding () const
+ {
+ return (RGB);
+ }
+
+ virtual void
+ fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step = 0) const;
+
+ virtual void
+ fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step = 0) const;
+
+ virtual bool
+ isResizingSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const;
+
+ private:
+
+ // Struct used for type conversion
+ typedef struct
+ {
+ uint8_t r;
+ uint8_t g;
+ uint8_t b;
+ } RGB888Pixel;
+ };
+
+ } // namespace
+}
+
+#endif // PCL_IO_IMAGE_RGB_H_
--- /dev/null
+/*
+* Software License Agreement (BSD License)
+*
+* Copyright (c) 2011 Willow Garage, Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of the copyright holder(s) nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+#include <pcl/pcl_config.h>
+
+#ifndef PCL_IO_IMAGE_YUV422_H_
+#define PCL_IO_IMAGE_YUV422_H_
+#include <pcl/pcl_macros.h>
+
+#include <pcl/io/image.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ /**
+ * @brief Concrete implementation of the interface Image for a YUV 422 image used by Primesense devices.
+ * @ingroup io
+ */
+ class PCL_EXPORTS ImageYUV422 : public pcl::io::Image
+ {
+ public:
+ ImageYUV422 (FrameWrapper::Ptr image_metadata);
+ ImageYUV422 (FrameWrapper::Ptr image_metadata, Timestamp timestamp);
+
+ virtual ~ImageYUV422 () throw ();
+
+ inline virtual Encoding
+ getEncoding () const
+ {
+ return (YUV422);
+ }
+
+ virtual void
+ fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step = 0) const;
+
+ virtual void
+ fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step = 0) const;
+
+ virtual bool
+ isResizingSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const;
+ };
+
+ } // namespace
+}
+
+#endif // PCL_IO_IMAGE_YUV22_H_
register int depth_idx = 0, point_idx = 0;
double constant_x = 1.0 / parameters_.focal_length_x,
constant_y = 1.0 / parameters_.focal_length_y;
- for (int v = 0; v < cloud.height; ++v)
+ for (uint32_t v = 0; v < cloud.height; ++v)
{
- for (register int u = 0; u < cloud.width; ++u, ++point_idx, depth_idx += 2)
+ for (register uint32_t u = 0; u < cloud.width; ++u, ++point_idx, depth_idx += 2)
{
PointT &pt = cloud.points[point_idx];
unsigned short val;
unsigned char *color_v = reinterpret_cast<unsigned char*> (&uncompressed_data[wh2 + getWidth () * getHeight ()]);
register int y_idx = 0;
- for (size_t i = 0; i < wh2; ++i, y_idx += 2)
+ for (int i = 0; i < wh2; ++i, y_idx += 2)
{
int v = color_v[i] - 128;
int u = color_u[i] - 128;
#ifndef PCL_POINT_CLOUD_IMAGE_EXTRACTORS_IMPL_HPP_
#define PCL_POINT_CLOUD_IMAGE_EXTRACTORS_IMPL_HPP_
+#include <set>
#include <map>
#include <ctime>
#include <cstdlib>
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
-pcl::io::PointCloudImageExtractorFromNormalField<PointT>::extract (const PointCloud& cloud, pcl::PCLImage& img) const
+pcl::io::PointCloudImageExtractor<PointT>::extract (const PointCloud& cloud, pcl::PCLImage& img) const
{
if (!cloud.isOrganized () || cloud.points.size () != cloud.width * cloud.height)
return (false);
+ bool result = this->extractImpl (cloud, img);
+
+ if (paint_nans_with_black_ && result)
+ {
+ size_t size = img.encoding == "mono16" ? 2 : 3;
+ for (size_t i = 0; i < cloud.points.size (); ++i)
+ if (!pcl::isFinite (cloud[i]))
+ std::memset (&img.data[i * size], 0, size);
+ }
+
+ return (result);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::io::PointCloudImageExtractorFromNormalField<PointT>::extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const
+{
std::vector<pcl::PCLPointField> fields;
int field_x_idx = pcl::getFieldIndex (cloud, "normal_x", fields);
int field_y_idx = pcl::getFieldIndex (cloud, "normal_y", fields);
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
-pcl::io::PointCloudImageExtractorFromRGBField<PointT>::extract (const PointCloud& cloud, pcl::PCLImage& img) const
+pcl::io::PointCloudImageExtractorFromRGBField<PointT>::extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const
{
- if (!cloud.isOrganized () || cloud.points.size () != cloud.width * cloud.height)
- return (false);
-
std::vector<pcl::PCLPointField> fields;
int field_idx = pcl::getFieldIndex (cloud, "rgb", fields);
if (field_idx == -1)
return (true);
}
+// Lookup table is copied from (excluding the first entry):
+// https://github.com/fiji/fiji/blob/master/luts/glasbey.lut
+const uint8_t GLASBEY_LUT[] =
+{
+ 0, 0, 255,
+ 255, 0, 0,
+ 0, 255, 0,
+ 0, 0, 51,
+ 255, 0, 182,
+ 0, 83, 0,
+ 255, 211, 0,
+ 0, 159, 255,
+ 154, 77, 66,
+ 0, 255, 190,
+ 120, 63, 193,
+ 31, 150, 152,
+ 255, 172, 253,
+ 177, 204, 113,
+ 241, 8, 92,
+ 254, 143, 66,
+ 221, 0, 255,
+ 32, 26, 1,
+ 114, 0, 85,
+ 118, 108, 149,
+ 2, 173, 36,
+ 200, 255, 0,
+ 136, 108, 0,
+ 255, 183, 159,
+ 133, 133, 103,
+ 161, 3, 0,
+ 20, 249, 255,
+ 0, 71, 158,
+ 220, 94, 147,
+ 147, 212, 255,
+ 0, 76, 255,
+ 0, 66, 80,
+ 57, 167, 106,
+ 238, 112, 254,
+ 0, 0, 100,
+ 171, 245, 204,
+ 161, 146, 255,
+ 164, 255, 115,
+ 255, 206, 113,
+ 71, 0, 21,
+ 212, 173, 197,
+ 251, 118, 111,
+ 171, 188, 0,
+ 117, 0, 215,
+ 166, 0, 154,
+ 0, 115, 254,
+ 165, 93, 174,
+ 98, 132, 2,
+ 0, 121, 168,
+ 0, 255, 131,
+ 86, 53, 0,
+ 159, 0, 63,
+ 66, 45, 66,
+ 255, 242, 187,
+ 0, 93, 67,
+ 252, 255, 124,
+ 159, 191, 186,
+ 167, 84, 19,
+ 74, 39, 108,
+ 0, 16, 166,
+ 145, 78, 109,
+ 207, 149, 0,
+ 195, 187, 255,
+ 253, 68, 64,
+ 66, 78, 32,
+ 106, 1, 0,
+ 181, 131, 84,
+ 132, 233, 147,
+ 96, 217, 0,
+ 255, 111, 211,
+ 102, 75, 63,
+ 254, 100, 0,
+ 228, 3, 127,
+ 17, 199, 174,
+ 210, 129, 139,
+ 91, 118, 124,
+ 32, 59, 106,
+ 180, 84, 255,
+ 226, 8, 210,
+ 0, 1, 20,
+ 93, 132, 68,
+ 166, 250, 255,
+ 97, 123, 201,
+ 98, 0, 122,
+ 126, 190, 58,
+ 0, 60, 183,
+ 255, 253, 0,
+ 7, 197, 226,
+ 180, 167, 57,
+ 148, 186, 138,
+ 204, 187, 160,
+ 55, 0, 49,
+ 0, 40, 1,
+ 150, 122, 129,
+ 39, 136, 38,
+ 206, 130, 180,
+ 150, 164, 196,
+ 180, 32, 128,
+ 110, 86, 180,
+ 147, 0, 185,
+ 199, 48, 61,
+ 115, 102, 255,
+ 15, 187, 253,
+ 172, 164, 100,
+ 182, 117, 250,
+ 216, 220, 254,
+ 87, 141, 113,
+ 216, 85, 34,
+ 0, 196, 103,
+ 243, 165, 105,
+ 216, 255, 182,
+ 1, 24, 219,
+ 52, 66, 54,
+ 255, 154, 0,
+ 87, 95, 1,
+ 198, 241, 79,
+ 255, 95, 133,
+ 123, 172, 240,
+ 120, 100, 49,
+ 162, 133, 204,
+ 105, 255, 220,
+ 198, 82, 100,
+ 121, 26, 64,
+ 0, 238, 70,
+ 231, 207, 69,
+ 217, 128, 233,
+ 255, 211, 209,
+ 209, 255, 141,
+ 36, 0, 3,
+ 87, 163, 193,
+ 211, 231, 201,
+ 203, 111, 79 ,
+ 62, 24, 0,
+ 0, 117, 223,
+ 112, 176, 88 ,
+ 209, 24, 0,
+ 0, 30, 107,
+ 105, 200, 197,
+ 255, 203, 255,
+ 233, 194, 137,
+ 191, 129, 46,
+ 69, 42, 145,
+ 171, 76, 194,
+ 14, 117, 61,
+ 0, 30, 25,
+ 118, 73, 127,
+ 255, 169, 200,
+ 94, 55, 217,
+ 238, 230, 138,
+ 159, 54, 33,
+ 80, 0, 148,
+ 189, 144, 128,
+ 0, 109, 126,
+ 88, 223, 96,
+ 71, 80, 103,
+ 1, 93, 159,
+ 99, 48, 60,
+ 2, 206, 148,
+ 139, 83, 37,
+ 171, 0, 255,
+ 141, 42, 135,
+ 85, 83, 148,
+ 150, 255, 0,
+ 0, 152, 123,
+ 255, 138, 203,
+ 222, 69, 200,
+ 107, 109, 230,
+ 30, 0, 68,
+ 173, 76, 138,
+ 255, 134, 161,
+ 0, 35, 60,
+ 138, 205, 0,
+ 111, 202, 157,
+ 225, 75, 253,
+ 255, 176, 77,
+ 229, 232, 57,
+ 114, 16, 255,
+ 111, 82, 101,
+ 134, 137, 48,
+ 99, 38, 80,
+ 105, 38, 32,
+ 200, 110, 0,
+ 209, 164, 255,
+ 198, 210, 86,
+ 79, 103, 77,
+ 174, 165, 166,
+ 170, 45, 101,
+ 199, 81, 175,
+ 255, 89, 172,
+ 146, 102, 78,
+ 102, 134, 184,
+ 111, 152, 255,
+ 92, 255, 159,
+ 172, 137, 178,
+ 210, 34, 98,
+ 199, 207, 147,
+ 255, 185, 30,
+ 250, 148, 141,
+ 49, 34, 78,
+ 254, 81, 97,
+ 254, 141, 100,
+ 68, 54, 23,
+ 201, 162, 84,
+ 199, 232, 240,
+ 68, 152, 0,
+ 147, 172, 58,
+ 22, 75, 28,
+ 8, 84, 121,
+ 116, 45, 0,
+ 104, 60, 255,
+ 64, 41, 38,
+ 164, 113, 215,
+ 207, 0, 155,
+ 118, 1, 35,
+ 83, 0, 88,
+ 0, 82, 232,
+ 43, 92, 87,
+ 160, 217, 146,
+ 176, 26, 229,
+ 29, 3, 36,
+ 122, 58, 159,
+ 214, 209, 207,
+ 160, 100, 105,
+ 106, 157, 160,
+ 153, 219, 113,
+ 192, 56, 207,
+ 125, 255, 89,
+ 149, 0, 34,
+ 213, 162, 223,
+ 22, 131, 204,
+ 166, 249, 69,
+ 109, 105, 97,
+ 86, 188, 78,
+ 255, 109, 81,
+ 255, 3, 248,
+ 255, 0, 73,
+ 202, 0, 35,
+ 67, 109, 18,
+ 234, 170, 173,
+ 191, 165, 0,
+ 38, 44, 51,
+ 85, 185, 2,
+ 121, 182, 158,
+ 254, 236, 212,
+ 139, 165, 89,
+ 141, 254, 193,
+ 0, 60, 43,
+ 63, 17, 40,
+ 255, 221, 246,
+ 17, 26, 146,
+ 154, 66, 84,
+ 149, 157, 238,
+ 126, 130, 72,
+ 58, 6, 101,
+ 189, 117, 101,
+};
+
+const size_t GLASBEY_LUT_SIZE = sizeof (GLASBEY_LUT) / sizeof (GLASBEY_LUT[0]);
+
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
-pcl::io::PointCloudImageExtractorFromLabelField<PointT>::extract (const PointCloud& cloud, pcl::PCLImage& img) const
+pcl::io::PointCloudImageExtractorFromLabelField<PointT>::extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const
{
- if (!cloud.isOrganized () || cloud.points.size () != cloud.width * cloud.height)
- return (false);
-
std::vector<pcl::PCLPointField> fields;
int field_idx = pcl::getFieldIndex (cloud, "label", fields);
if (field_idx == -1)
}
break;
}
+ case COLORS_RGB_GLASBEY:
+ {
+ img.encoding = "rgb8";
+ img.width = cloud.width;
+ img.height = cloud.height;
+ img.step = img.width * sizeof (unsigned char) * 3;
+ img.data.resize (img.step * img.height);
+
+ std::srand(std::time(0));
+ std::set<uint32_t> labels;
+ std::map<uint32_t, size_t> colormap;
+
+ // First pass: find unique labels
+ for (size_t i = 0; i < cloud.points.size (); ++i)
+ {
+ uint32_t val;
+ pcl::getFieldValue<PointT, uint32_t> (cloud.points[i], offset, val);
+ labels.insert (val);
+ }
+
+ // Assign Glasbey colors in ascending order of labels
+ size_t color = 0;
+ for (std::set<uint32_t>::iterator iter = labels.begin (); iter != labels.end (); ++iter)
+ {
+ colormap[*iter] = color % GLASBEY_LUT_SIZE;
+ ++color;
+ }
+
+ // Second pass: copy colors from the LUT
+ for (size_t i = 0; i < cloud.points.size (); ++i)
+ {
+ uint32_t val;
+ pcl::getFieldValue<PointT, uint32_t> (cloud.points[i], offset, val);
+ memcpy (&img.data[i * 3], &GLASBEY_LUT[colormap[val] * 3], 3);
+ }
+
+ break;
+ }
}
return (true);
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
-pcl::io::PointCloudImageExtractorWithScaling<PointT>::extract (const PointCloud& cloud, pcl::PCLImage& img) const
+pcl::io::PointCloudImageExtractorWithScaling<PointT>::extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const
{
- if (!cloud.isOrganized () || cloud.points.size () != cloud.width * cloud.height)
- return (false);
-
std::vector<pcl::PCLPointField> fields;
int field_idx = pcl::getFieldIndex (cloud, field_name_, fields);
if (field_idx == -1)
#ifdef __GNUC__
#pragma GCC system_header
#endif
+#include <vtkVersion.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
// Add 0D topology to every point
vtkSmartPointer<vtkVertexGlyphFilter> vertex_glyph_filter = vtkSmartPointer<vtkVertexGlyphFilter>::New ();
- #if VTK_MAJOR_VERSION <= 5
+ #if VTK_MAJOR_VERSION < 6
vertex_glyph_filter->AddInputConnection (temp_polydata->GetProducerPort ());
#else
vertex_glyph_filter->SetInputData (temp_polydata);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pcl/pcl_config.h>
+
+#ifndef PCL_IO_EXCEPTION_H_
+#define PCL_IO_EXCEPTION_H_
+
+#include <cstdarg>
+#include <cstdio>
+#include <exception>
+#include <string>
+
+
+//fom <pcl/pcl_macros.h>
+#if defined _WIN32 && defined _MSC_VER && !defined __PRETTY_FUNCTION__
+ #define __PRETTY_FUNCTION__ __FUNCTION__
+#endif
+
+
+#define THROW_IO_EXCEPTION(format,...) throwIOException( __PRETTY_FUNCTION__, __FILE__, __LINE__, format , ##__VA_ARGS__ )
+
+
+namespace pcl
+{
+ namespace io
+ {
+ /**
+ * @brief General IO exception class
+ */
+ class IOException : public std::exception
+ {
+ public:
+ IOException (const std::string& function_name,
+ const std::string& file_name,
+ unsigned line_number,
+ const std::string& message);
+
+ virtual ~IOException () throw ();
+
+ IOException&
+ operator= (const IOException& exception);
+
+ virtual const char*
+ what () const throw ();
+
+ const std::string&
+ getFunctionName () const;
+
+ const std::string&
+ getFileName () const;
+
+ unsigned
+ getLineNumber () const;
+
+ protected:
+ std::string function_name_;
+ std::string file_name_;
+ unsigned line_number_;
+ std::string message_;
+ std::string message_long_;
+ };
+
+ inline void
+ throwIOException (const char* function, const char* file, unsigned line, const char* format, ...)
+ {
+ static char msg[1024];
+ va_list args;
+ va_start (args, format);
+ vsnprintf (msg, 1024, format, args);
+ throw IOException (function, file, line, msg);
+ }
+ } // namespace
+}
+#endif // PCL_IO_EXCEPTION_H_
/** \brief Load a compressed image array from disk
* \param[in] filename the file name to load the data from
- * \param[out] data_size the size of the data
+ * \param[out] data the size of the data
+ * \param uncompressed_size
* \return an array filled with the data loaded from disk, NULL if error
*/
bool
unsigned int num_threads=0);
/** \brief Read camera parameters from a given stream and store them internally.
- * The parameters will be read from the <depth> ... </depth> tag.
+ * The parameters will be read from the \<depth\> ... \</depth\> tag.
* \return true if operation successful, false otherwise
*/
virtual bool
unsigned int num_threads=0);
/** \brief Read camera parameters from a given stream and store them internally.
- * The parameters will be read from the <rgb> ... </rgb> tag.
+ * The parameters will be read from the \<rgb\> ... \</rgb\> tag.
* \return true if operation successful, false otherwise
*/
virtual bool
* \param[in] filename the file name to write
* \return true if operation successful, false otherwise
* This overwrites the following parameters in the xml file, under the
- * <depth> tag:
- * <focal_length_x>...</focal_length_x>
- * <focal_length_y>...</focal_length_y>
- * <principal_point_x>...</principal_point_x>
- * <principal_point_y>...</principal_point_y>
- * <z_multiplication_factor>...</z_multiplication_factor>
+ * \<depth> tag:
+ * \<focal_length_x\>...\</focal_length_x\>
+ * \<focal_length_y\>...\</focal_length_y\>
+ * \<principal_point_x\>...\</principal_point_x\>
+ * \<principal_point_y\>...\</principal_point_y\>
+ * \<z_multiplication_factor\>...\</z_multiplication_factor\>
*/
virtual bool
writeParameters (const CameraParameters ¶meters,
* Software License Agreement (BSD License)
*
* Copyright (c) 2010, Willow Garage, Inc.
+ * Copyright (c) 2013, Open Perception, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: obj_io.h 1001 2011-07-13 13:07:00 ktran $
- *
*/
#ifndef OBJ_IO_H_
#include <pcl/pcl_macros.h>
#include <pcl/TextureMesh.h>
#include <pcl/PolygonMesh.h>
+#include <pcl/io/file_io.h>
namespace pcl
{
+ class PCL_EXPORTS MTLReader
+ {
+ public:
+ /** \brief empty constructor */
+ MTLReader ();
+
+ /** \brief empty destructor */
+ virtual ~MTLReader() {}
+
+ /** \brief Read a MTL file given its full path.
+ * \param[in] filename full path to MTL file
+ * \return 0 on success < 0 else.
+ */
+ int
+ read (const std::string& filename);
+
+ /** \brief Read a MTL file given an OBJ file full path and the MTL file name.
+ * \param[in] obj_file_name full path to OBJ file
+ * \param[in] mtl_file_name MTL file name
+ * \return 0 on success < 0 else.
+ */
+ int
+ read (const std::string& obj_file_name, const std::string& mtl_file_name);
+
+ std::vector<pcl::TexMaterial>::const_iterator
+ getMaterial (const std::string& material_name) const;
+
+ /// materials array
+ std::vector<pcl::TexMaterial> materials_;
+
+ private:
+ /// converts CIE XYZ to RGB
+ inline void
+ cie2rgb (const Eigen::Vector3f& xyz, pcl::TexMaterial::RGB& rgb) const;
+ /// fill a pcl::TexMaterial::RGB from a split line containing CIE x y z values
+ int
+ fillRGBfromXYZ (const std::vector<std::string>& split_line, pcl::TexMaterial::RGB& rgb);
+ /// fill a pcl::TexMaterial::RGB from a split line containing r g b values
+ int
+ fillRGBfromRGB (const std::vector<std::string>& split_line, pcl::TexMaterial::RGB& rgb);
+ /// matrix to convert CIE to RGB
+ Eigen::Matrix3f xyz_to_rgb_matrix_;
+
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+
+ class PCL_EXPORTS OBJReader : public FileReader
+ {
+ public:
+ /** \brief empty constructor */
+ OBJReader() {}
+ /** \brief empty destructor */
+ virtual ~OBJReader() {}
+ /** \brief Read a point cloud data header from a FILE file.
+ *
+ * Load only the meta information (number of points, their types, etc),
+ * and not the points themselves, from a given FILE file. Useful for fast
+ * evaluation of the underlying data structure.
+ *
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PointCloud message read from disk
+ * \param[out] origin the sensor acquisition origin always null
+ * \param[out] orientation the sensor acquisition orientation always identity
+ * \param[out] file_version always 0
+ * \param data_type
+ * \param data_idx
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ *
+ * \return 0 on success.
+ */
+ int
+ readHeader (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, int &data_type, unsigned int &data_idx,
+ const int offset);
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/PCLPointCloud2.
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PointCloud message read from disk
+ * \param[out] origin the sensor acquisition origin always null
+ * \param[out] orientation the sensor acquisition orientation always identity
+ * \param[out] file_version always 0
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset = 0);
+
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/PCLPointCloud2.
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PointCloud message read from disk
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::PCLPointCloud2 &cloud, const int offset = 0);
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/TextureMesh.
+ * \param[in] file_name the name of the file containing data
+ * \param[out] mesh the resultant TextureMesh read from disk
+ * \param[out] origin the sensor origin always null
+ * \param[out] orientation the sensor orientation always identity
+ * \param[out] file_version always 0
+ * \param[in] offset the offset in the file where to expect the true
+ * header to begin.
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::TextureMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset = 0);
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/TextureMesh.
+ * \param[in] file_name the name of the file containing data
+ * \param[out] mesh the resultant TextureMesh read from disk
+ * \param[in] offset the offset in the file where to expect the true
+ * header to begin.
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::TextureMesh &mesh, const int offset = 0);
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/PolygonMesh.
+ * \param[in] file_name the name of the file containing data
+ * \param[out] mesh the resultant PolygonMesh read from disk
+ * \param[out] origin the sensor origin always null
+ * \param[out] orientation the sensor orientation always identity
+ * \param[out] file_version always 0
+ * \param[in] offset the offset in the file where to expect the true
+ * header to begin.
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::PolygonMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset = 0);
+
+ /** \brief Read a point cloud data from a FILE file and store it into a
+ * pcl/PolygonMesh.
+ * \param[in] file_name the name of the file containing data
+ * \param[out] mesh the resultant PolygonMesh read from disk
+ * \param[in] offset the offset in the file where to expect the true
+ * header to begin.
+ *
+ * \return 0 on success.
+ */
+ int
+ read (const std::string &file_name, pcl::PolygonMesh &mesh, const int offset = 0);
+
+ /** \brief Read a point cloud data from any FILE file, and convert it to the given
+ * template format.
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] cloud the resultant PointCloud message read from disk
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ */
+ template<typename PointT> inline int
+ read (const std::string &file_name, pcl::PointCloud<PointT> &cloud,
+ const int offset =0)
+ {
+ pcl::PCLPointCloud2 blob;
+ int file_version;
+ int res = read (file_name, blob, cloud.sensor_origin_, cloud.sensor_orientation_,
+ file_version, offset);
+ if (res < 0)
+ return (res);
+
+ pcl::fromPCLPointCloud2 (blob, cloud);
+ return (0);
+ }
+
+ private:
+ /// Usually OBJ files come MTL files where texture materials are stored
+ std::vector<pcl::MTLReader> companions_;
+ };
+
namespace io
{
+ /** \brief Load any OBJ file into a templated PointCloud type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \param[out] origin the sensor acquisition origin, null
+ * \param[out] orientation the sensor acquisition orientation, identity
+ * \ingroup io
+ */
+ inline int
+ loadOBJFile (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation)
+ {
+ pcl::OBJReader p;
+ int obj_version;
+ return (p.read (file_name, cloud, origin, orientation, obj_version));
+ }
+
+ /** \brief Load an OBJ file into a PCLPointCloud2 blob type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ loadOBJFile (const std::string &file_name, pcl::PCLPointCloud2 &cloud)
+ {
+ pcl::OBJReader p;
+ return (p.read (file_name, cloud));
+ }
+
+ /** \brief Load any OBJ file into a templated PointCloud type
+ * \param[in] file_name the name of the file to load
+ * \param[out] cloud the resultant templated point cloud
+ * \ingroup io
+ */
+ template<typename PointT> inline int
+ loadOBJFile (const std::string &file_name, pcl::PointCloud<PointT> &cloud)
+ {
+ pcl::OBJReader p;
+ return (p.read (file_name, cloud));
+ }
+
+ /** \brief Load any OBJ file into a PolygonMesh type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] mesh the resultant mesh
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ loadOBJFile (const std::string &file_name, pcl::PolygonMesh &mesh)
+ {
+ pcl::OBJReader p;
+ return (p.read (file_name, mesh));
+ }
+
+ /** \brief Load any OBJ file into a TextureMesh type.
+ * \param[in] file_name the name of the file to load
+ * \param[out] mesh the resultant mesh
+ * \return 0 on success < 0 on error
+ *
+ * \ingroup io
+ */
+ inline int
+ loadOBJFile (const std::string &file_name, pcl::TextureMesh &mesh)
+ {
+ pcl::OBJReader p;
+ return (p.read (file_name, mesh));
+ }
+
/** \brief Saves a TextureMesh in ascii OBJ format.
* \param[in] file_name the name of the file to write to disk
* \param[in] tex_mesh the texture mesh to save
* \ingroup io
*/
PCL_EXPORTS int
- saveOBJFile (const std::string &file_name,
- const pcl::TextureMesh &tex_mesh,
+ saveOBJFile (const std::string &file_name,
+ const pcl::TextureMesh &tex_mesh,
unsigned precision = 5);
/** \brief Saves a PolygonMesh in ascii PLY format.
* \ingroup io
*/
PCL_EXPORTS int
- saveOBJFile (const std::string &file_name,
- const pcl::PolygonMesh &mesh,
+ saveOBJFile (const std::string &file_name,
+ const pcl::PolygonMesh &mesh,
unsigned precision = 5);
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <pcl/pcl_config.h>
+#ifdef HAVE_OPENNI2
+
+#ifndef PCL_IO_OPENNI2_OPENNI_H_
+#define PCL_IO_OPENNI2_OPENNI_H_
+
+#if defined __GNUC__
+# pragma GCC system_header
+#endif
+
+#include <OpenNI.h>
+#include <OniVersion.h>
+
+// Standard resolutions, ported from OpenNI 1.x. To be removed later.
+#define XN_QQVGA_X_RES 160
+#define XN_QQVGA_Y_RES 120
+#define XN_CGA_X_RES 320
+#define XN_CGA_Y_RES 200
+#define XN_QVGA_X_RES 320
+#define XN_QVGA_Y_RES 240
+#define XN_VGA_X_RES 640
+#define XN_VGA_Y_RES 480
+#define XN_SVGA_X_RES 800
+#define XN_SVGA_Y_RES 600
+#define XN_XGA_X_RES 1024
+#define XN_XGA_Y_RES 768
+#define XN_720P_X_RES 1280
+#define XN_720P_Y_RES 720
+#define XN_SXGA_X_RES 1280
+#define XN_SXGA_Y_RES 1024
+#define XN_UXGA_X_RES 1600
+#define XN_UXGA_Y_RES 1200
+#define XN_1080P_X_RES 1920
+#define XN_1080P_Y_RES 1080
+#define XN_QCIF_X_RES 176
+#define XN_QCIF_Y_RES 144
+#define XN_240P_X_RES 423
+#define XN_240P_Y_RES 240
+#define XN_CIF_X_RES 352
+#define XN_CIF_Y_RES 288
+#define XN_WVGA_X_RES 640
+#define XN_WVGA_Y_RES 360
+#define XN_480P_X_RES 864
+#define XN_480P_Y_RES 480
+#define XN_576P_X_RES 1024
+#define XN_576P_Y_RES 576
+#define XN_DV_X_RES 960
+#define XN_DV_Y_RES 720
+
+#endif // PCL_IO_OPENNI2_OPENNI_H_
+#endif // HAVE_OPENNI2
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+
+#ifndef PCL_IO_OPENNI2_CONVERT_H_
+#define PCL_IO_OPENNI2_CONVERT_H_
+
+#include "pcl/io/openni2/openni2_device_info.h"
+#include "pcl/io/openni2/openni2_video_mode.h"
+
+#include "OpenNI.h"
+
+#include <vector>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+ const OpenNI2DeviceInfo
+ openni2_convert (const openni::DeviceInfo* pInfo);
+
+ const openni::VideoMode
+ grabberModeToOpenniMode (const OpenNI2VideoMode& input);
+
+ const OpenNI2VideoMode
+ openniModeToGrabberMode (const openni::VideoMode& input);
+
+ const std::vector<OpenNI2VideoMode>
+ openniModeToGrabberMode (const openni::Array<openni::VideoMode>& input);
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_CONVERT_H_
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_IO_OPENNI2_DEVICE_H_
+#define PCL_IO_OPENNI2_DEVICE_H_
+
+#include <pcl/pcl_exports.h>
+#include "openni.h"
+#include "pcl/io/openni2/openni2_video_mode.h"
+#include "pcl/io/io_exception.h"
+
+#include <boost/shared_ptr.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <string>
+#include <vector>
+
+// Template frame wrappers
+#include <pcl/io/image.h>
+#include <pcl/io/image_depth.h>
+#include <pcl/io/image_ir.h>
+
+
+
+namespace openni
+{
+ class Device;
+ class DeviceInfo;
+ class VideoStream;
+ class SensorInfo;
+}
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+ typedef pcl::io::DepthImage DepthImage;
+ typedef pcl::io::IRImage IRImage;
+ typedef pcl::io::Image Image;
+
+ class OpenNI2FrameListener;
+
+ class PCL_EXPORTS OpenNI2Device
+ {
+ public:
+
+ typedef boost::function<void(boost::shared_ptr<Image>, void* cookie) > ImageCallbackFunction;
+ typedef boost::function<void(boost::shared_ptr<DepthImage>, void* cookie) > DepthImageCallbackFunction;
+ typedef boost::function<void(boost::shared_ptr<IRImage>, void* cookie) > IRImageCallbackFunction;
+ typedef unsigned CallbackHandle;
+
+ typedef boost::function<void(openni::VideoStream& stream)> StreamCallbackFunction;
+
+ OpenNI2Device (const std::string& device_URI);
+ virtual ~OpenNI2Device ();
+
+ const std::string
+ getUri () const;
+ const std::string
+ getVendor () const;
+ const std::string
+ getName () const;
+ uint16_t
+ getUsbVendorId () const;
+ uint16_t
+ getUsbProductId () const;
+
+ const std::string
+ getStringID () const;
+
+ bool
+ isValid () const;
+
+ bool
+ hasIRSensor () const;
+ bool
+ hasColorSensor () const;
+ bool
+ hasDepthSensor () const;
+
+ void
+ startIRStream ();
+ void
+ startColorStream ();
+ void
+ startDepthStream ();
+
+ void
+ stopAllStreams ();
+
+ void
+ stopIRStream ();
+ void
+ stopColorStream ();
+ void
+ stopDepthStream ();
+
+ bool
+ isIRStreamStarted ();
+ bool
+ isColorStreamStarted ();
+ bool
+ isDepthStreamStarted ();
+
+ bool
+ isImageRegistrationModeSupported () const;
+ void
+ setImageRegistrationMode (bool enabled);
+ bool
+ isDepthRegistered () const;
+
+ const OpenNI2VideoMode
+ getIRVideoMode ();
+ const OpenNI2VideoMode
+ getColorVideoMode ();
+ const OpenNI2VideoMode
+ getDepthVideoMode ();
+
+ const std::vector<OpenNI2VideoMode>&
+ getSupportedIRVideoModes () const;
+ const std::vector<OpenNI2VideoMode>&
+ getSupportedColorVideoModes () const;
+ const std::vector<OpenNI2VideoMode>&
+ getSupportedDepthVideoModes () const;
+
+ bool
+ isIRVideoModeSupported (const OpenNI2VideoMode& video_mode) const;
+ bool
+ isColorVideoModeSupported (const OpenNI2VideoMode& video_mode) const;
+ bool
+ isDepthVideoModeSupported (const OpenNI2VideoMode& video_mode) const;
+
+ bool
+ findCompatibleIRMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const;
+ bool
+ findCompatibleColorMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const;
+ bool
+ findCompatibleDepthMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const;
+
+ void
+ setIRVideoMode (const OpenNI2VideoMode& video_mode);
+ void
+ setColorVideoMode (const OpenNI2VideoMode& video_mode);
+ void
+ setDepthVideoMode (const OpenNI2VideoMode& video_mode);
+
+ OpenNI2VideoMode
+ getDefaultIRMode () const;
+ OpenNI2VideoMode
+ getDefaultColorMode () const;
+ OpenNI2VideoMode
+ getDefaultDepthMode () const;
+
+ float
+ getIRFocalLength () const;
+ float
+ getColorFocalLength () const;
+ float
+ getDepthFocalLength () const;
+
+ // Baseline between sensors. Returns 0 if this value does not exist.
+ float
+ getBaseline();
+
+ // Value of pixels in shadow or that have no valid measurement
+ uint64_t
+ getShadowValue();
+
+ void
+ setAutoExposure (bool enable);
+ void
+ setAutoWhiteBalance (bool enable);
+
+ inline bool
+ isSynchronized ()
+ {
+ return (openni_device_->getDepthColorSyncEnabled ());
+ }
+
+ inline bool
+ isSynchronizationSupported ()
+ {
+ return (true); // Not sure how to query this from the hardware
+ }
+
+ inline bool
+ isFile()
+ {
+ return (openni_device_->isFile());
+ }
+
+ void
+ setSynchronization (bool enableSync);
+
+ bool
+ getAutoExposure () const;
+ bool
+ getAutoWhiteBalance () const;
+
+ void
+ setUseDeviceTimer (bool enable);
+
+ /** \brief Get absolut number of depth frames in the current stream.
+ * This function returns 0 if the current device is not a file stream or
+ * if the current mode has no depth stream.
+ */
+ int
+ getDepthFrameCount ();
+
+ /** \brief Get absolut number of color frames in the current stream.
+ * This function returns 0 if the current device is not a file stream or
+ * if the current mode has no color stream.
+ */
+ int
+ getColorFrameCount ();
+
+ /** \brief Get absolut number of ir frames in the current stream.
+ * This function returns 0 if the current device is not a file stream or
+ * if the current mode has no ir stream.
+ */
+ int
+ getIRFrameCount ();
+
+ /** \brief Set the playback speed if the device is an recorded stream.
+ * If setting the device playback speed fails, because the device is no recorded stream or
+ * any other reason this function returns false. Otherwise true is returned.
+ * \param[in] speed The playback speed factor 1.0 means the same speed as recorded,
+ * 0.5 half the speed, 2.0 double speed and so on.
+ * \return True on success, false otherwise.
+ */
+ bool
+ setPlaybackSpeed (double speed);
+
+ /************************************************************************************/
+ // Callbacks from openni::VideoStream to grabber. Internal interface
+ void
+ setColorCallback (StreamCallbackFunction color_callback);
+ void
+ setDepthCallback (StreamCallbackFunction depth_callback);
+ void
+ setIRCallback (StreamCallbackFunction ir_callback);
+
+ protected:
+ void shutdown ();
+
+ boost::shared_ptr<openni::VideoStream>
+ getIRVideoStream () const;
+ boost::shared_ptr<openni::VideoStream>
+ getColorVideoStream () const;
+ boost::shared_ptr<openni::VideoStream>
+ getDepthVideoStream () const;
+
+
+ void
+ processColorFrame (openni::VideoStream& stream);
+ void
+ processDepthFrame (openni::VideoStream& stream);
+ void
+ processIRFrame (openni::VideoStream& stream);
+
+
+ bool
+ findCompatibleVideoMode (const std::vector<OpenNI2VideoMode> supportedModes,
+ const OpenNI2VideoMode& output_mode, OpenNI2VideoMode& mode) const;
+
+ bool
+ resizingSupported (size_t input_width, size_t input_height, size_t output_width, size_t output_height) const;
+
+ // Members
+
+ boost::shared_ptr<openni::Device> openni_device_;
+ boost::shared_ptr<openni::DeviceInfo> device_info_;
+
+ boost::shared_ptr<OpenNI2FrameListener> ir_frame_listener;
+ boost::shared_ptr<OpenNI2FrameListener> color_frame_listener;
+ boost::shared_ptr<OpenNI2FrameListener> depth_frame_listener;
+
+ mutable boost::shared_ptr<openni::VideoStream> ir_video_stream_;
+ mutable boost::shared_ptr<openni::VideoStream> color_video_stream_;
+ mutable boost::shared_ptr<openni::VideoStream> depth_video_stream_;
+
+ mutable std::vector<OpenNI2VideoMode> ir_video_modes_;
+ mutable std::vector<OpenNI2VideoMode> color_video_modes_;
+ mutable std::vector<OpenNI2VideoMode> depth_video_modes_;
+
+ bool ir_video_started_;
+ bool color_video_started_;
+ bool depth_video_started_;
+
+ /** \brief distance between the projector and the IR camera in meters*/
+ float baseline_;
+ /** the value for shadow (occluded pixels) */
+ uint64_t shadow_value_;
+ /** the value for pixels without a valid disparity measurement */
+ uint64_t no_sample_value_;
+ };
+
+ PCL_EXPORTS std::ostream& operator<< (std::ostream& stream, const OpenNI2Device& device);
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_DEVICE_H_
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#ifndef PCL_IO_OPENNI2_DEVICE_INFO_H_
+#define PCL_IO_OPENNI2_DEVICE_INFO_H_
+
+#include <ostream>
+
+#include <boost/cstdint.hpp>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ struct OpenNI2DeviceInfo
+ {
+ std::string uri_;
+ std::string vendor_;
+ std::string name_;
+ uint16_t vendor_id_;
+ uint16_t product_id_;
+ };
+
+ std::ostream&
+ operator<< (std::ostream& stream, const OpenNI2DeviceInfo& device_info);
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_DEVICE_INFO_H_
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#ifndef PCL_IO_OPENNI2_DEVICE_MANAGER_H_
+#define PCL_IO_OPENNI2_DEVICE_MANAGER_H_
+
+#include <pcl/pcl_exports.h>
+#include "pcl/io/openni2/openni2_device_info.h"
+
+#include <boost/thread/mutex.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
+#include <vector>
+#include <string>
+#include <ostream>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ class OpenNI2DeviceListener;
+ class OpenNI2Device;
+
+ class PCL_EXPORTS OpenNI2DeviceManager
+ {
+ public:
+ OpenNI2DeviceManager ();
+ virtual ~OpenNI2DeviceManager ();
+
+ // This may not actually be a sigleton yet. Need to work out cross-dll incerface.
+ // Based on http://stackoverflow.com/a/13431981/1789618
+ static boost::shared_ptr<OpenNI2DeviceManager> getInstance ()
+ {
+ static boost::shared_ptr<OpenNI2DeviceManager> instance = boost::make_shared<OpenNI2DeviceManager>();
+ return (instance);
+ }
+
+ boost::shared_ptr<std::vector<OpenNI2DeviceInfo> >
+ getConnectedDeviceInfos () const;
+
+ boost::shared_ptr<std::vector<std::string> >
+ getConnectedDeviceURIs () const;
+
+ std::size_t
+ getNumOfConnectedDevices () const;
+
+ boost::shared_ptr<OpenNI2Device>
+ getAnyDevice ();
+
+ boost::shared_ptr<OpenNI2Device>
+ getDevice (const std::string& device_URI);
+
+ boost::shared_ptr<OpenNI2Device>
+ getDeviceByIndex (int index);
+
+ boost::shared_ptr<OpenNI2Device>
+ getFileDevice (const std::string& path);
+
+ protected:
+ boost::shared_ptr<OpenNI2DeviceListener> device_listener_;
+ };
+
+ std::ostream&
+ operator<< (std::ostream& stream, const OpenNI2DeviceManager& device_manager);
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_DEVICE_MANAGER_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_IO_OPENNI2_FRAME_LISTENER_H_
+#define PCL_IO_OPENNI2_FRAME_LISTENER_H_
+
+#include <boost/function.hpp>
+
+#include "OpenNI.h"
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ typedef boost::function<void(openni::VideoStream& stream)> StreamCallbackFunction;
+
+ /* Each NewFrameListener may only listen to one VideoStream at a time.
+ **/
+ class OpenNI2FrameListener : public openni::VideoStream::NewFrameListener
+ {
+ public:
+
+ OpenNI2FrameListener ()
+ : callback_(0) {}
+ OpenNI2FrameListener (StreamCallbackFunction cb)
+ : callback_(cb) {}
+
+ virtual ~OpenNI2FrameListener ()
+ { };
+
+ inline void
+ onNewFrame (openni::VideoStream& stream)
+ {
+ if (callback_)
+ callback_(stream);
+ }
+
+ void
+ setCallback (StreamCallbackFunction cb)
+ {
+ callback_ = cb;
+ }
+
+ private:
+ StreamCallbackFunction callback_;
+ };
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_FRAME_LISTENER_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, respective authors.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#pragma once
+#ifndef PCL_IO_OPENNI2_METADATA_WRAPPER_H_
+#define PCL_IO_OPENNI2_METADATA_WRAPPER_H_
+
+#include <pcl/pcl_config.h>
+
+#if defined(HAVE_OPENNI2)
+
+#include <pcl/io/image_metadata_wrapper.h>
+#include <pcl/io/openni2/openni.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+ class Openni2FrameWrapper : public pcl::io::FrameWrapper
+ {
+ public:
+ Openni2FrameWrapper (openni::VideoFrameRef metadata)
+ : metadata_(metadata)
+ {}
+
+ virtual inline const void*
+ getData () const
+ {
+ return (metadata_.getData ());
+ }
+
+ virtual inline unsigned
+ getDataSize () const
+ {
+ return (metadata_.getDataSize ());
+ }
+
+ virtual inline unsigned
+ getWidth () const
+ {
+ return (metadata_.getWidth ());
+ }
+
+ virtual inline unsigned
+ getHeight () const
+ {
+ return (metadata_.getHeight ());
+ }
+
+ virtual inline unsigned
+ getFrameID () const
+ {
+ return (metadata_.getFrameIndex ());
+ }
+
+ virtual inline uint64_t
+ getTimestamp () const
+ {
+ return (metadata_.getTimestamp ());
+ }
+
+
+ const inline openni::VideoFrameRef&
+ getMetaData () const
+ {
+ return (metadata_);
+ }
+
+ private:
+ openni::VideoFrameRef metadata_; // Internally reference counted
+ };
+
+ } // namespace
+ }
+}
+#endif // HAVE_OPENNI2
+
+#endif // PCL_IO_OPENNI2_METADATA_WRAPPER_H_
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#ifndef PCL_IO_OPENNI2_TIME_FILTER_H_
+#define PCL_IO_OPENNI2_TIME_FILTER_H_
+
+#include <deque>
+
+#include "OpenNI.h"
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ class OpenNI2TimerFilter
+ {
+ public:
+ OpenNI2TimerFilter (std::size_t filter_len);
+ virtual ~OpenNI2TimerFilter ();
+
+ void
+ addSample (double sample);
+
+ double
+ getMedian ();
+
+ double
+ getMovingAvg ();
+
+ void
+ clear ();
+
+ private:
+ std::size_t filter_len_;
+
+ std::deque<double> buffer_;
+ };
+
+ } // namespace
+ }
+}
+
+#endif // PCL_IO_OPENNI2_TIME_FILTER_H_
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#ifndef PCL_IO_OPENNI2_VIDEO_MODE_H_
+#define PCL_IO_OPENNI2_VIDEO_MODE_H_
+
+#include <cstddef>
+#include <ostream>
+
+#include <OpenNI.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+ // copied from OniEnums.h
+ typedef enum
+ {
+ // Depth
+ PIXEL_FORMAT_DEPTH_1_MM = 100,
+ PIXEL_FORMAT_DEPTH_100_UM = 101,
+ PIXEL_FORMAT_SHIFT_9_2 = 102,
+ PIXEL_FORMAT_SHIFT_9_3 = 103,
+
+ // Color
+ PIXEL_FORMAT_RGB888 = 200,
+ PIXEL_FORMAT_YUV422 = 201,
+ PIXEL_FORMAT_GRAY8 = 202,
+ PIXEL_FORMAT_GRAY16 = 203,
+ PIXEL_FORMAT_JPEG = 204,
+ PIXEL_FORMAT_YUYV = 205,
+ } PixelFormat;
+
+ struct OpenNI2VideoMode
+ {
+ OpenNI2VideoMode ()
+ :x_resolution_(0), y_resolution_(0), frame_rate_(0)
+ {}
+
+ OpenNI2VideoMode (int xResolution, int yResolution, int frameRate)
+ :x_resolution_(xResolution), y_resolution_(yResolution), frame_rate_(frameRate)
+ {}
+
+ int x_resolution_;
+ int y_resolution_;
+ int frame_rate_;
+ PixelFormat pixel_format_;
+ };
+
+ std::ostream&
+ operator<< (std::ostream& stream, const OpenNI2VideoMode& video_mode);
+
+ bool
+ operator== (const OpenNI2VideoMode& video_mode_a, const OpenNI2VideoMode& video_mode_b);
+
+ bool
+ operator!= (const OpenNI2VideoMode& video_mode_a, const OpenNI2VideoMode& video_mode_b);
+
+ } // namespace
+ }
+}
+
+#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2011 Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <pcl/pcl_config.h>
+#ifdef HAVE_OPENNI2
+
+#ifndef __OPENNI_SHIFT_TO_DEPTH_CONVERSION
+#define __OPENNI_SHIFT_TO_DEPTH_CONVERSION
+
+#include <vector>
+#include <limits>
+
+namespace openni_wrapper
+{
+ /** \brief This class provides conversion of the openni 11-bit shift data to depth;
+ */
+ class PCL_EXPORTS ShiftToDepthConverter
+ {
+ public:
+ /** \brief Constructor. */
+ ShiftToDepthConverter () : init_(false) {}
+
+ /** \brief Destructor. */
+ virtual ~ShiftToDepthConverter () {};
+
+ /** \brief This method generates a look-up table to convert openni shift values to depth
+ */
+ void
+ generateLookupTable ()
+ {
+ // lookup of 11 bit shift values
+ const std::size_t table_size = 1<<10;
+
+ lookupTable_.clear();
+ lookupTable_.resize(table_size);
+
+ // constants taken from openni driver
+ static const int16_t nConstShift = 800;
+ static const double nParamCoeff = 4.000000;
+ static const double dPlanePixelSize = 0.104200;
+ static const double nShiftScale = 10.000000;
+ static const double dPlaneDsr = 120.000000;
+ static const double dPlaneDcl = 7.500000;
+
+ std::size_t i;
+ double dFixedRefX;
+ double dMetric;
+
+ for (i=0; i<table_size; ++i)
+ {
+ // shift to depth calculation from opnni
+ dFixedRefX = (static_cast<double>(i - nConstShift) / nParamCoeff)-0.375;
+ dMetric = dFixedRefX * dPlanePixelSize;
+ lookupTable_[i] = static_cast<float>((nShiftScale * ((dMetric * dPlaneDsr / (dPlaneDcl - dMetric)) + dPlaneDsr) ) / 1000.0f);
+ }
+
+ init_ = true;
+ }
+
+ /** \brief Generate a look-up table for converting openni shift values to depth
+ */
+ inline float
+ shiftToDepth (uint16_t shift_val)
+ {
+ assert (init_);
+
+ static const float bad_point = std::numeric_limits<float>::quiet_NaN ();
+
+ float ret = bad_point;
+
+ // lookup depth value in shift lookup table
+ if (shift_val<lookupTable_.size())
+ ret = lookupTable_[shift_val];
+
+ return ret;
+ }
+
+ inline bool isInitialized() const
+ {
+ return init_;
+ }
+
+ protected:
+ std::vector<float> lookupTable_;
+ bool init_;
+ } ;
+}
+
+#endif
+#endif //__OPENNI_SHIFT_TO_DEPTH_CONVERSION
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, respective authors.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/pcl_config.h>
+#ifdef HAVE_OPENNI2
+
+#ifndef PCL_IO_OPENNI2_GRABBER_H_
+#define PCL_IO_OPENNI2_GRABBER_H_
+
+#include <pcl/io/eigen.h>
+#include <pcl/io/boost.h>
+#include <pcl/io/grabber.h>
+#include <pcl/io/openni2/openni2_device_manager.h>
+#include <pcl/io/openni2/openni2_device.h>
+#include <string>
+#include <deque>
+#include <pcl/common/synchronizer.h>
+
+#include <pcl/io/image.h>
+#include <pcl/io/image_rgb24.h>
+#include <pcl/io/image_yuv422.h>
+#include <pcl/io/image_depth.h>
+#include <pcl/io/image_ir.h>
+
+namespace pcl
+{
+ struct PointXYZ;
+ struct PointXYZRGB;
+ struct PointXYZRGBA;
+ struct PointXYZI;
+ template <typename T> class PointCloud;
+
+ namespace io
+ {
+
+ /** \brief Grabber for OpenNI 2 devices (i.e., Primesense PSDK, Microsoft Kinect, Asus XTion Pro/Live)
+ * \ingroup io
+ */
+ class PCL_EXPORTS OpenNI2Grabber : public Grabber
+ {
+ public:
+ typedef boost::shared_ptr<OpenNI2Grabber> Ptr;
+ typedef boost::shared_ptr<const OpenNI2Grabber> ConstPtr;
+
+ // Templated images
+ typedef pcl::io::DepthImage DepthImage;
+ typedef pcl::io::IRImage IRImage;
+ typedef pcl::io::Image Image;
+
+ /** \brief Basic camera parameters placeholder. */
+ struct CameraParameters
+ {
+ /** fx */
+ double focal_length_x;
+ /** fy */
+ double focal_length_y;
+ /** cx */
+ double principal_point_x;
+ /** cy */
+ double principal_point_y;
+
+ CameraParameters (double initValue)
+ : focal_length_x (initValue), focal_length_y (initValue),
+ principal_point_x (initValue), principal_point_y (initValue)
+ {}
+
+ CameraParameters (double fx, double fy, double cx, double cy)
+ : focal_length_x (fx), focal_length_y (fy), principal_point_x (cx), principal_point_y (cy)
+ { }
+ };
+
+ typedef enum
+ {
+ OpenNI_Default_Mode = 0, // This can depend on the device. For now all devices (PSDK, Xtion, Kinect) its VGA@30Hz
+ OpenNI_SXGA_15Hz = 1, // Only supported by the Kinect
+ OpenNI_VGA_30Hz = 2, // Supported by PSDK, Xtion and Kinect
+ OpenNI_VGA_25Hz = 3, // Supportged by PSDK and Xtion
+ OpenNI_QVGA_25Hz = 4, // Supported by PSDK and Xtion
+ OpenNI_QVGA_30Hz = 5, // Supported by PSDK, Xtion and Kinect
+ OpenNI_QVGA_60Hz = 6, // Supported by PSDK and Xtion
+ OpenNI_QQVGA_25Hz = 7, // Not supported -> using software downsampling (only for integer scale factor and only NN)
+ OpenNI_QQVGA_30Hz = 8, // Not supported -> using software downsampling (only for integer scale factor and only NN)
+ OpenNI_QQVGA_60Hz = 9 // Not supported -> using software downsampling (only for integer scale factor and only NN)
+ } Mode;
+
+ //define callback signature typedefs
+ typedef void (sig_cb_openni_image) (const boost::shared_ptr<Image>&);
+ typedef void (sig_cb_openni_depth_image) (const boost::shared_ptr<DepthImage>&);
+ typedef void (sig_cb_openni_ir_image) (const boost::shared_ptr<IRImage>&);
+ typedef void (sig_cb_openni_image_depth_image) (const boost::shared_ptr<Image>&, const boost::shared_ptr<DepthImage>&, float reciprocalFocalLength) ;
+ typedef void (sig_cb_openni_ir_depth_image) (const boost::shared_ptr<IRImage>&, const boost::shared_ptr<DepthImage>&, float reciprocalFocalLength) ;
+ typedef void (sig_cb_openni_point_cloud) (const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ> >&);
+ typedef void (sig_cb_openni_point_cloud_rgb) (const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >&);
+ typedef void (sig_cb_openni_point_cloud_rgba) (const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGBA> >&);
+ typedef void (sig_cb_openni_point_cloud_i) (const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZI> >&);
+
+ public:
+ /** \brief Constructor
+ * \param[in] device_id ID of the device, which might be a serial number, bus@address or the index of the device.
+ * \param[in] depth_mode the mode of the depth stream
+ * \param[in] image_mode the mode of the image stream
+ */
+ OpenNI2Grabber (const std::string& device_id = "",
+ const Mode& depth_mode = OpenNI_Default_Mode,
+ const Mode& image_mode = OpenNI_Default_Mode);
+
+ /** \brief virtual Destructor inherited from the Grabber interface. It never throws. */
+ virtual ~OpenNI2Grabber () throw ();
+
+ /** \brief Start the data acquisition. */
+ virtual void
+ start ();
+
+ /** \brief Stop the data acquisition. */
+ virtual void
+ stop ();
+
+ /** \brief Check if the data acquisition is still running. */
+ virtual bool
+ isRunning () const;
+
+ virtual std::string
+ getName () const;
+
+ /** \brief Obtain the number of frames per second (FPS). */
+ virtual float
+ getFramesPerSecond () const;
+
+ /** \brief Get a boost shared pointer to the \ref OpenNIDevice object. */
+ inline boost::shared_ptr<pcl::io::openni2::OpenNI2Device>
+ getDevice () const;
+
+ /** \brief Obtain a list of the available depth modes that this device supports. */
+ std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> >
+ getAvailableDepthModes () const;
+
+ /** \brief Obtain a list of the available image modes that this device supports. */
+ std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> >
+ getAvailableImageModes () const;
+
+ /** \brief Set the RGB camera parameters (fx, fy, cx, cy)
+ * \param[in] rgb_focal_length_x the RGB focal length (fx)
+ * \param[in] rgb_focal_length_y the RGB focal length (fy)
+ * \param[in] rgb_principal_point_x the RGB principal point (cx)
+ * \param[in] rgb_principal_point_y the RGB principal point (cy)
+ * Setting the parameters to non-finite values (e.g., NaN, Inf) invalidates them
+ * and the grabber will use the default values from the camera instead.
+ */
+ inline void
+ setRGBCameraIntrinsics (const double rgb_focal_length_x,
+ const double rgb_focal_length_y,
+ const double rgb_principal_point_x,
+ const double rgb_principal_point_y)
+ {
+ rgb_parameters_ = CameraParameters (
+ rgb_focal_length_x, rgb_focal_length_y,
+ rgb_principal_point_x, rgb_principal_point_y);
+ }
+
+ /** \brief Get the RGB camera parameters (fx, fy, cx, cy)
+ * \param[out] rgb_focal_length_x the RGB focal length (fx)
+ * \param[out] rgb_focal_length_y the RGB focal length (fy)
+ * \param[out] rgb_principal_point_x the RGB principal point (cx)
+ * \param[out] rgb_principal_point_y the RGB principal point (cy)
+ */
+ inline void
+ getRGBCameraIntrinsics (double &rgb_focal_length_x,
+ double &rgb_focal_length_y,
+ double &rgb_principal_point_x,
+ double &rgb_principal_point_y) const
+ {
+ rgb_focal_length_x = rgb_parameters_.focal_length_x;
+ rgb_focal_length_y = rgb_parameters_.focal_length_y;
+ rgb_principal_point_x = rgb_parameters_.principal_point_x;
+ rgb_principal_point_y = rgb_parameters_.principal_point_y;
+ }
+
+
+ /** \brief Set the RGB image focal length (fx = fy).
+ * \param[in] rgb_focal_length the RGB focal length (assumes fx = fy)
+ * Setting the parameter to a non-finite value (e.g., NaN, Inf) invalidates it
+ * and the grabber will use the default values from the camera instead.
+ * These parameters will be used for XYZRGBA clouds.
+ */
+ inline void
+ setRGBFocalLength (const double rgb_focal_length)
+ {
+ rgb_parameters_.focal_length_x = rgb_focal_length;
+ rgb_parameters_.focal_length_y = rgb_focal_length;
+ }
+
+ /** \brief Set the RGB image focal length
+ * \param[in] rgb_focal_length_x the RGB focal length (fx)
+ * \param[in] rgb_focal_ulength_y the RGB focal length (fy)
+ * Setting the parameters to non-finite values (e.g., NaN, Inf) invalidates them
+ * and the grabber will use the default values from the camera instead.
+ * These parameters will be used for XYZRGBA clouds.
+ */
+ inline void
+ setRGBFocalLength (const double rgb_focal_length_x, const double rgb_focal_length_y)
+ {
+ rgb_parameters_.focal_length_x = rgb_focal_length_x;
+ rgb_parameters_.focal_length_y = rgb_focal_length_y;
+ }
+
+ /** \brief Return the RGB focal length parameters (fx, fy)
+ * \param[out] rgb_focal_length_x the RGB focal length (fx)
+ * \param[out] rgb_focal_length_y the RGB focal length (fy)
+ */
+ inline void
+ getRGBFocalLength (double &rgb_focal_length_x, double &rgb_focal_length_y) const
+ {
+ rgb_focal_length_x = rgb_parameters_.focal_length_x;
+ rgb_focal_length_y = rgb_parameters_.focal_length_y;
+ }
+
+ /** \brief Set the Depth camera parameters (fx, fy, cx, cy)
+ * \param[in] depth_focal_length_x the Depth focal length (fx)
+ * \param[in] depth_focal_length_y the Depth focal length (fy)
+ * \param[in] depth_principal_point_x the Depth principal point (cx)
+ * \param[in] depth_principal_point_y the Depth principal point (cy)
+ * Setting the parameters to non-finite values (e.g., NaN, Inf) invalidates them
+ * and the grabber will use the default values from the camera instead.
+ */
+ inline void
+ setDepthCameraIntrinsics (const double depth_focal_length_x,
+ const double depth_focal_length_y,
+ const double depth_principal_point_x,
+ const double depth_principal_point_y)
+ {
+ depth_parameters_ = CameraParameters (
+ depth_focal_length_x, depth_focal_length_y,
+ depth_principal_point_x, depth_principal_point_y);
+ }
+
+ /** \brief Get the Depth camera parameters (fx, fy, cx, cy)
+ * \param[out] depth_focal_length_x the Depth focal length (fx)
+ * \param[out] depth_focal_length_y the Depth focal length (fy)
+ * \param[out] depth_principal_point_x the Depth principal point (cx)
+ * \param[out] depth_principal_point_y the Depth principal point (cy)
+ */
+ inline void
+ getDepthCameraIntrinsics (double &depth_focal_length_x,
+ double &depth_focal_length_y,
+ double &depth_principal_point_x,
+ double &depth_principal_point_y) const
+ {
+ depth_focal_length_x = depth_parameters_.focal_length_x;
+ depth_focal_length_y = depth_parameters_.focal_length_y;
+ depth_principal_point_x = depth_parameters_.principal_point_x;
+ depth_principal_point_y = depth_parameters_.principal_point_y;
+ }
+
+ /** \brief Set the Depth image focal length (fx = fy).
+ * \param[in] depth_focal_length the Depth focal length (assumes fx = fy)
+ * Setting the parameter to a non-finite value (e.g., NaN, Inf) invalidates it
+ * and the grabber will use the default values from the camera instead.
+ */
+ inline void
+ setDepthFocalLength (const double depth_focal_length)
+ {
+ depth_parameters_.focal_length_x = depth_focal_length;
+ depth_parameters_.focal_length_y = depth_focal_length;
+ }
+
+
+ /** \brief Set the Depth image focal length
+ * \param[in] depth_focal_length_x the Depth focal length (fx)
+ * \param[in] depth_focal_length_y the Depth focal length (fy)
+ * Setting the parameter to non-finite values (e.g., NaN, Inf) invalidates them
+ * and the grabber will use the default values from the camera instead.
+ */
+ inline void
+ setDepthFocalLength (const double depth_focal_length_x, const double depth_focal_length_y)
+ {
+ depth_parameters_.focal_length_x = depth_focal_length_x;
+ depth_parameters_.focal_length_y = depth_focal_length_y;
+ }
+
+ /** \brief Return the Depth focal length parameters (fx, fy)
+ * \param[out] depth_focal_length_x the Depth focal length (fx)
+ * \param[out] depth_focal_length_y the Depth focal length (fy)
+ */
+ inline void
+ getDepthFocalLength (double &depth_focal_length_x, double &depth_focal_length_y) const
+ {
+ depth_focal_length_x = depth_parameters_.focal_length_x;
+ depth_focal_length_y = depth_parameters_.focal_length_y;
+ }
+
+ protected:
+
+ /** \brief Sets up an OpenNI device. */
+ void
+ setupDevice (const std::string& device_id, const Mode& depth_mode, const Mode& image_mode);
+
+ /** \brief Update mode maps. */
+ void
+ updateModeMaps ();
+
+ /** \brief Start synchronization. */
+ void
+ startSynchronization ();
+
+ /** \brief Stop synchronization. */
+ void
+ stopSynchronization ();
+
+ // TODO: rename to mapMode2OniMode
+ /** \brief Map config modes. */
+ bool
+ mapMode2XnMode (int mode, pcl::io::openni2::OpenNI2VideoMode& videoMode) const;
+
+ // callback methods
+ /** \brief RGB image callback. */
+ virtual void
+ imageCallback (pcl::io::openni2::Image::Ptr image, void* cookie);
+
+ /** \brief Depth image callback. */
+ virtual void
+ depthCallback (pcl::io::openni2::DepthImage::Ptr depth_image, void* cookie);
+
+ /** \brief IR image callback. */
+ virtual void
+ irCallback (pcl::io::openni2::IRImage::Ptr ir_image, void* cookie);
+
+ /** \brief RGB + Depth image callback. */
+ virtual void
+ imageDepthImageCallback (const pcl::io::openni2::Image::Ptr &image,
+ const pcl::io::openni2::DepthImage::Ptr &depth_image);
+
+ /** \brief IR + Depth image callback. */
+ virtual void
+ irDepthImageCallback (const pcl::io::openni2::IRImage::Ptr &image,
+ const pcl::io::openni2::DepthImage::Ptr &depth_image);
+
+ /** \brief Process changed signals. */
+ virtual void
+ signalsChanged ();
+
+ // helper methods
+
+ /** \brief Check if the RGB and Depth images are required to be synchronized or not. */
+ virtual void
+ checkImageAndDepthSynchronizationRequired ();
+
+ /** \brief Check if the RGB image stream is required or not. */
+ virtual void
+ checkImageStreamRequired ();
+
+ /** \brief Check if the depth stream is required or not. */
+ virtual void
+ checkDepthStreamRequired ();
+
+ /** \brief Check if the IR image stream is required or not. */
+ virtual void
+ checkIRStreamRequired ();
+
+
+ // Point cloud conversion ///////////////////////////////////////////////
+
+ /** \brief Convert a Depth image to a pcl::PointCloud<pcl::PointXYZ>
+ * \param[in] depth the depth image to convert
+ */
+ boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> >
+ convertToXYZPointCloud (const pcl::io::openni2::DepthImage::Ptr &depth);
+
+ /** \brief Convert a Depth + RGB image pair to a pcl::PointCloud<PointT>
+ * \param[in] image the RGB image to convert
+ * \param[in] depth_image the depth image to convert
+ */
+ template <typename PointT> typename pcl::PointCloud<PointT>::Ptr
+ convertToXYZRGBPointCloud (const pcl::io::openni2::Image::Ptr &image,
+ const pcl::io::openni2::DepthImage::Ptr &depth_image);
+
+ /** \brief Convert a Depth + Intensity image pair to a pcl::PointCloud<pcl::PointXYZI>
+ * \param[in] image the IR image to convert
+ * \param[in] depth_image the depth image to convert
+ */
+ boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> >
+ convertToXYZIPointCloud (const pcl::io::openni2::IRImage::Ptr &image,
+ const pcl::io::openni2::DepthImage::Ptr &depth_image);
+
+ std::vector<uint8_t> color_resize_buffer_;
+ std::vector<uint16_t> depth_resize_buffer_;
+ std::vector<uint16_t> ir_resize_buffer_;
+
+ // Stream callbacks /////////////////////////////////////////////////////
+ void
+ processColorFrame (openni::VideoStream& stream);
+
+ void
+ processDepthFrame (openni::VideoStream& stream);
+
+ void
+ processIRFrame (openni::VideoStream& stream);
+
+
+ Synchronizer<pcl::io::openni2::Image::Ptr, pcl::io::openni2::DepthImage::Ptr > rgb_sync_;
+ Synchronizer<pcl::io::openni2::IRImage::Ptr, pcl::io::openni2::DepthImage::Ptr > ir_sync_;
+
+ /** \brief The actual openni device. */
+ boost::shared_ptr<pcl::io::openni2::OpenNI2Device> device_;
+
+ std::string rgb_frame_id_;
+ std::string depth_frame_id_;
+ unsigned image_width_;
+ unsigned image_height_;
+ unsigned depth_width_;
+ unsigned depth_height_;
+
+ bool image_required_;
+ bool depth_required_;
+ bool ir_required_;
+ bool sync_required_;
+
+ boost::signals2::signal<sig_cb_openni_image>* image_signal_;
+ boost::signals2::signal<sig_cb_openni_depth_image>* depth_image_signal_;
+ boost::signals2::signal<sig_cb_openni_ir_image>* ir_image_signal_;
+ boost::signals2::signal<sig_cb_openni_image_depth_image>* image_depth_image_signal_;
+ boost::signals2::signal<sig_cb_openni_ir_depth_image>* ir_depth_image_signal_;
+ boost::signals2::signal<sig_cb_openni_point_cloud>* point_cloud_signal_;
+ boost::signals2::signal<sig_cb_openni_point_cloud_i>* point_cloud_i_signal_;
+ boost::signals2::signal<sig_cb_openni_point_cloud_rgb>* point_cloud_rgb_signal_;
+ boost::signals2::signal<sig_cb_openni_point_cloud_rgba>* point_cloud_rgba_signal_;
+
+ struct modeComp
+ {
+ bool operator () (const openni::VideoMode& mode1, const openni::VideoMode & mode2) const
+ {
+ if (mode1.getResolutionX () < mode2.getResolutionX ())
+ return true;
+ else if (mode1.getResolutionX () > mode2.getResolutionX ())
+ return false;
+ else if (mode1.getResolutionY () < mode2.getResolutionY ())
+ return true;
+ else if (mode1.getResolutionY () > mode2.getResolutionY ())
+ return false;
+ else if (mode1.getFps () < mode2.getFps () )
+ return true;
+ else
+ return false;
+ }
+ };
+
+ // Mapping from config (enum) modes to native OpenNI modes
+ std::map<int, pcl::io::openni2::OpenNI2VideoMode> config2oni_map_;
+
+ pcl::io::openni2::OpenNI2Device::CallbackHandle depth_callback_handle_;
+ pcl::io::openni2::OpenNI2Device::CallbackHandle image_callback_handle_;
+ pcl::io::openni2::OpenNI2Device::CallbackHandle ir_callback_handle_;
+ bool running_;
+
+
+ CameraParameters rgb_parameters_;
+ CameraParameters depth_parameters_;
+
+ public:
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+
+ boost::shared_ptr<pcl::io::openni2::OpenNI2Device>
+ OpenNI2Grabber::getDevice () const
+ {
+ return device_;
+ }
+
+ } // namespace
+}
+
+#endif // PCL_IO_OPENNI2_GRABBER_H_
+#endif // HAVE_OPENNI2
* This version is used to register a member function of any class.
* The callback will always be called with a new image and the user data "cookie".
* \param[in] callback the user callback to be called if a new image is available
+ * \param instance
* \param[in] cookie the cookie that needs to be passed to the callback together with the new image.
* \return a callback handler that can be used to remove the user callback from list of image-stream callbacks.
*/
* This version is used to register a member function of any class.
* The callback will always be called with a new depth image and the user data "cookie".
* \param[in] callback the user callback to be called if a new depth image is available
+ * \param instance
* \param[in] cookie the cookie that needs to be passed to the callback together with the new depth image.
* \return a callback handler that can be used to remove the user callback from list of depth-stream callbacks.
*/
* This version is used to register a member function of any class.
* The callback will always be called with a new IR image and the user data "cookie".
* \param[in] callback the user callback to be called if a new IR image is available
+ * \param instance
* \param[in] cookie the cookie that needs to be passed to the callback together with the new IR image.
* \return a callback handler that can be used to remove the user callback from list of IR-stream callbacks.
*/
public:
/** \brief Constructor
- * \param[in] device_id ID of the device, which might be a serial number, bus@address or the index of the device.
+ * \param[in] device_id ID of the device, which might be a serial number, bus\@address or the index of the device.
* \param[in] depth_mode the mode of the depth stream
* \param[in] image_mode the mode of the image stream
*/
virtual float
getFramesPerSecond () const;
- /** \brief Get a boost shared pointer to the \ref OpenNIDevice object. */
+ /** \brief Get a boost shared pointer to the \ref pcl::openni_wrapper::OpenNIDevice object. */
inline boost::shared_ptr<openni_wrapper::OpenNIDevice>
getDevice () const;
/** \brief Set the RGB image focal length
* \param[in] rgb_focal_length_x the RGB focal length (fx)
- * \param[in] rgb_focal_ulength_y the RGB focal length (fy)
+ * \param[in] rgb_focal_length_y the RGB focal length (fy)
* Setting the parameters to non-finite values (e.g., NaN, Inf) invalidates them
* and the grabber will use the default values from the camera instead.
* These parameters will be used for XYZRGBA clouds.
openni_wrapper::OpenNIDevice::CallbackHandle ir_callback_handle;
bool running_;
+ mutable unsigned rgb_array_size_;
+ mutable unsigned depth_buffer_size_;
+ mutable boost::shared_array<unsigned char> rgb_array_;
+ mutable boost::shared_array<unsigned short> depth_buffer_;
+ mutable boost::shared_array<unsigned short> ir_buffer_;
+
/** \brief The RGB image focal length (fx). */
double rgb_focal_length_x_;
/** \brief The RGB image focal length (fy). */
at (const scalar_property_definition_callbacks_type& scalar_property_definition_callbacks);
};
- template <typename ScalarType>
- friend typename scalar_property_definition_callback_type<ScalarType>::type&
+ template <typename ScalarType> static
+ typename scalar_property_definition_callback_type<ScalarType>::type&
at (scalar_property_definition_callbacks_type& scalar_property_definition_callbacks)
{
return (scalar_property_definition_callbacks.get<ScalarType> ());
}
- template <typename ScalarType>
- friend const typename scalar_property_definition_callback_type<ScalarType>::type&
+ template <typename ScalarType> static
+ const typename scalar_property_definition_callback_type<ScalarType>::type&
at (const scalar_property_definition_callbacks_type& scalar_property_definition_callbacks)
{
return (scalar_property_definition_callbacks.get<ScalarType> ());
at (const list_property_definition_callbacks_type& list_property_definition_callbacks);
};
- template <typename SizeType, typename ScalarType>
- friend typename list_property_definition_callback_type<SizeType, ScalarType>::type&
+ template <typename SizeType, typename ScalarType> static
+ typename list_property_definition_callback_type<SizeType, ScalarType>::type&
at (list_property_definition_callbacks_type& list_property_definition_callbacks)
{
return (list_property_definition_callbacks.get<SizeType, ScalarType> ());
}
- template <typename SizeType, typename ScalarType>
- friend const typename list_property_definition_callback_type<SizeType, ScalarType>::type&
+ template <typename SizeType, typename ScalarType> static
+ const typename list_property_definition_callback_type<SizeType, ScalarType>::type&
at (const list_property_definition_callbacks_type& list_property_definition_callbacks)
{
return (list_property_definition_callbacks.get<SizeType, ScalarType> ());
{
typedef SizeType size_type;
typedef ScalarType scalar_type;
- typename list_property_definition_callback_type<size_type, scalar_type>::type& list_property_definition_callback =
- list_property_definition_callbacks_.get<size_type, scalar_type> ();
+ typedef typename list_property_definition_callback_type<size_type, scalar_type>::type list_property_definition_callback_type;
+ list_property_definition_callback_type& list_property_definition_callback = list_property_definition_callbacks_.get<size_type, scalar_type> ();
typedef typename list_property_begin_callback_type<size_type, scalar_type>::type list_property_begin_callback_type;
typedef typename list_property_element_callback_type<size_type, scalar_type>::type list_property_element_callback_type;
typedef typename list_property_end_callback_type<size_type, scalar_type>::type list_property_end_callback_type;
, orientation_ (Eigen::Matrix3f::Zero ())
, cloud_ ()
, vertex_count_ (0)
- , vertex_properties_counter_ (0)
, vertex_offset_before_ (0)
, range_grid_ (0)
- , range_count_ (0)
- , range_grid_vertex_indices_element_index_ (0)
, rgb_offset_before_ (0)
, do_resize_ (false)
+ , polygons_ (0)
{}
PLYReader (const PLYReader &p)
, orientation_ (Eigen::Matrix3f::Zero ())
, cloud_ ()
, vertex_count_ (0)
- , vertex_properties_counter_ (0)
, vertex_offset_before_ (0)
, range_grid_ (0)
- , range_count_ (0)
- , range_grid_vertex_indices_element_index_ (0)
, rgb_offset_before_ (0)
, do_resize_ (false)
+ , polygons_ (0)
{
*this = p;
}
origin_ = p.origin_;
orientation_ = p.orientation_;
range_grid_ = p.range_grid_;
+ polygons_ = p.polygons_;
return (*this);
}
read (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
Eigen::Vector4f &origin, Eigen::Quaternionf &orientation, int& ply_version, const int offset = 0);
- /** \brief Read a point cloud data from a PLY file (PLY_V6 only!) and store it into a pcl/PCLPointCloud2.
- *
- * \note This function is provided for backwards compatibility only and
- * it can only read PLY_V6 files correctly, as pcl::PCLPointCloud2
- * does not contain a sensor origin/orientation. Reading any file
- * > PLY_V6 will generate a warning.
- *
+ /** \brief Read a point cloud data from a PLY file and store it into a pcl/PCLPointCloud2.
+ * \note This function is provided for backwards compatibility only
* \param[in] file_name the name of the file containing the actual PointCloud data
* \param[out] cloud the resultant PointCloud message read from disk
* \param[in] offset the offset in the file where to expect the true header to begin.
return (0);
}
+ /** \brief Read a point cloud data from a PLY file and store it into a pcl/PolygonMesh.
+ *
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] mesh the resultant PolygonMesh message read from disk
+ * \param[in] origin the sensor data acquisition origin (translation)
+ * \param[in] orientation the sensor data acquisition origin (rotation)
+ * \param[out] ply_version the PLY version read from the file
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ */
+ int
+ read (const std::string &file_name, pcl::PolygonMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int& ply_version, const int offset = 0);
+
+ /** \brief Read a point cloud data from a PLY file and store it into a pcl/PolygonMesh.
+ *
+ * \param[in] file_name the name of the file containing the actual PointCloud data
+ * \param[out] mesh the resultant PolygonMesh message read from disk
+ * \param[in] offset the offset in the file where to expect the true header to begin.
+ * One usage example for setting the offset parameter is for reading
+ * data from a TAR "archive containing multiple files: TAR files always
+ * add a 512 byte header in front of the actual file, so set the offset
+ * to the next byte after the header (e.g., 513).
+ */
+ int
+ read (const std::string &file_name, pcl::PolygonMesh &mesh, const int offset = 0);
+
private:
::pcl::io::ply::ply_parser parser_;
inline void
vertexListPropertyEndCallback ();
- /** Callback function for an anonymous vertex double property.
+ /** Callback function for an anonymous vertex scalar property.
* Writes down a double value in cloud data.
* param[in] value double value parsed
*/
- inline void
- vertexDoublePropertyCallback (pcl::io::ply::float64 value);
-
- /** Callback function for an anonymous vertex float property.
- * Writes down a float value in cloud data.
- * param[in] value float value parsed
- */
- inline void
- vertexFloatPropertyCallback (pcl::io::ply::float32 value);
-
- /** Callback function for an anonymous vertex int property.
- * Writes down a int value in cloud data.
- * param[in] value int value parsed
- */
- inline void
- vertexIntPropertyCallback (pcl::io::ply::int32 value);
-
- /** Callback function for an anonymous vertex uint property.
- * Writes down a uint value in cloud data.
- * param[in] value uint value parsed
- */
- inline void
- vertexUnsignedIntPropertyCallback (pcl::io::ply::uint32 value);
-
- /** Callback function for an anonymous vertex short property.
- * Writes down a short value in cloud data.
- * param[in] value short value parsed
- */
- inline void
- vertexShortPropertyCallback (pcl::io::ply::int16 value);
-
- /** Callback function for an anonymous vertex ushort property.
- * Writes down a ushort value in cloud data.
- * param[in] value ushort value parsed
- */
- inline void
- vertexUnsignedShortPropertyCallback (pcl::io::ply::uint16 value);
-
- /** Callback function for an anonymous vertex char property.
- * Writes down a char value in cloud data.
- * param[in] value char value parsed
- */
- inline void
- vertexCharPropertyCallback (pcl::io::ply::int8 value);
-
- /** Callback function for an anonymous vertex uchar property.
- * Writes down a uchar value in cloud data.
- * param[in] value uchar value parsed
- */
- inline void
- vertexUnsignedCharPropertyCallback (pcl::io::ply::uint8 value);
+ template<typename Scalar> void
+ vertexScalarPropertyCallback (Scalar value);
/** Callback function for vertex RGB color.
* This callback is in charge of packing red green and blue in a single int
inline void
cloudWidthCallback (const int &width) { cloud_->width = width; }
- /** Append a double property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendDoubleProperty (const std::string& name, const size_t& count = 1);
-
- /** Append a float property to the cloud fields.
+ /** Append a scalar property to the cloud fields.
* param[in] name property name
* param[in] count property count: 1 for scalar properties and higher for a
* list property.
*/
- void
- appendFloatProperty (const std::string& name, const size_t& count = 1);
-
- /** Append an unsigned int property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendIntProperty (const std::string& name, const size_t& count = 1);
-
- /** Append an unsigned int property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendUnsignedIntProperty (const std::string& name, const size_t& count = 1);
-
- /** Append a short property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendShortProperty (const std::string& name, const size_t& count = 1);
-
- /** Append a short property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendUnsignedShortProperty (const std::string& name, const size_t& count = 1);
-
- /** Append a char property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendCharProperty (const std::string& name, const size_t& count = 1);
-
- /** Append a char property to the cloud fields.
- * param[in] name property name
- * param[in] count property count: 1 for scalar properties and higher for a
- * list property.
- */
- void
- appendUnsignedCharProperty (const std::string& name, const size_t& count = 1);
+ template<typename Scalar> void
+ appendScalarProperty (const std::string& name, const size_t& count = 1);
/** Amend property from cloud fields identified by \a old_name renaming
* it \a new_name.
void
objInfoCallback (const std::string& line);
+ /** Callback function for the begin of face line */
+ void
+ faceBeginCallback ();
+
+ /** Callback function for the begin of face vertex_indices property
+ * param[in] size vertex_indices list size
+ */
+ void
+ faceVertexIndicesBeginCallback (pcl::io::ply::uint8 size);
+
+ /** Callback function for each face vertex_indices element
+ * param[in] vertex_index index of the vertex in vertex_indices
+ */
+ void
+ faceVertexIndicesElementCallback (pcl::io::ply::int32 vertex_index);
+
+ /** Callback function for the end of a face vertex_indices property */
+ void
+ faceVertexIndicesEndCallback ();
+
+ /** Callback function for the end of a face element end */
+ void
+ faceEndCallback ();
+
/// origin
Eigen::Vector4f origin_;
//vertex element artifacts
pcl::PCLPointCloud2 *cloud_;
- size_t vertex_count_, vertex_properties_counter_;
+ size_t vertex_count_;
int vertex_offset_before_;
//range element artifacts
std::vector<std::vector <int> > *range_grid_;
- size_t range_count_, range_grid_vertex_indices_element_index_;
size_t rgb_offset_before_;
bool do_resize_;
+ //face element artifact
+ std::vector<pcl::Vertices> *polygons_;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
return (p.read (file_name, cloud));
}
+ /** \brief Load a PLY file into a PolygonMesh type.
+ *
+ * Any PLY files containg sensor data will generate a warning as a
+ * pcl/PolygonMesh message cannot hold the sensor origin.
+ *
+ * \param[in] file_name the name of the file to load
+ * \param[in] mesh the resultant polygon mesh
+ * \ingroup io
+ */
+ inline int
+ loadPLYFile (const std::string &file_name, pcl::PolygonMesh &mesh)
+ {
+ pcl::PLYReader p;
+ return (p.read (file_name, mesh));
+ }
+
/** \brief Save point cloud data to a PLY file containing n-D points
* \param[in] file_name the output file name
* \param[in] cloud the point cloud data message
* \param[in] origin the sensor data acquisition origin (translation)
* \param[in] orientation the sensor data acquisition origin (rotation)
* \param[in] binary_mode true for binary mode, false (default) for ASCII
+ * \param[in] use_camera
* \ingroup io
*/
inline int
* \ingroup io
*/
PCL_EXPORTS void
- saveRgbPNGFile (const std::string& file_name, const unsigned char *rgb_image, int width, int height)
- {
- saveCharPNGFile(file_name, rgb_image, width, height, 3);
- }
+ saveRgbPNGFile (const std::string& file_name, const unsigned char *rgb_image, int width, int height);
/** \brief Saves 8-bit grayscale cloud as image to PNG file.
* \param[in] file_name the name of the file to write to disk
* \param[in] cloud point cloud to save
* \ingroup io
*/
- void
- savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned char>& cloud)
- {
- saveCharPNGFile(file_name, &cloud.points[0], cloud.width, cloud.height, 1);
- }
+ PCL_EXPORTS void
+ savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned char>& cloud);
/** \brief Saves 16-bit grayscale cloud as image to PNG file.
* \param[in] file_name the name of the file to write to disk
* \param[in] cloud point cloud to save
* \ingroup io
*/
- void
- savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned short>& cloud)
- {
- saveShortPNGFile(file_name, &cloud.points[0], cloud.width, cloud.height, 1);
- }
+ PCL_EXPORTS void
+ savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned short>& cloud);
/** \brief Saves a PCLImage (formely ROS sensor_msgs::Image) to PNG file.
* \param[in] file_name the name of the file to write to disk
* \ingroup io
* \note Currently only "rgb8", "mono8", and "mono16" image encodings are supported.
*/
- void
- savePNGFile (const std::string& file_name, const pcl::PCLImage& image)
- {
- if (image.encoding == "rgb8")
- {
- saveRgbPNGFile(file_name, &image.data[0], image.width, image.height);
- }
- else if (image.encoding == "mono8")
- {
- saveCharPNGFile(file_name, &image.data[0], image.width, image.height, 1);
- }
- else if (image.encoding == "mono16")
- {
- saveShortPNGFile(file_name, reinterpret_cast<const unsigned short*>(&image.data[0]), image.width, image.height, 1);
- }
- else
- {
- PCL_ERROR ("[pcl::io::savePNGFile] Unsupported image encoding \"%s\".\n", image.encoding.c_str ());
- }
- }
+ PCL_EXPORTS void
+ savePNGFile (const std::string& file_name, const pcl::PCLImage& image);
/** \brief Saves RGB fields of cloud as image to PNG file.
* \param[in] file_name the name of the file to write to disk
* \param[in] cloud point cloud to save
* \ingroup io
*/
- PCL_DEPRECATED (template <typename T> void savePNGFile (const std::string& file_name, const pcl::PointCloud<T>& cloud),
+ template <typename T>
+ PCL_DEPRECATED (
"pcl::io::savePNGFile<typename T> (file_name, cloud) is deprecated, please use a new generic "
"function pcl::io::savePNGFile (file_name, cloud, field_name) with \"rgb\" as the field name."
- );
- template <typename T> void
+ )
+ void
savePNGFile (const std::string& file_name, const pcl::PointCloud<T>& cloud)
{
std::vector<unsigned char> data(cloud.width * cloud.height * 3);
* \ingroup io
* Warning: Converts to 16 bit (for png), labels using more than 16 bits will cause problems
*/
- PCL_DEPRECATED (void savePNGFile (const std::string& file_name, const pcl::PointCloud<pcl::PointXYZL>& cloud),
- "pcl::io::savePNGFile (file_name, cloud) is deprecated, please use a new generic function "
- "pcl::io::savePNGFile (file_name, cloud, field_name) with \"label\" as the field name."
- );
+ PCL_EXPORTS PCL_DEPRECATED (
+ "savePNGFile (file_name, cloud) is deprecated, please use a new generic function "
+ "savePNGFile (file_name, cloud, field_name) with \"label\" as the field name."
+ )
void
- savePNGFile (const std::string& file_name, const pcl::PointCloud<pcl::PointXYZL>& cloud)
- {
- std::vector<unsigned short> data(cloud.width * cloud.height);
- for (size_t i = 0; i < cloud.points.size (); ++i)
- {
- data[i] = static_cast<unsigned short> (cloud.points[i].label);
- }
- saveShortPNGFile(file_name, &data[0], cloud.width, cloud.height,1);
- }
+ savePNGFile (const std::string& file_name, const pcl::PointCloud<pcl::PointXYZL>& cloud);
/** \brief Saves the data from the specified field of the point cloud as image to PNG file.
* \param[in] file_name the name of the file to write to disk
typedef boost::shared_ptr<const PointCloudImageExtractor<PointT> > ConstPtr;
/** \brief Constructor. */
- PointCloudImageExtractor () {}
+ PointCloudImageExtractor ()
+ : paint_nans_with_black_ (false)
+ {}
/** \brief Destructor. */
virtual ~PointCloudImageExtractor () {}
* \param[out] image the output image
* \return true if the operation was successful, false otherwise
*/
+ bool
+ extract (const PointCloud& cloud, pcl::PCLImage& image) const;
+
+ /** \brief Set a flag that controls if image pixels corresponding to
+ * NaN (infinite) points should be painted black.
+ */
+ inline void
+ setPaintNaNsWithBlack (bool flag)
+ {
+ paint_nans_with_black_ = flag;
+ }
+
+ protected:
+
+ /** \brief Implementation of the extract() function, has to be
+ * implemented in deriving classes.
+ */
virtual bool
- extract (const PointCloud& cloud, pcl::PCLImage& image) const = 0;
+ extractImpl (const PointCloud& cloud, pcl::PCLImage& image) const = 0;
+
+ /// A flag that controls if image pixels corresponding to NaN (infinite)
+ /// points should be painted black.
+ bool paint_nans_with_black_;
};
//////////////////////////////////////////////////////////////////////////////////////
/** \brief Destructor. */
virtual ~PointCloudImageExtractorWithScaling () {}
- /** \brief Obtain the image from the given cloud.
- * \param[in] cloud organized point cloud to extract image from
- * \param[out] image the output image
- * \return true if the operation was successful, false otherwise
- */
- virtual bool
- extract (const PointCloud& cloud, pcl::PCLImage& image) const;
-
/** \brief Set scaling method. */
inline void
setScalingMethod (const ScalingMethod scaling_method)
protected:
+ virtual bool
+ extractImpl (const PointCloud& cloud, pcl::PCLImage& image) const;
+
std::string field_name_;
ScalingMethod scaling_method_;
float scaling_factor_;
/** \brief Destructor. */
virtual ~PointCloudImageExtractorFromNormalField () {}
- /** \brief Obtain the color image from the given cloud.
- * The cloud should contain "normal" field.
- * \param[in] cloud organized point cloud to extract image from
- * \param[out] image the output image
- * \return true if the operation was successful, false otherwise
- */
+ protected:
+
virtual bool
- extract (const PointCloud& cloud, pcl::PCLImage& img) const;
+ extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const;
};
//////////////////////////////////////////////////////////////////////////////////////
/** \brief Destructor. */
virtual ~PointCloudImageExtractorFromRGBField () {}
- /** \brief Obtain the color image from the given cloud.
- * The cloud should contain either "rgb" or "rgba" field.
- * \param[in] cloud organized point cloud to extract image from
- * \param[out] image the output image
- * \return true if the operation was successful, false otherwise
- */
+ protected:
+
virtual bool
- extract (const PointCloud& cloud, pcl::PCLImage& img) const;
+ extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const;
};
//////////////////////////////////////////////////////////////////////////////////////
/** \brief Image Extractor which uses the data present in the "label" field to produce
* either monochrome or RGB image where different labels correspond to different
- * colors. In the monochrome case colors are shades of gray, in the RGB case the
- * colors are generated randomly.
+ * colors.
+ * See the documentation for ColorMode to learn about available coloring options.
* \author Sergey Alexandrov
* \ingroup io
*/
typedef boost::shared_ptr<PointCloudImageExtractorFromLabelField<PointT> > Ptr;
typedef boost::shared_ptr<const PointCloudImageExtractorFromLabelField<PointT> > ConstPtr;
- /** \brief Different modes for color mapping.
- * <ul>
- * <li><b>COLORS_MONO</b> - shades of gray (according to label id).</li>
- * <li><b>COLORS_RGB_RANDOM</b> - randomly generated RGB colors.</li>
- * </ul>
- */
+ /** \brief Different modes for color mapping. */
enum ColorMode
{
+ /// Shades of gray (according to label id)
+ /// \note Labels using more than 16 bits will cause problems
COLORS_MONO,
+ /// Randomly generated RGB colors
COLORS_RGB_RANDOM,
+ /// Fixed RGB colors from the [Glasbey lookup table](http://fiji.sc/Glasbey),
+ /// assigned in the ascending order of label id
+ COLORS_RGB_GLASBEY,
};
/** \brief Constructor. */
/** \brief Destructor. */
virtual ~PointCloudImageExtractorFromLabelField () {}
- /** \brief Obtain the label image from the given cloud.
- * The cloud should contain "label" field.
- * \note Labels using more than 16 bits will cause problems in COLORS_MONO mode.
- * \param[in] cloud organized point cloud to extract image from
- * \param[out] image the output image
- * \return true if the operation was successful, false otherwise
- */
- virtual bool
- extract (const PointCloud& cloud, pcl::PCLImage& img) const;
-
/** \brief Set color mapping mode. */
inline void
setColorMode (const ColorMode color_mode)
color_mode_ = color_mode;
}
+ protected:
+
+ virtual bool
+ extractImpl (const PointCloud& cloud, pcl::PCLImage& img) const;
+
private:
ColorMode color_mode_;
typedef boost::shared_ptr<const PointCloudImageExtractorFromZField<PointT> > ConstPtr;
/** \brief Constructor.
- * \param[i] scaling_factor a scaling factor to apply to each depth value (default 10000)
+ * \param[in] scaling_factor a scaling factor to apply to each depth value (default 10000)
*/
PointCloudImageExtractorFromZField (const float scaling_factor = 10000)
: PointCloudImageExtractorWithScaling<PointT> ("z", scaling_factor)
}
/** \brief Constructor.
- * \param[i] scaling_method a scaling method to use
+ * \param[in] scaling_method a scaling method to use
*/
PointCloudImageExtractorFromZField (const ScalingMethod scaling_method)
: PointCloudImageExtractorWithScaling<PointT> ("z", scaling_method)
typedef boost::shared_ptr<const PointCloudImageExtractorFromCurvatureField<PointT> > ConstPtr;
/** \brief Constructor.
- * \param[i] scaling_method a scaling method to use (default SCALING_FULL_RANGE)
+ * \param[in] scaling_method a scaling method to use (default SCALING_FULL_RANGE)
*/
PointCloudImageExtractorFromCurvatureField (const ScalingMethod scaling_method = PointCloudImageExtractorWithScaling<PointT>::SCALING_FULL_RANGE)
: PointCloudImageExtractorWithScaling<PointT> ("curvature", scaling_method)
}
/** \brief Constructor.
- * \param[i] scaling_factor a scaling factor to apply to each curvature value
+ * \param[in] scaling_factor a scaling factor to apply to each curvature value
*/
PointCloudImageExtractorFromCurvatureField (const float scaling_factor)
: PointCloudImageExtractorWithScaling<PointT> ("curvature", scaling_factor)
typedef boost::shared_ptr<const PointCloudImageExtractorFromIntensityField<PointT> > ConstPtr;
/** \brief Constructor.
- * \param[i] scaling_method a scaling method to use (default SCALING_NO)
+ * \param[in] scaling_method a scaling method to use (default SCALING_NO)
*/
PointCloudImageExtractorFromIntensityField (const ScalingMethod scaling_method = PointCloudImageExtractorWithScaling<PointT>::SCALING_NO)
: PointCloudImageExtractorWithScaling<PointT> ("intensity", scaling_method)
}
/** \brief Constructor.
- * \param[i] scaling_factor a scaling factor to apply to each intensity value
+ * \param[in] scaling_factor a scaling factor to apply to each intensity value
*/
PointCloudImageExtractorFromIntensityField (const float scaling_factor)
: PointCloudImageExtractorWithScaling<PointT> ("intensity", scaling_factor)
char file_name_prefix[155];
char _padding[12];
- /** \brief . */
+ /** \brief get file size */
unsigned int
getFileSize ()
{
/** \brief Save a PointCloud dataset into a TAR file.
* Append if the file exists, or create a new one if not.
- *
- * \param[in] tar_filename the name of the TAR file to save the cloud to
- * \param[in] cloud the point cloud dataset to save
- * \param[in] pcd_filename the internal name of the PCD file that should be stored in the TAR header
* \remark till implemented will return FALSE
*/
+ // param[in] tar_filename the name of the TAR file to save the cloud to
+ // param[in] cloud the point cloud dataset to save
+ // param[in] pcd_filename the internal name of the PCD file that should be stored in the TAR header
template <typename PointT> bool
- saveTARPointCloud (const std::string &tar_filename,
- const PointCloud<PointT> &cloud,
- const std::string &pcd_filename)
+ saveTARPointCloud (const std::string& /*tar_filename*/,
+ const PointCloud<PointT>& /*cloud*/,
+ const std::string& /*pcd_filename*/)
{
return (false);
}
#ifdef __GNUC__
#pragma GCC system_header
#endif
+#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkStructuredGrid.h>
#include <vtkPoints.h>
cloud.fields = fields_;
cloud.point_step = 0;
- for (int i = 0; i < fields_.size (); i++)
+ for (size_t i = 0; i < fields_.size (); i++)
cloud.point_step += typeSize (cloud.fields[i].datatype);
std::fstream ifile (file_name.c_str (), std::fstream::in);
uint32_t offset = 0;
try
{
- for (int i = 0; i < fields_.size (); i++)
+ for (size_t i = 0; i < fields_.size (); i++)
offset += parse (tokens[i], fields_[i], data + offset);
}
catch (std::exception& /*e*/)
// Is there enough data in the buffer to return one image, and did we find the header?
// If not, go back and read some more data off the USB port
// Else, read the data, clean the g_buffer_, return to the user
- if (!first_image && (g_buffer_.size () >= image_size_ + data_adr) && data_adr != -1)
+ if (!first_image && (g_buffer_.size () >= static_cast<boost::circular_buffer<unsigned char>::size_type> (image_size_ + data_adr)) && data_adr != -1)
{
// An image found. Copy it from the buffer into the user given buffer
first_image = true;
}
- if (first_image && g_buffer_.size () >= image_size_)
+ if (first_image && g_buffer_.size () >= static_cast<boost::circular_buffer<unsigned char>::size_type> (image_size_))
break;
}
}
int depth_idx = 0;
- for (int x = 0; x < cloud->width; ++x)
+ for (int x = 0; x < static_cast<int> (cloud->width); ++x)
{
- for (int y = 0; y < cloud->height; ++y, ++depth_idx)
+ for (int y = 0; y < static_cast<int> (cloud->height); ++y, ++depth_idx)
{
double pixel = image_[x + image_width_ * y];
// Get rid of the noise
- if(cloud->points[depth_idx].z > 0.8f or cloud->points[depth_idx].z < 0.02f)
+ if(cloud->points[depth_idx].z > 0.8f || cloud->points[depth_idx].z < 0.02f)
{
cloud->points[depth_idx].x = std::numeric_limits<float>::quiet_NaN ();
cloud->points[depth_idx].y = std::numeric_limits<float>::quiet_NaN ();
{
// We need at least 2 full sync packets, in case the header starts at the end of the first sync packet to
// guarantee that the index returned actually exists in g_buffer_ (we perform no checking in the rest of the code)
- if (g_buffer_.size () < 2 * sync_packet_size_)
+ if (g_buffer_.size () < static_cast<boost::circular_buffer<unsigned char>::size_type> (2 * sync_packet_size_))
return (-1);
int data_ptr = -1;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/io/file_io.h>
+#include <pcl/io/boost.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/ply_io.h>
+#include <pcl/io/ifs_io.h>
+#include <pcl/io/obj_io.h>
+#include <pcl/io/vtk_io.h>
+
+namespace pcl
+{
+ namespace io
+ {
+ template<typename PointT> int
+ load (const std::string& file_name, pcl::PointCloud<PointT>& cloud)
+ {
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".pcd")
+ result = pcl::io::loadPCDFile (file_name, cloud);
+ else if (extension == ".ply")
+ result = pcl::io::loadPLYFile (file_name, cloud);
+ else if (extension == ".ifs")
+ result = pcl::io::loadIFSFile (file_name, cloud);
+ else
+ {
+ PCL_ERROR ("[pcl::io::load] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+ }
+
+ template<typename PointT> int
+ save (const std::string& file_name, const pcl::PointCloud<PointT>& cloud)
+ {
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".pcd")
+ result = pcl::io::savePCDFile (file_name, cloud, true);
+ else if (extension == ".ply")
+ result = pcl::io::savePLYFile (file_name, cloud, true);
+ else if (extension == ".ifs")
+ result = pcl::io::saveIFSFile (file_name, cloud);
+ else
+ {
+ PCL_ERROR ("[pcl::io::save] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+ }
+ }
+}
+
+int
+pcl::io::load (const std::string& file_name, pcl::PCLPointCloud2& blob)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".pcd")
+ result = pcl::io::loadPCDFile (file_name, blob);
+ else if (extension == ".ply")
+ result = pcl::io::loadPLYFile (file_name, blob);
+ else if (extension == ".ifs")
+ result = pcl::io::loadIFSFile (file_name, blob);
+ else if (extension == ".obj")
+ result = pcl::io::loadOBJFile (file_name, blob);
+ else
+ {
+ PCL_ERROR ("[pcl::io::load] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
+
+int
+pcl::io::load (const std::string& file_name, pcl::PolygonMesh& mesh)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".ply")
+ result = pcl::io::loadPLYFile (file_name, mesh);
+ else if (extension == ".ifs")
+ result = pcl::io::loadIFSFile (file_name, mesh);
+ else if (extension == ".obj")
+ result = pcl::io::loadOBJFile (file_name, mesh);
+ else
+ {
+ PCL_ERROR ("[pcl::io::load] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
+
+int
+pcl::io::load (const std::string& file_name, pcl::TextureMesh& mesh)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".obj")
+ result = pcl::io::loadOBJFile (file_name, mesh);
+ else
+ {
+ PCL_ERROR ("[pcl::io::load] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
+
+int
+pcl::io::save (const std::string& file_name, const pcl::PCLPointCloud2& blob, unsigned precision)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".pcd")
+ {
+ Eigen::Vector4f origin = Eigen::Vector4f::Zero ();
+ Eigen::Quaternionf orientation = Eigen::Quaternionf::Identity ();
+ result = pcl::io::savePCDFile (file_name, blob, origin, orientation, true);
+ }
+ else if (extension == ".ply")
+ {
+ Eigen::Vector4f origin = Eigen::Vector4f::Zero ();
+ Eigen::Quaternionf orientation = Eigen::Quaternionf::Identity ();
+ result = pcl::io::savePLYFile (file_name, blob, origin, orientation, true);
+ }
+ else if (extension == ".ifs")
+ result = pcl::io::saveIFSFile (file_name, blob);
+ else if (extension == ".vtk")
+ result = pcl::io::saveVTKFile (file_name, blob, precision);
+ else
+ {
+ PCL_ERROR ("[pcl::io::save] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
+
+int
+pcl::io::save (const std::string &file_name, const pcl::TextureMesh &tex_mesh, unsigned precision)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".obj")
+ result = pcl::io::saveOBJFile (file_name, tex_mesh, precision);
+ else
+ {
+ PCL_ERROR ("[pcl::io::save] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
+
+int
+pcl::io::save (const std::string &file_name, const pcl::PolygonMesh &poly_mesh, unsigned precision)
+{
+ boost::filesystem::path p (file_name.c_str ());
+ std::string extension = p.extension ().string ();
+ int result = -1;
+ if (extension == ".ply")
+ result = pcl::io::savePLYFileBinary (file_name, poly_mesh);
+ else if (extension == ".obj")
+ result = pcl::io::saveOBJFile (file_name, poly_mesh, precision);
+ else if (extension == ".vtk")
+ result = pcl::io::saveVTKFile (file_name, poly_mesh, precision);
+ else
+ {
+ PCL_ERROR ("[pcl::io::save] Don't know how to handle file with extension %s", extension.c_str ());
+ result = -1;
+ }
+ return (result);
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <fstream>
+#include <pcl/io/boost.h>
+#include <pcl/common/io.h>
+#include <pcl/io/ifs_io.h>
+#include <pcl/console/time.h>
+
+#include <cstring>
+#include <cerrno>
+
+///////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::IFSReader::readHeader (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ int &ifs_version, unsigned int &data_idx)
+{
+ // Default values
+ data_idx = 0;
+ ifs_version = IFS_V1_0;
+ cloud.width = cloud.height = cloud.point_step = cloud.row_step = 0;
+ cloud.data.clear ();
+
+ // By default, assume that there are _no_ invalid (e.g., NaN) points
+ //cloud.is_dense = true;
+
+ uint32_t nr_points = 0;
+ std::ifstream fs;
+ std::string line;
+
+ if (file_name == "" || !boost::filesystem::exists (file_name))
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] Could not find file '%s'.\n", file_name.c_str ());
+ return (-1);
+ }
+
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] Could not open file '%s'! Error : %s\n", file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+
+ //Read the magic
+ uint32_t length_of_magic;
+ fs.read ((char*)&length_of_magic, sizeof (uint32_t));
+ char *magic = new char [length_of_magic];
+ fs.read (magic, sizeof (char) * length_of_magic);
+ if (strcmp (magic, "IFS"))
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] File %s is not an IFS file!\n", file_name.c_str ());
+ fs.close ();
+ return (-1);
+ }
+ delete[] magic;
+
+ //Read IFS version
+ float version;
+ fs.read ((char*)&version, sizeof (float));
+ if (version == 1.0f)
+ ifs_version = IFS_V1_0;
+ else
+ if (version == 1.1f)
+ ifs_version = IFS_V1_1;
+ else
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] Bad IFS file %f!\n", version);
+ fs.close ();
+ return (-1);
+ }
+
+ //Read the name
+ uint32_t length_of_name;
+ fs.read ((char*)&length_of_name, sizeof (uint32_t));
+ char *name = new char [length_of_name];
+ fs.read (name, sizeof (char) * length_of_name);
+ delete[] name;
+ int offset = 0;
+
+ // Read the header and fill it in with wonderful values
+ try
+ {
+ while (!fs.eof ())
+ {
+ //Read the keyword
+ uint32_t length_of_keyword;
+ fs.read ((char*)&length_of_keyword, sizeof (uint32_t));
+ char *keyword = new char [length_of_keyword];
+ fs.read (keyword, sizeof (char) * length_of_keyword);
+
+ if (strcmp (keyword, "VERTICES") == 0)
+ {
+ fs.read ((char*)&nr_points, sizeof (uint32_t));
+ if ((nr_points == 0) || (nr_points > 10000000))
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] Bad number of vertices %lu!\n", nr_points);
+ fs.close ();
+ return (-1);
+ }
+
+ cloud.fields.resize (3);
+ cloud.fields[0].name = "x";
+ cloud.fields[1].name = "y";
+ cloud.fields[2].name = "z";
+
+ for (int i = 0; i < 3; ++i, offset += 4)
+ {
+ cloud.fields[i].offset = offset;
+ cloud.fields[i].datatype = pcl::PCLPointField::FLOAT32;
+ cloud.fields[i].count = 1;
+ }
+ cloud.point_step = offset;
+ cloud.data.resize (nr_points * cloud.point_step);
+ data_idx = fs.tellg ();
+ break;
+ }
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::IFSReader::readHeader] %s\n", exception);
+ fs.close ();
+ return (-1);
+ }
+
+ // Set width and height
+ cloud.width = nr_points;
+ cloud.height = 1;
+ cloud.row_step = cloud.point_step * cloud.width;
+
+ // Close file
+ fs.close ();
+
+ return (0);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::IFSReader::read (const std::string &file_name,
+ pcl::PCLPointCloud2 &cloud, int &ifs_version)
+{
+ pcl::console::TicToc tt;
+ tt.tic ();
+
+ unsigned int data_idx;
+
+ int res = readHeader (file_name, cloud, ifs_version, data_idx);
+
+ if (res < 0)
+ return (res);
+
+ // Setting the is_dense property to true by default
+ cloud.is_dense = true;
+
+ boost::iostreams::mapped_file_source mapped_file;
+
+ size_t data_size = data_idx + cloud.data.size ();
+
+ try
+ {
+ mapped_file.open (file_name, data_size, 0);
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] Error : %s!\n", file_name.c_str (), exception);
+ mapped_file.close ();
+ return (-1);
+ }
+
+ if(!mapped_file.is_open ())
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] File mapping failure\n");
+ mapped_file.close ();
+ return (-1);
+ }
+
+ // Copy the data
+ memcpy (&cloud.data[0], mapped_file.data () + data_idx, cloud.data.size ());
+
+ mapped_file.close ();
+
+ double total_time = tt.toc ();
+ PCL_DEBUG ("[pcl::IFSReader::read] Loaded %s as a %s cloud in %g ms with %d points. Available dimensions: %s.\n",
+ file_name.c_str (), cloud.is_dense ? "dense" : "non-dense", total_time,
+ cloud.width * cloud.height, pcl::getFieldsList (cloud).c_str ());
+ return (0);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::IFSReader::read (const std::string &file_name, pcl::PolygonMesh &mesh, int &ifs_version)
+{
+ pcl::console::TicToc tt;
+ tt.tic ();
+
+ unsigned int data_idx;
+
+ int res = readHeader (file_name, mesh.cloud, ifs_version, data_idx);
+
+ if (res < 0)
+ return (res);
+
+ // Setting the is_dense property to true by default
+ mesh.cloud.is_dense = true;
+
+ boost::iostreams::mapped_file_source mapped_file;
+
+ size_t data_size = data_idx + mesh.cloud.data.size ();
+
+ try
+ {
+ mapped_file.open (file_name, data_size, 0);
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] Error : %s!\n", file_name.c_str (), exception);
+ mapped_file.close ();
+ return (-1);
+ }
+
+ if(!mapped_file.is_open ())
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] File mapping failure\n");
+ mapped_file.close ();
+ return (-1);
+ }
+
+ // Copy the data
+ memcpy (&mesh.cloud.data[0], mapped_file.data () + data_idx, mesh.cloud.data.size ());
+
+ mapped_file.close ();
+
+ // Reopen the file to load the facets
+ std::ifstream fs;
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] Could not open file '%s'! Error : %s\n", file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+ // Jump to the end of cloud data
+ fs.seekg (data_size);
+ // Read the TRIANGLES keyword
+ uint32_t length_of_keyword;
+ fs.read ((char*)&length_of_keyword, sizeof (uint32_t));
+ char *keyword = new char [length_of_keyword];
+ fs.read (keyword, sizeof (char) * length_of_keyword);
+ if (strcmp (keyword, "TRIANGLES"))
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] File %s is does not contain facets!\n", file_name.c_str ());
+ fs.close ();
+ return (-1);
+ }
+ delete[] keyword;
+ // Read the number of facets
+ uint32_t nr_facets;
+ fs.read ((char*)&nr_facets, sizeof (uint32_t));
+ if ((nr_facets == 0) || (nr_facets > 10000000))
+ {
+ PCL_ERROR ("[pcl::IFSReader::read] Bad number of facets %lu!\n", nr_facets);
+ fs.close ();
+ return (-1);
+ }
+ // Resize the mesh polygons
+ mesh.polygons.resize (nr_facets);
+ // Fill each polygon
+ for (uint32_t i = 0; i < nr_facets; ++i)
+ {
+ pcl::Vertices &facet = mesh.polygons[i];
+ facet.vertices.resize (3);
+ fs.read ((char*)&(facet.vertices[0]), sizeof (uint32_t));
+ fs.read ((char*)&(facet.vertices[1]), sizeof (uint32_t));
+ fs.read ((char*)&(facet.vertices[2]), sizeof (uint32_t));
+ }
+ // We are done, close the file
+ fs.close ();
+ // Display statistics
+ double total_time = tt.toc ();
+ PCL_DEBUG ("[pcl::IFSReader::read] Loaded %s as a polygon mesh in %g ms with %d points and %d facets.\n",
+ file_name.c_str (), total_time, mesh.cloud.width * mesh.cloud.height, mesh.polygons.size ());
+ return (0);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::IFSWriter::write (const std::string &file_name, const pcl::PCLPointCloud2 &cloud, const std::string& cloud_name)
+{
+ if (cloud.data.empty ())
+ {
+ PCL_ERROR ("[pcl::IFSWriter::write] Input point cloud has no data!\n");
+ return (-1);
+ }
+
+ if (!cloud.is_dense)
+ {
+ PCL_ERROR ("[pcl::IFSWriter::write] Non dense cloud are not alowed by IFS format!\n");
+ return (-1);
+ }
+
+ const std::string magic = "IFS";
+ const float version = 1.0f;
+ const std::string vertices = "VERTICES";
+ std::vector<char> header (sizeof (uint32_t) + magic.size () + 1 +
+ sizeof (float) +
+ sizeof (uint32_t) + cloud_name.size () + 1 +
+ sizeof (uint32_t) + vertices.size () + 1 +
+ sizeof (uint32_t));
+ char* addr = &(header[0]);
+ const uint32_t magic_size = static_cast<uint32_t> (magic.size ()) + 1;
+ memcpy (addr, &magic_size, sizeof (uint32_t));
+ addr+= sizeof (uint32_t);
+ memcpy (addr, magic.c_str (), magic_size * sizeof (char));
+ addr+= magic_size * sizeof (char);
+ memcpy (addr, &version, sizeof (float));
+ addr+= sizeof (float);
+ const uint32_t cloud_name_size = static_cast<uint32_t> (cloud_name.size ()) + 1;
+ memcpy (addr, &cloud_name_size, sizeof (uint32_t));
+ addr+= sizeof (uint32_t);
+ memcpy (addr, cloud_name.c_str (), cloud_name_size * sizeof (char));
+ addr+= cloud_name_size * sizeof (char);
+ const uint32_t vertices_size = static_cast<uint32_t> (vertices.size ()) + 1;
+ memcpy (addr, &vertices_size, sizeof (uint32_t));
+ addr+= sizeof (uint32_t);
+ memcpy (addr, vertices.c_str (), vertices_size * sizeof (char));
+ addr+= vertices_size * sizeof (char);
+ const uint32_t nb_vertices = cloud.data.size () / cloud.point_step;
+ memcpy (addr, &nb_vertices, sizeof (uint32_t));
+ addr+= sizeof (uint32_t);
+
+ std::size_t data_idx = header.size ();
+
+ boost::iostreams::mapped_file_sink sink;
+ boost::iostreams::mapped_file_params params;
+ params.path = file_name;
+ params.flags = boost::iostreams::mapped_file_base::readwrite;
+ params.offset = 0;
+ params.new_file_size = data_idx + cloud.data.size ();
+ params.length = data_idx + cloud.data.size ();
+
+ try
+ {
+ sink.open (params);
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::IFSWriter::write] Error : %s!\n", file_name.c_str (), exception);
+ sink.close ();
+ return (-1);
+ }
+
+ if (!sink.is_open ())
+ {
+ PCL_ERROR ("[pcl::IFSWriter::write] Could not open file '%s'! Error : %s\n", file_name.c_str (), strerror(errno));
+ sink.close ();
+ return (-1);
+ }
+
+ // copy header
+ memcpy (sink.data (), &header[0], data_idx);
+
+ // Copy the data
+ memcpy (sink.data () + data_idx, &cloud.data[0], cloud.data.size ());
+
+ sink.close ();
+
+ return (0);
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ * Suat Gedikli <gedikli@willowgarage.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/pcl_config.h>
+#include <pcl/io/image_depth.h>
+
+#include <sstream>
+#include <limits>
+#include <iostream>
+
+#include <pcl/io/io_exception.h>
+
+using pcl::io::FrameWrapper;
+using pcl::io::IOException;
+
+pcl::io::DepthImage::DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, pcl::uint64_t shadow_value, pcl::uint64_t no_sample_value)
+: wrapper_ (depth_metadata)
+, baseline_ (baseline)
+, focal_length_ (focal_length)
+, shadow_value_ (shadow_value)
+, no_sample_value_ (no_sample_value)
+, timestamp_ (Clock::now ())
+{}
+
+
+pcl::io::DepthImage::DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, pcl::uint64_t shadow_value, pcl::uint64_t no_sample_value, Timestamp timestamp)
+: wrapper_(depth_metadata)
+, baseline_ (baseline)
+, focal_length_ (focal_length)
+, shadow_value_ (shadow_value)
+, no_sample_value_ (no_sample_value)
+, timestamp_(timestamp)
+{}
+
+
+pcl::io::DepthImage::~DepthImage ()
+{}
+
+
+const unsigned short*
+pcl::io::DepthImage::getData ()
+{
+ return static_cast<const unsigned short*> (wrapper_->getData ());
+}
+
+
+int
+pcl::io::DepthImage::getDataSize () const
+{
+ return (wrapper_->getDataSize ());
+}
+
+
+const FrameWrapper::Ptr
+pcl::io::DepthImage::getMetaData () const
+{
+ return (wrapper_);
+}
+
+
+float
+pcl::io::DepthImage::getBaseline () const
+{
+ return (baseline_);
+}
+
+
+float
+pcl::io::DepthImage::getFocalLength () const
+{
+ return (focal_length_);
+}
+
+
+pcl::uint64_t
+pcl::io::DepthImage::getShadowValue () const
+{
+ return (shadow_value_);
+}
+
+
+pcl::uint64_t
+pcl::io::DepthImage::getNoSampleValue () const
+{
+ return (no_sample_value_);
+}
+
+
+unsigned
+pcl::io::DepthImage::getWidth () const
+{
+ return (wrapper_->getWidth ());
+}
+
+
+unsigned
+pcl::io::DepthImage::getHeight () const
+{
+ return (wrapper_->getHeight ());
+}
+
+
+unsigned
+pcl::io::DepthImage::getFrameID () const
+{
+ return (wrapper_->getFrameID ());
+}
+
+
+pcl::uint64_t
+pcl::io::DepthImage::getTimestamp () const
+{
+ return (wrapper_->getTimestamp ());
+}
+
+
+pcl::io::DepthImage::Timestamp
+pcl::io::DepthImage::getSystemTimestamp () const
+{
+ return (timestamp_);
+}
+
+// Fill external buffers ////////////////////////////////////////////////////
+
+void
+pcl::io::DepthImage::fillDepthImageRaw (unsigned width, unsigned height, unsigned short* depth_buffer, unsigned line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("upsampling not supported: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0)
+ THROW_IO_EXCEPTION ("downsampling only supported for integer scale: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (line_step == 0)
+ line_step = width * static_cast<unsigned> (sizeof (unsigned short));
+
+ // special case no sclaing, no padding => memcopy!
+ if (width == wrapper_->getWidth () && height == wrapper_->getHeight () && (line_step == width * sizeof (unsigned short)))
+ {
+ memcpy (depth_buffer, wrapper_->getData (), wrapper_->getDataSize ());
+ return;
+ }
+
+ // padding skip for destination image
+ unsigned bufferSkip = line_step - width * static_cast<unsigned> (sizeof (unsigned short));
+
+ // step and padding skip for source image
+ unsigned xStep = wrapper_->getWidth () / width;
+ unsigned ySkip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ // Fill in the depth image data, converting mm to m
+ short bad_point = std::numeric_limits<short>::quiet_NaN ();
+ unsigned depthIdx = 0;
+
+ const unsigned short* inputBuffer = static_cast<const unsigned short*> (wrapper_->getData ());
+
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, depthIdx += ySkip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, depthIdx += xStep, ++depth_buffer)
+ {
+ /// @todo Different values for these cases
+ unsigned short pixel = inputBuffer[depthIdx];
+ if (pixel == 0 || pixel == no_sample_value_ || pixel == shadow_value_)
+ *depth_buffer = bad_point;
+ else
+ {
+ *depth_buffer = static_cast<unsigned short>( pixel );
+ }
+ }
+ // if we have padding
+ if (bufferSkip > 0)
+ {
+ char* cBuffer = reinterpret_cast<char*> (depth_buffer);
+ depth_buffer = reinterpret_cast<unsigned short*> (cBuffer + bufferSkip);
+ }
+ }
+}
+
+void
+pcl::io::DepthImage::fillDepthImage (unsigned width, unsigned height, float* depth_buffer, unsigned line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("upsampling not supported: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0)
+ THROW_IO_EXCEPTION ("downsampling only supported for integer scale: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (line_step == 0)
+ line_step = width * static_cast<unsigned> (sizeof (float));
+
+ // padding skip for destination image
+ unsigned bufferSkip = line_step - width * static_cast<unsigned> (sizeof (float));
+
+ // step and padding skip for source image
+ unsigned xStep = wrapper_->getWidth () / width;
+ unsigned ySkip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ // Fill in the depth image data, converting mm to m
+ float bad_point = std::numeric_limits<float>::quiet_NaN ();
+ unsigned depthIdx = 0;
+
+ const unsigned short* inputBuffer = static_cast<const unsigned short*> (wrapper_->getData ());
+
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, depthIdx += ySkip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, depthIdx += xStep, ++depth_buffer)
+ {
+ /// @todo Different values for these cases
+ unsigned short pixel = inputBuffer[depthIdx];
+ if (pixel == 0 || pixel == no_sample_value_ || pixel == shadow_value_)
+ *depth_buffer = bad_point;
+ else
+ {
+ *depth_buffer = static_cast<unsigned short>( pixel ) * 0.001f; // millimeters to meters
+ }
+ }
+ // if we have padding
+ if (bufferSkip > 0)
+ {
+ char* cBuffer = reinterpret_cast<char*> (depth_buffer);
+ depth_buffer = reinterpret_cast<float*> (cBuffer + bufferSkip);
+ }
+ }
+}
+
+void
+pcl::io::DepthImage::fillDisparityImage (unsigned width, unsigned height, float* disparity_buffer, unsigned line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("upsampling not supported: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0)
+ THROW_IO_EXCEPTION ("downsampling only supported for integer scale: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (line_step == 0)
+ line_step = width * static_cast<unsigned> (sizeof (float));
+
+ unsigned xStep = wrapper_->getWidth () / width;
+ unsigned ySkip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ unsigned bufferSkip = line_step - width * static_cast<unsigned> (sizeof (float));
+
+ // Fill in the depth image data
+ // iterate over all elements and fill disparity matrix: disp[x,y] = f * b / z_distance[x,y];
+ // focal length is for the native image resolution -> focal_length = focal_length_ / xStep;
+ float constant = focal_length_ * baseline_ * 1000.0f / static_cast<float> (xStep);
+
+ const unsigned short* inputBuffer = static_cast<const unsigned short*> (wrapper_->getData ());
+
+ for (unsigned yIdx = 0, depthIdx = 0; yIdx < height; ++yIdx, depthIdx += ySkip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, depthIdx += xStep, ++disparity_buffer)
+ {
+ unsigned short pixel = inputBuffer[depthIdx];
+ if (pixel == 0 || pixel == no_sample_value_ || pixel == shadow_value_)
+ *disparity_buffer = 0.0;
+ else
+ *disparity_buffer = constant / static_cast<float> (pixel);
+ }
+
+ // if we have padding
+ if (bufferSkip > 0)
+ {
+ char* cBuffer = reinterpret_cast<char*> (disparity_buffer);
+ disparity_buffer = reinterpret_cast<float*> (cBuffer + bufferSkip);
+ }
+ }
+}
//! Checks if a timestamp is given in the filename
//! And returns if so
bool
- getTimestampFromFilepath (const std::string &filepath, uint64_t ×tamp) const;
+ getTimestampFromFilepath (const std::string &filepath, pcl::uint64_t ×tamp) const;
size_t
numFrames () const;
bool
pcl::ImageGrabberBase::ImageGrabberImpl::getTimestampFromFilepath (
const std::string &filepath,
- uint64_t ×tamp) const
+ pcl::uint64_t ×tamp) const
{
// For now, we assume the file is of the form frame_[22-char POSIX timestamp]_*
char timestamp_str[256];
timestamp_str);
if (result > 0)
{
- // Convert to uint64_t, microseconds since 1970-01-01
+ // Convert to pcl::uint64_t, microseconds since 1970-01-01
boost::posix_time::ptime cur_date = boost::posix_time::from_iso_string (timestamp_str);
boost::posix_time::ptime zero_date (
boost::gregorian::date (1970,boost::gregorian::Jan,1));
}
}
// Handle timestamps
- uint64_t timestamp;
+ pcl::uint64_t timestamp;
if (getTimestampFromFilepath (depth_image_file, timestamp))
{
cloud_color.header.stamp = timestamp;
}
}
// Handle timestamps
- uint64_t timestamp;
+ pcl::uint64_t timestamp;
if (getTimestampFromFilepath (depth_image_file, timestamp))
{
cloud.header.stamp = timestamp;
depth.readOMP (depth_pclzf_file, cloud_color, num_threads_);
}
// handle timestamps
- uint64_t timestamp;
+ pcl::uint64_t timestamp;
if (getTimestampFromFilepath (depth_pclzf_file, timestamp))
{
cloud_color.header.stamp = timestamp;
else
depth.readOMP (depth_pclzf_file, cloud, num_threads_);
// handle timestamps
- uint64_t timestamp;
+ pcl::uint64_t timestamp;
if (getTimestampFromFilepath (depth_pclzf_file, timestamp))
{
cloud.header.stamp = timestamp;
////////////////////////////////////////////////////////////////////////////////////////
bool
-pcl::ImageGrabberBase::getTimestampAtIndex (size_t idx, uint64_t ×tamp) const
+pcl::ImageGrabberBase::getTimestampAtIndex (size_t idx, pcl::uint64_t ×tamp) const
{
std::string filename;
if (impl_->pclzf_mode_)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ * Suat Gedikli <gedikli@willowgarage.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/pcl_config.h>
+#include <pcl/io/image_ir.h>
+
+#include <sstream>
+#include <limits>
+#include <iostream>
+
+#include <pcl/io/io_exception.h>
+
+using pcl::io::FrameWrapper;
+using pcl::io::IOException;
+
+pcl::io::IRImage::IRImage (FrameWrapper::Ptr ir_metadata)
+ : wrapper_(ir_metadata)
+ , timestamp_(Clock::now ())
+{}
+
+
+pcl::io::IRImage::IRImage (FrameWrapper::Ptr ir_metadata, Timestamp time)
+ : wrapper_(ir_metadata)
+ , timestamp_(time)
+{}
+
+
+const unsigned short*
+pcl::io::IRImage::getData ()
+{
+ return ( static_cast<const unsigned short*> (wrapper_->getData ()) );
+}
+
+
+int
+pcl::io::IRImage::getDataSize () const
+{
+ return (wrapper_->getDataSize ());
+}
+
+
+const FrameWrapper::Ptr
+pcl::io::IRImage::getMetaData () const
+{
+ return (wrapper_);
+}
+
+
+unsigned
+pcl::io::IRImage::getWidth () const
+{
+ return (wrapper_->getWidth ());
+}
+
+
+unsigned
+pcl::io::IRImage::getHeight () const
+{
+ return (wrapper_->getHeight ());
+}
+
+
+unsigned
+pcl::io::IRImage::getFrameID () const
+{
+ return (wrapper_->getFrameID ());
+}
+
+
+pcl::uint64_t
+pcl::io::IRImage::getTimestamp () const
+{
+ return (wrapper_->getTimestamp ());
+}
+
+
+pcl::io::IRImage::Timestamp
+pcl::io::IRImage::getSystemTimestamp () const
+{
+ return (timestamp_);
+}
+
+
+void pcl::io::IRImage::fillRaw (unsigned width, unsigned height, unsigned short* ir_buffer, unsigned line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("upsampling not supported: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0)
+ THROW_IO_EXCEPTION ("downsampling only supported for integer scale: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (line_step == 0)
+ line_step = width * static_cast<unsigned> (sizeof (unsigned short));
+
+ // special case no sclaing, no padding => memcopy!
+ if (width == wrapper_->getWidth () && height == wrapper_->getHeight () && (line_step == width * sizeof (unsigned short)))
+ {
+ memcpy (ir_buffer, wrapper_->getData (), wrapper_->getDataSize ());
+ return;
+ }
+
+ // padding skip for destination image
+ unsigned bufferSkip = line_step - width * static_cast<unsigned> (sizeof (unsigned short));
+
+ // step and padding skip for source image
+ unsigned xStep = wrapper_->getWidth () / width;
+ unsigned ySkip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ unsigned irIdx = 0;
+
+ const unsigned short* inputBuffer = static_cast<const unsigned short*> (wrapper_->getData ());
+
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, irIdx += ySkip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, irIdx += xStep, ++ir_buffer)
+ *ir_buffer = inputBuffer[irIdx];
+
+ // if we have padding
+ if (bufferSkip > 0)
+ {
+ char* cBuffer = reinterpret_cast<char*> (ir_buffer);
+ ir_buffer = reinterpret_cast<unsigned short*> (cBuffer + bufferSkip);
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, respective authors.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/pcl_config.h>
+#include <pcl/io/image_rgb24.h>
+
+#include <pcl/io/io_exception.h>
+
+using pcl::io::FrameWrapper;
+using pcl::io::IOException;
+
+pcl::io::ImageRGB24::ImageRGB24 (FrameWrapper::Ptr image_metadata)
+ : Image (image_metadata)
+{}
+
+
+pcl::io::ImageRGB24::ImageRGB24 (FrameWrapper::Ptr image_metadata, Timestamp timestamp)
+ : Image (image_metadata, timestamp)
+{}
+
+
+pcl::io::ImageRGB24::~ImageRGB24 () throw ()
+{}
+
+bool
+pcl::io::ImageRGB24::isResizingSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const
+{
+ return (output_width <= input_width && output_height <= input_height && input_width % output_width == 0 && input_height % output_height == 0 );
+}
+
+
+void
+pcl::io::ImageRGB24::fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("Up-sampling not supported. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width == 0 && wrapper_->getHeight () % height == 0)
+ {
+ unsigned src_step = wrapper_->getWidth () / width;
+ unsigned src_skip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ if (gray_line_step == 0)
+ gray_line_step = width;
+
+ unsigned dst_skip = gray_line_step - width; // skip of padding values in bytes
+
+ unsigned char* dst_line = gray_buffer;
+ const RGB888Pixel* src_line = (RGB888Pixel*) wrapper_->getData ();
+
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, src_line += src_skip, dst_line += dst_skip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, src_line += src_step, dst_line ++)
+ {
+ *dst_line = static_cast<unsigned char>((static_cast<int> (src_line->r) * 299 +
+ static_cast<int> (src_line->g) * 587 +
+ static_cast<int> (src_line->b) * 114) * 0.001);
+ }
+ }
+ }
+ else
+ {
+ THROW_IO_EXCEPTION ("Down-sampling only possible for integer scale. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+ }
+}
+
+
+void
+pcl::io::ImageRGB24::fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step) const
+{
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("Up-sampling not supported. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (width == wrapper_->getWidth () && height == wrapper_->getHeight ())
+ {
+ unsigned line_size = width * 3;
+ if (rgb_line_step == 0 || rgb_line_step == line_size)
+ {
+ memcpy (rgb_buffer, wrapper_->getData (), wrapper_->getDataSize ());
+ }
+ else // line by line
+ {
+ unsigned char* rgb_line = rgb_buffer;
+ const unsigned char* src_line = static_cast<const unsigned char*> (wrapper_->getData ());
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, rgb_line += rgb_line_step, src_line += line_size)
+ {
+ memcpy (rgb_line, src_line, line_size);
+ }
+ }
+ }
+ else if (wrapper_->getWidth () % width == 0 && wrapper_->getHeight () % height == 0) // downsamplig
+ {
+ unsigned src_step = wrapper_->getWidth () / width;
+ unsigned src_skip = (wrapper_->getHeight () / height - 1) * wrapper_->getWidth ();
+
+ if (rgb_line_step == 0)
+ rgb_line_step = width * 3;
+
+ unsigned dst_skip = rgb_line_step - width * 3; // skip of padding values in bytes
+
+ RGB888Pixel* dst_line = reinterpret_cast<RGB888Pixel*> (rgb_buffer);
+ const RGB888Pixel* src_line = (RGB888Pixel*) wrapper_->getData ();
+
+ for (unsigned yIdx = 0; yIdx < height; ++yIdx, src_line += src_skip)
+ {
+ for (unsigned xIdx = 0; xIdx < width; ++xIdx, src_line += src_step, dst_line ++)
+ {
+ *dst_line = *src_line;
+ }
+
+ if (dst_skip != 0)
+ {
+ // use bytes to skip rather than XnRGB24Pixel's, since line_step does not need to be multiple of 3
+ unsigned char* temp = reinterpret_cast <unsigned char*> (dst_line);
+ dst_line = reinterpret_cast <RGB888Pixel*> (temp + dst_skip);
+ }
+ }
+ }
+ else
+ {
+ THROW_IO_EXCEPTION ("Down-sampling only possible for integer scale. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+ }
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 2011 Willow Garage, Inc.
+ * Suat Gedikli <gedikli@willowgarage.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <pcl/pcl_config.h>
+#include <pcl/io/image_yuv422.h>
+
+#include <pcl/io/io_exception.h>
+
+#include <sstream>
+#include <iostream>
+
+#define CLIP_CHAR(c) static_cast<unsigned char> ((c)>255?255:(c)<0?0:(c))
+
+using pcl::io::FrameWrapper;
+using pcl::io::IOException;
+
+pcl::io::ImageYUV422::ImageYUV422 (FrameWrapper::Ptr image_metadata)
+ : Image (image_metadata)
+{}
+
+
+pcl::io::ImageYUV422::ImageYUV422 (FrameWrapper::Ptr image_metadata, Timestamp timestamp)
+ : Image (image_metadata, timestamp)
+{}
+
+
+pcl::io::ImageYUV422::~ImageYUV422 () throw ()
+{}
+
+bool
+pcl::io::ImageYUV422::isResizingSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const
+{
+ return (output_width <= input_width && output_height <= input_height && input_width % output_width == 0 && input_height % output_height == 0 );
+}
+
+
+void
+pcl::io::ImageYUV422::fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step) const
+{
+ // 0 1 2 3
+ // u y1 v y2
+
+ if (wrapper_->getWidth () != width && wrapper_->getHeight () != height)
+ {
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight () )
+ THROW_IO_EXCEPTION ("Upsampling not supported. Request was: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if ( wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0
+ || (wrapper_->getWidth () / width) & 0x01 || (wrapper_->getHeight () / height & 0x01) )
+ THROW_IO_EXCEPTION ("Downsampling only possible for power of two scale in both dimensions. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+ }
+
+ register const uint8_t* yuv_buffer = (uint8_t*) wrapper_->getData ();
+
+ unsigned rgb_line_skip = 0;
+ if (rgb_line_step != 0)
+ rgb_line_skip = rgb_line_step - width * 3;
+
+ if (wrapper_->getWidth () == width && wrapper_->getHeight () == height)
+ {
+ for ( register unsigned yIdx = 0; yIdx < height; ++yIdx, rgb_buffer += rgb_line_skip )
+ {
+ for ( register unsigned xIdx = 0; xIdx < width; xIdx += 2, rgb_buffer += 6, yuv_buffer += 4 )
+ {
+ int v = yuv_buffer[2] - 128;
+ int u = yuv_buffer[0] - 128;
+
+ rgb_buffer[0] = CLIP_CHAR (yuv_buffer[1] + ((v * 18678 + 8192 ) >> 14));
+ rgb_buffer[1] = CLIP_CHAR (yuv_buffer[1] + ((v * -9519 - u * 6472 + 8192 ) >> 14));
+ rgb_buffer[2] = CLIP_CHAR (yuv_buffer[1] + ((u * 33292 + 8192 ) >> 14));
+
+ rgb_buffer[3] = CLIP_CHAR (yuv_buffer[3] + ((v * 18678 + 8192 ) >> 14));
+ rgb_buffer[4] = CLIP_CHAR (yuv_buffer[3] + ((v * -9519 - u * 6472 + 8192 ) >> 14));
+ rgb_buffer[5] = CLIP_CHAR (yuv_buffer[3] + ((u * 33292 + 8192 ) >> 14));
+ }
+ }
+ }
+ else
+ {
+ register unsigned yuv_step = wrapper_->getWidth () / width;
+ register unsigned yuv_x_step = yuv_step << 1;
+ register unsigned yuv_skip = (wrapper_->getHeight () / height - 1) * ( wrapper_->getWidth () << 1 );
+
+ for ( register unsigned yIdx = 0; yIdx < wrapper_->getHeight (); yIdx += yuv_step, yuv_buffer += yuv_skip, rgb_buffer += rgb_line_skip )
+ {
+ for ( register unsigned xIdx = 0; xIdx < wrapper_->getWidth (); xIdx += yuv_step, rgb_buffer += 3, yuv_buffer += yuv_x_step )
+ {
+ int v = yuv_buffer[2] - 128;
+ int u = yuv_buffer[0] - 128;
+
+ rgb_buffer[0] = CLIP_CHAR (yuv_buffer[1] + ((v * 18678 + 8192 ) >> 14));
+ rgb_buffer[1] = CLIP_CHAR (yuv_buffer[1] + ((v * -9519 - u * 6472 + 8192 ) >> 14));
+ rgb_buffer[2] = CLIP_CHAR (yuv_buffer[1] + ((u * 33292 + 8192 ) >> 14));
+ }
+ }
+ }
+}
+
+
+void
+pcl::io::ImageYUV422::fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step) const
+{
+ // u y1 v y2
+ if (width > wrapper_->getWidth () || height > wrapper_->getHeight ())
+ THROW_IO_EXCEPTION ("Upsampling not supported. Request was: %d x %d -> %d x %d", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ if (wrapper_->getWidth () % width != 0 || wrapper_->getHeight () % height != 0)
+ THROW_IO_EXCEPTION ("Downsampling only possible for integer scales in both dimensions. Request was %d x %d -> %d x %d.", wrapper_->getWidth (), wrapper_->getHeight (), width, height);
+
+ unsigned gray_line_skip = 0;
+ if (gray_line_step != 0)
+ gray_line_skip = gray_line_step - width;
+
+ register unsigned yuv_step = wrapper_->getWidth () / width;
+ register unsigned yuv_x_step = yuv_step << 1;
+ register unsigned yuv_skip = (wrapper_->getHeight () / height - 1) * ( wrapper_->getWidth () << 1 );
+ register const uint8_t* yuv_buffer = ( (uint8_t*) wrapper_->getData () + 1);
+
+ for ( register unsigned yIdx = 0; yIdx < wrapper_->getHeight (); yIdx += yuv_step, yuv_buffer += yuv_skip, gray_buffer += gray_line_skip )
+ {
+ for ( register unsigned xIdx = 0; xIdx < wrapper_->getWidth (); xIdx += yuv_step, ++gray_buffer, yuv_buffer += yuv_x_step )
+ {
+ *gray_buffer = *yuv_buffer;
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2011 Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include "pcl/io/io_exception.h"
+#include <sstream>
+
+pcl::io::IOException::IOException (const std::string& function_name, const std::string& file_name, unsigned line_number, const std::string& message)
+ : function_name_ (function_name)
+ , file_name_ (file_name)
+ , line_number_ (line_number)
+ , message_ (message)
+{
+ std::stringstream sstream;
+ sstream << function_name_ << " @ " << file_name_ << " @ " << line_number_ << " : " << message_;
+ message_long_ = sstream.str ();
+}
+
+pcl::io::IOException::~IOException () throw ()
+{
+}
+
+pcl::io::IOException&
+pcl::io::IOException::operator = (const IOException& exception)
+{
+ message_ = exception.message_;
+ return (*this);
+}
+
+const char*
+pcl::io::IOException::what () const throw ()
+{
+ return (message_long_.c_str ());
+}
+
+const std::string&
+pcl::io::IOException::getFunctionName () const
+{
+ return (function_name_);
+}
+
+const std::string&
+pcl::io::IOException::getFileName () const
+{
+ return (file_name_);
+}
+
+unsigned
+pcl::io::IOException::getLineNumber () const
+{
+ return (line_number_);
+}
#include <vector>
#include <stdlib.h>
#include <stdio.h>
-#include <stdint.h>
#include <assert.h>
// user defined I/O callback methods for libPNG
namespace
{
+ using pcl::uint8_t;
/////////////////////////////////////////////////////////////////////////////////////////
void
user_read_data (png_structp png_ptr, png_bytep data, png_size_t length)
size_t& height_arg,
unsigned int& channels_arg)
{
- int y;
+ unsigned long y;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 png_width;
#define LZF_HEADER_SIZE 37
+
+// The signature of boost::property_tree::xml_parser::write_xml() changed in Boost 1.56
+// See https://github.com/PointCloudLibrary/pcl/issues/864
+#include <boost/version.hpp>
+#if (BOOST_VERSION >= 105600)
+ typedef boost::property_tree::xml_writer_settings<std::string> xml_writer_settings;
+#else
+ typedef boost::property_tree::xml_writer_settings<char> xml_writer_settings;
+#endif
+
+
//////////////////////////////////////////////////////////////////////////////
bool
pcl::io::LZFImageWriter::saveImageBlob (const char* data,
catch (std::exception& e)
{}
- boost::property_tree::xml_writer_settings<char> settings ('\t', 1);
pt.put (tag, parameter);
- write_xml (filename, pt, std::locale (), settings);
+ write_xml (filename, pt, std::locale (), xml_writer_settings ('\t', 1));
return (true);
}
catch (std::exception& e)
{}
- boost::property_tree::xml_writer_settings<char> settings ('\t', 1);
pt.put ("depth.focal_length_x", parameters.focal_length_x);
pt.put ("depth.focal_length_y", parameters.focal_length_y);
pt.put ("depth.principal_point_x", parameters.principal_point_x);
pt.put ("depth.principal_point_y", parameters.principal_point_y);
pt.put ("depth.z_multiplication_factor", z_multiplication_factor_);
- write_xml (filename, pt, std::locale (), settings);
+ write_xml (filename, pt, std::locale (), xml_writer_settings ('\t', 1));
return (true);
}
int ptr1 = 0,
ptr2 = width * height,
ptr3 = 2 * width * height;
- for (int i = 0; i < width * height; ++i, ++ptr1, ++ptr2, ++ptr3)
+ for (uint32_t i = 0; i < width * height; ++i, ++ptr1, ++ptr2, ++ptr3)
{
rrggbb[ptr1] = data[i * 3 + 0];
rrggbb[ptr2] = data[i * 3 + 1];
catch (std::exception& e)
{}
- boost::property_tree::xml_writer_settings<char> settings ('\t', 1);
pt.put ("rgb.focal_length_x", parameters.focal_length_x);
pt.put ("rgb.focal_length_y", parameters.focal_length_y);
pt.put ("rgb.principal_point_x", parameters.principal_point_x);
pt.put ("rgb.principal_point_y", parameters.principal_point_y);
- write_xml (filename, pt, std::locale (), settings);
+ write_xml (filename, pt, std::locale (), xml_writer_settings ('\t', 1));
return (true);
}
*
* Point Cloud Library (PCL) - www.pointclouds.org
* Copyright (c) 2010, Willow Garage, Inc.
+ * Copyright (c) 2013, Open Perception, Inc.
*
* All rights reserved.
*
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
- *
*/
#include <pcl/io/obj_io.h>
#include <fstream>
#include <iostream>
#include <pcl/common/io.h>
+#include <pcl/io/boost.h>
+#include <boost/lexical_cast.hpp>
+#include <pcl/console/time.h>
+
+pcl::MTLReader::MTLReader ()
+{
+ xyz_to_rgb_matrix_ << 2.3706743, -0.9000405, -0.4706338,
+ -0.5138850, 1.4253036, 0.0885814,
+ 0.0052982, -0.0146949, 1.0093968;
+}
+
+inline void
+pcl::MTLReader::cie2rgb (const Eigen::Vector3f &xyz, pcl::TexMaterial::RGB& rgb) const
+{
+ Eigen::Vector3f rgb_vec = xyz_to_rgb_matrix_ * xyz;
+ rgb.r = rgb_vec[0]; rgb.g = rgb_vec[1]; rgb.b = rgb_vec[2];
+}
+
+int
+pcl::MTLReader::fillRGBfromXYZ (const std::vector<std::string>& split_line,
+ pcl::TexMaterial::RGB& rgb)
+{
+ Eigen::Vector3f xyz;
+ if (split_line.size () == 5)
+ {
+ try
+ {
+ xyz[0] = boost::lexical_cast<float> (split_line[2]);
+ xyz[1] = boost::lexical_cast<float> (split_line[3]);
+ xyz[2] = boost::lexical_cast<float> (split_line[4]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ return (-1);
+ }
+ }
+ else
+ if (split_line.size () == 3)
+ {
+ try
+ {
+ xyz[0] = xyz[1] = xyz[2] = boost::lexical_cast<float> (split_line[2]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ return (-1);
+ }
+ }
+ else
+ return (-1);
+
+ cie2rgb (xyz, rgb);
+ return (0);
+}
+
+int
+pcl::MTLReader::fillRGBfromRGB (const std::vector<std::string>& split_line,
+ pcl::TexMaterial::RGB& rgb)
+{
+ if (split_line.size () == 4)
+ {
+ try
+ {
+ rgb.r = boost::lexical_cast<float> (split_line[1]);
+ rgb.g = boost::lexical_cast<float> (split_line[2]);
+ rgb.b = boost::lexical_cast<float> (split_line[3]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ rgb.r = rgb.g = rgb.b = 0;
+ return (-1);
+ }
+ }
+ else
+ if (split_line.size () == 2)
+ {
+ try
+ {
+ rgb.r = rgb.g = rgb.b = boost::lexical_cast<float> (split_line[1]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ return (-1);
+ }
+ }
+ else
+ return (-1);
+
+ return (0);
+}
+
+std::vector<pcl::TexMaterial>::const_iterator
+pcl::MTLReader::getMaterial (const std::string& material_name) const
+{
+ std::vector<pcl::TexMaterial>::const_iterator mat_it = materials_.begin ();
+ for (; mat_it != materials_.end (); ++mat_it)
+ if (mat_it->tex_name == material_name)
+ break;
+ return (mat_it);
+}
+
+int
+pcl::MTLReader::read (const std::string& obj_file_name,
+ const std::string& mtl_file_name)
+{
+ if (obj_file_name == "" || !boost::filesystem::exists (obj_file_name))
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not find file '%s'!\n",
+ obj_file_name.c_str ());
+ return (-1);
+ }
+
+ if (mtl_file_name == "")
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] MTL file name is empty!\n");
+ return (-1);
+ }
+
+ boost::filesystem::path obj_file_path (obj_file_name.c_str ());
+ boost::filesystem::path mtl_file_path = obj_file_path.parent_path ();
+ mtl_file_path /= mtl_file_name;
+ return (read (mtl_file_path.string ()));
+}
+
+int
+pcl::MTLReader::read (const std::string& mtl_file_path)
+{
+ if (mtl_file_path == "" || !boost::filesystem::exists (mtl_file_path))
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not find file '%s'.\n", mtl_file_path.c_str ());
+ return (-1);
+ }
+
+ std::ifstream mtl_file;
+ mtl_file.open (mtl_file_path.c_str (), std::ios::binary);
+ if (!mtl_file.is_open () || mtl_file.fail ())
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not open file '%s'! Error : %s\n",
+ mtl_file_path.c_str (), strerror(errno));
+ mtl_file.close ();
+ return (-1);
+ }
+
+ std::string line;
+ std::vector<std::string> st;
+ boost::filesystem::path parent_path = mtl_file_path.c_str ();
+ parent_path = parent_path.parent_path ();
+
+ try
+ {
+ while (!mtl_file.eof ())
+ {
+ getline (mtl_file, line);
+ // Ignore empty lines
+ if (line == "")
+ continue;
+
+ // Tokenize the line
+ std::stringstream sstream (line);
+ sstream.imbue (std::locale::classic ());
+ line = sstream.str ();
+ boost::trim (line);
+ boost::split (st, line, boost::is_any_of ("\t\r "), boost::token_compress_on);
+ // Ignore comments
+ if (st[0] == "#")
+ continue;
+
+ if (st[0] == "newmtl")
+ {
+ materials_.push_back (pcl::TexMaterial ());
+ materials_.back ().tex_name = st[1];
+ continue;
+ }
+
+ if (st[0] == "Ka" || st[0] == "Kd" || st[0] == "Ks")
+ {
+ if (st[1] == "spectral")
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Can't handle spectral files!\n");
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ else
+ {
+ pcl::TexMaterial::RGB &rgb = materials_.back ().tex_Ka;
+ if (st[0] == "Kd")
+ rgb = materials_.back ().tex_Kd;
+ else if (st[0] == "Ks")
+ rgb = materials_.back ().tex_Ks;
+
+ if (st[1] == "xyz")
+ {
+ if (fillRGBfromXYZ (st, rgb))
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to RGB values",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ }
+ else
+ {
+ if (fillRGBfromRGB (st, rgb))
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to RGB values",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ }
+ }
+ continue;
+ }
+
+ if (st[0] == "illum")
+ {
+ try
+ {
+ materials_.back ().tex_illum = boost::lexical_cast<int> (st[1]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to illumination model",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ continue;
+ }
+
+ if (st[0] == "d")
+ {
+ if (st.size () > 2)
+ {
+ try
+ {
+ materials_.back ().tex_d = boost::lexical_cast<float> (st[2]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to transparency value",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ }
+ else
+ {
+ try
+ {
+ materials_.back ().tex_d = boost::lexical_cast<float> (st[1]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to transparency value",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ }
+ continue;
+ }
+
+ if (st[0] == "Ns")
+ {
+ try
+ {
+ materials_.back ().tex_d = boost::lexical_cast<float> (st[1]);
+ }
+ catch (boost::bad_lexical_cast &)
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] Could not convert %s to shininess value",
+ line.c_str ());
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+ continue;
+ }
+
+ if (st[0] == "map_Kd")
+ {
+ boost::filesystem::path full_path = parent_path;
+ full_path/= st.back ().c_str ();
+ materials_.back ().tex_file = full_path.string ();
+ continue;
+ }
+ // other elements? we don't care for now
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::MTLReader::read] %s\n", exception);
+ mtl_file.close ();
+ materials_.clear ();
+ return (-1);
+ }
+
+ return (0);
+}
+
+int
+pcl::OBJReader::readHeader (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, int &data_type, unsigned int &data_idx,
+ const int offset)
+{
+ origin = Eigen::Vector4f::Zero ();
+ orientation = Eigen::Quaternionf::Identity ();
+ file_version = 0;
+ cloud.width = cloud.height = cloud.point_step = cloud.row_step = 0;
+ cloud.data.clear ();
+ data_type = 0;
+ data_idx = offset;
+
+ std::ifstream fs;
+ std::string line;
+
+ if (file_name == "" || !boost::filesystem::exists (file_name))
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] Could not find file '%s'.\n", file_name.c_str ());
+ return (-1);
+ }
+
+ // Open file in binary mode to avoid problem of
+ // std::getline() corrupting the result of ifstream::tellg()
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] Could not open file '%s'! Error : %s\n", file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+
+ // Seek at the given offset
+ fs.seekg (offset, std::ios::beg);
+
+ // Read the header and fill it in with wonderful values
+ bool vertex_normal_found = false;
+ bool vertex_texture_found = false;
+ // Material library, skip for now!
+ // bool material_found = false;
+ std::vector<std::string> material_files;
+ std::size_t nr_point = 0;
+ std::vector<std::string> st;
+
+ try
+ {
+ while (!fs.eof ())
+ {
+ getline (fs, line);
+ // Ignore empty lines
+ if (line == "")
+ continue;
+
+ // Tokenize the line
+ std::stringstream sstream (line);
+ sstream.imbue (std::locale::classic ());
+ line = sstream.str ();
+ boost::trim (line);
+ boost::split (st, line, boost::is_any_of ("\t\r "), boost::token_compress_on);
+ // Ignore comments
+ if (st.at (0) == "#")
+ continue;
+
+ // Vertex
+ if (st.at (0) == "v")
+ {
+ ++nr_point;
+ continue;
+ }
+
+ // Vertex texture
+ if ((st.at (0) == "vt") && !vertex_texture_found)
+ {
+ vertex_texture_found = true;
+ continue;
+ }
+
+ // Vertex normal
+ if ((st.at (0) == "vn") && !vertex_normal_found)
+ {
+ vertex_normal_found = true;
+ continue;
+ }
+
+ // Material library, skip for now!
+ if (st.at (0) == "mtllib")
+ {
+ material_files.push_back (st.at (1));
+ continue;
+ }
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] %s\n", exception);
+ fs.close ();
+ return (-1);
+ }
+
+ if (!nr_point)
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] No vertices found!\n");
+ fs.close ();
+ return (-1);
+ }
+
+ int field_offset = 0;
+ for (int i = 0; i < 3; ++i, field_offset += 4)
+ {
+ cloud.fields.push_back (pcl::PCLPointField ());
+ cloud.fields[i].offset = field_offset;
+ cloud.fields[i].datatype = pcl::PCLPointField::FLOAT32;
+ cloud.fields[i].count = 1;
+ }
+
+ cloud.fields[0].name = "x";
+ cloud.fields[1].name = "y";
+ cloud.fields[2].name = "z";
+
+ if (vertex_normal_found)
+ {
+ std::string normals_names[3] = { "normal_x", "normal_y", "normal_z" };
+ for (int i = 0; i < 3; ++i, field_offset += 4)
+ {
+ cloud.fields.push_back (pcl::PCLPointField ());
+ pcl::PCLPointField& last = cloud.fields.back ();
+ last.name = normals_names[i];
+ last.offset = field_offset;
+ last.datatype = pcl::PCLPointField::FLOAT32;
+ last.count = 1;
+ }
+ }
+
+ if (material_files.size () > 0)
+ {
+ for (std::size_t i = 0; i < material_files.size (); ++i)
+ {
+ MTLReader companion;
+ if (companion.read (file_name, material_files[i]))
+ PCL_WARN ("[pcl::OBJReader::readHeader] Problem reading material file %s\n",
+ material_files[i].c_str ());
+ companions_.push_back (companion);
+ }
+ }
+
+ cloud.point_step = field_offset;
+ cloud.width = nr_point;
+ cloud.height = 1;
+ cloud.row_step = cloud.point_step * cloud.width;
+ cloud.is_dense = true;
+ cloud.data.resize (cloud.point_step * nr_point);
+ fs.close ();
+ return (0);
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::PCLPointCloud2 &cloud, const int offset)
+{
+ int file_version;
+ Eigen::Vector4f origin;
+ Eigen::Quaternionf orientation;
+ return (read (file_name, cloud, origin, orientation, file_version, offset));
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset)
+{
+ pcl::console::TicToc tt;
+ tt.tic ();
+
+ int data_type;
+ unsigned int data_idx;
+ if (readHeader (file_name, cloud, origin, orientation, file_version, data_type, data_idx, offset))
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] Problem reading header!\n");
+ return (-1);
+ }
+
+ std::ifstream fs;
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] Could not open file '%s'! Error : %s\n",
+ file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+
+ // Seek at the given offset
+ fs.seekg (data_idx, std::ios::beg);
+
+ // Get normal_x and rgba fields indices
+ int normal_x_field = -1;
+ // std::size_t rgba_field = 0;
+ for (std::size_t i = 0; i < cloud.fields.size (); ++i)
+ if (cloud.fields[i].name == "normal_x")
+ {
+ normal_x_field = i;
+ break;
+ }
+
+
+ // else if (cloud.fields[i].name == "rgba")
+ // rgba_field = i;
+
+ std::size_t point_idx = 0;
+ std::size_t normal_idx = 0;
+ std::string line;
+ std::vector<std::string> st;
+ try
+ {
+ while (!fs.eof ())
+ {
+ getline (fs, line);
+ // Ignore empty lines
+ if (line == "")
+ continue;
+
+ // Tokenize the line
+ std::stringstream sstream (line);
+ sstream.imbue (std::locale::classic ());
+ line = sstream.str ();
+ boost::trim (line);
+ boost::split (st, line, boost::is_any_of ("\t\r "), boost::token_compress_on);
+
+ // Ignore comments
+ if (st[0] == "#")
+ continue;
+
+ // Vertex
+ if (st[0] == "v")
+ {
+ try
+ {
+ for (int i = 1, f = 0; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&cloud.data[point_idx * cloud.point_step + cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++point_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert %s to vertex coordinates!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+
+ // Vertex normal
+ if (st[0] == "vn")
+ {
+ try
+ {
+ for (int i = 1, f = normal_x_field; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&cloud.data[normal_idx * cloud.point_step + cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++normal_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert line %s to vertex normal!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] %s\n", exception);
+ fs.close ();
+ return (-1);
+ }
+
+ double total_time = tt.toc ();
+ PCL_DEBUG ("[pcl::OBJReader::read] Loaded %s as a dense cloud in %g ms with %d points. Available dimensions: %s.\n",
+ file_name.c_str (), total_time,
+ cloud.width * cloud.height, pcl::getFieldsList (cloud).c_str ());
+ fs.close ();
+ return (0);
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::TextureMesh &mesh, const int offset)
+{
+ int file_version;
+ Eigen::Vector4f origin;
+ Eigen::Quaternionf orientation;
+ return (read (file_name, mesh, origin, orientation, file_version, offset));
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::TextureMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset)
+{
+ pcl::console::TicToc tt;
+ tt.tic ();
+
+ int data_type;
+ unsigned int data_idx;
+ if (readHeader (file_name, mesh.cloud, origin, orientation, file_version, data_type, data_idx, offset))
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] Problem reading header!\n");
+ return (-1);
+ }
+
+ std::ifstream fs;
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] Could not open file '%s'! Error : %s\n",
+ file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+
+ // Seek at the given offset
+ fs.seekg (data_idx, std::ios::beg);
+
+ // Get normal_x and rgba fields indices
+ int normal_x_field = -1;
+ // std::size_t rgba_field = 0;
+ for (std::size_t i = 0; i < mesh.cloud.fields.size (); ++i)
+ if (mesh.cloud.fields[i].name == "normal_x")
+ {
+ normal_x_field = i;
+ break;
+ }
+
+ std::size_t v_idx = 0;
+ std::size_t vn_idx = 0;
+ std::size_t vt_idx = 0;
+ std::size_t f_idx = 0;
+ std::string line;
+ std::vector<std::string> st;
+ std::vector<Eigen::Vector2f> coordinates;
+ try
+ {
+ while (!fs.eof ())
+ {
+ getline (fs, line);
+ // Ignore empty lines
+ if (line == "")
+ continue;
+
+ // Tokenize the line
+ std::stringstream sstream (line);
+ sstream.imbue (std::locale::classic ());
+ line = sstream.str ();
+ boost::trim (line);
+ boost::split (st, line, boost::is_any_of ("\t\r "), boost::token_compress_on);
+
+ // Ignore comments
+ if (st[0] == "#")
+ continue;
+ // Vertex
+ if (st[0] == "v")
+ {
+ try
+ {
+ for (int i = 1, f = 0; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&mesh.cloud.data[v_idx * mesh.cloud.point_step + mesh.cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++v_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert %s to vertex coordinates!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+ // Vertex normal
+ if (st[0] == "vn")
+ {
+ try
+ {
+ for (int i = 1, f = normal_x_field; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&mesh.cloud.data[vn_idx * mesh.cloud.point_step + mesh.cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++vn_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert line %s to vertex normal!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+ // Texture coordinates
+ if (st[0] == "vt")
+ {
+ try
+ {
+ Eigen::Vector3f c (0, 0, 0);
+ for (std::size_t i = 1; i < st.size (); ++i)
+ c[i-1] = boost::lexical_cast<float> (st[i]);
+ if (c[2] == 0)
+ coordinates.push_back (Eigen::Vector2f (c[0], c[1]));
+ else
+ coordinates.push_back (Eigen::Vector2f (c[0]/c[2], c[1]/c[2]));
+ ++vt_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert line %s to texture coordinates!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+ // Material
+ if (st[0] == "usemtl")
+ {
+ mesh.tex_polygons.push_back (std::vector<pcl::Vertices> ());
+ mesh.tex_materials.push_back (pcl::TexMaterial ());
+ for (std::size_t i = 0; i < companions_.size (); ++i)
+ {
+ std::vector<pcl::TexMaterial>::const_iterator mat_it = companions_[i].getMaterial (st[1]);
+ if (mat_it != companions_[i].materials_.end ())
+ {
+ mesh.tex_materials.back () = *mat_it;
+ break;
+ }
+ }
+ // We didn't find the appropriate material so we create it here with name only.
+ if (mesh.tex_materials.back ().tex_name == "")
+ mesh.tex_materials.back ().tex_name = st[1];
+ mesh.tex_coordinates.push_back (coordinates);
+ coordinates.clear ();
+ continue;
+ }
+ // Face
+ if (st[0] == "f")
+ {
+ //We only care for vertices indices
+ pcl::Vertices face_v; face_v.vertices.resize (st.size () - 1);
+ for (std::size_t i = 1; i < st.size (); ++i)
+ {
+ int v;
+ sscanf (st[i].c_str (), "%d", &v);
+ v = (v < 0) ? v_idx + v : v - 1;
+ face_v.vertices[i-1] = v;
+ }
+ mesh.tex_polygons.back ().push_back (face_v);
+ ++f_idx;
+ continue;
+ }
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] %s\n", exception);
+ fs.close ();
+ return (-1);
+ }
+
+ double total_time = tt.toc ();
+ PCL_DEBUG ("[pcl::OBJReader::read] Loaded %s as a TextureMesh in %g ms with %g points, %g texture materials, %g polygons.\n",
+ file_name.c_str (), total_time,
+ v_idx -1, mesh.tex_materials.size (), f_idx -1);
+ fs.close ();
+ return (0);
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::PolygonMesh &mesh, const int offset)
+{
+ int file_version;
+ Eigen::Vector4f origin;
+ Eigen::Quaternionf orientation;
+ return (read (file_name, mesh, origin, orientation, file_version, offset));
+}
+
+int
+pcl::OBJReader::read (const std::string &file_name, pcl::PolygonMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &file_version, const int offset)
+{
+ pcl::console::TicToc tt;
+ tt.tic ();
+
+ int data_type;
+ unsigned int data_idx;
+ if (readHeader (file_name, mesh.cloud, origin, orientation, file_version, data_type, data_idx, offset))
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] Problem reading header!\n");
+ return (-1);
+ }
+
+ std::ifstream fs;
+ fs.open (file_name.c_str (), std::ios::binary);
+ if (!fs.is_open () || fs.fail ())
+ {
+ PCL_ERROR ("[pcl::OBJReader::readHeader] Could not open file '%s'! Error : %s\n",
+ file_name.c_str (), strerror(errno));
+ fs.close ();
+ return (-1);
+ }
+
+ // Seek at the given offset
+ fs.seekg (data_idx, std::ios::beg);
+
+ // Get normal_x and rgba fields indices
+ int normal_x_field = -1;
+ // std::size_t rgba_field = 0;
+ for (std::size_t i = 0; i < mesh.cloud.fields.size (); ++i)
+ if (mesh.cloud.fields[i].name == "normal_x")
+ {
+ normal_x_field = i;
+ break;
+ }
+
+ std::size_t v_idx = 0;
+ std::size_t vn_idx = 0;
+ std::string line;
+ std::vector<std::string> st;
+ try
+ {
+ while (!fs.eof ())
+ {
+ getline (fs, line);
+ // Ignore empty lines
+ if (line == "")
+ continue;
+
+ // Tokenize the line
+ std::stringstream sstream (line);
+ sstream.imbue (std::locale::classic ());
+ line = sstream.str ();
+ boost::trim (line);
+ boost::split (st, line, boost::is_any_of ("\t\r "), boost::token_compress_on);
+
+ // Ignore comments
+ if (st[0] == "#")
+ continue;
+
+ // Vertex
+ if (st[0] == "v")
+ {
+ try
+ {
+ for (int i = 1, f = 0; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&mesh.cloud.data[v_idx * mesh.cloud.point_step + mesh.cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++v_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert %s to vertex coordinates!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+
+ // Vertex normal
+ if (st[0] == "vn")
+ {
+ try
+ {
+ for (int i = 1, f = normal_x_field; i < 4; ++i, ++f)
+ {
+ float value = boost::lexical_cast<float> (st[i]);
+ memcpy (&mesh.cloud.data[vn_idx * mesh.cloud.point_step + mesh.cloud.fields[f].offset],
+ &value,
+ sizeof (float));
+ }
+ ++vn_idx;
+ }
+ catch (const boost::bad_lexical_cast &e)
+ {
+ PCL_ERROR ("Unable to convert line %s to vertex normal!", line.c_str ());
+ return (-1);
+ }
+ continue;
+ }
+
+ // Face
+ if (st[0] == "f")
+ {
+ pcl::Vertices face_vertices; face_vertices.vertices.resize (st.size () - 1);
+ for (std::size_t i = 1; i < st.size (); ++i)
+ {
+ int v;
+ sscanf (st[i].c_str (), "%d", &v);
+ v = (v < 0) ? v_idx + v : v - 1;
+ face_vertices.vertices[i - 1] = v;
+ }
+ mesh.polygons.push_back (face_vertices);
+ continue;
+ }
+ }
+ }
+ catch (const char *exception)
+ {
+ PCL_ERROR ("[pcl::OBJReader::read] %s\n", exception);
+ fs.close ();
+ return (-1);
+ }
+
+ double total_time = tt.toc ();
+ PCL_DEBUG ("[pcl::OBJReader::read] Loaded %s as a PolygonMesh in %g ms with %g points and %g polygons.\n",
+ file_name.c_str (), total_time,
+ mesh.cloud.width * mesh.cloud.height, mesh.polygons.size ());
+ fs.close ();
+ return (0);
+}
int
pcl::io::saveOBJFile (const std::string &file_name,
size_t j = 0;
// There's one UV per vertex per face, i.e., the same vertex can have
// different UV depending on the face.
- for (j = 0; j < tex_mesh.tex_polygons[m][i].vertices.size (); ++j)
+ for (j = 0; j < tex_mesh.tex_polygons[m][i].vertices.size (); ++j)
{
uint32_t idx = tex_mesh.tex_polygons[m][i].vertices[j] + 1;
fs << " " << idx
fs << "# "<< nr_points <<" vertices" << std::endl;
if(normal_index != -1)
- {
+ {
fs << "# Normals in (x,y,z) form; normals might not be unit." << std::endl;
// Write vertex normals
for (int i = 0; i < nr_points; ++i)
if (mesh.cloud.fields[d].name == "normal_x")
// write vertices beginning with vn
fs << "vn ";
-
+
float value;
memcpy (&value, &mesh.cloud.data[i * point_size + mesh.cloud.fields[d].offset + c * sizeof (float)], sizeof (float));
fs << value;
for(unsigned i = 0; i < nr_faces; i++)
{
fs << "f ";
- size_t j = 0;
+ size_t j = 0;
for (; j < mesh.polygons[i].vertices.size () - 1; ++j)
fs << mesh.polygons[i].vertices[j] + 1 << " ";
fs << mesh.polygons[i].vertices[j] + 1 << std::endl;
for(unsigned i = 0; i < nr_faces; i++)
{
fs << "f ";
- size_t j = 0;
+ size_t j = 0;
for (; j < mesh.polygons[i].vertices.size () - 1; ++j)
- fs << mesh.polygons[i].vertices[j] + 1 << "//" << mesh.polygons[i].vertices[j] + 1;
+ fs << mesh.polygons[i].vertices[j] + 1 << "//" << mesh.polygons[i].vertices[j] + 1 << " ";
fs << mesh.polygons[i].vertices[j] + 1 << "//" << mesh.polygons[i].vertices[j] + 1 << std::endl;
}
}
fs << "# End of File" << std::endl;
// Close obj file
- fs.close ();
+ fs.close ();
return 0;
}
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include "pcl/io/openni2/openni2_convert.h"
+#include "pcl/io/io_exception.h"
+
+#include <boost/make_shared.hpp>
+
+#include <string>
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ const OpenNI2DeviceInfo
+ openni2_convert (const openni::DeviceInfo* pInfo)
+ {
+ if (!pInfo)
+ THROW_IO_EXCEPTION ("openni2_convert called with zero pointer\n");
+
+ OpenNI2DeviceInfo output;
+
+ output.name_ = pInfo->getName ();
+ output.uri_ = pInfo->getUri ();
+ output.vendor_ = pInfo->getVendor ();
+ output.product_id_ = pInfo->getUsbProductId ();
+ output.vendor_id_ = pInfo->getUsbVendorId ();
+
+ return (output);
+ }
+
+ const openni::VideoMode
+ grabberModeToOpenniMode (const OpenNI2VideoMode& input)
+ {
+
+ openni::VideoMode output;
+
+ output.setResolution (input.x_resolution_, input.y_resolution_);
+ output.setFps (input.frame_rate_);
+ output.setPixelFormat (static_cast<openni::PixelFormat>(input.pixel_format_));
+
+ return (output);
+ }
+
+
+ const OpenNI2VideoMode
+ openniModeToGrabberMode (const openni::VideoMode& input)
+ {
+ OpenNI2VideoMode output;
+
+ output.x_resolution_ = input.getResolutionX ();
+ output.y_resolution_ = input.getResolutionY ();
+ output.frame_rate_ = input.getFps ();
+ output.pixel_format_ = static_cast<PixelFormat>(input.getPixelFormat ());
+
+ return (output);
+ }
+
+ const std::vector<OpenNI2VideoMode>
+ openniModeToGrabberMode (const openni::Array<openni::VideoMode>& input)
+ {
+ std::vector<OpenNI2VideoMode> output;
+
+ int size = input.getSize ();
+
+ output.reserve (size);
+
+ for (int i=0; i<size; ++i)
+ output.push_back (openniModeToGrabberMode (input[i]));
+
+ return (output);
+ }
+
+ } // namespace
+ }
+ }
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include <OpenNI.h>
+#include <PS1080.h> // For XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE property
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/chrono.hpp>
+
+#include "pcl/io/openni2/openni2_device.h"
+#include "pcl/io/openni2/openni2_convert.h"
+#include "pcl/io/openni2/openni2_frame_listener.h"
+
+#include "pcl/io/io_exception.h"
+
+#include <string>
+
+using namespace openni;
+using namespace pcl::io::openni2;
+
+using openni::VideoMode;
+using std::vector;
+
+typedef boost::chrono::high_resolution_clock hr_clock;
+
+pcl::io::openni2::OpenNI2Device::OpenNI2Device (const std::string& device_URI) :
+ openni_device_(),
+ ir_video_started_(false),
+ color_video_started_(false),
+ depth_video_started_(false)
+{
+ openni::Status status = openni::OpenNI::initialize ();
+ if (status != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Initialize failed\n%s\n", OpenNI::getExtendedError ());
+
+ openni_device_ = boost::make_shared<openni::Device>();
+
+ if (device_URI.length () > 0)
+ status = openni_device_->open (device_URI.c_str ());
+ else
+ status = openni_device_->open (openni::ANY_DEVICE);
+
+ if (status != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Initialize failed\n%s\n", openni::OpenNI::getExtendedError ());
+
+ // Get depth calculation parameters
+ // Some of these are device-spefic and may not exist
+ baseline_ = 0.0;
+ if ( getDepthVideoStream ()->isPropertySupported (XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE) )
+ {
+ double baseline;
+ getDepthVideoStream ()->getProperty (XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, &baseline); // Device specific -- from PS1080.h
+ baseline_ = static_cast<float> (baseline * 0.01f); // baseline from cm -> meters
+ }
+ shadow_value_ = 0; // This does not exist in OpenNI 2, and is maintained for compatibility with the OpenNI 1.x grabber
+ no_sample_value_ = 0; // This does not exist in OpenNI 2, and is maintained for compatibility with the OpenNI 1.x grabber
+
+ // Set default resolution if not reading a file
+ if (!openni_device_->isFile ())
+ {
+ setColorVideoMode (getDefaultColorMode ());
+ setDepthVideoMode (getDefaultDepthMode ());
+ setIRVideoMode (getDefaultIRMode ());
+ }
+
+ if (openni_device_->isFile ())
+ {
+ openni_device_->getPlaybackControl ()->setSpeed (1.0f);
+ }
+
+ device_info_ = boost::make_shared<openni::DeviceInfo>();
+ *device_info_ = openni_device_->getDeviceInfo ();
+
+ color_frame_listener = boost::make_shared<OpenNI2FrameListener>();
+ depth_frame_listener = boost::make_shared<OpenNI2FrameListener>();
+ ir_frame_listener = boost::make_shared<OpenNI2FrameListener>();
+}
+
+pcl::io::openni2::OpenNI2Device::~OpenNI2Device ()
+{
+ stopAllStreams ();
+
+ shutdown ();
+
+ openni_device_->close ();
+}
+
+const std::string
+pcl::io::openni2::OpenNI2Device::getUri () const
+{
+ return (std::string (device_info_->getUri ()));
+}
+
+const std::string
+pcl::io::openni2::OpenNI2Device::getVendor () const
+{
+ return (std::string (device_info_->getVendor ()));
+}
+
+const std::string
+pcl::io::openni2::OpenNI2Device::getName () const
+{
+ return (std::string (device_info_->getName ()));
+}
+
+uint16_t
+pcl::io::openni2::OpenNI2Device::getUsbVendorId () const
+{
+ return (device_info_->getUsbVendorId ());
+}
+
+uint16_t
+pcl::io::openni2::OpenNI2Device::getUsbProductId () const
+{
+ return (device_info_->getUsbProductId ());
+}
+
+const std::string
+pcl::io::openni2::OpenNI2Device::getStringID () const
+{
+ std::string ID_str = getName () + "_" + getVendor ();
+
+ boost::replace_all (ID_str, "/", "");
+ boost::replace_all (ID_str, ".", "");
+ boost::replace_all (ID_str, "@", "");
+
+ return (ID_str);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isValid () const
+{
+ return (openni_device_.get () != 0) && openni_device_->isValid ();
+}
+
+float
+pcl::io::openni2::OpenNI2Device::getIRFocalLength () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getIRVideoStream ();
+
+ int frameWidth = stream->getVideoMode ().getResolutionX ();
+ float hFov = stream->getHorizontalFieldOfView ();
+ float calculatedFocalLengthX = frameWidth / (2.0f * tan (hFov / 2.0f));
+ return (calculatedFocalLengthX);
+}
+
+float
+pcl::io::openni2::OpenNI2Device::getColorFocalLength () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ int frameWidth = stream->getVideoMode ().getResolutionX ();
+ float hFov = stream->getHorizontalFieldOfView ();
+ float calculatedFocalLengthX = frameWidth / (2.0f * tan (hFov / 2.0f));
+ return (calculatedFocalLengthX);
+}
+
+float
+pcl::io::openni2::OpenNI2Device::getDepthFocalLength () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getDepthVideoStream ();
+
+ int frameWidth = stream->getVideoMode ().getResolutionX ();
+ float hFov = stream->getHorizontalFieldOfView ();
+ float calculatedFocalLengthX = frameWidth / (2.0f * tan (hFov / 2.0f));
+ return (calculatedFocalLengthX);
+}
+
+float
+pcl::io::openni2::OpenNI2Device::getBaseline()
+{
+ return (baseline_);
+}
+
+uint64_t
+pcl::io::openni2::OpenNI2Device::getShadowValue()
+{
+ return (shadow_value_);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isIRVideoModeSupported (const OpenNI2VideoMode& video_mode) const
+{
+ getSupportedIRVideoModes ();
+
+ bool supported = false;
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = ir_video_modes_.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = ir_video_modes_.end ();
+
+ while (it != it_end && !supported)
+ {
+ supported = (*it == video_mode);
+ ++it;
+ }
+
+ return (supported);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isColorVideoModeSupported (const OpenNI2VideoMode& video_mode) const
+{
+ getSupportedColorVideoModes ();
+
+ bool supported = false;
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = color_video_modes_.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = color_video_modes_.end ();
+
+ while (it != it_end && !supported)
+ {
+ supported = (*it == video_mode);
+ ++it;
+ }
+
+ return (supported);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isDepthVideoModeSupported (const OpenNI2VideoMode& video_mode) const
+{
+ getSupportedDepthVideoModes ();
+
+ bool supported = false;
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = depth_video_modes_.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = depth_video_modes_.end ();
+
+ while (it != it_end && !supported)
+ {
+ supported = (*it == video_mode);
+ ++it;
+ }
+
+ return (supported);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::hasIRSensor () const
+{
+ return (openni_device_->hasSensor (openni::SENSOR_IR));
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::hasColorSensor () const
+{
+ return (openni_device_->hasSensor (openni::SENSOR_COLOR));
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::hasDepthSensor () const
+{
+ return (openni_device_->hasSensor (openni::SENSOR_DEPTH));
+}
+
+void
+pcl::io::openni2::OpenNI2Device::startIRStream ()
+{
+ boost::shared_ptr<openni::VideoStream> stream = getIRVideoStream ();
+
+ if (stream)
+ {
+ stream->setMirroringEnabled (false);
+ stream->addNewFrameListener (ir_frame_listener.get ());
+ stream->start ();
+ ir_video_started_ = true;
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::startColorStream ()
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ stream->setMirroringEnabled (false);
+ stream->addNewFrameListener (color_frame_listener.get ());
+ stream->start ();
+ color_video_started_ = true;
+ }
+}
+void
+pcl::io::openni2::OpenNI2Device::startDepthStream ()
+{
+ boost::shared_ptr<openni::VideoStream> stream = getDepthVideoStream ();
+
+ if (stream)
+ {
+ stream->setMirroringEnabled (false);
+ stream->addNewFrameListener (depth_frame_listener.get ());
+ stream->start ();
+ depth_video_started_ = true;
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::stopAllStreams ()
+{
+ stopIRStream ();
+ stopColorStream ();
+ stopDepthStream ();
+}
+
+void
+pcl::io::openni2::OpenNI2Device::stopIRStream ()
+{
+ if (ir_video_stream_.get () != 0)
+ {
+ ir_video_stream_->stop ();
+ ir_video_started_ = false;
+ }
+}
+void
+pcl::io::openni2::OpenNI2Device::stopColorStream ()
+{
+ if (color_video_stream_.get () != 0)
+ {
+ color_video_stream_->stop ();
+ color_video_started_ = false;
+ }
+}
+void
+pcl::io::openni2::OpenNI2Device::stopDepthStream ()
+{
+ if (depth_video_stream_.get () != 0)
+ {
+ depth_video_stream_->stop ();
+ depth_video_started_ = false;
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::shutdown ()
+{
+ if (ir_video_stream_.get () != 0)
+ ir_video_stream_->destroy ();
+
+ if (color_video_stream_.get () != 0)
+ color_video_stream_->destroy ();
+
+ if (depth_video_stream_.get () != 0)
+ depth_video_stream_->destroy ();
+
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isIRStreamStarted ()
+{
+ return (ir_video_started_);
+}
+bool
+pcl::io::openni2::OpenNI2Device::isColorStreamStarted ()
+{
+ return (color_video_started_);
+}
+bool
+pcl::io::openni2::OpenNI2Device::isDepthStreamStarted ()
+{
+ return (depth_video_started_);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isImageRegistrationModeSupported () const
+{
+ return (openni_device_->isImageRegistrationModeSupported (openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR));
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setImageRegistrationMode (bool setEnable)
+{
+ bool registrationSupported = isImageRegistrationModeSupported ();
+ if (registrationSupported)
+ {
+ if (setEnable)
+ {
+ openni::Status rc = openni_device_->setImageRegistrationMode (openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Enabling image registration mode failed: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+ else
+ {
+ openni::Status rc = openni_device_->setImageRegistrationMode (openni::IMAGE_REGISTRATION_OFF);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Disabling image registration mode failed: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+ }
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::isDepthRegistered () const
+{
+ return openni_device_->getImageRegistrationMode () == openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR;
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setSynchronization (bool enabled)
+{
+ openni::Status rc = openni_device_->setDepthColorSyncEnabled (enabled);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Enabling depth color synchronization failed: \n%s\n", openni::OpenNI::getExtendedError ());
+}
+
+const OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getIRVideoMode ()
+{
+ OpenNI2VideoMode ret;
+
+ boost::shared_ptr<openni::VideoStream> stream = getIRVideoStream ();
+
+ if (stream)
+ {
+ openni::VideoMode video_mode = stream->getVideoMode ();
+
+ ret = openniModeToGrabberMode (video_mode);
+ }
+ else
+ THROW_IO_EXCEPTION ("Could not create video stream.");
+
+ return (ret);
+}
+
+const OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getColorVideoMode ()
+{
+ OpenNI2VideoMode ret;
+
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::VideoMode video_mode = stream->getVideoMode ();
+
+ ret = openniModeToGrabberMode (video_mode);
+ }
+ else
+ THROW_IO_EXCEPTION ("Could not create video stream.");
+
+ return (ret);
+}
+
+const OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getDepthVideoMode ()
+{
+ OpenNI2VideoMode ret;
+
+ boost::shared_ptr<openni::VideoStream> stream = getDepthVideoStream ();
+
+ if (stream)
+ {
+ openni::VideoMode video_mode = stream->getVideoMode ();
+
+ ret = openniModeToGrabberMode (video_mode);
+ }
+ else
+ THROW_IO_EXCEPTION ("Could not create video stream.");
+
+ return (ret);
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setIRVideoMode (const OpenNI2VideoMode& video_mode)
+{
+ boost::shared_ptr<openni::VideoStream> stream = getIRVideoStream ();
+
+ if (stream)
+ {
+ const openni::VideoMode videoMode = grabberModeToOpenniMode (video_mode);
+ const openni::Status rc = stream->setVideoMode (videoMode);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't set IR video mode: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setColorVideoMode (const OpenNI2VideoMode& video_mode)
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::VideoMode videoMode = grabberModeToOpenniMode (video_mode);
+ const openni::Status rc = stream->setVideoMode (videoMode);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't set color video mode: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setDepthVideoMode (const OpenNI2VideoMode& video_mode)
+{
+ boost::shared_ptr<openni::VideoStream> stream = getDepthVideoStream ();
+
+ if (stream)
+ {
+ const openni::VideoMode videoMode = grabberModeToOpenniMode (video_mode);
+ const openni::Status rc = stream->setVideoMode (videoMode);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't set depth video mode: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+}
+
+OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getDefaultIRMode () const
+{
+ // Search for and return VGA@30 Hz mode
+ vector<OpenNI2VideoMode> modeList = getSupportedIRVideoModes ();
+ for (vector<OpenNI2VideoMode>::iterator modeItr = modeList.begin (); modeItr != modeList.end (); modeItr++)
+ {
+ OpenNI2VideoMode mode = *modeItr;
+ if ( (mode.x_resolution_ == 640) && (mode.y_resolution_ == 480) && (mode.frame_rate_ == 30.0) )
+ return mode;
+ }
+ return (modeList.at (0)); // Return first mode if we can't find VGA
+}
+
+OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getDefaultColorMode () const
+{
+ // Search for and return VGA@30 Hz mode
+ vector<OpenNI2VideoMode> modeList = getSupportedColorVideoModes ();
+ for (vector<OpenNI2VideoMode>::iterator modeItr = modeList.begin (); modeItr != modeList.end (); modeItr++)
+ {
+ OpenNI2VideoMode mode = *modeItr;
+ if ( (mode.x_resolution_ == 640) && (mode.y_resolution_ == 480) && (mode.frame_rate_ == 30.0) )
+ return mode;
+ }
+ return (modeList.at (0)); // Return first mode if we can't find VGA
+}
+
+OpenNI2VideoMode
+pcl::io::openni2::OpenNI2Device::getDefaultDepthMode () const
+{
+ // Search for and return VGA@30 Hz mode
+ vector<OpenNI2VideoMode> modeList = getSupportedDepthVideoModes ();
+ for (vector<OpenNI2VideoMode>::iterator modeItr = modeList.begin (); modeItr != modeList.end (); modeItr++)
+ {
+ OpenNI2VideoMode mode = *modeItr;
+ if ( (mode.x_resolution_ == 640) && (mode.y_resolution_ == 480) && (mode.frame_rate_ == 30.0) )
+ return mode;
+ }
+ return (modeList.at (0)); // Return first mode if we can't find VGA
+}
+
+const std::vector<OpenNI2VideoMode>&
+pcl::io::openni2::OpenNI2Device::getSupportedIRVideoModes () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getIRVideoStream ();
+ ir_video_modes_.clear ();
+
+ if (stream)
+ {
+ const openni::SensorInfo& sensor_info = stream->getSensorInfo ();
+
+ ir_video_modes_ = openniModeToGrabberMode (sensor_info.getSupportedVideoModes ());
+ }
+
+ return (ir_video_modes_);
+}
+
+const std::vector<OpenNI2VideoMode>&
+pcl::io::openni2::OpenNI2Device::getSupportedColorVideoModes () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ color_video_modes_.clear ();
+
+ if (stream)
+ {
+ const openni::SensorInfo& sensor_info = stream->getSensorInfo ();
+
+ color_video_modes_ = openniModeToGrabberMode (sensor_info.getSupportedVideoModes ());
+ }
+
+ return (color_video_modes_);
+}
+
+const std::vector<OpenNI2VideoMode>&
+pcl::io::openni2::OpenNI2Device::getSupportedDepthVideoModes () const
+{
+ boost::shared_ptr<openni::VideoStream> stream = getDepthVideoStream ();
+
+ depth_video_modes_.clear ();
+
+ if (stream)
+ {
+ const openni::SensorInfo& sensor_info = stream->getSensorInfo ();
+
+ depth_video_modes_ = openniModeToGrabberMode (sensor_info.getSupportedVideoModes ());
+ }
+
+ return (depth_video_modes_);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::findCompatibleIRMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const
+{
+ if ( isIRVideoModeSupported (requested_mode) )
+ {
+ actual_mode = requested_mode;
+ return (true);
+ }
+ else
+ {
+ // Find a resize-compatable mode
+ std::vector<OpenNI2VideoMode> supportedModes = getSupportedIRVideoModes ();
+ bool found = findCompatibleVideoMode (supportedModes, requested_mode, actual_mode);
+ return (found);
+ }
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::findCompatibleColorMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const
+{
+ if ( isColorVideoModeSupported (requested_mode) )
+ {
+ actual_mode = requested_mode;
+ return (true);
+ }
+ else
+ {
+ // Find a resize-compatable mode
+ std::vector<OpenNI2VideoMode> supportedModes = getSupportedColorVideoModes ();
+ bool found = findCompatibleVideoMode (supportedModes, requested_mode, actual_mode);
+ return (found);
+ }
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::findCompatibleDepthMode (const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const
+{
+ if ( isDepthVideoModeSupported (requested_mode) )
+ {
+ actual_mode = requested_mode;
+ return (true);
+ }
+ else
+ {
+ // Find a resize-compatable mode
+ std::vector<OpenNI2VideoMode> supportedModes = getSupportedDepthVideoModes ();
+ bool found = findCompatibleVideoMode (supportedModes, requested_mode, actual_mode);
+ return (found);
+ }
+}
+
+// Generic support method for the above findCompatable...Mode calls above
+bool
+pcl::io::openni2::OpenNI2Device::findCompatibleVideoMode (const std::vector<OpenNI2VideoMode> supportedModes, const OpenNI2VideoMode& requested_mode, OpenNI2VideoMode& actual_mode) const
+{
+ bool found = false;
+ for (std::vector<OpenNI2VideoMode>::const_iterator modeIt = supportedModes.begin (); modeIt != supportedModes.end (); ++modeIt)
+ {
+ if (modeIt->frame_rate_ == requested_mode.frame_rate_
+ && resizingSupported (modeIt->x_resolution_, modeIt->y_resolution_, requested_mode.x_resolution_, requested_mode.y_resolution_))
+ {
+ if (found)
+ { // check wheter the new mode is better -> smaller than the current one.
+ if (actual_mode.x_resolution_ * actual_mode.x_resolution_ > modeIt->x_resolution_ * modeIt->y_resolution_ )
+ actual_mode = *modeIt;
+ }
+ else
+ {
+ actual_mode = *modeIt;
+ found = true;
+ }
+ }
+ }
+ return (found);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::resizingSupported (size_t input_width, size_t input_height, size_t output_width, size_t output_height) const
+{
+ return (output_width <= input_width && output_height <= input_height && input_width % output_width == 0 && input_height % output_height == 0 );
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setAutoExposure (bool enable)
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::CameraSettings* camera_seeting = stream->getCameraSettings ();
+ if (camera_seeting)
+ {
+ const openni::Status rc = camera_seeting->setAutoExposureEnabled (enable);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't set auto exposure: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+
+ }
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setAutoWhiteBalance (bool enable)
+{
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::CameraSettings* camera_seeting = stream->getCameraSettings ();
+ if (camera_seeting)
+ {
+ const openni::Status rc = camera_seeting->setAutoWhiteBalanceEnabled (enable);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't set auto white balance: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+
+ }
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::getAutoExposure () const
+{
+ bool ret = false;
+
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::CameraSettings* camera_seeting = stream->getCameraSettings ();
+ if (camera_seeting)
+ ret = camera_seeting->getAutoExposureEnabled ();
+ }
+
+ return (ret);
+}
+
+bool
+pcl::io::openni2::OpenNI2Device::getAutoWhiteBalance () const
+{
+ bool ret = false;
+
+ boost::shared_ptr<openni::VideoStream> stream = getColorVideoStream ();
+
+ if (stream)
+ {
+ openni::CameraSettings* camera_setting = stream->getCameraSettings ();
+ if (camera_setting)
+ ret = camera_setting->getAutoWhiteBalanceEnabled ();
+ }
+
+ return (ret);
+}
+
+int pcl::io::openni2::OpenNI2Device::getDepthFrameCount ()
+{
+ if (!openni_device_->isFile () || !getDepthVideoStream ())
+ {
+ return 0;
+ }
+ return openni_device_->getPlaybackControl ()->getNumberOfFrames(*getDepthVideoStream ());
+}
+
+int OpenNI2Device::getColorFrameCount ()
+{
+ if (!openni_device_->isFile () || !getColorVideoStream ())
+ {
+ return 0;
+ }
+ return openni_device_->getPlaybackControl ()->getNumberOfFrames (*getColorVideoStream ());
+}
+
+int OpenNI2Device::getIRFrameCount ()
+{
+ if (!openni_device_->isFile () || !getIRVideoStream ())
+ {
+ return 0;
+ }
+ return openni_device_->getPlaybackControl ()->getNumberOfFrames (*getIRVideoStream ());
+}
+
+bool OpenNI2Device::setPlaybackSpeed (double speed)
+{
+ return openni_device_->getPlaybackControl ()->setSpeed (speed) == openni::STATUS_OK;
+}
+
+boost::shared_ptr<openni::VideoStream>
+pcl::io::openni2::OpenNI2Device::getIRVideoStream () const
+{
+ if (ir_video_stream_.get () == 0)
+ {
+ if (hasIRSensor ())
+ {
+ ir_video_stream_ = boost::make_shared<openni::VideoStream>();
+
+ const openni::Status rc = ir_video_stream_->create (*openni_device_, openni::SENSOR_IR);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't create IR video stream: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+ }
+ return (ir_video_stream_);
+}
+
+boost::shared_ptr<openni::VideoStream>
+pcl::io::openni2::OpenNI2Device::getColorVideoStream () const
+{
+ if (color_video_stream_.get () == 0)
+ {
+ if (hasColorSensor ())
+ {
+ color_video_stream_ = boost::make_shared<openni::VideoStream>();
+
+ const openni::Status rc = color_video_stream_->create (*openni_device_, openni::SENSOR_COLOR);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't create color video stream: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+ }
+ return (color_video_stream_);
+}
+
+boost::shared_ptr<openni::VideoStream>
+pcl::io::openni2::OpenNI2Device::getDepthVideoStream () const
+{
+ if (depth_video_stream_.get () == 0)
+ {
+ if (hasDepthSensor ())
+ {
+ depth_video_stream_ = boost::make_shared<openni::VideoStream>();
+
+ const openni::Status rc = depth_video_stream_->create (*openni_device_, openni::SENSOR_DEPTH);
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Couldn't create depth video stream: \n%s\n", openni::OpenNI::getExtendedError ());
+ }
+ }
+ return (depth_video_stream_);
+}
+
+std::ostream& pcl::io::openni2::operator<< (std::ostream& stream, const OpenNI2Device& device)
+{
+
+ stream << "Device info (" << device.getUri () << ")" << std::endl;
+ stream << " Vendor: " << device.getVendor () << std::endl;
+ stream << " Name: " << device.getName () << std::endl;
+ stream << " USB Vendor ID: " << device.getUsbVendorId () << std::endl;
+ stream << " USB Product ID: " << device.getUsbVendorId () << std::endl << std::endl;
+
+ if (device.hasIRSensor ())
+ {
+ stream << "IR sensor video modes:" << std::endl;
+ const std::vector<OpenNI2VideoMode>& video_modes = device.getSupportedIRVideoModes ();
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = video_modes.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = video_modes.end ();
+ for (; it != it_end; ++it)
+ stream << " - " << *it << std::endl;
+ }
+ else
+ {
+ stream << "No IR sensor available" << std::endl;
+ }
+
+ if (device.hasColorSensor ())
+ {
+ stream << "Color sensor video modes:" << std::endl;
+ const std::vector<OpenNI2VideoMode>& video_modes = device.getSupportedColorVideoModes ();
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = video_modes.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = video_modes.end ();
+ for (; it != it_end; ++it)
+ stream << " - " << *it << std::endl;
+ }
+ else
+ {
+ stream << "No Color sensor available" << std::endl;
+ }
+
+ if (device.hasDepthSensor ())
+ {
+ stream << "Depth sensor video modes:" << std::endl;
+ const std::vector<OpenNI2VideoMode>& video_modes = device.getSupportedDepthVideoModes ();
+
+ std::vector<OpenNI2VideoMode>::const_iterator it = video_modes.begin ();
+ std::vector<OpenNI2VideoMode>::const_iterator it_end = video_modes.end ();
+ for (; it != it_end; ++it)
+ stream << " - " << *it << std::endl;
+ }
+ else
+ {
+ stream << "No Depth sensor available" << std::endl;
+ }
+
+ return (stream);
+
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setColorCallback (StreamCallbackFunction color_callback)
+{
+ color_frame_listener->setCallback (color_callback);
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setDepthCallback (StreamCallbackFunction depth_callback)
+{
+ depth_frame_listener->setCallback (depth_callback);
+}
+
+void
+pcl::io::openni2::OpenNI2Device::setIRCallback (StreamCallbackFunction ir_callback)
+{
+ ir_frame_listener->setCallback (ir_callback);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include <string>
+#include "pcl/io/openni2/openni2_device_info.h"
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ std::ostream& operator << (std::ostream& stream, const OpenNI2DeviceInfo& device_info)
+ {
+ stream << "Uri: " << device_info.uri_ << " (Vendor: " << device_info.vendor_ <<
+ ", Name: " << device_info.name_ <<
+ ", Vendor ID: " << device_info.vendor_id_ <<
+ ", Product ID: " << device_info.product_id_ <<
+ ")" << std::endl;
+ return stream;
+ }
+
+ } //namespace
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include "pcl/io/openni2/openni2_device_manager.h"
+#include "pcl/io/openni2/openni2_convert.h"
+#include "pcl/io/openni2/openni2_device.h"
+#include "pcl/io/io_exception.h"
+
+#include <boost/make_shared.hpp>
+
+#include <set>
+#include <string>
+
+#include "OpenNI.h"
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ class OpenNI2DeviceInfoComparator
+ {
+ public:
+ bool operator ()(const OpenNI2DeviceInfo& di1, const OpenNI2DeviceInfo& di2)
+ {
+ return (di1.uri_.compare (di2.uri_) < 0);
+ }
+ };
+
+ typedef std::set<OpenNI2DeviceInfo, OpenNI2DeviceInfoComparator> DeviceSet;
+
+
+
+ class OpenNI2DeviceListener : public openni::OpenNI::DeviceConnectedListener,
+ public openni::OpenNI::DeviceDisconnectedListener,
+ public openni::OpenNI::DeviceStateChangedListener
+ {
+ public:
+ OpenNI2DeviceListener ()
+ : openni::OpenNI::DeviceConnectedListener ()
+ , openni::OpenNI::DeviceDisconnectedListener ()
+ , openni::OpenNI::DeviceStateChangedListener ()
+ {
+ openni::OpenNI::addDeviceConnectedListener (this);
+ openni::OpenNI::addDeviceDisconnectedListener (this);
+ openni::OpenNI::addDeviceStateChangedListener (this);
+
+ // get list of currently connected devices
+ openni::Array<openni::DeviceInfo> device_info_list;
+ openni::OpenNI::enumerateDevices (&device_info_list);
+
+ for (int i = 0; i < device_info_list.getSize (); ++i)
+ {
+ onDeviceConnected (&device_info_list[i]);
+ }
+ }
+
+ ~OpenNI2DeviceListener ()
+ {
+ openni::OpenNI::removeDeviceConnectedListener (this);
+ openni::OpenNI::removeDeviceDisconnectedListener (this);
+ openni::OpenNI::removeDeviceStateChangedListener (this);
+ }
+
+ virtual void
+ onDeviceStateChanged (const openni::DeviceInfo* pInfo, openni::DeviceState state)
+ {
+ switch (state)
+ {
+ case openni::DEVICE_STATE_OK:
+ onDeviceConnected (pInfo);
+ break;
+ case openni::DEVICE_STATE_ERROR:
+ case openni::DEVICE_STATE_NOT_READY:
+ case openni::DEVICE_STATE_EOF:
+ default:
+ onDeviceDisconnected (pInfo);
+ break;
+ }
+ }
+
+ virtual void
+ onDeviceConnected (const openni::DeviceInfo* pInfo)
+ {
+ boost::mutex::scoped_lock l (device_mutex_);
+
+ const OpenNI2DeviceInfo device_info_wrapped = openni2_convert (pInfo);
+
+ // make sure it does not exist in set before inserting
+ device_set_.erase (device_info_wrapped);
+ device_set_.insert (device_info_wrapped);
+ }
+
+ virtual void
+ onDeviceDisconnected (const openni::DeviceInfo* pInfo)
+ {
+ boost::mutex::scoped_lock l (device_mutex_);
+
+ const OpenNI2DeviceInfo device_info_wrapped = openni2_convert (pInfo);
+ device_set_.erase (device_info_wrapped);
+ }
+
+ boost::shared_ptr<std::vector<std::string> >
+ getConnectedDeviceURIs ()
+ {
+ boost::mutex::scoped_lock l (device_mutex_);
+
+ boost::shared_ptr<std::vector<std::string> > result = boost::make_shared<std::vector<std::string> >();
+
+ result->reserve (device_set_.size ());
+
+ std::set<OpenNI2DeviceInfo, OpenNI2DeviceInfoComparator>::const_iterator it;
+ std::set<OpenNI2DeviceInfo, OpenNI2DeviceInfoComparator>::const_iterator it_end = device_set_.end ();
+
+ for (it = device_set_.begin (); it != it_end; ++it)
+ result->push_back (it->uri_);
+
+ return result;
+ }
+
+ boost::shared_ptr<std::vector<OpenNI2DeviceInfo> >
+ getConnectedDeviceInfos ()
+ {
+ boost::mutex::scoped_lock l (device_mutex_);
+
+ boost::shared_ptr<std::vector<OpenNI2DeviceInfo> > result = boost::make_shared<std::vector<OpenNI2DeviceInfo> >();
+
+ result->reserve (device_set_.size ());
+
+ DeviceSet::const_iterator it;
+ DeviceSet::const_iterator it_end = device_set_.end ();
+
+ for (it = device_set_.begin (); it != it_end; ++it)
+ result->push_back (*it);
+
+ return result;
+ }
+
+ std::size_t
+ getNumOfConnectedDevices ()
+ {
+ boost::mutex::scoped_lock l (device_mutex_);
+
+ return device_set_.size ();
+ }
+
+ boost::mutex device_mutex_;
+ DeviceSet device_set_;
+ };
+
+ } //namespace
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+using pcl::io::openni2::OpenNI2Device;
+using pcl::io::openni2::OpenNI2DeviceInfo;
+using pcl::io::openni2::OpenNI2DeviceManager;
+
+pcl::io::openni2::OpenNI2DeviceManager::OpenNI2DeviceManager ()
+{
+ openni::Status rc = openni::OpenNI::initialize ();
+ if (rc != openni::STATUS_OK)
+ THROW_IO_EXCEPTION ("Initialize failed\n%s\n", openni::OpenNI::getExtendedError ());
+
+ device_listener_ = boost::make_shared<OpenNI2DeviceListener>();
+}
+
+pcl::io::openni2::OpenNI2DeviceManager::~OpenNI2DeviceManager ()
+{
+}
+
+boost::shared_ptr<std::vector<OpenNI2DeviceInfo> >
+pcl::io::openni2::OpenNI2DeviceManager::getConnectedDeviceInfos () const
+{
+ return device_listener_->getConnectedDeviceInfos ();
+}
+
+boost::shared_ptr<std::vector<std::string> >
+pcl::io::openni2::OpenNI2DeviceManager::getConnectedDeviceURIs () const
+{
+ return device_listener_->getConnectedDeviceURIs ();
+}
+
+std::size_t
+pcl::io::openni2::OpenNI2DeviceManager::getNumOfConnectedDevices () const
+{
+ return device_listener_->getNumOfConnectedDevices ();
+}
+
+boost::shared_ptr<OpenNI2Device>
+pcl::io::openni2::OpenNI2DeviceManager::getAnyDevice ()
+{
+ return boost::make_shared<OpenNI2Device>("");
+}
+
+boost::shared_ptr<OpenNI2Device>
+pcl::io::openni2::OpenNI2DeviceManager::getDevice (const std::string& device_URI)
+{
+ return boost::make_shared<OpenNI2Device>(device_URI);
+}
+
+boost::shared_ptr<OpenNI2Device>
+pcl::io::openni2::OpenNI2DeviceManager::getDeviceByIndex (int index)
+{
+ boost::shared_ptr<std::vector<std::string> > URIs = getConnectedDeviceURIs ();
+ return boost::make_shared<OpenNI2Device>( URIs->at (index) );
+}
+
+boost::shared_ptr<OpenNI2Device>
+pcl::io::openni2::OpenNI2DeviceManager::getFileDevice (const std::string& path)
+{
+ return boost::make_shared<OpenNI2Device>(path);
+}
+
+std::ostream&
+operator<< (std::ostream& stream, const OpenNI2DeviceManager& device_manager)
+{
+
+ boost::shared_ptr<std::vector<OpenNI2DeviceInfo> > device_info = device_manager.getConnectedDeviceInfos ();
+
+ std::vector<OpenNI2DeviceInfo>::const_iterator it;
+ std::vector<OpenNI2DeviceInfo>::const_iterator it_end = device_info->end ();
+
+ for (it = device_info->begin (); it != it_end; ++it)
+ {
+ stream << "Uri: " << it->uri_ << " (Vendor: " << it->vendor_ <<
+ ", Name: " << it->name_ <<
+ ", Vendor ID: " << it->vendor_id_ <<
+ ", Product ID: " << it->product_id_ <<
+ ")" << std::endl;
+ }
+
+ return (stream);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include "pcl/io/openni2/openni2_timer_filter.h"
+#include <algorithm>
+
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ OpenNI2TimerFilter::OpenNI2TimerFilter (std::size_t filter_len):
+ filter_len_(filter_len)
+ {}
+
+ OpenNI2TimerFilter::~OpenNI2TimerFilter ()
+ {}
+
+ void OpenNI2TimerFilter::addSample (double sample)
+ {
+ buffer_.push_back (sample);
+ if (buffer_.size ()>filter_len_)
+ buffer_.pop_front ();
+ }
+
+ double OpenNI2TimerFilter::getMedian ()
+ {
+ if (buffer_.size ()>0)
+ {
+ std::deque<double> sort_buffer = buffer_;
+
+ std::sort (sort_buffer.begin (), sort_buffer.end ());
+
+ return sort_buffer[sort_buffer.size ()/2];
+ } else
+ return (0.0);
+ }
+
+ double
+ OpenNI2TimerFilter::getMovingAvg ()
+ {
+ if (buffer_.size () > 0)
+ {
+ double sum = 0;
+
+ std::deque<double>::const_iterator it = buffer_.begin ();
+ std::deque<double>::const_iterator it_end = buffer_.end ();
+
+ while (it != it_end)
+ {
+ sum += *(it++);
+ }
+
+ return sum / static_cast<double>(buffer_.size ());
+ } else
+ return (0.0);
+ }
+
+
+ void OpenNI2TimerFilter::clear ()
+ {
+ buffer_.clear ();
+ }
+
+ } //namespace
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2013, Willow Garage, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Julius Kammerl (jkammerl@willowgarage.com)
+ */
+
+#include "pcl/io/openni2/openni2_video_mode.h"
+
+namespace pcl
+{
+ namespace io
+ {
+ namespace openni2
+ {
+
+ std::ostream&
+ operator<< (std::ostream& stream, const OpenNI2VideoMode& video_mode)
+ {
+ stream << "Resolution: " << (int)video_mode.x_resolution_ << "x" << (int)video_mode.y_resolution_ <<
+ "@" << video_mode.frame_rate_ <<
+ "Hz Format: ";
+
+ switch (video_mode.pixel_format_)
+ {
+ case PIXEL_FORMAT_DEPTH_1_MM:
+ stream << "Depth 1mm";
+ break;
+ case PIXEL_FORMAT_DEPTH_100_UM:
+ stream << "Depth 100um";
+ break;
+ case PIXEL_FORMAT_SHIFT_9_2:
+ stream << "Shift 9/2";
+ break;
+ case PIXEL_FORMAT_SHIFT_9_3:
+ stream << "Shift 9/3";
+ break;
+ case PIXEL_FORMAT_RGB888:
+ stream << "RGB888";
+ break;
+ case PIXEL_FORMAT_YUV422:
+ stream << "YUV422";
+ break;
+ case PIXEL_FORMAT_GRAY8:
+ stream << "Gray8";
+ break;
+ case PIXEL_FORMAT_GRAY16:
+ stream << "Gray16";
+ break;
+ case PIXEL_FORMAT_JPEG:
+ stream << "JPEG";
+ break;
+
+ default:
+ break;
+ }
+
+ return (stream);
+ }
+
+ bool
+ operator==(const OpenNI2VideoMode& video_mode_a, const OpenNI2VideoMode& video_mode_b)
+ {
+ return (video_mode_a.x_resolution_==video_mode_b.x_resolution_) &&
+ (video_mode_a.y_resolution_==video_mode_b.y_resolution_) &&
+ (video_mode_a.frame_rate_ ==video_mode_b.frame_rate_) &&
+ (video_mode_a.pixel_format_==video_mode_b.pixel_format_);
+ }
+
+ bool
+ operator!=(const OpenNI2VideoMode& video_mode_a, const OpenNI2VideoMode& video_mode_b)
+ {
+ return !(video_mode_a==video_mode_b);
+ }
+
+ } //namespace
+ }
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, respective authors.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/pcl_config.h>
+#ifdef HAVE_OPENNI2
+
+#include <pcl/io/openni2_grabber.h>
+#include <pcl/io/openni2/openni2_device_manager.h>
+#include <pcl/io/openni2/openni2_metadata_wrapper.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+#include <pcl/common/time.h>
+#include <pcl/console/print.h>
+#include <pcl/io/boost.h>
+#include <pcl/exceptions.h>
+#include <iostream>
+
+using namespace pcl::io::openni2;
+
+namespace pcl
+{
+ // Treat color as chars, float32, or uint32
+ typedef union
+ {
+ struct
+ {
+ unsigned char Blue;
+ unsigned char Green;
+ unsigned char Red;
+ unsigned char Alpha;
+ };
+ float float_value;
+ uint32_t long_value;
+ } RGBValue;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+pcl::io::OpenNI2Grabber::OpenNI2Grabber (const std::string& device_id, const Mode& depth_mode, const Mode& image_mode)
+ : color_resize_buffer_(0)
+ , depth_resize_buffer_(0)
+ , ir_resize_buffer_(0)
+ , rgb_sync_ ()
+ , ir_sync_ ()
+ , device_ ()
+ , rgb_frame_id_ ()
+ , depth_frame_id_ ()
+ , image_width_ ()
+ , image_height_ ()
+ , depth_width_ ()
+ , depth_height_ ()
+ , image_required_ (false)
+ , depth_required_ (false)
+ , ir_required_ (false)
+ , sync_required_ (false)
+ , image_signal_ (), depth_image_signal_ (), ir_image_signal_ (), image_depth_image_signal_ ()
+ , ir_depth_image_signal_ (), point_cloud_signal_ (), point_cloud_i_signal_ ()
+ , point_cloud_rgb_signal_ (), point_cloud_rgba_signal_ ()
+ , config2oni_map_ (), depth_callback_handle_ (), image_callback_handle_ (), ir_callback_handle_ ()
+ , running_ (false)
+ , rgb_parameters_(std::numeric_limits<double>::quiet_NaN () )
+ , depth_parameters_(std::numeric_limits<double>::quiet_NaN () )
+{
+ // initialize driver
+ updateModeMaps (); // registering mapping from PCL enum modes to openni::VideoMode and vice versa
+ setupDevice (device_id, depth_mode, image_mode);
+
+ rgb_frame_id_ = "/openni2_rgb_optical_frame";
+ depth_frame_id_ = "/openni2_depth_optical_frame";
+
+
+ if (!device_->hasDepthSensor () )
+ PCL_THROW_EXCEPTION (pcl::IOException, "Device does not provide 3D information.");
+
+ depth_image_signal_ = createSignal<sig_cb_openni_depth_image> ();
+ ir_image_signal_ = createSignal<sig_cb_openni_ir_image> ();
+ point_cloud_signal_ = createSignal<sig_cb_openni_point_cloud> ();
+ point_cloud_i_signal_ = createSignal<sig_cb_openni_point_cloud_i> ();
+ ir_depth_image_signal_ = createSignal<sig_cb_openni_ir_depth_image> ();
+ ir_sync_.addCallback (boost::bind (&OpenNI2Grabber::irDepthImageCallback, this, _1, _2));
+
+ if (device_->hasColorSensor ())
+ {
+ // create callback signals
+ image_signal_ = createSignal<sig_cb_openni_image> ();
+ image_depth_image_signal_ = createSignal<sig_cb_openni_image_depth_image> ();
+ point_cloud_rgb_signal_ = createSignal<sig_cb_openni_point_cloud_rgb> ();
+ point_cloud_rgba_signal_ = createSignal<sig_cb_openni_point_cloud_rgba> ();
+ rgb_sync_.addCallback (boost::bind (&OpenNI2Grabber::imageDepthImageCallback, this, _1, _2));
+ }
+
+ // callbacks from the sensor to the grabber
+ device_->setColorCallback (boost::bind (&OpenNI2Grabber::processColorFrame, this, _1));
+ device_->setDepthCallback (boost::bind (&OpenNI2Grabber::processDepthFrame, this, _1));
+ device_->setIRCallback (boost::bind (&OpenNI2Grabber::processIRFrame, this, _1));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+pcl::io::OpenNI2Grabber::~OpenNI2Grabber () throw ()
+{
+ try
+ {
+ stop ();
+
+ // release the pointer to the device object
+ device_.reset ();
+
+ // disconnect all listeners
+ disconnect_all_slots<sig_cb_openni_image> ();
+ disconnect_all_slots<sig_cb_openni_depth_image> ();
+ disconnect_all_slots<sig_cb_openni_ir_image> ();
+ disconnect_all_slots<sig_cb_openni_image_depth_image> ();
+ disconnect_all_slots<sig_cb_openni_point_cloud> ();
+ disconnect_all_slots<sig_cb_openni_point_cloud_rgb> ();
+ disconnect_all_slots<sig_cb_openni_point_cloud_rgba> ();
+ disconnect_all_slots<sig_cb_openni_point_cloud_i> ();
+ }
+ catch (...)
+ {
+ // destructor never throws
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::checkImageAndDepthSynchronizationRequired ()
+{
+ // do we have anyone listening to images or color point clouds?
+ if (num_slots<sig_cb_openni_point_cloud_rgb> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgba> () > 0 ||
+ num_slots<sig_cb_openni_image_depth_image> () > 0)
+ sync_required_ = true;
+ else
+ sync_required_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::checkImageStreamRequired ()
+{
+ // do we have anyone listening to images or color point clouds?
+ if (num_slots<sig_cb_openni_image> () > 0 ||
+ num_slots<sig_cb_openni_image_depth_image> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgba> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgb> () > 0)
+ image_required_ = true;
+ else
+ image_required_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::checkDepthStreamRequired ()
+{
+ // do we have anyone listening to depth images or (color) point clouds?
+ if (num_slots<sig_cb_openni_depth_image> () > 0 ||
+ num_slots<sig_cb_openni_image_depth_image> () > 0 ||
+ num_slots<sig_cb_openni_ir_depth_image> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgb> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgba> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_i> () > 0 )
+ depth_required_ = true;
+ else
+ depth_required_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::checkIRStreamRequired ()
+{
+ if (num_slots<sig_cb_openni_ir_image> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_i> () > 0 ||
+ num_slots<sig_cb_openni_ir_depth_image> () > 0)
+ ir_required_ = true;
+ else
+ ir_required_ = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::start ()
+{
+ try
+ {
+ // check if we need to start/stop any stream
+ if (image_required_ && !device_->isColorStreamStarted () )
+ {
+ block_signals ();
+ device_->startColorStream ();
+ startSynchronization ();
+ }
+
+ if (depth_required_ && !device_->isDepthStreamStarted ())
+ {
+ block_signals ();
+ if (device_->hasColorSensor () && device_->isImageRegistrationModeSupported () )
+ {
+ device_->setImageRegistrationMode (true);
+ }
+ device_->startDepthStream ();
+ startSynchronization ();
+ }
+
+ if (ir_required_ && !device_->isIRStreamStarted () )
+ {
+ block_signals ();
+ device_->startIRStream ();
+ }
+ running_ = true;
+ }
+ catch (IOException& ex)
+ {
+ PCL_THROW_EXCEPTION (pcl::IOException, "Could not start streams. Reason: " << ex.what ());
+ }
+
+ // workaround, since the first frame is corrupted
+ //boost::this_thread::sleep (boost::posix_time::seconds (1));
+ unblock_signals ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::stop ()
+{
+ try
+ {
+ if (device_->hasDepthSensor () && device_->isDepthStreamStarted () )
+ device_->stopDepthStream ();
+
+ if (device_->hasColorSensor () && device_->isColorStreamStarted () )
+ device_->stopColorStream ();
+
+ if (device_->hasIRSensor () && device_->isIRStreamStarted ())
+ device_->stopIRStream ();
+
+ running_ = false;
+ }
+ catch (IOException& ex)
+ {
+ PCL_THROW_EXCEPTION (pcl::IOException, "Could not stop streams. Reason: " << ex.what ());
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::io::OpenNI2Grabber::isRunning () const
+{
+ return (running_);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::signalsChanged ()
+{
+ // reevaluate which streams are required
+ checkImageStreamRequired ();
+ checkDepthStreamRequired ();
+ checkIRStreamRequired ();
+ if (ir_required_ && image_required_)
+ PCL_THROW_EXCEPTION (pcl::IOException, "Can not provide IR stream and RGB stream at the same time.");
+
+ checkImageAndDepthSynchronizationRequired ();
+ if (running_)
+ start ();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+std::string
+pcl::io::OpenNI2Grabber::getName () const
+{
+ return (std::string ("OpenNI2Grabber"));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::setupDevice (const std::string& device_id, const Mode& depth_mode, const Mode& image_mode)
+{
+ // Initialize the openni device
+ boost::shared_ptr<OpenNI2DeviceManager> deviceManager = OpenNI2DeviceManager::getInstance ();
+
+ try
+ {
+ if (boost::filesystem::exists (device_id))
+ {
+ device_ = deviceManager->getFileDevice (device_id); // Treat as file path
+ }
+ else if (deviceManager->getNumOfConnectedDevices () == 0)
+ {
+ PCL_THROW_EXCEPTION (pcl::IOException, "No devices connected.");
+ }
+ else if (device_id[0] == '#')
+ {
+ unsigned index = atoi (device_id.c_str () + 1);
+ device_ = deviceManager->getDeviceByIndex (index - 1);
+ }
+ else
+ {
+ device_ = deviceManager->getAnyDevice ();
+ }
+ }
+ catch (const IOException& exception)
+ {
+ if (!device_)
+ PCL_THROW_EXCEPTION (pcl::IOException, "No matching device found. " << exception.what ())
+ else
+ PCL_THROW_EXCEPTION (pcl::IOException, "could not retrieve device. Reason " << exception.what ())
+ }
+ catch (const pcl::IOException&)
+ {
+ throw;
+ }
+ catch (...)
+ {
+ PCL_THROW_EXCEPTION (pcl::IOException, "unknown error occured");
+ }
+
+ typedef pcl::io::openni2::OpenNI2VideoMode VideoMode;
+
+ VideoMode depth_md;
+ // Set the selected output mode
+ if (depth_mode != OpenNI_Default_Mode)
+ {
+ VideoMode actual_depth_md;
+ if (!mapMode2XnMode (depth_mode, depth_md) || !device_->findCompatibleDepthMode (depth_md, actual_depth_md))
+ PCL_THROW_EXCEPTION (pcl::IOException, "could not find compatible depth stream mode " << static_cast<int> (depth_mode) );
+
+ VideoMode current_depth_md = device_->getDepthVideoMode ();
+ if (current_depth_md.x_resolution_ != actual_depth_md.x_resolution_ || current_depth_md.y_resolution_ != actual_depth_md.y_resolution_)
+ device_->setDepthVideoMode (actual_depth_md);
+ }
+ else
+ {
+ depth_md = device_->getDefaultDepthMode ();
+ }
+
+ depth_width_ = depth_md.x_resolution_;
+ depth_height_ = depth_md.y_resolution_;
+
+ if (device_->hasColorSensor ())
+ {
+ VideoMode image_md;
+ if (image_mode != OpenNI_Default_Mode)
+ {
+ VideoMode actual_image_md;
+ if (!mapMode2XnMode (image_mode, image_md) || !device_->findCompatibleColorMode (image_md, actual_image_md))
+ PCL_THROW_EXCEPTION (pcl::IOException, "could not find compatible image stream mode " << static_cast<int> (image_mode) );
+
+ VideoMode current_image_md = device_->getColorVideoMode ();
+ if (current_image_md.x_resolution_ != actual_image_md.x_resolution_ || current_image_md.y_resolution_ != actual_image_md.y_resolution_)
+ device_->setColorVideoMode (actual_image_md);
+ }
+ else
+ {
+ image_md = device_->getDefaultColorMode ();
+ }
+
+ image_width_ = image_md.x_resolution_;
+ image_height_ = image_md.y_resolution_;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::startSynchronization ()
+{
+ try
+ {
+ if (device_->isSynchronizationSupported () && !device_->isSynchronized () && !device_->isFile () &&
+ device_->getColorVideoMode ().frame_rate_ == device_->getDepthVideoMode ().frame_rate_)
+ device_->setSynchronization (true);
+ }
+ catch (const IOException& exception)
+ {
+ std::cerr << exception.what() << std::endl;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::stopSynchronization ()
+{
+ try
+ {
+ if (device_->isSynchronizationSupported () && device_->isSynchronized ())
+ device_->setSynchronization (false);
+ }
+ catch (const IOException& exception)
+ {
+ PCL_THROW_EXCEPTION (pcl::IOException, "Could not start synchronization " << exception.what ());
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::imageCallback (Image::Ptr image, void*)
+{
+ if (num_slots<sig_cb_openni_point_cloud_rgb> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgba> () > 0 ||
+ num_slots<sig_cb_openni_image_depth_image> () > 0)
+ rgb_sync_.add0 (image, image->getTimestamp ());
+
+ int numImageSlots = image_signal_->num_slots ();
+ if (numImageSlots > 0)
+ image_signal_->operator ()(image);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::depthCallback (DepthImage::Ptr depth_image, void*)
+{
+ if (num_slots<sig_cb_openni_point_cloud_rgb> () > 0 ||
+ num_slots<sig_cb_openni_point_cloud_rgba> () > 0 ||
+ num_slots<sig_cb_openni_image_depth_image> () > 0)
+ rgb_sync_.add1 (depth_image, depth_image->getTimestamp ());
+
+ if (num_slots<sig_cb_openni_point_cloud_i> () > 0 ||
+ num_slots<sig_cb_openni_ir_depth_image> () > 0)
+ ir_sync_.add1 (depth_image, depth_image->getTimestamp ());
+
+ if (depth_image_signal_->num_slots () > 0)
+ depth_image_signal_->operator ()(depth_image);
+
+ if (point_cloud_signal_->num_slots () > 0)
+ point_cloud_signal_->operator ()(convertToXYZPointCloud (depth_image));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::irCallback (IRImage::Ptr ir_image, void*)
+{
+ if (num_slots<sig_cb_openni_point_cloud_i> () > 0 ||
+ num_slots<sig_cb_openni_ir_depth_image> () > 0)
+ ir_sync_.add0(ir_image, ir_image->getTimestamp ());
+
+ if (ir_image_signal_->num_slots () > 0)
+ ir_image_signal_->operator ()(ir_image);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::imageDepthImageCallback (const Image::Ptr &image,
+ const DepthImage::Ptr &depth_image)
+{
+ // check if we have color point cloud slots
+ if (point_cloud_rgb_signal_->num_slots () > 0)
+ {
+ PCL_WARN ("PointXYZRGB callbacks deprecated. Use PointXYZRGBA instead.\n");
+ point_cloud_rgb_signal_->operator ()(convertToXYZRGBPointCloud<pcl::PointXYZRGB> (image, depth_image));
+ }
+
+ if (point_cloud_rgba_signal_->num_slots () > 0)
+ point_cloud_rgba_signal_->operator ()(convertToXYZRGBPointCloud<pcl::PointXYZRGBA> (image, depth_image));
+
+ if (image_depth_image_signal_->num_slots () > 0)
+ {
+ float reciprocalFocalLength = 1.0f / device_->getDepthFocalLength ();
+ image_depth_image_signal_->operator ()(image, depth_image, reciprocalFocalLength);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::irDepthImageCallback (const IRImage::Ptr &ir_image,
+ const DepthImage::Ptr &depth_image)
+{
+ // check if we have color point cloud slots
+ if (point_cloud_i_signal_->num_slots () > 0)
+ point_cloud_i_signal_->operator ()(convertToXYZIPointCloud (ir_image, depth_image));
+
+ if (ir_depth_image_signal_->num_slots () > 0)
+ {
+ float reciprocalFocalLength = 1.0f / device_->getDepthFocalLength ();
+ ir_depth_image_signal_->operator ()(ir_image, depth_image, reciprocalFocalLength);
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+pcl::PointCloud<pcl::PointXYZ>::Ptr
+pcl::io::OpenNI2Grabber::convertToXYZPointCloud (const DepthImage::Ptr& depth_image)
+{
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud <pcl::PointXYZ>);
+
+ cloud->header.seq = depth_image->getFrameID ();
+ cloud->header.stamp = depth_image->getTimestamp ();
+ cloud->height = depth_height_;
+ cloud->width = depth_width_;
+ cloud->is_dense = false;
+
+ cloud->points.resize (cloud->height * cloud->width);
+
+ float constant_x = 1.0f / device_->getDepthFocalLength ();
+ float constant_y = 1.0f / device_->getDepthFocalLength ();
+ float centerX = ((float)cloud->width - 1.f) / 2.f;
+ float centerY = ((float)cloud->height - 1.f) / 2.f;
+
+ if (pcl_isfinite (depth_parameters_.focal_length_x))
+ constant_x = 1.0f / static_cast<float> (depth_parameters_.focal_length_x);
+
+ if (pcl_isfinite (depth_parameters_.focal_length_y))
+ constant_y = 1.0f / static_cast<float> (depth_parameters_.focal_length_y);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_x))
+ centerX = static_cast<float> (depth_parameters_.principal_point_x);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_y))
+ centerY = static_cast<float> (depth_parameters_.principal_point_y);
+
+ if ( device_->isDepthRegistered() )
+ cloud->header.frame_id = rgb_frame_id_;
+ else
+ cloud->header.frame_id = depth_frame_id_;
+
+
+ float bad_point = std::numeric_limits<float>::quiet_NaN ();
+
+ const uint16_t* depth_map = (const uint16_t*) depth_image->getData ();
+ if (depth_image->getWidth () != depth_width_ || depth_image->getHeight () != depth_height_)
+ {
+ // Resize the image if nessacery
+ depth_resize_buffer_.resize(depth_width_ * depth_height_);
+
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, (uint16_t*) depth_resize_buffer_.data() );
+ depth_map = depth_resize_buffer_.data();
+ }
+
+ int depth_idx = 0;
+ for (int v = 0; v < depth_height_; ++v)
+ {
+ for (int u = 0; u < depth_width_; ++u, ++depth_idx)
+ {
+ pcl::PointXYZ& pt = cloud->points[depth_idx];
+ // Check for invalid measurements
+ if (depth_map[depth_idx] == 0 ||
+ depth_map[depth_idx] == depth_image->getNoSampleValue () ||
+ depth_map[depth_idx] == depth_image->getShadowValue ())
+ {
+ // not valid
+ pt.x = pt.y = pt.z = bad_point;
+ continue;
+ }
+ pt.z = depth_map[depth_idx] * 0.001f;
+ pt.x = (static_cast<float> (u) - centerX) * pt.z * constant_x;
+ pt.y = (static_cast<float> (v) - centerY) * pt.z * constant_y;
+ }
+ }
+ cloud->sensor_origin_.setZero ();
+ cloud->sensor_orientation_.w () = 1.0f;
+ cloud->sensor_orientation_.x () = 0.0f;
+ cloud->sensor_orientation_.y () = 0.0f;
+ cloud->sensor_orientation_.z () = 0.0f;
+ return (cloud);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> typename pcl::PointCloud<PointT>::Ptr
+pcl::io::OpenNI2Grabber::convertToXYZRGBPointCloud (const Image::Ptr &image, const DepthImage::Ptr &depth_image)
+{
+ boost::shared_ptr<pcl::PointCloud<PointT> > cloud (new pcl::PointCloud<PointT>);
+
+ cloud->header.seq = depth_image->getFrameID ();
+ cloud->header.stamp = depth_image->getTimestamp ();
+ cloud->header.frame_id = rgb_frame_id_;
+ cloud->height = std::max (image_height_, depth_height_);
+ cloud->width = std::max (image_width_, depth_width_);
+ cloud->is_dense = false;
+
+ cloud->points.resize (cloud->height * cloud->width);
+
+ // Generate default camera parameters
+ float fx = device_->getDepthFocalLength (); // Horizontal focal length
+ float fy = device_->getDepthFocalLength (); // Vertcal focal length
+ float cx = ((float)depth_width_ - 1.f) / 2.f; // Center x
+ float cy = ((float)depth_height_- 1.f) / 2.f; // Center y
+
+ // Load pre-calibrated camera parameters if they exist
+ if (pcl_isfinite (depth_parameters_.focal_length_x))
+ fx = 1.0f / static_cast<float> (depth_parameters_.focal_length_x);
+
+ if (pcl_isfinite (depth_parameters_.focal_length_y))
+ fy = 1.0f / static_cast<float> (depth_parameters_.focal_length_y);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_x))
+ cx = static_cast<float> (depth_parameters_.principal_point_x);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_y))
+ cy = static_cast<float> (depth_parameters_.principal_point_y);
+
+ // Get inverse focal length for calculations below
+ float fx_inv = 1.0f / fx;
+ float fy_inv = 1.0f / fy;
+
+ const uint16_t* depth_map = (const uint16_t*) depth_image->getData ();
+ if (depth_image->getWidth () != depth_width_ || depth_image->getHeight () != depth_height_)
+ {
+ // Resize the image if nessacery
+ depth_resize_buffer_.resize(depth_width_ * depth_height_);
+ depth_map = depth_resize_buffer_.data();
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, (unsigned short*) depth_map );
+ }
+
+ const uint8_t* rgb_buffer = (const uint8_t*) image->getData ();
+ if (image->getWidth () != image_width_ || image->getHeight () != image_height_)
+ {
+ // Resize the image if nessacery
+ color_resize_buffer_.resize(image_width_ * image_height_ * 3);
+ rgb_buffer = color_resize_buffer_.data();
+ image->fillRGB (image_width_, image_height_, (unsigned char*) rgb_buffer, image_width_ * 3);
+ }
+
+
+ float bad_point = std::numeric_limits<float>::quiet_NaN ();
+
+ // set xyz to Nan and rgb to 0 (black)
+ if (image_width_ != depth_width_)
+ {
+ PointT pt;
+ pt.x = pt.y = pt.z = bad_point;
+ pt.b = pt.g = pt.r = 0;
+ pt.a = 255; // point has no color info -> alpha = max => transparent
+ cloud->points.assign (cloud->points.size (), pt);
+ }
+
+ // fill in XYZ values
+ unsigned step = cloud->width / depth_width_;
+ unsigned skip = cloud->width * step - cloud->width;
+
+ int value_idx = 0;
+ int point_idx = 0;
+ for (int v = 0; v < depth_height_; ++v, point_idx += skip)
+ {
+ for (int u = 0; u < depth_width_; ++u, ++value_idx, point_idx += step)
+ {
+ PointT& pt = cloud->points[point_idx];
+ /// @todo Different values for these cases
+ // Check for invalid measurements
+
+ OniDepthPixel pixel = depth_map[value_idx];
+ if (pixel != 0 &&
+ pixel != depth_image->getNoSampleValue () &&
+ pixel != depth_image->getShadowValue () )
+ {
+ pt.z = depth_map[value_idx] * 0.001f; // millimeters to meters
+ pt.x = (static_cast<float> (u) - cx) * pt.z * fx_inv;
+ pt.y = (static_cast<float> (v) - cy) * pt.z * fy_inv;
+ }
+ else
+ {
+ pt.x = pt.y = pt.z = bad_point;
+ }
+ }
+ }
+
+ // fill in the RGB values
+ step = cloud->width / image_width_;
+ skip = cloud->width * step - cloud->width;
+
+ value_idx = 0;
+ point_idx = 0;
+ RGBValue color;
+ color.Alpha = 0;
+
+ for (unsigned yIdx = 0; yIdx < image_height_; ++yIdx, point_idx += skip)
+ {
+ for (unsigned xIdx = 0; xIdx < image_width_; ++xIdx, point_idx += step, value_idx += 3)
+ {
+ PointT& pt = cloud->points[point_idx];
+
+ color.Red = rgb_buffer[value_idx];
+ color.Green = rgb_buffer[value_idx + 1];
+ color.Blue = rgb_buffer[value_idx + 2];
+
+ pt.rgba = color.long_value;
+ }
+ }
+ cloud->sensor_origin_.setZero ();
+ cloud->sensor_orientation_.setIdentity ();
+ return (cloud);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+pcl::PointCloud<pcl::PointXYZI>::Ptr
+pcl::io::OpenNI2Grabber::convertToXYZIPointCloud (const IRImage::Ptr &ir_image, const DepthImage::Ptr &depth_image)
+{
+ boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> > cloud (new pcl::PointCloud<pcl::PointXYZI > ());
+
+ cloud->header.seq = depth_image->getFrameID ();
+ cloud->header.stamp = depth_image->getTimestamp ();
+ cloud->header.frame_id = rgb_frame_id_;
+ cloud->height = depth_height_;
+ cloud->width = depth_width_;
+ cloud->is_dense = false;
+
+ cloud->points.resize (cloud->height * cloud->width);
+
+
+ float fx = device_->getDepthFocalLength (); // Horizontal focal length
+ float fy = device_->getDepthFocalLength (); // Vertcal focal length
+ float cx = ((float)cloud->width - 1.f) / 2.f; // Center x
+ float cy = ((float)cloud->height - 1.f) / 2.f; // Center y
+
+ // Load pre-calibrated camera parameters if they exist
+ if (pcl_isfinite (depth_parameters_.focal_length_x))
+ fx = static_cast<float> (depth_parameters_.focal_length_x);
+
+ if (pcl_isfinite (depth_parameters_.focal_length_y))
+ fy = static_cast<float> (depth_parameters_.focal_length_y);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_x))
+ cx = static_cast<float> (depth_parameters_.principal_point_x);
+
+ if (pcl_isfinite (depth_parameters_.principal_point_y))
+ cy = static_cast<float> (depth_parameters_.principal_point_y);
+
+ float fx_inv = 1.0f / fx;
+ float fy_inv = 1.0f / fy;
+
+
+ const uint16_t* depth_map = (const uint16_t*) depth_image->getData ();
+ if (depth_image->getWidth () != depth_width_ || depth_image->getHeight () != depth_height_)
+ {
+ // Resize the image if nessacery
+ depth_resize_buffer_.resize(depth_width_ * depth_height_);
+ depth_map = depth_resize_buffer_.data();
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, (unsigned short*) depth_map );
+ }
+
+ const uint16_t* ir_map = (const uint16_t*) ir_image->getData ();
+ if (ir_image->getWidth () != depth_width_ || ir_image->getHeight () != depth_height_)
+ {
+ // Resize the image if nessacery
+ ir_resize_buffer_.resize(depth_width_ * depth_height_);
+ ir_map = ir_resize_buffer_.data();
+ ir_image->fillRaw (depth_width_, depth_height_, (unsigned short*) ir_map);
+ }
+
+
+ int depth_idx = 0;
+ float bad_point = std::numeric_limits<float>::quiet_NaN ();
+
+ for (int v = 0; v < depth_height_; ++v)
+ {
+ for (int u = 0; u < depth_width_; ++u, ++depth_idx)
+ {
+ pcl::PointXYZI& pt = cloud->points[depth_idx];
+ /// @todo Different values for these cases
+ // Check for invalid measurements
+ if (depth_map[depth_idx] == 0 ||
+ depth_map[depth_idx] == depth_image->getNoSampleValue () ||
+ depth_map[depth_idx] == depth_image->getShadowValue ())
+ {
+ pt.x = pt.y = pt.z = bad_point;
+ }
+ else
+ {
+ pt.z = depth_map[depth_idx] * 0.001f; // millimeters to meters
+ pt.x = (static_cast<float> (u) - cx) * pt.z * fx_inv;
+ pt.y = (static_cast<float> (v) - cy) * pt.z * fy_inv;
+ }
+
+ pt.data_c[0] = pt.data_c[1] = pt.data_c[2] = pt.data_c[3] = 0;
+ pt.intensity = static_cast<float> (ir_map[depth_idx]);
+ }
+ }
+ cloud->sensor_origin_.setZero ();
+ cloud->sensor_orientation_.setIdentity ();
+ return (cloud);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::io::OpenNI2Grabber::updateModeMaps ()
+{
+ typedef pcl::io::openni2::OpenNI2VideoMode VideoMode;
+
+pcl::io::openni2::OpenNI2VideoMode output_mode;
+
+ config2oni_map_[OpenNI_SXGA_15Hz] = VideoMode (XN_SXGA_X_RES, XN_SXGA_Y_RES, 15);
+
+ config2oni_map_[OpenNI_VGA_25Hz] = VideoMode (XN_VGA_X_RES, XN_VGA_Y_RES, 25);
+ config2oni_map_[OpenNI_VGA_30Hz] = VideoMode (XN_VGA_X_RES, XN_VGA_Y_RES, 30);
+
+ config2oni_map_[OpenNI_QVGA_25Hz] = VideoMode (XN_QVGA_X_RES, XN_QVGA_Y_RES, 25);
+ config2oni_map_[OpenNI_QVGA_30Hz] = VideoMode (XN_QVGA_X_RES, XN_QVGA_Y_RES, 30);
+ config2oni_map_[OpenNI_QVGA_60Hz] = VideoMode (XN_QVGA_X_RES, XN_QVGA_Y_RES, 60);
+
+ config2oni_map_[OpenNI_QQVGA_25Hz] = VideoMode (XN_QQVGA_X_RES, XN_QQVGA_Y_RES, 25);
+ config2oni_map_[OpenNI_QQVGA_30Hz] = VideoMode (XN_QQVGA_X_RES, XN_QQVGA_Y_RES, 30);
+ config2oni_map_[OpenNI_QQVGA_60Hz] = VideoMode (XN_QQVGA_X_RES, XN_QQVGA_Y_RES, 60);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::io::OpenNI2Grabber::mapMode2XnMode (int mode, OpenNI2VideoMode &xnmode) const
+{
+ std::map<int, pcl::io::openni2::OpenNI2VideoMode>::const_iterator it = config2oni_map_.find (mode);
+ if (it != config2oni_map_.end ())
+ {
+ xnmode = it->second;
+ return (true);
+ }
+ else
+ {
+ return (false);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> >
+pcl::io::OpenNI2Grabber::getAvailableDepthModes () const
+{
+pcl::io::openni2::OpenNI2VideoMode dummy;
+ std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> > result;
+ for (std::map<int, pcl::io::openni2::OpenNI2VideoMode>::const_iterator it = config2oni_map_.begin (); it != config2oni_map_.end (); ++it)
+ {
+ if (device_->findCompatibleDepthMode (it->second, dummy))
+ result.push_back (*it);
+ }
+
+ return (result);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> >
+pcl::io::OpenNI2Grabber::getAvailableImageModes () const
+{
+pcl::io::openni2::OpenNI2VideoMode dummy;
+ std::vector<std::pair<int, pcl::io::openni2::OpenNI2VideoMode> > result;
+ for (std::map<int, pcl::io::openni2::OpenNI2VideoMode>::const_iterator it = config2oni_map_.begin (); it != config2oni_map_.end (); ++it)
+ {
+ if (device_->findCompatibleColorMode (it->second, dummy))
+ result.push_back (*it);
+ }
+
+ return (result);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+float
+pcl::io::OpenNI2Grabber::getFramesPerSecond () const
+{
+ return (static_cast<float> (device_->getColorVideoMode ().frame_rate_));
+}
+
+
+
+// Convert VideoFrameRef into pcl::Image and forward to registered callbacks
+void pcl::io::OpenNI2Grabber::processColorFrame (openni::VideoStream& stream)
+{
+ Image::Timestamp t_callback = Image::Clock::now ();
+
+ openni::VideoFrameRef frame;
+ stream.readFrame (&frame);
+ FrameWrapper::Ptr frameWrapper = boost::make_shared<Openni2FrameWrapper>(frame);
+
+ openni::PixelFormat format = frame.getVideoMode ().getPixelFormat ();
+ boost::shared_ptr<Image> image;
+
+ // Convert frame to PCL image type, based on pixel format
+ if (format == openni::PIXEL_FORMAT_YUV422)
+ image = boost::make_shared<ImageYUV422> (frameWrapper, t_callback);
+ else //if (format == PixelFormat::PIXEL_FORMAT_RGB888)
+ image = boost::make_shared<ImageRGB24> (frameWrapper, t_callback);
+
+ imageCallback (image, NULL);
+}
+
+
+void pcl::io::OpenNI2Grabber::processDepthFrame (openni::VideoStream& stream)
+{
+ openni::VideoFrameRef frame;
+ stream.readFrame (&frame);
+ FrameWrapper::Ptr frameWrapper = boost::make_shared<Openni2FrameWrapper>(frame);
+
+ float focalLength = device_->getDepthFocalLength ();
+
+ float baseline = device_->getBaseline();
+ pcl::uint64_t no_sample_value = device_->getShadowValue();
+ pcl::uint64_t shadow_value = no_sample_value;
+
+ boost::shared_ptr<DepthImage> image =
+ boost::make_shared<DepthImage> (frameWrapper, baseline, focalLength, shadow_value, no_sample_value);
+
+ depthCallback (image, NULL);
+}
+
+
+void pcl::io::OpenNI2Grabber::processIRFrame (openni::VideoStream& stream)
+{
+ openni::VideoFrameRef frame;
+ stream.readFrame (&frame);
+
+ FrameWrapper::Ptr frameWrapper = boost::make_shared<Openni2FrameWrapper>(frame);
+
+ boost::shared_ptr<IRImage> image = boost::make_shared<IRImage> ( frameWrapper );
+
+ irCallback (image, NULL);
+}
+
+#endif // HAVE_OPENNI2
{
// Calculate shift conversion table
- pcl::int32_t nIndex = 0;
+ pcl::uint32_t nIndex = 0;
pcl::int32_t nShiftValue = 0;
double dFixedRefX = 0;
double dMetric = 0;
, point_cloud_rgb_signal_ (), point_cloud_rgba_signal_ ()
, config2xn_map_ (), depth_callback_handle (), image_callback_handle (), ir_callback_handle ()
, running_ (false)
+ , rgb_array_size_ (0)
+ , depth_buffer_size_ (0)
, rgb_focal_length_x_ (std::numeric_limits<double>::quiet_NaN ())
, rgb_focal_length_y_ (std::numeric_limits<double>::quiet_NaN ())
, rgb_principal_point_x_ (std::numeric_limits<double>::quiet_NaN ())
register const unsigned short* depth_map = depth_image->getDepthMetaData ().Data ();
if (depth_image->getWidth() != depth_width_ || depth_image->getHeight () != depth_height_)
{
- static unsigned buffer_size = 0;
- static boost::shared_array<unsigned short> depth_buffer ((unsigned short*)(NULL));
-
- if (buffer_size < depth_width_ * depth_height_)
+ if (depth_buffer_size_ < depth_width_ * depth_height_)
{
- buffer_size = depth_width_ * depth_height_;
- depth_buffer.reset (new unsigned short [buffer_size]);
+ depth_buffer_size_ = depth_width_ * depth_height_;
+ depth_buffer_.reset (new unsigned short [depth_buffer_size_]);
}
- depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer.get ());
- depth_map = depth_buffer.get ();
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer_.get ());
+ depth_map = depth_buffer_.get ();
}
register int depth_idx = 0;
- for (int v = 0; v < depth_height_; ++v)
+ for (unsigned int v = 0; v < depth_height_; ++v)
{
- for (register int u = 0; u < depth_width_; ++u, ++depth_idx)
+ for (register unsigned int u = 0; u < depth_width_; ++u, ++depth_idx)
{
pcl::PointXYZ& pt = cloud->points[depth_idx];
// Check for invalid measurements
pcl::OpenNIGrabber::convertToXYZRGBPointCloud (const boost::shared_ptr<openni_wrapper::Image> &image,
const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image) const
{
- static unsigned rgb_array_size = 0;
- static boost::shared_array<unsigned char> rgb_array ((unsigned char*)(NULL));
- static unsigned char* rgb_buffer = 0;
-
+ unsigned char* rgb_buffer = rgb_array_.get ();
boost::shared_ptr<pcl::PointCloud<PointT> > cloud (new pcl::PointCloud<PointT>);
cloud->header.frame_id = rgb_frame_id_;
register const XnDepthPixel* depth_map = depth_image->getDepthMetaData ().Data ();
if (depth_image->getWidth () != depth_width_ || depth_image->getHeight() != depth_height_)
{
- static unsigned buffer_size = 0;
- static boost::shared_array<unsigned short> depth_buffer ((unsigned short*)(NULL));
-
- if (buffer_size < depth_width_ * depth_height_)
+ if (depth_buffer_size_ < depth_width_ * depth_height_)
{
- buffer_size = depth_width_ * depth_height_;
- depth_buffer.reset (new unsigned short [buffer_size]);
+ depth_buffer_size_ = depth_width_ * depth_height_;
+ depth_buffer_.reset (new unsigned short [depth_buffer_size_]);
}
- depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer.get ());
- depth_map = depth_buffer.get ();
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer_.get ());
+ depth_map = depth_buffer_.get ();
}
// here we need exact the size of the point cloud for a one-one correspondence!
- if (rgb_array_size < image_width_ * image_height_ * 3)
+ if (rgb_array_size_ < image_width_ * image_height_ * 3)
{
- rgb_array_size = image_width_ * image_height_ * 3;
- rgb_array.reset (new unsigned char [rgb_array_size]);
- rgb_buffer = rgb_array.get ();
+ rgb_array_size_ = image_width_ * image_height_ * 3;
+ rgb_array_.reset (new unsigned char [rgb_array_size_]);
+ rgb_buffer = rgb_array_.get ();
}
image->fillRGB (image_width_, image_height_, rgb_buffer, image_width_ * 3);
float bad_point = std::numeric_limits<float>::quiet_NaN ();
int value_idx = 0;
int point_idx = 0;
- for (int v = 0; v < depth_height_; ++v, point_idx += skip)
+ for (unsigned int v = 0; v < depth_height_; ++v, point_idx += skip)
{
- for (register int u = 0; u < depth_width_; ++u, ++value_idx, point_idx += step)
+ for (register unsigned int u = 0; u < depth_width_; ++u, ++value_idx, point_idx += step)
{
PointT& pt = cloud->points[point_idx];
/// @todo Different values for these cases
if (depth_image->getWidth () != depth_width_ || depth_image->getHeight () != depth_height_)
{
- static unsigned buffer_size = 0;
- static boost::shared_array<unsigned short> depth_buffer ((unsigned short*)(NULL));
- static boost::shared_array<unsigned short> ir_buffer ((unsigned short*)(NULL));
-
- if (buffer_size < depth_width_ * depth_height_)
+ if (depth_buffer_size_ < depth_width_ * depth_height_)
{
- buffer_size = depth_width_ * depth_height_;
- depth_buffer.reset (new unsigned short [buffer_size]);
- ir_buffer.reset (new unsigned short [buffer_size]);
+ depth_buffer_size_ = depth_width_ * depth_height_;
+ depth_buffer_.reset (new unsigned short [depth_buffer_size_]);
+ ir_buffer_.reset (new unsigned short [depth_buffer_size_]);
}
- depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer.get ());
- depth_map = depth_buffer.get ();
+ depth_image->fillDepthImageRaw (depth_width_, depth_height_, depth_buffer_.get ());
+ depth_map = depth_buffer_.get ();
- ir_image->fillRaw (depth_width_, depth_height_, ir_buffer.get ());
- ir_map = ir_buffer.get ();
+ ir_image->fillRaw (depth_width_, depth_height_, ir_buffer_.get ());
+ ir_map = ir_buffer_.get ();
}
register int depth_idx = 0;
float bad_point = std::numeric_limits<float>::quiet_NaN ();
- for (int v = 0; v < depth_height_; ++v)
+ for (unsigned int v = 0; v < depth_height_; ++v)
{
- for (register int u = 0; u < depth_width_; ++u, ++depth_idx)
+ for (register unsigned int u = 0; u < depth_width_; ++u, ++depth_idx)
{
pcl::PointXYZI& pt = cloud->points[depth_idx];
/// @todo Different values for these cases
std::vector<int> tar_offsets_;
std::vector<size_t> cloud_idx_to_file_idx_;
+ // Mutex to ensure that two quick consecutive triggers do not cause
+ // simultaneous asynchronous read-aheads
+ boost::mutex read_ahead_mutex_;
+
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
void
pcl::PCDGrabberBase::PCDGrabberImpl::trigger ()
{
+ boost::mutex::scoped_lock read_ahead_lock(read_ahead_mutex_);
if (valid_)
grabber_.publish (next_cloud_,origin_,orientation_);
// (we really ought to check this in the compressor and copy the original data in those cases)
if (data_size < compressed_size || uncompressed_size < compressed_size)
{
- PCL_DEBUG ("[pcl::PCDReader::read] Allocated data size (%zu) or uncompressed size (%zu) smaller than compressed size (%u). Need to remap.\n", data_size, uncompressed_size, compressed_size);
+ PCL_DEBUG ("[pcl::PCDReader::read] Allocated data size (%lu) or uncompressed size (%lu) smaller than compressed size (%u). Need to remap.\n", data_size, uncompressed_size, compressed_size);
#ifdef _WIN32
UnmapViewOfFile (map);
data_size = compressed_size + data_idx + 8;
boost::bind (&pcl::PLYReader::vertexBeginCallback, this),
boost::bind (&pcl::PLYReader::vertexEndCallback, this)));
}
- // else if (element_name == "face")
- // {
- // return (boost::tuple<boost::function<void ()>, boost::function<void ()> > (
- // boost::bind (&pcl::PLYReader::faceBegin, this),
- // boost::bind (&pcl::PLYReader::faceEnd, this)));
- // }
+ else if ((element_name == "face") && polygons_)
+ {
+ polygons_->reserve (count);
+ return (boost::tuple<boost::function<void ()>, boost::function<void ()> > (
+ boost::bind (&pcl::PLYReader::faceBeginCallback, this),
+ boost::bind (&pcl::PLYReader::faceEndCallback, this)));
+ }
else if (element_name == "camera")
{
cloud_->is_dense = true;
}
else if (element_name == "range_grid")
{
- (*range_grid_).resize (count);
- range_count_ = 0;
+ range_grid_->reserve (count);
return (boost::tuple<boost::function<void ()>, boost::function<void ()> > (
boost::bind (&pcl::PLYReader::rangeGridBeginCallback, this),
boost::bind (&pcl::PLYReader::rangeGridEndCallback, this)));
return (cloud_->data.size () == cloud_->point_step * cloud_->width * cloud_->height);
}
-void
-pcl::PLYReader::appendFloatProperty (const std::string& name, const size_t& size)
+template<typename Scalar> void
+pcl::PLYReader::appendScalarProperty (const std::string& name, const size_t& size)
{
cloud_->fields.push_back (::pcl::PCLPointField ());
::pcl::PCLPointField ¤t_field = cloud_->fields.back ();
current_field.name = name;
current_field.offset = cloud_->point_step;
- current_field.datatype = ::pcl::PCLPointField::FLOAT32;
+ current_field.datatype = pcl::traits::asEnum<Scalar>::value;
current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (::pcl::PCLPointField::FLOAT32) * size);
+ cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::traits::asEnum<Scalar>::value) * size);
}
void
finder->datatype = new_datatype;
}
-void
-pcl::PLYReader::appendUnsignedIntProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (::pcl::PCLPointField ());
- ::pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = ::pcl::PCLPointField::UINT32;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (::pcl::PCLPointField::UINT32) * size);
-}
-
-void
-pcl::PLYReader::appendIntProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::INT32;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::INT32) * size);
-}
-
-void
-pcl::PLYReader::appendDoubleProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::FLOAT64;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::FLOAT64) * size);
-}
-
-void
-pcl::PLYReader::appendUnsignedCharProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::UINT8;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::UINT8) * size);
-}
-
-void
-pcl::PLYReader::appendCharProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::INT8;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::INT8) * size);
-}
-
-void
-pcl::PLYReader::appendUnsignedShortProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::UINT16;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::UINT16) * size);
-}
-
-void
-pcl::PLYReader::appendShortProperty (const std::string& name, const size_t& size)
-{
- cloud_->fields.push_back (pcl::PCLPointField ());
- pcl::PCLPointField ¤t_field = cloud_->fields.back ();
- current_field.name = name;
- current_field.offset = cloud_->point_step;
- current_field.datatype = pcl::PCLPointField::INT16;
- current_field.count = static_cast<uint32_t> (size);
- cloud_->point_step += static_cast<uint32_t> (pcl::getFieldSize (pcl::PCLPointField::INT16) * size);
-}
-
namespace pcl
{
template <>
{
if (element_name == "vertex")
{
- appendFloatProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexFloatPropertyCallback, this, _1));
+ appendScalarProperty<pcl::io::ply::float32> (property_name, 1);
+ return (boost::bind (&pcl::PLYReader::vertexScalarPropertyCallback<pcl::io::ply::float32>, this, _1));
}
else if (element_name == "camera")
{
(property_name == "diffuse_red") || (property_name == "diffuse_green") || (property_name == "diffuse_blue"))
{
if ((property_name == "red") || (property_name == "diffuse_red"))
- appendFloatProperty ("rgb");
+ appendScalarProperty<pcl::io::ply::float32> ("rgb");
return boost::bind (&pcl::PLYReader::vertexColorCallback, this, property_name, _1);
}
else if (property_name == "alpha")
}
else if (property_name == "intensity")
{
- appendFloatProperty (property_name);
+ appendScalarProperty<pcl::io::ply::float32> (property_name);
return boost::bind (&pcl::PLYReader::vertexIntensityCallback, this, _1);
}
else
{
- appendUnsignedCharProperty (property_name);
- return boost::bind (&pcl::PLYReader::vertexUnsignedCharPropertyCallback, this, _1);
+ appendScalarProperty<pcl::io::ply::uint8> (property_name);
+ return boost::bind (&pcl::PLYReader::vertexScalarPropertyCallback<pcl::io::ply::uint8>, this, _1);
}
}
else
{
if (element_name == "vertex")
{
- appendIntProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexIntPropertyCallback, this, _1));
+ appendScalarProperty<pcl::io::ply::int32> (property_name, 1);
+ return (boost::bind (&pcl::PLYReader::vertexScalarPropertyCallback<pcl::io::ply::int32>, this, _1));
}
if (element_name == "camera")
{
return boost::bind (&pcl::PLYReader::cloudHeightCallback, this, _1);
}
else
- {
- appendIntProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexIntPropertyCallback, this, _1));
- }
+ return (0);
}
else
return (0);
}
- template <> boost::function<void (pcl::io::ply::uint32)>
- PLYReader::scalarPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
- {
- if (element_name == "vertex")
- {
- appendUnsignedIntProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexUnsignedIntPropertyCallback, this, _1));
- }
- return (0);
- }
-
- template <> boost::function<void (pcl::io::ply::float64)>
- PLYReader::scalarPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
- {
- if (element_name == "vertex")
- {
- appendDoubleProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexDoublePropertyCallback, this, _1));
- }
- return (0);
- }
-
- template <> boost::function<void (pcl::io::ply::uint16)>
- PLYReader::scalarPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
- {
- if (element_name == "vertex")
- {
- appendUnsignedShortProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexUnsignedShortPropertyCallback, this, _1));
- }
- return (0);
- }
-
- template <> boost::function<void (pcl::io::ply::int16)>
+ template <typename Scalar> boost::function<void (Scalar)>
PLYReader::scalarPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
{
if (element_name == "vertex")
{
- appendShortProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexShortPropertyCallback, this, _1));
+ appendScalarProperty<Scalar> (property_name, 1);
+ return (boost::bind (&pcl::PLYReader::vertexScalarPropertyCallback<Scalar>, this, _1));
}
return (0);
}
-
- template <> boost::function<void (pcl::io::ply::int8)>
- PLYReader::scalarPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
+ template<typename Scalar> void
+ PLYReader::vertexScalarPropertyCallback (Scalar value)
{
- if (element_name == "vertex")
- {
- appendCharProperty (property_name, 1);
- return (boost::bind (&pcl::PLYReader::vertexCharPropertyCallback, this, _1));
- }
- return (0);
+ memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
+ &value,
+ sizeof (Scalar));
+ vertex_offset_before_ += static_cast<int> (sizeof (Scalar));
}
template <typename SizeType> void
boost::tuple<boost::function<void (pcl::io::ply::uint8)>, boost::function<void (pcl::io::ply::int32)>, boost::function<void ()> >
pcl::PLYReader::listPropertyDefinitionCallback (const std::string& element_name, const std::string& property_name)
{
- if ((element_name == "range_grid") && (property_name == "vertex_indices"))
+ if ((element_name == "range_grid") && (property_name == "vertex_indices") && polygons_)
{
return boost::tuple<boost::function<void (pcl::io::ply::uint8)>, boost::function<void (pcl::io::ply::int32)>, boost::function<void ()> > (
boost::bind (&pcl::PLYReader::rangeGridVertexIndicesBeginCallback, this, _1),
boost::bind (&pcl::PLYReader::rangeGridVertexIndicesEndCallback, this)
);
}
+ else if ((element_name == "face") && (property_name == "vertex_indices"))
+ {
+ return boost::tuple<boost::function<void (pcl::io::ply::uint8)>, boost::function<void (pcl::io::ply::int32)>, boost::function<void ()> > (
+ boost::bind (&pcl::PLYReader::faceVertexIndicesBeginCallback, this, _1),
+ boost::bind (&pcl::PLYReader::faceVertexIndicesElementCallback, this, _1),
+ boost::bind (&pcl::PLYReader::faceVertexIndicesEndCallback, this)
+ );
+ }
else if (element_name == "vertex")
{
cloud_->fields.push_back (pcl::PCLPointField ());
return boost::tuple<boost::function<void (SizeType)>, boost::function<void (ContentType)>, boost::function<void ()> > (0, 0, 0);
}
}
-
-}
-
-void
-pcl::PLYReader::vertexFloatPropertyCallback (pcl::io::ply::float32 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::float32));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::float32));
-}
-
-void
-pcl::PLYReader::vertexDoublePropertyCallback (pcl::io::ply::float64 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::float64));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::float64));
-}
-
-void
-pcl::PLYReader::vertexUnsignedIntPropertyCallback (pcl::io::ply::uint32 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::uint32));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::uint32));
-}
-
-void
-pcl::PLYReader::vertexIntPropertyCallback (pcl::io::ply::int32 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::int32));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::int32));
-}
-
-void
-pcl::PLYReader::vertexUnsignedShortPropertyCallback (pcl::io::ply::uint16 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::uint16));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::uint16));
-}
-
-void
-pcl::PLYReader::vertexShortPropertyCallback (pcl::io::ply::int16 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::int16));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::int16));
-}
-
-void
-pcl::PLYReader::vertexUnsignedCharPropertyCallback (pcl::io::ply::uint8 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::uint8));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::uint8));
-}
-
-void
-pcl::PLYReader::vertexCharPropertyCallback (pcl::io::ply::int8 value)
-{
- memcpy (&cloud_->data[vertex_count_ * cloud_->point_step + vertex_offset_before_],
- &value,
- sizeof (pcl::io::ply::int8));
- vertex_offset_before_ += static_cast<int> (sizeof (pcl::io::ply::int8));
}
void
}
void
-pcl::PLYReader::rangeGridBeginCallback () { }
+pcl::PLYReader::rangeGridBeginCallback ()
+{
+ range_grid_->push_back (std::vector <int> ());
+}
void
pcl::PLYReader::rangeGridVertexIndicesBeginCallback (pcl::io::ply::uint8 size)
{
- (*range_grid_)[range_count_].reserve (size);
+ range_grid_->back ().reserve (size);
}
-void pcl::PLYReader::rangeGridVertexIndicesElementCallback (pcl::io::ply::int32 vertex_index)
+void
+pcl::PLYReader::rangeGridVertexIndicesElementCallback (pcl::io::ply::int32 vertex_index)
+{
+ range_grid_->back ().push_back (vertex_index);
+}
+
+void
+pcl::PLYReader::rangeGridVertexIndicesEndCallback () {}
+
+void
+pcl::PLYReader::rangeGridEndCallback () {}
+
+void
+pcl::PLYReader::faceBeginCallback ()
{
- (*range_grid_)[range_count_].push_back (vertex_index);
+ polygons_->push_back (pcl::Vertices ());
}
void
-pcl::PLYReader::rangeGridVertexIndicesEndCallback () { }
+pcl::PLYReader::faceVertexIndicesBeginCallback (pcl::io::ply::uint8 size)
+{
+ polygons_->back ().vertices.reserve (size);
+}
void
-pcl::PLYReader::rangeGridEndCallback ()
+pcl::PLYReader::faceVertexIndicesElementCallback (pcl::io::ply::int32 vertex_index)
{
- ++range_count_;
+ polygons_->back ().vertices.push_back (vertex_index);
}
+void
+pcl::PLYReader::faceVertexIndicesEndCallback () { }
+
+void
+pcl::PLYReader::faceEndCallback () {}
+
void
pcl::PLYReader::objInfoCallback (const std::string& line)
{
ply_parser.end_header_callback (boost::bind (&pcl::PLYReader::endHeaderCallback, this));
pcl::io::ply::ply_parser::scalar_property_definition_callbacks_type scalar_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::float64> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::float64>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::int8> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::int32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::int16> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float64> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::float64>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int8> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int16> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16> (scalar_property_definition_callbacks) = boost::bind (&pcl::PLYReader::scalarPropertyDefinitionCallback<pcl::io::ply::uint16>, this, _1, _2);
ply_parser.scalar_property_definition_callbacks (scalar_property_definition_callbacks);
pcl::io::ply::ply_parser::list_property_definition_callbacks_type list_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::float64> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::float64>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::float32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint16> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int16> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint8> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int8> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::float64> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::float64>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::float32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint16> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int16> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint8> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int8> (list_property_definition_callbacks) = boost::bind (&pcl::PLYReader::listPropertyDefinitionCallback<pcl::io::ply::uint32, pcl::io::ply::int8>, this, _1, _2);
ply_parser.list_property_definition_callbacks (list_property_definition_callbacks);
return ply_parser.parse (istream_filename);
////////////////////////////////////////////////////////////////////////////////////////
int
pcl::PLYReader::readHeader (const std::string &file_name, pcl::PCLPointCloud2 &cloud,
- Eigen::Vector4f &, Eigen::Quaternionf &,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
int &, int &, unsigned int &, const int)
{
// Silence compiler warnings
cloud_ = &cloud;
range_grid_ = new std::vector<std::vector<int> >;
cloud_->width = cloud_->height = 0;
+ origin = Eigen::Vector4f::Zero ();
+ orientation = Eigen::Quaternionf::Identity ();
if (!parse (file_name))
{
PCL_ERROR ("[pcl::PLYReader::read] problem parsing header!\n");
cloud_->data.swap (data);
}
- orientation = Eigen::Quaternionf (orientation_);
- origin = origin_;
+ orientation_ = Eigen::Quaternionf (orientation);
+ origin_ = origin;
for (size_t i = 0; i < cloud_->fields.size (); ++i)
{
}
////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::PLYReader::read (const std::string &file_name, pcl::PolygonMesh &mesh,
+ Eigen::Vector4f &origin, Eigen::Quaternionf &orientation,
+ int &ply_version, const int offset)
+{
+ // kept only for backward compatibility
+ int data_type;
+ unsigned int data_idx;
+ polygons_ = &(mesh.polygons);
+ if (this->readHeader (file_name, mesh.cloud, origin, orientation, ply_version, data_type, data_idx, offset))
+ {
+ PCL_ERROR ("[pcl::PLYReader::read] problem parsing header!\n");
+ return (-1);
+ }
+
+ // a range_grid element was found ?
+ size_t r_size;
+ if ((r_size = (*range_grid_).size ()) > 0 && r_size != vertex_count_)
+ {
+ //cloud.header = cloud_->header;
+ std::vector<pcl::uint8_t> data ((*range_grid_).size () * mesh.cloud.point_step);
+ const static float f_nan = std::numeric_limits <float>::quiet_NaN ();
+ const static double d_nan = std::numeric_limits <double>::quiet_NaN ();
+ for (size_t r = 0; r < r_size; ++r)
+ {
+ if ((*range_grid_)[r].size () == 0)
+ {
+ for (size_t f = 0; f < cloud_->fields.size (); ++f)
+ if (cloud_->fields[f].datatype == ::pcl::PCLPointField::FLOAT32)
+ memcpy (&data[r * cloud_->point_step + cloud_->fields[f].offset],
+ reinterpret_cast<const char*> (&f_nan), sizeof (float));
+ else if (cloud_->fields[f].datatype == ::pcl::PCLPointField::FLOAT64)
+ memcpy (&data[r * cloud_->point_step + cloud_->fields[f].offset],
+ reinterpret_cast<const char*> (&d_nan), sizeof (double));
+ else
+ memset (&data[r * cloud_->point_step + cloud_->fields[f].offset], 0,
+ pcl::getFieldSize (cloud_->fields[f].datatype) * cloud_->fields[f].count);
+ }
+ else
+ memcpy (&data[r* cloud_->point_step], &cloud_->data[(*range_grid_)[r][0] * cloud_->point_step], cloud_->point_step);
+ }
+ cloud_->data.swap (data);
+ }
+
+ orientation_ = Eigen::Quaternionf (orientation);
+ origin_ = origin;
+
+ for (size_t i = 0; i < cloud_->fields.size (); ++i)
+ {
+ if (cloud_->fields[i].name == "nx")
+ cloud_->fields[i].name = "normal_x";
+ if (cloud_->fields[i].name == "ny")
+ cloud_->fields[i].name = "normal_y";
+ if (cloud_->fields[i].name == "nz")
+ cloud_->fields[i].name = "normal_z";
+ }
+ return (0);
+}
+////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::PLYReader::read (const std::string &file_name, pcl::PolygonMesh &mesh, const int offset)
+{
+ Eigen::Vector4f origin;
+ Eigen::Quaternionf orientation;
+ int ply_version;
+ return read (file_name, mesh, origin, orientation, ply_version, offset);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
std::string
pcl::PLYWriter::generateHeader (const pcl::PCLPointCloud2 &cloud,
const Eigen::Vector4f &origin,
}
// Faces
fs << "\nelement face "<< nr_faces;
- fs << "\nproperty list uchar int vertex_index";
+ fs << "\nproperty list uchar int vertex_indices";
fs << "\nend_header\n";
// Write down vertices
}
// Faces
fs << "\nelement face "<< nr_faces;
- fs << "\nproperty list uchar int vertex_index";
+ fs << "\nproperty list uchar int vertex_indices";
fs << "\nend_header\n";
// Close the file
flipAndWritePng(file_name, importer);
}
+
+void
+pcl::io::saveRgbPNGFile (const std::string& file_name, const unsigned char *rgb_image, int width, int height)
+{
+ saveCharPNGFile(file_name, rgb_image, width, height, 3);
+}
+
+void
+pcl::io::savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned char>& cloud)
+{
+ saveCharPNGFile(file_name, &cloud.points[0], cloud.width, cloud.height, 1);
+}
+
+void
+pcl::io::savePNGFile (const std::string& file_name, const pcl::PointCloud<unsigned short>& cloud)
+{
+ saveShortPNGFile(file_name, &cloud.points[0], cloud.width, cloud.height, 1);
+}
+
+void
+pcl::io::savePNGFile (const std::string& file_name, const pcl::PCLImage& image)
+{
+ if (image.encoding == "rgb8")
+ {
+ saveRgbPNGFile(file_name, &image.data[0], image.width, image.height);
+ }
+ else if (image.encoding == "mono8")
+ {
+ saveCharPNGFile(file_name, &image.data[0], image.width, image.height, 1);
+ }
+ else if (image.encoding == "mono16")
+ {
+ saveShortPNGFile(file_name, reinterpret_cast<const unsigned short*>(&image.data[0]), image.width, image.height, 1);
+ }
+ else
+ {
+ PCL_ERROR ("[pcl::io::savePNGFile] Unsupported image encoding \"%s\".\n", image.encoding.c_str ());
+ }
+}
+
+void
+pcl::io::savePNGFile (const std::string& file_name, const pcl::PointCloud<pcl::PointXYZL>& cloud)
+{
+ std::vector<unsigned short> data(cloud.width * cloud.height);
+ for (size_t i = 0; i < cloud.points.size (); ++i)
+ {
+ data[i] = static_cast<unsigned short> (cloud.points[i].label);
+ }
+ saveShortPNGFile(file_name, &data[0], cloud.width, cloud.height,1);
+}
+
const size_t bytesPerPoint = 8;
const size_t totalPoints = length / bytesPerPoint;
- for (int i = 0; i < totalPoints; ++i)
+ for (size_t i = 0; i < totalPoints; ++i)
{
PointXYZI xyzi;
computeXYZI (xyzi, dataPacket + i*bytesPerPoint);
#include <pcl/io/vtk_lib_io.h>
#include <pcl/io/impl/vtk_lib_io.hpp>
#include <pcl/PCLPointCloud2.h>
+#include <vtkVersion.h>
#include <vtkCellArray.h>
#include <vtkCellData.h>
#include <vtkDoubleArray.h>
// TODO: what about sensor position and orientation?!?!?!?
// TODO: how to adequately catch exceptions thrown by the vtk writers?!
std::string extension = file_name.substr (file_name.find_last_of (".") + 1);
- if (extension == ".pcd") // no Polygon, but only a point cloud
+ if (extension == "pcd") // no Polygon, but only a point cloud
{
int error_code = pcl::io::savePCDFile (file_name, mesh.cloud);
if (error_code != 0)
return (0);
return (static_cast<int> (mesh.cloud.width * mesh.cloud.height));
}
- else if (extension == ".vtk")
+ else if (extension == "vtk")
return (pcl::io::savePolygonFileVTK (file_name, mesh));
- else if (extension == ".ply")
+ else if (extension == "ply")
return (pcl::io::savePolygonFilePLY (file_name, mesh));
- else if (extension == ".stl" )
+ else if (extension == "stl" )
return (pcl::io::savePolygonFileSTL (file_name, mesh));
else
{
pcl::io::mesh2vtk (mesh, poly_data);
vtkSmartPointer<vtkPolyDataWriter> poly_writer = vtkSmartPointer<vtkPolyDataWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
poly_writer->SetInput (poly_data);
+#else
+ poly_writer->SetInputData (poly_data);
+#endif
poly_writer->SetFileName (file_name.c_str ());
poly_writer->Write ();
pcl::io::mesh2vtk (mesh, poly_data);
vtkSmartPointer<vtkPLYWriter> poly_writer = vtkSmartPointer<vtkPLYWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
poly_writer->SetInput (poly_data);
+#else
+ poly_writer->SetInputData (poly_data);
+#endif
poly_writer->SetFileName (file_name.c_str ());
poly_writer->SetArrayName ("Colors");
poly_writer->Write ();
vtkSmartPointer<vtkPolyData> poly_data = vtkSmartPointer<vtkPolyData>::New ();
pcl::io::mesh2vtk (mesh, poly_data);
- poly_data->Update ();
vtkSmartPointer<vtkSTLWriter> poly_writer = vtkSmartPointer<vtkSTLWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
poly_writer->SetInput (poly_data);
+#else
+ poly_writer->SetInputData (poly_data);
+#endif
poly_writer->SetFileName (file_name.c_str ());
poly_writer->Write ();
{
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
image->SetDimensions(range_image.width, range_image.height, 1);
+#if VTK_MAJOR_VERSION < 6
image->SetNumberOfScalarComponents(1);
image->SetScalarTypeToFloat();
image->AllocateScalars();
+#else
+ image->AllocateScalars (VTK_FLOAT, 1);
+#endif
int* dims = image->GetDimensions();
vtkSmartPointer<vtkImageShiftScale> shiftScaleFilter = vtkSmartPointer<vtkImageShiftScale>::New();
shiftScaleFilter->SetOutputScalarTypeToUnsignedChar();
+#if VTK_MAJOR_VERSION < 6
shiftScaleFilter->SetInputConnection(image->GetProducerPort());
+#else
+ shiftScaleFilter->SetInputData (image);
+#endif
shiftScaleFilter->SetShift(-1.0f * image->GetScalarRange()[0]); // brings the lower bound to 0
shiftScaleFilter->SetScale(newRange/oldRange);
shiftScaleFilter->Update();
size_t
getTotalSystemMemory ()
{
+ uint64_t memory = std::numeric_limits<size_t>::max ();
+
+#ifdef _SC_AVPHYS_PAGES
uint64_t pages = sysconf (_SC_AVPHYS_PAGES);
uint64_t page_size = sysconf (_SC_PAGE_SIZE);
- print_info ("Total available memory size: %lluMB.\n", (pages * page_size) / 1048576);
- if (pages * page_size > uint64_t (std::numeric_limits<size_t>::max ()))
+
+ memory = pages * page_size;
+
+#elif defined(HAVE_SYSCTL) && defined(HW_PHYSMEM)
+ // This works on *bsd and darwin.
+ unsigned int physmem;
+ size_t len = sizeof physmem;
+ static int mib[2] = { CTL_HW, HW_PHYSMEM };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0 && len == sizeof (physmem))
{
- return std::numeric_limits<size_t>::max ();
+ memory = physmem;
}
- else
+#endif
+
+ if (memory > uint64_t (std::numeric_limits<size_t>::max ()))
{
- return size_t (pages * page_size);
+ memory = std::numeric_limits<size_t>::max ();
}
+
+ print_info ("Total available memory size: %lluMB.\n", memory / 1048576ull);
+ return size_t (memory);
}
-const int BUFFER_SIZE = int (getTotalSystemMemory () / (640 * 480));
+const size_t BUFFER_SIZE = size_t (getTotalSystemMemory () / (640 * 480 * sizeof (pcl::PointXYZRGBA)));
#else
-const int BUFFER_SIZE = 200;
+const size_t BUFFER_SIZE = 200;
#endif
//////////////////////////////////////////////////////////////////////////////////////////
private:
PCDBuffer (const PCDBuffer&); // Disabled copy constructor
- PCDBuffer& operator =(const PCDBuffer&); // Disabled assignment operator
+ PCDBuffer& operator = (const PCDBuffer&); // Disabled assignment operator
boost::mutex bmutex_;
boost::condition_variable buff_empty_;
}
//////////////////////////////////////////////////////////////////////////////////////////
-int
+void
+printHelp (int default_buff_size, int, char **argv)
+{
+ using pcl::console::print_error;
+ using pcl::console::print_info;
+
+ print_error ("Syntax is: %s ((<device_id> | <path-to-oni-file>) [-xyz] [-shift] [-buf X] | -l [<device_id>] | -h | --help)]\n", argv [0]);
+ print_info ("%s -h | --help : shows this help\n", argv [0]);
+ print_info ("%s -xyz : save only XYZ data, even if the device is RGB capable\n", argv [0]);
+ print_info ("%s -shift : use OpenNI shift values rather than 12-bit depth\n", argv [0]);
+ print_info ("%s -buf X ; use a buffer size of X frames (default: ", argv [0]);
+ print_value ("%d", default_buff_size); print_info (")\n");
+ print_info ("%s -l : list all available devices\n", argv [0]);
+ print_info ("%s -l <device-id> :list all available modes for specified device\n", argv [0]);
+ print_info ("\t\t<device_id> may be \"#1\", \"#2\", ... for the first, second etc device in the list\n");
+#ifndef _WIN32
+ print_info ("\t\t bus@address for the device connected to a specific usb-bus / address combination\n");
+ print_info ("\t\t <serial-number>\n");
+#endif
+ print_info ("\n\nexamples:\n");
+ print_info ("%s \"#1\"\n", argv [0]);
+ print_info ("\t\t uses the first device.\n");
+ print_info ("%s \"./temp/test.oni\"\n", argv [0]);
+ print_info ("\t\t uses the oni-player device to play back oni file given by path.\n");
+ print_info ("%s -l\n", argv [0]);
+ print_info ("\t\t list all available devices.\n");
+ print_info ("%s -l \"#2\"\n", argv [0]);
+ print_info ("\t\t list all available modes for the second device.\n");
+ #ifndef _WIN32
+ print_info ("%s A00361800903049A\n", argv [0]);
+ print_info ("\t\t uses the device with the serial number \'A00361800903049A\'.\n");
+ print_info ("%s 1@16\n", argv [0]);
+ print_info ("\t\t uses the device on address 16 at USB bus 1.\n");
+ #endif
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+int
main (int argc, char** argv)
{
print_highlight ("PCL OpenNI Recorder for saving buffered PCD (binary compressed to disk). See %s -h for options.\n", argv[0]);
+ std::string device_id ("");
int buff_size = BUFFER_SIZE;
-
- if (find_switch (argc, argv, "-h") || find_switch (argc, argv, "--help"))
+
+ if (argc >= 2)
{
- print_info ("Options are: \n"
- " -xyz = save only XYZ data, even if the device is RGB capable\n"
- " -shift = use OpenNI shift values rather than 12-bit depth\n"
- " -buf X = use a buffer size of X frames (default: ");
- print_value ("%d", buff_size); print_info (")\n");
- return (0);
- }
+ device_id = argv[1];
+ if (device_id == "--help" || device_id == "-h")
+ {
+ printHelp (buff_size, argc, argv);
+ return 0;
+ }
+ else if (device_id == "-l")
+ {
+ if (argc >= 3)
+ {
+ pcl::OpenNIGrabber grabber (argv[2]);
+ boost::shared_ptr<openni_wrapper::OpenNIDevice> device = grabber.getDevice ();
+ cout << "Supported depth modes for device: " << device->getVendorName () << " , " << device->getProductName () << endl;
+ std::vector<std::pair<int, XnMapOutputMode > > modes = grabber.getAvailableDepthModes ();
+ for (std::vector<std::pair<int, XnMapOutputMode > >::const_iterator it = modes.begin (); it != modes.end (); ++it)
+ {
+ cout << it->first << " = " << it->second.nXRes << " x " << it->second.nYRes << " @ " << it->second.nFPS << endl;
+ }
+
+ if (device->hasImageStream ())
+ {
+ cout << endl << "Supported image modes for device: " << device->getVendorName () << " , " << device->getProductName () << endl;
+ modes = grabber.getAvailableImageModes ();
+ for (std::vector<std::pair<int, XnMapOutputMode > >::const_iterator it = modes.begin (); it != modes.end (); ++it)
+ {
+ cout << it->first << " = " << it->second.nXRes << " x " << it->second.nYRes << " @ " << it->second.nFPS << endl;
+ }
+ }
+ }
+ else
+ {
+ openni_wrapper::OpenNIDriver& driver = openni_wrapper::OpenNIDriver::getInstance ();
+ if (driver.getNumberDevices() > 0)
+ {
+ for (unsigned deviceIdx = 0; deviceIdx < driver.getNumberDevices (); ++deviceIdx)
+ {
+ cout << "Device: " << deviceIdx + 1 << ", vendor: " << driver.getVendorName (deviceIdx) << ", product: " << driver.getProductName (deviceIdx)
+ << ", connected: " << driver.getBus(deviceIdx) << " @ " << driver.getAddress (deviceIdx) << ", serial number: \'" << driver.getSerialNumber (deviceIdx) << "\'" << endl;
+ }
+
+ }
+ else
+ cout << "No devices connected." << endl;
+ cout <<"Virtual Devices available: ONI player" << endl;
+ }
+ return 0;
+ }
+ }
+ else
+ {
+ openni_wrapper::OpenNIDriver& driver = openni_wrapper::OpenNIDriver::getInstance ();
+ if (driver.getNumberDevices () > 0)
+ cout << "Device Id not set, using first device." << endl;
+ }
bool just_xyz = find_switch (argc, argv, "-xyz");
openni_wrapper::OpenNIDevice::DepthMode depth_mode = openni_wrapper::OpenNIDevice::OpenNI_12_bit_depth;
else
print_highlight ("Using default buffer size of %d frames.\n", buff_size);
- print_highlight ("Starting the producer and consumer threads... Press Cltr+C to end\n");
+ print_highlight ("Starting the producer and consumer threads... Press Ctrl+C to end\n");
- OpenNIGrabber grabber ("");
+ OpenNIGrabber grabber (device_id);
if (grabber.providesCallback<OpenNIGrabber::sig_cb_openni_point_cloud_rgba> () &&
!just_xyz)
{
ply_parser.element_definition_callback (boost::bind (&ply_to_obj_converter::element_definition_callback, this, _1, _2));
pcl::io::ply::ply_parser::scalar_property_definition_callbacks_type scalar_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&ply_to_obj_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&ply_to_obj_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
ply_parser.scalar_property_definition_callbacks (scalar_property_definition_callbacks);
pcl::io::ply::ply_parser::list_property_definition_callbacks_type list_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&ply_to_obj_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&ply_to_obj_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
ply_parser.list_property_definition_callbacks (list_property_definition_callbacks);
ostream_ = &ostream;
pcl::io::ply::ply_parser::scalar_property_definition_callbacks_type scalar_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::int8>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::int16>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::int32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::float32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::float64>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::float64>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int8>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int16>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::int32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float32>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float64>(scalar_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::scalar_property_definition_callback<pcl::io::ply::float64>, this, _1, _2);
ply_parser.scalar_property_definition_callbacks(scalar_property_definition_callbacks);
pcl::io::ply::ply_parser::list_property_definition_callbacks_type list_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::float64>, this, _1, _2);
-
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint16, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::float64>, this, _1, _2);
-
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint8>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint16>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::float32>, this, _1, _2);
- pcl::io::ply::at<pcl::io::ply::uint32, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::float64>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::float64>, this, _1, _2);
+
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint16, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint16, pcl::io::ply::float64>, this, _1, _2);
+
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::int32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint8>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint8>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint16>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint16>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::uint32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::uint32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::float32>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint32, pcl::io::ply::float64>(list_property_definition_callbacks) = boost::bind(&ply_to_ply_converter::list_property_definition_callback<pcl::io::ply::uint32, pcl::io::ply::float64>, this, _1, _2);
ply_parser.list_property_definition_callbacks(list_property_definition_callbacks);
ply_parser.element_definition_callback (boost::bind (&ply_to_raw_converter::element_definition_callback, this, _1, _2));
pcl::io::ply::ply_parser::scalar_property_definition_callbacks_type scalar_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&ply_to_raw_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::float32> (scalar_property_definition_callbacks) = boost::bind (&ply_to_raw_converter::scalar_property_definition_callback<pcl::io::ply::float32>, this, _1, _2);
ply_parser.scalar_property_definition_callbacks (scalar_property_definition_callbacks);
pcl::io::ply::ply_parser::list_property_definition_callbacks_type list_property_definition_callbacks;
- pcl::io::ply::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&ply_to_raw_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
+ pcl::io::ply::ply_parser::at<pcl::io::ply::uint8, pcl::io::ply::int32> (list_property_definition_callbacks) = boost::bind (&ply_to_raw_converter::list_property_definition_callback<pcl::io::ply::uint8, pcl::io::ply::int32>, this, _1, _2);
ply_parser.list_property_definition_callbacks (list_property_definition_callbacks);
ostream_ = &ostream;
set(SUBSYS_DEPS common)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS flann)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS flann)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
set(incs
- include/pcl/${SUBSYS_NAME}/kdtree.h
- include/pcl/${SUBSYS_NAME}/io.h
- include/pcl/${SUBSYS_NAME}/flann.h
- include/pcl/${SUBSYS_NAME}/kdtree_flann.h
+ "include/pcl/${SUBSYS_NAME}/kdtree.h"
+ "include/pcl/${SUBSYS_NAME}/io.h"
+ "include/pcl/${SUBSYS_NAME}/flann.h"
+ "include/pcl/${SUBSYS_NAME}/kdtree_flann.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/io.hpp
- include/pcl/${SUBSYS_NAME}/impl/kdtree_flann.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/io.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/kdtree_flann.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common ${FLANN_LIBRARIES})
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common ${FLANN_LIBRARIES})
set(EXT_DEPS flann)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "${EXT_DEPS}" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename Point1T, typename Point2T> void
pcl::getApproximateIndices (
- const typename pcl::PointCloud<Point1T>::Ptr &cloud_in,
- const typename pcl::PointCloud<Point2T>::Ptr &cloud_ref,
+ const typename pcl::PointCloud<Point1T>::ConstPtr &cloud_in,
+ const typename pcl::PointCloud<Point2T>::ConstPtr &cloud_ref,
std::vector<int> &indices)
{
pcl::KdTreeFLANN<Point2T> tree;
indices.resize (cloud_in->points.size ());
for (size_t i = 0; i < cloud_in->points.size (); ++i)
{
- tree.nearestKSearch (*cloud_in, i, 1, nn_idx, nn_dists);
+ tree.nearestKSearchT ((*cloud_in)[i], 1, nn_idx, nn_dists);
indices[i] = nn_idx[0];
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> void
pcl::getApproximateIndices (
- const typename pcl::PointCloud<PointT>::Ptr &cloud_in,
- const typename pcl::PointCloud<PointT>::Ptr &cloud_ref,
+ const typename pcl::PointCloud<PointT>::ConstPtr &cloud_in,
+ const typename pcl::PointCloud<PointT>::ConstPtr &cloud_ref,
std::vector<int> &indices)
{
pcl::KdTreeFLANN<PointT> tree;
template <typename PointT, typename Dist>
pcl::KdTreeFLANN<PointT, Dist>::KdTreeFLANN (bool sorted)
: pcl::KdTree<PointT> (sorted)
- , flann_index_ (), cloud_ (NULL)
+ , flann_index_ (), cloud_ ()
, index_mapping_ (), identity_mapping_ (false)
, dim_ (0), total_nr_points_ (0)
, param_k_ (::flann::SearchParams (-1 , epsilon_))
template <typename PointT, typename Dist>
pcl::KdTreeFLANN<PointT, Dist>::KdTreeFLANN (const KdTreeFLANN<PointT> &k)
: pcl::KdTree<PointT> (false)
- , flann_index_ (), cloud_ (NULL)
+ , flann_index_ (), cloud_ ()
, index_mapping_ (), identity_mapping_ (false)
, dim_ (0), total_nr_points_ (0)
, param_k_ (::flann::SearchParams (-1 , epsilon_))
return;
}
- flann_index_.reset (new FLANNIndex (::flann::Matrix<float> (cloud_,
+ flann_index_.reset (new FLANNIndex (::flann::Matrix<float> (cloud_.get (),
index_mapping_.size (),
dim_),
::flann::KDTreeSingleIndexParams (15))); // max 15 points/leaf
pcl::KdTreeFLANN<PointT, Dist>::cleanup ()
{
// Data array cleanup
- if (cloud_)
- {
- free (cloud_);
- cloud_ = NULL;
- }
index_mapping_.clear ();
if (indices_)
// No point in doing anything if the array is empty
if (cloud.points.empty ())
{
- cloud_ = NULL;
+ cloud_.reset ();
return;
}
int original_no_of_points = static_cast<int> (cloud.points.size ());
- cloud_ = static_cast<float*> (malloc (original_no_of_points * dim_ * sizeof (float)));
- float* cloud_ptr = cloud_;
+ cloud_.reset (new float[original_no_of_points * dim_]);
+ float* cloud_ptr = cloud_.get ();
index_mapping_.reserve (original_no_of_points);
identity_mapping_ = true;
// No point in doing anything if the array is empty
if (cloud.points.empty ())
{
- cloud_ = NULL;
+ cloud_.reset ();
return;
}
int original_no_of_points = static_cast<int> (indices.size ());
- cloud_ = static_cast<float*> (malloc (original_no_of_points * dim_ * sizeof (float)));
- float* cloud_ptr = cloud_;
+ cloud_.reset (new float[original_no_of_points * dim_]);
+ float* cloud_ptr = cloud_.get ();
index_mapping_.reserve (original_no_of_points);
// its a subcloud -> false
// true only identity:
* \param[out] indices the resultant set of nearest neighbor indices of \a cloud_in in \a cloud_ref
* \ingroup kdtree
*/
- template <typename PointT> void
- getApproximateIndices (const typename pcl::PointCloud<PointT>::Ptr &cloud_in,
- const typename pcl::PointCloud<PointT>::Ptr &cloud_ref,
+ template <typename PointT> void
+ getApproximateIndices (const typename pcl::PointCloud<PointT>::ConstPtr &cloud_in,
+ const typename pcl::PointCloud<PointT>::ConstPtr &cloud_ref,
std::vector<int> &indices);
/** \brief Get a set of approximate indices for a given point cloud into a reference point cloud.
* \param[out] indices the resultant set of nearest neighbor indices of \a cloud_in in \a cloud_ref
* \ingroup kdtree
*/
- template <typename Point1T, typename Point2T> void
- getApproximateIndices (const typename pcl::PointCloud<Point1T>::Ptr &cloud_in,
- const typename pcl::PointCloud<Point2T>::Ptr &cloud_ref,
+ template <typename Point1T, typename Point2T> void
+ getApproximateIndices (const typename pcl::PointCloud<Point1T>::ConstPtr &cloud_in,
+ const typename pcl::PointCloud<Point2T>::ConstPtr &cloud_ref,
std::vector<int> &indices);
}
#include <pcl/point_cloud.h>
#include <pcl/point_representation.h>
#include <pcl/common/io.h>
+#include <pcl/common/copy_point.h>
namespace pcl
{
std::vector<int> &k_indices, std::vector<float> &k_sqr_distances) const
{
PointT p;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointTDiff>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (point, p));
+ copyPoint (point, p);
return (nearestKSearch (p, k, k_indices, k_sqr_distances));
}
std::vector<float> &k_sqr_distances, unsigned int max_nn = 0) const
{
PointT p;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointTDiff>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (point, p));
+ copyPoint (point, p);
return (radiusSearch (p, radius, k_indices, k_sqr_distances, max_nn));
}
#include <pcl/kdtree/kdtree.h>
#include <pcl/kdtree/flann.h>
+#include <boost/shared_array.hpp>
+
// Forward declarations
namespace flann
{
KdTreeFLANN (bool sorted = true);
/** \brief Copy constructor
- * \param[in] tree the tree to copy into this
+ * \param[in] k the tree to copy into this
*/
KdTreeFLANN (const KdTreeFLANN<PointT> &k);
/** \brief Copy operator
- * \param[in] tree the tree to copy into this
+ * \param[in] k the tree to copy into this
*/
inline KdTreeFLANN<PointT>&
operator = (const KdTreeFLANN<PointT>& k)
boost::shared_ptr<FLANNIndex> flann_index_;
/** \brief Internal pointer to data. */
- float* cloud_;
+ boost::shared_array<float> cloud_;
/** \brief mapping between internal and external indices. */
std::vector<int> index_mapping_;
\section secKDtreePresentation Overview
The <b>pcl_kdtree</b> library provides the kd-tree data-structure, using
- <a href="http://www.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN">FLANN</a>,
+ <a href="http://www.cs.ubc.ca/research/flann/</a>,
that allows for fast <a href="http://en.wikipedia.org/wiki/Nearest_neighbor_search">nearest neighbor searches</a>.
A <a href="http://en.wikipedia.org/wiki/Kd-tree">Kd-tree</a> (<i>k</i>-dimensional tree) is a space-partitioning data
set(SUBSYS_DEPS common search kdtree octree features filters)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
src/iss_3d.cpp
)
set(incs
- include/pcl/${SUBSYS_NAME}/keypoint.h
- include/pcl/${SUBSYS_NAME}/narf_keypoint.h
- include/pcl/${SUBSYS_NAME}/sift_keypoint.h
- include/pcl/${SUBSYS_NAME}/uniform_sampling.h
- include/pcl/${SUBSYS_NAME}/smoothed_surfaces_keypoint.h
- include/pcl/${SUBSYS_NAME}/agast_2d.h
- include/pcl/${SUBSYS_NAME}/harris_3d.h
- include/pcl/${SUBSYS_NAME}/harris_6d.h
- include/pcl/${SUBSYS_NAME}/susan.h
- include/pcl/${SUBSYS_NAME}/iss_3d.h
+ "include/pcl/${SUBSYS_NAME}/keypoint.h"
+ "include/pcl/${SUBSYS_NAME}/narf_keypoint.h"
+ "include/pcl/${SUBSYS_NAME}/sift_keypoint.h"
+ "include/pcl/${SUBSYS_NAME}/uniform_sampling.h"
+ "include/pcl/${SUBSYS_NAME}/smoothed_surfaces_keypoint.h"
+ "include/pcl/${SUBSYS_NAME}/agast_2d.h"
+ "include/pcl/${SUBSYS_NAME}/harris_3d.h"
+ "include/pcl/${SUBSYS_NAME}/harris_6d.h"
+ "include/pcl/${SUBSYS_NAME}/susan.h"
+ "include/pcl/${SUBSYS_NAME}/iss_3d.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/keypoint.hpp
- include/pcl/${SUBSYS_NAME}/impl/sift_keypoint.hpp
- include/pcl/${SUBSYS_NAME}/impl/uniform_sampling.hpp
- include/pcl/${SUBSYS_NAME}/impl/smoothed_surfaces_keypoint.hpp
- include/pcl/${SUBSYS_NAME}/impl/agast_2d.hpp
- include/pcl/${SUBSYS_NAME}/impl/harris_3d.hpp
- include/pcl/${SUBSYS_NAME}/impl/harris_6d.hpp
- include/pcl/${SUBSYS_NAME}/impl/susan.hpp
- include/pcl/${SUBSYS_NAME}/impl/iss_3d.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/keypoint.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sift_keypoint.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/uniform_sampling.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/smoothed_surfaces_keypoint.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/agast_2d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/harris_3d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/harris_6d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/susan.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/iss_3d.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_features pcl_filters)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_features pcl_filters)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
/** \brief Computes corner score.
* \param[in] im the pixels to compute the score at
- * \param[in] bmax
*/
virtual int
computeCornerScore (const float* im) const = 0;
/** \brief Detects points of interest (i.e., keypoints) in the given image
* \param[in] im the image to detect keypoints in
- * \param[out] corners_all the resultant set of keypoints detected
*/
virtual void
detect (const float* im,
struct CompareScoreIndex
{
/** \brief Comparator
- * \param[i1] the first score index
- * \param[i2] the second score index
+ * \param[in] i1 the first score index
+ * \param[in] i2 the second score index
*/
inline bool
operator() (const ScoreIndex &i1, const ScoreIndex &i2)
using Keypoint<PointInT, PointOutT>::name_;
using Keypoint<PointInT, PointOutT>::input_;
using Keypoint<PointInT, PointOutT>::indices_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
typedef enum {HARRIS = 1, NOBLE, LOWE, TOMASI} ResponseMethod;
/** \brief Constructor
* \param[in] method the method to be used to determine the corner responses
+ * \param window_width
+ * \param window_height
+ * \param min_distance
* \param[in] threshold the threshold to filter out weak corners
*/
HarrisKeypoint2D (ResponseMethod method = HARRIS, int window_width = 3, int window_height = 3, int min_distance = 5, float threshold = 0.0)
detectKeypoints (PointCloudOut &output);
/** \brief gets the corner response for valid input points*/
void
- responseHarris (PointCloudOut &output, float& highest_response) const;
+ responseHarris (PointCloudOut &output) const;
void
- responseNoble (PointCloudOut &output, float& highest_response) const;
+ responseNoble (PointCloudOut &output) const;
void
- responseLowe (PointCloudOut &output, float& highest_response) const;
+ responseLowe (PointCloudOut &output) const;
void
- responseTomasi (PointCloudOut &output, float& highest_response) const;
+ responseTomasi (PointCloudOut &output) const;
// void refineCorners (PointCloudOut &corners) const;
/** \brief calculates the upper triangular part of unnormalized
* covariance matrix over intensities given by the 2D coordinates
using Keypoint<PointInT, PointOutT>::k_;
using Keypoint<PointInT, PointOutT>::search_radius_;
using Keypoint<PointInT, PointOutT>::search_parameter_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
using Keypoint<PointInT, PointOutT>::initCompute;
+ using PCLBase<PointInT>::setInputCloud;
typedef enum {HARRIS = 1, NOBLE, LOWE, TOMASI, CURVATURE} ResponseMethod;
/** \brief Empty destructor */
virtual ~HarrisKeypoint3D () {}
+ /** \brief Provide a pointer to the input dataset
+ * \param[in] cloud the const boost shared pointer to a PointCloud message
+ */
+ virtual void
+ setInputCloud (const PointCloudInConstPtr &cloud);
+
/** \brief Set the method of the response to be calculated.
* \param[in] type
*/
using Keypoint<PointInT, PointOutT>::k_;
using Keypoint<PointInT, PointOutT>::search_radius_;
using Keypoint<PointInT, PointOutT>::search_parameter_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
/**
* @brief Constructor
- * @param method the method to be used to determine the corner responses
* @param radius the radius for normal estimation as well as for non maxima suppression
* @param threshold the threshold to filter out weak corners
*/
int x = static_cast<int> (index % input_->width);
int y = static_cast<int> (index / input_->width);
- unsigned count = 0;
// indices 0 1 2
// coefficients: ixix ixiy iyiy
memset (coefficients, 0, sizeof (float) * 3);
derivatives_cols_(0,0) = (intensity_ ((*input_) (0,1)) - intensity_ ((*input_) (0,0))) * 0.5;
derivatives_rows_(0,0) = (intensity_ ((*input_) (1,0)) - intensity_ ((*input_) (0,0))) * 0.5;
-// #ifdef _OPENMP
-// //#pragma omp parallel for shared (derivatives_cols_, input_) num_threads (threads_)
-// #pragma omp parallel for num_threads (threads_)
-// #endif
for(int i = 1; i < w; ++i)
{
derivatives_cols_(i,0) = (intensity_ ((*input_) (i,1)) - intensity_ ((*input_) (i,0))) * 0.5;
derivatives_rows_(w,0) = (intensity_ ((*input_) (w,0)) - intensity_ ((*input_) (w-1,0))) * 0.5;
derivatives_cols_(w,0) = (intensity_ ((*input_) (w,1)) - intensity_ ((*input_) (w,0))) * 0.5;
-// #ifdef _OPENMP
-// //#pragma omp parallel for shared (derivatives_cols_, derivatives_rows_, input_) num_threads (threads_)
-// #pragma omp parallel for num_threads (threads_)
-// #endif
for(int j = 1; j < h; ++j)
{
// i = 0 --> i-1 out of range ; use 0
derivatives_cols_(0,h) = (intensity_ ((*input_) (0,h)) - intensity_ ((*input_) (0,h-1))) * 0.5;
derivatives_rows_(0,h) = (intensity_ ((*input_) (1,h)) - intensity_ ((*input_) (0,h))) * 0.5;
-// #ifdef _OPENMP
-// //#pragma omp parallel for shared (derivatives_cols_, input_) num_threads (threads_)
-// #pragma omp parallel for num_threads (threads_)
-// #endif
for(int i = 1; i < w; ++i)
{
derivatives_cols_(i,h) = (intensity_ ((*input_) (i,h)) - intensity_ ((*input_) (i,h-1))) * 0.5;
derivatives_rows_(w,h) = (intensity_ ((*input_) (w,h)) - intensity_ ((*input_) (w-1,h))) * 0.5;
derivatives_cols_(w,h) = (intensity_ ((*input_) (w,h)) - intensity_ ((*input_) (w,h-1))) * 0.5;
- float highest_response_;
-
switch (method_)
{
case HARRIS:
- responseHarris(*response_, highest_response_);
+ responseHarris(*response_);
break;
case NOBLE:
- responseNoble(*response_, highest_response_);
+ responseNoble(*response_);
break;
case LOWE:
- responseLowe(*response_, highest_response_);
+ responseLowe(*response_);
break;
case TOMASI:
- responseTomasi(*response_, highest_response_);
+ responseTomasi(*response_);
break;
}
if (!nonmax_)
+ {
output = *response_;
+ for (size_t i = 0; i < response_->size (); ++i)
+ keypoints_indices_->indices.push_back (i);
+ }
else
{
- threshold_*= highest_response_;
-
std::sort (indices_->begin (), indices_->end (),
boost::bind (&HarrisKeypoint2D::greaterIntensityAtIndices, this, _1, _2));
-
+ float threshold = threshold_ * response_->points[indices_->front ()].intensity;
output.clear ();
output.reserve (response_->size());
std::vector<bool> occupency_map (response_->size (), false);
#ifdef _OPENMP
#pragma omp parallel for shared (output, occupency_map) private (width, height) num_threads(threads_)
#endif
- for (int idx = 0; idx < occupency_map_size; ++idx)
+ for (int i = 0; i < occupency_map_size; ++i)
{
- if (occupency_map[idx] || response_->points [indices_->at (idx)].intensity < threshold_ || !isFinite (response_->points[idx]))
+ int idx = indices_->at (i);
+ const PointOutT& point_out = response_->points [idx];
+ if (occupency_map[idx] || point_out.intensity < threshold || !isFinite (point_out))
continue;
#ifdef _OPENMP
#pragma omp critical
#endif
- output.push_back (response_->at (indices_->at (idx)));
+ {
+ output.push_back (point_out);
+ keypoints_indices_->indices.push_back (idx);
+ }
- int u_end = std::min (width, indices_->at (idx) % width + min_distance_);
- int v_end = std::min (height, indices_->at (idx) / width + min_distance_);
- for(int u = std::max (0, indices_->at (idx) % width - min_distance_); u < u_end; ++u)
- for(int v = std::max (0, indices_->at (idx) / width - min_distance_); v < v_end; ++v)
+ int u_end = std::min (width, idx % width + min_distance_);
+ int v_end = std::min (height, idx / width + min_distance_);
+ for(int u = std::max (0, idx % width - min_distance_); u < u_end; ++u)
+ for(int v = std::max (0, idx / width - min_distance_); v < v_end; ++v)
occupency_map[v*input_->width+u] = true;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT, typename IntensityT> void
-pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseHarris (PointCloudOut &output, float& highest_response) const
+pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseHarris (PointCloudOut &output) const
{
PCL_ALIGN (16) float covar [3];
output.clear ();
output.resize (input_->size ());
- highest_response = - std::numeric_limits<float>::max ();
const int output_size (output.size ());
#ifdef _OPENMP
-#pragma omp parallel for shared (output, highest_response) private (covar) num_threads(threads_)
+#pragma omp parallel for shared (output) private (covar) num_threads(threads_)
#endif
for (int index = 0; index < output_size; ++index)
{
{
float det = covar[0] * covar[2] - covar[1] * covar[1];
out_point.intensity = 0.04f + det - 0.04f * trace * trace;
-
-#ifdef _OPENMP
-#pragma omp critical
-#endif
- highest_response = (out_point.intensity > highest_response) ? out_point.intensity : highest_response;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT, typename IntensityT> void
-pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseNoble (PointCloudOut &output, float& highest_response) const
+pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseNoble (PointCloudOut &output) const
{
PCL_ALIGN (16) float covar [3];
output.clear ();
output.resize (input_->size ());
- highest_response = - std::numeric_limits<float>::max ();
const int output_size (output.size ());
#ifdef _OPENMP
-#pragma omp parallel for shared (output, highest_response) private (covar) num_threads(threads_)
+#pragma omp parallel for shared (output) private (covar) num_threads(threads_)
#endif
- for (size_t index = 0; index < output_size; ++index)
+ for (int index = 0; index < output_size; ++index)
{
PointOutT &out_point = output.points [index];
const PointInT &in_point = input_->points [index];
{
float det = covar[0] * covar[2] - covar[1] * covar[1];
out_point.intensity = det / trace;
-
-#ifdef _OPENMP
-#pragma omp critical
-#endif
- highest_response = (out_point.intensity > highest_response) ? out_point.intensity : highest_response;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT, typename IntensityT> void
-pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseLowe (PointCloudOut &output, float& highest_response) const
+pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseLowe (PointCloudOut &output) const
{
PCL_ALIGN (16) float covar [3];
output.clear ();
output.resize (input_->size ());
- highest_response = -std::numeric_limits<float>::max ();
const int output_size (output.size ());
#ifdef _OPENMP
-#pragma omp parallel for shared (output, highest_response) private (covar) num_threads(threads_)
+#pragma omp parallel for shared (output) private (covar) num_threads(threads_)
#endif
- for (size_t index = 0; index < output_size; ++index)
+ for (int index = 0; index < output_size; ++index)
{
PointOutT &out_point = output.points [index];
const PointInT &in_point = input_->points [index];
{
float det = covar[0] * covar[2] - covar[1] * covar[1];
out_point.intensity = det / (trace * trace);
-
-#ifdef _OPENMP
-#pragma omp critical
-#endif
- highest_response = (out_point.intensity > highest_response) ? out_point.intensity : highest_response;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT, typename IntensityT> void
-pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseTomasi (PointCloudOut &output, float& highest_response) const
+pcl::HarrisKeypoint2D<PointInT, PointOutT, IntensityT>::responseTomasi (PointCloudOut &output) const
{
PCL_ALIGN (16) float covar [3];
output.clear ();
output.resize (input_->size ());
- highest_response = -std::numeric_limits<float>::max ();
const int output_size (output.size ());
#ifdef _OPENMP
-#pragma omp parallel for shared (output, highest_response) private (covar) num_threads(threads_)
+#pragma omp parallel for shared (output) private (covar) num_threads(threads_)
#endif
- for (size_t index = 0; index < output_size; ++index)
+ for (int index = 0; index < output_size; ++index)
{
PointOutT &out_point = output.points [index];
const PointInT &in_point = input_->points [index];
computeSecondMomentMatrix (index, covar);
// min egenvalue
out_point.intensity = ((covar[0] + covar[2] - sqrt((covar[0] - covar[2])*(covar[0] - covar[2]) + 4 * covar[1] * covar[1])) /2.0f);
-
-#ifdef _OPENMP
-#pragma omp critical
-#endif
- highest_response = (out_point.intensity > highest_response) ? out_point.intensity : highest_response;
}
}
#include <xmmintrin.h>
#endif
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT, typename NormalT> void
+pcl::HarrisKeypoint3D<PointInT, PointOutT, NormalT>::setInputCloud (const PointCloudInConstPtr &cloud)
+{
+ if (normals_ && input_ && (cloud != input_))
+ normals_.reset ();
+ input_ = cloud;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointInT, typename PointOutT, typename NormalT> void
pcl::HarrisKeypoint3D<PointInT, PointOutT, NormalT>::setMethod (ResponseMethod method)
PCL_ERROR ("[pcl::%s::initCompute] normals given, but the number of normals does not match the number of input points!\n", name_.c_str (), method_);
return (false);
}
+
return (true);
}
output = *response;
// we do not change the denseness in this case
output.is_dense = input_->is_dense;
+ for (size_t i = 0; i < response->size (); ++i)
+ keypoints_indices_->indices.push_back (i);
}
else
{
#ifdef _OPENMP
#pragma omp critical
#endif
+ {
output.points.push_back (response->points[idx]);
+ keypoints_indices_->indices.push_back (idx);
+ }
}
if (refine_)
output = *response;
// we do not change the denseness in this case
output.is_dense = input_->is_dense;
+ for (size_t i = 0; i < response->size (); ++i)
+ keypoints_indices_->indices.push_back (i);
}
else
{
#ifdef _OPENMP
#pragma omp critical
#endif
+ {
output.points.push_back (response->points[idx]);
+ keypoints_indices_->indices.push_back (idx);
+ }
}
if (refine_)
output.width = static_cast<uint32_t> (output.points.size());
output.is_dense = true;
}
-
-
}
template <typename PointInT, typename PointOutT, typename NormalT> void
double cov[9];
memset(cov, 0, sizeof(double) * 9);
- for (size_t n_idx = 0; n_idx < n_neighbors; n_idx++)
+ for (int n_idx = 0; n_idx < n_neighbors; n_idx++)
{
const PointInT& n_point = (*input_).points[nn_indices[n_idx]];
this->searchForNeighbors (static_cast<int> (index), border_radius_, nn_indices, nn_distances);
- for (int j = 0 ; j < nn_indices.size (); j++)
+ for (size_t j = 0 ; j < nn_indices.size (); j++)
{
if (edge_points_[nn_indices[j]])
{
Eigen::Vector3d *omp_mem = new Eigen::Vector3d[threads_];
- for (int i = 0; i < threads_; i++)
+ for (size_t i = 0; i < threads_; i++)
omp_mem[i].setZero (3);
double *prg_local_mem = new double[input_->size () * 3];
double **prg_mem = new double * [input_->size ()];
- for (int i = 0; i < input_->size (); i++)
+ for (size_t i = 0; i < input_->size (); i++)
prg_mem[i] = prg_local_mem + 3 * i;
#ifdef _OPENMP
{
is_max = true;
- for (size_t j = 0 ; j < n_neighbors; j++)
+ for (int j = 0 ; j < n_neighbors; j++)
if (third_eigen_value_[index] < third_eigen_value_[nn_indices[j]])
is_max = false;
if (is_max)
#ifdef _OPENMP
#pragma omp critical
#endif
- output.points.push_back(input_->points[index]);
+ {
+ PointOutT p;
+ p.getVector3fMap () = input_->points[index].getVector3fMap ();
+ output.points.push_back(p);
+ keypoints_indices_->indices.push_back (index);
+ }
}
output.header = input_->header;
}
}
+ keypoints_indices_.reset (new pcl::PointIndices);
+ keypoints_indices_->indices.reserve (input_->size ());
+
return (true);
}
// check if point was minimum/maximum over all the scales
if (passed_min || passed_max)
+ {
output.points.push_back (input_->points[point_i]);
+ keypoints_indices_->indices.push_back (point_i);
+ }
}
}
for (size_t i = 0; i < scales_.size (); ++i) PCL_INFO ("(%d %f), ", scales_[i].second, scales_[i].first);
PCL_INFO ("\n");
- return true;
+ return (true);
}
PCL_ERROR ("[pcl::%s::initCompute] normals given, but the number of normals does not match the number of input points!\n", name_.c_str ());
return (false);
}
+
return (true);
}
response->width = static_cast<uint32_t> (response->size ());
if (!nonmax_)
+ {
output = *response;
+ for (size_t i = 0; i < response->size (); ++i)
+ keypoints_indices_->indices.push_back (i);
+ // we don not change the denseness
+ output.is_dense = input_->is_dense;
+ }
else
{
output.points.clear ();
//#ifdef _OPENMP
//#pragma omp critical
//#endif
+ {
output.points.push_back (response->points[idx]);
+ keypoints_indices_->indices.push_back (idx);
+ }
}
output.height = 1;
- output.width = static_cast<uint32_t> (output.points.size());
+ output.width = static_cast<uint32_t> (output.points.size());
+ output.is_dense = true;
}
- // we don not change the denseness
- output.is_dense = input_->is_dense;
}
#define PCL_INSTANTIATE_SUSAN(T,U,N) template class PCL_EXPORTS pcl::SUSANKeypoint<T,U,N>;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRAJKOVIC_KEYPOINT_2D_IMPL_H_
+#define PCL_TRAJKOVIC_KEYPOINT_2D_IMPL_H_
+
+template <typename PointInT, typename PointOutT, typename IntensityT> bool
+pcl::TrajkovicKeypoint2D<PointInT, PointOutT, IntensityT>::initCompute ()
+{
+ if (!PCLBase<PointInT>::initCompute ())
+ return (false);
+
+ keypoints_indices_.reset (new pcl::PointIndices);
+ keypoints_indices_->indices.reserve (input_->size ());
+
+ if (!input_->isOrganized ())
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] %s doesn't support non organized clouds!\n", name_.c_str ());
+ return (false);
+ }
+
+ if (indices_->size () != input_->size ())
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] %s doesn't support setting indices!\n", name_.c_str ());
+ return (false);
+ }
+
+ if ((window_size_%2) == 0)
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] Window size must be odd!\n", name_.c_str ());
+ return (false);
+ }
+
+ if (window_size_ < 3)
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] Window size must be >= 3x3!\n", name_.c_str ());
+ return (false);
+ }
+
+ half_window_size_ = window_size_ / 2;
+
+ return (true);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT, typename IntensityT> void
+pcl::TrajkovicKeypoint2D<PointInT, PointOutT, IntensityT>::detectKeypoints (PointCloudOut &output)
+{
+ response_.reset (new pcl::PointCloud<float> (input_->width, input_->height));
+ int w = static_cast<int> (input_->width) - half_window_size_;
+ int h = static_cast<int> (input_->height) - half_window_size_;
+
+ if (method_ == pcl::TrajkovicKeypoint2D<PointInT, PointOutT, IntensityT>::FOUR_CORNERS)
+ {
+#ifdef _OPENMP
+#pragma omp parallel for num_threads (threads_)
+#endif
+ for(int j = half_window_size_; j < h; ++j)
+ {
+ for(int i = half_window_size_; i < w; ++i)
+ {
+ float center = intensity_ ((*input_) (i,j));
+ float up = intensity_ ((*input_) (i, j-half_window_size_));
+ float down = intensity_ ((*input_) (i, j+half_window_size_));
+ float left = intensity_ ((*input_) (i-half_window_size_, j));
+ float right = intensity_ ((*input_) (i+half_window_size_, j));
+
+ float up_center = up - center;
+ float r1 = up_center * up_center;
+ float down_center = down - center;
+ r1+= down_center * down_center;
+
+ float right_center = right - center;
+ float r2 = right_center * right_center;
+ float left_center = left - center;
+ r2+= left_center * left_center;
+
+ float d = std::min (r1, r2);
+
+ if (d < first_threshold_)
+ continue;
+
+ float b1 = (right - up) * up_center;
+ b1+= (left - down) * down_center;
+ float b2 = (right - down) * down_center;
+ b2+= (left - up) * up_center;
+ float B = std::min (b1, b2);
+ float A = r2 - r1 - 2*B;
+
+ (*response_) (i,j) = ((B < 0) && ((B + A) > 0)) ? r1 - ((B*B)/A) : d;
+ }
+ }
+ }
+ else
+ {
+#ifdef _OPENMP
+#pragma omp parallel for num_threads (threads_)
+#endif
+ for(int j = half_window_size_; j < h; ++j)
+ {
+ for(int i = half_window_size_; i < w; ++i)
+ {
+ float center = intensity_ ((*input_) (i,j));
+ float up = intensity_ ((*input_) (i, j-half_window_size_));
+ float down = intensity_ ((*input_) (i, j+half_window_size_));
+ float left = intensity_ ((*input_) (i-half_window_size_, j));
+ float right = intensity_ ((*input_) (i+half_window_size_, j));
+ float upleft = intensity_ ((*input_) (i-half_window_size_, j-half_window_size_));
+ float upright = intensity_ ((*input_) (i+half_window_size_, j-half_window_size_));
+ float downleft = intensity_ ((*input_) (i-half_window_size_, j+half_window_size_));
+ float downright = intensity_ ((*input_) (i+half_window_size_, j+half_window_size_));
+ std::vector<float> r (4,0);
+
+ float up_center = up - center;
+ r[0] = up_center * up_center;
+ float down_center = down - center;
+ r[0]+= down_center * down_center;
+
+ float upright_center = upright - center;
+ r[1] = upright_center * upright_center;
+ float downleft_center = downleft - center;
+ r[1]+= downleft_center * downleft_center;
+
+ float right_center = right - center;
+ r[2] = right_center * right_center;
+ float left_center = left - center;
+ r[2]+= left_center * left_center;
+
+ float downright_center = downright - center;
+ r[3] = downright_center * downright_center;
+ float upleft_center = upleft - center;
+ r[3]+= upleft_center * upleft_center;
+
+ float d = *(std::min_element (r.begin (), r.end ()));
+
+ if (d < first_threshold_)
+ continue;
+
+ std::vector<float> B (4,0);
+ std::vector<float> A (4,0);
+ std::vector<float> sumAB (4,0);
+ B[0] = (upright - up) * up_center;
+ B[0]+= (downleft - down) * down_center;
+ B[1] = (right - upright) * upright_center;
+ B[1]+= (left - downleft) * downleft_center;
+ B[2] = (downright - right) * downright_center;
+ B[2]+= (upleft - left) * upleft_center;
+ B[3] = (down - downright) * downright_center;
+ B[3]+= (up - upleft) * upleft_center;
+ A[0] = r[1] - r[0] - B[0] - B[0];
+ A[1] = r[2] - r[1] - B[1] - B[1];
+ A[2] = r[3] - r[2] - B[2] - B[2];
+ A[3] = r[0] - r[3] - B[3] - B[3];
+ sumAB[0] = A[0] + B[0];
+ sumAB[1] = A[1] + B[1];
+ sumAB[2] = A[2] + B[2];
+ sumAB[3] = A[3] + B[3];
+ if ((*std::max_element (B.begin (), B.end ()) < 0) &&
+ (*std::min_element (sumAB.begin (), sumAB.end ()) > 0))
+ {
+ std::vector<float> D (4,0);
+ D[0] = B[0] * B[0] / A[0];
+ D[1] = B[1] * B[1] / A[1];
+ D[2] = B[2] * B[2] / A[2];
+ D[3] = B[3] * B[3] / A[3];
+ (*response_) (i,j) = *(std::min (D.begin (), D.end ()));
+ }
+ else
+ (*response_) (i,j) = d;
+ }
+ }
+ }
+
+ // Non maximas suppression
+ std::vector<int> indices = *indices_;
+ std::sort (indices.begin (), indices.end (),
+ boost::bind (&TrajkovicKeypoint2D::greaterCornernessAtIndices, this, _1, _2));
+
+ output.clear ();
+ output.reserve (input_->size ());
+
+ std::vector<bool> occupency_map (indices.size (), false);
+ const int width (input_->width);
+ const int height (input_->height);
+
+#ifdef _OPENMP
+#pragma omp parallel for shared (output) num_threads (threads_)
+#endif
+ for (int i = 0; i < indices.size (); ++i)
+ {
+ int idx = indices[i];
+ if ((response_->points[idx] < second_threshold_) || occupency_map[idx])
+ continue;
+
+ PointOutT p;
+ p.getVector3fMap () = input_->points[idx].getVector3fMap ();
+ p.intensity = response_->points [idx];
+
+#ifdef _OPENMP
+#pragma omp critical
+#endif
+ {
+ output.push_back (p);
+ keypoints_indices_->indices.push_back (idx);
+ }
+
+ const int x = idx % width;
+ const int y = idx / width;
+ const int u_end = std::min (width, x + half_window_size_);
+ const int v_end = std::min (height, y + half_window_size_);
+ for(int v = std::max (0, y - half_window_size_); v < v_end; ++v)
+ for(int u = std::max (0, x - half_window_size_); u < u_end; ++u)
+ occupency_map[v*width + u] = true;
+ }
+
+ output.height = 1;
+ output.width = static_cast<uint32_t> (output.size());
+ // we don not change the denseness
+ output.is_dense = input_->is_dense;
+}
+
+#define PCL_INSTANTIATE_TrajkovicKeypoint2D(T,U,I) template class PCL_EXPORTS pcl::TrajkovicKeypoint2D<T,U,I>;
+#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRAJKOVIC_KEYPOINT_3D_IMPL_H_
+#define PCL_TRAJKOVIC_KEYPOINT_3D_IMPL_H_
+
+#include <pcl/features/integral_image_normal.h>
+
+template <typename PointInT, typename PointOutT, typename NormalT> bool
+pcl::TrajkovicKeypoint3D<PointInT, PointOutT, NormalT>::initCompute ()
+{
+ if (!PCLBase<PointInT>::initCompute ())
+ return (false);
+
+ keypoints_indices_.reset (new pcl::PointIndices);
+ keypoints_indices_->indices.reserve (input_->size ());
+
+ if (indices_->size () != input_->size ())
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] %s doesn't support setting indices!\n", name_.c_str ());
+ return (false);
+ }
+
+ if ((window_size_%2) == 0)
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] Window size must be odd!\n", name_.c_str ());
+ return (false);
+ }
+
+ if (window_size_ < 3)
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] Window size must be >= 3x3!\n", name_.c_str ());
+ return (false);
+ }
+
+ half_window_size_ = window_size_ / 2;
+
+ if (!normals_)
+ {
+ NormalsPtr normals (new Normals ());
+ pcl::IntegralImageNormalEstimation<PointInT, NormalT> normal_estimation;
+ normal_estimation.setNormalEstimationMethod (pcl::IntegralImageNormalEstimation<PointInT, NormalT>::SIMPLE_3D_GRADIENT);
+ normal_estimation.setInputCloud (input_);
+ normal_estimation.setNormalSmoothingSize (5.0);
+ normal_estimation.compute (*normals);
+ normals_ = normals;
+ }
+
+ if (normals_->size () != input_->size ())
+ {
+ PCL_ERROR ("[pcl::%s::initCompute] normals given, but the number of normals does not match the number of input points!\n", name_.c_str ());
+ return (false);
+ }
+
+ return (true);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename PointOutT, typename NormalT> void
+pcl::TrajkovicKeypoint3D<PointInT, PointOutT, NormalT>::detectKeypoints (PointCloudOut &output)
+{
+ response_.reset (new pcl::PointCloud<float> (input_->width, input_->height));
+ const Normals &normals = *normals_;
+ const PointCloudIn &input = *input_;
+ pcl::PointCloud<float>& response = *response_;
+ const int w = static_cast<int> (input_->width) - half_window_size_;
+ const int h = static_cast<int> (input_->height) - half_window_size_;
+
+ if (method_ == FOUR_CORNERS)
+ {
+#ifdef _OPENMP
+#pragma omp parallel for num_threads (threads_)
+#endif
+ for(int j = half_window_size_; j < h; ++j)
+ {
+ for(int i = half_window_size_; i < w; ++i)
+ {
+ if (!isFinite (input (i,j))) continue;
+ const NormalT ¢er = normals (i,j);
+ if (!isFinite (center)) continue;
+
+ int count = 0;
+ const NormalT &up = getNormalOrNull (i, j-half_window_size_, count);
+ const NormalT &down = getNormalOrNull (i, j+half_window_size_, count);
+ const NormalT &left = getNormalOrNull (i-half_window_size_, j, count);
+ const NormalT &right = getNormalOrNull (i+half_window_size_, j, count);
+ // Get rid of isolated points
+ if (!count) continue;
+
+ float sn1 = squaredNormalsDiff (up, center);
+ float sn2 = squaredNormalsDiff (down, center);
+ float r1 = sn1 + sn2;
+ float r2 = squaredNormalsDiff (right, center) + squaredNormalsDiff (left, center);
+
+ float d = std::min (r1, r2);
+ if (d < first_threshold_) continue;
+
+ sn1 = sqrt (sn1);
+ sn2 = sqrt (sn2);
+ float b1 = normalsDiff (right, up) * sn1;
+ b1+= normalsDiff (left, down) * sn2;
+ float b2 = normalsDiff (right, down) * sn2;
+ b2+= normalsDiff (left, up) * sn1;
+ float B = std::min (b1, b2);
+ float A = r2 - r1 - 2*B;
+
+ response (i,j) = ((B < 0) && ((B + A) > 0)) ? r1 - ((B*B)/A) : d;
+ }
+ }
+ }
+ else
+ {
+#ifdef _OPENMP
+#pragma omp parallel for num_threads (threads_)
+#endif
+ for(int j = half_window_size_; j < h; ++j)
+ {
+ for(int i = half_window_size_; i < w; ++i)
+ {
+ if (!isFinite (input (i,j))) continue;
+ const NormalT ¢er = normals (i,j);
+ if (!isFinite (center)) continue;
+
+ int count = 0;
+ const NormalT &up = getNormalOrNull (i, j-half_window_size_, count);
+ const NormalT &down = getNormalOrNull (i, j+half_window_size_, count);
+ const NormalT &left = getNormalOrNull (i-half_window_size_, j, count);
+ const NormalT &right = getNormalOrNull (i+half_window_size_, j, count);
+ const NormalT &upleft = getNormalOrNull (i-half_window_size_, j-half_window_size_, count);
+ const NormalT &upright = getNormalOrNull (i+half_window_size_, j-half_window_size_, count);
+ const NormalT &downleft = getNormalOrNull (i-half_window_size_, j+half_window_size_, count);
+ const NormalT &downright = getNormalOrNull (i+half_window_size_, j+half_window_size_, count);
+ // Get rid of isolated points
+ if (!count) continue;
+
+ std::vector<float> r (4,0);
+
+ r[0] = squaredNormalsDiff (up, center);
+ r[0]+= squaredNormalsDiff (down, center);
+
+ r[1] = squaredNormalsDiff (upright, center);
+ r[1]+= squaredNormalsDiff (downleft, center);
+
+ r[2] = squaredNormalsDiff (right, center);
+ r[2]+= squaredNormalsDiff (left, center);
+
+ r[3] = squaredNormalsDiff (downright, center);
+ r[3]+= squaredNormalsDiff (upleft, center);
+
+ float d = *(std::min_element (r.begin (), r.end ()));
+
+ if (d < first_threshold_) continue;
+
+ std::vector<float> B (4,0);
+ std::vector<float> A (4,0);
+ std::vector<float> sumAB (4,0);
+ B[0] = normalsDiff (upright, up) * normalsDiff (up, center);
+ B[0]+= normalsDiff (downleft, down) * normalsDiff (down, center);
+ B[1] = normalsDiff (right, upright) * normalsDiff (upright, center);
+ B[1]+= normalsDiff (left, downleft) * normalsDiff (downleft, center);
+ B[2] = normalsDiff (downright, right) * normalsDiff (downright, center);
+ B[2]+= normalsDiff (upleft, left) * normalsDiff (upleft, center);
+ B[3] = normalsDiff (down, downright) * normalsDiff (downright, center);
+ B[3]+= normalsDiff (up, upleft) * normalsDiff (upleft, center);
+ A[0] = r[1] - r[0] - B[0] - B[0];
+ A[1] = r[2] - r[1] - B[1] - B[1];
+ A[2] = r[3] - r[2] - B[2] - B[2];
+ A[3] = r[0] - r[3] - B[3] - B[3];
+ sumAB[0] = A[0] + B[0];
+ sumAB[1] = A[1] + B[1];
+ sumAB[2] = A[2] + B[2];
+ sumAB[3] = A[3] + B[3];
+ if ((*std::max_element (B.begin (), B.end ()) < 0) &&
+ (*std::min_element (sumAB.begin (), sumAB.end ()) > 0))
+ {
+ std::vector<float> D (4,0);
+ D[0] = B[0] * B[0] / A[0];
+ D[1] = B[1] * B[1] / A[1];
+ D[2] = B[2] * B[2] / A[2];
+ D[3] = B[3] * B[3] / A[3];
+ response (i,j) = *(std::min (D.begin (), D.end ()));
+ }
+ else
+ response (i,j) = d;
+ }
+ }
+ }
+ // Non maximas suppression
+ std::vector<int> indices = *indices_;
+ std::sort (indices.begin (), indices.end (),
+ boost::bind (&TrajkovicKeypoint3D::greaterCornernessAtIndices, this, _1, _2));
+
+ output.clear ();
+ output.reserve (input_->size ());
+
+ std::vector<bool> occupency_map (indices.size (), false);
+ const int width (input_->width);
+ const int height (input_->height);
+
+#ifdef _OPENMP
+#pragma omp parallel for shared (output) num_threads (threads_)
+#endif
+ for (int i = 0; i < indices.size (); ++i)
+ {
+ int idx = indices[i];
+ if ((response_->points[idx] < second_threshold_) || occupency_map[idx])
+ continue;
+
+ PointOutT p;
+ p.getVector3fMap () = input_->points[idx].getVector3fMap ();
+ p.intensity = response_->points [idx];
+
+#ifdef _OPENMP
+#pragma omp critical
+#endif
+ {
+ output.push_back (p);
+ keypoints_indices_->indices.push_back (idx);
+ }
+
+ const int x = idx % width;
+ const int y = idx / width;
+ const int u_end = std::min (width, x + half_window_size_);
+ const int v_end = std::min (height, y + half_window_size_);
+ for(int v = std::max (0, y - half_window_size_); v < v_end; ++v)
+ for(int u = std::max (0, x - half_window_size_); u < u_end; ++u)
+ occupency_map[v*width + u] = true;
+ }
+
+ output.height = 1;
+ output.width = static_cast<uint32_t> (output.size());
+ // we don not change the denseness
+ output.is_dense = true;
+}
+
+#define PCL_INSTANTIATE_TrajkovicKeypoint3D(T,U,N) template class PCL_EXPORTS pcl::TrajkovicKeypoint3D<T,U,N>;
+#endif
using Keypoint<PointInT, PointOutT>::tree_;
using Keypoint<PointInT, PointOutT>::search_radius_;
using Keypoint<PointInT, PointOutT>::search_parameter_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
/** \brief Constructor.
* \param[in] salient_radius the radius of the spherical neighborhood used to compute the scatter matrix.
/** \brief Set the radius used for the estimation of the surface normals of the input cloud. If the radius is
* too large, the temporal performances of the detector may degrade significantly.
- * \param[in] normals_radius the radius used to estimate surface normals
+ * \param[in] normal_radius the radius used to estimate surface normals
*/
void
setNormalRadius (double normal_radius);
/** \brief Compute the boundary points for the given input cloud.
* \param[in] input the input cloud
* \param[in] border_radius the radius used to compute the boundary points
- * \param[in] the decision boundary that marks the points as boundary
+ * \param[in] angle_threshold the decision boundary that marks the points as boundary
* \return the vector of boolean values in which the information about the boundary points is stored
*/
bool*
getBoundaryPoints (PointCloudIn &input, double border_radius, float angle_threshold);
/** \brief Compute the scatter matrix for a point index.
- * \param[in] index the index of the point
+ * \param[in] current_index the index of the point
* \param[out] cov_m the point scatter matrix
*/
void
inline double
getRadiusSearch () { return (search_radius_); }
+ /** \brief \return the keypoints indices in the input cloud.
+ * \note not all the daughter classes populate the keypoints indices so check emptiness before use.
+ */
+ pcl::PointIndicesConstPtr
+ getKeypointsIndices () { return (keypoints_indices_); }
+
/** \brief Base method for key point detection for all points given in <setInputCloud (), setIndices ()> using
* the surface in setSearchSurface () and the spatial locator in setSearchMethod ()
* \param output the resultant point cloud model dataset containing the estimated features
/** \brief The number of K nearest neighbors to use for each point. */
int k_;
+ /** \brief Indices of the keypoints in the input cloud. */
+ pcl::PointIndicesPtr keypoints_indices_;
+
/** \brief Get a string representation of the name of this class. */
inline const std::string&
getClassName () const { return (name_); }
using PCLBase<PointT>::input_;
using Keypoint<PointT, PointT>::name_;
using Keypoint<PointT, PointT>::tree_;
+ using Keypoint<PointT, PointT>::keypoints_indices_;
using Keypoint<PointT, PointT>::initCompute;
typedef pcl::PointCloud<PointT> PointCloudT;
using Keypoint<PointInT, PointOutT>::k_;
using Keypoint<PointInT, PointOutT>::search_radius_;
using Keypoint<PointInT, PointOutT>::search_parameter_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
using Keypoint<PointInT, PointOutT>::initCompute;
/** \brief Constructor
detectKeypoints (PointCloudOut &output);
/** \brief return true if a point lies within the line between the nucleus and the centroid
* \param[in] nucleus coordinate of the nucleus
- * \param[in] centroid of the USAN
- * \parma[in] nucleus to centroid vector (used to speed up since it is constant for a given
+ * \param[in] centroid of the SUSAN
+ * \param[in] nc to centroid vector (used to speed up since it is constant for a given
* neighborhood)
* \param[in] point the query point to test against
* \return true if the point lies within [nucleus centroid]
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRAJKOVIC_KEYPOINT_2D_H_
+#define PCL_TRAJKOVIC_KEYPOINT_2D_H_
+
+#include <pcl/keypoints/keypoint.h>
+#include <pcl/common/intensity.h>
+
+namespace pcl
+{
+ /** \brief TrajkovicKeypoint2D implements Trajkovic and Hedley corner detector on
+ * organized pooint cloud using intensity information.
+ * It uses first order statistics to find variation of intensities in horizontal
+ * or vertical directions.
+ *
+ * \author Nizar Sallem
+ * \ingroup keypoints
+ */
+ template <typename PointInT, typename PointOutT, typename IntensityT = pcl::common::IntensityFieldAccessor<PointInT> >
+ class TrajkovicKeypoint2D : public Keypoint<PointInT, PointOutT>
+ {
+ public:
+ typedef boost::shared_ptr<TrajkovicKeypoint2D<PointInT, PointOutT, IntensityT> > Ptr;
+ typedef boost::shared_ptr<const TrajkovicKeypoint2D<PointInT, PointOutT, IntensityT> > ConstPtr;
+ typedef typename Keypoint<PointInT, PointOutT>::PointCloudIn PointCloudIn;
+ typedef typename Keypoint<PointInT, PointOutT>::PointCloudOut PointCloudOut;
+ typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
+
+ using Keypoint<PointInT, PointOutT>::name_;
+ using Keypoint<PointInT, PointOutT>::input_;
+ using Keypoint<PointInT, PointOutT>::indices_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
+
+ typedef enum { FOUR_CORNERS, EIGHT_CORNERS } ComputationMethod;
+
+ /** \brief Constructor
+ * \param[in] method the method to be used to determine the corner responses
+ * \param[in] window_size
+ * \param[in] first_threshold the threshold used in the simple cornerness test.
+ * \param[in] second_threshold the threshold used to reject weak corners.
+ */
+ TrajkovicKeypoint2D (ComputationMethod method = FOUR_CORNERS,
+ int window_size = 3,
+ float first_threshold = 0.1,
+ float second_threshold = 100.0)
+ : method_ (method)
+ , window_size_ (window_size)
+ , first_threshold_ (first_threshold)
+ , second_threshold_ (second_threshold)
+ , threads_ (1)
+ {
+ name_ = "TrajkovicKeypoint2D";
+ }
+
+ /** \brief set the method of the response to be calculated.
+ * \param[in] method either 4 corners or 8 corners
+ */
+ inline void
+ setMethod (ComputationMethod method) { method_ = method; }
+
+ /// \brief \return the computation method
+ inline ComputationMethod
+ getMethod () const { return (method_); }
+
+ /// \brief Set window size
+ inline void
+ setWindowSize (int window_size) { window_size_= window_size; }
+
+ /// \brief \return window size i.e. window width or height
+ inline int
+ getWindowSize () const { return (window_size_); }
+
+ /** \brief set the first_threshold to reject corners in the simple cornerness
+ * computation stage.
+ * \param[in] threshold
+ */
+ inline void
+ setFirstThreshold (float threshold) { first_threshold_= threshold; }
+
+ /// \brief \return first threshold
+ inline float
+ getFirstThreshold () const { return (first_threshold_); }
+
+ /** \brief set the second threshold to reject corners in the final cornerness
+ * computation stage.
+ * \param[in] threshold
+ */
+ inline void
+ setSecondThreshold (float threshold) { second_threshold_= threshold; }
+
+ /// \brief \return second threshold
+ inline float
+ getSecondThreshold () const { return (second_threshold_); }
+
+ /** \brief Initialize the scheduler and set the number of threads to use.
+ * \param nr_threads the number of hardware threads to use, 0 for automatic.
+ */
+ inline void
+ setNumberOfThreads (unsigned int nr_threads = 0) { threads_ = nr_threads; }
+
+ /// \brief \return the number of threads
+ inline unsigned int
+ getNumberOfThreads () const { return (threads_); }
+
+ protected:
+ bool
+ initCompute ();
+
+ void
+ detectKeypoints (PointCloudOut &output);
+
+ private:
+ /// comparator for responses intensity
+ inline bool
+ greaterCornernessAtIndices (int a, int b) const
+ {
+ return (response_->points [a] > response_->points [b]);
+ }
+
+ /// computation method
+ ComputationMethod method_;
+ /// Window size
+ int window_size_;
+ /// half window size
+ int half_window_size_;
+ /// intensity field accessor
+ IntensityT intensity_;
+ /// first threshold for quick rejection
+ float first_threshold_;
+ /// second threshold for corner evaluation
+ float second_threshold_;
+ /// number of threads to be used
+ unsigned int threads_;
+ /// point cloud response
+ pcl::PointCloud<float>::Ptr response_;
+ };
+}
+
+#include <pcl/keypoints/impl/trajkovic_2d.hpp>
+
+#endif // #ifndef PCL_TRAJKOVIC_KEYPOINT_2D_H_
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRAJKOVIC_KEYPOINT_3D_H_
+#define PCL_TRAJKOVIC_KEYPOINT_3D_H_
+
+#include <pcl/keypoints/keypoint.h>
+#include <pcl/common/intensity.h>
+
+namespace pcl
+{
+ /** \brief TrajkovicKeypoint3D implements Trajkovic and Hedley corner detector on
+ * point cloud using geometric information.
+ * It uses first order statistics to find variation of normals.
+ * This work is part of Nizar Sallem PhD thesis.
+ *
+ * \author Nizar Sallem
+ * \ingroup keypoints
+ */
+ template <typename PointInT, typename PointOutT, typename NormalT = pcl::Normal>
+ class TrajkovicKeypoint3D : public Keypoint<PointInT, PointOutT>
+ {
+ public:
+ typedef boost::shared_ptr<TrajkovicKeypoint3D<PointInT, PointOutT, NormalT> > Ptr;
+ typedef boost::shared_ptr<const TrajkovicKeypoint3D<PointInT, PointOutT, NormalT> > ConstPtr;
+ typedef typename Keypoint<PointInT, PointOutT>::PointCloudIn PointCloudIn;
+ typedef typename Keypoint<PointInT, PointOutT>::PointCloudOut PointCloudOut;
+ typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
+ typedef typename pcl::PointCloud<NormalT> Normals;
+ typedef typename Normals::Ptr NormalsPtr;
+ typedef typename Normals::ConstPtr NormalsConstPtr;
+
+ using Keypoint<PointInT, PointOutT>::name_;
+ using Keypoint<PointInT, PointOutT>::input_;
+ using Keypoint<PointInT, PointOutT>::indices_;
+ using Keypoint<PointInT, PointOutT>::keypoints_indices_;
+ using Keypoint<PointInT, PointOutT>::initCompute;
+
+ typedef enum { FOUR_CORNERS, EIGHT_CORNERS } ComputationMethod;
+
+ /** \brief Constructor
+ * \param[in] method the method to be used to determine the corner responses
+ * \param[in] window_size
+ * \param[in] first_threshold the threshold used in the simple cornerness test.
+ * \param[in] second_threshold the threshold used to reject weak corners.
+ */
+ TrajkovicKeypoint3D (ComputationMethod method = FOUR_CORNERS,
+ int window_size = 3,
+ float first_threshold = 0.00046,
+ float second_threshold = 0.03589)
+ : method_ (method)
+ , window_size_ (window_size)
+ , first_threshold_ (first_threshold)
+ , second_threshold_ (second_threshold)
+ , threads_ (1)
+ {
+ name_ = "TrajkovicKeypoint3D";
+ }
+
+ /** \brief set the method of the response to be calculated.
+ * \param[in] method either 4 corners or 8 corners
+ */
+ inline void
+ setMethod (ComputationMethod method) { method_ = method; }
+
+ /// \brief \return the computation method
+ inline ComputationMethod
+ getMethod () const { return (method_); }
+
+ /// \brief Set window size
+ inline void
+ setWindowSize (int window_size) { window_size_= window_size; }
+
+ /// \brief \return window size i.e. window width or height
+ inline int
+ getWindowSize () const { return (window_size_); }
+
+ /** \brief set the first_threshold to reject corners in the simple cornerness
+ * computation stage.
+ * \param[in] threshold
+ */
+ inline void
+ setFirstThreshold (float threshold) { first_threshold_= threshold; }
+
+ /// \brief \return first threshold
+ inline float
+ getFirstThreshold () const { return (first_threshold_); }
+
+ /** \brief set the second threshold to reject corners in the final cornerness
+ * computation stage.
+ * \param[in] threshold
+ */
+ inline void
+ setSecondThreshold (float threshold) { second_threshold_= threshold; }
+
+ /// \brief \return second threshold
+ inline float
+ getSecondThreshold () const { return (second_threshold_); }
+
+ /** \brief Set normals if precalculated normals are available.
+ * \param normals
+ */
+ inline void
+ setNormals (const NormalsConstPtr &normals) { normals_ = normals; }
+
+ /// \brief \return points normals as calculated or given
+ inline void
+ getNormals (const NormalsConstPtr &normals) const { return (normals_); }
+
+ /** \brief Initialize the scheduler and set the number of threads to use.
+ * \param nr_threads the number of hardware threads to use, 0 for automatic.
+ */
+ inline void
+ setNumberOfThreads (unsigned int nr_threads = 0) { threads_ = nr_threads; }
+
+ /// \brief \return the number of threads
+ inline unsigned int
+ getNumberOfThreads () const { return (threads_); }
+
+ protected:
+ bool
+ initCompute ();
+
+ void
+ detectKeypoints (PointCloudOut &output);
+
+ private:
+ /** Return a const reference to the normal at (i,j) if it is finite else return
+ * a reference to a null normal.
+ * If the returned normal is valid \a counter is incremented.
+ */
+ inline const NormalT&
+ getNormalOrNull (int i, int j, int& counter) const
+ {
+ static const NormalT null;
+ if (!isFinite ((*normals_) (i,j))) return (null);
+ ++counter;
+ return ((*normals_) (i,j));
+ }
+ /// \return difference of two normals vectors
+ inline float
+ normalsDiff (const NormalT& a, const NormalT& b) const
+ {
+ double nx = a.normal_x; double ny = a.normal_y; double nz = a.normal_z;
+ double mx = b.normal_x; double my = b.normal_y; double mz = b.normal_z;
+ return (static_cast<float> (1.0 - (nx*mx + ny*my + nz*mz)));
+ }
+ /// \return squared difference of two normals vectors
+ inline float
+ squaredNormalsDiff (const NormalT& a, const NormalT& b) const
+ {
+ float diff = normalsDiff (a,b);
+ return (diff * diff);
+ }
+ /** Comparator for responses intensity
+ * \return true if \a response_ at index \aa is greater than response at index \ab
+ */
+ inline bool
+ greaterCornernessAtIndices (int a, int b) const
+ {
+ return (response_->points [a] > response_->points [b]);
+ }
+ /// computation method
+ ComputationMethod method_;
+ /// window size
+ int window_size_;
+ /// half window size
+ int half_window_size_;
+ /// first threshold for quick rejection
+ float first_threshold_;
+ /// second threshold for corner evaluation
+ float second_threshold_;
+ /// number of threads to be used
+ unsigned int threads_;
+ /// point cloud normals
+ NormalsConstPtr normals_;
+ /// point cloud response
+ pcl::PointCloud<float>::Ptr response_;
+ };
+}
+
+#include <pcl/keypoints/impl/trajkovic_3d.hpp>
+
+#endif // #ifndef PCL_TRAJKOVIC_KEYPOINT_3D_H_
The <b>pcl_keypoints</b> library contains implementations of two point cloud keypoint detection algorithms.
Keypoints (also referred to as <a href="http://en.wikipedia.org/wiki/Interest_point_detection">interest points</a>)
are points in an image or point cloud that are stable, distinctive, and can be identified using a well-defined
- detection criteron. Typically, the number of interest points in a point cloud will be much smaller than the total
+ detection criterion. Typically, the number of interest points in a point cloud will be much smaller than the total
number of points in the cloud, and when used in combination with local feature descriptors at each keypoint, the
keypoints and descriptors can be used to form a compact—yet descriptive—representation of the original
data.
- \ref search "search"
- \ref kdtree "kdtree"
- \ref octree "octree"
- - \ref range_image "range_image"
+ - \ref pcl::RangeImage "range_image"
- \ref features "features"
- \ref filters "filters"
// Need to copy the points
pcl::PointCloud<pcl::PointUV> best_input;
best_input.resize (nr_max_keypoints_);
- for (int i = 0; i < scores.size (); ++i)
+ for (size_t i = 0; i < scores.size (); ++i)
best_input[i] = input[scores[i].idx];
applyNonMaxSuppression (best_input, scores, output);
}
// Need to copy the points
pcl::PointCloud<pcl::PointUV> best_input;
best_input.resize (nr_max_keypoints_);
- for (int i = 0; i < scores.size (); ++i)
+ for (size_t i = 0; i < scores.size (); ++i)
best_input[i] = input[scores[i].idx];
applyNonMaxSuppression (best_input, scores, output);
}
else
positive_score = surface_change_score * (1.0f-distance_factor);
}
-
- void
- translateDirection180To360 (Eigen::Vector2f& direction_vector)
- {
- // The following code does the equivalent to this:
- // Get the angle of the 2D direction (with positive x) alpha, and return the direction of 2*alpha
- // We do this to create a normal angular wrap-around at -180,180 instead of the one at -90,90,
- // enabling us to calculate the average angle as the direction of the sum of all unit vectors.
- // We use sin (2a)=2*sin (a)*cos (a) and cos (2a)=2cos^2 (a)-1 so that we needn't actually compute the angles,
- // which would be expensive
- float cos_a = direction_vector[0],
- cos_2a = 2*cos_a*cos_a - 1.0f,
- sin_a = direction_vector[1],
- sin_2a = 2.0f*sin_a*cos_a;
- direction_vector[0] = cos_2a;
- direction_vector[1] = sin_2a;
- }
-
- void
- translateDirection360To180 (Eigen::Vector2f& direction_vector)
- {
- // Inverse of the above
- float cos_2a = direction_vector[0],
- cos_a = sqrtf (0.5f* (cos_2a+1.0f)),
- sin_2a = direction_vector[1],
- sin_a = sin_2a / (2.0f*cos_a);
- direction_vector[0] = cos_a;
- direction_vector[1] = sin_a;
- }
-
- inline Eigen::Vector2f
- nkdGetDirectionVector (const Eigen::Vector3f& direction, const Eigen::Affine3f& rotation)
- {
- Eigen::Vector3f rotated_direction = rotation*direction;
- Eigen::Vector2f direction_vector (rotated_direction[0], rotated_direction[1]);
- direction_vector.normalize ();
- if (direction_vector[0]<0.0f)
- direction_vector *= -1.0f;
-
-
-# if USE_BEAM_AVERAGE
- translateDirection180To360 (direction_vector);
-# endif
-
- return direction_vector;
- }
inline float
nkdGetDirectionAngle (const Eigen::Vector3f& direction, const Eigen::Affine3f& rotation)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/keypoints/trajkovic_2d.h>
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+
+// Instantiations of specific point types
+//PCL_INSTANTIATE_PRODUCT(HarrisKeypoint2D, (PCL_XYZ_POINT_TYPES));
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2013-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/keypoints/trajkovic_3d.h>
+#include <pcl/point_types.h>
+#include <pcl/impl/instantiate.hpp>
+
+// Instantiations of specific point types
+//PCL_INSTANTIATE_PRODUCT(HarrisKeypoint2D, (PCL_XYZ_POINT_TYPES));
set(SUBSYS_DEPS common)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs src/octree_inst.cpp
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/octree_base.h
- include/pcl/${SUBSYS_NAME}/octree_container.h
- include/pcl/${SUBSYS_NAME}/octree_impl.h
- include/pcl/${SUBSYS_NAME}/octree_nodes.h
- include/pcl/${SUBSYS_NAME}/octree_key.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_density.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_occupancy.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_singlepoint.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_pointvector.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_changedetector.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_voxelcentroid.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud.h
- include/pcl/${SUBSYS_NAME}/octree_iterator.h
- include/pcl/${SUBSYS_NAME}/octree_search.h
- include/pcl/${SUBSYS_NAME}/octree.h
- include/pcl/${SUBSYS_NAME}/octree2buf_base.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_adjacency.h
- include/pcl/${SUBSYS_NAME}/octree_pointcloud_adjacency_container.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/octree_base.h"
+ "include/pcl/${SUBSYS_NAME}/octree_container.h"
+ "include/pcl/${SUBSYS_NAME}/octree_impl.h"
+ "include/pcl/${SUBSYS_NAME}/octree_nodes.h"
+ "include/pcl/${SUBSYS_NAME}/octree_key.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_density.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_occupancy.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_singlepoint.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_pointvector.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_changedetector.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_voxelcentroid.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud.h"
+ "include/pcl/${SUBSYS_NAME}/octree_iterator.h"
+ "include/pcl/${SUBSYS_NAME}/octree_search.h"
+ "include/pcl/${SUBSYS_NAME}/octree.h"
+ "include/pcl/${SUBSYS_NAME}/octree2buf_base.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_adjacency.h"
+ "include/pcl/${SUBSYS_NAME}/octree_pointcloud_adjacency_container.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/octree_base.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree2buf_base.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_iterator.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_search.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud_voxelcentroid.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud_adjacency.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/octree_base.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree2buf_base.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_iterator.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_search.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud_voxelcentroid.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_pointcloud_adjacency.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME})
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}")
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
#include <pcl/common/common.h>
-using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////
template<typename PointT, typename LeafContainerT, typename BranchContainerT, typename OctreeT>
min_z_ = min_z_arg;
max_z_ = max_z_arg;
- min_x_ = min (min_x_, max_x_);
- min_y_ = min (min_y_, max_y_);
- min_z_ = min (min_z_, max_z_);
+ min_x_ = std::min (min_x_, max_x_);
+ min_y_ = std::min (min_y_, max_y_);
+ min_z_ = std::min (min_z_, max_z_);
- max_x_ = max (min_x_, max_x_);
- max_y_ = max (min_y_, max_y_);
- max_z_ = max (min_z_, max_z_);
+ max_x_ = std::max (min_x_, max_x_);
+ max_y_ = std::max (min_y_, max_y_);
+ max_z_ = std::max (min_z_, max_z_);
// generate bit masks for octree
getKeyBitSize ();
min_z_ = 0.0f;
max_z_ = max_z_arg;
- min_x_ = min (min_x_, max_x_);
- min_y_ = min (min_y_, max_y_);
- min_z_ = min (min_z_, max_z_);
+ min_x_ = std::min (min_x_, max_x_);
+ min_y_ = std::min (min_y_, max_y_);
+ min_z_ = std::min (min_z_, max_z_);
- max_x_ = max (min_x_, max_x_);
- max_y_ = max (min_y_, max_y_);
- max_z_ = max (min_z_, max_z_);
+ max_x_ = std::max (min_x_, max_x_);
+ max_y_ = std::max (min_y_, max_y_);
+ max_z_ = std::max (min_z_, max_z_);
// generate bit masks for octree
getKeyBitSize ();
min_z_ = 0.0f;
max_z_ = cubeLen_arg;
- min_x_ = min (min_x_, max_x_);
- min_y_ = min (min_y_, max_y_);
- min_z_ = min (min_z_, max_z_);
+ min_x_ = std::min (min_x_, max_x_);
+ min_y_ = std::min (min_y_, max_y_);
+ min_z_ = std::min (min_z_, max_z_);
- max_x_ = max (min_x_, max_x_);
- max_y_ = max (min_y_, max_y_);
- max_z_ = max (min_z_, max_z_);
+ max_x_ = std::max (min_x_, max_x_);
+ max_y_ = std::max (min_y_, max_y_);
+ max_z_ = std::max (min_z_, max_z_);
// generate bit masks for octree
getKeyBitSize ();
max_key_z = static_cast<unsigned int> ((max_z_ - min_z_) / resolution_);
// find maximum amount of keys
- max_voxels = max (max (max (max_key_x, max_key_y), max_key_z), static_cast<unsigned int> (2));
+ max_voxels = std::max (std::max (std::max (max_key_x, max_key_y), max_key_z), static_cast<unsigned int> (2));
// tree depth == amount of bits of max_voxels
- this->octree_depth_ = max ((min (static_cast<unsigned int> (OctreeKey::maxDepth), static_cast<unsigned int> (ceil (this->Log2 (max_voxels)-minValue)))),
+ this->octree_depth_ = std::max ((std::min (static_cast<unsigned int> (OctreeKey::maxDepth), static_cast<unsigned int> (ceil (this->Log2 (max_voxels)-minValue)))),
static_cast<unsigned int> (0));
octree_side_len = static_cast<double> (1 << this->octree_depth_) * resolution_-minValue;
#define PCL_INSTANTIATE_OctreePointCloudSingleBufferWithLeafDataT(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeContainerPointIndex, pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeBase<pcl::octree::OctreeContainerPointIndex, pcl::octree::OctreeContainerEmpty > >;
#define PCL_INSTANTIATE_OctreePointCloudDoubleBufferWithLeafDataT(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeContainerPointIndex, pcl::octree::OctreeContainerEmpty, pcl::octree::Octree2BufBase<pcl::octree::OctreeContainerPointIndex, pcl::octree::OctreeContainerEmpty > >;
-#define PCL_INSTANTIATE_OctreePointCloudSingleBufferWithEmptyLeaf(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeLeafEmpty, pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeBase<pcl::octree::OctreeLeafEmpty, pcl::octree::OctreeContainerEmpty > >;
-#define PCL_INSTANTIATE_OctreePointCloudDoubleBufferWithEmptyLeaf(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeLeafEmpty, pcl::octree::OctreeContainerEmpty, pcl::octree::Octree2BufBase<pcl::octree::OctreeLeafEmpty, pcl::octree::OctreeContainerEmpty > >;
+#define PCL_INSTANTIATE_OctreePointCloudSingleBufferWithEmptyLeaf(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeBase<pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeContainerEmpty > >;
+#define PCL_INSTANTIATE_OctreePointCloudDoubleBufferWithEmptyLeaf(T) template class PCL_EXPORTS pcl::octree::OctreePointCloud<T, pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeContainerEmpty, pcl::octree::Octree2BufBase<pcl::octree::OctreeContainerEmpty, pcl::octree::OctreeContainerEmpty > >;
#endif /* OCTREE_POINTCLOUD_HPP_ */
pcl::octree::OctreePointCloudAdjacency<PointT, LeafContainerT, BranchContainerT>::addPointsFromInputCloud ()
{
//double t1,t2;
+ float minX = std::numeric_limits<float>::max (), minY = std::numeric_limits<float>::max (), minZ = std::numeric_limits<float>::max ();
+ float maxX = -std::numeric_limits<float>::max(), maxY = -std::numeric_limits<float>::max(), maxZ = -std::numeric_limits<float>::max();
- //t1 = timer_.getTime ();
- OctreePointCloud<PointT, LeafContainerT, BranchContainerT>::addPointsFromInputCloud ();
-
+ for (size_t i = 0; i < input_->size (); ++i)
+ {
+ PointT temp (input_->points[i]);
+ if (transform_func_) //Search for point with
+ transform_func_ (temp);
+ if (!pcl::isFinite (temp)) //Check to make sure transform didn't make point not finite
+ continue;
+ if (temp.x < minX)
+ minX = temp.x;
+ if (temp.y < minY)
+ minY = temp.y;
+ if (temp.z < minZ)
+ minZ = temp.z;
+ if (temp.x > maxX)
+ maxX = temp.x;
+ if (temp.y > maxY)
+ maxY = temp.y;
+ if (temp.z > maxZ)
+ maxZ = temp.z;
+ }
+ this->defineBoundingBox (minX, minY, minZ, maxX, maxY, maxZ);
- //t2 = timer_.getTime ();
- //std::cout << "Add Points:"<<t2-t1<<" ms Num leaves ="<<this->getLeafCount ()<<"\n";
-
- std::list <std::pair<OctreeKey,LeafContainerT*> > delete_list;
- //double t_temp, t_neigh, t_compute, t_getLeaf;
- //t_neigh = t_compute = t_getLeaf = 0;
+ OctreePointCloud<PointT, LeafContainerT, BranchContainerT>::addPointsFromInputCloud ();
+
LeafContainerT *leaf_container;
typename OctreeAdjacencyT::LeafNodeIterator leaf_itr;
leaf_vector_.reserve (this->getLeafCount ());
for ( leaf_itr = this->leaf_begin () ; leaf_itr != this->leaf_end (); ++leaf_itr)
{
- //t_temp = timer_.getTime ();
OctreeKey leaf_key = leaf_itr.getCurrentOctreeKey ();
leaf_container = &(leaf_itr.getLeafContainer ());
- //t_getLeaf += timer_.getTime () - t_temp;
- //t_temp = timer_.getTime ();
//Run the leaf's compute function
leaf_container->computeData ();
- //t_compute += timer_.getTime () - t_temp;
-
- //t_temp = timer_.getTime ();
- // std::cout << "Computing neighbors\n";
+
computeNeighbors (leaf_key, leaf_container);
- //t_neigh += timer_.getTime () - t_temp;
leaf_vector_.push_back (leaf_container);
-
}
- //Go through and delete voxels scheduled
- for (typename std::list<std::pair<OctreeKey,LeafContainerT*> >::iterator delete_itr = delete_list.begin (); delete_itr != delete_list.end (); ++delete_itr)
- {
- leaf_container = delete_itr->second;
- //Remove pointer to it from all neighbors
- typename std::set<LeafContainerT*>::iterator neighbor_itr = leaf_container->begin ();
- typename std::set<LeafContainerT*>::iterator neighbor_end = leaf_container->end ();
- for ( ; neighbor_itr != neighbor_end; ++neighbor_itr)
- {
- //Don't delete self neighbor
- if (*neighbor_itr != leaf_container)
- (*neighbor_itr)->removeNeighbor (leaf_container);
- }
- this->removeLeaf (delete_itr->first);
- }
-
//Make sure our leaf vector is correctly sized
assert (leaf_vector_.size () == this->getLeafCount ());
-
- // std::cout << "Time spent getting leaves ="<<t_getLeaf<<"\n";
- // std::cout << "Time spent computing data in leaves="<<t_compute<<"\n";
- // std::cout << "Time spent computing neighbors="<<t_neigh<<"\n";
-
}
//////////////////////////////////////////////////////////////////////////////////////////////
PointT temp (point_arg);
transform_func_ (temp);
// calculate integer key for transformed point coordinates
- key_arg.x = static_cast<unsigned int> ((temp.x - this->min_x_) / this->resolution_);
- key_arg.y = static_cast<unsigned int> ((temp.y - this->min_y_) / this->resolution_);
- key_arg.z = static_cast<unsigned int> ((temp.z - this->min_z_) / this->resolution_);
-
+ if (pcl::isFinite (temp)) //Make sure transformed point is finite - if it is not, it gets default key
+ {
+ key_arg.x = static_cast<unsigned int> ((temp.x - this->min_x_) / this->resolution_);
+ key_arg.y = static_cast<unsigned int> ((temp.y - this->min_y_) / this->resolution_);
+ key_arg.z = static_cast<unsigned int> ((temp.z - this->min_z_) / this->resolution_);
+ }
+ else
+ {
+ key_arg = OctreeKey ();
+ }
}
else
{
const PointT& point = this->input_->points[pointIdx_arg];
if (!pcl::isFinite (point))
return;
-
- if (transform_func_)
- {
- PointT temp (point);
- transform_func_ (temp);
- this->adoptBoundingBoxToPoint (temp);
- }
- else
- this->adoptBoundingBoxToPoint (point);
-
+
// generate key
this->genOctreeKeyforPoint (point, key);
// add point to octree at key
container->addPoint (point);
}
-
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template<typename PointT, typename LeafContainerT, typename BranchContainerT> void
pcl::octree::OctreePointCloudAdjacency<PointT, LeafContainerT, BranchContainerT>::computeNeighbors (OctreeKey &key_arg, LeafContainerT* leaf_container)
{
+ //Make sure requested key is valid
+ if (key_arg.x > this->max_key_.x || key_arg.y > this->max_key_.y || key_arg.z > this->max_key_.z)
+ {
+ PCL_ERROR ("OctreePointCloudAdjacency::computeNeighbors Requested neighbors for invalid octree key\n");
+ return;
+ }
OctreeKey neighbor_key;
-
- for (int dx = -1; dx <= 1; ++dx)
+ int dx_min = (key_arg.x > 0) ? -1 : 0;
+ int dy_min = (key_arg.y > 0) ? -1 : 0;
+ int dz_min = (key_arg.z > 0) ? -1 : 0;
+ int dx_max = (key_arg.x == this->max_key_.x) ? 0 : 1;
+ int dy_max = (key_arg.y == this->max_key_.y) ? 0 : 1;
+ int dz_max = (key_arg.z == this->max_key_.z) ? 0 : 1;
+
+ for (int dx = dx_min; dx <= dx_max; ++dx)
{
- for (int dy = -1; dy <= 1; ++dy)
+ for (int dy = dy_min; dy <= dy_max; ++dy)
{
- for (int dz = -1; dz <= 1; ++dz)
+ for (int dz = dz_min; dz <= dz_max; ++dz)
{
- neighbor_key.x = key_arg.x + dx;
- neighbor_key.y = key_arg.y + dy;
- neighbor_key.z = key_arg.z + dz;
+ neighbor_key.x = static_cast<uint32_t> (key_arg.x + dx);
+ neighbor_key.y = static_cast<uint32_t> (key_arg.y + dy);
+ neighbor_key.z = static_cast<uint32_t> (key_arg.z + dz);
LeafContainerT *neighbor = this->findLeaf (neighbor_key);
if (neighbor)
{
#include <pcl/common/common.h>
#include <assert.h>
-using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////
template<typename PointT, typename LeafContainerT, typename BranchContainerT> bool
key.x = key.y = key.z = 0;
// initalize smallest point distance in search with high value
- double smallest_dist = numeric_limits<double>::max ();
+ double smallest_dist = std::numeric_limits<double>::max ();
getKNearestNeighborRecursive (p_q, k, this->root_node_, key, 1, smallest_dist, point_candidates);
}
else
{
- search_heap[child_idx].point_distance = numeric_limits<float>::infinity ();
+ search_heap[child_idx].point_distance = std::numeric_limits<float>::infinity ();
}
}
float squared_dist;
size_t i;
- vector<int> decoded_point_vector;
+ std::vector<int> decoded_point_vector;
const LeafNode* child_leaf = static_cast<const LeafNode*> (child_node);
size_t i;
const LeafNode* child_leaf = static_cast<const LeafNode*> (child_node);
- vector<int> decoded_point_vector;
+ std::vector<int> decoded_point_vector;
// decode leaf node into decoded_point_vector
(*child_leaf)->getPointIndices (decoded_point_vector);
const OctreeNode* child_node;
// set minimum voxel distance to maximum value
- min_voxel_center_distance = numeric_limits<double>::max ();
+ min_voxel_center_distance = std::numeric_limits<double>::max ();
min_child_idx = 0xFF;
double squared_dist;
double smallest_squared_dist;
size_t i;
- vector<int> decoded_point_vector;
+ std::vector<int> decoded_point_vector;
const LeafNode* child_leaf = static_cast<const LeafNode*> (child_node);
- smallest_squared_dist = numeric_limits<double>::max ();
+ smallest_squared_dist = std::numeric_limits<double>::max ();
// decode leaf node into decoded_point_vector
(**child_leaf).getPointIndices (decoded_point_vector);
{
// we reached leaf node level
size_t i;
- vector<int> decoded_point_vector;
+ std::vector<int> decoded_point_vector;
bool bInBox;
const LeafNode* child_leaf = static_cast<const LeafNode*> (child_node);
initIntersectedVoxel (origin, direction, min_x, min_y, min_z, max_x, max_y, max_z, a);
- if (max (max (min_x, min_y), min_z) < min (min (max_x, max_y), max_z))
+ if (std::max (std::max (min_x, min_y), min_z) < std::min (std::min (max_x, max_y), max_z))
return getIntersectedVoxelCentersRecursive (min_x, min_y, min_z, max_x, max_y, max_z, a, this->root_node_, key,
voxel_center_list, max_voxel_count);
initIntersectedVoxel (origin, direction, min_x, min_y, min_z, max_x, max_y, max_z, a);
- if (max (max (min_x, min_y), min_z) < min (min (max_x, max_y), max_z))
+ if (std::max (std::max (min_x, min_y), min_z) < std::min (std::min (max_x, max_y), max_z))
return getIntersectedVoxelIndicesRecursive (min_x, min_y, min_z, max_x, max_y, max_z, a, this->root_node_, key,
k_indices, max_voxel_count);
return (0);
* \param depth_mask_arg: depth mask used for octree key analysis and branch depth indicator
* \param key_arg: reference to an octree key
* \param binary_tree_in_it_arg iterator of binary input data
- * \param leaf_container_vector__it_end_arg end iterator of binary input data
+ * \param binary_tree_in_it_end_arg
* \param leaf_container_vector_it_arg: iterator pointing to leaf containter pointers to be added to a leaf node
* \param leaf_container_vector_it_end_arg: iterator pointing to leaf containter pointers pointing to last object in input container.
* \param branch_reset_arg: Reset pointer array of current branch
* \return number of points/indices stored in leaf node container.
*/
virtual size_t
- getSize ()
+ getSize () const
{
return 0u;
}
OctreeIteratorBase (const OctreeIteratorBase& src, unsigned int max_depth_arg = 0) :
octree_ (src.octree_), current_state_(0), max_octree_depth_(max_depth_arg)
{
- this->reset ();
}
/** \brief Copy operator.
}
/** \brief Equal comparison operator
- * \param[in] OctreeIteratorBase to compare with
+ * \param[in] other OctreeIteratorBase to compare with
*/
bool operator==(const OctreeIteratorBase& other) const
{
}
/** \brief Inequal comparison operator
- * \param[in] OctreeIteratorBase to compare with
+ * \param[in] other OctreeIteratorBase to compare with
*/
bool operator!=(const OctreeIteratorBase& other) const
{
#include <string.h>
+#include <Eigen/Core>
+
#include <pcl/pcl_macros.h>
#include "octree_container.h"
protected:
ContainerT container_;
+
+ public:
+ //Type ContainerT may have fixed-size Eigen objects inside
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef PCL_OCTREE_POINTCLOUD_ADJACENCY_H_
#define PCL_OCTREE_POINTCLOUD_ADJACENCY_H_
+#include <pcl/console/print.h>
#include <pcl/common/geometry.h>
#include <pcl/octree/boost.h>
-#include <pcl/octree/octree_base.h>
-#include <pcl/octree/octree_iterator.h>
-#include <pcl/octree/octree_pointcloud.h>
+#include <pcl/octree/octree_impl.h>
#include <pcl/octree/octree_pointcloud_adjacency_container.h>
#include <set>
#include <list>
-//DEBUG TODO REMOVE
-#include <pcl/common/time.h>
-
-
-
namespace pcl
-{
-
+{
+
namespace octree
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /** \brief @b Octree pointcloud voxel class used for adjacency calculation
- * \note This pointcloud octree class generate an octree from a point cloud (zero-copy).
- * \note The octree pointcloud is initialized with its voxel resolution. Its bounding box is automatically adjusted or can be predefined.
- * \note This class maintains adjacency information for its voxels
- * \note The OctreePointCloudAdjacencyContainer can be used to store data in leaf nodes
- * \note An optional transform function can be provided which changes how the voxel grid is computed - this can be used to, for example, make voxel bins larger as they increase in distance from the origin (camera)
- * \note See SupervoxelClustering for an example of how to provide a transform function
- * \note If used in academic work, please cite:
- *
- * - J. Papon, A. Abramov, M. Schoeler, F. Woergoetter
- * Voxel Cloud Connectivity Segmentation - Supervoxels from PointClouds
- * In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2013
- * \ingroup octree
- * \author Jeremie Papon (jpapon@gmail.com)
- */
+ /** \brief @b Octree pointcloud voxel class which maintains adjacency information for its voxels.
+ *
+ * This pointcloud octree class generates an octree from a point cloud (zero-copy). The octree pointcloud is
+ * initialized with its voxel resolution. Its bounding box is automatically adjusted or can be predefined.
+ *
+ * The OctreePointCloudAdjacencyContainer class can be used to store data in leaf nodes.
+ *
+ * An optional transform function can be provided which changes how the voxel grid is computed - this can be used to,
+ * for example, make voxel bins larger as they increase in distance from the origin (camera).
+ * \note See SupervoxelClustering for an example of how to provide a transform function.
+ *
+ * If used in academic work, please cite:
+ *
+ * - J. Papon, A. Abramov, M. Schoeler, F. Woergoetter
+ * Voxel Cloud Connectivity Segmentation - Supervoxels from PointClouds
+ * In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2013
+ *
+ * \ingroup octree
+ * \author Jeremie Papon (jpapon@gmail.com) */
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- template< typename PointT,
- typename LeafContainerT = OctreePointCloudAdjacencyContainer <PointT>,
- typename BranchContainerT = OctreeContainerEmpty >
- class OctreePointCloudAdjacency : public OctreePointCloud< PointT, LeafContainerT, BranchContainerT>
-
+ template <typename PointT,
+ typename LeafContainerT = OctreePointCloudAdjacencyContainer<PointT>,
+ typename BranchContainerT = OctreeContainerEmpty>
+ class OctreePointCloudAdjacency : public OctreePointCloud<PointT, LeafContainerT, BranchContainerT>
{
-
- public:
- typedef OctreeBase<LeafContainerT, BranchContainerT> OctreeBaseT;
-
- typedef OctreePointCloudAdjacency<PointT, LeafContainerT, BranchContainerT > OctreeAdjacencyT;
- typedef boost::shared_ptr<OctreeAdjacencyT> Ptr;
- typedef boost::shared_ptr<const OctreeAdjacencyT> ConstPtr;
-
- typedef OctreePointCloud<PointT, LeafContainerT, BranchContainerT,OctreeBaseT > OctreePointCloudT;
- typedef typename OctreePointCloudT::LeafNode LeafNode;
- typedef typename OctreePointCloudT::BranchNode BranchNode;
-
- typedef pcl::PointCloud<PointT> CloudT;
-
- //So we can access input
- using OctreePointCloudT::input_;
- using OctreePointCloudT::resolution_;
-
- // iterators are friends
- friend class OctreeIteratorBase<OctreeAdjacencyT> ;
- friend class OctreeDepthFirstIterator<OctreeAdjacencyT> ;
- friend class OctreeBreadthFirstIterator<OctreeAdjacencyT> ;
- friend class OctreeLeafNodeIterator<OctreeAdjacencyT> ;
-
- // Octree default iterators
- typedef OctreeDepthFirstIterator<OctreeAdjacencyT> Iterator;
- typedef const OctreeDepthFirstIterator<OctreeAdjacencyT> ConstIterator;
- Iterator depth_begin(unsigned int maxDepth_arg = 0) {return Iterator(this, maxDepth_arg);};
- const Iterator depth_end() {return Iterator();};
-
- // Octree leaf node iterators
- typedef OctreeLeafNodeIterator<OctreeAdjacencyT> LeafNodeIterator;
- typedef const OctreeLeafNodeIterator< OctreeAdjacencyT> ConstLeafNodeIterator;
- LeafNodeIterator leaf_begin(unsigned int maxDepth_arg = 0) {return LeafNodeIterator(this, maxDepth_arg);};
- const LeafNodeIterator leaf_end() {return LeafNodeIterator();};
-
- typedef boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, PointT, float> VoxelAdjacencyList;
- typedef typename VoxelAdjacencyList::vertex_descriptor VoxelID;
- typedef typename VoxelAdjacencyList::edge_descriptor EdgeID;
-
- //Leaf vector - pointers to all leaves
- typedef std::vector <LeafContainerT*> LeafVectorT;
- //Fast leaf iterators that don't require traversing tree
- typedef typename LeafVectorT::iterator iterator;
- typedef typename LeafVectorT::const_iterator const_iterator;
- inline iterator begin () { return (leaf_vector_.begin ()); }
- inline iterator end () { return (leaf_vector_.end ()); }
- //size of neighbors
- inline size_t size () const { return leaf_vector_.size (); }
-
-
- /** \brief Constructor.
- * \param[in] resolution_arg octree resolution at lowest octree level (voxel size)
- **/
- OctreePointCloudAdjacency (const double resolution_arg);
-
-
- /** \brief Empty class destructor. */
- virtual ~OctreePointCloudAdjacency ()
- {
- }
-
- /** \brief Adds points from cloud to the octree
- * \note This overrides the addPointsFromInputCloud from the OctreePointCloud class
- */
- void
- addPointsFromInputCloud ();
-
- /** \brief Gets the leaf container for a given point
- * \param[in] point_arg Point to search for
- * \returns Pointer to the leaf container - null if no leaf container found
- */
- LeafContainerT *
- getLeafContainerAtPoint (const PointT& point_arg) const;
-
- /** \brief Computes an adjacency graph of voxel relations
- * \note WARNING: This slows down rapidly as cloud size increases due number of edges
- * \param[out] voxel_adjacency_graph Boost Graph Library Adjacency graph of the voxel touching relationships - vertices are pointT, edges represent touching, and edge lengths are the distance between the points
- */
- void
- computeVoxelAdjacencyGraph (VoxelAdjacencyList &voxel_adjacency_graph);
-
- /** \brief Sets a point transform (and inverse) used to transform the space of the input cloud
- * This is useful for changing how adjacency is calculated - such as relaxing
- * the adjacency criterion for points further from the camera
- * \param[in] transform_func A boost:function pointer to the transform to be used. The transform must have one parameter (a point) which it modifies in place
- */
- void
- setTransformFunction (boost::function<void (PointT &p)> transform_func)
- {
- transform_func_ = transform_func;
- }
-
- /** \brief Tests whether input point is occluded from specified camera point by other voxels
- \param[in] point_arg Point to test for
- \param[in] camera_pos Position of camera, defaults to origin
- \returns True if path to camera is blocked by a voxel, false otherwise
- */
- bool
- testForOcclusion (const PointT& point_arg, const PointXYZ &camera_pos = PointXYZ (0,0,0));
-
- protected:
-
- /** \brief Add point at index from input pointcloud dataset to octree
- * \param[in] pointIdx_arg the index representing the point in the dataset given by \a setInputCloud to be added
- * \note This virtual implementation allows the use of a transform function to compute keys
- */
- virtual void
- addPointIdx (const int pointIdx_arg);
-
- /** \brief Fills in the neighbors fields for new voxels
- * \param[in] key_arg Key of the voxel to check neighbors for
- * \param[in] leaf_container Pointer to container of the leaf to check neighbors for
- */
- void
- computeNeighbors (OctreeKey &key_arg, LeafContainerT* leaf_container);
-
- /** \brief Generates octree key for specified point (uses transform if provided)
- * \param[in] point_arg Point to generate key for
- * \param[out] key_arg Resulting octree key
- */
- void
- genOctreeKeyforPoint (const PointT& point_arg,OctreeKey & key_arg) const;
-
- private:
-
- StopWatch timer_;
-
- //Local leaf pointer vector used to make iterating through leaves fast
- LeafVectorT leaf_vector_;
-
- boost::function<void (PointT &p)> transform_func_;
- };
-
- }
-
-}
-
-
-
-
+ public:
+
+ typedef OctreeBase<LeafContainerT, BranchContainerT> OctreeBaseT;
+
+ typedef OctreePointCloudAdjacency<PointT, LeafContainerT, BranchContainerT> OctreeAdjacencyT;
+ typedef boost::shared_ptr<OctreeAdjacencyT> Ptr;
+ typedef boost::shared_ptr<const OctreeAdjacencyT> ConstPtr;
+
+ typedef OctreePointCloud<PointT, LeafContainerT, BranchContainerT, OctreeBaseT> OctreePointCloudT;
+ typedef typename OctreePointCloudT::LeafNode LeafNode;
+ typedef typename OctreePointCloudT::BranchNode BranchNode;
+
+ typedef pcl::PointCloud<PointT> PointCloud;
+ typedef boost::shared_ptr<PointCloud> PointCloudPtr;
+ typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
+
+ // Iterators are friends
+ friend class OctreeIteratorBase<OctreeAdjacencyT>;
+ friend class OctreeDepthFirstIterator<OctreeAdjacencyT>;
+ friend class OctreeBreadthFirstIterator<OctreeAdjacencyT>;
+ friend class OctreeLeafNodeIterator<OctreeAdjacencyT>;
+
+ // Octree default iterators
+ typedef OctreeDepthFirstIterator<OctreeAdjacencyT> Iterator;
+ typedef const OctreeDepthFirstIterator<OctreeAdjacencyT> ConstIterator;
+
+ Iterator depth_begin (unsigned int max_depth_arg = 0) { return Iterator (this, max_depth_arg); }
+ const Iterator depth_end () { return Iterator (); }
+
+ // Octree leaf node iterators
+ typedef OctreeLeafNodeIterator<OctreeAdjacencyT> LeafNodeIterator;
+ typedef const OctreeLeafNodeIterator<OctreeAdjacencyT> ConstLeafNodeIterator;
+
+ LeafNodeIterator leaf_begin (unsigned int max_depth_arg = 0) { return LeafNodeIterator (this, max_depth_arg); }
+ const LeafNodeIterator leaf_end () { return LeafNodeIterator (); }
+
+ // BGL graph
+ typedef boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, PointT, float> VoxelAdjacencyList;
+ typedef typename VoxelAdjacencyList::vertex_descriptor VoxelID;
+ typedef typename VoxelAdjacencyList::edge_descriptor EdgeID;
+
+ // Leaf vector - pointers to all leaves
+ typedef std::vector<LeafContainerT*> LeafVectorT;
+
+ // Fast leaf iterators that don't require traversing tree
+ typedef typename LeafVectorT::iterator iterator;
+ typedef typename LeafVectorT::const_iterator const_iterator;
+
+ inline iterator begin () { return (leaf_vector_.begin ()); }
+ inline iterator end () { return (leaf_vector_.end ()); }
+
+ // Size of neighbors
+ inline size_t size () const { return leaf_vector_.size (); }
+
+ /** \brief Constructor.
+ *
+ * \param[in] resolution_arg Octree resolution at lowest octree level (voxel size) */
+ OctreePointCloudAdjacency (const double resolution_arg);
+
+ /** \brief Empty class destructor. */
+ virtual ~OctreePointCloudAdjacency ()
+ {
+ }
+
+ /** \brief Adds points from cloud to the octree.
+ *
+ * \note This overrides addPointsFromInputCloud() from the OctreePointCloud class. */
+ void
+ addPointsFromInputCloud ();
+
+ /** \brief Gets the leaf container for a given point.
+ *
+ * \param[in] point_arg Point to search for
+ *
+ * \returns Pointer to the leaf container - null if no leaf container found. */
+ LeafContainerT*
+ getLeafContainerAtPoint (const PointT& point_arg) const;
+
+ /** \brief Computes an adjacency graph of voxel relations.
+ *
+ * \warning This slows down rapidly as cloud size increases due to the number of edges.
+ *
+ * \param[out] voxel_adjacency_graph Boost Graph Library Adjacency graph of the voxel touching relationships.
+ * Vertices are PointT, edges represent touching, and edge lengths are the distance between the points. */
+ void
+ computeVoxelAdjacencyGraph (VoxelAdjacencyList &voxel_adjacency_graph);
+
+ /** \brief Sets a point transform (and inverse) used to transform the space of the input cloud.
+ *
+ * This is useful for changing how adjacency is calculated - such as relaxing the adjacency criterion for
+ * points further from the camera.
+ *
+ * \param[in] transform_func A boost:function pointer to the transform to be used. The transform must have one
+ * parameter (a point) which it modifies in place. */
+ void
+ setTransformFunction (boost::function<void (PointT &p)> transform_func)
+ {
+ transform_func_ = transform_func;
+ }
+
+ /** \brief Tests whether input point is occluded from specified camera point by other voxels.
+ *
+ * \param[in] point_arg Point to test for
+ * \param[in] camera_pos Position of camera, defaults to origin
+ *
+ * \returns True if path to camera is blocked by a voxel, false otherwise. */
+ bool
+ testForOcclusion (const PointT& point_arg, const PointXYZ &camera_pos = PointXYZ (0, 0, 0));
+
+ protected:
+
+ /** \brief Add point at index from input pointcloud dataset to octree.
+ *
+ * \param[in] point_idx_arg The index representing the point in the dataset given by setInputCloud() to be added
+ *
+ * \note This virtual implementation allows the use of a transform function to compute keys. */
+ virtual void
+ addPointIdx (const int point_idx_arg);
+
+ /** \brief Fills in the neighbors fields for new voxels.
+ *
+ * \param[in] key_arg Key of the voxel to check neighbors for
+ * \param[in] leaf_container Pointer to container of the leaf to check neighbors for */
+ void
+ computeNeighbors (OctreeKey &key_arg, LeafContainerT* leaf_container);
+
+ /** \brief Generates octree key for specified point (uses transform if provided).
+ *
+ * \param[in] point_arg Point to generate key for
+ * \param[out] key_arg Resulting octree key */
+ void
+ genOctreeKeyforPoint (const PointT& point_arg, OctreeKey& key_arg) const;
+
+ private:
+
+ /** \brief Add point at given index from input point cloud to octree.
+ *
+ * Index will be also added to indices vector. This functionality is not enabled for adjacency octree. */
+ using OctreePointCloudT::addPointFromCloud;
+
+ /** \brief Add point simultaneously to octree and input point cloud.
+ *
+ * This functionality is not enabled for adjacency octree. */
+ using OctreePointCloudT::addPointToCloud;
+
+ using OctreePointCloudT::input_;
+ using OctreePointCloudT::resolution_;
+ using OctreePointCloudT::min_x_;
+ using OctreePointCloudT::min_y_;
+ using OctreePointCloudT::min_z_;
+ using OctreePointCloudT::max_x_;
+ using OctreePointCloudT::max_y_;
+ using OctreePointCloudT::max_z_;
+
+ /// Local leaf pointer vector used to make iterating through leaves fast.
+ LeafVectorT leaf_vector_;
+
+ boost::function<void (PointT &p)> transform_func_;
+ };
+ }
+}
//#ifdef PCL_NO_PRECOMPILE
#include <pcl/octree/impl/octree_pointcloud_adjacency.hpp>
//#endif
-#endif //PCL_OCTREE_POINTCLOUD_SUPER_VOXEL_H_
+#endif // PCL_OCTREE_POINTCLOUD_ADJACENCY_H_
/** \brief Add new point to container- this just counts points
* \note To actually store data in the leaves, need to specialize this
* for your point and data type as in supervoxel_clustering.hpp
- * \param[in] new_point the new point to add
*/
+ // param[in] new_point the new point to add
void
- addPoint (const PointInT& new_point)
+ addPoint (const PointInT& /*new_point*/)
{
using namespace pcl::common;
++num_points_;
* \return number of points added to leaf node container.
*/
virtual size_t
- getSize ()
+ getSize () const
{
return num_points_;
}
}
}
-#endif
\ No newline at end of file
+#endif
for (it=leaf_containers.begin(); it!=it_end; ++it)
{
- if ((*it)->getSize()>=minPointsPerLeaf_arg)
+ if (static_cast<int> ((*it)->getSize ()) >= minPointsPerLeaf_arg)
(*it)->getPointIndices(indicesVector_arg);
}
genOctreeKeyforPoint (point_arg, key);
// add point to octree at key
- this->addData (key, 0);
+ this->createLeaf (key);
}
/** \brief Set occupied voxels at all points from point cloud.
}
/** \brief Equal comparison operator - set to false
- * \param[in] OctreePointCloudVoxelCentroidContainer to compare with
*/
+ // param[in] OctreePointCloudVoxelCentroidContainer to compare with
virtual bool operator==(const OctreeContainerBase&) const
{
return ( false );
}
/** \brief Add DataT object to leaf node at octree key.
- * \param[in] key_arg octree key addressing a leaf node.
- * \param[in] data_arg DataT object to be added.
+ * \param pointIdx_arg
*/
virtual void
addPointIdx (const int pointIdx_arg)
}
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/octree/impl/octree_search.hpp>
+#else
#define PCL_INSTANTIATE_OctreePointCloudSearch(T) template class PCL_EXPORTS pcl::octree::OctreePointCloudSearch<T>;
+#endif // PCL_NO_PRECOMPILE
#endif // PCL_OCTREE_SEARCH_H_
The <b>pcl_octree</b> library provides efficient methods for creating a hierarchical tree
data structure from point cloud data. This enables spatial partitioning,
downsampling and search operations on the point data set.
-Each octree node the has either eight children or no children. The root node describes
+Each octree node has either eight children or no children. The root node describes
a cubic bounding box which encapsulates all points. At every tree level, this space
becomes subdivided by a factor of 2 which results in an increased voxel resolution.
* Author: Julius Kammerl (julius@kammerl.de)
*/
-#include <pcl/impl/instantiate.hpp>
-#include <pcl/point_cloud.h>
-#include <pcl/point_types.h>
-
#include <pcl/octree/octree.h>
#include <pcl/octree/octree_impl.h>
template class PCL_EXPORTS pcl::octree::Octree2BufBase<
pcl::octree::OctreeContainerPointIndices,
pcl::octree::OctreeContainerEmpty >;
+
+template class PCL_EXPORTS pcl::octree::OctreeBase<
+ pcl::octree::OctreeContainerEmpty,
+ pcl::octree::OctreeContainerEmpty >;
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
PCL_INSTANTIATE(OctreePointCloudSingleBufferWithLeafDataTVector, PCL_XYZ_POINT_TYPES)
PCL_INSTANTIATE(OctreePointCloudDoubleBufferWithLeafDataTVector, PCL_XYZ_POINT_TYPES)
// PCL_INSTANTIATE(OctreePointCloudSingleBufferWithLeafDataT, PCL_XYZ_POINT_TYPES)
-// PCL_INSTANTIATE(OctreePointCloudSingleBufferWithEmptyLeaf, PCL_XYZ_POINT_TYPES)
+PCL_INSTANTIATE(OctreePointCloudSingleBufferWithEmptyLeaf, PCL_XYZ_POINT_TYPES)
// PCL_INSTANTIATE(OctreePointCloudDensity, PCL_XYZ_POINT_TYPES)
// PCL_INSTANTIATE(OctreePointCloudSingleBufferWithDensityLeaf, PCL_XYZ_POINT_TYPES)
// PCL_INSTANTIATE(OctreePointCloudChangeDetector, PCL_XYZ_POINT_TYPES)
// PCL_INSTANTIATE(OctreePointCloudVoxelCentroid, PCL_XYZ_POINT_TYPES)
+#endif // PCL_NO_PRECOMPILE
set(SUBSYS_DEPS common io filters octree visualization)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
set(incs
- include/pcl/${SUBSYS_NAME}/metadata.h
- include/pcl/${SUBSYS_NAME}/outofcore_base_data.h
- include/pcl/${SUBSYS_NAME}/outofcore_node_data.h
- include/pcl/${SUBSYS_NAME}/outofcore_iterator_base.h
- include/pcl/${SUBSYS_NAME}/outofcore_breadth_first_iterator.h
- include/pcl/${SUBSYS_NAME}/outofcore_depth_first_iterator.h
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/cJSON.h
- include/pcl/${SUBSYS_NAME}/octree_base.h
- include/pcl/${SUBSYS_NAME}/octree_base_node.h
- include/pcl/${SUBSYS_NAME}/octree_abstract_node_container.h
- include/pcl/${SUBSYS_NAME}/octree_disk_container.h
- include/pcl/${SUBSYS_NAME}/octree_ram_container.h
- include/pcl/${SUBSYS_NAME}/outofcore.h
- include/pcl/${SUBSYS_NAME}/outofcore_impl.h
+ "include/pcl/${SUBSYS_NAME}/metadata.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_base_data.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_node_data.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_iterator_base.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_breadth_first_iterator.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_depth_first_iterator.h"
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/cJSON.h"
+ "include/pcl/${SUBSYS_NAME}/octree_base.h"
+ "include/pcl/${SUBSYS_NAME}/octree_base_node.h"
+ "include/pcl/${SUBSYS_NAME}/octree_abstract_node_container.h"
+ "include/pcl/${SUBSYS_NAME}/octree_disk_container.h"
+ "include/pcl/${SUBSYS_NAME}/octree_ram_container.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore.h"
+ "include/pcl/${SUBSYS_NAME}/outofcore_impl.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/outofcore_breadth_first_iterator.hpp
- include/pcl/${SUBSYS_NAME}/impl/outofcore_depth_first_iterator.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_base.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_base_node.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_disk_container.hpp
- include/pcl/${SUBSYS_NAME}/impl/octree_ram_container.hpp
- include/pcl/${SUBSYS_NAME}/impl/monitor_queue.hpp
- include/pcl/${SUBSYS_NAME}/impl/lru_cache.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/outofcore_breadth_first_iterator.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/outofcore_depth_first_iterator.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_base.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_base_node.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_disk_container.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/octree_ram_container.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/monitor_queue.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/lru_cache.hpp"
)
set(visualization_incs
- include/pcl/${SUBSYS_NAME}/visualization/axes.h
- include/pcl/${SUBSYS_NAME}/visualization/camera.h
- include/pcl/${SUBSYS_NAME}/visualization/common.h
- include/pcl/${SUBSYS_NAME}/visualization/geometry.h
- include/pcl/${SUBSYS_NAME}/visualization/grid.h
- include/pcl/${SUBSYS_NAME}/visualization/object.h
- include/pcl/${SUBSYS_NAME}/visualization/outofcore_cloud.h
- include/pcl/${SUBSYS_NAME}/visualization/scene.h
- include/pcl/${SUBSYS_NAME}/visualization/viewport.h
+ "include/pcl/${SUBSYS_NAME}/visualization/axes.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/camera.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/common.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/geometry.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/grid.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/object.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/outofcore_cloud.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/scene.h"
+ "include/pcl/${SUBSYS_NAME}/visualization/viewport.h"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs} ${visualization_incs})
- #PCL_ADD_SSE_FLAGS(${LIB_NAME})
- target_link_libraries(${LIB_NAME} pcl_common pcl_visualization ${Boost_SYSTEM_LIBRARY})
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs} ${visualization_incs})
+ #PCL_ADD_SSE_FLAGS("${LIB_NAME}")
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_visualization ${Boost_SYSTEM_LIBRARY})
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/visualization ${visualization_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/visualization" ${visualization_incs})
- add_subdirectory(tools)
+ if(BUILD_tools)
+ add_subdirectory(tools)
+ endif(BUILD_tools)
endif(build)
* http://www.pointclouds.org/blog/urcs/.
*
* The primary purpose of this class is an interface to the
- * recursive traversal (recursion handled by \ref OutofcoreOctreeBaseNode) of the
+ * recursive traversal (recursion handled by \ref pcl::outofcore::OutofcoreOctreeBaseNode) of the
* in-memory/top-level octree structure. The metadata in each node
* can be loaded entirely into main memory, from which the tree can be traversed
* recursively in this state. This class provides an the interface
*
* The format of the octree is stored on disk in a hierarchical
* octree structure, where .oct_idx are the JSON-based node
- * metadata files managed by \ref OutofcoreOctreeNodeMetadata,
+ * metadata files managed by \ref pcl::outofcore::OutofcoreOctreeNodeMetadata,
* and .octree is the JSON-based octree metadata file managed by
- * \ref OutofcoreOctreeBaseMetadata. Children of each node live
+ * \ref pcl::outofcore::OutofcoreOctreeBaseMetadata. Children of each node live
* in up to eight subdirectories named from 0 to 7, where a
* metadata and optionally a pcd file will exist. The PCD files
* are stored in compressed binary PCD format, containing all of
* otherwise only the root node is actually created, and the rest will be
* generated on insertion or query.
*
- * \param Path to the top-level tree/tree.oct_idx metadata file
+ * \param root_node_name Path to the top-level tree/tree.oct_idx metadata file
* \param load_all Load entire tree metadata (does not load any points from disk)
* \throws PCLException for bad extension (root node metadata must be .oct_idx extension)
*/
*
* \param min Bounding box min
* \param max Bounding box max
- * \param node_dim_meters Node dimension in meters (assuming your point data is in meters)
+ * \param resolution_arg Node dimension in meters (assuming your point data is in meters)
* \param root_node_name must end in ".oct_idx"
* \param coord_sys Coordinate system which is stored in the JSON metadata
- * \throws PCLException if root file extension does not match \ref OutofcoreOctreeBaseNode::node_index_extension
+ * \throws PCLException if root file extension does not match \ref pcl::outofcore::OutofcoreOctreeBaseNode::node_index_extension
*/
OutofcoreOctreeBase (const Eigen::Vector3d& min, const Eigen::Vector3d& max, const double resolution_arg, const boost::filesystem::path &root_node_name, const std::string &coord_sys);
//templated PointT methods
//--------------------------------------------------------------------------------
- /** \brief Get a list of file paths at query_depth that intersect with your bounding box specified by \ref min and \ref max. When querying with this method, you may be stuck with extra data (some outside of your query bounds) that reside in the files.
+ /** \brief Get a list of file paths at query_depth that intersect with your bounding box specified by \c min and \c max.
+ * When querying with this method, you may be stuck with extra data (some outside of your query bounds) that reside in the files.
*
* \param[in] min The minimum corner of the bounding box
* \param[in] max The maximum corner of the bounding box
void
queryBBIncludes (const Eigen::Vector3d &min, const Eigen::Vector3d &max, const boost::uint64_t query_depth, AlignedPointTVector &dst) const;
- /** \brief Query all points falling within the input bounding box at \ref query_depth and return a PCLPointCloud2 object in \ref dst_blob.
+ /** \brief Query all points falling within the input bounding box at \c query_depth and return a PCLPointCloud2 object in \c dst_blob.
*
* \param[in] min The minimum corner of the input bounding box.
* \param[in] max The maximum corner of the input bounding box.
void
queryBBIncludes (const Eigen::Vector3d &min, const Eigen::Vector3d &max, const boost::uint64_t query_depth, const pcl::PCLPointCloud2::Ptr &dst_blob) const;
- /** \brief Returns a random subsample of points within the given bounding box at \ref query_depth.
+ /** \brief Returns a random subsample of points within the given bounding box at \c query_depth.
*
* \param[in] min The minimum corner of the boudning box to query.
* \param[out] max The maximum corner of the bounding box to query.
- * \param[in] query_depth The depth in the tree at which to look for the points. Only returns points within the given bounding box at the specified \ref query_depth.
+ * \param[in] query_depth The depth in the tree at which to look for the points. Only returns points within the given bounding box at the specified \c query_depth.
* \param[out] dst The destination in which to return the points.
*
*/
//PCLPointCloud2 methods
//--------------------------------------------------------------------------------
- /** \brief Query all points falling within the input bounding box at \ref query_depth and return a PCLPointCloud2 object in \ref dst_blob. If the optional argument for filter is given, points are processed by that filter before returning.
+ /** \brief Query all points falling within the input bounding box at \c query_depth and return a PCLPointCloud2 object in \c dst_blob.
+ * If the optional argument for filter is given, points are processed by that filter before returning.
* \param[in] min The minimum corner of the input bounding box.
* \param[in] max The maximum corner of the input bounding box.
* \param[in] query_depth The depth of tree at which to query; only points at this depth are returned
/** \brief Returns list of pcd files from nodes whose bounding boxes intersect with the input bounding box.
* \param[in] min The minimum corner of the input bounding box.
* \param[in] max The maximum corner of the input bounding box.
+ * \param query_depth
* \param[out] filenames The list of paths to the PCD files which can be loaded and processed.
*/
inline virtual void
// --------------------------------------------------------------------------------
/** \brief Get the overall bounding box of the outofcore
- * octree; this is the same as the bounding box of the \ref root_node_ node */
+ * octree; this is the same as the bounding box of the \c root_node_ node
+ * \param min
+ * \param max
+ */
bool
getBoundingBox (Eigen::Vector3d &min, Eigen::Vector3d &max) const;
/** \brief Get number of points at specified LOD
- * \param[in] depth the level of detail at which we want the number of points (0 is root, 1, 2,...)
+ * \param[in] depth_index the level of detail at which we want the number of points (0 is root, 1, 2,...)
* \return number of points in the tree at \b depth
*/
inline boost::uint64_t
this->printBoundingBox (metadata_->getDepth ());
}
- /** \brief Returns the voxel centers of all existing voxels at \ref query_depth
- \param[in] query_depth: the depth of the tree at which to retrieve occupied/existing voxels
- \param[out] vector of PointXYZ voxel centers for nodes that exist at that depth
+ /** \brief Returns the voxel centers of all existing voxels at \c query_depth
+ \param[out] voxel_centers Vector of PointXYZ voxel centers for nodes that exist at that depth
+ \param[in] query_depth the depth of the tree at which to retrieve occupied/existing voxels
*/
void
getOccupiedVoxelCenters(AlignedPointTVector &voxel_centers, size_t query_depth) const;
- /** \brief Returns the voxel centers of all existing voxels at \ref query_depth
- \param[in] query_depth: the depth of the tree at which to retrieve occupied/existing voxels
- \param[out] vector of PointXYZ voxel centers for nodes that exist at that depth
+ /** \brief Returns the voxel centers of all existing voxels at \c query_depth
+ \param[out] voxel_centers Vector of PointXYZ voxel centers for nodes that exist at that depth
+ \param[in] query_depth the depth of the tree at which to retrieve occupied/existing voxels
*/
void
getOccupiedVoxelCenters(std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d> > &voxel_centers, size_t query_depth) const;
*
* \brief OutofcoreOctreeBaseNode Class internally representing nodes of an
* outofcore octree, with accessors to its data via the \ref
- * octree_disk_container class or \ref octree_ram_container class,
+ * pcl::outofcore::OutofcoreOctreeDiskContainer class or \ref pcl::outofcore::OutofcoreOctreeRamContainer class,
* whichever it is templated against.
*
* \ingroup outofcore
//query
/** \brief gets the minimum and maximum corner of the bounding box represented by this node
- * \param[out] minCoord returns the minimum corner of the bounding box indexed by 0-->X, 1-->Y, 2-->Z
- * \param[out] maxCoord returns the maximum corner of the bounding box indexed by 0-->X, 1-->Y, 2-->Z
+ * \param[out] min_bb returns the minimum corner of the bounding box indexed by 0-->X, 1-->Y, 2-->Z
+ * \param[out] max_bb returns the maximum corner of the bounding box indexed by 0-->X, 1-->Y, 2-->Z
*/
virtual inline void
getBoundingBox (Eigen::Vector3d &min_bb, Eigen::Vector3d &max_bb) const
* \param[in] min_bb the minimum corner of the bounding box, indexed by X,Y,Z coordinates
* \param[in] max_bb the maximum corner of the bounding box, indexed by X,Y,Z coordinates
* \param[in] query_depth
+ * \param percent
* \param[out] v std::list of points returned by the query
*/
virtual void
virtual void
queryBBIntersects (const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const boost::uint32_t query_depth, std::list<std::string> &file_names);
- /** \brief Write the voxel size to stdout at \ref query_depth
+ /** \brief Write the voxel size to stdout at \c query_depth
* \param[in] query_depth The depth at which to print the size of the voxel/bounding boxes
*/
virtual void
/** \brief add point to this node if we are a leaf, or find the leaf below us that is supposed to take the point
* \param[in] p vector of points to add to the leaf
- * \param[in] skipBBCheck whether to check if the point's coordinates fall within the bounding box
+ * \param[in] skip_bb_check whether to check if the point's coordinates fall within the bounding box
*/
virtual boost::uint64_t
addDataToLeaf (const AlignedPointTVector &p, const bool skip_bb_check = true);
* If creating root, path is full name. If creating any other
* node, path is dir; throws exception if directory or metadata not found
*
- * \param[in] Directory pathname
+ * \param[in] directory_path pathname
* \param[in] super
- * \param[in] loadAll
+ * \param[in] load_all
* \throws PCLException if directory is missing
* \throws PCLException if node index is missing
*/
virtual size_t
countNumChildren () const;
- /** \brief Counts the number of loaded chilren by testing the \ref children_ array;
+ /** \brief Counts the number of loaded chilren by testing the \c children_ array;
* used to update num_loaded_chilren_ internally
*/
virtual size_t
countNumLoadedChildren () const;
/** \brief Save node's metadata to file
- * \param[in] recursive: if false, save only this node's metadata to file; if true, recursively
+ * \param[in] recursive if false, save only this node's metadata to file; if true, recursively
* save all children's metadata to files as well
*/
void
addDataAtMaxDepth (const AlignedPointTVector &p, const bool skip_bb_check = true);
/** \brief Add data to the leaf when at max depth of tree. If
- * \ref skip_bb_check is true, adds to the node regardless of the
+ * \c skip_bb_check is true, adds to the node regardless of the
* bounding box it represents; otherwise only adds points that
* fall within the bounding box
*
/** \brief Tests whether the input bounding box intersects with the current node's bounding box
* \param[in] min_bb The minimum corner of the input bounding box
- * \param[in] min_bb The maximum corner of the input bounding box
+ * \param[in] max_bb The maximum corner of the input bounding box
* \return bool True if any portion of the bounding box intersects with this node's bounding box; false otherwise
*/
inline bool
inline bool
inBoundingBox (const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb) const;
- /** \brief Tests whether \ref point falls within the input bounding box
+ /** \brief Tests whether \c point falls within the input bounding box
* \param[in] min_bb The minimum corner of the input bounding box
* \param[in] max_bb The maximum corner of the input bounding box
* \param[in] point The test point
bool
pointInBoundingBox (const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const Eigen::Vector3d &point);
- /** \brief Tests whether \ref p falls within the input bounding box
+ /** \brief Tests whether \c p falls within the input bounding box
* \param[in] min_bb The minimum corner of the input bounding box
* \param[in] max_bb The maximum corner of the input bounding box
* \param[in] p The point to be tested
static bool
pointInBoundingBox (const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const PointT &p);
- /** \brief Tests whether \ref x, \ref y, and \ref z fall within the input bounding box
+ /** \brief Tests whether \c x, \c y, and \c z fall within the input bounding box
* \param[in] min_bb The minimum corner of the input bounding box
* \param[in] max_bb The maximum corner of the input bounding box
- **/
+ * \param x
+ * \param y
+ * \param z
+ **/
static bool
pointInBoundingBox (const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const double x, const double y, const double z);
inline bool
pointInBoundingBox (const PointT &p) const;
- /** \brief Creates child node \ref idx
+ /** \brief Creates child node \c idx
* \param[in] idx Index (0-7) of the child node
*/
void
*
* \param[in] start index of first point to read from disk
* \param[in] count offset of last point to read from disk
- * \param[out] v std::vector as destination for points read from disk into memory
+ * \param[out] dst std::vector as destination for points read from disk into memory
*/
void
readRange (const uint64_t start, const uint64_t count, AlignedPointTVector &dst);
void
readRange (const uint64_t, const uint64_t, pcl::PCLPointCloud2::Ptr &dst);
- /** \brief Reads the entire point contents from disk into \ref output_cloud
+ /** \brief Reads the entire point contents from disk into \c output_cloud
* \param[out] output_cloud
*/
int
* unique (could have multiple identical points!)
*
* \param[in] start The starting index of points to select
- * \param count[in] The length of the range of points from which to randomly sample
+ * \param[in] count The length of the range of points from which to randomly sample
* (i.e. from start to start+count)
- * \param percent[in] The percentage of count that is enough points to make up this random sample
- * \param dst[out] std::vector as destination for randomly sampled points; size will
+ * \param[in] percent The percentage of count that is enough points to make up this random sample
+ * \param[out] dst std::vector as destination for randomly sampled points; size will
* be percentage*count
*/
void
readRangeSubSample_bernoulli (const uint64_t start, const uint64_t count,
const double percent, AlignedPointTVector& dst);
- /** \brief Returns the total number of points for which this container is responsible, \ref filelen_ + points in \ref writebuff_ that have not yet been flushed to the disk
+ /** \brief Returns the total number of points for which this container is responsible, \c filelen_ + points in \c writebuff_ that have not yet been flushed to the disk
*/
uint64_t
size () const
}
/** \brief STL-like empty test
- * \return true if container has no data on disk or waiting to be written in \ref writebuff_ */
+ * \return true if container has no data on disk or waiting to be written in \c writebuff_ */
inline bool
empty () const
{
private:
//no copy construction
- OutofcoreOctreeDiskContainer (const OutofcoreOctreeDiskContainer &rval) { }
+ OutofcoreOctreeDiskContainer (const OutofcoreOctreeDiskContainer& /*rval*/) { }
OutofcoreOctreeDiskContainer&
- operator= (const OutofcoreOctreeDiskContainer &rval) { }
+ operator= (const OutofcoreOctreeDiskContainer& /*rval*/) { }
void
flushWritebuff (const bool force_cache_dealloc);
insertRange (const PointT* const * start, const uint64_t count);
void
- insertRange (AlignedPointTVector &p)
+ insertRange (AlignedPointTVector& /*p*/)
{
PCL_ERROR ("[pcl::outofcore::OutofcoreOctreeRamContainer] Inserting eigen-aligned point vectors is not implemented using the ram containers\n");
//insertRange (&(p.begin ()), p.size ());
}
void
- insertRange (const AlignedPointTVector &p)
+ insertRange (const AlignedPointTVector& /*p*/)
{
PCL_ERROR ("[pcl::outofcore::OutofcoreOctreeRamContainer] Inserting eigen-aligned point vectors is not implemented using the ram containers\n");
}
protected:
//no copy construction
- OutofcoreOctreeRamContainer (const OutofcoreOctreeRamContainer &rval) { }
+ OutofcoreOctreeRamContainer (const OutofcoreOctreeRamContainer& /*rval*/) { }
OutofcoreOctreeRamContainer&
- operator= (const OutofcoreOctreeRamContainer& rval) { }
+ operator= (const OutofcoreOctreeRamContainer& /*rval*/) { }
//the actual container
//std::deque<PointT> container;
*
* \ingroup outofcore
* \author Justin Rosen (jmylesrosen@gmail.com)
- * \note Code adapted from \ref octree_iterator.h in Module \ref pcl_octree written by Julius Kammerl
+ * \note Code adapted from \ref octree_iterator.h in Module \ref pcl::octree written by Julius Kammerl
*/
template<typename PointT=pcl::PointXYZ, typename ContainerT=OutofcoreOctreeDiskContainer<pcl::PointXYZ> >
class OutofcoreBreadthFirstIterator : public OutofcoreIteratorBase<PointT, ContainerT>
*
* \ingroup outofcore
* \author Stephen Fox (foxstephend@gmail.com)
- * \note Code adapted from \ref octree_iterator.h in Module \ref pcl_octree written by Julius Kammerl
+ * \note Code adapted from \ref octree_iterator.h in Module \ref pcl::octree written by Julius Kammerl
*/
template<typename PointT=pcl::PointXYZ, typename ContainerT=OutofcoreOctreeDiskContainer<pcl::PointXYZ> >
class OutofcoreDepthFirstIterator : public OutofcoreIteratorBase<PointT, ContainerT>
namespace outofcore
{
/** \brief Abstract octree iterator class
- * \note This class is based on the octree_iterator written by Julius Kammerl adapted to the outofcore octree. The interface is very similar, but it does \b not inherit the \ref pcl_octree iterator base.
+ * \note This class is based on the octree_iterator written by Julius Kammerl adapted to the outofcore octree. The interface is very similar, but it does \b not inherit the \ref pcl::octree iterator base.
* \ingroup outofcore
* \author Stephen Fox (foxstephend@gmail.com)
*/
#include "object.h"
// VTK
+#include <vtkVersion.h>
#include <vtkActor.h>
#include <vtkTubeFilter.h>
#include <vtkAxes.h>
axes_ = vtkSmartPointer<vtkAxes>::New ();
axes_->SetOrigin (0, 0, 0);
axes_->SetScaleFactor (size);
+ axes_->Update ();
vtkSmartPointer<vtkFloatArray> axes_colors = vtkSmartPointer<vtkFloatArray>::New ();
axes_colors->Allocate (6);
axes_colors->InsertNextValue (1.0);
vtkSmartPointer<vtkPolyData> axes_data = axes_->GetOutput ();
- axes_data->Update ();
axes_data->GetPointData ()->SetScalars (axes_colors);
vtkSmartPointer<vtkTubeFilter> axes_tubes = vtkSmartPointer<vtkTubeFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
axes_tubes->SetInput (axes_data);
+#else
+ axes_tubes->SetInputData (axes_data);
+#endif
axes_tubes->SetRadius (axes_->GetScaleFactor () / 100.0);
axes_tubes->SetNumberOfSides (6);
vtkSmartPointer<vtkPolyDataMapper> axes_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
axes_mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
axes_mapper->SetInput (axes_tubes->GetOutput ());
+#else
+ axes_mapper->SetInputData (axes_tubes->GetOutput ());
+#endif
axes_actor_ = vtkSmartPointer<vtkActor>::New ();
axes_actor_->GetProperty ()->SetLighting (false);
{
displayDepth = 0;
}
- else if (displayDepth > octree_->getDepth ())
+ else if (static_cast<unsigned int> (displayDepth) > octree_->getDepth ())
{
displayDepth = octree_->getDepth ();
}
- if (display_depth_ != displayDepth)
+ if (display_depth_ != static_cast<uint64_t> (displayDepth))
{
display_depth_ = displayDepth;
updateVoxelData ();
//
// vtkSmartPointer<vtkPolyDataMapper> hull_mapper = static_cast<vtkPolyDataMapper*> (hull_actor_->GetMapper ());
//
-//#if VTK_MAJOR_VERSION <= 5
+//#if VTK_MAJOR_VERSION < 6
// hull_mapper->SetInput (hullData);
//#else
// hull_mapper->SetInputData(hullData);
#include <pcl/outofcore/visualization/grid.h>
// VTK
+#include <vtkVersion.h>
#include <vtkActor.h>
#include <vtkRectilinearGrid.h>
#include <vtkDoubleArray.h>
grid_->SetYCoordinates (y_array);
grid_->SetZCoordinates (xz_array);
-#if VTK_MAJOR_VERSION <= 5
+#if VTK_MAJOR_VERSION < 6
grid_mapper->SetInputConnection (grid_->GetProducerPort ());
#else
grid_mapper->SetInputData(grid_);
#include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
// VTK
+#include <vtkVersion.h>
#include <vtkActor.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
double y = voxel_centers[i].y;
double z = voxel_centers[i].z;
+#if VTK_MAJOR_VERSION < 6
voxel_data->AddInput (getVtkCube (x - s, x + s, y - s, y + s, z - s, z + s));
+#else
+ voxel_data->AddInputData (getVtkCube (x - s, x + s, y - s, y + s, z - s, z + s));
+#endif
}
+#if VTK_MAJOR_VERSION < 6
voxel_mapper->SetInput (voxel_data->GetOutput ());
+#else
+ voxel_mapper->SetInputData (voxel_data->GetOutput ());
+#endif
voxel_actor_->SetMapper (voxel_mapper);
voxel_actor_->GetProperty ()->SetRepresentationToWireframe ();
}
}
- for (int i = 0; i < actors_to_remove.size (); i++)
+ for (size_t i = 0; i < actors_to_remove.size (); i++)
{
points_loaded_ -= actors_to_remove.back ()->GetMapper ()->GetInput ()->GetNumberOfPoints ();
data_loaded_ -= actors_to_remove.back ()->GetMapper ()->GetInput ()->GetActualMemorySize();
Camera*
Scene::getCamera (vtkCamera *camera)
{
- for (int i = 0; i < cameras_.size (); i++)
+ for (size_t i = 0; i < cameras_.size (); i++)
{
if (cameras_[i]->getCamera ().GetPointer () == camera)
{
Camera*
Scene::getCamera (std::string name)
{
- for (int i = 0; i < cameras_.size (); i++)
+ for (size_t i = 0; i < cameras_.size (); i++)
if (cameras_[i]->getName () == name)
return cameras_[i];
Object*
Scene::getObjectByName (std::string name)
{
- for (int i = 0; i < objects_.size (); i++)
+ for (size_t i = 0; i < objects_.size (); i++)
if (objects_[i]->getName () == name)
return objects_[i];
std::vector<Camera*> cameras = scene->getCameras ();
- for (int i = 0; i < cameras.size (); i++)
+ for (size_t i = 0; i < cameras.size (); i++)
{
cameras[i]->render (renderer_);
// if (cameras[i]->getCamera () != renderer_->GetActiveCamera ())
}
std::vector<Object*> objects = scene->getObjects ();
- for (int i = 0; i < objects.size (); i++)
+ for (size_t i = 0; i < objects.size (); i++)
{
//std::cout << objects[i]->getName () << std::endl;
objects[i]->render (renderer_);
uint64_t points_loaded = 0;
uint64_t data_loaded = 0;
- for (int i = 0; i < objects.size (); i++)
+ for (size_t i = 0; i < objects.size (); i++)
{
//TYPE& dynamic_cast<TYPE&> (object);
OutofcoreCloud* cloud = dynamic_cast<OutofcoreCloud*> (objects[i]);
}
char points_loaded_str[50];
- sprintf (points_loaded_str, "%llu points/%llu mb", points_loaded, data_loaded/1024);
+ sprintf (points_loaded_str, "%lu points/%lu mb", points_loaded, data_loaded/1024);
points_hud_actor_->SetInput (points_loaded_str);
}
# pcl_outofcore_process
-PCL_ADD_EXECUTABLE(pcl_outofcore_process ${SUBSYS_NAME} outofcore_process.cpp)
+PCL_ADD_EXECUTABLE(pcl_outofcore_process "${SUBSYS_NAME}" outofcore_process.cpp)
target_link_libraries(pcl_outofcore_process pcl_common pcl_filters pcl_io pcl_octree pcl_outofcore)
-PCL_ADD_EXECUTABLE(pcl_outofcore_print ${SUBSYS_NAME} outofcore_print.cpp)
+PCL_ADD_EXECUTABLE(pcl_outofcore_print "${SUBSYS_NAME}" outofcore_print.cpp)
target_link_libraries(pcl_outofcore_print pcl_common pcl_filters pcl_io pcl_octree pcl_outofcore)
if(NOT VTK_FOUND)
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.8")
# pcl_outofcore_viewer uses some functions not present in vtk 5.8
../src/visualization/viewport.cpp)
# pcl_outofcore_viewer
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_outofcore_viewer ${SUBSYS_NAME} ${srcs})
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_outofcore_viewer "${SUBSYS_NAME}" ${srcs})
target_link_libraries(pcl_outofcore_viewer pcl_common pcl_io pcl_outofcore pcl_visualization pcl_octree pcl_filters)
endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.8")
void
printDepth(size_t depth)
{
- for (int i=0; i < depth; i++)
+ for (size_t i = 0; i < depth; i++)
PCL_INFO (" ");
}
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
-// Definitions
-const int MAX_DEPTH (-1);
-
// Globals
vtkSmartPointer<vtkRenderWindow> window;
}
void
-print_help (int argc, char **argv)
+print_help (int, char **argv)
{
- //suppress unused parameter warning
- assert(argc == argc);
-
print_info ("This program is used to visualize outofcore data structure");
print_info ("%s <options> <input_tree_dir> \n", argv[0]);
print_info ("\n");
#cmakedefine HAVE_OPENNI 1
+#cmakedefine HAVE_OPENNI2 1
+
#cmakedefine HAVE_QHULL 1
#cmakedefine HAVE_QHULL_2011 1
#undef HAVE_OPENNI
#endif
+#ifdef DISABLE_OPENNI2
+#undef HAVE_OPENNI2
+#endif
+
#ifdef DISABLE_QHULL
#undef HAVE_QHULL
#endif
#cmakedefine VERBOSITY_LEVEL_INFO
#cmakedefine VERBOSITY_LEVEL_DEBUG
#cmakedefine VERBOSITY_LEVEL_VERBOSE
+
+/* Address the cases where on MacOS and OpenGL and GLUT are not frameworks */
+#cmakedefine OPENGL_IS_A_FRAMEWORK
+#cmakedefine GLUT_IS_A_FRAMEWORK
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
endif(NOT VTK_FOUND)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(incs
- include/pcl/${SUBSYS_NAME}/ground_based_people_detection_app.h
- include/pcl/${SUBSYS_NAME}/head_based_subcluster.h
- include/pcl/${SUBSYS_NAME}/height_map_2d.h
- include/pcl/${SUBSYS_NAME}/person_classifier.h
- include/pcl/${SUBSYS_NAME}/person_cluster.h
- include/pcl/${SUBSYS_NAME}/hog.h
+ "include/pcl/${SUBSYS_NAME}/ground_based_people_detection_app.h"
+ "include/pcl/${SUBSYS_NAME}/head_based_subcluster.h"
+ "include/pcl/${SUBSYS_NAME}/height_map_2d.h"
+ "include/pcl/${SUBSYS_NAME}/person_classifier.h"
+ "include/pcl/${SUBSYS_NAME}/person_cluster.h"
+ "include/pcl/${SUBSYS_NAME}/hog.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/ground_based_people_detection_app.hpp
- include/pcl/${SUBSYS_NAME}/impl/head_based_subcluster.hpp
- include/pcl/${SUBSYS_NAME}/impl/height_map_2d.hpp
- include/pcl/${SUBSYS_NAME}/impl/person_classifier.hpp
- include/pcl/${SUBSYS_NAME}/impl/person_cluster.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/ground_based_people_detection_app.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/head_based_subcluster.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/height_map_2d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/person_classifier.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/person_cluster.hpp"
)
set(srcs
src/hog.cpp)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
- #SET_TARGET_PROPERTIES(pcl_${SUBSYS_NAME} PROPERTIES LINKER_LANGUAGE CXX)
+ #SET_TARGET_PROPERTIES("${LIB_NAME}" PROPERTIES LINKER_LANGUAGE CXX)
if(OPENNI_FOUND AND BUILD_OPENNI)
- PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ground_based_rgbd_people_detector ${SUBSYS_NAME} apps/main_ground_based_people_detection.cpp)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_ground_based_rgbd_people_detector "${SUBSYS_NAME}" apps/main_ground_based_people_detection.cpp)
target_link_libraries(pcl_ground_based_rgbd_people_detector pcl_common pcl_kdtree pcl_search pcl_features pcl_sample_consensus pcl_filters pcl_io pcl_visualization pcl_segmentation pcl_people)
endif()
endif(build)
// Algorithm parameters:
std::string svm_filename = "../../people/data/trainedLinearSVMForPeopleDetectionWithHOG.yaml";
float min_confidence = -1.5;
+ float min_width = 0.1;
+ float max_width = 8.0;
float min_height = 1.3;
float max_height = 2.3;
float voxel_size = 0.06;
people_detector.setVoxelSize(voxel_size); // set the voxel size
people_detector.setIntrinsics(rgb_intrinsics_matrix); // set RGB camera intrinsic parameters
people_detector.setClassifier(person_classifier); // set person classifier
- people_detector.setHeightLimits(min_height, max_height); // set person classifier
+ people_detector.setPersonClusterLimits(min_height, max_height, min_width, max_width);
people_detector.setSamplingFactor(sampling_factor); // set a downsampling factor to the point cloud (for increasing speed)
// people_detector.setSensorPortraitOrientation(true); // set sensor orientation to vertical
#include <pcl/people/person_cluster.h>
#include <pcl/people/head_based_subcluster.h>
#include <pcl/people/person_classifier.h>
+#include <pcl/common/transforms.h>
namespace pcl
{
void
setGround (Eigen::VectorXf& ground_coeffs);
+ /**
+ * \brief Set the transformation matrix, which is used in order to transform the given point cloud, the ground plane and the intrinsics matrix to the internal coordinate frame.
+ *
+ * \param[in] cloud A pointer to the input cloud.
+ */
+ void
+ setTransformation (const Eigen::Matrix3f& transformation);
+
/**
* \brief Set sampling factor.
*
void
setClassifier (pcl::people::PersonClassifier<pcl::RGB> person_classifier);
+ /**
+ * \brief Set the field of view of the point cloud in z direction.
+ *
+ * \param[in] min The beginning of the field of view in z-direction, should be usually set to zero.
+ * \param[in] max The end of the field of view in z-direction.
+ */
+ void
+ setFOV (float min, float max);
+
/**
* \brief Set sensor orientation (vertical = true means portrait mode, vertical = false means landscape mode).
*
setHeadCentroid (bool head_centroid);
/**
- * \brief Set minimum and maximum allowed height for a person cluster.
+ * \brief Set minimum and maximum allowed height and width for a person cluster.
*
* \param[in] min_height Minimum allowed height for a person cluster (default = 1.3).
* \param[in] max_height Maximum allowed height for a person cluster (default = 2.3).
+ * \param[in] min_width Minimum width for a person cluster (default = 0.1).
+ * \param[in] max_width Maximum width for a person cluster (default = 8.0).
*/
void
- setHeightLimits (float min_height, float max_height);
-
- /**
- * \brief Set minimum and maximum allowed number of points for a person cluster.
- *
- * \param[in] min_points Minimum allowed number of points for a person cluster.
- * \param[in] max_points Maximum allowed number of points for a person cluster.
- */
- void
- setDimensionLimits (int min_points, int max_points);
+ setPersonClusterLimits (float min_height, float max_height, float min_width, float max_width);
/**
* \brief Set minimum distance between persons' heads.
setMinimumDistanceBetweenHeads (float heads_minimum_distance);
/**
- * \brief Get minimum and maximum allowed height for a person cluster.
+ * \brief Get the minimum and maximum allowed height and width for a person cluster.
*
* \param[out] min_height Minimum allowed height for a person cluster.
* \param[out] max_height Maximum allowed height for a person cluster.
+ * \param[out] min_width Minimum width for a person cluster.
+ * \param[out] max_width Maximum width for a person cluster.
*/
void
- getHeightLimits (float& min_height, float& max_height);
+ getPersonClusterLimits (float& min_height, float& max_height, float& min_width, float& max_width);
/**
* \brief Get minimum and maximum allowed number of points for a person cluster.
Eigen::VectorXf
getGround ();
+ /**
+ * \brief Get the filtered point cloud.
+ */
+ PointCloudPtr
+ getFilteredCloud ();
+
/**
* \brief Get pointcloud after voxel grid filtering and ground removal.
*/
void
swapDimensions (pcl::PointCloud<pcl::RGB>::Ptr& cloud);
+ /**
+ * \brief Estimates min_points_ and max_points_ based on the minimal and maximal cluster size and the voxel size.
+ */
+ void
+ updateMinMaxPoints ();
+
+ /**
+ * \brief Applies the transformation to the input point cloud.
+ */
+ void
+ applyTransformationPointCloud ();
+
+ /**
+ * \brief Applies the transformation to the ground plane.
+ */
+ void
+ applyTransformationGround ();
+
+ /**
+ * \brief Applies the transformation to the intrinsics matrix.
+ */
+ void
+ applyTransformationIntrinsics ();
+
+ /**
+ * \brief Reduces the input cloud to one point per voxel and limits the field of view.
+ */
+ void
+ filter ();
+
/**
* \brief Perform people detection on the input data and return people clusters information.
*
float voxel_size_;
/** \brief ground plane coefficients */
- Eigen::VectorXf ground_coeffs_;
-
+ Eigen::VectorXf ground_coeffs_;
+
+ /** \brief flag stating whether the ground coefficients have been set or not */
+ bool ground_coeffs_set_;
+
+ /** \brief the transformed ground coefficients */
+ Eigen::VectorXf ground_coeffs_transformed_;
+
/** \brief ground plane normalization factor */
- float sqrt_ground_coeffs_;
-
+ float sqrt_ground_coeffs_;
+
+ /** \brief rotation matrix which transforms input point cloud to internal people tracker coordinate frame */
+ Eigen::Matrix3f transformation_;
+
+ /** \brief flag stating whether the transformation matrix has been set or not */
+ bool transformation_set_;
+
/** \brief pointer to the input cloud */
- PointCloudPtr cloud_;
+ PointCloudPtr cloud_;
+
+ /** \brief pointer to the filtered cloud */
+ PointCloudPtr cloud_filtered_;
/** \brief pointer to the cloud after voxel grid filtering and ground removal */
PointCloudPtr no_ground_cloud_;
float max_height_;
/** \brief person clusters minimum height from the ground plane */
- float min_height_;
-
+ float min_height_;
+
+ /** \brief person clusters maximum width, used to estimate how many points maximally represent a person cluster */
+ float max_width_;
+
+ /** \brief person clusters minimum width, used to estimate how many points minimally represent a person cluster */
+ float min_width_;
+
+ /** \brief the beginning of the field of view in z-direction, should be usually set to zero */
+ float min_fov_;
+
+ /** \brief the end of the field of view in z-direction */
+ float max_fov_;
+
/** \brief if true, the sensor is considered to be vertically placed (portrait mode) */
bool vertical_;
/** \brief minimum number of points for a person cluster */
int min_points_;
- /** \brief true if min_points and max_points have been set by the user, false otherwise */
- bool dimension_limits_set_;
-
/** \brief minimum distance between persons' heads */
float heads_minimum_distance_;
/** \brief intrinsic parameters matrix of the RGB camera */
- Eigen::Matrix3f intrinsics_matrix_;
-
+ Eigen::Matrix3f intrinsics_matrix_;
+
+ /** \brief flag stating whether the intrinsics matrix has been set or not */
+ bool intrinsics_matrix_set_;
+
+ /** \brief the transformed intrinsics matrix */
+ Eigen::Matrix3f intrinsics_matrix_transformed_;
+
/** \brief SVM-based person classifier */
pcl::people::PersonClassifier<pcl::RGB> person_classifier_;
/** \brief flag stating if the classifier has been set or not */
- bool person_classifier_set_flag_;
+ bool person_classifier_set_flag_;
};
} /* namespace people */
} /* namespace pcl */
* \brief Create subclusters centered on the heads position from the current cluster.
*
* \param[in] cluster A PersonCluster.
- * \param[in] maxima_number Number of local maxima to use as centers of the new cluster.
- * \param[in] maxima_cloud_indices Cloud indices of local maxima to use as centers of the new cluster.
+ * \param[in] maxima_number_after_filtering Number of local maxima to use as centers of the new cluster.
+ * \param[in] maxima_cloud_indices_filtered Cloud indices of local maxima to use as centers of the new cluster.
* \param[out] subclusters Output vector of PersonCluster objects derived from the input cluster.
*/
void
voxel_size_ = 0.06;
vertical_ = false;
head_centroid_ = true;
+ min_fov_ = 0;
+ max_fov_ = 50;
min_height_ = 1.3;
max_height_ = 2.3;
- min_points_ = 30; // this value is adapted to the voxel size in method "compute"
- max_points_ = 5000; // this value is adapted to the voxel size in method "compute"
- dimension_limits_set_ = false;
+ min_width_ = 0.1;
+ max_width_ = 8.0;
+ updateMinMaxPoints ();
heads_minimum_distance_ = 0.3;
// set flag values for mandatory parameters:
sqrt_ground_coeffs_ = std::numeric_limits<float>::quiet_NaN();
+ ground_coeffs_set_ = false;
+ intrinsics_matrix_set_ = false;
person_classifier_set_flag_ = false;
+
+ // set other flags
+ transformation_set_ = false;
}
template <typename PointT> void
cloud_ = cloud;
}
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::setTransformation (const Eigen::Matrix3f& transformation)
+{
+ if (!transformation.isUnitary())
+ {
+ PCL_ERROR ("[pcl::people::GroundBasedPeopleDetectionApp::setCloudTransform] The cloud transformation matrix must be an orthogonal matrix!\n");
+ }
+
+ transformation_ = transformation;
+ transformation_set_ = true;
+ applyTransformationGround();
+ applyTransformationIntrinsics();
+}
+
template <typename PointT> void
pcl::people::GroundBasedPeopleDetectionApp<PointT>::setGround (Eigen::VectorXf& ground_coeffs)
{
ground_coeffs_ = ground_coeffs;
+ ground_coeffs_set_ = true;
sqrt_ground_coeffs_ = (ground_coeffs - Eigen::Vector4f(0.0f, 0.0f, 0.0f, ground_coeffs(3))).norm();
+ applyTransformationGround();
}
template <typename PointT> void
pcl::people::GroundBasedPeopleDetectionApp<PointT>::setVoxelSize (float voxel_size)
{
voxel_size_ = voxel_size;
+ updateMinMaxPoints ();
}
template <typename PointT> void
pcl::people::GroundBasedPeopleDetectionApp<PointT>::setIntrinsics (Eigen::Matrix3f intrinsics_matrix)
{
intrinsics_matrix_ = intrinsics_matrix;
+ intrinsics_matrix_set_ = true;
+ applyTransformationIntrinsics();
}
template <typename PointT> void
person_classifier_set_flag_ = true;
}
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::setFOV (float min_fov, float max_fov)
+{
+ min_fov_ = min_fov;
+ max_fov_ = max_fov;
+}
+
template <typename PointT> void
pcl::people::GroundBasedPeopleDetectionApp<PointT>::setSensorPortraitOrientation (bool vertical)
{
vertical_ = vertical;
}
-template <typename PointT> void
-pcl::people::GroundBasedPeopleDetectionApp<PointT>::setHeightLimits (float min_height, float max_height)
+template<typename PointT>
+void pcl::people::GroundBasedPeopleDetectionApp<PointT>::updateMinMaxPoints ()
{
- min_height_ = min_height;
- max_height_ = max_height;
+ min_points_ = (int) (min_height_ * min_width_ / voxel_size_ / voxel_size_);
+ max_points_ = (int) (max_height_ * max_width_ / voxel_size_ / voxel_size_);
}
template <typename PointT> void
-pcl::people::GroundBasedPeopleDetectionApp<PointT>::setDimensionLimits (int min_points, int max_points)
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::setPersonClusterLimits (float min_height, float max_height, float min_width, float max_width)
{
- min_points_ = min_points;
- max_points_ = max_points;
- dimension_limits_set_ = true;
+ min_height_ = min_height;
+ max_height_ = max_height;
+ min_width_ = min_width;
+ max_width_ = max_width;
+ updateMinMaxPoints ();
}
template <typename PointT> void
}
template <typename PointT> void
-pcl::people::GroundBasedPeopleDetectionApp<PointT>::getHeightLimits (float& min_height, float& max_height)
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::getPersonClusterLimits (float& min_height, float& max_height, float& min_width, float& max_width)
{
min_height = min_height_;
max_height = max_height_;
+ min_width = min_width_;
+ max_width = max_width_;
}
template <typename PointT> void
template <typename PointT> Eigen::VectorXf
pcl::people::GroundBasedPeopleDetectionApp<PointT>::getGround ()
{
- if (sqrt_ground_coeffs_ != sqrt_ground_coeffs_)
+ if (!ground_coeffs_set_)
{
PCL_ERROR ("[pcl::people::GroundBasedPeopleDetectionApp::getGround] Floor parameters have not been set or they are not valid!\n");
}
return (ground_coeffs_);
}
+template <typename PointT> typename pcl::people::GroundBasedPeopleDetectionApp<PointT>::PointCloudPtr
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::getFilteredCloud ()
+{
+ return (cloud_filtered_);
+}
+
template <typename PointT> typename pcl::people::GroundBasedPeopleDetectionApp<PointT>::PointCloudPtr
pcl::people::GroundBasedPeopleDetectionApp<PointT>::getNoGroundCloud ()
{
output_cloud->height = input_cloud->height;
pcl::RGB rgb_point;
- for (int j = 0; j < input_cloud->width; j++)
+ for (uint32_t j = 0; j < input_cloud->width; j++)
{
- for (int i = 0; i < input_cloud->height; i++)
+ for (uint32_t i = 0; i < input_cloud->height; i++)
{
rgb_point.r = (*input_cloud)(j,i).r;
rgb_point.g = (*input_cloud)(j,i).g;
output_cloud->points.resize(cloud->height*cloud->width);
output_cloud->width = cloud->height;
output_cloud->height = cloud->width;
- for (int i = 0; i < cloud->width; i++)
+ for (uint32_t i = 0; i < cloud->width; i++)
{
- for (int j = 0; j < cloud->height; j++)
+ for (uint32_t j = 0; j < cloud->height; j++)
{
(*output_cloud)(j,i) = (*cloud)(cloud->width - i - 1, j);
}
cloud = output_cloud;
}
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::applyTransformationPointCloud ()
+{
+ if (transformation_set_)
+ {
+ Eigen::Transform<float, 3, Eigen::Affine> transform;
+ transform = transformation_;
+ pcl::transformPointCloud(*cloud_, *cloud_, transform);
+ }
+}
+
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::applyTransformationGround ()
+{
+ if (transformation_set_ && ground_coeffs_set_)
+ {
+ Eigen::Transform<float, 3, Eigen::Affine> transform;
+ transform = transformation_;
+ ground_coeffs_transformed_ = transform.matrix() * ground_coeffs_;
+ }
+ else
+ {
+ ground_coeffs_transformed_ = ground_coeffs_;
+ }
+}
+
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::applyTransformationIntrinsics ()
+{
+ if (transformation_set_ && intrinsics_matrix_set_)
+ {
+ intrinsics_matrix_transformed_ = intrinsics_matrix_ * transformation_.transpose();
+ }
+ else
+ {
+ intrinsics_matrix_transformed_ = intrinsics_matrix_;
+ }
+}
+
+template <typename PointT> void
+pcl::people::GroundBasedPeopleDetectionApp<PointT>::filter ()
+{
+ cloud_filtered_ = PointCloudPtr (new PointCloud);
+ pcl::VoxelGrid<PointT> grid;
+ grid.setInputCloud(cloud_);
+ grid.setLeafSize(voxel_size_, voxel_size_, voxel_size_);
+ grid.setFilterFieldName("z");
+ grid.setFilterLimits(min_fov_, max_fov_);
+ grid.filter(*cloud_filtered_);
+}
+
template <typename PointT> bool
pcl::people::GroundBasedPeopleDetectionApp<PointT>::compute (std::vector<pcl::people::PersonCluster<PointT> >& clusters)
{
// Check if all mandatory variables have been set:
- if (sqrt_ground_coeffs_ != sqrt_ground_coeffs_)
+ if (!ground_coeffs_set_)
{
PCL_ERROR ("[pcl::people::GroundBasedPeopleDetectionApp::compute] Floor parameters have not been set or they are not valid!\n");
return (false);
PCL_ERROR ("[pcl::people::GroundBasedPeopleDetectionApp::compute] Input cloud has not been set!\n");
return (false);
}
- if (intrinsics_matrix_(0) == 0)
+ if (!intrinsics_matrix_set_)
{
PCL_ERROR ("[pcl::people::GroundBasedPeopleDetectionApp::compute] Camera intrinsic parameters have not been set!\n");
return (false);
return (false);
}
- if (!dimension_limits_set_) // if dimension limits have not been set by the user
- {
- // Adapt thresholds for clusters points number to the voxel size:
- max_points_ = int(float(max_points_) * std::pow(0.06/voxel_size_, 2));
- if (voxel_size_ > 0.06)
- min_points_ = int(float(min_points_) * std::pow(0.06/voxel_size_, 2));
- }
-
// Fill rgb image:
rgb_image_->points.clear(); // clear RGB pointcloud
extractRGBFromPointCloud(cloud_, rgb_image_); // fill RGB pointcloud
-
+
// Downsample of sampling_factor in every dimension:
if (sampling_factor_ != 1)
{
cloud_downsampled->height = (cloud_->height)/sampling_factor_;
cloud_downsampled->points.resize(cloud_downsampled->height*cloud_downsampled->width);
cloud_downsampled->is_dense = cloud_->is_dense;
- for (int j = 0; j < cloud_downsampled->width; j++)
+ for (uint32_t j = 0; j < cloud_downsampled->width; j++)
{
- for (int i = 0; i < cloud_downsampled->height; i++)
+ for (uint32_t i = 0; i < cloud_downsampled->height; i++)
{
(*cloud_downsampled)(j,i) = (*cloud_)(sampling_factor_*j,sampling_factor_*i);
}
(*cloud_) = (*cloud_downsampled);
}
- // Voxel grid filtering:
- PointCloudPtr cloud_filtered(new PointCloud);
- pcl::VoxelGrid<PointT> voxel_grid_filter_object;
- voxel_grid_filter_object.setInputCloud(cloud_);
- voxel_grid_filter_object.setLeafSize (voxel_size_, voxel_size_, voxel_size_);
- voxel_grid_filter_object.filter (*cloud_filtered);
+ applyTransformationPointCloud();
+
+ filter();
// Ground removal and update:
pcl::IndicesPtr inliers(new std::vector<int>);
- boost::shared_ptr<pcl::SampleConsensusModelPlane<PointT> > ground_model(new pcl::SampleConsensusModelPlane<PointT>(cloud_filtered));
- ground_model->selectWithinDistance(ground_coeffs_, voxel_size_, *inliers);
+ boost::shared_ptr<pcl::SampleConsensusModelPlane<PointT> > ground_model(new pcl::SampleConsensusModelPlane<PointT>(cloud_filtered_));
+ ground_model->selectWithinDistance(ground_coeffs_transformed_, 2 * voxel_size_, *inliers);
no_ground_cloud_ = PointCloudPtr (new PointCloud);
pcl::ExtractIndices<PointT> extract;
- extract.setInputCloud(cloud_filtered);
+ extract.setInputCloud(cloud_filtered_);
extract.setIndices(inliers);
extract.setNegative(true);
extract.filter(*no_ground_cloud_);
if (inliers->size () >= (300 * 0.06 / voxel_size_ / std::pow (static_cast<double> (sampling_factor_), 2)))
- ground_model->optimizeModelCoefficients (*inliers, ground_coeffs_, ground_coeffs_);
+ ground_model->optimizeModelCoefficients (*inliers, ground_coeffs_transformed_, ground_coeffs_transformed_);
else
PCL_INFO ("No groundplane update!\n");
typename pcl::search::KdTree<PointT>::Ptr tree (new pcl::search::KdTree<PointT>);
tree->setInputCloud(no_ground_cloud_);
pcl::EuclideanClusterExtraction<PointT> ec;
- ec.setClusterTolerance(2 * 0.06);
+ ec.setClusterTolerance(2 * voxel_size_);
ec.setMinClusterSize(min_points_);
ec.setMaxClusterSize(max_points_);
ec.setSearchMethod(tree);
// Head based sub-clustering //
pcl::people::HeadBasedSubclustering<PointT> subclustering;
subclustering.setInputCloud(no_ground_cloud_);
- subclustering.setGround(ground_coeffs_);
+ subclustering.setGround(ground_coeffs_transformed_);
subclustering.setInitialClusters(cluster_indices);
subclustering.setHeightLimits(min_height_, max_height_);
subclustering.setMinimumDistanceBetweenHeads(heads_minimum_distance_);
for(typename std::vector<pcl::people::PersonCluster<PointT> >::iterator it = clusters.begin(); it != clusters.end(); ++it)
{
//Evaluate confidence for the current PersonCluster:
- Eigen::Vector3f centroid = intrinsics_matrix_ * (it->getTCenter());
+ Eigen::Vector3f centroid = intrinsics_matrix_transformed_ * (it->getTCenter());
centroid /= centroid(2);
- Eigen::Vector3f top = intrinsics_matrix_ * (it->getTTop());
+ Eigen::Vector3f top = intrinsics_matrix_transformed_ * (it->getTTop());
top /= top(2);
- Eigen::Vector3f bottom = intrinsics_matrix_ * (it->getTBottom());
+ Eigen::Vector3f bottom = intrinsics_matrix_transformed_ * (it->getTBottom());
bottom /= bottom(2);
it->setPersonConfidence(person_classifier_.evaluate(rgb_image_, bottom, top, centroid, vertical_));
}
index = int((p->x - cluster.getMin()(0)) / bin_size_);
else // camera vertical
index = int((p->y - cluster.getMin()(1)) / bin_size_);
- if(index > (buckets_.size() - 1))
+ if (index > (static_cast<int> (buckets_.size ()) - 1))
std::cout << "Error: out of array - " << index << " of " << buckets_.size() << std::endl;
else
{
// Main loop:
int i = 1;
- while(i < (buckets_.size()-1))
+ while (i < (static_cast<int> (buckets_.size()) - 1))
{
right = buckets_[i+1];
if ((buckets_[i] > left) && (buckets_[i] > right))
int c1, c2, f1, f2;
PointT g1, g2, g3, g4;
float w1, w2;
- for (unsigned int i = 0; i < height; i++) // for every row
+ for (int i = 0; i < height; i++) // for every row
{
- for (unsigned int j = 0; j < width; j++) // for every column
+ for (int j = 0; j < width; j++) // for every column
{
A = T_inv * Eigen::Vector3f(i, j, 1);
c1 = ceil(A(0));
if ( (f1 < 0) ||
(c1 < 0) ||
- (f1 >= input_image->height) ||
- (c1 >= input_image->height) ||
+ (f1 >= static_cast<int> (input_image->height)) ||
+ (c1 >= static_cast<int> (input_image->height)) ||
(f2 < 0) ||
(c2 < 0) ||
- (f2 >= input_image->width) ||
- (c2 >= input_image->width))
+ (f2 >= static_cast<int> (input_image->width)) ||
+ (c2 >= static_cast<int> (input_image->width)))
{ // if out of range, continue
continue;
}
int y_start_out = std::max(0, -ymin);
//int y_end_out = y_start_out + (y_end_in - y_start_in);
- for (unsigned int i = 0; i < (y_end_in - y_start_in + 1); i++)
+ for (int i = 0; i < (y_end_in - y_start_in + 1); i++)
{
- for (unsigned int j = 0; j < (x_end_in - x_start_in + 1); j++)
- {
- (*output_image)(x_start_out + j, y_start_out + i) = (*input_image)(x_start_in + j, y_start_in + i);
- }
+ for (int j = 0; j < (x_end_in - x_start_in + 1); j++)
+ {
+ (*output_image)(x_start_out + j, y_start_out + i) = (*input_image)(x_start_in + j, y_start_in + i);
+ }
}
}
// Convert the image to array of float:
float* sample_float = new float[sample->width * sample->height * 3];
int delta = sample->height * sample->width;
- for(int row = 0; row < sample->height; row++)
+ for (uint32_t row = 0; row < sample->height; row++)
{
- for(int col = 0; col < sample->width; col++)
+ for (uint32_t col = 0; col < sample->width; col++)
{
sample_float[row + sample->height * col] = ((float) ((*sample)(col, row).r))/255; //ptr[col * 3 + 2];
sample_float[row + sample->height * col + delta] = ((float) ((*sample)(col, row).g))/255; //ptr[col * 3 + 1];
/**
* \brief Draws the theoretical 3D bounding box of the cluster in the PCL visualizer.
* \param[in] viewer PCL visualizer.
- * \param[in] person_numbers progressive number representing the person.
+ * \param[in] person_number progressive number representing the person.
*/
void
drawTBoundingBox (pcl::visualization::PCLVisualizer& viewer, int person_number);
// Select descriptor of internal part of the image (remove borders):
int k = 0;
- for (unsigned int l = 0; l < (n_orients_ * 4); l++)
+ for (int l = 0; l < (n_orients_ * 4); l++)
{
- for (unsigned int j = 1; j < (w_ / bin_size_ - 1); j++)
+ for (int j = 1; j < (w_ / bin_size_ - 1); j++)
{
- for (unsigned int i = 1; i < (h_ / bin_size_ - 1); i++)
+ for (int i = 1; i < (h_ / bin_size_ - 1); i++)
{
descriptor[k] = G[i + j * h_ / bin_size_ + l * (h_ / bin_size_) * (w_ / bin_size_)];
k++;
set(SUBSYS_DEPS common io search kdtree octree features filters registration sample_consensus)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(LINEMOD_INCLUDES
- include/pcl/${SUBSYS_NAME}/linemod/line_rgbd.h
+ "include/pcl/${SUBSYS_NAME}/linemod/line_rgbd.h"
)
set(LINEMOD_IMPLS
- include/pcl/${SUBSYS_NAME}/impl/linemod/line_rgbd.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/linemod/line_rgbd.hpp"
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/color_gradient_dot_modality.h
- include/pcl/${SUBSYS_NAME}/color_gradient_modality.h
- include/pcl/${SUBSYS_NAME}/color_modality.h
- include/pcl/${SUBSYS_NAME}/crh_alignment.h
- include/pcl/${SUBSYS_NAME}/linemod.h
- include/pcl/${SUBSYS_NAME}/dotmod.h
- include/pcl/${SUBSYS_NAME}/quantizable_modality.h
- include/pcl/${SUBSYS_NAME}/quantized_map.h
- include/pcl/${SUBSYS_NAME}/dot_modality.h
- include/pcl/${SUBSYS_NAME}/region_xy.h
- include/pcl/${SUBSYS_NAME}/mask_map.h
- include/pcl/${SUBSYS_NAME}/point_types.h
- include/pcl/${SUBSYS_NAME}/distance_map.h
- include/pcl/${SUBSYS_NAME}/dense_quantized_multi_mod_template.h
- include/pcl/${SUBSYS_NAME}/sparse_quantized_multi_mod_template.h
- include/pcl/${SUBSYS_NAME}/surface_normal_modality.h
- include/pcl/${SUBSYS_NAME}/linemod/line_rgbd.h
- include/pcl/${SUBSYS_NAME}/implicit_shape_model.h
- include/pcl/${SUBSYS_NAME}/ransac_based/auxiliary.h
- include/pcl/${SUBSYS_NAME}/ransac_based/hypothesis.h
- include/pcl/${SUBSYS_NAME}/ransac_based/model_library.h
- include/pcl/${SUBSYS_NAME}/ransac_based/rigid_transform_space.h
- include/pcl/${SUBSYS_NAME}/ransac_based/obj_rec_ransac.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_graph.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree_zprojection.h
- include/pcl/${SUBSYS_NAME}/ransac_based/trimmed_icp.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree.h
- include/pcl/${SUBSYS_NAME}/ransac_based/simple_octree.h
- include/pcl/${SUBSYS_NAME}/ransac_based/voxel_structure.h
- include/pcl/${SUBSYS_NAME}/ransac_based/bvh.h
-
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/color_gradient_dot_modality.h"
+ "include/pcl/${SUBSYS_NAME}/color_gradient_modality.h"
+ "include/pcl/${SUBSYS_NAME}/color_modality.h"
+ "include/pcl/${SUBSYS_NAME}/crh_alignment.h"
+ "include/pcl/${SUBSYS_NAME}/linemod.h"
+ "include/pcl/${SUBSYS_NAME}/dotmod.h"
+ "include/pcl/${SUBSYS_NAME}/quantizable_modality.h"
+ "include/pcl/${SUBSYS_NAME}/quantized_map.h"
+ "include/pcl/${SUBSYS_NAME}/dot_modality.h"
+ "include/pcl/${SUBSYS_NAME}/region_xy.h"
+ "include/pcl/${SUBSYS_NAME}/mask_map.h"
+ "include/pcl/${SUBSYS_NAME}/point_types.h"
+ "include/pcl/${SUBSYS_NAME}/distance_map.h"
+ "include/pcl/${SUBSYS_NAME}/dense_quantized_multi_mod_template.h"
+ "include/pcl/${SUBSYS_NAME}/sparse_quantized_multi_mod_template.h"
+ "include/pcl/${SUBSYS_NAME}/surface_normal_modality.h"
+ "include/pcl/${SUBSYS_NAME}/linemod/line_rgbd.h"
+ "include/pcl/${SUBSYS_NAME}/implicit_shape_model.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/auxiliary.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/hypothesis.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/model_library.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/rigid_transform_space.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/obj_rec_ransac.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_graph.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree_zprojection.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/trimmed_icp.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/simple_octree.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/voxel_structure.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/bvh.h"
)
- set (ransac_based_incs
- include/pcl/${SUBSYS_NAME}/ransac_based/auxiliary.h
- include/pcl/${SUBSYS_NAME}/ransac_based/hypothesis.h
- include/pcl/${SUBSYS_NAME}/ransac_based/model_library.h
- include/pcl/${SUBSYS_NAME}/ransac_based/rigid_transform_space.h
- include/pcl/${SUBSYS_NAME}/ransac_based/obj_rec_ransac.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_graph.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree_zprojection.h
- include/pcl/${SUBSYS_NAME}/ransac_based/trimmed_icp.h
- include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree.h
- include/pcl/${SUBSYS_NAME}/ransac_based/simple_octree.h
- include/pcl/${SUBSYS_NAME}/ransac_based/voxel_structure.h
- include/pcl/${SUBSYS_NAME}/ransac_based/bvh.h
+ set(ransac_based_incs
+ "include/pcl/${SUBSYS_NAME}/ransac_based/auxiliary.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/hypothesis.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/model_library.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/rigid_transform_space.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/obj_rec_ransac.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_graph.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree_zprojection.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/trimmed_icp.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/orr_octree.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/simple_octree.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/voxel_structure.h"
+ "include/pcl/${SUBSYS_NAME}/ransac_based/bvh.h"
)
-
set(hv_incs
- include/pcl/${SUBSYS_NAME}/hv/occlusion_reasoning.h
- include/pcl/${SUBSYS_NAME}/hv/hypotheses_verification.h
- include/pcl/${SUBSYS_NAME}/hv/hv_papazov.h
- include/pcl/${SUBSYS_NAME}/hv/hv_go.h
- include/pcl/${SUBSYS_NAME}/hv/greedy_verification.h
- )
-
+ "include/pcl/${SUBSYS_NAME}/hv/occlusion_reasoning.h"
+ "include/pcl/${SUBSYS_NAME}/hv/hypotheses_verification.h"
+ "include/pcl/${SUBSYS_NAME}/hv/hv_papazov.h"
+ "include/pcl/${SUBSYS_NAME}/hv/hv_go.h"
+ "include/pcl/${SUBSYS_NAME}/hv/greedy_verification.h"
+ )
+
set(cg_incs
- include/pcl/${SUBSYS_NAME}/cg/correspondence_grouping.h
- include/pcl/${SUBSYS_NAME}/cg/hough_3d.h
- include/pcl/${SUBSYS_NAME}/cg/geometric_consistency.h
+ "include/pcl/${SUBSYS_NAME}/cg/correspondence_grouping.h"
+ "include/pcl/${SUBSYS_NAME}/cg/hough_3d.h"
+ "include/pcl/${SUBSYS_NAME}/cg/geometric_consistency.h"
)
-
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/linemod/line_rgbd.hpp
- include/pcl/${SUBSYS_NAME}/impl/ransac_based/simple_octree.hpp
- include/pcl/${SUBSYS_NAME}/impl/ransac_based/voxel_structure.hpp
- include/pcl/${SUBSYS_NAME}/impl/implicit_shape_model.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/linemod/line_rgbd.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ransac_based/simple_octree.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ransac_based/voxel_structure.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/implicit_shape_model.hpp"
)
-
- set(ransac_based_impl_incs
- include/pcl/${SUBSYS_NAME}/impl/ransac_based/simple_octree.hpp
- include/pcl/${SUBSYS_NAME}/impl/ransac_based/voxel_structure.hpp
+ set(ransac_based_impl_incs
+ "include/pcl/${SUBSYS_NAME}/impl/ransac_based/simple_octree.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ransac_based/voxel_structure.hpp"
)
-
set(hv_impl_incs
- include/pcl/${SUBSYS_NAME}/impl/hv/occlusion_reasoning.hpp
- include/pcl/${SUBSYS_NAME}/impl/hv/hv_papazov.hpp
- include/pcl/${SUBSYS_NAME}/impl/hv/greedy_verification.hpp
- include/pcl/${SUBSYS_NAME}/impl/hv/hv_go.hpp
- )
-
+ "include/pcl/${SUBSYS_NAME}/impl/hv/occlusion_reasoning.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/hv/hv_papazov.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/hv/greedy_verification.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/hv/hv_go.hpp"
+ )
+
set(cg_impl_incs
- include/pcl/${SUBSYS_NAME}/impl/cg/correspondence_grouping.hpp
- include/pcl/${SUBSYS_NAME}/impl/cg/hough_3d.hpp
- include/pcl/${SUBSYS_NAME}/impl/cg/geometric_consistency.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/cg/correspondence_grouping.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/cg/hough_3d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/cg/geometric_consistency.hpp"
)
set(srcs
src/implicit_shape_model.cpp
)
- set(metslib_incs
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/abstract-search.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/local-search.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/mets.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/metslib_config.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/model.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/observer.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/simulated-annealing.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/tabu-search.hh
- include/pcl/${SUBSYS_NAME}/3rdparty/metslib/termination-criteria.hh
- )
+ if (HAVE_METSLIB)
+ set(metslib_incs "")
+ else(HAVE_METSLIB)
+ set(metslib_incs
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/abstract-search.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/local-search.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/mets.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/metslib_config.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/model.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/observer.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/simulated-annealing.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/tabu-search.hh"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/metslib/termination-criteria.hh"
+ )
+ endif(HAVE_METSLIB)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs} ${ransac_based_incs} ${ransac_based_impl_incs} ${hv_incs} ${hv_impl_incs} ${cg_incs} ${cg_impl_incs} ${metslib_incs})
- target_link_libraries(${LIB_NAME} pcl_common pcl_kdtree pcl_octree pcl_search pcl_features pcl_registration pcl_sample_consensus pcl_filters pcl_io)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs} ${ransac_based_incs} ${ransac_based_impl_incs} ${hv_incs} ${hv_impl_incs} ${cg_incs} ${cg_impl_incs} ${metslib_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_kdtree pcl_octree pcl_search pcl_features pcl_registration pcl_sample_consensus pcl_filters pcl_io)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/ransac_based ${ransac_based_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/hv ${hv_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/cg ${cg_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/ransac_based" ${ransac_based_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/hv" ${hv_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/cg" ${cg_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl/ransac_based ${ransac_based_impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl/hv ${hv_impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl/cg ${cg_impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/linemod ${LINEMOD_INCLUDES})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl/linemod ${LINEMOD_IMPLS})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl/ransac_based" ${ransac_based_impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl/hv" ${hv_impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl/cg" ${cg_impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/linemod" ${LINEMOD_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl/linemod" ${LINEMOD_IMPLS})
endif(build)
void
clusterCorrespondences (std::vector<Correspondences> &model_instances);
- ///** \brief Finds the transformation matrix between the input and the scene cloud for a set of correspondences using a RANSAC algorithm.
- // *
- // * \param[in] the scene cloud in which the PointSceneT has been converted to PointModelT.
- // * \param[in] corrs a set of correspondences.
- // * \param[out] transform the transformation matrix between the input cloud and the scene cloud that aligns the found correspondences.
- // * \return true if the recognition had been successful or false if errors have occurred.
- // */
+ /* \brief Finds the transformation matrix between the input and the scene cloud for a set of correspondences using a RANSAC algorithm.
+ * \param[in] the scene cloud in which the PointSceneT has been converted to PointModelT.
+ * \param[in] corrs a set of correspondences.
+ * \param[out] transform the transformation matrix between the input cloud and the scene cloud that aligns the found correspondences.
+ * \return true if the recognition had been successful or false if errors have occurred.
+ */
//bool
//getTransformMatrix (const PointCloudConstPtr &scene_cloud, const Correspondences &corrs, Eigen::Matrix4f &transform);
/** \brief The Hough space voting procedure.
- *
* \return true if the voting had been successful or false if errors have occurred.
*/
bool
houghVoting ();
/** \brief Computes the reference frame for an input cloud.
- *
* \param[in] input the input cloud.
* \param[out] rf the resulting reference frame.
*/
/** \brief Operator for comparing to candidates (by magnitude of the gradient).
* \param[in] rhs the candidate to compare with.
*/
- bool operator< (const Candidate & rhs)
+ bool operator< (const Candidate & rhs) const
{
return (gradient.magnitude > rhs.gradient.magnitude);
}
* \param[in] mask defines the areas where features are searched in.
* \param[in] nr_features defines the number of features to be extracted
* (might be less if not sufficient information is present in the modality).
- * \param[in] modality_index the index which is stored in the extracted features.
+ * \param[in] modalityIndex the index which is stored in the extracted features.
* \param[out] features the destination for the extracted features.
*/
void
/** \brief Extracts all possible features from the modality within the specified mask.
* \param[in] mask defines the areas where features are searched in.
* \param[in] nr_features IGNORED (TODO: remove this parameter).
- * \param[in] modality_index the index which is stored in the extracted features.
+ * \param[in] modalityIndex the index which is stored in the extracted features.
* \param[out] features the destination for the extracted features.
*/
void
}
/** \brief returns the computed transformations
- * \param[out] transformations
+ * \param[out] transforms transformations
*/
void getTransforms(std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > & transforms) {
transforms = transforms_;
}
/** \brief sets model and input views
- * \param[in] model view
* \param[in] input_view
+ * \param[in] target_view
*/
void
setInputAndTargetView (PointTPtr & input_view, PointTPtr & target_view)
}
/** \brief Computes the roll angle that aligns input to modle.
- * \param[in] CRH histogram of the input cloud
- * \param[in] CRH histogram of the target cloud
- * \param[out] Vector containing angles where the histograms correlate
+ * \param[in] input_ftt CRH histogram of the input cloud
+ * \param[in] target_ftt CRH histogram of the target cloud
+ * \param[out] peaks Vector containing angles where the histograms correlate
*/
void
computeRollAngle (pcl::PointCloud<pcl::Histogram<nbins_> > & input_ftt, pcl::PointCloud<pcl::Histogram<nbins_> > & target_ftt,
virtual ~DOTMOD ();
/** \brief Creates a template from the specified data and adds it to the matching queue.
- * \param
- * \param
- * \param
+ * \param modalities
+ * \param masks
+ * \param template_anker_x
+ * \param template_anker_y
+ * \param region
*/
size_t
createAndAddTemplate (const std::vector<DOTModality*> & modalities,
public:
/** \brief Constructor
- * \param[in] Regularizer value
+ * \param[in] reg Regularizer value
**/
GreedyVerification (float reg = 1.5f) :
HypothesisVerification<ModelT, SceneT> ()
#include <pcl/pcl_macros.h>
#include <pcl/recognition/hv/hypotheses_verification.h>
#include <pcl/common/common.h>
-#include "pcl/recognition/3rdparty/metslib/mets.hh"
+#include "metslib/mets.hh"
#include <pcl/features/normal_3d.h>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
* POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef PCL_RECOGNITION_IMPL_HV_GO_HPP_
+#define PCL_RECOGNITION_IMPL_HV_GO_HPP_
+
#include <pcl/recognition/hv/hv_go.h>
#include <numeric>
#include <pcl/common/time.h>
}
#define PCL_INSTANTIATE_GoHV(T1,T2) template class PCL_EXPORTS pcl::GlobalHypothesesVerification<T1,T2>;
+
+#endif /* PCL_RECOGNITION_IMPL_HV_GO_HPP_ */
+
std::vector<unsigned int> vec;
trained_model->clusters_.resize (number_of_clusters_, vec);
- for (int i_label = 0; i_label < locations.size (); i_label++)
+ for (size_t i_label = 0; i_label < locations.size (); i_label++)
trained_model->clusters_[labels (i_label)].push_back (i_label);
calculateSigmas (trained_model->sigmas_);
trained_model->directions_to_center_.resize (locations.size (), 3);
trained_model->classes_.resize (locations.size ());
- for (int i_dir = 0; i_dir < locations.size (); i_dir++)
+ for (size_t i_dir = 0; i_dir < locations.size (); i_dir++)
{
trained_model->directions_to_center_(i_dir, 0) = locations[i_dir].dir_to_center_.x;
trained_model->directions_to_center_(i_dir, 1) = locations[i_dir].dir_to_center_.y;
{
unsigned int index = model->clusters_[min_dist_idx][i_word];
unsigned int i_class = model->classes_[index];
- if (i_class != in_class_of_interest)
+ if (static_cast<int> (i_class) != in_class_of_interest)
continue;//skip this class
//rotate dir to center as needed
n_vot_2.resize (number_of_clusters_, vect);
n_vot.resize (number_of_clusters_, 0);
n_ftr.resize (number_of_classes, 0);
- for (int i_location = 0; i_location < locations.size (); i_location++)
+ for (size_t i_location = 0; i_location < locations.size (); i_location++)
{
int i_class = training_classes_[locations[i_location].model_num_];
int i_cluster = labels (i_location);
// Search for extension
std::string chunk_name (ltm_header.file_name);
- std::transform (chunk_name.begin (), chunk_name.end (), chunk_name.begin (), tolower);
+ std::transform (chunk_name.begin (), chunk_name.end (), chunk_name.begin (), ::tolower);
std::string::size_type it;
if ((it = chunk_name.find (pcd_ext)) != std::string::npos &&
* \param[out] out_peaks it will contain the strongest peaks
* \param[in] in_class_id class of interest for which peaks are evaluated
* \param[in] in_non_maxima_radius non maxima supression radius. The shapes radius is recommended for this value.
+ * \param in_sigma
*/
void
findStrongestPeaks (std::vector<ISMPeak, Eigen::aligned_allocator<ISMPeak> > &out_peaks, int in_class_id, double in_non_maxima_radius, double in_sigma);
/** \brief This method performs training and forms a visual vocabulary. It returns a trained model that
* can be saved to file for later usage.
- * \param[out] model trained model
+ * \param[out] trained_model trained model
*/
bool
trainISM (ISMModelPtr& trained_model);
/** \brief This method performs descriptor clustering.
* \param[in] histograms descriptors to cluster
* \param[out] labels it contains labels for each descriptor
- * \param[out] cluster_centers stores the centers of clusters
+ * \param[out] clusters_centers stores the centers of clusters
*/
bool
clusterDescriptors (std::vector< pcl::Histogram<FeatureSize> >& histograms, Eigen::MatrixXi& labels, Eigen::MatrixXf& clusters_centers);
/** \brief This function forms a visual vocabulary and evaluates weights
* described in [Knopp et al., 2010, (5)].
- * \param[in] classes classes that we want to learn
* \param[in] locations array containing description of each keypoint: its position, which cloud belongs
* and expected direction to center
* \param[in] labels labels that were obtained during k-means clustering
/** \brief This method estimates features for the given point cloud.
* \param[in] sampled_point_cloud sampled point cloud for which the features must be computed
- * \param[in] point_cloud original point cloud
* \param[in] normal_cloud normals for the original point cloud
* \param[out] feature_cloud it will store the computed histograms (features) for the given cloud
*/
void
loadTemplates (const char * file_name);
+ /** \brief Loads templates from the specified files.
+ * \param[in] file_names vector of files to load the templates from.
+ */
+
+ void
+ loadTemplates (std::vector<std::string> & file_names);
+
/** \brief Serializes the stored templates to the specified stream.
* \param[in] stream the stream the templates will be written to.
*/
* SparseQuantizedMultiModTemplate format.
*
* \param[in] file_name The name of the file that stores the templates.
+ * \param object_id
*
* \return true, if the operation was successful, false otherwise.
*/
}
/** \brief Creates a template from the specified data and adds it to the matching queue.
+ * \param cloud
+ * \param object_id
* \param[in] mask_xyz the mask that determine which parts of the xyz-modality are used for creating the template.
* \param[in] mask_rgb the mask that determine which parts of the rgb-modality are used for creating the template.
* \param[in] region the region which will be associated with the template (can be larger than the actual modality-maps).
removeOverlappingDetections ();
/** \brief Computes the volume of the intersection between two bounding boxes.
- * \param[in] First bounding box.
- * \param[in] Second bounding box.
+ * \param[in] box1 First bounding box.
+ * \param[in] box2 Second bounding box.
*/
static float
computeBoundingBoxIntersectionVolume (const BoundingBoxXYZ &box1, const BoundingBoxXYZ &box2);
a[1] = -a[1];
a[2] = -a[2];
}
-
+
+ /** \brief a = b */
+ template <typename T> bool
+ equal3 (const T a[3], const T b[3])
+ {
+ return (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]);
+ }
+
/** \brief a += b */
template <typename T> void
add3 (T a[3], const T b[3])
max_coplanarity_angle_ = max_coplanarity_angle_degrees*AUX_DEG_TO_RADIANS;
}
- /** \biref Call this method in order NOT to add co-planar point pairs to the hash table. The default behavior
+ /** \brief Call this method in order NOT to add co-planar point pairs to the hash table. The default behavior
* is ignoring co-planar points on. */
inline void
ignoreCoplanarPointPairsOn ()
ignore_coplanar_opps_ = true;
}
- /** \biref Call this method in order to add all point pairs (co-planar as well) to the hash table. The default
+ /** \brief Call this method in order to add all point pairs (co-planar as well) to the hash table. The default
* behavior is ignoring co-planar points on. */
inline void
ignoreCoplanarPointPairsOff ()
* \param[in] points represents the model to be added.
* \param[in] normals are the normals at the model points.
* \param[in] object_name is the unique name of the object to be added.
- * \param[in] num_points_for_registration is the number of points used for fast ICP registration prior to hypothesis testing
+ * \param[in] frac_of_points_for_registration is the number of points used for fast ICP registration prior to hypothesis testing
* \param[in] user_data is a pointer to some data (can be NULL)
*
* Returns true if model successfully added and false otherwise (e.g., if object_name is not unique). */
}
/** \brief Computes the signature of the oriented point pair ((p1, n1), (p2, n2)) consisting of the angles between
- * n1 and (p2-p1),
- * n2 and (p1-p2),
- * n1 and n2
- *
+ * \param p1
+ * \param n1
+ * \param p2
+ * \param n2
* \param[out] signature is an array of three doubles saving the three angles in the order shown above. */
static inline void
compute_oriented_point_pair_signature (const float *p1, const float *n1, const float *p2, const float *n2, float signature[3])
/** \brief Initializes the LUT.
* \param[in] range_x_arg the range of the LUT in x-direction.
* \param[in] range_y_arg the range of the LUT in y-direction.
- * \parma[in] range_z_arg the range of the LUT in z-direction.
+ * \param[in] range_z_arg the range of the LUT in z-direction.
*/
void
initializeLUT (const int range_x_arg, const int range_y_arg, const int range_z_arg)
* \param[in] rhs the candidate to compare with.
*/
bool
- operator< (const Candidate & rhs)
+ operator< (const Candidate & rhs) const
{
return (distance > rhs.distance);
}
*
* Implements section 2.6 "Extension to Dense Depth Sensors."
*
- * \param[in] src The source 16-bit depth image (in mm).
- * \param[out] dst The destination 8-bit image. Each bit represents one bin of
- * the view cone.
- * \param distance_threshold Ignore pixels beyond this distance.
- * \param difference_threshold When computing normals, ignore contributions of pixels whose
- * depth difference with the central pixel is above this threshold.
- *
* \todo Should also need camera model, or at least focal lengths? Replace distance_threshold with mask?
*/
template <typename PointInT> void
surface_normal_orientations_.resize (width, height, 0.0f);
- for (size_t row_index = 0; row_index < height; ++row_index)
+ for (int row_index = 0; row_index < height; ++row_index)
{
- for (size_t col_index = 0; col_index < width; ++col_index)
+ for (int col_index = 0; col_index < width; ++col_index)
{
const float value = input_->points[row_index*width + col_index].z;
if (pcl_isfinite (value))
map[0x1<<7] = 7;
quantized_surface_normals_.resize (width, height);
- for (size_t row_index = 0; row_index < height; ++row_index)
+ for (int row_index = 0; row_index < height; ++row_index)
{
- for (size_t col_index = 0; col_index < width; ++col_index)
+ for (int col_index = 0; col_index < width; ++col_index)
{
quantized_surface_normals_ (col_index, row_index) = map[lp_normals[row_index*width + col_index]];
}
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <pcl/point_types.h>
-#include <pcl/impl/instantiate.hpp>
-#include <pcl/recognition/hv/hv_go.h>
#include <pcl/recognition/impl/hv/hv_go.hpp>
-//template class PCL_EXPORTS pcl::GlobalHypothesesVerification<pcl::PointXYZ, pcl::PointXYZ>;
-//template class PCL_EXPORTS pcl::GlobalHypothesesVerification<pcl::PointXYZRGB, pcl::PointXYZRGB>;
-
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
PCL_INSTANTIATE_PRODUCT(GoHV, ((pcl::PointXYZ))((pcl::PointXYZ)))
PCL_INSTANTIATE_PRODUCT(GoHV, ((pcl::PointXYZRGB))((pcl::PointXYZRGB)))
PCL_INSTANTIATE_PRODUCT(GoHV, ((pcl::PointXYZRGBA))((pcl::PointXYZRGBA)))
+#endif // PCL_NO_PRECOMPILE
+
file_stream.close ();
}
+void
+pcl::LINEMOD::loadTemplates (std::vector<std::string> & file_names)
+{
+ templates_.clear ();
+
+ for(size_t i=0; i < file_names.size (); i++)
+ {
+ std::ifstream file_stream;
+ file_stream.open (file_names[i].c_str (), std::ofstream::in | std::ofstream::binary);
+
+ int nr_templates;
+ read (file_stream, nr_templates);
+ SparseQuantizedMultiModTemplate sqmm_template;
+
+ for (int template_index = 0; template_index < nr_templates; ++template_index)
+ {
+ sqmm_template.deserialize (file_stream);
+ templates_.push_back (sqmm_template);
+ }
+
+ file_stream.close ();
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::LINEMOD::serialize (std::ostream & stream) const
for ( i = 0 ; i < 8 ; ++i )
{
child = node->getChild (i);
- // We do not want to push all children -> only leaves or children with children
- if ( child->hasData () || child->hasChildren () )
+ // We do not want to push all children -> only children with children or leaves
+ if (child->hasChildren ())
+ nodes.push_back(child);
+ // only push back the child if it is not the leaf of p
+ else if (child->hasData () && !aux::equal3 (p, child->getData ()->getPoint ()))
nodes.push_back (child);
}
}
- else if ( node->hasData () )
+ // only push back the node if it is not the leaf of p
+ else if (node->hasData () && !aux::equal3<float> (p, node->getData ()->getPoint ()))
out.push_back (node); // We got a full leaf
}
}
set(SUBSYS_DEPS common octree kdtree search sample_consensus features filters)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(incs
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/boost_graph.h
- include/pcl/${SUBSYS_NAME}/convergence_criteria.h
- include/pcl/${SUBSYS_NAME}/default_convergence_criteria.h
- include/pcl/${SUBSYS_NAME}/correspondence_estimation.h
- include/pcl/${SUBSYS_NAME}/correspondence_estimation_normal_shooting.h
- include/pcl/${SUBSYS_NAME}/correspondence_estimation_backprojection.h
- include/pcl/${SUBSYS_NAME}/correspondence_estimation_organized_projection.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_distance.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_median_distance.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_surface_normal.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_features.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_one_to_one.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_poly.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_sample_consensus.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_sample_consensus_2d.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_trimmed.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_var_trimmed.h
- include/pcl/${SUBSYS_NAME}/correspondence_rejection_organized_boundary.h
- include/pcl/${SUBSYS_NAME}/correspondence_sorting.h
- include/pcl/${SUBSYS_NAME}/correspondence_types.h
- include/pcl/${SUBSYS_NAME}/ia_ransac.h
- include/pcl/${SUBSYS_NAME}/icp.h
- include/pcl/${SUBSYS_NAME}/icp_nl.h
- include/pcl/${SUBSYS_NAME}/lum.h
- include/pcl/${SUBSYS_NAME}/elch.h
- include/pcl/${SUBSYS_NAME}/ndt.h
- include/pcl/${SUBSYS_NAME}/ndt_2d.h
- include/pcl/${SUBSYS_NAME}/ppf_registration.h
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/boost_graph.h"
+ "include/pcl/${SUBSYS_NAME}/convergence_criteria.h"
+ "include/pcl/${SUBSYS_NAME}/default_convergence_criteria.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_estimation.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_estimation_normal_shooting.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_estimation_backprojection.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_estimation_organized_projection.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_distance.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_median_distance.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_surface_normal.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_features.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_one_to_one.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_poly.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_sample_consensus.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_sample_consensus_2d.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_trimmed.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_var_trimmed.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_rejection_organized_boundary.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_sorting.h"
+ "include/pcl/${SUBSYS_NAME}/correspondence_types.h"
+ "include/pcl/${SUBSYS_NAME}/ia_ransac.h"
+ "include/pcl/${SUBSYS_NAME}/icp.h"
+ "include/pcl/${SUBSYS_NAME}/joint_icp.h"
+ "include/pcl/${SUBSYS_NAME}/icp_nl.h"
+ "include/pcl/${SUBSYS_NAME}/lum.h"
+ "include/pcl/${SUBSYS_NAME}/elch.h"
+ "include/pcl/${SUBSYS_NAME}/ndt.h"
+ "include/pcl/${SUBSYS_NAME}/ndt_2d.h"
+ "include/pcl/${SUBSYS_NAME}/ppf_registration.h"
- include/pcl/${SUBSYS_NAME}/impl/pairwise_graph_registration.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/pairwise_graph_registration.hpp"
- include/pcl/${SUBSYS_NAME}/pyramid_feature_matching.h
- include/pcl/${SUBSYS_NAME}/registration.h
- include/pcl/${SUBSYS_NAME}/transforms.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_2D.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_svd.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_svd_scale.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_dual_quaternion.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_lm.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_weighted.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_lls.h
- include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_lls_weighted.h
- include/pcl/${SUBSYS_NAME}/transformation_validation.h
- include/pcl/${SUBSYS_NAME}/transformation_validation_euclidean.h
- include/pcl/${SUBSYS_NAME}/gicp.h
- include/pcl/${SUBSYS_NAME}/bfgs.h
- include/pcl/${SUBSYS_NAME}/warp_point_rigid.h
- include/pcl/${SUBSYS_NAME}/warp_point_rigid_6d.h
- include/pcl/${SUBSYS_NAME}/warp_point_rigid_3d.h
- include/pcl/${SUBSYS_NAME}/distances.h
- include/pcl/${SUBSYS_NAME}/exceptions.h
- include/pcl/${SUBSYS_NAME}/sample_consensus_prerejective.h
+ "include/pcl/${SUBSYS_NAME}/pyramid_feature_matching.h"
+ "include/pcl/${SUBSYS_NAME}/registration.h"
+ "include/pcl/${SUBSYS_NAME}/transforms.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_2D.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_svd.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_svd_scale.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_dual_quaternion.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_lm.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_weighted.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_lls.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_estimation_point_to_plane_lls_weighted.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_validation.h"
+ "include/pcl/${SUBSYS_NAME}/transformation_validation_euclidean.h"
+ "include/pcl/${SUBSYS_NAME}/gicp.h"
+ "include/pcl/${SUBSYS_NAME}/gicp6d.h"
+ "include/pcl/${SUBSYS_NAME}/bfgs.h"
+ "include/pcl/${SUBSYS_NAME}/warp_point_rigid.h"
+ "include/pcl/${SUBSYS_NAME}/warp_point_rigid_6d.h"
+ "include/pcl/${SUBSYS_NAME}/warp_point_rigid_3d.h"
+ "include/pcl/${SUBSYS_NAME}/distances.h"
+ "include/pcl/${SUBSYS_NAME}/exceptions.h"
+ "include/pcl/${SUBSYS_NAME}/sample_consensus_prerejective.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/default_convergence_criteria.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_normal_shooting.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_backprojection.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_organized_projection.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_distance.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_median_distance.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_surface_normal.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_features.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_one_to_one.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_poly.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_sample_consensus.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_sample_consensus_2d.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_trimmed.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_var_trimmed.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_organized_boundary.hpp
- include/pcl/${SUBSYS_NAME}/impl/correspondence_types.hpp
- include/pcl/${SUBSYS_NAME}/impl/ia_ransac.hpp
- include/pcl/${SUBSYS_NAME}/impl/icp.hpp
- include/pcl/${SUBSYS_NAME}/impl/icp_nl.hpp
- include/pcl/${SUBSYS_NAME}/impl/elch.hpp
- include/pcl/${SUBSYS_NAME}/impl/lum.hpp
- include/pcl/${SUBSYS_NAME}/impl/ndt.hpp
- include/pcl/${SUBSYS_NAME}/impl/ndt_2d.hpp
- include/pcl/${SUBSYS_NAME}/impl/ppf_registration.hpp
- include/pcl/${SUBSYS_NAME}/impl/pyramid_feature_matching.hpp
- include/pcl/${SUBSYS_NAME}/impl/registration.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_2D.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_svd.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_svd_scale.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_dual_quaternion.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_lm.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_lls.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_lls_weighted.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_weighted.hpp
- include/pcl/${SUBSYS_NAME}/impl/transformation_validation_euclidean.hpp
- include/pcl/${SUBSYS_NAME}/impl/gicp.hpp
- include/pcl/${SUBSYS_NAME}/impl/sample_consensus_prerejective.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/default_convergence_criteria.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_normal_shooting.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_backprojection.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_estimation_organized_projection.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_distance.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_median_distance.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_surface_normal.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_features.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_one_to_one.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_poly.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_sample_consensus.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_sample_consensus_2d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_trimmed.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_var_trimmed.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_rejection_organized_boundary.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/correspondence_types.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ia_ransac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/icp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/joint_icp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/icp_nl.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/elch.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/lum.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ndt.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ndt_2d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ppf_registration.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/pyramid_feature_matching.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/registration.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_2D.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_svd.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_svd_scale.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_dual_quaternion.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_lm.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_lls.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_lls_weighted.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_estimation_point_to_plane_weighted.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/transformation_validation_euclidean.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/gicp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sample_consensus_prerejective.hpp"
)
set(srcs
#src/pairwise_graph_registration.cpp
src/ia_ransac.cpp
src/icp.cpp
+ src/joint_icp.cpp
src/gicp.cpp
+ src/gicp6d.cpp
src/icp_nl.cpp
src/elch.cpp
src/lum.cpp
src/sample_consensus_prerejective.cpp
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_kdtree pcl_search pcl_sample_consensus pcl_features pcl_filters)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_kdtree pcl_search pcl_sample_consensus pcl_features pcl_filters)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
*
* \param[in] cloud the input point cloud source
*/
- PCL_DEPRECATED (void setInputCloud (const PointCloudSourceConstPtr &cloud), "[pcl::registration::CorrespondenceEstimationBase::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceEstimationBase::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.")
+ void
+ setInputCloud (const PointCloudSourceConstPtr &cloud);
/** \brief Get a pointer to the input point cloud dataset target. */
- PCL_DEPRECATED (PointCloudSourceConstPtr const getInputCloud (),
- "[pcl::registration::CorrespondenceEstimationBase::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceEstimationBase::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.")
+ PointCloudSourceConstPtr const
+ getInputCloud ();
/** \brief Provide a pointer to the input source
* (e.g., the point cloud that we want to align to the target)
inline PointCloudTargetConstPtr const
getInputTarget () { return (target_ ); }
+
+ /** \brief See if this rejector requires source normals */
+ virtual bool
+ requiresSourceNormals () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the source normals */
+ virtual void
+ setSourceNormals (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setSourceNormals] This class does not require input source normals", getClassName ().c_str ());
+ }
+
+ /** \brief See if this rejector requires target normals */
+ virtual bool
+ requiresTargetNormals () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the target normals */
+ virtual void
+ setTargetNormals (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setTargetNormals] This class does not require input target normals", getClassName ().c_str ());
+ }
+
/** \brief Provide a pointer to the vector of indices that represent the
* input source point cloud.
* \param[in] indices a pointer to the vector of indices
point_representation_ = point_representation;
}
+ /** \brief Clone and cast to CorrespondenceEstimationBase */
+ virtual boost::shared_ptr< CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> > clone () const = 0;
+
protected:
/** \brief The correspondence estimation method name. */
std::string corr_name_;
virtual void
determineReciprocalCorrespondences (pcl::Correspondences &correspondences,
double max_distance = std::numeric_limits<double>::max ());
+
+
+ /** \brief Clone and cast to CorrespondenceEstimationBase */
+ virtual boost::shared_ptr< CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> >
+ clone () const
+ {
+ Ptr copy (new CorrespondenceEstimation<PointSource, PointTarget, Scalar> (*this));
+ return (copy);
+ }
};
}
}
inline NormalsConstPtr
getTargetNormals () const { return (target_normals_); }
+
+ /** \brief See if this rejector requires source normals */
+ bool
+ requiresSourceNormals () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source normals */
+ void
+ setSourceNormals (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ NormalsPtr cloud (new PointCloudNormals);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setSourceNormals (cloud);
+ }
+
+ /** \brief See if this rejector requires target normals*/
+ bool
+ requiresTargetNormals () const
+ { return (true); }
+
+ /** \brief Method for setting the target normals */
+ void
+ setTargetNormals (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ NormalsPtr cloud (new PointCloudNormals);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setTargetNormals (cloud);
+ }
+
/** \brief Determine the correspondences between input and target cloud.
* \param[out] correspondences the found correspondences (index of query point, index of target point, distance)
* \param[in] max_distance maximum distance between the normal on the source point cloud and the corresponding point in the target
*/
inline void
getKSearch () const { return (k_); }
+
+ /** \brief Clone and cast to CorrespondenceEstimationBase */
+ virtual boost::shared_ptr< CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> >
+ clone () const
+ {
+ Ptr copy (new CorrespondenceEstimationBackProjection<PointSource, PointTarget, NormalT, Scalar> (*this));
+ return (copy);
+ }
protected:
inline NormalsConstPtr
getSourceNormals () const { return (source_normals_); }
+
+ /** \brief See if this rejector requires source normals */
+ bool
+ requiresSourceNormals () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source normals */
+ void
+ setSourceNormals (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ NormalsPtr cloud (new PointCloudNormals);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setSourceNormals (cloud);
+ }
+
/** \brief Determine the correspondences between input and target cloud.
* \param[out] correspondences the found correspondences (index of query point, index of target point, distance)
* \param[in] max_distance maximum distance between the normal on the source point cloud and the corresponding point in the target
inline void
getKSearch () const { return (k_); }
+ /** \brief Clone and cast to CorrespondenceEstimationBase */
+ virtual boost::shared_ptr< CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> >
+ clone () const
+ {
+ Ptr copy (new CorrespondenceEstimationNormalShooting<PointSource, PointTarget, NormalT, Scalar> (*this));
+ return (copy);
+ }
+
protected:
using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::corr_name_;
/** \brief Reads back the transformation from the source point cloud to the target point cloud.
* \note The target point cloud must be in its local camera coordinates, so use this transformation to correct
* for that.
- * \param[out] src_to_tgt_transformation the transformation
+ * \return the transformation
*/
inline Eigen::Matrix4f
getSourceTransformation () const
/** \brief Reads back the depth threshold; after projecting the source points in the image space of the target
* camera, this threshold is applied on the depths of corresponding dexels to eliminate the ones that are too
* far from each other.
- * \param[out] depth_threshold the depth threshold
+ * \return the depth threshold
*/
inline float
getDepthThreshold () const
{ return (depth_threshold_); }
/** \brief Computes the correspondences, applying a maximum Euclidean distance threshold.
+ * \param correspondences
* \param[in] max_distance Euclidean distance threshold above which correspondences will be rejected
*/
void
determineCorrespondences (Correspondences &correspondences, double max_distance);
/** \brief Computes the correspondences, applying a maximum Euclidean distance threshold.
+ * \param correspondences
* \param[in] max_distance Euclidean distance threshold above which correspondences will be rejected
*/
void
determineReciprocalCorrespondences (Correspondences &correspondences, double max_distance);
+
+ /** \brief Clone and cast to CorrespondenceEstimationBase */
+ virtual boost::shared_ptr< CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> >
+ clone () const
+ {
+ Ptr copy (new CorrespondenceEstimationOrganizedProjection<PointSource, PointTarget, Scalar> (*this));
+ return (copy);
+ }
protected:
using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::target_;
inline const std::string&
getClassName () const { return (rejection_name_); }
+
+ /** \brief See if this rejector requires source points */
+ virtual bool
+ requiresSourcePoints () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the source cloud */
+ virtual void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setSourcePoints] This class does not require an input source cloud", getClassName ().c_str ());
+ }
+
+ /** \brief See if this rejector requires source normals */
+ virtual bool
+ requiresSourceNormals () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the source normals */
+ virtual void
+ setSourceNormals (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setSourceNormals] This class does not require input source normals", getClassName ().c_str ());
+ }
+ /** \brief See if this rejector requires a target cloud */
+ virtual bool
+ requiresTargetPoints () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the target cloud */
+ virtual void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setTargetPoints] This class does not require an input target cloud", getClassName ().c_str ());
+ }
+
+ /** \brief See if this rejector requires target normals */
+ virtual bool
+ requiresTargetNormals () const
+ { return (false); }
+
+ /** \brief Abstract method for setting the target normals */
+ virtual void
+ setTargetNormals (pcl::PCLPointCloud2::ConstPtr /*cloud2*/)
+ {
+ PCL_WARN ("[pcl::registration::%s::setTargetNormals] This class does not require input target normals", getClassName ().c_str ());
+ }
+
protected:
/** \brief The name of the rejection method. */
* data!), used to compute the correspondence distance.
* \param[in] cloud a cloud containing XYZ data
*/
- PCL_DEPRECATED (void setInputCloud (const PointCloudConstPtr &cloud), "[pcl::registration::DataContainer::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::DataContainer::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.")
+ void
+ setInputCloud (const PointCloudConstPtr &cloud);
/** \brief Get a pointer to the input point cloud dataset target. */
- PCL_DEPRECATED (PointCloudConstPtr const getInputCloud (), "[pcl::registration::DataContainer::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::DataContainer::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.")
+ PointCloudConstPtr const
+ getInputCloud ();
/** \brief Provide a source point cloud dataset (must contain XYZ
* data!), used to compute the correspondence distance.
boost::static_pointer_cast<DataContainer<PointT> > (data_container_)->setInputTarget (target);
}
+
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource<PointXYZ> (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget<PointXYZ> (cloud);
+ }
+
/** \brief Provide a pointer to the search object used to find correspondences in
* the target cloud.
* \param[in] tree a pointer to the spatial search object.
}
/** \brief Obtain a score between a pair of correspondences.
- * \param[in] the index to check in the list of correspondences
+ * \param[in] index the index to check in the list of correspondences
* \return score the resultant computed score
*/
virtual inline double
/** \brief Check whether the correspondence pair at the given index is valid
* by computing the score and testing it against the user given threshold
- * \param[in] the index to check in the list of correspondences
+ * \param[in] index the index to check in the list of correspondences
* \return true if the correspondence is good, false otherwise
*/
virtual inline bool
data_container_.reset (new DataContainer<PointT>);
boost::static_pointer_cast<DataContainer<PointT> > (data_container_)->setInputTarget (target);
}
+
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource<PointXYZ> (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget<PointXYZ> (cloud);
+ }
/** \brief Provide a pointer to the search object used to find correspondences in
* the target cloud.
boost::static_pointer_cast<pcl::registration::DataContainer<PointT> > (data_container_)->setInputTarget (cloud);
}
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource<PointXYZ> (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget<PointXYZ> (cloud);
+ }
+
virtual bool
updateSource (const Eigen::Matrix4d &)
{ return (true); }
target_ = target;
}
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloudSourcePtr cloud (new PointCloudSource);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloudTargetPtr cloud (new PointCloudTarget);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget (cloud);
+ }
+
/** \brief Set the polygon cardinality
* \param cardinality polygon cardinality
*/
/** \brief Set the similarity threshold in [0,1[ between edge lengths,
* where 1 is a perfect match
- * \param similarity similarity threshold
+ * \param similarity_threshold similarity threshold
*/
inline void
setSimilarityThreshold (float similarity_threshold)
/** \brief Provide a source point cloud dataset (must contain XYZ data!)
* \param[in] cloud a cloud containing XYZ data
*/
- PCL_DEPRECATED (virtual void setInputCloud (const PointCloudConstPtr &cloud),
- "[pcl::registration::CorrespondenceRejectorSampleConsensus::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceRejectorSampleConsensus::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.")
+ virtual void
+ setInputCloud (const PointCloudConstPtr &cloud);
/** \brief Get a pointer to the input point cloud dataset target. */
- PCL_DEPRECATED (PointCloudConstPtr const getInputCloud (), "[pcl::registration::CorrespondenceRejectorSampleConsensus::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceRejectorSampleConsensus::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.")
+ PointCloudConstPtr const
+ getInputCloud ();
/** \brief Provide a source point cloud dataset (must contain XYZ data!)
* \param[in] cloud a cloud containing XYZ data
/** \brief Provide a target point cloud dataset (must contain XYZ data!)
* \param[in] cloud a cloud containing XYZ data
*/
- PCL_DEPRECATED (virtual void setTargetCloud (const PointCloudConstPtr &cloud), "[pcl::registration::CorrespondenceRejectorSampleConsensus::setTargetCloud] setTargetCloud is deprecated. Please use setInputTarget instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceRejectorSampleConsensus::setTargetCloud] setTargetCloud is deprecated. Please use setInputTarget instead.")
+ virtual void
+ setTargetCloud (const PointCloudConstPtr &cloud);
/** \brief Provide a target point cloud dataset (must contain XYZ data!)
* \param[in] cloud a cloud containing XYZ data
inline PointCloudConstPtr const
getInputTarget () { return (target_ ); }
+
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloudPtr cloud (new PointCloud);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloudPtr cloud (new PointCloud);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget (cloud);
+ }
+
/** \brief Set the maximum distance between corresponding points.
* Correspondences with distances below the threshold are considered as inliers.
* \param[in] threshold Distance threshold in the same dimension as source and target data sets.
* \return Distance threshold in the same dimension as source and target data sets.
*/
inline double
- getInlierThreshold() { return inlier_threshold_; };
+ getInlierThreshold () { return inlier_threshold_; };
/** \brief Set the maximum number of iterations.
* \param[in] max_iterations Maximum number if iterations to run
*/
- PCL_DEPRECATED (void setMaxIterations (int max_iterations), "[pcl::registration::CorrespondenceRejectorSampleConsensus::setMaxIterations] setMaxIterations is deprecated. Please use setMaximumIterations instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceRejectorSampleConsensus::setMaxIterations] setMaxIterations is deprecated. Please use setMaximumIterations instead.")
+ void
+ setMaxIterations (int max_iterations);
/** \brief Set the maximum number of iterations.
* \param[in] max_iterations Maximum number if iterations to run
/** \brief Get the maximum number of iterations.
* \return max_iterations Maximum number if iterations to run
*/
- PCL_DEPRECATED (int getMaxIterations (), "[pcl::registration::CorrespondenceRejectorSampleConsensus::getMaxIterations] getMaxIterations is deprecated. Please use getMaximumIterations instead.");
+ PCL_DEPRECATED ("[pcl::registration::CorrespondenceRejectorSampleConsensus::getMaxIterations] getMaxIterations is deprecated. Please use getMaximumIterations instead.")
+ int
+ getMaxIterations ();
/** \brief Get the maximum number of iterations.
* \return max_iterations Maximum number if iterations to run
}
/** \brief Provide a source point cloud dataset (must contain XYZ data!), used to compute the correspondence distance.
- * \param[in] cloud a cloud containing XYZ data
+ * \param[in] input a cloud containing XYZ data
*/
template <typename PointT> inline void
setInputCloud (const typename pcl::PointCloud<PointT>::ConstPtr &input)
}
/** \brief Provide a source point cloud dataset (must contain XYZ data!), used to compute the correspondence distance.
- * \param[in] cloud a cloud containing XYZ data
+ * \param[in] input a cloud containing XYZ data
*/
template <typename PointT> inline void
setInputSource (const typename pcl::PointCloud<PointT>::ConstPtr &input)
return (boost::static_pointer_cast<DataContainer<pcl::PointXYZ, NormalT> > (data_container_)->getTargetNormals ());
}
+
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ if (!data_container_)
+ initializeDataContainer<PointXYZ, Normal> ();
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource<PointXYZ> (cloud);
+ }
+
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ if (!data_container_)
+ initializeDataContainer<PointXYZ, Normal> ();
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget<PointXYZ> (cloud);
+ }
+
+ /** \brief See if this rejector requires source normals */
+ bool
+ requiresSourceNormals () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source normals */
+ void
+ setSourceNormals (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ if (!data_container_)
+ initializeDataContainer<PointXYZ, Normal> ();
+ PointCloud<Normal>::Ptr cloud (new PointCloud<Normal>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputNormals<PointXYZ, Normal> (cloud);
+ }
+
+ /** \brief See if this rejector requires target normals*/
+ bool
+ requiresTargetNormals () const
+ { return (true); }
+
+ /** \brief Method for setting the target normals */
+ void
+ setTargetNormals (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ if (!data_container_)
+ initializeDataContainer<PointXYZ, Normal> ();
+ PointCloud<Normal>::Ptr cloud (new PointCloud<Normal>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setTargetNormals<PointXYZ, Normal> (cloud);
+ }
+
protected:
/** \brief Apply the rejection algorithm.
data_container_.reset (new DataContainer<PointT>);
boost::static_pointer_cast<DataContainer<PointT> > (data_container_)->setInputTarget (target);
}
+
+
+
+ /** \brief See if this rejector requires source points */
+ bool
+ requiresSourcePoints () const
+ { return (true); }
+
+ /** \brief Blob method for setting the source cloud */
+ void
+ setSourcePoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputSource<PointXYZ> (cloud);
+ }
+ /** \brief See if this rejector requires a target cloud */
+ bool
+ requiresTargetPoints () const
+ { return (true); }
+
+ /** \brief Method for setting the target cloud */
+ void
+ setTargetPoints (pcl::PCLPointCloud2::ConstPtr cloud2)
+ {
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+ fromPCLPointCloud2 (*cloud2, *cloud);
+ setInputTarget<PointXYZ> (cloud);
+ }
+
/** \brief Provide a pointer to the search object used to find correspondences in
* the target cloud.
* \param[in] tree a pointer to the spatial search object.
{
Vertex () : cloud () {}
PointCloudPtr cloud;
+ Eigen::Affine3f transform;
};
/** \brief graph structure to hold the SLAM graph */
compute_loop_ = false;
}
- /** \brief Computes now poses for all point clouds by closing the loop
+ /** \brief Computes new poses for all point clouds by closing the loop
* between start and end point cloud. This will transform all given point
* clouds for now!
*/
/** \brief Provide a pointer to the input dataset
* \param cloud the const boost shared pointer to a PointCloud message
*/
- PCL_DEPRECATED (void setInputCloud (const PointCloudSourceConstPtr &cloud), "[pcl::registration::GeneralizedIterativeClosestPoint::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::GeneralizedIterativeClosestPoint::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.")
+ void
+ setInputCloud (const PointCloudSourceConstPtr &cloud);
/** \brief Provide a pointer to the input dataset
* \param cloud the const boost shared pointer to a PointCloud message
* neighbors. K is set via setCorrespondenceRandomness() methode.
* \param cloud pointer to point cloud
* \param tree KD tree performer for nearest neighbors search
- * \return cloud_covariance covariances matrices for each point in the cloud
+ * \param[out] cloud_covariances covariances matrices for each point in the cloud
*/
template<typename PointT>
void computeCovariances(typename pcl::PointCloud<PointT>::ConstPtr cloud,
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_GICP6D_H_
+#define PCL_GICP6D_H_
+
+#include <pcl/registration/gicp.h>
+#include <pcl/kdtree/impl/kdtree_flann.hpp>
+#include <pcl/point_types.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_representation.h>
+
+namespace pcl
+{
+ struct EIGEN_ALIGN16 _PointXYZLAB
+ {
+ PCL_ADD_POINT4D; // this adds the members x,y,z
+ union
+ {
+ struct
+ {
+ float L;
+ float a;
+ float b;
+ };
+ float data_lab[4];
+ };
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+
+ /** \brief A custom point type for position and CIELAB color value */
+ struct PointXYZLAB : public _PointXYZLAB
+ {
+ inline PointXYZLAB ()
+ {
+ x = y = z = 0.0f; data[3] = 1.0f; // important for homogeneous coordinates
+ L = a = b = 0.0f; data_lab[3] = 0.0f;
+ }
+ };
+}
+
+// register the custom point type in PCL
+POINT_CLOUD_REGISTER_POINT_STRUCT(pcl::_PointXYZLAB,
+ (float, x, x)
+ (float, y, y)
+ (float, z, z)
+ (float, L, L)
+ (float, a, a)
+ (float, b, b)
+)
+POINT_CLOUD_REGISTER_POINT_WRAPPER(pcl::PointXYZLAB, pcl::_PointXYZLAB)
+
+namespace pcl
+{
+ /** \brief GeneralizedIterativeClosestPoint6D integrates L*a*b* color space information into the
+ * Generalized Iterative Closest Point (GICP) algorithm.
+ *
+ * The suggested input is PointXYZRGBA.
+ *
+ * \note If you use this code in any academic work, please cite:
+ *
+ * - M. Korn, M. Holzkothen, J. Pauli
+ * Color Supported Generalized-ICP.
+ * In Proceedings of VISAPP 2014 - International Conference on Computer Vision Theory and Applications,
+ * Lisbon, Portugal, January 2014.
+ *
+ * \author Martin Holzkothen, Michael Korn
+ * \ingroup registration
+ */
+ class GeneralizedIterativeClosestPoint6D : public GeneralizedIterativeClosestPoint<PointXYZRGBA, PointXYZRGBA>
+ {
+ typedef PointXYZRGBA PointSource;
+ typedef PointXYZRGBA PointTarget;
+
+ public:
+
+ /** \brief constructor.
+ *
+ * \param[in] lab_weight the color weight
+ */
+ GeneralizedIterativeClosestPoint6D (float lab_weight = 0.032f);
+
+ /** \brief Provide a pointer to the input source
+ * (e.g., the point cloud that we want to align to the target)
+ *
+ * \param[in] cloud the input point cloud source
+ */
+ void
+ setInputSource (const PointCloudSourceConstPtr& cloud);
+
+ /** \brief Provide a pointer to the input target
+ * (e.g., the point cloud that we want to align the input source to)
+ *
+ * \param[in] cloud the input point cloud target
+ */
+ void
+ setInputTarget (const PointCloudTargetConstPtr& target);
+
+ protected:
+
+ /** \brief Rigid transformation computation method with initial guess.
+ * \param output the transformed input point cloud dataset using the rigid transformation found
+ * \param guess the initial guess of the transformation to compute
+ */
+ void
+ computeTransformation (PointCloudSource& output,
+ const Eigen::Matrix4f& guess);
+
+ /** \brief Search for the closest nearest neighbor of a given point.
+ * \param query the point to search a nearest neighbour for
+ * \param index vector of size 1 to store the index of the nearest neighbour found
+ * \param distance vector of size 1 to store the distance to nearest neighbour found
+ */
+ inline bool
+ searchForNeighbors (const PointXYZLAB& query, std::vector<int>& index, std::vector<float>& distance);
+
+ protected:
+ /** \brief Holds the converted (LAB) data cloud. */
+ pcl::PointCloud<PointXYZLAB>::Ptr cloud_lab_;
+
+ /** \brief Holds the converted (LAB) model cloud. */
+ pcl::PointCloud<PointXYZLAB>::Ptr target_lab_;
+
+ /** \brief 6d-tree to search in model cloud. */
+ KdTreeFLANN<PointXYZLAB> target_tree_lab_;
+
+ /** \brief The color weight. */
+ float lab_weight_;
+
+ /** \brief Custom point representation to perform kdtree searches in more than 3 (i.e. in all 6) dimensions. */
+ class MyPointRepresentation : public PointRepresentation<PointXYZLAB>
+ {
+ using PointRepresentation<PointXYZLAB>::nr_dimensions_;
+ using PointRepresentation<PointXYZLAB>::trivial_;
+
+ public:
+ typedef boost::shared_ptr<MyPointRepresentation> Ptr;
+ typedef boost::shared_ptr<const MyPointRepresentation> ConstPtr;
+
+ MyPointRepresentation ()
+ {
+ nr_dimensions_ = 6;
+ trivial_ = false;
+ }
+
+ virtual
+ ~MyPointRepresentation ()
+ {
+ }
+
+ inline Ptr
+ makeShared () const
+ {
+ return Ptr (new MyPointRepresentation (*this));
+ }
+
+ virtual void
+ copyToFloatArray (const PointXYZLAB &p, float * out) const
+ {
+ // copy all of the six values
+ out[0] = p.x;
+ out[1] = p.y;
+ out[2] = p.z;
+ out[3] = p.L;
+ out[4] = p.a;
+ out[5] = p.b;
+ }
+ };
+
+ /** \brief Enables 6d searches with kd-tree class using the color weight. */
+ MyPointRepresentation point_rep_;
+ };
+}
+
+#endif //#ifndef PCL_GICP6D_H_
using Registration<PointSource, PointTarget>::max_iterations_;
using Registration<PointSource, PointTarget>::tree_;
using Registration<PointSource, PointTarget>::transformation_estimation_;
+ using Registration<PointSource, PointTarget>::converged_;
using Registration<PointSource, PointTarget>::getClassName;
typedef typename Registration<PointSource, PointTarget>::PointCloudSource PointCloudSource;
/** \brief Rigid transformation computation method.
* \param output the transformed input point cloud dataset using the rigid transformation found
+ * \param guess The computed transforamtion
*/
virtual void
computeTransformation (PointCloudSource &output, const Eigen::Matrix4f& guess);
* method is called. Please note that the align method sets max_iterations_,
* euclidean_fitness_epsilon_ and transformation_epsilon_ and therefore overrides the default / set
* values of the DefaultConvergenceCriteria instance.
- * \param[out] Pointer to the IterativeClosestPoint's DefaultConvergenceCriteria.
+ * \return Pointer to the IterativeClosestPoint's DefaultConvergenceCriteria.
*/
inline typename pcl::registration::DefaultConvergenceCriteria<Scalar>::Ptr
getConvergeCriteria ()
virtual void
computeTransformation (PointCloudSource &output, const Matrix4 &guess);
+ /** \brief Looks at the Estimators and Rejectors and determines whether their blob-setter methods need to be called */
+ virtual void
+ determineRequiredBlobData ();
+
/** \brief XYZ fields offset. */
size_t x_idx_offset_, y_idx_offset_, z_idx_offset_;
bool source_has_normals_;
/** \brief Internal check whether target dataset has normals or not. */
bool target_has_normals_;
+
+ /** \brief Checks for whether estimators and rejectors need various data */
+ bool need_source_blob_, need_target_blob_;
};
/** \brief @b IterativeClosestPointWithNormals is a special case of
#ifndef PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_H_
#define PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_H_
-#include <pcl/common/concatenate.h>
#include <pcl/common/io.h>
+#include <pcl/common/copy_point.h>
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename Scalar> void
double max_dist_sqr = max_distance * max_distance;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
correspondences.resize (indices_->size ());
std::vector<int> index (1);
for (std::vector<int>::const_iterator idx = indices_->begin (); idx != indices_->end (); ++idx)
{
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldListTarget> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx],
- pt));
+ copyPoint (input_->points[*idx], pt);
tree_->nearestKSearch (pt, 1, index, distance);
if (distance[0] > max_dist_sqr)
{
if (!initCompute ())
return;
-
- typedef typename pcl::traits::fieldList<PointSource>::type FieldListSource;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
- typedef typename pcl::intersect<FieldListSource, FieldListTarget>::type FieldList;
-
+
// setup tree for reciprocal search
// Set the internal point representation of choice
if (!initComputeReciprocal())
for (std::vector<int>::const_iterator idx = indices_->begin (); idx != indices_->end (); ++idx)
{
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx],
- pt_src));
+ copyPoint (input_->points[*idx], pt_src);
tree_->nearestKSearch (pt_src, 1, index, distance);
if (distance[0] > max_dist_sqr)
target_idx = index[0];
// Copy the target data to a target PointSource format so we can search in the tree_reciprocal
- pcl::for_each_type<FieldList> (pcl::NdConcatenateFunctor <PointTarget, PointSource> (
- target_->points[target_idx],
- pt_tgt));
+ copyPoint (target_->points[target_idx], pt_tgt);
tree_reciprocal_->nearestKSearch (pt_tgt, 1, index_reciprocal, distance_reciprocal);
if (distance_reciprocal[0] > max_dist_sqr || *idx != index_reciprocal[0])
#ifndef PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_BACK_PROJECTION_HPP_
#define PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_BACK_PROJECTION_HPP_
+#include <pcl/common/copy_point.h>
+
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename NormalT, typename Scalar> bool
pcl::registration::CorrespondenceEstimationBackProjection<PointSource, PointTarget, NormalT, Scalar>::initCompute ()
if (!initCompute ())
return;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
correspondences.resize (indices_->size ());
std::vector<int> nn_indices (k_);
{
PointSource pt_src;
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldListTarget> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx_i],
- pt_src));
+ copyPoint (input_->points[*idx_i], pt_src);
float cos_angle = source_normals_->points[*idx_i].normal_x * target_normals_->points[nn_indices[j]].normal_x +
source_normals_->points[*idx_i].normal_y * target_normals_->points[nn_indices[j]].normal_y +
if (!initCompute ())
return;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
-
// Set the internal point representation of choice
if(!initComputeReciprocal())
return;
{
PointSource pt_src;
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldListTarget> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx_i],
- pt_src));
+ copyPoint (input_->points[*idx_i], pt_src);
float cos_angle = source_normals_->points[*idx_i].normal_x * target_normals_->points[nn_indices[j]].normal_x +
source_normals_->points[*idx_i].normal_y * target_normals_->points[nn_indices[j]].normal_y +
#ifndef PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_NORMAL_SHOOTING_H_
#define PCL_REGISTRATION_IMPL_CORRESPONDENCE_ESTIMATION_NORMAL_SHOOTING_H_
+#include <pcl/common/copy_point.h>
+
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename NormalT, typename Scalar> bool
pcl::registration::CorrespondenceEstimationNormalShooting<PointSource, PointTarget, NormalT, Scalar>::initCompute ()
if (!initCompute ())
return;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
correspondences.resize (indices_->size ());
std::vector<int> nn_indices (k_);
{
PointSource pt_src;
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldListTarget> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx_i],
- pt_src));
+ copyPoint (input_->points[*idx_i], pt_src);
// computing the distance between a point and a line in 3d.
// Reference - http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
if (!initCompute ())
return;
- typedef typename pcl::traits::fieldList<PointTarget>::type FieldListTarget;
-
// setup tree for reciprocal search
// Set the internal point representation of choice
if (!initComputeReciprocal ())
{
PointSource pt_src;
// Copy the source data to a target PointTarget format so we can search in the tree
- pcl::for_each_type <FieldListTarget> (pcl::NdConcatenateFunctor <PointSource, PointTarget> (
- input_->points[*idx_i],
- pt_src));
+ copyPoint (input_->points[*idx_i], pt_src);
// computing the distance between a point and a line in 3d.
// Reference - http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
return;
}
+ if (save_inliers_)
+ inlier_indices_.clear ();
+
int nr_correspondences = static_cast<int> (original_correspondences.size ());
std::vector<int> source_indices (nr_correspondences);
std::vector<int> target_indices (nr_correspondences);
//a = aend * a * aendI;
pcl::transformPointCloud (*(*loop_graph_)[i].cloud, *(*loop_graph_)[i].cloud, a);
+ (*loop_graph_)[i].transform = a;
}
add_edge (loop_start_, loop_end_, *loop_graph_);
{
if (k_correspondences_ > int (cloud->size ()))
{
- PCL_ERROR ("[pcl::GeneralizedIterativeClosestPoint::computeCovariances] Number or points in cloud (%zu) is less than k_correspondences_ (%zu)!\n", cloud->size (), k_correspondences_);
+ PCL_ERROR ("[pcl::GeneralizedIterativeClosestPoint::computeCovariances] Number or points in cloud (%lu) is less than k_correspondences_ (%lu)!\n", cloud->size (), k_correspondences_);
return;
}
int inner_iterations_ = 0;
int result = bfgs.minimizeInit (x);
+ result = BFGSSpace::Running;
do
{
inner_iterations_++;
if (nr_samples > static_cast<int> (cloud.points.size ()))
{
PCL_ERROR ("[pcl::%s::selectSamples] ", getClassName ().c_str ());
- PCL_ERROR ("The number of samples (%d) must not be greater than the number of points (%zu)!\n",
+ PCL_ERROR ("The number of samples (%d) must not be greater than the number of points (%lu)!\n",
nr_samples, cloud.points.size ());
return;
}
final_transformation_ = guess;
int i_iter = 0;
+ converged_ = false;
if (!guess.isApprox (Eigen::Matrix4f::Identity (), 0.01f))
{
// If guess is not the Identity matrix we check it.
{
lowest_error = error;
final_transformation_ = transformation_;
+ converged_=true;
}
}
transformation_ = Matrix4::Identity ();
+ // Make blobs if necessary
+ determineRequiredBlobData ();
+ PCLPointCloud2::Ptr target_blob (new PCLPointCloud2);
+ if (need_target_blob_)
+ pcl::toPCLPointCloud2 (*target_, *target_blob);
+
// Pass in the default target for the Correspondence Estimation/Rejection code
correspondence_estimation_->setInputTarget (target_);
- // We should be doing something like this
- // for (size_t i = 0; i < correspondence_rejectors_.size (); ++i)
- // {
- // correspondence_rejectors_[i]->setTargetCloud (target_);
- // if (target_has_normals_)
- // correspondence_rejectors_[i]->setTargetNormals (target_);
- // }
+ if (correspondence_estimation_->requiresTargetNormals ())
+ correspondence_estimation_->setTargetNormals (target_blob);
+ // Correspondence Rejectors need a binary blob
+ for (size_t i = 0; i < correspondence_rejectors_.size (); ++i)
+ {
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ if (rej->requiresTargetPoints ())
+ rej->setTargetPoints (target_blob);
+ if (rej->requiresTargetNormals () && target_has_normals_)
+ rej->setTargetNormals (target_blob);
+ }
convergence_criteria_->setMaximumIterations (max_iterations_);
convergence_criteria_->setRelativeMSE (euclidean_fitness_epsilon_);
// Repeat until convergence
do
{
+ // Get blob data if needed
+ PCLPointCloud2::Ptr input_transformed_blob;
+ if (need_source_blob_)
+ {
+ input_transformed_blob.reset (new PCLPointCloud2);
+ toPCLPointCloud2 (*input_transformed, *input_transformed_blob);
+ }
// Save the previously estimated transformation
previous_transformation_ = transformation_;
// Set the source each iteration, to ensure the dirty flag is updated
correspondence_estimation_->setInputSource (input_transformed);
+ if (correspondence_estimation_->requiresSourceNormals ())
+ correspondence_estimation_->setSourceNormals (input_transformed_blob);
// Estimate correspondences
if (use_reciprocal_correspondence_)
correspondence_estimation_->determineReciprocalCorrespondences (*correspondences_, corr_dist_threshold_);
CorrespondencesPtr temp_correspondences (new Correspondences (*correspondences_));
for (size_t i = 0; i < correspondence_rejectors_.size (); ++i)
{
- PCL_DEBUG ("Applying a correspondence rejector method: %s.\n", correspondence_rejectors_[i]->getClassName ().c_str ());
- // We should be doing something like this
- // correspondence_rejectors_[i]->setInputSource (input_transformed);
- // if (source_has_normals_)
- // correspondence_rejectors_[i]->setInputNormals (input_transformed);
- correspondence_rejectors_[i]->setInputCorrespondences (temp_correspondences);
- correspondence_rejectors_[i]->getCorrespondences (*correspondences_);
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ PCL_DEBUG ("Applying a correspondence rejector method: %s.\n", rej->getClassName ().c_str ());
+ if (rej->requiresSourcePoints ())
+ rej->setSourcePoints (input_transformed_blob);
+ if (rej->requiresSourceNormals () && source_has_normals_)
+ rej->setSourceNormals (input_transformed_blob);
+ rej->setInputCorrespondences (temp_correspondences);
+ rej->getCorrespondences (*correspondences_);
// Modify input for the next iteration
if (i < correspondence_rejectors_.size () - 1)
*temp_correspondences = *correspondences_;
size_t cnt = correspondences_->size ();
// Check whether we have enough correspondences
- if (cnt < min_number_correspondences_)
+ if (static_cast<int> (cnt) < min_number_correspondences_)
{
PCL_ERROR ("[pcl::%s::computeTransformation] Not enough correspondences found. Relax your threshold parameters.\n", getClassName ().c_str ());
convergence_criteria_->setConvergenceState(pcl::registration::DefaultConvergenceCriteria<Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
transformCloud (*input_, output, final_transformation_);
}
+template <typename PointSource, typename PointTarget, typename Scalar> void
+pcl::IterativeClosestPoint<PointSource, PointTarget, Scalar>::determineRequiredBlobData ()
+{
+ need_source_blob_ = false;
+ need_target_blob_ = false;
+ // Check estimator
+ need_source_blob_ |= correspondence_estimation_->requiresSourceNormals ();
+ need_target_blob_ |= correspondence_estimation_->requiresTargetNormals ();
+ // Add warnings if necessary
+ if (correspondence_estimation_->requiresSourceNormals () && !source_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Estimator expects source normals, but we can't provide them.\n", getClassName ().c_str ());
+ }
+ if (correspondence_estimation_->requiresTargetNormals () && !target_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Estimator expects target normals, but we can't provide them.\n", getClassName ().c_str ());
+ }
+ // Check rejectors
+ for (size_t i = 0; i < correspondence_rejectors_.size (); i++)
+ {
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ need_source_blob_ |= rej->requiresSourcePoints ();
+ need_source_blob_ |= rej->requiresSourceNormals ();
+ need_target_blob_ |= rej->requiresTargetPoints ();
+ need_target_blob_ |= rej->requiresTargetNormals ();
+ if (rej->requiresSourceNormals () && !source_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Rejector %s expects source normals, but we can't provide them.\n", getClassName ().c_str (), rej->getClassName ().c_str ());
+ }
+ if (rej->requiresTargetNormals () && !target_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Rejector %s expects target normals, but we can't provide them.\n", getClassName ().c_str (), rej->getClassName ().c_str ());
+ }
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename Scalar> void
pcl::IterativeClosestPointWithNormals<PointSource, PointTarget, Scalar>::transformCloud (
{
pcl::transformPointCloudWithNormals (input, output, transform);
}
+
#endif /* PCL_REGISTRATION_IMPL_ICP_HPP_ */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_REGISTRATION_IMPL_JOINT_ICP_HPP_
+#define PCL_REGISTRATION_IMPL_JOINT_ICP_HPP_
+
+#include <pcl/registration/boost.h>
+#include <pcl/correspondence.h>
+#include <pcl/console/print.h>
+
+
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointSource, typename PointTarget, typename Scalar> void
+pcl::JointIterativeClosestPoint<PointSource, PointTarget, Scalar>::computeTransformation (
+ PointCloudSource &output, const Matrix4 &guess)
+{
+ // Point clouds containing the correspondences of each point in <input, indices>
+ if (sources_.size () != targets_.size () || sources_.empty () || targets_.empty ())
+ {
+ PCL_ERROR ("[pcl::%s::computeTransformation] Must set InputSources and InputTargets to the same, nonzero size!\n",
+ getClassName ().c_str ());
+ return;
+ }
+ bool manual_correspondence_estimations_set = true;
+ if (correspondence_estimations_.empty ())
+ {
+ manual_correspondence_estimations_set = false;
+ correspondence_estimations_.resize (sources_.size ());
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ correspondence_estimations_[i] = correspondence_estimation_->clone ();
+ KdTreeReciprocalPtr src_tree (new KdTreeReciprocal);
+ KdTreePtr tgt_tree (new KdTree);
+ correspondence_estimations_[i]->setSearchMethodTarget (tgt_tree);
+ correspondence_estimations_[i]->setSearchMethodSource (src_tree);
+ }
+ }
+ if (correspondence_estimations_.size () != sources_.size ())
+ {
+ PCL_ERROR ("[pcl::%s::computeTransform] Must set CorrespondenceEstimations to be the same size as the joint\n",
+ getClassName ().c_str ());
+ return;
+ }
+ std::vector<PointCloudSourcePtr> inputs_transformed (sources_.size ());
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ inputs_transformed[i].reset (new PointCloudSource);
+ }
+
+ nr_iterations_ = 0;
+ converged_ = false;
+
+ // Initialise final transformation to the guessed one
+ final_transformation_ = guess;
+
+ // Make a combined transformed input and output
+ std::vector<size_t> input_offsets (sources_.size ());
+ std::vector<size_t> target_offsets (targets_.size ());
+ PointCloudSourcePtr sources_combined (new PointCloudSource);
+ PointCloudSourcePtr inputs_transformed_combined (new PointCloudSource);
+ PointCloudTargetPtr targets_combined (new PointCloudTarget);
+ size_t input_offset = 0;
+ size_t target_offset = 0;
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ // If the guessed transformation is non identity
+ if (guess != Matrix4::Identity ())
+ {
+ // Apply guessed transformation prior to search for neighbours
+ this->transformCloud (*sources_[i], *inputs_transformed[i], guess);
+ }
+ else
+ {
+ *inputs_transformed[i] = *sources_[i];
+ }
+ *sources_combined += *sources_[i];
+ *inputs_transformed_combined += *inputs_transformed[i];
+ *targets_combined += *targets_[i];
+ input_offsets[i] = input_offset;
+ target_offsets[i] = target_offset;
+ input_offset += inputs_transformed[i]->size ();
+ target_offset += targets_[i]->size ();
+ }
+
+
+
+ transformation_ = Matrix4::Identity ();
+ // Make blobs if necessary
+ determineRequiredBlobData ();
+ // Pass in the default target for the Correspondence Estimation/Rejection code
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ correspondence_estimations_[i]->setInputTarget (targets_[i]);
+ if (correspondence_estimations_[i]->requiresTargetNormals ())
+ {
+ PCLPointCloud2::Ptr target_blob (new PCLPointCloud2);
+ pcl::toPCLPointCloud2 (*targets_[i], *target_blob);
+ correspondence_estimations_[i]->setTargetNormals (target_blob);
+ }
+ }
+
+ PCLPointCloud2::Ptr targets_combined_blob (new PCLPointCloud2);
+ if (!correspondence_rejectors_.empty () && need_target_blob_)
+ pcl::toPCLPointCloud2 (*targets_combined, *targets_combined_blob);
+
+ for (size_t i = 0; i < correspondence_rejectors_.size (); ++i)
+ {
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ if (rej->requiresTargetPoints ())
+ rej->setTargetPoints (targets_combined_blob);
+ if (rej->requiresTargetNormals () && target_has_normals_)
+ rej->setTargetNormals (targets_combined_blob);
+ }
+
+ convergence_criteria_->setMaximumIterations (max_iterations_);
+ convergence_criteria_->setRelativeMSE (euclidean_fitness_epsilon_);
+ convergence_criteria_->setTranslationThreshold (transformation_epsilon_);
+ convergence_criteria_->setRotationThreshold (1.0 - transformation_epsilon_);
+
+ // Repeat until convergence
+ std::vector<CorrespondencesPtr> partial_correspondences_ (sources_.size ());
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ partial_correspondences_[i].reset (new pcl::Correspondences);
+ }
+
+ do
+ {
+ // Save the previously estimated transformation
+ previous_transformation_ = transformation_;
+
+ // Set the source each iteration, to ensure the dirty flag is updated
+ correspondences_->clear ();
+ for (size_t i = 0; i < correspondence_estimations_.size (); i++)
+ {
+ correspondence_estimations_[i]->setInputSource (inputs_transformed[i]);
+ // Get blob data if needed
+ if (correspondence_estimations_[i]->requiresSourceNormals ())
+ {
+ PCLPointCloud2::Ptr input_transformed_blob (new PCLPointCloud2);
+ toPCLPointCloud2 (*inputs_transformed[i], *input_transformed_blob);
+ correspondence_estimations_[i]->setSourceNormals (input_transformed_blob);
+ }
+
+ // Estimate correspondences on each cloud pair separately
+ if (use_reciprocal_correspondence_)
+ {
+ correspondence_estimations_[i]->determineReciprocalCorrespondences (*partial_correspondences_[i], corr_dist_threshold_);
+ }
+ else
+ {
+ correspondence_estimations_[i]->determineCorrespondences (*partial_correspondences_[i], corr_dist_threshold_);
+ }
+ PCL_DEBUG ("[pcl::%s::computeTransformation] Found %d partial correspondences for cloud [%d]\n",
+ getClassName ().c_str (),
+ partial_correspondences_[i]->size (), i);
+ for (size_t j = 0; j < partial_correspondences_[i]->size (); j++)
+ {
+ pcl::Correspondence corr = partial_correspondences_[i]->at (j);
+ // Update the offsets to be for the combined clouds
+ corr.index_query += input_offsets[i];
+ corr.index_match += target_offsets[i];
+ correspondences_->push_back (corr);
+ }
+ }
+ PCL_DEBUG ("[pcl::%s::computeTransformation] Total correspondences: %d\n", getClassName ().c_str (), correspondences_->size ());
+
+ PCLPointCloud2::Ptr inputs_transformed_combined_blob;
+ if (need_source_blob_)
+ {
+ inputs_transformed_combined_blob.reset (new PCLPointCloud2);
+ toPCLPointCloud2 (*inputs_transformed_combined, *inputs_transformed_combined_blob);
+ }
+ CorrespondencesPtr temp_correspondences (new Correspondences (*correspondences_));
+ for (size_t i = 0; i < correspondence_rejectors_.size (); ++i)
+ {
+ PCL_DEBUG ("Applying a correspondence rejector method: %s.\n", correspondence_rejectors_[i]->getClassName ().c_str ());
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ PCL_DEBUG ("Applying a correspondence rejector method: %s.\n", rej->getClassName ().c_str ());
+ if (rej->requiresSourcePoints ())
+ rej->setSourcePoints (inputs_transformed_combined_blob);
+ if (rej->requiresSourceNormals () && source_has_normals_)
+ rej->setSourceNormals (inputs_transformed_combined_blob);
+ rej->setInputCorrespondences (temp_correspondences);
+ rej->getCorrespondences (*correspondences_);
+ // Modify input for the next iteration
+ if (i < correspondence_rejectors_.size () - 1)
+ *temp_correspondences = *correspondences_;
+ }
+
+ int cnt = correspondences_->size ();
+ // Check whether we have enough correspondences
+ if (cnt < min_number_correspondences_)
+ {
+ PCL_ERROR ("[pcl::%s::computeTransformation] Not enough correspondences found. Relax your threshold parameters.\n", getClassName ().c_str ());
+ convergence_criteria_->setConvergenceState(pcl::registration::DefaultConvergenceCriteria<Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
+ converged_ = false;
+ break;
+ }
+
+ // Estimate the transform jointly, on a combined correspondence set
+ transformation_estimation_->estimateRigidTransformation (*inputs_transformed_combined, *targets_combined, *correspondences_, transformation_);
+
+ // Tranform the combined data
+ this->transformCloud (*inputs_transformed_combined, *inputs_transformed_combined, transformation_);
+ // And all its components
+ for (size_t i = 0; i < sources_.size (); i++)
+ {
+ this->transformCloud (*inputs_transformed[i], *inputs_transformed[i], transformation_);
+ }
+
+ // Obtain the final transformation
+ final_transformation_ = transformation_ * final_transformation_;
+
+ ++nr_iterations_;
+
+ // Update the vizualization of icp convergence
+ //if (update_visualizer_ != 0)
+ // update_visualizer_(output, source_indices_good, *target_, target_indices_good );
+
+ converged_ = static_cast<bool> ((*convergence_criteria_));
+ }
+ while (!converged_);
+
+ PCL_DEBUG ("Transformation is:\n\t%5f\t%5f\t%5f\t%5f\n\t%5f\t%5f\t%5f\t%5f\n\t%5f\t%5f\t%5f\t%5f\n\t%5f\t%5f\t%5f\t%5f\n",
+ final_transformation_ (0, 0), final_transformation_ (0, 1), final_transformation_ (0, 2), final_transformation_ (0, 3),
+ final_transformation_ (1, 0), final_transformation_ (1, 1), final_transformation_ (1, 2), final_transformation_ (1, 3),
+ final_transformation_ (2, 0), final_transformation_ (2, 1), final_transformation_ (2, 2), final_transformation_ (2, 3),
+ final_transformation_ (3, 0), final_transformation_ (3, 1), final_transformation_ (3, 2), final_transformation_ (3, 3));
+
+ // For fitness checks, etc, we'll use an aggregated cloud for now (should be evaluating independently for correctness, but this requires propagating a few virtual methods from Registration)
+ IterativeClosestPoint<PointSource, PointTarget, Scalar>::setInputSource (sources_combined);
+ IterativeClosestPoint<PointSource, PointTarget, Scalar>::setInputTarget (targets_combined);
+
+ // If we automatically set the correspondence estimators, we should clear them now
+ if (!manual_correspondence_estimations_set)
+ {
+ correspondence_estimations_.clear ();
+ }
+
+
+ // By definition, this method will return an empty cloud (for compliance with the ICP API).
+ // We can figure out a better solution, if necessary.
+ output = PointCloudSource ();
+}
+
+ template <typename PointSource, typename PointTarget, typename Scalar> void
+pcl::JointIterativeClosestPoint<PointSource, PointTarget, Scalar>::determineRequiredBlobData ()
+{
+ need_source_blob_ = false;
+ need_target_blob_ = false;
+ // Check estimators
+ for (size_t i = 0; i < correspondence_estimations_.size (); i++)
+ {
+ CorrespondenceEstimationPtr& ce = correspondence_estimations_[i];
+
+ need_source_blob_ |= ce->requiresSourceNormals ();
+ need_target_blob_ |= ce->requiresTargetNormals ();
+ // Add warnings if necessary
+ if (ce->requiresSourceNormals () && !source_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Estimator expects source normals, but we can't provide them.\n", getClassName ().c_str ());
+ }
+ if (ce->requiresTargetNormals () && !target_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Estimator expects target normals, but we can't provide them.\n", getClassName ().c_str ());
+ }
+ }
+ // Check rejectors
+ for (size_t i = 0; i < correspondence_rejectors_.size (); i++)
+ {
+ registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];
+ need_source_blob_ |= rej->requiresSourcePoints ();
+ need_source_blob_ |= rej->requiresSourceNormals ();
+ need_target_blob_ |= rej->requiresTargetPoints ();
+ need_target_blob_ |= rej->requiresTargetNormals ();
+ if (rej->requiresSourceNormals () && !source_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Rejector %s expects source normals, but we can't provide them.\n", getClassName ().c_str (), rej->getClassName ().c_str ());
+ }
+ if (rej->requiresTargetNormals () && !target_has_normals_)
+ {
+ PCL_WARN("[pcl::%s::determineRequiredBlobData] Rejector %s expects target normals, but we can't provide them.\n", getClassName ().c_str (), rej->getClassName ().c_str ());
+ }
+ }
+}
+
+
+#endif /* PCL_REGISTRATION_IMPL_JOINT_ICP_HPP_ */
+
+
#ifndef PCL_REGISTRATION_IMPL_PPF_REGISTRATION_H_
#define PCL_REGISTRATION_IMPL_PPF_REGISTRATION_H_
+#include <pcl/registration/ppf_registration.h>
#include <pcl/features/ppf.h>
#include <pcl/common/transforms.h>
scene_search_tree_->setInputCloud (target_);
}
-
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget> void
pcl::PPFRegistration<PointSource, PointTarget>::computeTransformation (PointCloudSource &output, const Eigen::Matrix4f& guess)
Eigen::Vector3f scene_reference_point = target_->points[scene_reference_index].getVector3fMap (),
scene_reference_normal = target_->points[scene_reference_index].getNormalVector3fMap ();
- Eigen::AngleAxisf rotation_sg (acosf (scene_reference_normal.dot (Eigen::Vector3f::UnitX ())),
- scene_reference_normal.cross (Eigen::Vector3f::UnitX ()). normalized());
- Eigen::Affine3f transform_sg (Eigen::Translation3f (rotation_sg * ((-1) * scene_reference_point)) * rotation_sg);
+ float rotation_angle_sg = acosf (scene_reference_normal.dot (Eigen::Vector3f::UnitX ()));
+ bool parallel_to_x_sg = (scene_reference_normal.y() == 0.0f && scene_reference_normal.z() == 0.0f);
+ Eigen::Vector3f rotation_axis_sg = (parallel_to_x_sg)?(Eigen::Vector3f::UnitY ()):(scene_reference_normal.cross (Eigen::Vector3f::UnitX ()). normalized());
+ Eigen::AngleAxisf rotation_sg (rotation_angle_sg, rotation_axis_sg);
+ Eigen::Affine3f transform_sg (Eigen::Translation3f ( rotation_sg * ((-1) * scene_reference_point)) * rotation_sg);
// For every other point in the scene => now have pair (s_r, s_i) fixed
std::vector<int> indices;
// Compute alpha_s angle
Eigen::Vector3f scene_point = target_->points[scene_point_index].getVector3fMap ();
- Eigen::AngleAxisf rotation_sg (acosf (scene_reference_normal.dot (Eigen::Vector3f::UnitX ())),
- scene_reference_normal.cross (Eigen::Vector3f::UnitX ()).normalized ());
- Eigen::Affine3f transform_sg = Eigen::Translation3f ( rotation_sg * ((-1) * scene_reference_point)) * rotation_sg;
-// float alpha_s = acos (Eigen::Vector3f::UnitY ().dot ((transform_sg * scene_point).normalized ()));
Eigen::Vector3f scene_point_transformed = transform_sg * scene_point;
float alpha_s = atan2f ( -scene_point_transformed(2), scene_point_transformed(1));
- if ( alpha_s != alpha_s)
- {
- PCL_ERROR ("alpha_s is nan\n");
- continue;
- }
if (sin (alpha_s) * scene_point_transformed(2) < 0.0f)
alpha_s *= (-1);
alpha_s *= (-1);
accumulator_array[model_reference_index][alpha_discretized] ++;
}
}
- else PCL_ERROR ("[pcl::PPFRegistration::computeTransformation] Computing pair feature vector between points %zu and %zu went wrong.\n", scene_reference_index, scene_point_index);
+ else PCL_ERROR ("[pcl::PPFRegistration::computeTransformation] Computing pair feature vector between points %u and %u went wrong.\n", scene_reference_index, scene_point_index);
}
}
Eigen::Vector3f model_reference_point = input_->points[max_votes_i].getVector3fMap (),
model_reference_normal = input_->points[max_votes_i].getNormalVector3fMap ();
- Eigen::AngleAxisf rotation_mg (acosf (model_reference_normal.dot (Eigen::Vector3f::UnitX ())), model_reference_normal.cross (Eigen::Vector3f::UnitX ()).normalized ());
- Eigen::Affine3f transform_mg = Eigen::Translation3f ( rotation_mg * ((-1) * model_reference_point)) * rotation_mg;
+ float rotation_angle_mg = acosf (model_reference_normal.dot (Eigen::Vector3f::UnitX ()));
+ bool parallel_to_x_mg = (model_reference_normal.y() == 0.0f && model_reference_normal.z() == 0.0f);
+ Eigen::Vector3f rotation_axis_mg = (parallel_to_x_mg)?(Eigen::Vector3f::UnitY ()):(model_reference_normal.cross (Eigen::Vector3f::UnitX ()). normalized());
+ Eigen::AngleAxisf rotation_mg (rotation_angle_mg, rotation_axis_mg);
+ Eigen::Affine3f transform_mg (Eigen::Translation3f ( rotation_mg * ((-1) * model_reference_point)) * rotation_mg);
Eigen::Affine3f max_transform =
transform_sg.inverse () *
Eigen::AngleAxisf ((static_cast<float> (max_votes_j) - floorf (static_cast<float> (M_PI) / search_method_->getAngleDiscretizationStep ())) * search_method_->getAngleDiscretizationStep (), Eigen::Vector3f::UnitX ()) *
// Transform the input dataset using the final transformation
PointCloudSource input_transformed;
- //transformPointCloud (*input_, input_transformed, final_transformation_);
- input_transformed.resize (input_->size ());
- for (size_t i = 0; i < input_->size (); ++i)
- {
- const PointSource &src = input_->points[i];
- PointTarget &tgt = input_transformed.points[i];
- tgt.x = static_cast<float> (final_transformation_ (0, 0) * src.x + final_transformation_ (0, 1) * src.y + final_transformation_ (0, 2) * src.z + final_transformation_ (0, 3));
- tgt.y = static_cast<float> (final_transformation_ (1, 0) * src.x + final_transformation_ (1, 1) * src.y + final_transformation_ (1, 2) * src.z + final_transformation_ (1, 3));
- tgt.z = static_cast<float> (final_transformation_ (2, 0) * src.x + final_transformation_ (2, 1) * src.y + final_transformation_ (2, 2) * src.z + final_transformation_ (2, 3));
- }
+ transformPointCloud (*input_, input_transformed, final_transformation_);
std::vector<int> nn_indices (1);
std::vector<float> nn_dists (1);
int nr = 0;
for (size_t i = 0; i < input_transformed.points.size (); ++i)
{
- Eigen::Vector4f p1 = Eigen::Vector4f (input_transformed.points[i].x,
- input_transformed.points[i].y,
- input_transformed.points[i].z, 0);
// Find its nearest neighbor in the target
tree_->nearestKSearch (input_transformed.points[i], 1, nn_indices, nn_dists);
// Deal with occlusions (incomplete targets)
- if (nn_dists[0] > max_range)
- continue;
-
- Eigen::Vector4f p2 = Eigen::Vector4f (target_->points[nn_indices[0]].x,
- target_->points[nn_indices[0]].y,
- target_->points[nn_indices[0]].z, 0);
- // Calculate the fitness score
- fitness_score += fabs ((p1-p2).squaredNorm ());
- nr++;
+ if (nn_dists[0] <= max_range)
+ {
+ // Add to the fitness score
+ fitness_score += nn_dists[0];
+ nr++;
+ }
}
if (nr > 0)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename FeatureT> void
pcl::SampleConsensusPrerejective<PointSource, PointTarget, FeatureT>::selectSamples (
- const PointCloudSource &cloud, int nr_samples,
- std::vector<int> &sample_indices)
+ const PointCloudSource &cloud, int nr_samples, std::vector<int> &sample_indices)
{
if (nr_samples > static_cast<int> (cloud.points.size ()))
{
PCL_ERROR ("[pcl::%s::selectSamples] ", getClassName ().c_str ());
- PCL_ERROR ("The number of samples (%d) must not be greater than the number of points (%zu)!\n",
+ PCL_ERROR ("The number of samples (%d) must not be greater than the number of points (%lu)!\n",
nr_samples, cloud.points.size ());
return;
}
+
+ sample_indices.resize (nr_samples);
+ int temp_sample;
- // Iteratively draw random samples until nr_samples is reached
- sample_indices.clear ();
- std::vector<bool> sampled_indices (cloud.points.size (), false);
- while (static_cast<int> (sample_indices.size ()) < nr_samples)
+ // Draw random samples until n samples is reached
+ for (int i = 0; i < nr_samples; i++)
{
- // Choose a unique sample at random
- int sample_index;
- do
+ // Select a random number
+ sample_indices[i] = getRandomIndex (static_cast<int> (cloud.points.size ()) - i);
+
+ // Run trough list of numbers, starting at the lowest, to avoid duplicates
+ for (int j = 0; j < i; j++)
{
- sample_index = getRandomIndex (static_cast<int> (cloud.points.size ()));
+ // Move value up if it is higher than previous selections to ensure true randomness
+ if (sample_indices[i] >= sample_indices[j])
+ {
+ sample_indices[i]++;
+ }
+ else
+ {
+ // The new number is lower, place it at the correct point and break for a sorted list
+ temp_sample = sample_indices[i];
+ for (int k = i; k > j; k--)
+ sample_indices[k] = sample_indices[k - 1];
+
+ sample_indices[j] = temp_sample;
+ break;
+ }
}
- while (sampled_indices[sample_index]);
-
- // Mark index as sampled
- sampled_indices[sample_index] = true;
-
- // Store
- sample_indices.push_back (sample_index);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointSource, typename PointTarget, typename FeatureT> void
pcl::SampleConsensusPrerejective<PointSource, PointTarget, FeatureT>::findSimilarFeatures (
- const FeatureCloud &input_features, const std::vector<int> &sample_indices,
- std::vector<int> &corresponding_indices)
+ const std::vector<int> &sample_indices,
+ std::vector<std::vector<int> >& similar_features,
+ std::vector<int> &corresponding_indices)
{
- std::vector<int> nn_indices (k_correspondences_);
- std::vector<float> nn_distances (k_correspondences_);
-
+ // Allocate results
corresponding_indices.resize (sample_indices.size ());
+ std::vector<float> nn_distances (k_correspondences_);
+
+ // Loop over the sampled features
for (size_t i = 0; i < sample_indices.size (); ++i)
{
- // Find the k features nearest to input_features.points[sample_indices[i]]
- feature_tree_->nearestKSearch (input_features, sample_indices[i], k_correspondences_, nn_indices, nn_distances);
+ // Current feature index
+ const int idx = sample_indices[i];
+
+ // Find the k nearest feature neighbors to the sampled input feature if they are not in the cache already
+ if (similar_features[idx].empty ())
+ feature_tree_->nearestKSearch (*input_features_, idx, k_correspondences_, similar_features[idx], nn_distances);
// Select one at random and add it to corresponding_indices
if (k_correspondences_ == 1)
- {
- corresponding_indices[i] = nn_indices[0];
- }
+ corresponding_indices[i] = similar_features[idx][0];
else
- {
- int random_correspondence = getRandomIndex (k_correspondences_);
- corresponding_indices[i] = nn_indices[random_correspondence];
- }
+ corresponding_indices[i] = similar_features[idx][getRandomIndex (k_correspondences_)];
}
}
return;
}
+ if (k_correspondences_ <= 0)
+ {
+ PCL_ERROR ("[pcl::%s::computeTransformation] ", getClassName ().c_str ());
+ PCL_ERROR ("Illegal correspondence randomness %d, must be > 0!\n",
+ k_correspondences_);
+ return;
+ }
+
// Initialize prerejector (similarity threshold already set to default value in constructor)
correspondence_rejector_poly_->setInputSource (input_);
correspondence_rejector_poly_->setInputTarget (target_);
correspondence_rejector_poly_->setCardinality (nr_samples_);
- std::vector<bool> accepted (input_->size (), false); // Indices of sampled points that passed prerejection
int num_rejections = 0; // For debugging
// Initialize results
}
}
+ // Feature correspondence cache
+ std::vector<std::vector<int> > similar_features (input_->size ());
+
// Start
for (int i = 0; i < max_iterations_; ++i)
{
// Temporary containers
- std::vector<int> sample_indices (nr_samples_);
- std::vector<int> corresponding_indices (nr_samples_);
+ std::vector<int> sample_indices;
+ std::vector<int> corresponding_indices;
// Draw nr_samples_ random samples
selectSamples (*input_, nr_samples_, sample_indices);
- // Check if all sampled points already been accepted
- bool samples_accepted = true;
- for (unsigned int j = 0; j < sample_indices.size(); ++j) {
- if (!accepted[j]) {
- samples_accepted = false;
- break;
- }
- }
-
- // All points have already been accepted, avoid
- if (samples_accepted)
- continue;
-
// Find corresponding features in the target cloud
- findSimilarFeatures (*input_features_, sample_indices, corresponding_indices);
+ findSimilarFeatures (sample_indices, similar_features, corresponding_indices);
// Apply prerejection
- if (!correspondence_rejector_poly_->thresholdPolygon (sample_indices, corresponding_indices)) {
+ if (!correspondence_rejector_poly_->thresholdPolygon (sample_indices, corresponding_indices))
+ {
++num_rejections;
continue;
}
// If the new fit is better, update results
inlier_fraction = static_cast<float> (inliers.size ()) / static_cast<float> (input_->size ());
-
- if (inlier_fraction >= inlier_fraction_) {
- // Mark the sampled points accepted
- for (int j = 0; j < nr_samples_; ++j)
- accepted[j] = true;
-
- // Update result if pose hypothesis is better
- if (error < lowest_error) {
- inliers_ = inliers;
- lowest_error = error;
- converged_ = true;
- final_transformation_ = transformation_;
- }
+
+ // Update result if pose hypothesis is better
+ if (inlier_fraction >= inlier_fraction_ && error < lowest_error)
+ {
+ inliers_ = inliers;
+ lowest_error = error;
+ converged_ = true;
+ final_transformation_ = transformation_;
}
}
// Check if point is an inlier
if (nn_dists[0] < max_range)
{
- // Errors
- const float dx = input_transformed.points[i].x - target_->points[nn_indices[0]].x;
- const float dy = input_transformed.points[i].y - target_->points[nn_indices[0]].y;
- const float dz = input_transformed.points[i].z - target_->points[nn_indices[0]].z;
-
// Update inliers
inliers.push_back (static_cast<int> (i));
// Update fitness score
- fitness_score += dx*dx + dy*dy + dz*dz;
+ fitness_score += nn_dists[0];
}
}
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimation2D::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimation2D::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::Transformation2D::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::Transformation2D::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::TransformationEstimation2D::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimation2D::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::TransformationDQ::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationDQ::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationDualQuaternion::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationDualQuaternion::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::TransformationDQ::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationDQ::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::TransformationEstimationDualQuaternion::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationDualQuaternion::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
if (cloud_src.points.size () != cloud_tgt.points.size ())
{
PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] ");
- PCL_ERROR ("Number or points in source (%zu) differs than target (%zu)!\n",
+ PCL_ERROR ("Number or points in source (%lu) differs than target (%lu)!\n",
cloud_src.points.size (), cloud_tgt.points.size ());
return;
}
if (cloud_src.points.size () < 4) // need at least 4 samples
{
PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] ");
- PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %zu points!\n",
+ PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %lu points!\n",
cloud_src.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::registration::TransformationEstimationLM::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
if (indices_src.size () < 4) // need at least 4 samples
{
PCL_ERROR ("[pcl::IterativeClosestPointNonLinear::estimateRigidTransformationLM] ");
- PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %zu points!",
+ PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %lu points!",
indices_src.size ());
return;
}
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
size_t nr_points = indices_src.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
size_t nr_points = indices_src.size ();
if (indices_tgt.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLS::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
if (!pcl_isfinite (source_it->x) ||
!pcl_isfinite (source_it->y) ||
!pcl_isfinite (source_it->z) ||
- !pcl_isfinite (source_it->normal_x) ||
- !pcl_isfinite (source_it->normal_y) ||
- !pcl_isfinite (source_it->normal_z) ||
!pcl_isfinite (target_it->x) ||
!pcl_isfinite (target_it->y) ||
!pcl_isfinite (target_it->z) ||
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
size_t nr_points = indices_src.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
size_t nr_points = indices_src.size ();
if (indices_tgt.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationPointToPlaneLLSWeighted::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
if (!pcl_isfinite (source_it->x) ||
!pcl_isfinite (source_it->y) ||
!pcl_isfinite (source_it->z) ||
- !pcl_isfinite (source_it->normal_x) ||
- !pcl_isfinite (source_it->normal_y) ||
- !pcl_isfinite (source_it->normal_z) ||
!pcl_isfinite (target_it->x) ||
!pcl_isfinite (target_it->y) ||
!pcl_isfinite (target_it->z) ||
if (cloud_src.points.size () != cloud_tgt.points.size ())
{
PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] ");
- PCL_ERROR ("Number or points in source (%zu) differs than target (%zu)!\n",
+ PCL_ERROR ("Number or points in source (%lu) differs than target (%lu)!\n",
cloud_src.points.size (), cloud_tgt.points.size ());
return;
}
if (cloud_src.points.size () < 4) // need at least 4 samples
{
PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] ");
- PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %zu points!\n",
+ PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %lu points!\n",
cloud_src.points.size ());
return;
}
if (correspondence_weights_.size () != cloud_src.size ())
{
PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] ");
- PCL_ERROR ("Number of weights (%zu) differs than number of points (%zu)!\n",
+ PCL_ERROR ("Number of weights (%lu) differs than number of points (%lu)!\n",
correspondence_weights_.size (), cloud_src.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
if (correspondence_weights_.size () != indices_src.size ())
{
PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] ");
- PCL_ERROR ("Number of weights (%zu) differs than number of points (%zu)!\n",
+ PCL_ERROR ("Number of weights (%lu) differs than number of points (%lu)!\n",
correspondence_weights_.size (), indices_src.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
if (indices_src.size () < 4) // need at least 4 samples
{
PCL_ERROR ("[pcl::IterativeClosestPointNonLinear::estimateRigidTransformationLM] ");
- PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %zu points!",
+ PCL_ERROR ("Need at least 4 points to estimate a transform! Source and target have %lu points!",
indices_src.size ());
return;
}
if (correspondence_weights_.size () != indices_src.size ())
{
PCL_ERROR ("[pcl::registration::TransformationEstimationPointToPlaneWeighted::estimateRigidTransformation] ");
- PCL_ERROR ("Number of weights (%zu) differs than number of points (%zu)!\n",
+ PCL_ERROR ("Number of weights (%lu) differs than number of points (%lu)!\n",
correspondence_weights_.size (), indices_src.size ());
return;
}
size_t nr_points = cloud_src.points.size ();
if (cloud_tgt.points.size () != nr_points)
{
- PCL_ERROR ("[pcl::TransformationEstimationSVD::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", nr_points, cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationSVD::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", nr_points, cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != cloud_tgt.points.size ())
{
- PCL_ERROR ("[pcl::TransformationSVD::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.points.size ());
+ PCL_ERROR ("[pcl::TransformationSVD::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), cloud_tgt.points.size ());
return;
}
{
if (indices_src.size () != indices_tgt.size ())
{
- PCL_ERROR ("[pcl::TransformationEstimationSVD::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
+ PCL_ERROR ("[pcl::TransformationEstimationSVD::estimateRigidTransformation] Number or points in source (%lu) differs than target (%lu)!\n", indices_src.size (), indices_tgt.size ());
return;
}
// Convert to Eigen format
const int npts = static_cast <int> (source_it.size ());
- Eigen::Matrix<Scalar, 3, Eigen::Dynamic> cloud_src (3, npts);
- Eigen::Matrix<Scalar, 3, Eigen::Dynamic> cloud_tgt (3, npts);
- for (int i = 0; i < npts; ++i)
- {
- cloud_src (0, i) = source_it->x;
- cloud_src (1, i) = source_it->y;
- cloud_src (2, i) = source_it->z;
- ++source_it;
-
- cloud_tgt (0, i) = target_it->x;
- cloud_tgt (1, i) = target_it->y;
- cloud_tgt (2, i) = target_it->z;
- ++target_it;
- }
if (use_umeyama_)
{
+ Eigen::Matrix<Scalar, 3, Eigen::Dynamic> cloud_src (3, npts);
+ Eigen::Matrix<Scalar, 3, Eigen::Dynamic> cloud_tgt (3, npts);
+
+ for (int i = 0; i < npts; ++i)
+ {
+ cloud_src (0, i) = source_it->x;
+ cloud_src (1, i) = source_it->y;
+ cloud_src (2, i) = source_it->z;
+ ++source_it;
+
+ cloud_tgt (0, i) = target_it->x;
+ cloud_tgt (1, i) = target_it->y;
+ cloud_tgt (2, i) = target_it->z;
+ ++target_it;
+ }
+
// Call Umeyama directly from Eigen (PCL patched version until Eigen is released)
transformation_matrix = pcl::umeyama (cloud_src, cloud_tgt, false);
}
scale2 = sum_tt_ / sum_ss;
float scale = scale2;
transformation_matrix.topLeftCorner (3, 3) = scale * R;
- const Eigen::Matrix<Scalar, 3, 1> Rc (R * centroid_src.head (3));
+ const Eigen::Matrix<Scalar, 3, 1> Rc (scale * R * centroid_src.head (3));
transformation_matrix.block (0, 3, 3, 1) = centroid_tgt. head (3) - Rc;
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_JOINT_ICP_H_
+#define PCL_JOINT_ICP_H_
+
+// PCL includes
+#include <pcl/registration/icp.h>
+namespace pcl
+{
+ /** \brief @b JointIterativeClosestPoint extends ICP to multiple frames which
+ * share the same transform. This is particularly useful when solving for
+ * camera extrinsics using multiple observations. When given a single pair of
+ * clouds, this reduces to vanilla ICP.
+ *
+ * \author Stephen Miller
+ * \ingroup registration
+ */
+ template <typename PointSource, typename PointTarget, typename Scalar = float>
+ class JointIterativeClosestPoint : public IterativeClosestPoint<PointSource, PointTarget, Scalar>
+ {
+ public:
+ typedef typename IterativeClosestPoint<PointSource, PointTarget, Scalar>::PointCloudSource PointCloudSource;
+ typedef typename PointCloudSource::Ptr PointCloudSourcePtr;
+ typedef typename PointCloudSource::ConstPtr PointCloudSourceConstPtr;
+
+ typedef typename IterativeClosestPoint<PointSource, PointTarget, Scalar>::PointCloudTarget PointCloudTarget;
+ typedef typename PointCloudTarget::Ptr PointCloudTargetPtr;
+ typedef typename PointCloudTarget::ConstPtr PointCloudTargetConstPtr;
+
+ typedef pcl::search::KdTree<PointTarget> KdTree;
+ typedef typename pcl::search::KdTree<PointTarget>::Ptr KdTreePtr;
+
+ typedef pcl::search::KdTree<PointSource> KdTreeReciprocal;
+ typedef typename KdTree::Ptr KdTreeReciprocalPtr;
+
+
+ typedef PointIndices::Ptr PointIndicesPtr;
+ typedef PointIndices::ConstPtr PointIndicesConstPtr;
+
+ typedef boost::shared_ptr<JointIterativeClosestPoint<PointSource, PointTarget, Scalar> > Ptr;
+ typedef boost::shared_ptr<const JointIterativeClosestPoint<PointSource, PointTarget, Scalar> > ConstPtr;
+
+ typedef typename pcl::registration::CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> CorrespondenceEstimation;
+ typedef typename CorrespondenceEstimation::Ptr CorrespondenceEstimationPtr;
+ typedef typename CorrespondenceEstimation::ConstPtr CorrespondenceEstimationConstPtr;
+
+
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::reg_name_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::getClassName;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::setInputSource;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::input_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::indices_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::target_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::nr_iterations_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::max_iterations_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::previous_transformation_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::final_transformation_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::transformation_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::transformation_epsilon_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::converged_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::corr_dist_threshold_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::inlier_threshold_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::min_number_correspondences_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::update_visualizer_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::euclidean_fitness_epsilon_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::correspondences_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::transformation_estimation_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::correspondence_estimation_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::correspondence_rejectors_;
+
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::use_reciprocal_correspondence_;
+
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::convergence_criteria_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::source_has_normals_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::target_has_normals_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::need_source_blob_;
+ using IterativeClosestPoint<PointSource, PointTarget, Scalar>::need_target_blob_;
+
+
+ typedef typename IterativeClosestPoint<PointSource, PointTarget, Scalar>::Matrix4 Matrix4;
+
+ /** \brief Empty constructor. */
+ JointIterativeClosestPoint ()
+ {
+ IterativeClosestPoint<PointSource, PointTarget, Scalar> ();
+ reg_name_ = "JointIterativeClosestPoint";
+ };
+
+ /** \brief Empty destructor */
+ virtual ~JointIterativeClosestPoint () {}
+
+
+ /** \brief Provide a pointer to the input source
+ * (e.g., the point cloud that we want to align to the target)
+ */
+ virtual void
+ setInputSource (const PointCloudSourceConstPtr& /*cloud*/)
+ {
+ PCL_WARN ("[pcl::%s::setInputSource] Warning; JointIterativeClosestPoint expects multiple clouds. Please use addInputSource.",
+ getClassName ().c_str ());
+ return;
+ }
+
+ /** \brief Add a source cloud to the joint solver
+ *
+ * \param[in] cloud source cloud
+ */
+ inline void
+ addInputSource (const PointCloudSourceConstPtr &cloud)
+ {
+ // Set the parent InputSource, just to get all cached values (e.g. the existence of normals).
+ if (sources_.empty ())
+ IterativeClosestPoint<PointSource, PointTarget, Scalar>::setInputSource (cloud);
+ sources_.push_back (cloud);
+ }
+
+ /** \brief Provide a pointer to the input target
+ * (e.g., the point cloud that we want to align to the target)
+ */
+ virtual void
+ setInputTarget (const PointCloudTargetConstPtr& /*cloud*/)
+ {
+ PCL_WARN ("[pcl::%s::setInputTarget] Warning; JointIterativeClosestPoint expects multiple clouds. Please use addInputTarget.",
+ getClassName ().c_str ());
+ return;
+ }
+
+ /** \brief Add a target cloud to the joint solver
+ *
+ * \param[in] cloud target cloud
+ */
+ inline void
+ addInputTarget (const PointCloudTargetConstPtr &cloud)
+ {
+ // Set the parent InputTarget, just to get all cached values (e.g. the existence of normals).
+ if (targets_.empty ())
+ IterativeClosestPoint<PointSource, PointTarget, Scalar>::setInputTarget (cloud);
+ targets_.push_back (cloud);
+ }
+
+ /** \brief Add a manual correspondence estimator
+ * If you choose to do this, you must add one for each
+ * input source / target pair. They do not need to have trees
+ * or input clouds set ahead of time.
+ *
+ * \param[in] ce Correspondence estimation
+ */
+ inline void
+ addCorrespondenceEstimation (CorrespondenceEstimationPtr ce)
+ {
+ correspondence_estimations_.push_back (ce);
+ }
+
+ /** \brief Reset my list of input sources
+ */
+ inline void
+ clearInputSources ()
+ { sources_.clear (); }
+
+ /** \brief Reset my list of input targets
+ */
+ inline void
+ clearInputTargets ()
+ { targets_.clear (); }
+
+ /** \brief Reset my list of correspondence estimation methods.
+ */
+ inline void
+ clearCorrespondenceEstimations ()
+ { correspondence_estimations_.clear (); }
+
+
+ protected:
+
+ /** \brief Rigid transformation computation method with initial guess.
+ * \param output the transformed input point cloud dataset using the rigid transformation found
+ * \param guess the initial guess of the transformation to compute
+ */
+ virtual void
+ computeTransformation (PointCloudSource &output, const Matrix4 &guess);
+
+ /** \brief Looks at the Estimators and Rejectors and determines whether their blob-setter methods need to be called */
+ void
+ determineRequiredBlobData ();
+
+ std::vector<PointCloudSourceConstPtr> sources_;
+ std::vector<PointCloudTargetConstPtr> targets_;
+ std::vector<CorrespondenceEstimationPtr> correspondence_estimations_;
+ };
+
+}
+
+#include <pcl/registration/impl/joint_icp.hpp>
+
+#endif //#ifndef PCL_JOINT_ICP_H_
+
+
* \note Trial Value Selection [More, Thuente 1994], \f$ \psi(\alpha_k) \f$ is used for \f$ f_k \f$ and \f$ g_k \f$
* until some value satifies the test \f$ \psi(\alpha_k) \leq 0 \f$ and \f$ \phi'(\alpha_k) \geq 0 \f$
* then \f$ \phi(\alpha_k) \f$ is used from then on.
- * \note Interpolation Minimizer equations from Optimization Theory and Methods: Nonlinear Programming By Wenyu Sun, Ya-xiang Yuan (89-100).<\b>
+ * \note Interpolation Minimizer equations from Optimization Theory and Methods: Nonlinear Programming By Wenyu Sun, Ya-xiang Yuan (89-100).
* \param[in] a_l first endpoint of interval \f$ I \f$, \f$ \alpha_l \f$ in Moore-Thuente (1994)
* \param[in] f_l value at first endpoint, \f$ f_l \f$ in Moore-Thuente (1994)
* \param[in] g_l derivative at first endpoint, \f$ g_l \f$ in Moore-Thuente (1994)
*
* \param[in] cloud the input point cloud source
*/
- PCL_DEPRECATED (void setInputCloud (const PointCloudSourceConstPtr &cloud), "[pcl::registration::Registration::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::Registration::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead.")
+ void
+ setInputCloud (const PointCloudSourceConstPtr &cloud);
/** \brief Get a pointer to the input point cloud dataset target. */
- PCL_DEPRECATED (PointCloudSourceConstPtr const getInputCloud (), "[pcl::registration::Registration::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.");
+ PCL_DEPRECATED ("[pcl::registration::Registration::getInputCloud] getInputCloud is deprecated. Please use getInputSource instead.")
+ PointCloudSourceConstPtr const
+ getInputCloud ();
/** \brief Provide a pointer to the input source
* (e.g., the point cloud that we want to align to the target)
* \param sample_indices the resulting sample indices
*/
void
- selectSamples (const PointCloudSource &cloud, int nr_samples,
- std::vector<int> &sample_indices);
+ selectSamples (const PointCloudSource &cloud, int nr_samples, std::vector<int> &sample_indices);
/** \brief For each of the sample points, find a list of points in the target cloud whose features are similar to
* the sample points' features. From these, select one randomly which will be considered that sample point's
- * correspondence.
- * \param input_features a cloud of feature descriptors
+ * correspondence.
* \param sample_indices the indices of each sample point
+ * \param similar_features correspondence cache, which is used to read/write already computed correspondences
* \param corresponding_indices the resulting indices of each sample's corresponding point in the target cloud
*/
void
- findSimilarFeatures (const FeatureCloud &input_features, const std::vector<int> &sample_indices,
- std::vector<int> &corresponding_indices);
+ findSimilarFeatures (const std::vector<int> &sample_indices,
+ std::vector<std::vector<int> >& similar_features,
+ std::vector<int> &corresponding_indices);
/** \brief Rigid transformation computation method.
* \param output the transformed input point cloud dataset using the rigid transformation found
+ * \param guess The computed transformation
*/
void
computeTransformation (PointCloudSource &output, const Eigen::Matrix4f& guess);
{}
/** Copy constructor
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctor (const OptimizationFunctor &src) :
Functor<MatScalar> (src.m_data_points_), estimator_ ()
}
/** Copy operator
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctor&
operator = (const OptimizationFunctor &src)
{}
/** Copy constructor
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctorWithIndices (const OptimizationFunctorWithIndices &src)
: Functor<MatScalar> (src.m_data_points_), estimator_ ()
}
/** Copy operator
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctorWithIndices&
operator = (const OptimizationFunctorWithIndices &src)
* \param[in] tx the x translation
* \param[in] ty the y translation
* \param[in] tz the z translation
- * \param[out] transformation the resultant transformation matrix
+ * \param[out] transformation_matrix the resultant transformation matrix
*/
inline void
constructTransformationMatrix (const double & alpha, const double & beta, const double & gamma,
/** \brief Estimate a rigid rotation transformation between a source and a target
* \param[in] source_it an iterator over the source point cloud dataset
* \param[in] target_it an iterator over the target point cloud dataset
+ * \param weights_it
* \param[out] transformation_matrix the resultant transformation matrix
*/
void
* \param[in] tx the x translation
* \param[in] ty the y translation
* \param[in] tz the z translation
- * \param[out] transformation the resultant transformation matrix
+ * \param[out] transformation_matrix the resultant transformation matrix
*/
inline void
constructTransformationMatrix (const double & alpha, const double & beta, const double & gamma,
{}
/** Copy constructor
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctor (const OptimizationFunctor &src) :
Functor<MatScalar> (src.m_data_points_), estimator_ ()
}
/** Copy operator
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctor&
operator = (const OptimizationFunctor &src)
{}
/** Copy constructor
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctorWithIndices (const OptimizationFunctorWithIndices &src)
: Functor<MatScalar> (src.m_data_points_), estimator_ ()
}
/** Copy operator
- * \param[in] the optimization functor to copy into this
+ * \param[in] src the optimization functor to copy into this
*/
inline OptimizationFunctorWithIndices&
operator = (const OptimizationFunctorWithIndices &src)
int nan_count_tgt = 0;
for (int x_d = -window_size_/2; x_d <= window_size_/2; ++x_d)
for (int y_d = -window_size_/2; y_d <= window_size_/2; ++y_d)
- if (x + x_d >= 0 && x + x_d < cloud->width &&
- y + y_d >= 0 && y + y_d < cloud->height)
+ if (x + x_d >= 0 && x + x_d < static_cast<int> (cloud->width) &&
+ y + y_d >= 0 && y + y_d < static_cast<int> (cloud->height))
{
if (!pcl_isfinite ((*cloud)(x + x_d, y + y_d).z) ||
fabs ((*cloud)(x, y).z - (*cloud)(x + x_d, y + y_d).z) > depth_step_threshold_)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/registration/gicp6d.h>
+
+namespace pcl
+{
+ // convert sRGB to CIELAB
+ Eigen::Vector3f
+ RGB2Lab (const Eigen::Vector3i& colorRGB)
+ {
+ // for sRGB -> CIEXYZ see http://www.easyrgb.com/index.php?X=MATH&H=02#text2
+ // for CIEXYZ -> CIELAB see http://www.easyrgb.com/index.php?X=MATH&H=07#text7
+
+ double R, G, B, X, Y, Z;
+
+ // map sRGB values to [0, 1]
+ R = colorRGB[0] / 255.0;
+ G = colorRGB[1] / 255.0;
+ B = colorRGB[2] / 255.0;
+
+ // linearize sRGB values
+ if (R > 0.04045)
+ R = pow ( (R + 0.055) / 1.055, 2.4);
+ else
+ R = R / 12.92;
+
+ if (G > 0.04045)
+ G = pow ( (G + 0.055) / 1.055, 2.4);
+ else
+ G = G / 12.92;
+
+ if (B > 0.04045)
+ B = pow ( (B + 0.055) / 1.055, 2.4);
+ else
+ B = B / 12.92;
+
+ // postponed:
+ // R *= 100.0;
+ // G *= 100.0;
+ // B *= 100.0;
+
+ // linear sRGB -> CIEXYZ
+ X = R * 0.4124 + G * 0.3576 + B * 0.1805;
+ Y = R * 0.2126 + G * 0.7152 + B * 0.0722;
+ Z = R * 0.0193 + G * 0.1192 + B * 0.9505;
+
+ // *= 100.0 including:
+ X /= 0.95047; //95.047;
+ // Y /= 1;//100.000;
+ Z /= 1.08883; //108.883;
+
+ // CIEXYZ -> CIELAB
+ if (X > 0.008856)
+ X = pow (X, 1.0 / 3.0);
+ else
+ X = 7.787 * X + 16.0 / 116.0;
+
+ if (Y > 0.008856)
+ Y = pow (Y, 1.0 / 3.0);
+ else
+ Y = 7.787 * Y + 16.0 / 116.0;
+
+ if (Z > 0.008856)
+ Z = pow (Z, 1.0 / 3.0);
+ else
+ Z = 7.787 * Z + 16.0 / 116.0;
+
+ Eigen::Vector3f colorLab;
+ colorLab[0] = static_cast<float> (116.0 * Y - 16.0);
+ colorLab[1] = static_cast<float> (500.0 * (X - Y));
+ colorLab[2] = static_cast<float> (200.0 * (Y - Z));
+
+ return colorLab;
+ }
+
+ // convert a PointXYZRGBA cloud to a PointXYZLAB cloud
+ void
+ convertRGBAToLAB (const PointCloud<pcl::PointXYZRGBA>& in, PointCloud<PointXYZLAB>& out)
+ {
+ out.resize (in.size ());
+
+ for (size_t i = 0; i < in.size (); ++i)
+ {
+ out[i].x = in[i].x;
+ out[i].y = in[i].y;
+ out[i].z = in[i].z;
+ out[i].data[3] = 1.0; // important for homogeneous coordinates
+
+ Eigen::Vector3f lab = RGB2Lab (in[i].getRGBVector3i ());
+ out[i].L = lab[0];
+ out[i].a = lab[1];
+ out[i].b = lab[2];
+ }
+ }
+
+ GeneralizedIterativeClosestPoint6D::GeneralizedIterativeClosestPoint6D (float lab_weight) :
+ cloud_lab_ (new pcl::PointCloud<PointXYZLAB>), target_lab_ (new pcl::PointCloud<PointXYZLAB>), lab_weight_ (lab_weight)
+ {
+ // set rescale mask (leave x,y,z unchanged, scale L,a,b by lab_weight)
+ float alpha[6] = { 1.0, 1.0, 1.0, lab_weight_, lab_weight_, lab_weight_ };
+ point_rep_.setRescaleValues (alpha);
+ }
+
+ void
+ GeneralizedIterativeClosestPoint6D::setInputSource (const PointCloudSourceConstPtr& cloud)
+ {
+ // call corresponding base class method
+ GeneralizedIterativeClosestPoint<PointSource, PointTarget>::setInputSource (cloud);
+
+ // in addition, convert colors of the cloud to CIELAB
+ convertRGBAToLAB (*cloud, *cloud_lab_);
+ }
+
+ void
+ GeneralizedIterativeClosestPoint6D::setInputTarget (const PointCloudTargetConstPtr& target)
+ {
+ // call corresponding base class method
+ GeneralizedIterativeClosestPoint<PointSource, PointTarget>::setInputTarget (
+ target);
+
+ // in addition, convert colors of the cloud to CIELAB...
+ convertRGBAToLAB (*target, *target_lab_);
+
+ // ...and build 6d-tree
+ target_tree_lab_.setInputCloud (target_lab_);
+ target_tree_lab_.setPointRepresentation (
+ boost::make_shared<MyPointRepresentation> (point_rep_));
+ }
+
+ bool
+ GeneralizedIterativeClosestPoint6D::searchForNeighbors (const PointXYZLAB& query, std::vector<int>& index,
+ std::vector<float>& distance)
+ {
+ int k = target_tree_lab_.nearestKSearch (query, 1, index, distance);
+
+ // check if neighbor was found
+ return (k != 0);
+ }
+
+// taken from the original GICP class and modified slightly to make use of color values
+ void
+ GeneralizedIterativeClosestPoint6D::computeTransformation (PointCloudSource& output, const Eigen::Matrix4f& guess)
+ {
+ using namespace pcl;
+ using namespace std;
+
+ IterativeClosestPoint<PointSource, PointTarget>::initComputeReciprocal ();
+
+ // Difference between consecutive transforms
+ double delta = 0;
+ // Get the size of the target
+ const size_t N = indices_->size ();
+
+ // Set the mahalanobis matrices to identity
+ mahalanobis_.resize (N, Eigen::Matrix3d::Identity ());
+
+ // Compute target cloud covariance matrices
+ computeCovariances<PointTarget> (target_, tree_, target_covariances_);
+ // Compute input cloud covariance matrices
+ computeCovariances<PointSource> (input_, tree_reciprocal_,
+ input_covariances_);
+
+ base_transformation_ = guess;
+ nr_iterations_ = 0;
+ converged_ = false;
+ double dist_threshold = corr_dist_threshold_ * corr_dist_threshold_;
+ std::vector<int> nn_indices (1);
+ std::vector<float> nn_dists (1);
+
+ while (!converged_)
+ {
+ size_t cnt = 0;
+ std::vector<int> source_indices (indices_->size ());
+ std::vector<int> target_indices (indices_->size ());
+
+ // guess corresponds to base_t and transformation_ to t
+ Eigen::Matrix4d transform_R = Eigen::Matrix4d::Zero ();
+ for (size_t i = 0; i < 4; i++)
+ for (size_t j = 0; j < 4; j++)
+ for (size_t k = 0; k < 4; k++)
+ transform_R (i, j) += double (transformation_ (i, k))
+ * double (guess (k, j));
+
+ Eigen::Matrix3d R = transform_R.topLeftCorner<3, 3> ();
+
+ for (size_t i = 0; i < N; i++)
+ {
+ // MODIFICATION: take point from the CIELAB cloud instead
+ PointXYZLAB query = (*cloud_lab_)[i];
+ query.getVector4fMap () = guess * query.getVector4fMap ();
+ query.getVector4fMap () = transformation_ * query.getVector4fMap ();
+
+ if (!searchForNeighbors (query, nn_indices, nn_dists))
+ {
+ PCL_ERROR(
+ "[pcl::%s::computeTransformation] Unable to find a nearest neighbor in the target dataset for point %d in the source!\n",
+ getClassName ().c_str (), (*indices_)[i]);
+ return;
+ }
+
+ // Check if the distance to the nearest neighbor is smaller than the user imposed threshold
+ if (nn_dists[0] < dist_threshold)
+ {
+ Eigen::Matrix3d &C1 = input_covariances_[i];
+ Eigen::Matrix3d &C2 = target_covariances_[nn_indices[0]];
+ Eigen::Matrix3d &M = mahalanobis_[i];
+ // M = R*C1
+ M = R * C1;
+ // temp = M*R' + C2 = R*C1*R' + C2
+ Eigen::Matrix3d temp = M * R.transpose ();
+ temp += C2;
+ // M = temp^-1
+ M = temp.inverse ();
+ source_indices[cnt] = static_cast<int> (i);
+ target_indices[cnt] = nn_indices[0];
+ cnt++;
+ }
+ }
+ // Resize to the actual number of valid correspondences
+ source_indices.resize (cnt);
+ target_indices.resize (cnt);
+ /* optimize transformation using the current assignment and Mahalanobis metrics*/
+ previous_transformation_ = transformation_;
+ //optimization right here
+ try
+ {
+ rigid_transformation_estimation_ (output, source_indices, *target_,
+ target_indices, transformation_);
+ /* compute the delta from this iteration */
+ delta = 0.;
+ for (int k = 0; k < 4; k++)
+ {
+ for (int l = 0; l < 4; l++)
+ {
+ double ratio = 1;
+ if (k < 3 && l < 3) // rotation part of the transform
+ ratio = 1. / rotation_epsilon_;
+ else
+ ratio = 1. / transformation_epsilon_;
+ double c_delta = ratio
+ * fabs (
+ previous_transformation_ (k, l) - transformation_ (k, l));
+ if (c_delta > delta)
+ delta = c_delta;
+ }
+ }
+ }
+ catch (PCLException &e)
+ {
+ PCL_DEBUG("[pcl::%s::computeTransformation] Optimization issue %s\n",
+ getClassName ().c_str (), e.what ());
+ break;
+ }
+
+ nr_iterations_++;
+ // Check for convergence
+ if (nr_iterations_ >= max_iterations_ || delta < 1)
+ {
+ converged_ = true;
+ previous_transformation_ = transformation_;
+ PCL_DEBUG(
+ "[pcl::%s::computeTransformation] Convergence reached. Number of iterations: %d out of %d. Transformation difference: %f\n",
+ getClassName ().c_str (), nr_iterations_, max_iterations_,
+ (transformation_ - previous_transformation_).array ().abs ().sum ());
+ }
+ else
+ PCL_DEBUG("[pcl::%s::computeTransformation] Convergence failed\n",
+ getClassName ().c_str ());
+ }
+ //for some reason the static equivalent methode raises an error
+ // final_transformation_.block<3,3> (0,0) = (transformation_.block<3,3> (0,0)) * (guess.block<3,3> (0,0));
+ // final_transformation_.block <3, 1> (0, 3) = transformation_.block <3, 1> (0, 3) + guess.rightCols<1>.block <3, 1> (0, 3);
+ final_transformation_.topLeftCorner (3, 3) =
+ previous_transformation_.topLeftCorner (3, 3)
+ * guess.topLeftCorner (3, 3);
+ final_transformation_ (0, 3) = previous_transformation_ (0, 3) + guess (0, 3);
+ final_transformation_ (1, 3) = previous_transformation_ (1, 3) + guess (1, 3);
+ final_transformation_ (2, 3) = previous_transformation_ (2, 3) + guess (2, 3);
+ }
+
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <pcl/registration/joint_icp.h>
set(SUBSYS_DEPS common search)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/lmeds.h
- include/pcl/${SUBSYS_NAME}/method_types.h
- include/pcl/${SUBSYS_NAME}/mlesac.h
- include/pcl/${SUBSYS_NAME}/model_types.h
- include/pcl/${SUBSYS_NAME}/msac.h
- include/pcl/${SUBSYS_NAME}/ransac.h
- include/pcl/${SUBSYS_NAME}/rmsac.h
- include/pcl/${SUBSYS_NAME}/rransac.h
- include/pcl/${SUBSYS_NAME}/prosac.h
- include/pcl/${SUBSYS_NAME}/sac.h
- include/pcl/${SUBSYS_NAME}/sac_model.h
- include/pcl/${SUBSYS_NAME}/sac_model_circle.h
- include/pcl/${SUBSYS_NAME}/sac_model_circle3d.h
- include/pcl/${SUBSYS_NAME}/sac_model_cylinder.h
- include/pcl/${SUBSYS_NAME}/sac_model_cone.h
- include/pcl/${SUBSYS_NAME}/sac_model_line.h
- include/pcl/${SUBSYS_NAME}/sac_model_stick.h
- include/pcl/${SUBSYS_NAME}/sac_model_normal_parallel_plane.h
- include/pcl/${SUBSYS_NAME}/sac_model_normal_plane.h
- include/pcl/${SUBSYS_NAME}/sac_model_normal_sphere.h
- include/pcl/${SUBSYS_NAME}/sac_model_parallel_line.h
- include/pcl/${SUBSYS_NAME}/sac_model_parallel_plane.h
- include/pcl/${SUBSYS_NAME}/sac_model_perpendicular_plane.h
- include/pcl/${SUBSYS_NAME}/sac_model_plane.h
- include/pcl/${SUBSYS_NAME}/sac_model_registration.h
- include/pcl/${SUBSYS_NAME}/sac_model_registration_2d.h
- include/pcl/${SUBSYS_NAME}/sac_model_sphere.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/lmeds.h"
+ "include/pcl/${SUBSYS_NAME}/method_types.h"
+ "include/pcl/${SUBSYS_NAME}/mlesac.h"
+ "include/pcl/${SUBSYS_NAME}/model_types.h"
+ "include/pcl/${SUBSYS_NAME}/msac.h"
+ "include/pcl/${SUBSYS_NAME}/ransac.h"
+ "include/pcl/${SUBSYS_NAME}/rmsac.h"
+ "include/pcl/${SUBSYS_NAME}/rransac.h"
+ "include/pcl/${SUBSYS_NAME}/prosac.h"
+ "include/pcl/${SUBSYS_NAME}/sac.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_circle.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_circle3d.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_cylinder.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_cone.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_line.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_stick.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_normal_parallel_plane.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_normal_plane.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_normal_sphere.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_parallel_line.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_parallel_plane.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_perpendicular_plane.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_plane.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_registration.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_registration_2d.h"
+ "include/pcl/${SUBSYS_NAME}/sac_model_sphere.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/lmeds.hpp
- include/pcl/${SUBSYS_NAME}/impl/mlesac.hpp
- include/pcl/${SUBSYS_NAME}/impl/msac.hpp
- include/pcl/${SUBSYS_NAME}/impl/ransac.hpp
- include/pcl/${SUBSYS_NAME}/impl/rmsac.hpp
- include/pcl/${SUBSYS_NAME}/impl/rransac.hpp
- include/pcl/${SUBSYS_NAME}/impl/prosac.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_circle.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_circle3d.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_cylinder.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_cone.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_line.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_stick.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_parallel_plane.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_plane.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_sphere.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_parallel_line.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_parallel_plane.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_perpendicular_plane.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_plane.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_registration.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_registration_2d.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_model_sphere.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/lmeds.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/mlesac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/msac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/ransac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/rmsac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/rransac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/prosac.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_circle.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_circle3d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_cylinder.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_cone.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_line.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_stick.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_parallel_plane.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_plane.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_normal_sphere.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_parallel_line.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_parallel_plane.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_perpendicular_plane.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_plane.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_registration.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_registration_2d.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_model_sphere.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
if (distances.size () != indices.size ())
{
- PCL_ERROR ("[pcl::LeastMedianSquares::computeModel] Estimated distances (%zu) differs than the normal of indices (%zu).\n", distances.size (), indices.size ());
+ PCL_ERROR ("[pcl::LeastMedianSquares::computeModel] Estimated distances (%lu) differs than the normal of indices (%lu).\n", distances.size (), indices.size ());
return (false);
}
inliers_.resize (n_inliers_count);
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::LeastMedianSquares::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_inliers_count);
+ PCL_DEBUG ("[pcl::LeastMedianSquares::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_inliers_count);
return (true);
}
std::vector<int> &indices = *sac_model_->getIndices ();
if (distances.size () != indices.size ())
{
- PCL_ERROR ("[pcl::MaximumLikelihoodSampleConsensus::computeModel] Estimated distances (%zu) differs than the normal of indices (%zu).\n", distances.size (), indices.size ());
+ PCL_ERROR ("[pcl::MaximumLikelihoodSampleConsensus::computeModel] Estimated distances (%lu) differs than the normal of indices (%lu).\n", distances.size (), indices.size ());
return (false);
}
inliers_.resize (n_inliers_count);
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::MaximumLikelihoodSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_inliers_count);
+ PCL_DEBUG ("[pcl::MaximumLikelihoodSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_inliers_count);
return (true);
}
if (distances.size () != indices.size ())
{
- PCL_ERROR ("[pcl::MEstimatorSampleConsensus::computeModel] Estimated distances (%zu) differs than the normal of indices (%zu).\n", distances.size (), indices.size ());
+ PCL_ERROR ("[pcl::MEstimatorSampleConsensus::computeModel] Estimated distances (%lu) differs than the normal of indices (%lu).\n", distances.size (), indices.size ());
return (false);
}
inliers_.resize (n_inliers_count);
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::MEstimatorSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_inliers_count);
+ PCL_DEBUG ("[pcl::MEstimatorSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_inliers_count);
return (true);
}
}
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::ProgressiveSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), I_N_best);
+ PCL_DEBUG ("[pcl::ProgressiveSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), I_N_best);
if (model_.empty ())
{
}
}
- PCL_DEBUG ("[pcl::RandomSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_best_inliers_count);
+ PCL_DEBUG ("[pcl::RandomSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_best_inliers_count);
if (model_.empty ())
{
std::vector<int> &indices = *sac_model_->getIndices ();
if (distances.size () != indices.size ())
{
- PCL_ERROR ("[pcl::RandomizedMEstimatorSampleConsensus::computeModel] Estimated distances (%zu) differs than the normal of indices (%zu).\n", distances.size (), indices.size ());
+ PCL_ERROR ("[pcl::RandomizedMEstimatorSampleConsensus::computeModel] Estimated distances (%lu) differs than the normal of indices (%lu).\n", distances.size (), indices.size ());
return (false);
}
inliers_.resize (n_inliers_count);
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::RandomizedMEstimatorSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_inliers_count);
+ PCL_DEBUG ("[pcl::RandomizedMEstimatorSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_inliers_count);
return (true);
}
}
if (debug_verbosity_level > 0)
- PCL_DEBUG ("[pcl::RandomizedRandomSampleConsensus::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_best_inliers_count);
+ PCL_DEBUG ("[pcl::RandomizedRandomSampleConsensus::computeModel] Model: %lu size, %d inliers.\n", model_.size (), n_best_inliers_count);
if (model_.empty ())
{
// Need 3 samples
if (samples.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a set of valid model coefficients
if (model_coefficients.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Need at least 3 samples
if (inliers.size () <= 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle2D::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 3 samples
if (samples.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a set of valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Need at least 3 samples
if (inliers.size () <= 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
return;
}
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<OptimizationFunctor>, double> lm (num_diff);
Eigen::VectorXd coeff;
int info = lm.minimize (coeff);
- for (size_t i = 0; i < coeff.size (); ++i)
+ for (int i = 0; i < coeff.size (); ++i)
optimized_coefficients[i] = static_cast<float> (coeff[i]);
// Compute the L2 norm of the residuals
// Needs a valid set of model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCircle3D::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 3 samples
if (samples.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCone::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCone::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a set of valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCone::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCone::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCone::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCone::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCone::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCone::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCone::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCone::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 2 samples
if (samples.size () != 2)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCylinder::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCylinder::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a set of valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCylinder::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCylinder::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCylinder::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCylinder::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCylinder::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCylinder::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelCylinder::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelCylinder::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 2 samples
if (samples.size () != 2)
{
- PCL_ERROR ("[pcl::SampleConsensusModelLine::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelLine::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Need at least 2 points to estimate a line
if (inliers.size () <= 2)
{
- PCL_ERROR ("[pcl::SampleConsensusModelLine::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelLine::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
optimized_coefficients = model_coefficients;
return;
}
#include <pcl/sample_consensus/sac_model_normal_parallel_plane.h>
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT, typename PointNT> void
-pcl::SampleConsensusModelNormalParallelPlane<PointT, PointNT>::selectWithinDistance (
- const Eigen::VectorXf &model_coefficients, const double threshold, std::vector<int> &inliers)
-{
- if (!normals_)
- {
- PCL_ERROR ("[pcl::SampleConsensusModelNormalParallelPlane::selectWithinDistance] No input dataset containing normals was given!\n");
- return;
- }
-
- // Check if the model is valid given the user constraints
- if (!isModelValid (model_coefficients))
- {
- inliers.clear ();
- return;
- }
-
- // Obtain the plane normal
- Eigen::Vector4f coeff = model_coefficients;
-
- int nr_p = 0;
- inliers.resize (indices_->size ());
- error_sqr_dists_.resize (indices_->size ());
-
- // Iterate through the 3d points and calculate the distances from them to the plane
- for (size_t i = 0; i < indices_->size (); ++i)
- {
- // Calculate the distance from the point to the plane normal as the dot product
- // D = (P-A).N/|N|
- Eigen::Vector4f p (input_->points[(*indices_)[i]].x, input_->points[(*indices_)[i]].y, input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f n (normals_->points[(*indices_)[i]].normal[0], normals_->points[(*indices_)[i]].normal[1], normals_->points[(*indices_)[i]].normal[2], 0);
- double d_euclid = fabs (coeff.dot (p));
-
- // Calculate the angular distance between the point normal and the plane normal
- double d_normal = getAngle3D (n, coeff);
- d_normal = (std::min) (d_normal, fabs(M_PI - d_normal));
-
- double distance = fabs (normal_distance_weight_ * d_normal + (1 - normal_distance_weight_) * d_euclid);
- if (distance < threshold)
- {
- // Returns the indices of the points whose distances are smaller than the threshold
- inliers[nr_p] = (*indices_)[i];
- error_sqr_dists_[nr_p] = distance;
- ++nr_p;
- }
- }
- inliers.resize (nr_p);
- error_sqr_dists_.resize (nr_p);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT, typename PointNT> int
-pcl::SampleConsensusModelNormalParallelPlane<PointT, PointNT>::countWithinDistance (
- const Eigen::VectorXf &model_coefficients, const double threshold)
-{
- if (!normals_)
- {
- PCL_ERROR ("[pcl::SampleConsensusModelNormalParallelPlane::countWithinDistance] No input dataset containing normals was given!\n");
- return (0);
- }
-
- // Check if the model is valid given the user constraints
- if (!isModelValid (model_coefficients))
- return (0);
-
- // Obtain the plane normal
- Eigen::Vector4f coeff = model_coefficients;
-
- int nr_p = 0;
-
- // Iterate through the 3d points and calculate the distances from them to the plane
- for (size_t i = 0; i < indices_->size (); ++i)
- {
- // Calculate the distance from the point to the plane normal as the dot product
- // D = (P-A).N/|N|
- Eigen::Vector4f p (input_->points[(*indices_)[i]].x, input_->points[(*indices_)[i]].y, input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f n (normals_->points[(*indices_)[i]].normal[0], normals_->points[(*indices_)[i]].normal[1], normals_->points[(*indices_)[i]].normal[2], 0);
- double d_euclid = fabs (coeff.dot (p));
-
- // Calculate the angular distance between the point normal and the plane normal
- double d_normal = fabs (getAngle3D (n, coeff));
- d_normal = (std::min) (d_normal, fabs(M_PI - d_normal));
-
- if (fabs (normal_distance_weight_ * d_normal + (1 - normal_distance_weight_) * d_euclid) < threshold)
- nr_p++;
- }
- return (nr_p);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT, typename PointNT> void
-pcl::SampleConsensusModelNormalParallelPlane<PointT, PointNT>::getDistancesToModel (
- const Eigen::VectorXf &model_coefficients, std::vector<double> &distances)
-{
- if (!normals_)
- {
- PCL_ERROR ("[pcl::SampleConsensusModelNormalParallelPlane::getDistancesToModel] No input dataset containing normals was given!\n");
- return;
- }
-
- // Check if the model is valid given the user constraints
- if (!isModelValid (model_coefficients))
- {
- distances.clear ();
- return;
- }
-
- // Obtain the plane normal
- Eigen::Vector4f coeff = model_coefficients;
-
- distances.resize (indices_->size ());
-
- // Iterate through the 3d points and calculate the distances from them to the plane
- for (size_t i = 0; i < indices_->size (); ++i)
- {
- // Calculate the distance from the point to the plane normal as the dot product
- // D = (P-A).N/|N|
- Eigen::Vector4f p (input_->points[(*indices_)[i]].x, input_->points[(*indices_)[i]].y, input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f n (normals_->points[(*indices_)[i]].normal[0], normals_->points[(*indices_)[i]].normal[1], normals_->points[(*indices_)[i]].normal[2], 0);
- double d_euclid = fabs (coeff.dot (p));
-
- // Calculate the angular distance between the point normal and the plane normal
- double d_normal = getAngle3D (n, coeff);
- d_normal = (std::min) (d_normal, fabs (M_PI - d_normal));
-
- distances[i] = fabs (normal_distance_weight_ * d_normal + (1 - normal_distance_weight_) * d_euclid);
- }
-}
-
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT, typename PointNT> bool
pcl::SampleConsensusModelNormalParallelPlane<PointT, PointNT>::isModelValid (const Eigen::VectorXf &model_coefficients)
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelNormalParallelPlane::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelNormalParallelPlane::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelNormalSphere::selectWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelNormalSphere::selectWithinDistance] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 6)
{
- PCL_ERROR ("[pcl::SampleConsensusParallelLine::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusParallelLine::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelParallelPlane::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelParallelPlane::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPerpendicularPlane::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPerpendicularPlane::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 3 samples
if (samples.size () != 3)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::getDistancesToModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::getDistancesToModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::selectWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::selectWithinDistance] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::countWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::countWithinDistance] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (0);
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
optimized_coefficients = model_coefficients;
return;
}
// Need at least 3 points to estimate a plane
if (inliers.size () < 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
optimized_coefficients = model_coefficients;
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid set of model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration::getDistancesToModel] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration::getDistancesToModel] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
distances.clear ();
return;
}
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration::selectWithinDistance] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration::selectWithinDistance] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
inliers.clear ();
return;
}
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration::countWithinDistance] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration::countWithinDistance] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
return (0);
}
if (!target_)
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration::optimizeModelCoefficients] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration::optimizeModelCoefficients] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
optimized_coefficients = model_coefficients;
return;
}
//////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
-pcl::SampleConsensusModelRegistration2D<PointT>::isSampleGood (const std::vector<int> &samples) const
+pcl::SampleConsensusModelRegistration2D<PointT>::isSampleGood (const std::vector<int>&) const
{
return (true);
//using namespace pcl::common;
PCL_INFO ("[pcl::SampleConsensusModelRegistration2D<PointT>::getDistancesToModel]\n");
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::getDistancesToModel] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::getDistancesToModel] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
distances.clear ();
return;
}
Eigen::Vector4f pt_src (input_->points[(*indices_)[i]].x,
input_->points[(*indices_)[i]].y,
input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f pt_tgt (target_->points[(*indices_tgt_)[i]].x,
- target_->points[(*indices_tgt_)[i]].y,
- target_->points[(*indices_tgt_)[i]].z, 1);
Eigen::Vector4f p_tr (transform * pt_src);
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::selectWithinDistance] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::selectWithinDistance] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
inliers.clear ();
return;
}
Eigen::Vector4f pt_src (input_->points[(*indices_)[i]].x,
input_->points[(*indices_)[i]].y,
input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f pt_tgt (target_->points[(*indices_tgt_)[i]].x,
- target_->points[(*indices_tgt_)[i]].y,
- target_->points[(*indices_tgt_)[i]].z, 1);
Eigen::Vector4f p_tr (transform * pt_src);
{
if (indices_->size () != indices_tgt_->size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::countWithinDistance] Number of source indices (%zu) differs than number of target indices (%zu)!\n", indices_->size (), indices_tgt_->size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelRegistration2D::countWithinDistance] Number of source indices (%lu) differs than number of target indices (%lu)!\n", indices_->size (), indices_tgt_->size ());
return (0);
}
if (!target_)
Eigen::Vector4f pt_src (input_->points[(*indices_)[i]].x,
input_->points[(*indices_)[i]].y,
input_->points[(*indices_)[i]].z, 1);
- Eigen::Vector4f pt_tgt (target_->points[(*indices_tgt_)[i]].x,
- target_->points[(*indices_tgt_)[i]].y,
- target_->points[(*indices_tgt_)[i]].z, 1);
Eigen::Vector4f p_tr (transform * pt_src);
// Need 4 samples
if (samples.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Needs a set of valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::optimizeModelCoefficients] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Need at least 4 samples
if (inliers.size () <= 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::projectPoints] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return;
}
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::doSamplesVerifyModel] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
// Need 2 samples
if (samples.size () != 2)
{
- PCL_ERROR ("[pcl::SampleConsensusModelStick::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelStick::computeModelCoefficients] Invalid set of samples given (%lu)!\n", samples.size ());
return (false);
}
// Need at least 2 points to estimate a line
if (inliers.size () <= 2)
{
- PCL_ERROR ("[pcl::SampleConsensusModelStick::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelStick::optimizeModelCoefficients] Not enough inliers found to support a model (%lu)! Returning the same coefficients.\n", inliers.size ());
optimized_coefficients = model_coefficients;
return;
}
// Select the new inliers based on the optimized coefficients and new threshold
sac_model_->selectWithinDistance (new_model_coefficients, error_threshold, new_inliers);
- PCL_DEBUG ("[pcl::SampleConsensus::refineModel] Number of inliers found (before/after): %zu/%zu, with an error threshold of %g.\n", prev_inliers.size (), new_inliers.size (), error_threshold);
+ PCL_DEBUG ("[pcl::SampleConsensus::refineModel] Number of inliers found (before/after): %lu/%lu, with an error threshold of %g.\n", prev_inliers.size (), new_inliers.size (), error_threshold);
if (new_inliers.empty ())
{
getInliers (std::vector<int> &inliers) { inliers = inliers_; }
/** \brief Return the model coefficients of the best model found so far.
- * \param[out] model_coefficients the resultant model coefficients
+ * \param[out] model_coefficients the resultant model coefficients, as documented in \ref sample_consensus
*/
inline void
getModelCoefficients (Eigen::VectorXf &model_coefficients) { model_coefficients = model_coefficients_; }
if (indices_->size () > input_->points.size ())
{
- PCL_ERROR ("[pcl::SampleConsensusModel] Invalid index vector given with size %zu while the input PointCloud has size %zu!\n", indices_->size (), input_->points.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModel] Invalid index vector given with size %lu while the input PointCloud has size %lu!\n", indices_->size (), input_->points.size ());
indices_->clear ();
}
shuffled_indices_ = *indices_;
// We're assuming that indices_ have already been set in the constructor
if (indices_->size () < getSampleSize ())
{
- PCL_ERROR ("[pcl::SampleConsensusModel::getSamples] Can not select %zu unique points out of %zu!\n",
+ PCL_ERROR ("[pcl::SampleConsensusModel::getSamples] Can not select %lu unique points out of %lu!\n",
samples.size (), indices_->size ());
// one of these will make it stop :)
samples.clear ();
// If it's a good sample, stop here
if (isSampleGood (samples))
{
- PCL_DEBUG ("[pcl::SampleConsensusModel::getSamples] Selected %zu samples.\n", samples.size ());
+ PCL_DEBUG ("[pcl::SampleConsensusModel::getSamples] Selected %lu samples.\n", samples.size ());
return;
}
}
/** \brief Set the maximum distance allowed when drawing random samples
* \param[in] radius the maximum distance (L2 norm)
+ * \param search
*/
inline void
setSamplesMaxDist (const double &radius, SearchPtr search)
};
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/sample_consensus/impl/sac_model_circle3d.hpp>
+#endif
+
#endif //#ifndef PCL_SAMPLE_CONSENSUS_MODEL_CIRCLE3D_H_
{
if (model_coefficients.size () != 6)
{
- PCL_ERROR ("[pcl::SampleConsensusModelLine::selectWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelLine::selectWithinDistance] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
#ifndef PCL_SAMPLE_CONSENSUS_MODEL_NORMALPARALLELPLANE_H_
#define PCL_SAMPLE_CONSENSUS_MODEL_NORMALPARALLELPLANE_H_
-#include <pcl/sample_consensus/sac_model.h>
-#include <pcl/sample_consensus/sac_model_plane.h>
-#include <pcl/sample_consensus/sac_model_perpendicular_plane.h>
+#include <pcl/sample_consensus/sac_model_normal_plane.h>
#include <pcl/sample_consensus/model_types.h>
namespace pcl
* \ingroup sample_consensus
*/
template <typename PointT, typename PointNT>
- class SampleConsensusModelNormalParallelPlane : public SampleConsensusModelPlane<PointT>, public SampleConsensusModelFromNormals<PointT, PointNT>
+ class SampleConsensusModelNormalParallelPlane : public SampleConsensusModelNormalPlane<PointT, PointNT>
{
public:
using SampleConsensusModel<PointT>::input_;
*/
SampleConsensusModelNormalParallelPlane (const PointCloudConstPtr &cloud,
bool random = false)
- : SampleConsensusModelPlane<PointT> (cloud, random)
- , SampleConsensusModelFromNormals<PointT, PointNT> ()
+ : SampleConsensusModelNormalPlane<PointT, PointNT> (cloud, random)
, axis_ (Eigen::Vector4f::Zero ())
, distance_from_origin_ (0)
, eps_angle_ (-1.0)
SampleConsensusModelNormalParallelPlane (const PointCloudConstPtr &cloud,
const std::vector<int> &indices,
bool random = false)
- : SampleConsensusModelPlane<PointT> (cloud, indices, random)
- , SampleConsensusModelFromNormals<PointT, PointNT> ()
+ : SampleConsensusModelNormalPlane<PointT, PointNT> (cloud, indices, random)
, axis_ (Eigen::Vector4f::Zero ())
, distance_from_origin_ (0)
, eps_angle_ (-1.0)
inline double
getEpsDist () { return (eps_dist_); }
- /** \brief Select all the points which respect the given model coefficients as inliers.
- * \param[in] model_coefficients the coefficients of a plane model that we need to compute distances to
- * \param[in] threshold a maximum admissible distance threshold for determining the inliers from the outliers
- * \param[out] inliers the resultant model inliers
- */
- void
- selectWithinDistance (const Eigen::VectorXf &model_coefficients,
- const double threshold,
- std::vector<int> &inliers);
-
- /** \brief Count all the points which respect the given model coefficients as inliers.
- *
- * \param[in] model_coefficients the coefficients of a model that we need to compute distances to
- * \param[in] threshold maximum admissible distance threshold for determining the inliers from the outliers
- * \return the resultant number of inliers
- */
- virtual int
- countWithinDistance (const Eigen::VectorXf &model_coefficients,
- const double threshold);
-
- /** \brief Compute all distances from the cloud data to a given plane model.
- * \param[in] model_coefficients the coefficients of a plane model that we need to compute distances to
- * \param[out] distances the resultant estimated distances
- */
- void
- getDistancesToModel (const Eigen::VectorXf &model_coefficients,
- std::vector<double> &distances);
-
/** \brief Return an unique id for this model (SACMODEL_NORMAL_PARALLEL_PLANE). */
inline pcl::SacModel
getModelType () const { return (SACMODEL_NORMAL_PARALLEL_PLANE); }
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelPlane::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelPlane::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
return (true);
/** \brief Computes an "optimal" sample distance threshold based on the
* principal directions of the input cloud.
* \param[in] cloud the const boost shared pointer to a PointCloud message
+ * \param indices
*/
inline void
computeSampleDistanceThreshold (const PointCloudConstPtr &cloud,
/** \brief Computes an "optimal" sample distance threshold based on the
* principal directions of the input cloud.
- * \param[in] cloud the const boost shared pointer to a PointCloud message
*/
inline void
- computeSampleDistanceThreshold (const PointCloudConstPtr &cloud)
+ computeSampleDistanceThreshold (const PointCloudConstPtr&)
{
//// Compute the principal directions via PCA
//Eigen::Vector4f xyz_centroid;
/** \brief Computes an "optimal" sample distance threshold based on the
* principal directions of the input cloud.
- * \param[in] cloud the const boost shared pointer to a PointCloud message
*/
inline void
- computeSampleDistanceThreshold (const PointCloudConstPtr &cloud,
- const std::vector<int> &indices)
+ computeSampleDistanceThreshold (const PointCloudConstPtr&,
+ const std::vector<int>&)
{
//// Compute the principal directions via PCA
//Eigen::Vector4f xyz_centroid;
// Needs a valid model coefficients
if (model_coefficients.size () != 4)
{
- PCL_ERROR ("[pcl::SampleConsensusModelSphere::isModelValid] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelSphere::isModelValid] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
{
if (model_coefficients.size () != 7)
{
- PCL_ERROR ("[pcl::SampleConsensusModelStick::selectWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
+ PCL_ERROR ("[pcl::SampleConsensusModelStick::selectWithinDistance] Invalid number of model coefficients given (%lu)!\n", model_coefficients.size ());
return (false);
}
The <b>pcl_sample_consensus</b> library holds SAmple Consensus (SAC) methods like
<a href="http://en.wikipedia.org/wiki/RANSAC">RANSAC</a> and models like planes and cylinders. These can
- combined freely in order to detect specific models and their paramters in point clouds.
+ combined freely in order to detect specific models and their parameters in point clouds.
Some of the models implemented in this library include: lines, planes, cylinders, and spheres. Plane fitting
is often applied to the task of detecting common indoor surfaces, such as walls, floors, and table tops.
\image html http://www.pointclouds.org/assets/images/contents/documentation/sample_consensus_planes_cylinders.png
- As of PCL 1.0, the following models are supported:
+ The following models are supported:
<ul>
- <li><a href="classpcl_1_1_sample_consensus_model_plane.html">SACMODEL_PLANE</a> - used to determine plane models. The <b>four</b> coefficients of the plane are its <a href="http://mathworld.wolfram.com/HessianNormalForm.html">Hessian Normal form</a>: [<b>normal_x normal_y normal_z d</b>]</li>
- <li><a href="classpcl_1_1_sample_consensus_model_line.html">SACMODEL_LINE</a> - used to determine line models. The <b>six</b> coefficients of the line are given by a point on the line and the direction of the line as: [<b>point_on_line.x point_on_line.y point_on_line.z line_direction.x line_direction.y line_direction.z</b>]</li>
- <li><a href="classpcl_1_1_sample_consensus_model_circle2_d.html">SACMODEL_CIRCLE2D</a> - used to determine 2D circles in a plane. The circle's <b>three</b> coefficients are given by its center and radius as: [<b>center.x center.y radius</b>]</li>
- <li>SACMODEL_CIRCLE3D - not implemented yet</li>
- <li><a href="classpcl_1_1_sample_consensus_model_sphere.html">SACMODEL_SPHERE</a> - used to determine sphere models. The <b>four</b> coefficients of the sphere are given by its 3D center and radius as: [<b>center.x center.y center.z radius</b>]</li>
- <li><a href="classpcl_1_1_sample_consensus_model_cylinder.html">SACMODEL_CYLINDER</a> - used to determine cylinder models. The <b>seven</b> coefficients of the cylinder are given by a point on its axis, the axis direction, and a radius, as: [<b>point_on_axis.x point_on_axis.y point_on_axis.z axis_direction.x axis_direction.y axis_direction.z radius</b>]</li>
- <li>SACMODEL_CONE - not implemented yet</li>
+ <li>\link pcl::SampleConsensusModelPlane SACMODEL_PLANE \endlink - used to determine plane models. The <b>four</b> coefficients of the plane are its <a href="http://mathworld.wolfram.com/HessianNormalForm.html">Hessian Normal form</a>: [<b>normal_x normal_y normal_z d</b>]</li>
+ <li>\link pcl::SampleConsensusModelLine SACMODEL_LINE \endlink - used to determine line models. The <b>six</b> coefficients of the line are given by a point on the line and the direction of the line as: [<b>point_on_line.x point_on_line.y point_on_line.z line_direction.x line_direction.y line_direction.z</b>]</li>
+ <li>\link pcl::SampleConsensusModelCircle2D SACMODEL_CIRCLE2D \endlink - used to determine 2D circles in a plane. The circle's <b>three</b> coefficients are given by its center and radius as: [<b>center.x center.y radius</b>]</li>
+ <li>\link pcl::SampleConsensusModelCircle3D SACMODEL_CIRCLE3D \endlink - used to determine 3D circles in a plane. The circle's <b>seven</b> coefficients are given by its center, radius and normal as: [<b>center.x, center.y, center.z, radius, normal.x, normal.y, normal.z</b>]</li>
+ <li>\link pcl::SampleConsensusModelSphere SACMODEL_SPHERE \endlink - used to determine sphere models. The <b>four</b> coefficients of the sphere are given by its 3D center and radius as: [<b>center.x center.y center.z radius</b>]</li>
+ <li>\link pcl::SampleConsensusModelCylinder SACMODEL_CYLINDER \endlink - used to determine cylinder models. The <b>seven</b> coefficients of the cylinder are given by a point on its axis, the axis direction, and a radius, as: [<b>point_on_axis.x point_on_axis.y point_on_axis.z axis_direction.x axis_direction.y axis_direction.z radius</b>]</li>
+ <li>\link pcl::SampleConsensusModelCone SACMODEL_CONE \endlink - used to determine cone models. The <b>seven</b> coefficients of the cone are given by a point of its apex, the axis direction and the opening angle, as: [<b>apex.x, apex.y, apex.z, axis_direction.x, axis_direction.y, axis_direction.z, opening_angle</b>]</li>
<li>SACMODEL_TORUS - not implemented yet</li>
- <li><a href="classpcl_1_1_sample_consensus_model_parallel_line.html">SACMODEL_PARALLEL_LINE</a> - a model for determining a line <b>parallel</b> with a given axis, within a maximum specified angular deviation. The line coefficients are similar to <a href="classpcl_1_1_sample_consensus_model_line.html">SACMODEL_LINE</a>.</li>
- <li><a href="classpcl_1_1_sample_consensus_model_perpendicular_plane.html">SACMODEL_PERPENDICULAR_PLANE</a> - a model for determining a plane <b>perpendicular</b> to an user-specified axis, within a maximum specified angular deviation. The plane coefficients are similar to <a href="classpcl_1_1_sample_consensus_model_plane.html">SACMODEL_PLANE</a>.</li>
+ <li>\link pcl::SampleConsensusModelParallelLine SACMODEL_PARALLEL_LINE \endlink - a model for determining a line <b>parallel</b> with a given axis, within a maximum specified angular deviation. The line coefficients are similar to \link pcl::SampleConsensusModelLine SACMODEL_LINE \endlink.</li>
+ <li>\link pcl::SampleConsensusModelPerpendicularPlane SACMODEL_PERPENDICULAR_PLANE \endlink - a model for determining a plane <b>perpendicular</b> to an user-specified axis, within a maximum specified angular deviation. The plane coefficients are similar to \link pcl::SampleConsensusModelPlane SACMODEL_PLANE \endlink.</li>
<li>SACMODEL_PARALLEL_LINES - not implemented yet</li>
- <li><a href="classpcl_1_1_sample_consensus_model_normal_plane.html">SACMODEL_NORMAL_PLANE</a> - a model for determining plane models using an additional constraint: the surface normals at each inlier point has to be parallel to the surface normal of the output plane, within a maximum specified angular deviation. The plane coefficients are similar to <a href="classpcl_1_1_sample_consensus_model_plane.html">SACMODEL_PLANE</a>.</li>
- <li><a href="classpcl_1_1_sample_consensus_model_parallel_plane.html">SACMODEL_PARALLEL_PLANE</a> - a model for determining a plane <b>parallel</b> to an user-specified axis, within a maximim specified angular deviation. <a href="../classpcl_1_1_sample_consensus_model_plane.html">SACMODEL_PLANE</a>.</li>
- <li><a href="classpcl_1_1_sample_consensus_model_normal_parallel_plane.html">SACMODEL_NORMAL_PARALLEL_PLANE</a> defines a model for 3D plane segmentation using additional surface normal constraints. The plane must lie <b>parallel</b> to a user-specified axis. SACMODEL_NORMAL_PARALLEL_PLANE therefore is equivallent to SACMODEL_NORMAL_PLANE + SACMODEL_PARALLEL_PLANE. The plane coefficients are similar to <a href="classpcl_1_1_sample_consensus_model_plane.html">SACMODEL_PLANE</a>.</li>
+ <li>\link pcl::SampleConsensusModelNormalPlane SACMODEL_NORMAL_PLANE \endlink - a model for determining plane models using an additional constraint: the surface normals at each inlier point has to be parallel to the surface normal of the output plane, within a maximum specified angular deviation. The plane coefficients are similar to \link pcl::SampleConsensusModelPlane SACMODEL_PLANE \endlink.</li>
+ <li>\link pcl::SampleConsensusModelParallelPlane SACMODEL_PARALLEL_PLANE \endlink - a model for determining a plane <b>parallel</b> to an user-specified axis, within a maximum specified angular deviation. \link pcl::SampleConsensusModelPlane SACMODEL_PLANE \endlink.</li>
+ <li>\link pcl::SampleConsensusModelNormalParallelPlane SACMODEL_NORMAL_PARALLEL_PLANE \endlink defines a model for 3D plane segmentation using additional surface normal constraints. The plane must lie <b>parallel</b> to a user-specified axis. SACMODEL_NORMAL_PARALLEL_PLANE therefore is equivalent to SACMODEL_NORMAL_PLANE + SACMODEL_PARALLEL_PLANE. The plane coefficients are similar to \link pcl::SampleConsensusModelPlane SACMODEL_PLANE \endlink.</li>
</ul>
The following list describes the robust sample consensus estimators implemented:
set(SUBSYS_DEPS common kdtree octree)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS flann)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS flann)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
set(incs
- include/pcl/${SUBSYS_NAME}/search.h
- include/pcl/${SUBSYS_NAME}/kdtree.h
- include/pcl/${SUBSYS_NAME}/brute_force.h
- include/pcl/${SUBSYS_NAME}/organized.h
- include/pcl/${SUBSYS_NAME}/octree.h
- include/pcl/${SUBSYS_NAME}/flann_search.h
- include/pcl/${SUBSYS_NAME}/pcl_search.h
+ "include/pcl/${SUBSYS_NAME}/search.h"
+ "include/pcl/${SUBSYS_NAME}/kdtree.h"
+ "include/pcl/${SUBSYS_NAME}/brute_force.h"
+ "include/pcl/${SUBSYS_NAME}/organized.h"
+ "include/pcl/${SUBSYS_NAME}/octree.h"
+ "include/pcl/${SUBSYS_NAME}/flann_search.h"
+ "include/pcl/${SUBSYS_NAME}/pcl_search.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/search.hpp
- include/pcl/${SUBSYS_NAME}/impl/kdtree.hpp
- include/pcl/${SUBSYS_NAME}/impl/flann_search.hpp
- include/pcl/${SUBSYS_NAME}/impl/brute_force.hpp
- include/pcl/${SUBSYS_NAME}/impl/organized.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/search.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/kdtree.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/flann_search.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/brute_force.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/organized.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common ${FLANN_LIBRARIES} pcl_octree pcl_kdtree)
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common ${FLANN_LIBRARIES} pcl_octree pcl_kdtree)
list(APPEND EXT_DEPS flann)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
/** \brief @b search::FlannSearch is a generic FLANN wrapper class for the new search interface.
* It is able to wrap any FLANN index type, e.g. the kd tree as well as indices for high-dimensional
* searches and intended as a more powerful and cleaner successor to KdTreeFlann.
+ *
+ * By default, this class creates a single kd tree for indexing the input data. However, for high dimensions
+ * (> 10), it is often better to use the multiple randomized kd tree index provided by FLANN in combination with
+ * the \ref flann::L2 distance functor. During search in this type of index, the number of checks to perform before
+ * terminating the search can be controlled. Here is a code example if a high-dimensional 2-NN search:
+ *
+ * \code
+ * // Feature and distance type
+ * typedef SHOT352 FeatureT;
+ * typedef flann::L2<float> DistanceT;
+ *
+ * // Search and index types
+ * typedef search::FlannSearch<FeatureT, DistanceT> SearchT;
+ * typedef typename SearchT::FlannIndexCreatorPtr CreatorPtrT;
+ * typedef typename SearchT::KdTreeMultiIndexCreator IndexT;
+ * typedef typename SearchT::PointRepresentationPtr RepresentationPtrT;
+ *
+ * // Features
+ * PointCloud<FeatureT>::Ptr query, target;
+ *
+ * // Fill query and target with calculated features...
+ *
+ * // Instantiate search object with 4 randomized trees and 256 checks
+ * SearchT search (true, CreatorPtrT (new IndexT (4)));
+ * search.setPointRepresentation (RepresentationPtrT (new DefaultFeatureRepresentation<FeatureT>));
+ * search.setChecks (256);
+ * search.setInputCloud (target);
+ *
+ * // Do search
+ * std::vector<std::vector<int> > k_indices;
+ * std::vector<std::vector<float> > k_sqr_distances;
+ * search.nearestKSearch (*query, std::vector<int> (), 2, k_indices, k_sqr_distances);
+ * \endcode
*
* \author Andreas Muetzel
+ * \author Anders Glent Buch (multiple randomized kd tree interface)
* \ingroup search
*/
template<typename PointT, typename FlannDistance=flann::L2_Simple <float> >
class FlannSearch: public Search<PointT>
{
- typedef typename Search<PointT>::PointCloud PointCloud;
- typedef typename Search<PointT>::PointCloudConstPtr PointCloudConstPtr;
-
- typedef boost::shared_ptr<std::vector<int> > IndicesPtr;
- typedef boost::shared_ptr<const std::vector<int> > IndicesConstPtr;
- typedef flann::NNIndex< FlannDistance > Index;
- typedef boost::shared_ptr<flann::NNIndex <FlannDistance > > IndexPtr;
- typedef boost::shared_ptr<flann::Matrix <float> > MatrixPtr;
- typedef boost::shared_ptr<const flann::Matrix <float> > MatrixConstPtr;
-
- typedef pcl::PointRepresentation<PointT> PointRepresentation;
- //typedef boost::shared_ptr<PointRepresentation> PointRepresentationPtr;
- typedef boost::shared_ptr<const PointRepresentation> PointRepresentationConstPtr;
-
using Search<PointT>::input_;
using Search<PointT>::indices_;
using Search<PointT>::sorted_results_;
public:
typedef boost::shared_ptr<FlannSearch<PointT, FlannDistance> > Ptr;
typedef boost::shared_ptr<const FlannSearch<PointT, FlannDistance> > ConstPtr;
+
+ typedef typename Search<PointT>::PointCloud PointCloud;
+ typedef typename Search<PointT>::PointCloudConstPtr PointCloudConstPtr;
+
+ typedef boost::shared_ptr<std::vector<int> > IndicesPtr;
+ typedef boost::shared_ptr<const std::vector<int> > IndicesConstPtr;
+
+ typedef boost::shared_ptr<flann::Matrix <float> > MatrixPtr;
+ typedef boost::shared_ptr<const flann::Matrix <float> > MatrixConstPtr;
+
+ typedef flann::NNIndex< FlannDistance > Index;
+ typedef boost::shared_ptr<flann::NNIndex <FlannDistance > > IndexPtr;
+
+ typedef pcl::PointRepresentation<PointT> PointRepresentation;
+ typedef boost::shared_ptr<PointRepresentation> PointRepresentationPtr;
+ typedef boost::shared_ptr<const PointRepresentation> PointRepresentationConstPtr;
/** \brief Helper class that creates a FLANN index from a given FLANN matrix. To
* use a FLANN index type with FlannSearch, implement this interface and
class KMeansIndexCreator: public FlannIndexCreator
{
public:
- /** \param[in] max_leaf_size All FLANN kd trees created by this class will have
+ /** \brief All FLANN kd trees created by this class will have
* a maximum of max_leaf_size points per leaf node. Higher values make index creation
* cheaper, but search more costly (and the other way around).
*/
private:
};
+ /** \brief Creates a FLANN KdTreeIndex of multiple randomized trees from the given input data,
+ * suitable for feature matching. Note that in this case, it is often more efficient to use the
+ * \ref flann::L2 distance functor.
+ */
+ class KdTreeMultiIndexCreator: public FlannIndexCreator
+ {
+ public:
+ /** \param[in] trees Number of randomized trees to create.
+ */
+ KdTreeMultiIndexCreator (int trees = 4) : trees_ (trees) {}
+
+ /** \brief Empty destructor */
+ virtual ~KdTreeMultiIndexCreator () {}
+
+ /** \brief Create a FLANN Index from the input data.
+ * \param[in] data The FLANN matrix containing the input.
+ * \return The FLANN index.
+ */
+ virtual IndexPtr createIndex (MatrixConstPtr data);
+ private:
+ int trees_;
+ };
+
FlannSearch (bool sorted = true, FlannIndexCreatorPtr creator = FlannIndexCreatorPtr (new KdTreeIndexCreator ()));
/** \brief Destructor for FlannSearch. */
return (eps_);
}
+ /** \brief Set the number of checks to perform during approximate searches in multiple randomized trees.
+ * \param[in] checks number of checks to perform during approximate searches in multiple randomized trees.
+ */
+ inline void
+ setChecks (int checks)
+ {
+ checks_ = checks;
+ }
+
+ /** \brief Get the number of checks to perform during approximate searches in multiple randomized trees. */
+ inline int
+ getChecks ()
+ {
+ return (checks_);
+ }
+
/** \brief Provide a pointer to the input dataset.
* \param[in] cloud the const boost shared pointer to a PointCloud message
* \param[in] indices the point indices subset that is to be used from \a cloud
/** Epsilon for approximate NN search.
*/
float eps_;
+
+ /** Number of checks to perform for approximate NN search using the multiple randomized tree index
+ */
+ int checks_;
+
bool input_copied_for_flann_;
PointRepresentationConstPtr point_representation_;
return (IndexPtr (new flann::KMeansIndex<FlannDistance> (*data,flann::KMeansIndexParams ())));
}
+//////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT, typename FlannDistance>
+typename pcl::search::FlannSearch<PointT, FlannDistance>::IndexPtr
+pcl::search::FlannSearch<PointT, FlannDistance>::KdTreeMultiIndexCreator::createIndex (MatrixConstPtr data)
+{
+ return (IndexPtr (new flann::KDTreeIndex<FlannDistance> (*data, flann::KDTreeIndexParams (trees_))));
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT, typename FlannDistance>
pcl::search::FlannSearch<PointT, FlannDistance>::FlannSearch(bool sorted, FlannIndexCreatorPtr creator) : pcl::search::Search<PointT> ("FlannSearch",sorted),
- index_(), creator_ (creator), input_flann_(), eps_ (0), input_copied_for_flann_ (false), point_representation_ (new DefaultPointRepresentation<PointT>),
+ index_(), creator_ (creator), input_flann_(), eps_ (0), checks_ (32), input_copied_for_flann_ (false), point_representation_ (new DefaultPointRepresentation<PointT>),
dim_ (0), index_mapping_(), identity_mapping_()
{
dim_ = point_representation_->getNumberOfDimensions ();
float* cdata = can_cast ? const_cast<float*> (reinterpret_cast<const float*> (&point)): data;
const flann::Matrix<float> m (cdata ,1, point_representation_->getNumberOfDimensions ());
- flann::SearchParams p(-1);
+ flann::SearchParams p;
p.eps = eps_;
p.sorted = sorted_results_;
+ p.checks = checks_;
if (indices.size() != static_cast<unsigned int> (k))
indices.resize (k,-1);
if (dists.size() != static_cast<unsigned int> (k))
flann::SearchParams p;
p.sorted = sorted_results_;
p.eps = eps_;
+ p.checks = checks_;
index_->knnSearch (m,k_indices,k_sqr_distances,k, p);
delete [] data;
flann::SearchParams p;
p.sorted = sorted_results_;
p.eps = eps_;
+ p.checks = checks_;
index_->knnSearch (m,k_indices,k_sqr_distances,k, p);
delete[] data;
p.sorted = sorted_results_;
p.eps = eps_;
p.max_neighbors = max_nn > 0 ? max_nn : -1;
+ p.checks = checks_;
std::vector<std::vector<int> > i (1);
std::vector<std::vector<float> > d (1);
int result = index_->radiusSearch (m,i,d,static_cast<float> (radius * radius), p);
flann::SearchParams p;
p.sorted = sorted_results_;
p.eps = eps_;
+ p.checks = checks_;
// here: max_nn==0: take all neighbors. flann: max_nn==0: return no neighbors, only count them. max_nn==-1: return all neighbors
p.max_neighbors = max_nn != 0 ? max_nn : -1;
index_->radiusSearch (m,k_indices,k_sqr_distances,static_cast<float> (radius * radius), p);
flann::SearchParams p;
p.sorted = sorted_results_;
p.eps = eps_;
+ p.checks = checks_;
// here: max_nn==0: take all neighbors. flann: max_nn==0: return no neighbors, only count them. max_nn==-1: return all neighbors
p.max_neighbors = max_nn != 0 ? max_nn : -1;
index_->radiusSearch (m, k_indices, k_sqr_distances, static_cast<float> (radius * radius), p);
#include <pcl/search/impl/search.hpp>
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT>
-pcl::search::KdTree<PointT>::KdTree (bool sorted)
+template <typename PointT, class Tree>
+pcl::search::KdTree<PointT,Tree>::KdTree (bool sorted)
: pcl::search::Search<PointT> ("KdTree", sorted)
- , tree_ (new pcl::KdTreeFLANN<PointT> (sorted))
+ , tree_ (new Tree (sorted))
{
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> void
-pcl::search::KdTree<PointT>::setPointRepresentation (
+template <typename PointT, class Tree> void
+pcl::search::KdTree<PointT,Tree>::setPointRepresentation (
const PointRepresentationConstPtr &point_representation)
{
tree_->setPointRepresentation (point_representation);
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> void
-pcl::search::KdTree<PointT>::setSortedResults (bool sorted_results)
+template <typename PointT, class Tree> void
+pcl::search::KdTree<PointT,Tree>::setSortedResults (bool sorted_results)
{
sorted_results_ = sorted_results;
tree_->setSortedResults (sorted_results);
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> void
-pcl::search::KdTree<PointT>::setEpsilon (float eps)
+template <typename PointT, class Tree> void
+pcl::search::KdTree<PointT,Tree>::setEpsilon (float eps)
{
tree_->setEpsilon (eps);
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> void
-pcl::search::KdTree<PointT>::setInputCloud (
+template <typename PointT, class Tree> void
+pcl::search::KdTree<PointT,Tree>::setInputCloud (
const PointCloudConstPtr& cloud,
const IndicesConstPtr& indices)
{
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> int
-pcl::search::KdTree<PointT>::nearestKSearch (
+template <typename PointT, class Tree> int
+pcl::search::KdTree<PointT,Tree>::nearestKSearch (
const PointT &point, int k, std::vector<int> &k_indices,
std::vector<float> &k_sqr_distances) const
{
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> int
-pcl::search::KdTree<PointT>::radiusSearch (
+template <typename PointT, class Tree> int
+pcl::search::KdTree<PointT,Tree>::radiusSearch (
const PointT& point, double radius,
std::vector<int> &k_indices, std::vector<float> &k_sqr_distances,
unsigned int max_nn) const
* \author Radu B. Rusu
* \ingroup search
*/
- template<typename PointT>
+ template<typename PointT, class Tree = pcl::KdTreeFLANN<PointT> >
class KdTree: public Search<PointT>
{
public:
using pcl::search::Search<PointT>::radiusSearch;
using pcl::search::Search<PointT>::sorted_results_;
- typedef boost::shared_ptr<KdTree<PointT> > Ptr;
- typedef boost::shared_ptr<const KdTree<PointT> > ConstPtr;
+ typedef boost::shared_ptr<KdTree<PointT, Tree> > Ptr;
+ typedef boost::shared_ptr<const KdTree<PointT, Tree> > ConstPtr;
- typedef boost::shared_ptr<pcl::KdTreeFLANN<PointT> > KdTreeFLANNPtr;
- typedef boost::shared_ptr<const pcl::KdTreeFLANN<PointT> > KdTreeFLANNConstPtr;
+ typedef boost::shared_ptr<Tree> KdTreePtr;
+ typedef boost::shared_ptr<const Tree> KdTreeConstPtr;
typedef boost::shared_ptr<const PointRepresentation<PointT> > PointRepresentationConstPtr;
/** \brief Constructor for KdTree.
std::vector<float> &k_sqr_distances,
unsigned int max_nn = 0) const;
protected:
- /** \brief A pointer to the internal KdTreeFLANN object. */
- KdTreeFLANNPtr tree_;
+ /** \brief A pointer to the internal KdTree object. */
+ KdTreePtr tree_;
};
}
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/search/impl/kdtree.hpp>
+#else
#define PCL_INSTANTIATE_KdTree(T) template class PCL_EXPORTS pcl::search::KdTree<T>;
+#endif
#endif // PCL_SEARCH_KDTREE_H_
#include <pcl/point_cloud.h>
#include <pcl/for_each_type.h>
#include <pcl/common/concatenate.h>
+#include <pcl/common/copy_point.h>
namespace pcl
{
std::vector<int> &k_indices, std::vector<float> &k_sqr_distances) const
{
PointT p;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointTDiff>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (point, p));
+ copyPoint (point, p);
return (nearestKSearch (p, k, k_indices, k_sqr_distances));
}
std::vector<float> &k_sqr_distances, unsigned int max_nn = 0) const
{
PointT p;
- // Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointT>::type FieldListInT;
- typedef typename pcl::traits::fieldList<PointTDiff>::type FieldListOutT;
- typedef typename pcl::intersect<FieldListInT, FieldListOutT>::type FieldList;
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (point, p));
+ copyPoint (point, p);
return (radiusSearch (p, radius, k_indices, k_sqr_distances, max_nn));
}
set(SUBSYS_DEPS common geometry search sample_consensus kdtree octree features filters)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
src/crf_normal_segmentation.cpp
src/conditional_euclidean_clustering.cpp
src/supervoxel_clustering.cpp
+ src/grabcut_segmentation.cpp
+ src/progressive_morphological_filter.cpp
+ src/approximate_progressive_morphological_filter.cpp
)
# NOTE: boost/graph/boykov_kolmogorov_max_flow.hpp only exists for versions > 1.43
if(Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 43)
- set(srcs
- ${srcs}
+ list(APPEND srcs
src/min_cut_segmentation.cpp
)
endif()
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/extract_clusters.h
- include/pcl/${SUBSYS_NAME}/extract_labeled_clusters.h
- include/pcl/${SUBSYS_NAME}/extract_polygonal_prism_data.h
- include/pcl/${SUBSYS_NAME}/sac_segmentation.h
- include/pcl/${SUBSYS_NAME}/seeded_hue_segmentation.h
- include/pcl/${SUBSYS_NAME}/segment_differences.h
- include/pcl/${SUBSYS_NAME}/region_growing.h
- include/pcl/${SUBSYS_NAME}/region_growing_rgb.h
- include/pcl/${SUBSYS_NAME}/comparator.h
- include/pcl/${SUBSYS_NAME}/plane_coefficient_comparator.h
- include/pcl/${SUBSYS_NAME}/euclidean_plane_coefficient_comparator.h
- include/pcl/${SUBSYS_NAME}/edge_aware_plane_comparator.h
- include/pcl/${SUBSYS_NAME}/rgb_plane_coefficient_comparator.h
- include/pcl/${SUBSYS_NAME}/plane_refinement_comparator.h
- include/pcl/${SUBSYS_NAME}/euclidean_cluster_comparator.h
- include/pcl/${SUBSYS_NAME}/ground_plane_comparator.h
- include/pcl/${SUBSYS_NAME}/organized_connected_component_segmentation.h
- include/pcl/${SUBSYS_NAME}/organized_multi_plane_segmentation.h
- include/pcl/${SUBSYS_NAME}/region_3d.h
- include/pcl/${SUBSYS_NAME}/planar_region.h
- include/pcl/${SUBSYS_NAME}/planar_polygon_fusion.h
- include/pcl/${SUBSYS_NAME}/crf_normal_segmentation.h
- include/pcl/${SUBSYS_NAME}/conditional_euclidean_clustering.h
- include/pcl/${SUBSYS_NAME}/supervoxel_clustering.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/extract_clusters.h"
+ "include/pcl/${SUBSYS_NAME}/extract_labeled_clusters.h"
+ "include/pcl/${SUBSYS_NAME}/extract_polygonal_prism_data.h"
+ "include/pcl/${SUBSYS_NAME}/sac_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/seeded_hue_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/segment_differences.h"
+ "include/pcl/${SUBSYS_NAME}/region_growing.h"
+ "include/pcl/${SUBSYS_NAME}/region_growing_rgb.h"
+ "include/pcl/${SUBSYS_NAME}/comparator.h"
+ "include/pcl/${SUBSYS_NAME}/plane_coefficient_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/euclidean_plane_coefficient_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/edge_aware_plane_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/rgb_plane_coefficient_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/plane_refinement_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/euclidean_cluster_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/ground_plane_comparator.h"
+ "include/pcl/${SUBSYS_NAME}/organized_connected_component_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/organized_multi_plane_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/region_3d.h"
+ "include/pcl/${SUBSYS_NAME}/planar_region.h"
+ "include/pcl/${SUBSYS_NAME}/planar_polygon_fusion.h"
+ "include/pcl/${SUBSYS_NAME}/crf_normal_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/conditional_euclidean_clustering.h"
+ "include/pcl/${SUBSYS_NAME}/supervoxel_clustering.h"
+ "include/pcl/${SUBSYS_NAME}/grabcut_segmentation.h"
+ "include/pcl/${SUBSYS_NAME}/progressive_morphological_filter.h"
+ "include/pcl/${SUBSYS_NAME}/approximate_progressive_morphological_filter.h"
)
# NOTE: boost/graph/boykov_kolmogorov_max_flow.hpp only exists for versions > 1.43
if(Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 43)
- set(incs
- ${incs}
- include/pcl/${SUBSYS_NAME}/min_cut_segmentation.h
+ list(APPEND incs
+ "include/pcl/${SUBSYS_NAME}/min_cut_segmentation.h"
)
endif()
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/extract_clusters.hpp
- include/pcl/${SUBSYS_NAME}/impl/extract_labeled_clusters.hpp
- include/pcl/${SUBSYS_NAME}/impl/extract_polygonal_prism_data.hpp
- include/pcl/${SUBSYS_NAME}/impl/sac_segmentation.hpp
- include/pcl/${SUBSYS_NAME}/impl/seeded_hue_segmentation.hpp
- include/pcl/${SUBSYS_NAME}/impl/segment_differences.hpp
- include/pcl/${SUBSYS_NAME}/impl/region_growing.hpp
- include/pcl/${SUBSYS_NAME}/impl/region_growing_rgb.hpp
- include/pcl/${SUBSYS_NAME}/impl/organized_connected_component_segmentation.hpp
- include/pcl/${SUBSYS_NAME}/impl/organized_multi_plane_segmentation.hpp
- include/pcl/${SUBSYS_NAME}/impl/planar_polygon_fusion.hpp
- include/pcl/${SUBSYS_NAME}/impl/crf_normal_segmentation.hpp
- include/pcl/${SUBSYS_NAME}/impl/conditional_euclidean_clustering.hpp
- include/pcl/${SUBSYS_NAME}/impl/supervoxel_clustering.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/extract_clusters.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/extract_labeled_clusters.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/extract_polygonal_prism_data.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/sac_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/seeded_hue_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/segment_differences.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/region_growing.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/region_growing_rgb.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/organized_connected_component_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/organized_multi_plane_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/planar_polygon_fusion.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/crf_normal_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/conditional_euclidean_clustering.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/supervoxel_clustering.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/grabcut_segmentation.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/progressive_morphological_filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/approximate_progressive_morphological_filter.hpp"
)
# NOTE: boost/graph/boykov_kolmogorov_max_flow.hpp only exists for versions > 1.43
if(Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 43)
- set(impl_incs
- ${impl_incs}
- include/pcl/${SUBSYS_NAME}/impl/min_cut_segmentation.hpp
+ list(APPEND impl_incs
+ "include/pcl/${SUBSYS_NAME}/impl/min_cut_segmentation.hpp"
)
endif()
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_search pcl_sample_consensus pcl_filters pcl_features)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_search pcl_sample_consensus pcl_filters pcl_features)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_APPROXIMATE_PROGRESSIVE_MORPHOLOGICAL_FILTER_H_
+#define PCL_APPROXIMATE_PROGRESSIVE_MORPHOLOGICAL_FILTER_H_
+
+#include <pcl/pcl_base.h>
+#include <pcl/search/search.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+
+namespace pcl
+{
+ /** \brief
+ * Implements the Progressive Morphological Filter for segmentation of ground points.
+ * Description can be found in the article
+ * "A Progressive Morphological Filter for Removing Nonground Measurements from
+ * Airborne LIDAR Data"
+ * by K. Zhang, S. Chen, D. Whitman, M. Shyu, J. Yan, and C. Zhang.
+ */
+ template <typename PointT>
+ class PCL_EXPORTS ApproximateProgressiveMorphologicalFilter : public pcl::PCLBase<PointT>
+ {
+ public:
+
+ typedef pcl::PointCloud <PointT> PointCloud;
+
+ using PCLBase <PointT>::input_;
+ using PCLBase <PointT>::indices_;
+ using PCLBase <PointT>::initCompute;
+ using PCLBase <PointT>::deinitCompute;
+
+ public:
+
+ /** \brief Constructor that sets default values for member variables. */
+ ApproximateProgressiveMorphologicalFilter ();
+
+ virtual
+ ~ApproximateProgressiveMorphologicalFilter ();
+
+ /** \brief Get the maximum window size to be used in filtering ground returns. */
+ inline int
+ getMaxWindowSize () const { return (max_window_size_); }
+
+ /** \brief Set the maximum window size to be used in filtering ground returns. */
+ inline void
+ setMaxWindowSize (int max_window_size) { max_window_size_ = max_window_size; }
+
+ /** \brief Get the slope value to be used in computing the height threshold. */
+ inline float
+ getSlope () const { return (slope_); }
+
+ /** \brief Set the slope value to be used in computing the height threshold. */
+ inline void
+ setSlope (float slope) { slope_ = slope; }
+
+ /** \brief Get the maximum height above the parameterized ground surface to be considered a ground return. */
+ inline float
+ getMaxDistance () const { return (max_distance_); }
+
+ /** \brief Set the maximum height above the parameterized ground surface to be considered a ground return. */
+ inline void
+ setMaxDistance (float max_distance) { max_distance_ = max_distance; }
+
+ /** \brief Get the initial height above the parameterized ground surface to be considered a ground return. */
+ inline float
+ getInitialDistance () const { return (initial_distance_); }
+
+ /** \brief Set the initial height above the parameterized ground surface to be considered a ground return. */
+ inline void
+ setInitialDistance (float initial_distance) { initial_distance_ = initial_distance; }
+
+ /** \brief Get the cell size. */
+ inline float
+ getCellSize () const { return (cell_size_); }
+
+ /** \brief Set the cell size. */
+ inline void
+ setCellSize (float cell_size) { cell_size_ = cell_size; }
+
+ /** \brief Get the base to be used in computing progressive window sizes. */
+ inline float
+ getBase () const { return (base_); }
+
+ /** \brief Set the base to be used in computing progressive window sizes. */
+ inline void
+ setBase (float base) { base_ = base; }
+
+ /** \brief Get flag indicating whether or not to exponentially grow window sizes? */
+ inline bool
+ getExponential () const { return (exponential_); }
+
+ /** \brief Set flag indicating whether or not to exponentially grow window sizes? */
+ inline void
+ setExponential (bool exponential) { exponential_ = exponential; }
+
+ /** \brief Initialize the scheduler and set the number of threads to use.
+ * \param nr_threads the number of hardware threads to use (0 sets the value back to automatic)
+ */
+ inline void
+ setNumberOfThreads (unsigned int nr_threads = 0) { threads_ = nr_threads; }
+
+ /** \brief This method launches the segmentation algorithm and returns indices of
+ * points determined to be ground returns.
+ * \param[out] ground indices of points determined to be ground returns.
+ */
+ virtual void
+ extract (std::vector<int>& ground);
+
+ protected:
+
+ /** \brief Maximum window size to be used in filtering ground returns. */
+ int max_window_size_;
+
+ /** \brief Slope value to be used in computing the height threshold. */
+ float slope_;
+
+ /** \brief Maximum height above the parameterized ground surface to be considered a ground return. */
+ float max_distance_;
+
+ /** \brief Initial height above the parameterized ground surface to be considered a ground return. */
+ float initial_distance_;
+
+ /** \brief Cell size. */
+ float cell_size_;
+
+ /** \brief Base to be used in computing progressive window sizes. */
+ float base_;
+
+ /** \brief Exponentially grow window sizes? */
+ bool exponential_;
+
+ /** \brief Number of threads to be used. */
+ unsigned int threads_;
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/segmentation/impl/approximate_progressive_morphological_filter.hpp>
+#endif
+
+#endif
+
}
/** \brief Set the tolerance in meters for difference in perpendicular distance (d component of plane equation) to the plane between neighboring points, to be considered part of the same plane.
- * \param[in] distance_threshold the tolerance in meters
+ * \param[in] distance_threshold the tolerance in meters
+ * \param depth_dependent
*/
inline void
setDistanceThreshold (float distance_threshold, bool depth_dependent)
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
if (cloud.points.size () != normals.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%zu) different than normals (%zu)!\n", cloud.points.size (), normals.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%lu) different than normals (%lu)!\n", cloud.points.size (), normals.points.size ());
return;
}
//and indices[i]
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
if (tree->getIndices ()->size () != indices.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different set of indices (%zu) than the input set (%zu)!\n", tree->getIndices ()->size (), indices.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different set of indices (%lu) than the input set (%lu)!\n", tree->getIndices ()->size (), indices.size ());
return;
}
if (cloud.points.size () != normals.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%zu) different than normals (%zu)!\n", cloud.points.size (), normals.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Number of points in the input point cloud (%lu) different than normals (%lu)!\n", cloud.points.size (), normals.points.size ());
return;
}
// Create a bool vector of processed point indices, and initialize it to false
+++ /dev/null
-/*
- * Software License Agreement (BSD License)
- *
- * Point Cloud Library (PCL) - www.pointclouds.org
- * Copyright (c) 2012-, Open Perception, Inc.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of Willow Garage, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id$
- *
- */
-
-#ifndef PCL_SEGMENTATION_GRABCUT
-#define PCL_SEGMENTATION_GRABCUT
-
-#include <pcl/point_cloud.h>
-#include <pcl/pcl_base.h>
-#include <pcl/point_types.h>
-#include <pcl/segmentation/boost.h>
-#include <pcl/search/search.h>
-
-namespace pcl
-{
- namespace segmentation
- {
- namespace grabcut
- {
- /** boost implementation of Boykov and Kolmogorov's maxflow algorithm doesn't support
- * negative flows which makes it inappropriate for this conext.
- * This implementation of Boykov and Kolmogorov's maxflow algorithm by Stephen Gould
- * <stephen.gould@anu.edu.au> in DARWIN under BSD does the trick however solwer than original
- * implementation.
- */
- class BoykovKolmogorov
- {
- public:
- typedef int vertex_descriptor;
- typedef double edge_capacity_type;
-
- /// construct a maxflow/mincut problem with estimated max_nodes
- BoykovKolmogorov (std::size_t max_nodes = 0);
- /// destructor
- virtual ~BoykovKolmogorov () {}
- /// get number of nodes in the graph
- size_t
- numNodes () const { return nodes_.size (); }
- /// reset all edge capacities to zero (but don't free the graph)
- void
- reset ();
- /// clear the graph and internal datastructures
- void
- clear ();
- /// add nodes to the graph (returns the id of the first node added)
- int
- addNodes (std::size_t n = 1);
- /// add constant flow to graph
- void
- addConstant (double c) { flow_value_ += c; }
- /// add edge from s to nodeId
- void
- addSourceEdge (int u, double cap);
- /// add edge from nodeId to t
- void
- addTargetEdge (int u, double cap);
- /// add edge from u to v and edge from v to u
- /// (requires cap_uv + cap_vu >= 0)
- void
- addEdge (int u, int v, double cap_uv, double cap_vu = 0.0);
- /// solve the max-flow problem and return the flow
- double
- solve ();
- /// return true if \p u is in the s-set after calling \ref solve.
- bool
- inSourceTree (int u) const { return (cut_[u] == SOURCE); }
- /// return true if \p u is in the t-set after calling \ref solve
- bool
- inSinkTree (int u) const { return (cut_[u] == TARGET); }
- /// returns the residual capacity for an edge (use -1 for terminal (-1,-1) is the current flow
- double
- operator() (int u, int v) const;
-
- protected:
- /// tree states
- typedef enum { FREE = 0x00, SOURCE = 0x01, TARGET = 0x02 } nodestate;
- /// capacitated edge
- typedef std::map<int, double> capacitated_edge;
- /// edge pair
- typedef std::pair<capacitated_edge::iterator, capacitated_edge::iterator> edge_pair;
- /// pre-augment s-u-t and s-u-v-t paths
- void
- preAugmentPaths ();
- /// initialize trees from source and target
- void
- initializeTrees ();
- /// expand trees until a path is found (or no path (-1, -1))
- std::pair<int, int>
- expandTrees ();
- /// augment the path found by expandTrees; return orphaned subtrees
- void
- augmentPath (const std::pair<int, int>& path, std::deque<int>& orphans);
- /// adopt orphaned subtrees
- void
- adoptOrphans (std::deque<int>& orphans);
- /// clear active set
- void clearActive ();
- /// \return true if active set is empty
- inline bool
- isActiveSetEmpty () const { return (active_head_ == TERMINAL); }
- /// active if head or previous node is not the terminal
- inline bool
- isActive (int u) const { return ((u == active_head_) || (active_list_[u].first != TERMINAL)); }
- /// mark vertex as active
- void
- markActive (int u);
- /// mark vertex as inactive
- void
- markInactive (int u);
- /// edges leaving the source
- std::vector<double> source_edges_;
- /// edges entering the target
- std::vector<double> target_edges_;
- /// nodes and their outgoing internal edges
- std::vector<capacitated_edge> nodes_;
- /// current flow value (includes constant)
- double flow_value_;
- /// identifies which side of the cut a node falls
- std::vector<unsigned char> cut_;
-
- private:
- /// parents_ flag for terminal state
- static const int TERMINAL = -1;
- /// search tree (also uses cut_)
- std::vector<std::pair<int, edge_pair> > parents_;
- /// doubly-linked list (prev, next)
- std::vector<std::pair<int, int> > active_list_;
- int active_head_, active_tail_;
- };
-
- /**\brief Structure to save RGB colors into floats */
- struct Color
- {
- Color () : r (0), g (0), b (0) {}
- Color (float _r, float _g, float _b) : r(_r), g(_g), b(_b) {}
- Color (const pcl::RGB& color) : r (color.r), g (color.g), b (color.b) {}
-
- template<typename PointT>
- Color (const PointT& p)
- {
- r = static_cast<float> (p.r);
- g = static_cast<float> (p.g);
- b = static_cast<float> (p.b);
- }
-
- template<typename PointT>
- operator PointT () const
- {
- PointT p;
- p.r = static_cast<uint32_t> (r);
- p.g = static_cast<uint32_t> (g);
- p.b = static_cast<uint32_t> (b);
- return (p);
- }
-
- float r, g, b;
- };
- /// An Image is a point cloud of Color
- typedef pcl::PointCloud<Color> Image;
- /** \brief Compute squared distance between two colors
- * \param[in] c1 first color
- * \param[in] c2 second color
- * \return the squared distance measure in RGB space
- */
- float
- colorDistance (const Color& c1, const Color& c2);
- /// User supplied Trimap values
- enum TrimapValue { TrimapUnknown = -1, TrimapForeground, TrimapBackground };
- /// Grabcut derived hard segementation values
- enum SegmentationValue { SegmentationForeground = 0, SegmentationBackground };
- /// Gaussian structure
- struct Gaussian
- {
- Gaussian () {}
- /// mean of the gaussian
- Color mu;
- /// covariance matrix of the gaussian
- Eigen::Matrix3f covariance;
- /// determinant of the covariance matrix
- float determinant;
- /// inverse of the covariance matrix
- Eigen::Matrix3f inverse;
- /// weighting of this gaussian in the GMM.
- float pi;
- /// heighest eigenvalue of covariance matrix
- float eigenvalue;
- /// eigenvector corresponding to the heighest eigenvector
- Eigen::Vector3f eigenvector;
- };
-
- class GMM
- {
- public:
- /// Initialize GMM with ddesired number of gaussians.
- GMM () : gaussians_ (0) {}
- /// Initialize GMM with ddesired number of gaussians.
- GMM (std::size_t K) : gaussians_ (K) {}
- /// Destructor
- ~GMM () {}
- /// \return K
- std::size_t
- getK () const { return gaussians_.size (); }
- /// resize gaussians
- void
- resize (std::size_t K) { gaussians_.resize (K); }
- /// \return a reference to the gaussian at a given position
- Gaussian&
- operator[] (std::size_t pos) { return (gaussians_[pos]); }
- /// \return a const reference to the gaussian at a given position
- const Gaussian&
- operator[] (std::size_t pos) const { return (gaussians_[pos]); }
- /// \brief \return the computed probability density of a color in this GMM
- float
- probabilityDensity (const Color &c);
- /// \brief \return the computed probability density of a color in just one Gaussian
- float
- probabilityDensity(std::size_t i, const Color &c);
-
- private:
- /// array of gaussians
- std::vector<Gaussian> gaussians_;
- };
-
- /** Helper class that fits a single Gaussian to color samples */
- class GaussianFitter
- {
- public:
- GaussianFitter (float epsilon = 0.0001)
- : sum_ (Eigen::Vector3f::Zero ())
- , accumulator_ (Eigen::Matrix3f::Zero ())
- , count_ (0)
- , epsilon_ (epsilon)
- { }
-
- /// Add a color sample
- void
- add (const Color &c);
- /// Build the gaussian out of all the added color samples
- void
- fit (Gaussian& g, std::size_t total_count, bool compute_eigens = false) const;
- /// \return epsilon
- float
- getEpsilon () { return (epsilon_); }
- /** set epsilon which will be added to the covariance matrix diagonal which avoids singular
- * covariance matrix
- * \param[in] epsilon user defined epsilon
- */
- void
- setEpsilon (float epsilon) { epsilon_ = epsilon; }
-
- private:
- /// sum of r,g, and b
- Eigen::Vector3f sum_;
- /// matrix of products (i.e. r*r, r*g, r*b), some values are duplicated.
- Eigen::Matrix3f accumulator_;
- /// count of color samples added to the gaussian
- uint32_t count_;
- /// small value to add to covariance matrix diagonal to avoid singular values
- float epsilon_;
- };
-
- /** Build the initial GMMs using the Orchard and Bouman color clustering algorithm */
- void
- buildGMMs (const Image &image,
- const std::vector<int>& indices,
- const std::vector<SegmentationValue> &hardSegmentation,
- std::vector<std::size_t> &components,
- GMM &background_GMM, GMM &foreground_GMM);
- /** Iteratively learn GMMs using GrabCut updating algorithm */
- void
- learnGMMs (const Image& image,
- const std::vector<int>& indices,
- const std::vector<SegmentationValue>& hard_segmentation,
- std::vector<std::size_t>& components,
- GMM& background_GMM, GMM& foreground_GMM);
- }
- };
-
- /** \brief Implementation of the GrabCut segmentation in
- * "GrabCut — Interactive Foreground Extraction using Iterated Graph Cuts" by
- * Carsten Rother, Vladimir Kolmogorov and Andrew Blake.
- *
- * \author Justin Talbot, jtalbot@stanford.edu placed in Public Domain, 2010
- * \author Nizar Sallem port to PCL and adaptation of original code.
- * \ingroup segmentation
- */
- template <typename PointT>
- class GrabCut : public pcl::PCLBase<PointT>
- {
- public:
- typedef typename pcl::search::Search<PointT> KdTree;
- typedef typename pcl::search::Search<PointT>::Ptr KdTreePtr;
- typedef typename PCLBase<PointT>::PointCloudConstPtr PointCloudConstPtr;
- typedef typename PCLBase<PointT>::PointCloudPtr PointCloudPtr;
- using PCLBase<PointT>::input_;
- using PCLBase<PointT>::indices_;
- using PCLBase<PointT>::fake_indices_;
-
- /// Constructor
- GrabCut (uint32_t K = 5, float lambda = 50.f)
- : K_ (K)
- , lambda_ (lambda)
- , initialized_ (false)
- , nb_neighbours_ (9)
- {}
- /// Desctructor
- virtual ~GrabCut () {};
- // /// Set input cloud
- void
- setInputCloud (const PointCloudConstPtr& cloud);
- /// Set background points, foreground points = points \ background points
- void
- setBackgroundPoints (const PointCloudConstPtr& background_points);
- /// Set background indices, foreground indices = indices \ background indices
- void
- setBackgroundPointsIndices (int x1, int y1, int x2, int y2);
- /// Set background indices, foreground indices = indices \ background indices
- void
- setBackgroundPointsIndices (const PointIndicesConstPtr& indices);
- /// Run Grabcut refinement on the hard segmentation
- virtual void
- refine ();
- /// \return the number of pixels that have changed from foreground to background or vice versa
- virtual int
- refineOnce ();
- /// \return lambda
- float
- getLambda () { return (lambda_); }
- /** Set lambda parameter to user given value. Suggested value by the authors is 50
- * \param[in] lambda
- */
- void
- setLambda (float lambda) { lambda_ = lambda; }
- /// \return the number of components in the GMM
- uint32_t
- getK () { return (K_); }
- /** Set K parameter to user given value. Suggested value by the authors is 5
- * \param[in] K the number of components used in GMM
- */
- void
- setK (uint32_t K) { K_ = K; }
- /** \brief Provide a pointer to the search object.
- * \param tree a pointer to the spatial search object.
- */
- inline void
- setSearchMethod (const KdTreePtr &tree) { tree_ = tree; }
- /** \brief Get a pointer to the search method used. */
- inline KdTreePtr
- getSearchMethod () { return (tree_); }
- /** \brief Allows to set the number of neighbours to find.
- * \param[in] number_of_neighbours new number of neighbours
- */
- void
- setNumberOfNeighbours (int nb_neighbours) { nb_neighbours_ = nb_neighbours; }
- /** \brief Returns the number of neighbours to find. */
- int
- getNumberOfNeighbours () const { return (nb_neighbours_); }
- /** \brief This method launches the segmentation algorithm and returns the clusters that were
- * obtained during the segmentation. The indices of points belonging to the object will be stored
- * in the cluster with index 1, other indices will be stored in the cluster with index 0.
- * \param[out] clusters clusters that were obtained. Each cluster is an array of point indices.
- */
- void
- extract (std::vector<pcl::PointIndices>& clusters);
-
- protected:
- // Storage for N-link weights, each pixel stores links to nb_neighbours
- struct NLinks
- {
- NLinks () : nb_links (0), indices (0), dists (0), weights (0) {}
-
- int nb_links;
- std::vector<int> indices;
- std::vector<float> dists;
- std::vector<float> weights;
- };
- bool
- initCompute ();
- typedef pcl::segmentation::grabcut::BoykovKolmogorov::vertex_descriptor vertex_descriptor;
- // /** Update hard segmentation after running GraphCut, \return the number of pixels that have
- // * changed from foreground to background or vice versa.
- // */
- // int
- // updateHardSegmentation ();
- /// Compute beta from image
- void
- computeBeta ();
- /// Compute L parameter from given lambda
- void
- computeL ();
- /// Compute NLinks
- void
- computeNLinks ();
- /// Compute NLinks at a specific rectangular location
- float
- computeNLink (uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2);
- /// Edit Trimap
- void
- setTrimap (const PointIndicesConstPtr &indices, segmentation::grabcut::TrimapValue t);
- int
- updateHardSegmentation ();
- /// Fit Gaussian Multi Models
- virtual void
- fitGMMs ();
- /// Build the graph for GraphCut
- void
- initGraph ();
- /// Add an edge to the graph, graph must be oriented so we add the edge and its reverse
- void
- addEdge (vertex_descriptor v1, vertex_descriptor v2, float capacity, float rev_capacity);
- /// Set the weights of SOURCE --> v and v --> SINK
- void
- setTerminalWeights (vertex_descriptor v, float source_capacity, float sink_capacity);
- /// \return true if v is in source tree
- inline bool
- isSource (vertex_descriptor v) { return (graph_.inSourceTree (v)); }
- /// image width
- uint32_t width_;
- /// image height
- uint32_t height_;
- // Variables used in formulas from the paper.
- /// Number of GMM components
- uint32_t K_;
- /// lambda = 50. This value was suggested the GrabCut paper.
- float lambda_;
- /// beta = 1/2 * average of the squared color distances between all pairs of 8-neighboring pixels.
- float beta_;
- /// L = a large value to force a pixel to be foreground or background
- float L_;
- /// Pointer to the spatial search object.
- KdTreePtr tree_;
- /// Number of neighbours
- int nb_neighbours_;
- /// is segmentation initialized
- bool initialized_;
- /// Precomputed N-link weights
- std::vector<NLinks> n_links_;
- /// Converted input
- segmentation::grabcut::Image::Ptr image_;
- std::vector<segmentation::grabcut::TrimapValue> trimap_;
- std::vector<std::size_t> GMM_component_;
- std::vector<segmentation::grabcut::SegmentationValue> hard_segmentation_;
- // Not yet implemented (this would be interpreted as alpha)
- std::vector<float> soft_segmentation_;
- segmentation::grabcut::GMM background_GMM_, foreground_GMM_;
- // Graph part
- /// Graph for Graphcut
- pcl::segmentation::grabcut::BoykovKolmogorov graph_;
- /// Graph nodes
- std::vector<vertex_descriptor> graph_nodes_;
- };
-}
-
-#include <pcl/segmentation/impl/grabcut.hpp>
-
-#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef PCL_SEGMENTATION_GRABCUT
+#define PCL_SEGMENTATION_GRABCUT
+
+#include <pcl/point_cloud.h>
+#include <pcl/pcl_base.h>
+#include <pcl/point_types.h>
+#include <pcl/segmentation/boost.h>
+#include <pcl/search/search.h>
+
+namespace pcl
+{
+ namespace segmentation
+ {
+ namespace grabcut
+ {
+ /** boost implementation of Boykov and Kolmogorov's maxflow algorithm doesn't support
+ * negative flows which makes it inappropriate for this conext.
+ * This implementation of Boykov and Kolmogorov's maxflow algorithm by Stephen Gould
+ * <stephen.gould@anu.edu.au> in DARWIN under BSD does the trick however solwer than original
+ * implementation.
+ */
+ class PCL_EXPORTS BoykovKolmogorov
+ {
+ public:
+ typedef int vertex_descriptor;
+ typedef double edge_capacity_type;
+
+ /// construct a maxflow/mincut problem with estimated max_nodes
+ BoykovKolmogorov (std::size_t max_nodes = 0);
+ /// destructor
+ virtual ~BoykovKolmogorov () {}
+ /// get number of nodes in the graph
+ size_t
+ numNodes () const { return nodes_.size (); }
+ /// reset all edge capacities to zero (but don't free the graph)
+ void
+ reset ();
+ /// clear the graph and internal datastructures
+ void
+ clear ();
+ /// add nodes to the graph (returns the id of the first node added)
+ int
+ addNodes (std::size_t n = 1);
+ /// add constant flow to graph
+ void
+ addConstant (double c) { flow_value_ += c; }
+ /// add edge from s to nodeId
+ void
+ addSourceEdge (int u, double cap);
+ /// add edge from nodeId to t
+ void
+ addTargetEdge (int u, double cap);
+ /// add edge from u to v and edge from v to u
+ /// (requires cap_uv + cap_vu >= 0)
+ void
+ addEdge (int u, int v, double cap_uv, double cap_vu = 0.0);
+ /// solve the max-flow problem and return the flow
+ double
+ solve ();
+ /// return true if \p u is in the s-set after calling \ref solve.
+ bool
+ inSourceTree (int u) const { return (cut_[u] == SOURCE); }
+ /// return true if \p u is in the t-set after calling \ref solve
+ bool
+ inSinkTree (int u) const { return (cut_[u] == TARGET); }
+ /// returns the residual capacity for an edge (use -1 for terminal (-1,-1) is the current flow
+ double
+ operator() (int u, int v) const;
+
+ double
+ getSourceEdgeCapacity (int u) const;
+
+ double
+ getTargetEdgeCapacity (int u) const;
+
+ protected:
+ /// tree states
+ typedef enum { FREE = 0x00, SOURCE = 0x01, TARGET = 0x02 } nodestate;
+ /// capacitated edge
+ typedef std::map<int, double> capacitated_edge;
+ /// edge pair
+ typedef std::pair<capacitated_edge::iterator, capacitated_edge::iterator> edge_pair;
+ /// pre-augment s-u-t and s-u-v-t paths
+ void
+ preAugmentPaths ();
+ /// initialize trees from source and target
+ void
+ initializeTrees ();
+ /// expand trees until a path is found (or no path (-1, -1))
+ std::pair<int, int>
+ expandTrees ();
+ /// augment the path found by expandTrees; return orphaned subtrees
+ void
+ augmentPath (const std::pair<int, int>& path, std::deque<int>& orphans);
+ /// adopt orphaned subtrees
+ void
+ adoptOrphans (std::deque<int>& orphans);
+ /// clear active set
+ void clearActive ();
+ /// \return true if active set is empty
+ inline bool
+ isActiveSetEmpty () const { return (active_head_ == TERMINAL); }
+ /// active if head or previous node is not the terminal
+ inline bool
+ isActive (int u) const { return ((u == active_head_) || (active_list_[u].first != TERMINAL)); }
+ /// mark vertex as active
+ void
+ markActive (int u);
+ /// mark vertex as inactive
+ void
+ markInactive (int u);
+ /// edges leaving the source
+ std::vector<double> source_edges_;
+ /// edges entering the target
+ std::vector<double> target_edges_;
+ /// nodes and their outgoing internal edges
+ std::vector<capacitated_edge> nodes_;
+ /// current flow value (includes constant)
+ double flow_value_;
+ /// identifies which side of the cut a node falls
+ std::vector<unsigned char> cut_;
+
+ private:
+ /// parents_ flag for terminal state
+ static const int TERMINAL = -1;
+ /// search tree (also uses cut_)
+ std::vector<std::pair<int, edge_pair> > parents_;
+ /// doubly-linked list (prev, next)
+ std::vector<std::pair<int, int> > active_list_;
+ int active_head_, active_tail_;
+ };
+
+ /**\brief Structure to save RGB colors into floats */
+ struct Color
+ {
+ Color () : r (0), g (0), b (0) {}
+ Color (float _r, float _g, float _b) : r(_r), g(_g), b(_b) {}
+ Color (const pcl::RGB& color) : r (color.r), g (color.g), b (color.b) {}
+
+ template<typename PointT>
+ Color (const PointT& p);
+
+ template<typename PointT>
+ operator PointT () const;
+
+ float r, g, b;
+ };
+ /// An Image is a point cloud of Color
+ typedef pcl::PointCloud<Color> Image;
+ /** \brief Compute squared distance between two colors
+ * \param[in] c1 first color
+ * \param[in] c2 second color
+ * \return the squared distance measure in RGB space
+ */
+ float
+ colorDistance (const Color& c1, const Color& c2);
+ /// User supplied Trimap values
+ enum TrimapValue { TrimapUnknown = -1, TrimapForeground, TrimapBackground };
+ /// Grabcut derived hard segementation values
+ enum SegmentationValue { SegmentationForeground = 0, SegmentationBackground };
+ /// Gaussian structure
+ struct Gaussian
+ {
+ Gaussian () {}
+ /// mean of the gaussian
+ Color mu;
+ /// covariance matrix of the gaussian
+ Eigen::Matrix3f covariance;
+ /// determinant of the covariance matrix
+ float determinant;
+ /// inverse of the covariance matrix
+ Eigen::Matrix3f inverse;
+ /// weighting of this gaussian in the GMM.
+ float pi;
+ /// heighest eigenvalue of covariance matrix
+ float eigenvalue;
+ /// eigenvector corresponding to the heighest eigenvector
+ Eigen::Vector3f eigenvector;
+ };
+
+ class PCL_EXPORTS GMM
+ {
+ public:
+ /// Initialize GMM with ddesired number of gaussians.
+ GMM () : gaussians_ (0) {}
+ /// Initialize GMM with ddesired number of gaussians.
+ GMM (std::size_t K) : gaussians_ (K) {}
+ /// Destructor
+ ~GMM () {}
+ /// \return K
+ std::size_t
+ getK () const { return gaussians_.size (); }
+ /// resize gaussians
+ void
+ resize (std::size_t K) { gaussians_.resize (K); }
+ /// \return a reference to the gaussian at a given position
+ Gaussian&
+ operator[] (std::size_t pos) { return (gaussians_[pos]); }
+ /// \return a const reference to the gaussian at a given position
+ const Gaussian&
+ operator[] (std::size_t pos) const { return (gaussians_[pos]); }
+ /// \brief \return the computed probability density of a color in this GMM
+ float
+ probabilityDensity (const Color &c);
+ /// \brief \return the computed probability density of a color in just one Gaussian
+ float
+ probabilityDensity(std::size_t i, const Color &c);
+
+ private:
+ /// array of gaussians
+ std::vector<Gaussian> gaussians_;
+ };
+
+ /** Helper class that fits a single Gaussian to color samples */
+ class GaussianFitter
+ {
+ public:
+ GaussianFitter (float epsilon = 0.0001)
+ : sum_ (Eigen::Vector3f::Zero ())
+ , accumulator_ (Eigen::Matrix3f::Zero ())
+ , count_ (0)
+ , epsilon_ (epsilon)
+ { }
+
+ /// Add a color sample
+ void
+ add (const Color &c);
+ /// Build the gaussian out of all the added color samples
+ void
+ fit (Gaussian& g, std::size_t total_count, bool compute_eigens = false) const;
+ /// \return epsilon
+ float
+ getEpsilon () { return (epsilon_); }
+ /** set epsilon which will be added to the covariance matrix diagonal which avoids singular
+ * covariance matrix
+ * \param[in] epsilon user defined epsilon
+ */
+ void
+ setEpsilon (float epsilon) { epsilon_ = epsilon; }
+
+ private:
+ /// sum of r,g, and b
+ Eigen::Vector3f sum_;
+ /// matrix of products (i.e. r*r, r*g, r*b), some values are duplicated.
+ Eigen::Matrix3f accumulator_;
+ /// count of color samples added to the gaussian
+ uint32_t count_;
+ /// small value to add to covariance matrix diagonal to avoid singular values
+ float epsilon_;
+ };
+
+ /** Build the initial GMMs using the Orchard and Bouman color clustering algorithm */
+ PCL_EXPORTS void
+ buildGMMs (const Image &image,
+ const std::vector<int>& indices,
+ const std::vector<SegmentationValue> &hardSegmentation,
+ std::vector<std::size_t> &components,
+ GMM &background_GMM, GMM &foreground_GMM);
+ /** Iteratively learn GMMs using GrabCut updating algorithm */
+ PCL_EXPORTS void
+ learnGMMs (const Image& image,
+ const std::vector<int>& indices,
+ const std::vector<SegmentationValue>& hard_segmentation,
+ std::vector<std::size_t>& components,
+ GMM& background_GMM, GMM& foreground_GMM);
+ }
+ };
+
+ /** \brief Implementation of the GrabCut segmentation in
+ * "GrabCut — Interactive Foreground Extraction using Iterated Graph Cuts" by
+ * Carsten Rother, Vladimir Kolmogorov and Andrew Blake.
+ *
+ * \author Justin Talbot, jtalbot@stanford.edu placed in Public Domain, 2010
+ * \author Nizar Sallem port to PCL and adaptation of original code.
+ * \ingroup segmentation
+ */
+ template <typename PointT>
+ class GrabCut : public pcl::PCLBase<PointT>
+ {
+ public:
+ typedef typename pcl::search::Search<PointT> KdTree;
+ typedef typename pcl::search::Search<PointT>::Ptr KdTreePtr;
+ typedef typename PCLBase<PointT>::PointCloudConstPtr PointCloudConstPtr;
+ typedef typename PCLBase<PointT>::PointCloudPtr PointCloudPtr;
+ using PCLBase<PointT>::input_;
+ using PCLBase<PointT>::indices_;
+ using PCLBase<PointT>::fake_indices_;
+
+ /// Constructor
+ GrabCut (uint32_t K = 5, float lambda = 50.f)
+ : K_ (K)
+ , lambda_ (lambda)
+ , nb_neighbours_ (9)
+ , initialized_ (false)
+ {}
+ /// Desctructor
+ virtual ~GrabCut () {};
+ // /// Set input cloud
+ void
+ setInputCloud (const PointCloudConstPtr& cloud);
+ /// Set background points, foreground points = points \ background points
+ void
+ setBackgroundPoints (const PointCloudConstPtr& background_points);
+ /// Set background indices, foreground indices = indices \ background indices
+ void
+ setBackgroundPointsIndices (int x1, int y1, int x2, int y2);
+ /// Set background indices, foreground indices = indices \ background indices
+ void
+ setBackgroundPointsIndices (const PointIndicesConstPtr& indices);
+ /// Run Grabcut refinement on the hard segmentation
+ virtual void
+ refine ();
+ /// \return the number of pixels that have changed from foreground to background or vice versa
+ virtual int
+ refineOnce ();
+ /// \return lambda
+ float
+ getLambda () { return (lambda_); }
+ /** Set lambda parameter to user given value. Suggested value by the authors is 50
+ * \param[in] lambda
+ */
+ void
+ setLambda (float lambda) { lambda_ = lambda; }
+ /// \return the number of components in the GMM
+ uint32_t
+ getK () { return (K_); }
+ /** Set K parameter to user given value. Suggested value by the authors is 5
+ * \param[in] K the number of components used in GMM
+ */
+ void
+ setK (uint32_t K) { K_ = K; }
+ /** \brief Provide a pointer to the search object.
+ * \param tree a pointer to the spatial search object.
+ */
+ inline void
+ setSearchMethod (const KdTreePtr &tree) { tree_ = tree; }
+ /** \brief Get a pointer to the search method used. */
+ inline KdTreePtr
+ getSearchMethod () { return (tree_); }
+ /** \brief Allows to set the number of neighbours to find.
+ * \param[in] nb_neighbours new number of neighbours
+ */
+ void
+ setNumberOfNeighbours (int nb_neighbours) { nb_neighbours_ = nb_neighbours; }
+ /** \brief Returns the number of neighbours to find. */
+ int
+ getNumberOfNeighbours () const { return (nb_neighbours_); }
+ /** \brief This method launches the segmentation algorithm and returns the clusters that were
+ * obtained during the segmentation. The indices of points belonging to the object will be stored
+ * in the cluster with index 1, other indices will be stored in the cluster with index 0.
+ * \param[out] clusters clusters that were obtained. Each cluster is an array of point indices.
+ */
+ void
+ extract (std::vector<pcl::PointIndices>& clusters);
+
+ protected:
+ // Storage for N-link weights, each pixel stores links to nb_neighbours
+ struct NLinks
+ {
+ NLinks () : nb_links (0), indices (0), dists (0), weights (0) {}
+
+ int nb_links;
+ std::vector<int> indices;
+ std::vector<float> dists;
+ std::vector<float> weights;
+ };
+ bool
+ initCompute ();
+ typedef pcl::segmentation::grabcut::BoykovKolmogorov::vertex_descriptor vertex_descriptor;
+ /// Compute beta from image
+ void
+ computeBetaOrganized ();
+ /// Compute beta from cloud
+ void
+ computeBetaNonOrganized ();
+ /// Compute L parameter from given lambda
+ void
+ computeL ();
+ /// Compute NLinks from image
+ void
+ computeNLinksOrganized ();
+ /// Compute NLinks from cloud
+ void
+ computeNLinksNonOrganized ();
+ /// Edit Trimap
+ void
+ setTrimap (const PointIndicesConstPtr &indices, segmentation::grabcut::TrimapValue t);
+ int
+ updateHardSegmentation ();
+ /// Fit Gaussian Multi Models
+ virtual void
+ fitGMMs ();
+ /// Build the graph for GraphCut
+ void
+ initGraph ();
+ /// Add an edge to the graph, graph must be oriented so we add the edge and its reverse
+ void
+ addEdge (vertex_descriptor v1, vertex_descriptor v2, float capacity, float rev_capacity);
+ /// Set the weights of SOURCE --> v and v --> SINK
+ void
+ setTerminalWeights (vertex_descriptor v, float source_capacity, float sink_capacity);
+ /// \return true if v is in source tree
+ inline bool
+ isSource (vertex_descriptor v) { return (graph_.inSourceTree (v)); }
+ /// image width
+ uint32_t width_;
+ /// image height
+ uint32_t height_;
+ // Variables used in formulas from the paper.
+ /// Number of GMM components
+ uint32_t K_;
+ /// lambda = 50. This value was suggested the GrabCut paper.
+ float lambda_;
+ /// beta = 1/2 * average of the squared color distances between all pairs of 8-neighboring pixels.
+ float beta_;
+ /// L = a large value to force a pixel to be foreground or background
+ float L_;
+ /// Pointer to the spatial search object.
+ KdTreePtr tree_;
+ /// Number of neighbours
+ int nb_neighbours_;
+ /// is segmentation initialized
+ bool initialized_;
+ /// Precomputed N-link weights
+ std::vector<NLinks> n_links_;
+ /// Converted input
+ segmentation::grabcut::Image::Ptr image_;
+ std::vector<segmentation::grabcut::TrimapValue> trimap_;
+ std::vector<std::size_t> GMM_component_;
+ std::vector<segmentation::grabcut::SegmentationValue> hard_segmentation_;
+ // Not yet implemented (this would be interpreted as alpha)
+ std::vector<float> soft_segmentation_;
+ segmentation::grabcut::GMM background_GMM_, foreground_GMM_;
+ // Graph part
+ /// Graph for Graphcut
+ pcl::segmentation::grabcut::BoykovKolmogorov graph_;
+ /// Graph nodes
+ std::vector<vertex_descriptor> graph_nodes_;
+ };
+}
+
+#include <pcl/segmentation/impl/grabcut_segmentation.hpp>
+
+#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_SEGMENTATION_APPROXIMATE_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+#define PCL_SEGMENTATION_APPROXIMATE_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+
+#include <pcl/common/common.h>
+#include <pcl/common/io.h>
+#include <pcl/filters/morphological_filter.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::ApproximateProgressiveMorphologicalFilter<PointT>::ApproximateProgressiveMorphologicalFilter () :
+ max_window_size_ (33),
+ slope_ (0.7f),
+ max_distance_ (10.0f),
+ initial_distance_ (0.15f),
+ cell_size_ (1.0f),
+ base_ (2.0f),
+ exponential_ (true),
+ threads_ (0)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::ApproximateProgressiveMorphologicalFilter<PointT>::~ApproximateProgressiveMorphologicalFilter ()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::ApproximateProgressiveMorphologicalFilter<PointT>::extract (std::vector<int>& ground)
+{
+ bool segmentation_is_possible = initCompute ();
+ if (!segmentation_is_possible)
+ {
+ deinitCompute ();
+ return;
+ }
+
+ // Compute the series of window sizes and height thresholds
+ std::vector<float> height_thresholds;
+ std::vector<float> window_sizes;
+ std::vector<int> half_sizes;
+ int iteration = 0;
+ int half_size = 0.0f;
+ float window_size = 0.0f;
+ float height_threshold = 0.0f;
+
+ while (window_size < max_window_size_)
+ {
+ // Determine the initial window size.
+ if (exponential_)
+ half_size = static_cast<int> (std::pow (static_cast<float> (base_), iteration));
+ else
+ half_size = (iteration+1) * base_;
+
+ window_size = 2 * half_size + 1;
+
+ // Calculate the height threshold to be used in the next iteration.
+ if (iteration == 0)
+ height_threshold = initial_distance_;
+ else
+ height_threshold = slope_ * (window_size - window_sizes[iteration-1]) * cell_size_ + initial_distance_;
+
+ // Enforce max distance on height threshold
+ if (height_threshold > max_distance_)
+ height_threshold = max_distance_;
+
+ half_sizes.push_back (half_size);
+ window_sizes.push_back (window_size);
+ height_thresholds.push_back (height_threshold);
+
+ iteration++;
+ }
+
+ // setup grid based on scale and extents
+ Eigen::Vector4f global_max, global_min;
+ pcl::getMinMax3D<PointT> (*input_, global_min, global_max);
+
+ float xextent = global_max.x () - global_min.x ();
+ float yextent = global_max.y () - global_min.y ();
+
+ int rows = static_cast<int> (std::floor (yextent / cell_size_) + 1);
+ int cols = static_cast<int> (std::floor (xextent / cell_size_) + 1);
+
+ Eigen::MatrixXf A (rows, cols);
+ A.setConstant (std::numeric_limits<float>::quiet_NaN ());
+
+ Eigen::MatrixXf Z (rows, cols);
+ Z.setConstant (std::numeric_limits<float>::quiet_NaN ());
+
+ Eigen::MatrixXf Zf (rows, cols);
+ Zf.setConstant (std::numeric_limits<float>::quiet_NaN ());
+
+#ifdef _OPENMP
+#pragma omp parallel for num_threads(threads_)
+#endif
+ for (int i = 0; i < (int)input_->points.size (); ++i)
+ {
+ // ...then test for lower points within the cell
+ PointT p = input_->points[i];
+ int row = std::floor(p.y - global_min.y ());
+ int col = std::floor(p.x - global_min.x ());
+
+ if (p.z < A (row, col) || pcl_isnan (A (row, col)))
+ {
+ A (row, col) = p.z;
+ }
+ }
+
+ // Ground indices are initially limited to those points in the input cloud we
+ // wish to process
+ ground = *indices_;
+
+ // Progressively filter ground returns using morphological open
+ for (size_t i = 0; i < window_sizes.size (); ++i)
+ {
+ PCL_DEBUG (" Iteration %d (height threshold = %f, window size = %f, half size = %d)...",
+ i, height_thresholds[i], window_sizes[i], half_sizes[i]);
+
+ // Limit filtering to those points currently considered ground returns
+ typename pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>);
+ pcl::copyPointCloud<PointT> (*input_, ground, *cloud);
+
+ // Apply the morphological opening operation at the current window size.
+#ifdef _OPENMP
+#pragma omp parallel for num_threads(threads_)
+#endif
+ for (int row = 0; row < rows; ++row)
+ {
+ int rs, re;
+ rs = ((row - half_sizes[i]) < 0) ? 0 : row - half_sizes[i];
+ re = ((row + half_sizes[i]) > (rows-1)) ? (rows-1) : row + half_sizes[i];
+
+ for (int col = 0; col < cols; ++col)
+ {
+ int cs, ce;
+ cs = ((col - half_sizes[i]) < 0) ? 0 : col - half_sizes[i];
+ ce = ((col + half_sizes[i]) > (cols-1)) ? (cols-1) : col + half_sizes[i];
+
+ float min_coeff = std::numeric_limits<float>::max ();
+
+ for (int j = rs; j < (re + 1); ++j)
+ {
+ for (int k = cs; k < (ce + 1); ++k)
+ {
+ if (A (j, k) != std::numeric_limits<float>::quiet_NaN ())
+ {
+ if (A (j, k) < min_coeff)
+ min_coeff = A (j, k);
+ }
+ }
+ }
+
+ if (min_coeff != std::numeric_limits<float>::max ())
+ Z(row, col) = min_coeff;
+ }
+ }
+
+#ifdef _OPENMP
+#pragma omp parallel for num_threads(threads_)
+#endif
+ for (int row = 0; row < rows; ++row)
+ {
+ int rs, re;
+ rs = ((row - half_sizes[i]) < 0) ? 0 : row - half_sizes[i];
+ re = ((row + half_sizes[i]) > (rows-1)) ? (rows-1) : row + half_sizes[i];
+
+ for (int col = 0; col < cols; ++col)
+ {
+ int cs, ce;
+ cs = ((col - half_sizes[i]) < 0) ? 0 : col - half_sizes[i];
+ ce = ((col + half_sizes[i]) > (cols-1)) ? (cols-1) : col + half_sizes[i];
+
+ float max_coeff = -std::numeric_limits<float>::max ();
+
+ for (int j = rs; j < (re + 1); ++j)
+ {
+ for (int k = cs; k < (ce + 1); ++k)
+ {
+ if (Z (j, k) != std::numeric_limits<float>::quiet_NaN ())
+ {
+ if (Z (j, k) > max_coeff)
+ max_coeff = Z (j, k);
+ }
+ }
+ }
+
+ if (max_coeff != -std::numeric_limits<float>::max ())
+ Zf (row, col) = max_coeff;
+ }
+ }
+
+ // Find indices of the points whose difference between the source and
+ // filtered point clouds is less than the current height threshold.
+ std::vector<int> pt_indices;
+ for (size_t p_idx = 0; p_idx < ground.size (); ++p_idx)
+ {
+ PointT p = cloud->points[p_idx];
+ int erow = static_cast<int> (std::floor ((p.y - global_min.y ()) / cell_size_));
+ int ecol = static_cast<int> (std::floor ((p.x - global_min.x ()) / cell_size_));
+
+ float diff = p.z - Zf (erow, ecol);
+ if (diff < height_thresholds[i])
+ pt_indices.push_back (ground[p_idx]);
+ }
+
+ A.swap (Zf);
+
+ // Ground is now limited to pt_indices
+ ground.swap (pt_indices);
+
+ PCL_DEBUG ("ground now has %d points\n", ground.size ());
+ }
+
+ deinitCompute ();
+}
+
+
+#define PCL_INSTANTIATE_ApproximateProgressiveMorphologicalFilter(T) template class pcl::ApproximateProgressiveMorphologicalFilter<T>;
+
+#endif // PCL_SEGMENTATION_APPROXIMATE_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+
}
// If extracting removed clusters, all clusters need to be saved, otherwise only the ones within the given cluster size range
- if (extract_removed_clusters_ || (current_cluster.size () >= min_cluster_size_ && current_cluster.size () <= max_cluster_size_))
+ if (extract_removed_clusters_ ||
+ (static_cast<int> (current_cluster.size ()) >= min_cluster_size_ &&
+ static_cast<int> (current_cluster.size ()) <= max_cluster_size_))
{
pcl::PointIndices pi;
pi.header = input_->header;
for (int ii = 0; ii < static_cast<int> (current_cluster.size ()); ++ii) // ii = indices iterator
pi.indices[ii] = current_cluster[ii];
- if (extract_removed_clusters_ && current_cluster.size () < min_cluster_size_)
+ if (extract_removed_clusters_ && static_cast<int> (current_cluster.size ()) < min_cluster_size_)
small_clusters_->push_back (pi);
- else if (extract_removed_clusters_ && current_cluster.size () > max_cluster_size_)
+ else if (extract_removed_clusters_ && static_cast<int> (current_cluster.size ()) > max_cluster_size_)
large_clusters_->push_back (pi);
else
clusters.push_back (pi);
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
// Check if the tree is sorted -- if it is we don't need to check the first element
//and indices[i]
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
if (tree->getIndices ()->size () != indices.size ())
{
- PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different set of indices (%zu) than the input set (%zu)!\n", tree->getIndices ()->size (), indices.size ());
+ PCL_ERROR ("[pcl::extractEuclideanClusters] Tree built for a different set of indices (%lu) than the input set (%lu)!\n", tree->getIndices ()->size (), indices.size ());
return;
}
// Check if the tree is sorted -- if it is we don't need to check the first element
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::extractLabeledEuclideanClusters] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::extractLabeledEuclideanClusters] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
// Create a bool vector of processed point indices, and initialize it to false
if (static_cast<int> (planar_hull_->points.size ()) < min_pts_hull_)
{
- PCL_ERROR ("[pcl::%s::segment] Not enough points (%zu) in the hull!\n", getClassName ().c_str (), planar_hull_->points.size ());
+ PCL_ERROR ("[pcl::%s::segment] Not enough points (%lu) in the hull!\n", getClassName ().c_str (), planar_hull_->points.size ());
output.indices.clear ();
return;
}
+++ /dev/null
-///////////////////////////////////////////////////////
-// grabCut->initialize (xstart, ystart, xend, yend); //
-// grabCut->fitGMMs (); //
-///////////////////////////////////////////////////////
-#ifndef PCL_SEGMENTATION_IMPL_GRABCUT_HPP
-#define PCL_SEGMENTATION_IMPL_GRABCUT_HPP
-
-#include <pcl/search/organized.h>
-#include <pcl/search/kdtree.h>
-#include <pcl/common/distances.h>
-
-namespace pcl
-{
- template <>
- float squaredEuclideanDistance (const pcl::segmentation::grabcut::Color &c1,
- const pcl::segmentation::grabcut::Color &c2)
- {
- return ((c1.r-c2.r)*(c1.r-c2.r)+(c1.g-c2.g)*(c1.g-c2.g)+(c1.b-c2.b)*(c1.b-c2.b));
- }
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::setInputCloud (const PointCloudConstPtr &cloud)
-{
- input_ = cloud;
-}
-
-template <typename PointT> bool
-pcl::GrabCut<PointT>::initCompute ()
-{
- using namespace pcl::segmentation::grabcut;
- if (!pcl::PCLBase<PointT>::initCompute ())
- {
- PCL_ERROR ("[pcl::GrabCut::initCompute ()] Init failed!");
- return (false);
- }
-
- if (!input_->isOrganized ())
- {
- PCL_ERROR ("[pcl::GrabCut::initCompute ()] Need an organized point cloud to proceed!");
- return (false);
- }
-
- std::vector<pcl::PCLPointField> in_fields_;
- if ((pcl::getFieldIndex<PointT> (*input_, "rgb", in_fields_) == -1) &&
- (pcl::getFieldIndex<PointT> (*input_, "rgba", in_fields_) == -1))
- {
- PCL_ERROR ("[pcl::GrabCut::initCompute ()] No RGB data available, aborting!");
- return (false);
- }
-
- // Initialize the working image
- image_.reset (new Image (input_->width, input_->height));
- for (std::size_t i = 0; i < input_->size (); ++i)
- {
- (*image_) [i] = Color (input_->points[i]);
- }
- width_ = image_->width;
- height_ = image_->height;
-
- // Initialize the spatial locator
- if (!tree_)
- {
- if (input_->isOrganized ())
- tree_.reset (new pcl::search::OrganizedNeighbor<PointT> ());
- else
- tree_.reset (new pcl::search::KdTree<PointT> (false));
- tree_->setInputCloud (input_);
- }
- const std::size_t indices_size = indices_->size ();
- trimap_ = std::vector<segmentation::grabcut::TrimapValue> (indices_size, TrimapUnknown);
- hard_segmentation_ = std::vector<segmentation::grabcut::SegmentationValue> (indices_size,
- SegmentationBackground);
- GMM_component_.resize (indices_size);
- n_links_.resize (indices_size);
- // soft_segmentation_ = 0; // Not yet implemented
- foreground_GMM_.resize (K_);
- background_GMM_.resize (K_);
- //set some constants
- computeL ();
- computeBeta ();
- computeNLinks ();
-
- initialized_ = false;
- return (true);
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::addEdge (vertex_descriptor v1, vertex_descriptor v2, float capacity, float rev_capacity)
-{
- graph_.addEdge (v1, v2, capacity, rev_capacity);
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::setTerminalWeights (vertex_descriptor v, float source_capacity, float sink_capacity)
-{
- graph_.addSourceEdge (v, source_capacity);
- graph_.addTargetEdge (v, sink_capacity);
-}
-
-// template <typename PointT> void
-// pcl::GrabCut<PointT>::setBackgroundPointsIndices (int x1, int y1, int x2, int y2)
-// {
-// using namespace pcl::segmentation::grabcut;
-
-// // Step 1: User creates inital Trimap with rectangle, Background outside, Unknown inside
-// fill (trimap_.begin (), trimap_.end (), TrimapBackground);
-// fillRectangle (trimap_, width_, height_, x1, y1, x2, y2, TrimapUnknown);
-
-// // Step 2: Initial segmentation, Background where Trimap is Background, Foreground where Trimap is Unknown.
-// fill (hard_segmentation_.begin (), hard_segmentation_.end (), SegmentationBackground);
-// fillRectangle (hard_segmentation_, width_, height_, x1, y1, x2, y2, SegmentationForeground);
-// if (!initialized_)
-// {
-// fitGMMs ();
-// initialized_ = true;
-// }
-// }
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::setBackgroundPointsIndices (const PointIndicesConstPtr &indices)
-{
- using namespace pcl::segmentation::grabcut;
- if (!initCompute ())
- return;
-
- std::fill (trimap_.begin (), trimap_.end (), TrimapBackground);
- std::fill (hard_segmentation_.begin (), hard_segmentation_.end (), SegmentationBackground);
- for (std::vector<int>::const_iterator idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
- {
- trimap_[*idx] = TrimapUnknown;
- hard_segmentation_[*idx] = SegmentationForeground;
- }
-
- if (!initialized_)
- {
- fitGMMs ();
- initialized_ = true;
- }
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::fitGMMs ()
-{
- // Step 3: Build GMMs using Orchard-Bouman clustering algorithm
- buildGMMs (*image_, *indices_, hard_segmentation_, GMM_component_, background_GMM_, foreground_GMM_);
-
- // Initialize the graph for graphcut (do this here so that the T-Link debugging image will be initialized)
- initGraph ();
-}
-
-template <typename PointT> int
-pcl::GrabCut<PointT>::refineOnce ()
-{
- // Steps 4 and 5: Learn new GMMs from current segmentation
- learnGMMs (*image_, *indices_, hard_segmentation_, GMM_component_, background_GMM_, foreground_GMM_);
-
- // Step 6: Run GraphCut and update segmentation
- initGraph ();
-
- float flow = graph_.solve ();
-
- int changed = updateHardSegmentation ();
- PCL_INFO ("%d pixels changed segmentation (max flow = %f)\n", changed, flow);
-
- return (changed);
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::refine ()
-{
- std::size_t changed = indices_->size ();
-
- while (changed)
- changed = refineOnce ();
-}
-
-template <typename PointT> int
-pcl::GrabCut<PointT>::updateHardSegmentation ()
-{
- using namespace pcl::segmentation::grabcut;
-
- int changed = 0;
-
- const int number_of_indices = static_cast<int> (indices_->size ());
- for (int i_point = 0; i_point < number_of_indices; ++i_point)
- {
- SegmentationValue old_value = hard_segmentation_ [i_point];
-
- if (trimap_ [i_point] == TrimapBackground)
- hard_segmentation_ [i_point] = SegmentationBackground;
- else
- if (trimap_ [i_point] == TrimapForeground)
- hard_segmentation_ [i_point] = SegmentationForeground;
- else // TrimapUnknown
- {
- if (isSource (graph_nodes_[i_point]))
- hard_segmentation_ [i_point] = SegmentationForeground;
- else
- hard_segmentation_ [i_point] = SegmentationBackground;
- }
-
- if (old_value != hard_segmentation_ [i_point])
- ++changed;
- }
- return (changed);
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::setTrimap (const PointIndicesConstPtr &indices, segmentation::grabcut::TrimapValue t)
-{
- using namespace pcl::segmentation::grabcut;
- std::vector<int>::const_iterator idx = indices->indices.begin ();
- for (; idx != indices->indices.end (); ++idx)
- trimap_[*idx] = t;
-
- // Immediately set the hard segmentation as well so that the display will update.
- if (t == TrimapForeground)
- for (idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
- hard_segmentation_[*idx] = SegmentationForeground;
- else
- if (t == TrimapBackground)
- for (idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
- hard_segmentation_[*idx] = SegmentationBackground;
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::initGraph ()
-{
- using namespace pcl::segmentation::grabcut;
- const int number_of_indices = static_cast<int> (indices_->size ());
- // Set up the graph (it can only be used once, so we have to recreate it each time the graph is updated)
- graph_.clear ();
- graph_nodes_.clear ();
- graph_nodes_.resize (indices_->size ());
- int start = graph_.addNodes (indices_->size ());
- for (int idx = 0; idx < indices_->size (); ++idx)
- {
- graph_nodes_[idx] = start;
- ++start;
- }
-
- // Set T-Link weights
- for (int i_point = 0; i_point < number_of_indices; ++i_point)
- {
- int point_index = (*indices_) [i_point];
- float back, fore;
-
- switch (trimap_[point_index])
- {
- case TrimapUnknown :
- {
- fore = static_cast<float> (-log (background_GMM_.probabilityDensity (image_->points[point_index])));
- back = static_cast<float> (-log (foreground_GMM_.probabilityDensity (image_->points[point_index])));
- break;
- }
- case TrimapBackground :
- {
- fore = 0;
- back = L_;
- break;
- }
- default :
- {
- fore = L_;
- back = 0;
- }
- }
-
- setTerminalWeights (graph_nodes_[i_point], fore, back);
- }
-
- // Set N-Link weights from precomputed values
- for (int i_point = 0; i_point < number_of_indices; ++i_point)
- {
- const NLinks &n_link = n_links_[i_point];
- if (n_link.nb_links > 0)
- {
- int point_index = (*indices_) [i_point];
- std::vector<int>::const_iterator indices_it = n_link.indices.begin ();
- std::vector<float>::const_iterator weights_it = n_link.weights.begin ();
- for (; indices_it != n_link.indices.end (); ++indices_it, ++weights_it)
- {
- if (*indices_it != point_index)
- {
- addEdge (graph_nodes_[i_point], graph_nodes_[*indices_it], *weights_it, *weights_it);
- }
- }
- }
- }
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::computeNLinks ()
-{
- const int number_of_indices = static_cast<int> (indices_->size ());
- for (int i_point = 0; i_point < number_of_indices; ++i_point)
- {
- NLinks &n_link = n_links_[i_point];
- if (n_link.nb_links > 0)
- {
- int point_index = (*indices_) [i_point];
- std::vector<int>::const_iterator indices_it = n_link.indices.begin ();
- std::vector<float>::const_iterator dists_it = n_link.dists.begin ();
- std::vector<float>::iterator weights_it = n_link.weights.begin ();
- for (; indices_it != n_link.indices.end (); ++indices_it, ++dists_it, ++weights_it)
- {
- if (*indices_it != point_index)
- {
- // We saved the color distance previously at the computeBeta stage for optimization purpose
- float color_distance = *weights_it;
- // Set the real weight
- *weights_it = static_cast<float> (lambda_ * exp (-beta_ * color_distance) / sqrt (*dists_it));
- }
- }
- }
- }
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::computeBeta ()
-{
- float result = 0;
- std::size_t edges = 0;
-
- const int number_of_indices = static_cast<int> (indices_->size ());
-
- for (int i_point = 0; i_point < number_of_indices; i_point++)
- {
- int point_index = (*indices_)[i_point];
- const PointT& point = input_->points [point_index];
- if (pcl::isFinite (point))
- {
- NLinks &links = n_links_[i_point];
- int found = tree_->nearestKSearch (point, nb_neighbours_, links.indices, links.dists);
- if (found > 1)
- {
- links.nb_links = found - 1;
- links.weights.reserve (links.nb_links);
- for (std::vector<int>::const_iterator nn_it = links.indices.begin (); nn_it != links.indices.end (); ++nn_it)
- {
- if (*nn_it != point_index)
- {
- float color_distance = squaredEuclideanDistance (image_->points[point_index], image_->points[*nn_it]);
- links.weights.push_back (color_distance);
- result+= color_distance;
- ++edges;
- }
- else
- links.weights.push_back (0.f);
- }
- }
- }
- }
- std::cout << "result " << result << std::endl;
- std::cout << "edges " << edges << std::endl;
- beta_ = 1e5 / (2*result / edges);
- std::cout << "beta " << beta_ << std::endl;
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::computeL ()
-{
- L_ = 8*lambda_ + 1;
-}
-
-template <typename PointT> void
-pcl::GrabCut<PointT>::extract (std::vector<pcl::PointIndices>& clusters)
-{
- using namespace pcl::segmentation::grabcut;
- clusters.clear ();
- clusters.resize (2);
- clusters[0].indices.reserve (indices_->size ());
- clusters[1].indices.reserve (indices_->size ());
- refine ();
- assert (hard_segmentation_.size () == indices_->size ());
- const int indices_size = static_cast<int> (indices_->size ());
- for (int i = 0; i < indices_size; ++i)
- if (hard_segmentation_[i] == SegmentationForeground)
- clusters[1].indices.push_back (i);
- else
- clusters[0].indices.push_back (i);
-}
-
-#endif
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_SEGMENTATION_IMPL_GRABCUT_HPP
+#define PCL_SEGMENTATION_IMPL_GRABCUT_HPP
+
+#include <pcl/search/organized.h>
+#include <pcl/search/kdtree.h>
+#include <pcl/common/distances.h>
+
+namespace pcl
+{
+ template <>
+ float squaredEuclideanDistance (const pcl::segmentation::grabcut::Color &c1,
+ const pcl::segmentation::grabcut::Color &c2)
+ {
+ return ((c1.r-c2.r)*(c1.r-c2.r)+(c1.g-c2.g)*(c1.g-c2.g)+(c1.b-c2.b)*(c1.b-c2.b));
+ }
+}
+
+template <typename PointT>
+pcl::segmentation::grabcut::Color::Color (const PointT& p)
+{
+ r = static_cast<float> (p.r) / 255.0;
+ g = static_cast<float> (p.g) / 255.0;
+ b = static_cast<float> (p.b) / 255.0;
+}
+
+template <typename PointT>
+pcl::segmentation::grabcut::Color::operator PointT () const
+{
+ PointT p;
+ p.r = static_cast<uint32_t> (r * 255);
+ p.g = static_cast<uint32_t> (g * 255);
+ p.b = static_cast<uint32_t> (b * 255);
+ return (p);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::setInputCloud (const PointCloudConstPtr &cloud)
+{
+ input_ = cloud;
+}
+
+template <typename PointT> bool
+pcl::GrabCut<PointT>::initCompute ()
+{
+ using namespace pcl::segmentation::grabcut;
+ if (!pcl::PCLBase<PointT>::initCompute ())
+ {
+ PCL_ERROR ("[pcl::GrabCut::initCompute ()] Init failed!");
+ return (false);
+ }
+
+ std::vector<pcl::PCLPointField> in_fields_;
+ if ((pcl::getFieldIndex<PointT> (*input_, "rgb", in_fields_) == -1) &&
+ (pcl::getFieldIndex<PointT> (*input_, "rgba", in_fields_) == -1))
+ {
+ PCL_ERROR ("[pcl::GrabCut::initCompute ()] No RGB data available, aborting!");
+ return (false);
+ }
+
+ // Initialize the working image
+ image_.reset (new Image (input_->width, input_->height));
+ for (std::size_t i = 0; i < input_->size (); ++i)
+ {
+ (*image_) [i] = Color (input_->points[i]);
+ }
+ width_ = image_->width;
+ height_ = image_->height;
+
+ // Initialize the spatial locator
+ if (!tree_ && !input_->isOrganized ())
+ {
+ tree_.reset (new pcl::search::KdTree<PointT> (true));
+ tree_->setInputCloud (input_);
+ }
+
+ const std::size_t indices_size = indices_->size ();
+ trimap_ = std::vector<segmentation::grabcut::TrimapValue> (indices_size, TrimapUnknown);
+ hard_segmentation_ = std::vector<segmentation::grabcut::SegmentationValue> (indices_size,
+ SegmentationBackground);
+ GMM_component_.resize (indices_size);
+ n_links_.resize (indices_size);
+
+ // soft_segmentation_ = 0; // Not yet implemented
+ foreground_GMM_.resize (K_);
+ background_GMM_.resize (K_);
+
+ //set some constants
+ computeL ();
+
+ if (image_->isOrganized ())
+ {
+ computeBetaOrganized ();
+ computeNLinksOrganized ();
+ }
+ else
+ {
+ computeBetaNonOrganized ();
+ computeNLinksNonOrganized ();
+ }
+
+ initialized_ = false;
+ return (true);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::addEdge (vertex_descriptor v1, vertex_descriptor v2, float capacity, float rev_capacity)
+{
+ graph_.addEdge (v1, v2, capacity, rev_capacity);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::setTerminalWeights (vertex_descriptor v, float source_capacity, float sink_capacity)
+{
+ graph_.addSourceEdge (v, source_capacity);
+ graph_.addTargetEdge (v, sink_capacity);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::setBackgroundPointsIndices (const PointIndicesConstPtr &indices)
+{
+ using namespace pcl::segmentation::grabcut;
+ if (!initCompute ())
+ return;
+
+ std::fill (trimap_.begin (), trimap_.end (), TrimapBackground);
+ std::fill (hard_segmentation_.begin (), hard_segmentation_.end (), SegmentationBackground);
+ for (std::vector<int>::const_iterator idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
+ {
+ trimap_[*idx] = TrimapUnknown;
+ hard_segmentation_[*idx] = SegmentationForeground;
+ }
+
+ if (!initialized_)
+ {
+ fitGMMs ();
+ initialized_ = true;
+ }
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::fitGMMs ()
+{
+ // Step 3: Build GMMs using Orchard-Bouman clustering algorithm
+ buildGMMs (*image_, *indices_, hard_segmentation_, GMM_component_, background_GMM_, foreground_GMM_);
+
+ // Initialize the graph for graphcut (do this here so that the T-Link debugging image will be initialized)
+ initGraph ();
+}
+
+template <typename PointT> int
+pcl::GrabCut<PointT>::refineOnce ()
+{
+ // Steps 4 and 5: Learn new GMMs from current segmentation
+ learnGMMs (*image_, *indices_, hard_segmentation_, GMM_component_, background_GMM_, foreground_GMM_);
+
+ // Step 6: Run GraphCut and update segmentation
+ initGraph ();
+
+ float flow = graph_.solve ();
+
+ int changed = updateHardSegmentation ();
+ PCL_INFO ("%d pixels changed segmentation (max flow = %f)\n", changed, flow);
+
+ return (changed);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::refine ()
+{
+ std::size_t changed = indices_->size ();
+
+ while (changed)
+ changed = refineOnce ();
+}
+
+template <typename PointT> int
+pcl::GrabCut<PointT>::updateHardSegmentation ()
+{
+ using namespace pcl::segmentation::grabcut;
+
+ int changed = 0;
+
+ const int number_of_indices = static_cast<int> (indices_->size ());
+ for (int i_point = 0; i_point < number_of_indices; ++i_point)
+ {
+ SegmentationValue old_value = hard_segmentation_ [i_point];
+
+ if (trimap_ [i_point] == TrimapBackground)
+ hard_segmentation_ [i_point] = SegmentationBackground;
+ else
+ if (trimap_ [i_point] == TrimapForeground)
+ hard_segmentation_ [i_point] = SegmentationForeground;
+ else // TrimapUnknown
+ {
+ if (isSource (graph_nodes_[i_point]))
+ hard_segmentation_ [i_point] = SegmentationForeground;
+ else
+ hard_segmentation_ [i_point] = SegmentationBackground;
+ }
+
+ if (old_value != hard_segmentation_ [i_point])
+ ++changed;
+ }
+ return (changed);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::setTrimap (const PointIndicesConstPtr &indices, segmentation::grabcut::TrimapValue t)
+{
+ using namespace pcl::segmentation::grabcut;
+ std::vector<int>::const_iterator idx = indices->indices.begin ();
+ for (; idx != indices->indices.end (); ++idx)
+ trimap_[*idx] = t;
+
+ // Immediately set the hard segmentation as well so that the display will update.
+ if (t == TrimapForeground)
+ for (idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
+ hard_segmentation_[*idx] = SegmentationForeground;
+ else
+ if (t == TrimapBackground)
+ for (idx = indices->indices.begin (); idx != indices->indices.end (); ++idx)
+ hard_segmentation_[*idx] = SegmentationBackground;
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::initGraph ()
+{
+ using namespace pcl::segmentation::grabcut;
+ const int number_of_indices = static_cast<int> (indices_->size ());
+ // Set up the graph (it can only be used once, so we have to recreate it each time the graph is updated)
+ graph_.clear ();
+ graph_nodes_.clear ();
+ graph_nodes_.resize (indices_->size ());
+ int start = graph_.addNodes (indices_->size ());
+ for (int idx = 0; idx < indices_->size (); ++idx)
+ {
+ graph_nodes_[idx] = start;
+ ++start;
+ }
+
+ // Set T-Link weights
+ for (int i_point = 0; i_point < number_of_indices; ++i_point)
+ {
+ int point_index = (*indices_) [i_point];
+ float back, fore;
+
+ switch (trimap_[point_index])
+ {
+ case TrimapUnknown :
+ {
+ fore = static_cast<float> (-log (background_GMM_.probabilityDensity (image_->points[point_index])));
+ back = static_cast<float> (-log (foreground_GMM_.probabilityDensity (image_->points[point_index])));
+ break;
+ }
+ case TrimapBackground :
+ {
+ fore = 0;
+ back = L_;
+ break;
+ }
+ default :
+ {
+ fore = L_;
+ back = 0;
+ }
+ }
+
+ setTerminalWeights (graph_nodes_[i_point], fore, back);
+ }
+
+ // Set N-Link weights from precomputed values
+ for (int i_point = 0; i_point < number_of_indices; ++i_point)
+ {
+ const NLinks &n_link = n_links_[i_point];
+ if (n_link.nb_links > 0)
+ {
+ int point_index = (*indices_) [i_point];
+ std::vector<int>::const_iterator indices_it = n_link.indices.begin ();
+ std::vector<float>::const_iterator weights_it = n_link.weights.begin ();
+ for (; indices_it != n_link.indices.end (); ++indices_it, ++weights_it)
+ {
+ if ((*indices_it != point_index) && (*indices_it > -1))
+ {
+ addEdge (graph_nodes_[i_point], graph_nodes_[*indices_it], *weights_it, *weights_it);
+ }
+ }
+ }
+ }
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::computeNLinksNonOrganized ()
+{
+ const int number_of_indices = static_cast<int> (indices_->size ());
+ for (int i_point = 0; i_point < number_of_indices; ++i_point)
+ {
+ NLinks &n_link = n_links_[i_point];
+ if (n_link.nb_links > 0)
+ {
+ int point_index = (*indices_) [i_point];
+ std::vector<int>::const_iterator indices_it = n_link.indices.begin ();
+ std::vector<float>::const_iterator dists_it = n_link.dists.begin ();
+ std::vector<float>::iterator weights_it = n_link.weights.begin ();
+ for (; indices_it != n_link.indices.end (); ++indices_it, ++dists_it, ++weights_it)
+ {
+ if (*indices_it != point_index)
+ {
+ // We saved the color distance previously at the computeBeta stage for optimization purpose
+ float color_distance = *weights_it;
+ // Set the real weight
+ *weights_it = static_cast<float> (lambda_ * exp (-beta_ * color_distance) / sqrt (*dists_it));
+ }
+ }
+ }
+ }
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::computeNLinksOrganized ()
+{
+ for( unsigned int y = 0; y < image_->height; ++y )
+ {
+ for( unsigned int x = 0; x < image_->width; ++x )
+ {
+ // We saved the color and euclidean distance previously at the computeBeta stage for
+ // optimization purpose but here we compute the real weight
+ std::size_t point_index = y * input_->width + x;
+ NLinks &links = n_links_[point_index];
+
+ if( x > 0 && y < image_->height-1 )
+ links.weights[0] = lambda_ * exp (-beta_ * links.weights[0]) / links.dists[0];
+
+ if( y < image_->height-1 )
+ links.weights[1] = lambda_ * exp (-beta_ * links.weights[1]) / links.dists[1];
+
+ if( x < image_->width-1 && y < image_->height-1 )
+ links.weights[2] = lambda_ * exp (-beta_ * links.weights[2]) / links.dists[2];
+
+ if( x < image_->width-1 )
+ links.weights[3] = lambda_ * exp (-beta_ * links.weights[3]) / links.dists[3];
+ }
+ }
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::computeBetaNonOrganized ()
+{
+ float result = 0;
+ std::size_t edges = 0;
+
+ const int number_of_indices = static_cast<int> (indices_->size ());
+
+ for (int i_point = 0; i_point < number_of_indices; i_point++)
+ {
+ int point_index = (*indices_)[i_point];
+ const PointT& point = input_->points [point_index];
+ if (pcl::isFinite (point))
+ {
+ NLinks &links = n_links_[i_point];
+ int found = tree_->nearestKSearch (point, nb_neighbours_, links.indices, links.dists);
+ if (found > 1)
+ {
+ links.nb_links = found - 1;
+ links.weights.reserve (links.nb_links);
+ for (std::vector<int>::const_iterator nn_it = links.indices.begin (); nn_it != links.indices.end (); ++nn_it)
+ {
+ if (*nn_it != point_index)
+ {
+ float color_distance = squaredEuclideanDistance (image_->points[point_index], image_->points[*nn_it]);
+ links.weights.push_back (color_distance);
+ result+= color_distance;
+ ++edges;
+ }
+ else
+ links.weights.push_back (0.f);
+ }
+ }
+ }
+ }
+
+ beta_ = 1e5 / (2*result / edges);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::computeBetaOrganized ()
+{
+ float result = 0;
+ std::size_t edges = 0;
+
+ for (unsigned int y = 0; y < input_->height; ++y)
+ {
+ for (unsigned int x = 0; x < input_->width; ++x)
+ {
+ std::size_t point_index = y * input_->width + x;
+ NLinks &links = n_links_[point_index];
+ links.nb_links = 4;
+ links.weights.resize (links.nb_links, 0);
+ links.dists.resize (links.nb_links, 0);
+ links.indices.resize (links.nb_links, -1);
+
+ if (x > 0 && y < input_->height-1)
+ {
+ std::size_t upleft = (y+1) * input_->width + x - 1;
+ links.indices[0] = upleft;
+ links.dists[0] = sqrt (2.f);
+ float color_dist = squaredEuclideanDistance (image_->points[point_index],
+ image_->points[upleft]);
+ links.weights[0] = color_dist;
+ result+= color_dist;
+ edges++;
+ }
+
+ if (y < input_->height-1)
+ {
+ std::size_t up = (y+1) * input_->width + x;
+ links.indices[1] = up;
+ links.dists[1] = 1;
+ float color_dist = squaredEuclideanDistance (image_->points[point_index],
+ image_->points[up]);
+ links.weights[1] = color_dist;
+ result+= color_dist;
+ edges++;
+ }
+
+ if (x < input_->width-1 && y < input_->height-1)
+ {
+ std::size_t upright = (y+1) * input_->width + x + 1;
+ links.indices[2] = upright;
+ links.dists[2] = sqrt (2.f);
+ float color_dist = squaredEuclideanDistance (image_->points[point_index],
+ image_->points [upright]);
+ links.weights[2] = color_dist;
+ result+= color_dist;
+ edges++;
+ }
+
+ if (x < input_->width-1)
+ {
+ std::size_t right = y * input_->width + x + 1;
+ links.indices[3] = right;
+ links.dists[3] = 1;
+ float color_dist = squaredEuclideanDistance (image_->points[point_index],
+ image_->points[right]);
+ links.weights[3] = color_dist;
+ result+= color_dist;
+ edges++;
+ }
+ }
+ }
+
+ beta_ = 1e5 / (2*result / edges);
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::computeL ()
+{
+ L_ = 8*lambda_ + 1;
+}
+
+template <typename PointT> void
+pcl::GrabCut<PointT>::extract (std::vector<pcl::PointIndices>& clusters)
+{
+ using namespace pcl::segmentation::grabcut;
+ clusters.clear ();
+ clusters.resize (2);
+ clusters[0].indices.reserve (indices_->size ());
+ clusters[1].indices.reserve (indices_->size ());
+ refine ();
+ assert (hard_segmentation_.size () == indices_->size ());
+ const int indices_size = static_cast<int> (indices_->size ());
+ for (int i = 0; i < indices_size; ++i)
+ if (hard_segmentation_[i] == SegmentationForeground)
+ clusters[1].indices.push_back (i);
+ else
+ clusters[0].indices.push_back (i);
+}
+
+#endif
{
if (labels[current_row + colIdx].label == invalid_label)
labels[current_row + colIdx].label = labels[previous_row + colIdx].label;
- else
+ else if (labels[previous_row + colIdx].label != invalid_label)
{
unsigned root1 = findRoot (run_ids, labels[current_row + colIdx].label);
unsigned root2 = findRoot (run_ids, labels[previous_row + colIdx].label);
// Check that we got the same number of points and normals
if (static_cast<int> (normals_->points.size ()) != static_cast<int> (input_->points.size ()))
{
- PCL_ERROR ("[pcl::%s::segment] Number of points in input cloud (%zu) and normal cloud (%zu) do not match!\n",
+ PCL_ERROR ("[pcl::%s::segment] Number of points in input cloud (%lu) and normal cloud (%lu) do not match!\n",
getClassName ().c_str (), input_->points.size (),
normals_->points.size ());
return;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+#define PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+
+#include <pcl/common/common.h>
+#include <pcl/common/io.h>
+#include <pcl/filters/morphological_filter.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::ProgressiveMorphologicalFilter<PointT>::ProgressiveMorphologicalFilter () :
+ max_window_size_ (33),
+ slope_ (0.7f),
+ max_distance_ (10.0f),
+ initial_distance_ (0.15f),
+ cell_size_ (1.0f),
+ base_ (2.0f),
+ exponential_ (true)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT>
+pcl::ProgressiveMorphologicalFilter<PointT>::~ProgressiveMorphologicalFilter ()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::ProgressiveMorphologicalFilter<PointT>::extract (std::vector<int>& ground)
+{
+ bool segmentation_is_possible = initCompute ();
+ if (!segmentation_is_possible)
+ {
+ deinitCompute ();
+ return;
+ }
+
+ // Compute the series of window sizes and height thresholds
+ std::vector<float> height_thresholds;
+ std::vector<float> window_sizes;
+ int iteration = 0;
+ float window_size = 0.0f;
+ float height_threshold = 0.0f;
+
+ while (window_size < max_window_size_)
+ {
+ // Determine the initial window size.
+ if (exponential_)
+ window_size = cell_size_ * (2.0f * std::pow (base_, iteration) + 1.0f);
+ else
+ window_size = cell_size_ * (2.0f * (iteration+1) * base_ + 1.0f);
+
+ // Calculate the height threshold to be used in the next iteration.
+ if (iteration == 0)
+ height_threshold = initial_distance_;
+ else
+ height_threshold = slope_ * (window_size - window_sizes[iteration-1]) * cell_size_ + initial_distance_;
+
+ // Enforce max distance on height threshold
+ if (height_threshold > max_distance_)
+ height_threshold = max_distance_;
+
+ window_sizes.push_back (window_size);
+ height_thresholds.push_back (height_threshold);
+
+ iteration++;
+ }
+
+ // Ground indices are initially limited to those points in the input cloud we
+ // wish to process
+ ground = *indices_;
+
+ // Progressively filter ground returns using morphological open
+ for (size_t i = 0; i < window_sizes.size (); ++i)
+ {
+ PCL_DEBUG (" Iteration %d (height threshold = %f, window size = %f)...",
+ i, height_thresholds[i], window_sizes[i]);
+
+ // Limit filtering to those points currently considered ground returns
+ typename pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>);
+ pcl::copyPointCloud<PointT> (*input_, ground, *cloud);
+
+ // Create new cloud to hold the filtered results. Apply the morphological
+ // opening operation at the current window size.
+ typename pcl::PointCloud<PointT>::Ptr cloud_f (new pcl::PointCloud<PointT>);
+ pcl::applyMorphologicalOperator<PointT> (cloud, window_sizes[i], MORPH_OPEN, *cloud_f);
+
+ // Find indices of the points whose difference between the source and
+ // filtered point clouds is less than the current height threshold.
+ std::vector<int> pt_indices;
+ for (size_t p_idx = 0; p_idx < ground.size (); ++p_idx)
+ {
+ float diff = cloud->points[p_idx].z - cloud_f->points[p_idx].z;
+ if (diff < height_thresholds[i])
+ pt_indices.push_back (ground[p_idx]);
+ }
+
+ // Ground is now limited to pt_indices
+ ground.swap (pt_indices);
+
+ PCL_DEBUG ("ground now has %d points\n", ground.size ());
+ }
+
+ deinitCompute ();
+}
+
+#define PCL_INSTANTIATE_ProgressiveMorphologicalFilter(T) template class pcl::ProgressiveMorphologicalFilter<T>;
+
+#endif // PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
+
std::vector<pcl::PointIndices>::iterator cluster_iter_input = clusters.begin ();
for (std::vector<pcl::PointIndices>::const_iterator cluster_iter = clusters_.begin (); cluster_iter != clusters_.end (); cluster_iter++)
{
- if ((cluster_iter->indices.size () >= min_pts_per_cluster_) &&
- (cluster_iter->indices.size () <= max_pts_per_cluster_))
+ if ((static_cast<int> (cluster_iter->indices.size ()) >= min_pts_per_cluster_) &&
+ (static_cast<int> (cluster_iter->indices.size ()) <= max_pts_per_cluster_))
{
*cluster_iter_input = *cluster_iter;
cluster_iter_input++;
std::vector<float> distances;
point_neighbours_.resize (input_->points.size (), neighbours);
-
- for (int i_point = 0; i_point < point_number; i_point++)
+ if (input_->is_dense)
{
- int point_index = (*indices_)[i_point];
- neighbours.clear ();
- search_->nearestKSearch (i_point, neighbour_number_, neighbours, distances);
- point_neighbours_[point_index].swap (neighbours);
+ for (int i_point = 0; i_point < point_number; i_point++)
+ {
+ int point_index = (*indices_)[i_point];
+ neighbours.clear ();
+ search_->nearestKSearch (i_point, neighbour_number_, neighbours, distances);
+ point_neighbours_[point_index].swap (neighbours);
+ }
+ }
+ else
+ {
+ for (int i_point = 0; i_point < point_number; i_point++)
+ {
+ neighbours.clear ();
+ int point_index = (*indices_)[i_point];
+ if (!pcl::isFinite (input_->points[point_index]))
+ continue;
+ search_->nearestKSearch (i_point, neighbour_number_, neighbours, distances);
+ point_neighbours_[point_index].swap (neighbours);
+ }
}
}
// first of all we need to find out if this point belongs to cloud
bool point_was_found = false;
int number_of_points = static_cast <int> (indices_->size ());
- for (size_t point = 0; point < number_of_points; point++)
+ for (int point = 0; point < number_of_points; point++)
if ( (*indices_)[point] == index)
{
point_was_found = true;
std::vector<pcl::PointIndices>::iterator cluster_iter = clusters_.begin ();
while (cluster_iter != clusters_.end ())
{
- if (cluster_iter->indices.size () < min_pts_per_cluster_ || cluster_iter->indices.size () > max_pts_per_cluster_)
+ if (static_cast<int> (cluster_iter->indices.size ()) < min_pts_per_cluster_ ||
+ static_cast<int> (cluster_iter->indices.size ()) > max_pts_per_cluster_)
{
cluster_iter = clusters_.erase (cluster_iter);
}
- else
+ else
cluster_iter++;
}
int final_segment_number = homogeneous_region_number;
for (int i_reg = 0; i_reg < homogeneous_region_number; i_reg++)
{
- if (num_pts_in_homogeneous_region[i_reg] < min_pts_per_cluster_)
+ if (static_cast<int> (num_pts_in_homogeneous_region[i_reg]) < min_pts_per_cluster_)
{
if ( region_neighbours[i_reg].empty () )
continue;
}
// now we need to erase empty regions
- std::vector< pcl::PointIndices >::iterator i_region;
- i_region = clusters_.begin ();
- while(i_region != clusters_.end ())
+ if (clusters_.empty ())
+ return;
+
+ std::vector<pcl::PointIndices>::iterator itr1, itr2;
+ itr1 = clusters_.begin ();
+ itr2 = clusters_.end () - 1;
+
+ while (itr1 < itr2)
{
- if ( i_region->indices.empty () )
- i_region = clusters_.erase (i_region);
- else
- i_region++;
+ while (!(itr1->indices.empty ()) && itr1 < itr2)
+ itr1++;
+ while ( itr2->indices.empty () && itr1 < itr2)
+ itr2--;
+
+ if (itr1 != itr2)
+ itr1->indices.swap (itr2->indices);
}
+
+ if (itr2->indices.empty ())
+ clusters_.erase (itr2, clusters_.end ());
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// first of all we need to find out if this point belongs to cloud
bool point_was_found = false;
int number_of_points = static_cast <int> (indices_->size ());
- for (size_t point = 0; point < number_of_points; point++)
+ for (int point = 0; point < number_of_points; point++)
if ( (*indices_)[point] == index)
{
point_was_found = true;
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::seededHueSegmentation] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::seededHueSegmentation] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
// Create a bool vector of processed point indices, and initialize it to false
{
if (tree->getInputCloud ()->points.size () != cloud.points.size ())
{
- PCL_ERROR ("[pcl::seededHueSegmentation] Tree built for a different point cloud dataset (%zu) than the input cloud (%zu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
+ PCL_ERROR ("[pcl::seededHueSegmentation] Tree built for a different point cloud dataset (%lu) than the input cloud (%lu)!\n", tree->getInputCloud ()->points.size (), cloud.points.size ());
return;
}
// Create a bool vector of processed point indices, and initialize it to false
#define PCL_SEGMENTATION_IMPL_SEGMENT_DIFFERENCES_H_
#include <pcl/segmentation/segment_differences.h>
-#include <pcl/common/concatenate.h>
+#include <pcl/common/io.h>
//////////////////////////////////////////////////////////////////////////
template <typename PointT> void
// Search for the closest point in the target data set (number of neighbors to find = 1)
if (!tree->nearestKSearch (src.points[i], 1, nn_indices, nn_distances))
{
- PCL_WARN ("No neighbor found for point %zu (%f %f %f)!\n", i, src.points[i].x, src.points[i].y, src.points[i].z);
+ PCL_WARN ("No neighbor found for point %lu (%f %f %f)!\n", i, src.points[i].x, src.points[i].y, src.points[i].z);
continue;
}
//output.is_dense = false;
// Copy all the data fields from the input cloud to the output one
- typedef typename pcl::traits::fieldList<PointT>::type FieldList;
- // Iterate over each point
- for (size_t i = 0; i < src_indices.size (); ++i)
- // Iterate over each dimension
- pcl::for_each_type <FieldList> (NdConcatenateFunctor <PointT, PointT> (src.points[src_indices[i]], output.points[i]));
+ copyPointCloud (src, src_indices, output);
}
//////////////////////////////////////////////////////////////////////////
normal_importance_(1.0f),
label_colors_ (0)
{
- adjacency_octree_ = boost::make_shared <OctreeAdjacencyT> (resolution_);
+ adjacency_octree_.reset (new OctreeAdjacencyT (resolution_));
if (use_single_camera_transform)
adjacency_octree_->setTransformFunction (boost::bind (&SupervoxelClustering::transformFunction, this, _1));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> void
-pcl::SupervoxelClustering<PointT>::setInputCloud (typename pcl::PointCloud<PointT>::ConstPtr cloud)
+pcl::SupervoxelClustering<PointT>::setInputCloud (const typename pcl::PointCloud<PointT>::ConstPtr& cloud)
{
if ( cloud->size () == 0 )
{
template <typename PointT> void
pcl::SupervoxelClustering<PointT>::computeVoxelData ()
{
- voxel_centroid_cloud_ = boost::make_shared<PointCloudT> ();
+ voxel_centroid_cloud_.reset (new PointCloudT);
voxel_centroid_cloud_->resize (adjacency_octree_->getLeafCount ());
typename LeafVectorT::iterator leaf_itr = adjacency_octree_->begin ();
typename PointCloudT::iterator cent_cloud_itr = voxel_centroid_cloud_->begin ();
for (typename HelperListT::iterator sv_itr = supervoxel_helpers_.begin (); sv_itr != supervoxel_helpers_.end (); ++sv_itr)
{
uint32_t label = sv_itr->getLabel ();
- supervoxel_clusters[label] = boost::make_shared<Supervoxel<PointT> > ();
+ supervoxel_clusters[label].reset (new Supervoxel<PointT>);
sv_itr->getXYZ (supervoxel_clusters[label]->centroid_.x,supervoxel_clusters[label]->centroid_.y,supervoxel_clusters[label]->centroid_.z);
sv_itr->getRGB (supervoxel_clusters[label]->centroid_.rgba);
sv_itr->getNormal (supervoxel_clusters[label]->normal_);
{
supervoxel_helpers_.clear ();
- for (int i = 0; i < seed_points.size (); ++i)
+ for (size_t i = 0; i < seed_points.size (); ++i)
{
supervoxel_helpers_.push_back (new SupervoxelHelper(i+1,this));
//Find which leaf corresponds to this seed index
distance.resize(1,0);
if (voxel_kdtree_ == 0)
{
- voxel_kdtree_ = boost::make_shared< pcl::search::KdTree<PointT> >();
+ voxel_kdtree_.reset (new pcl::search::KdTree<PointT>);
voxel_kdtree_ ->setInputCloud (voxel_centroid_cloud_);
}
// This is number of voxels which fit in a planar slice through search volume
// Area of planar slice / area of voxel side
float min_points = 0.05f * (search_radius)*(search_radius) * 3.1415926536f / (resolution_*resolution_);
- for (int i = 0; i < seed_indices_orig.size (); ++i)
+ for (size_t i = 0; i < seed_indices_orig.size (); ++i)
{
int num = voxel_kdtree_->radiusSearch (seed_indices_orig[i], search_radius , neighbors, sqr_distances);
int min_index = seed_indices_orig[i];
template <typename PointT> pcl::PointCloud<pcl::PointXYZRGBA>::Ptr
pcl::SupervoxelClustering<PointT>::getColoredCloud () const
{
- pcl::PointCloud<pcl::PointXYZRGBA>::Ptr colored_cloud = boost::make_shared <pcl::PointCloud<pcl::PointXYZRGBA> >();
+ pcl::PointCloud<pcl::PointXYZRGBA>::Ptr colored_cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::copyPointCloud (*input_,*colored_cloud);
pcl::PointCloud <pcl::PointXYZRGBA>::iterator i_colored;
template <typename PointT> pcl::PointCloud<pcl::PointXYZRGBA>::Ptr
pcl::SupervoxelClustering<PointT>::getColoredVoxelCloud () const
{
- pcl::PointCloud<pcl::PointXYZRGBA>::Ptr colored_cloud = boost::make_shared< pcl::PointCloud<pcl::PointXYZRGBA> > ();
+ pcl::PointCloud<pcl::PointXYZRGBA>::Ptr colored_cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
for (typename HelperListT::const_iterator sv_itr = supervoxel_helpers_.cbegin (); sv_itr != supervoxel_helpers_.cend (); ++sv_itr)
{
typename PointCloudT::Ptr voxels;
template <typename PointT> typename pcl::PointCloud<PointT>::Ptr
pcl::SupervoxelClustering<PointT>::getVoxelCentroidCloud () const
{
- typename PointCloudT::Ptr centroid_copy = boost::make_shared<PointCloudT> ();
+ typename PointCloudT::Ptr centroid_copy (new PointCloudT);
copyPointCloud (*voxel_centroid_cloud_, *centroid_copy);
return centroid_copy;
}
template <typename PointT> pcl::PointCloud<pcl::PointXYZL>::Ptr
pcl::SupervoxelClustering<PointT>::getLabeledVoxelCloud () const
{
- pcl::PointCloud<pcl::PointXYZL>::Ptr labeled_voxel_cloud = boost::make_shared< pcl::PointCloud<pcl::PointXYZL> > ();
+ pcl::PointCloud<pcl::PointXYZL>::Ptr labeled_voxel_cloud (new pcl::PointCloud<pcl::PointXYZL>);
for (typename HelperListT::const_iterator sv_itr = supervoxel_helpers_.cbegin (); sv_itr != supervoxel_helpers_.cend (); ++sv_itr)
{
typename PointCloudT::Ptr voxels;
template <typename PointT> pcl::PointCloud<pcl::PointXYZL>::Ptr
pcl::SupervoxelClustering<PointT>::getLabeledCloud () const
{
- pcl::PointCloud<pcl::PointXYZL>::Ptr labeled_cloud = boost::make_shared <pcl::PointCloud<pcl::PointXYZL> >();
+ pcl::PointCloud<pcl::PointXYZL>::Ptr labeled_cloud (new pcl::PointCloud<pcl::PointXYZL>);
pcl::copyPointCloud (*input_,*labeled_cloud);
pcl::PointCloud <pcl::PointXYZL>::iterator i_labeled;
template <typename PointT> pcl::PointCloud<pcl::PointNormal>::Ptr
pcl::SupervoxelClustering<PointT>::makeSupervoxelNormalCloud (std::map<uint32_t,typename Supervoxel<PointT>::Ptr > &supervoxel_clusters)
{
- pcl::PointCloud<pcl::PointNormal>::Ptr normal_cloud = boost::make_shared<pcl::PointCloud<pcl::PointNormal> > ();
+ pcl::PointCloud<pcl::PointNormal>::Ptr normal_cloud (new pcl::PointCloud<pcl::PointNormal>);
normal_cloud->resize (supervoxel_clusters.size ());
typename std::map <uint32_t, typename pcl::Supervoxel<PointT>::Ptr>::iterator sv_itr,sv_itr_end;
sv_itr = supervoxel_clusters.begin ();
template <typename PointT> void
pcl::SupervoxelClustering<PointT>::initializeLabelColors ()
{
- int max_label = getMaxLabel ();
+ uint32_t max_label = static_cast<uint32_t> (getMaxLabel ());
//If we already have enough colors, return
- if (label_colors_.size () > max_label)
+ if (label_colors_.size () > max_label)
return;
//Otherwise, generate new colors until we have enough
data_.xyz_[1] /= (static_cast<float> (num_points_));
data_.xyz_[2] /= (static_cast<float> (num_points_));
}
-
+
+ //Explicit overloads for XYZ types
+ template<>
+ void
+ pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZ,pcl::SupervoxelClustering<pcl::PointXYZ>::VoxelData>::addPoint (const pcl::PointXYZ &new_point)
+ {
+ ++num_points_;
+ //Same as before here
+ data_.xyz_[0] += new_point.x;
+ data_.xyz_[1] += new_point.y;
+ data_.xyz_[2] += new_point.z;
+ }
+
+ template<> void
+ pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZ,pcl::SupervoxelClustering<pcl::PointXYZ>::VoxelData>::computeData ()
+ {
+ data_.xyz_[0] /= (static_cast<float> (num_points_));
+ data_.xyz_[1] /= (static_cast<float> (num_points_));
+ data_.xyz_[2] /= (static_cast<float> (num_points_));
+ }
+
}
}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> void
pcl::SupervoxelClustering<PointT>::SupervoxelHelper::getVoxels (typename pcl::PointCloud<PointT>::Ptr &voxels) const
{
- voxels = boost::make_shared<pcl::PointCloud<PointT> > ();
+ voxels.reset (new pcl::PointCloud<PointT>);
voxels->clear ();
voxels->resize (leaves_.size ());
typename pcl::PointCloud<PointT>::iterator voxel_itr = voxels->begin ();
- typename std::set<LeafContainerT*>::iterator leaf_itr;
- for (leaf_itr = leaves_.begin (); leaf_itr != leaves_.end (); ++leaf_itr, ++voxel_itr)
+ //typename std::set<LeafContainerT*>::iterator leaf_itr;
+ for (typename std::set<LeafContainerT*>::const_iterator leaf_itr = leaves_.begin ();
+ leaf_itr != leaves_.end ();
+ ++leaf_itr, ++voxel_itr)
{
const VoxelData& leaf_data = (*leaf_itr)->getData ();
leaf_data.getPoint (*voxel_itr);
template <typename PointT> void
pcl::SupervoxelClustering<PointT>::SupervoxelHelper::getNormals (typename pcl::PointCloud<Normal>::Ptr &normals) const
{
- normals = boost::make_shared<pcl::PointCloud<Normal> > ();
+ normals.reset (new pcl::PointCloud<Normal>);
normals->clear ();
normals->resize (leaves_.size ());
- typename std::set<LeafContainerT*>::iterator leaf_itr;
+ typename std::set<LeafContainerT*>::const_iterator leaf_itr;
typename pcl::PointCloud<Normal>::iterator normal_itr = normals->begin ();
for (leaf_itr = leaves_.begin (); leaf_itr != leaves_.end (); ++leaf_itr, ++normal_itr)
{
{
neighbor_labels.clear ();
//For each leaf belonging to this supervoxel
- typename std::set<LeafContainerT*>::iterator leaf_itr;
+ typename std::set<LeafContainerT*>::const_iterator leaf_itr;
for (leaf_itr = leaves_.begin (); leaf_itr != leaves_.end (); ++leaf_itr)
{
//for each neighbor of the leaf
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PCL_PROGRESSIVE_MORPHOLOGICAL_FILTER_H_
+#define PCL_PROGRESSIVE_MORPHOLOGICAL_FILTER_H_
+
+#include <pcl/pcl_base.h>
+#include <pcl/search/search.h>
+#include <pcl/point_cloud.h>
+#include <pcl/point_types.h>
+
+namespace pcl
+{
+ /** \brief
+ * Implements the Progressive Morphological Filter for segmentation of ground points.
+ * Description can be found in the article
+ * "A Progressive Morphological Filter for Removing Nonground Measurements from
+ * Airborne LIDAR Data"
+ * by K. Zhang, S. Chen, D. Whitman, M. Shyu, J. Yan, and C. Zhang.
+ */
+ template <typename PointT>
+ class PCL_EXPORTS ProgressiveMorphologicalFilter : public pcl::PCLBase<PointT>
+ {
+ public:
+
+ typedef pcl::PointCloud <PointT> PointCloud;
+
+ using PCLBase <PointT>::input_;
+ using PCLBase <PointT>::indices_;
+ using PCLBase <PointT>::initCompute;
+ using PCLBase <PointT>::deinitCompute;
+
+ public:
+
+ /** \brief Constructor that sets default values for member variables. */
+ ProgressiveMorphologicalFilter ();
+
+ virtual
+ ~ProgressiveMorphologicalFilter ();
+
+ /** \brief Get the maximum window size to be used in filtering ground returns. */
+ inline int
+ getMaxWindowSize () const { return (max_window_size_); }
+
+ /** \brief Set the maximum window size to be used in filtering ground returns. */
+ inline void
+ setMaxWindowSize (int max_window_size) { max_window_size_ = max_window_size; }
+
+ /** \brief Get the slope value to be used in computing the height threshold. */
+ inline float
+ getSlope () const { return (slope_); }
+
+ /** \brief Set the slope value to be used in computing the height threshold. */
+ inline void
+ setSlope (float slope) { slope_ = slope; }
+
+ /** \brief Get the maximum height above the parameterized ground surface to be considered a ground return. */
+ inline float
+ getMaxDistance () const { return (max_distance_); }
+
+ /** \brief Set the maximum height above the parameterized ground surface to be considered a ground return. */
+ inline void
+ setMaxDistance (float max_distance) { max_distance_ = max_distance; }
+
+ /** \brief Get the initial height above the parameterized ground surface to be considered a ground return. */
+ inline float
+ getInitialDistance () const { return (initial_distance_); }
+
+ /** \brief Set the initial height above the parameterized ground surface to be considered a ground return. */
+ inline void
+ setInitialDistance (float initial_distance) { initial_distance_ = initial_distance; }
+
+ /** \brief Get the cell size. */
+ inline float
+ getCellSize () const { return (cell_size_); }
+
+ /** \brief Set the cell size. */
+ inline void
+ setCellSize (float cell_size) { cell_size_ = cell_size; }
+
+ /** \brief Get the base to be used in computing progressive window sizes. */
+ inline float
+ getBase () const { return (base_); }
+
+ /** \brief Set the base to be used in computing progressive window sizes. */
+ inline void
+ setBase (float base) { base_ = base; }
+
+ /** \brief Get flag indicating whether or not to exponentially grow window sizes? */
+ inline bool
+ getExponential () const { return (exponential_); }
+
+ /** \brief Set flag indicating whether or not to exponentially grow window sizes? */
+ inline void
+ setExponential (bool exponential) { exponential_ = exponential; }
+
+ /** \brief This method launches the segmentation algorithm and returns indices of
+ * points determined to be ground returns.
+ * \param[out] ground indices of points determined to be ground returns.
+ */
+ virtual void
+ extract (std::vector<int>& ground);
+
+ protected:
+
+ /** \brief Maximum window size to be used in filtering ground returns. */
+ int max_window_size_;
+
+ /** \brief Slope value to be used in computing the height threshold. */
+ float slope_;
+
+ /** \brief Maximum height above the parameterized ground surface to be considered a ground return. */
+ float max_distance_;
+
+ /** \brief Initial height above the parameterized ground surface to be considered a ground return. */
+ float initial_distance_;
+
+ /** \brief Cell size. */
+ float cell_size_;
+
+ /** \brief Base to be used in computing progressive window sizes. */
+ float base_;
+
+ /** \brief Exponentially grow window sizes? */
+ bool exponential_;
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/segmentation/impl/progressive_morphological_filter.hpp>
+#endif
+
+#endif
+
return (count_);
}
+ /** \brief Get the curvature of the region. */
+ float
+ getCurvature () const
+ {
+ return (curvature_);
+ }
+
+ /** \brief Set the curvature of the region. */
+ void
+ setCurvature (float curvature)
+ {
+ curvature_ = curvature;
+ }
+
protected:
/** \brief The centroid of the region. */
Eigen::Vector3f centroid_;
/** \brief The number of points in the region. */
unsigned count_;
+ /** \brief The mean curvature of the region. */
+ float curvature_;
+
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
getSearchMethod () const;
/** \brief Allows to set search method that will be used for finding KNN.
- * \param[in] search search method to use
+ * \param[in] tree pointer to a KdTree
*/
void
setSearchMethod (const KdTreePtr& tree);
validatePoint (int initial_seed, int point, int nghbr, bool& is_a_seed) const;
/** \brief This function simply assembles the regions from list of point labels.
- * \param[out] clusters clusters that were obtained during the segmentation process.
* Each cluster is an array of point indices.
*/
void
/** \brief For a given point this function builds a segment to which it belongs and returns this segment.
* \param[in] index index of the initial point which will be the seed for growing a segment.
+ * \param cluster
*/
virtual void
getSegmentFromPoint (int index, pcl::PointIndices& cluster);
/** \brief Set the maximum distance allowed when drawing random samples
* \param[in] radius the maximum distance (L2 norm)
+ * \param search
*/
inline void
setSamplesMaxDist (const double &radius, SearchPtr search)
getNormalDistanceWeight () const { return (distance_weight_); }
/** \brief Set the minimum opning angle for a cone model.
- * \param oa the opening angle which we need minumum to validate a cone model.
+ * \param min_angle the opening angle which we need minumum to validate a cone model.
+ * \param max_angle the opening angle which we need maximum to validate a cone model.
*/
inline void
setMinMaxOpeningAngle (const double &min_angle, const double &max_angle)
* \param[in] cloud The cloud to be supervoxelize
*/
virtual void
- setInputCloud (typename pcl::PointCloud<PointT>::ConstPtr cloud);
+ setInputCloud (const typename pcl::PointCloud<PointT>::ConstPtr& cloud);
/** \brief This method sets the normals to be used for supervoxels (should be same size as input cloud)
- * \param[in] cloud The input normals
+ * \param[in] normal_cloud The input normals
*/
virtual void
setNormalCloud (typename NormalCloudT::ConstPtr normal_cloud);
size_t
size () const { return leaves_.size (); }
- private:
+ private:
//Stores leaves
std::set<LeafContainerT*> leaves_;
uint32_t label_;
VoxelData centroid_;
SupervoxelClustering* parent_;
-
-
+ public:
+ //Type VoxelData may have fixed-size Eigen objects inside
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
+ //Make boost::ptr_list can access the private class SupervoxelHelper
+ friend void boost::checked_delete<> (const typename pcl::SupervoxelClustering<PointT>::SupervoxelHelper *);
+
typedef boost::ptr_list<SupervoxelHelper> HelperListT;
HelperListT supervoxel_helpers_;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
+#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/segmentation/impl/approximate_progressive_morphological_filter.hpp>
+
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE(ApproximateProgressiveMorphologicalFilter, (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointXYZRGB))
+#else
+ PCL_INSTANTIATE(ApproximateProgressiveMorphologicalFilter, PCL_XYZ_POINT_TYPES)
+#endif
+
+++ /dev/null
-/*
- * Software License Agreement (BSD License)
- *
- * Point Cloud Library (PCL) - www.pointclouds.org
- * Copyright (c) 2012-, Open Perception, Inc.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of Willow Garage, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id$
- *
- */
-
-#include <pcl/segmentation/grabcut.h>
-
-#include <cstdlib>
-#include <cassert>
-#include <vector>
-#include <map>
-#include <algorithm>
-
-pcl::segmentation::grabcut::BoykovKolmogorov::BoykovKolmogorov (std::size_t max_nodes)
- : flow_value_(0.0)
-{
- if (max_nodes > 0)
- {
- source_edges_.reserve (max_nodes);
- target_edges_.reserve (max_nodes);
- nodes_.reserve (max_nodes);
- }
-}
-
-double
-pcl::segmentation::grabcut::BoykovKolmogorov::operator() (int u, int v) const
-{
- if ((u < 0) && (v < 0)) return flow_value_;
- if (u < 0) { return source_edges_[v]; }
- if (v < 0) { return target_edges_[u]; }
- capacitated_edge::const_iterator it = nodes_[u].find (v);
- if (it == nodes_[u].end ()) return 0.0;
- return it->second;
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::preAugmentPaths ()
-{
- for (int u = 0; u < (int)nodes_.size (); u++)
- {
- // augment s-u-t paths
- if ((source_edges_[u] > 0.0) && (target_edges_[u] > 0.0))
- {
- const double cap = std::min (source_edges_[u], target_edges_[u]);
- flow_value_ += cap;
- source_edges_[u] -= cap;
- target_edges_[u] -= cap;
- }
-
- if (source_edges_[u] == 0.0) continue;
-
- // augment s-u-v-t paths
- for (std::map<int, double>::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
- {
- const int v = it->first;
- if ((it->second == 0.0) || (target_edges_[v] == 0.0)) continue;
- const double w = std::min (it->second, std::min (source_edges_[u], target_edges_[v]));
- source_edges_[u] -= w;
- target_edges_[v] -= w;
- it->second -= w;
- nodes_[v][u] += w;
- flow_value_ += w;
- if (source_edges_[u] == 0.0) break;
- }
- }
-}
-
-int
-pcl::segmentation::grabcut::BoykovKolmogorov::addNodes (size_t n)
-{
- int node_id = (int)nodes_.size ();
- nodes_.resize (nodes_.size () + n);
- source_edges_.resize (nodes_.size (), 0.0);
- target_edges_.resize (nodes_.size (), 0.0);
- return (node_id);
-}
-
-// void
-// pcl::segmentation::grabcut::BoykovKolmogorov::addSourceAndTargetEdges (int u, double source_cap, double sink_cap)
-// {
-// addSourceEdge (u, source_cap);
-// addTargetEdge (u, sink_cap);
-
-// }
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::addSourceEdge (int u, double cap)
-{
- assert ((u >= 0) && (u < (int)nodes_.size ()));
- if (cap < 0.0)
- {
- flow_value_ += cap;
- target_edges_[u] -= cap;
- }
- else
- source_edges_[u] += cap;
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::addTargetEdge (int u, double cap)
-{
- assert ((u >= 0) && (u < (int)nodes_.size ()));
- if (cap < 0.0)
- {
- flow_value_ += cap;
- source_edges_[u] -= cap;
- }
- else
- target_edges_[u] += cap;
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::addEdge (int u, int v, double cap_uv, double cap_vu)
-{
- assert ((u >= 0) && (u < (int)nodes_.size ()));
- assert ((v >= 0) && (v < (int)nodes_.size ()));
- assert (u != v);
-
- capacitated_edge::iterator it = nodes_[u].find (v);
- if (it == nodes_[u].end ())
- {
- assert (cap_uv + cap_vu >= 0.0);
- if (cap_uv < 0.0)
- {
- nodes_[u].insert (std::make_pair (v, 0.0));
- nodes_[v].insert (std::make_pair (u, cap_vu + cap_uv));
- source_edges_[u] -= cap_uv;
- target_edges_[v] -= cap_uv;
- flow_value_ += cap_uv;
- }
- else
- {
- if (cap_vu < 0.0)
- {
- nodes_[u].insert (std::make_pair (v, cap_uv + cap_vu));
- nodes_[v].insert (std::make_pair (u, 0.0));
- source_edges_[v] -= cap_vu;
- target_edges_[u] -= cap_vu;
- flow_value_ += cap_vu;
- }
- else
- {
- nodes_[u].insert (std::make_pair (v, cap_uv));
- nodes_[v].insert (std::make_pair (u, cap_vu));
- }
- }
- }
- else
- {
- capacitated_edge::iterator jt = nodes_[v].find (u);
- it->second += cap_uv;
- jt->second += cap_vu;
- assert (it->second + jt->second >= 0.0);
- if (it->second < 0.0)
- {
- jt->second += it->second;
- source_edges_[u] -= it->second;
- target_edges_[v] -= it->second;
- flow_value_ += it->second;
- it->second = 0.0;
- }
- else
- {
- if (jt->second < 0.0)
- {
- it->second += jt->second;
- source_edges_[v] -= jt->second;
- target_edges_[u] -= jt->second;
- flow_value_ += jt->second;
- jt->second = 0.0;
- }
- }
- }
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::reset ()
-{
- flow_value_ = 0.0;
- std::fill (source_edges_.begin (), source_edges_.end (), 0.0);
- std::fill (target_edges_.begin (), target_edges_.end (), 0.0);
- for (int u = 0; u < (int)nodes_.size (); u++)
- {
- for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
- {
- it->second = 0.0;
- }
- }
- std::fill (cut_.begin (), cut_.end (), FREE);
- parents_.clear ();
- clearActive ();
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::clear ()
-{
- flow_value_ = 0.0;
- source_edges_.clear ();
- target_edges_.clear ();
- nodes_.clear ();
- cut_.clear ();
- parents_.clear ();
- clearActive ();
-}
-
-double
-pcl::segmentation::grabcut::BoykovKolmogorov::solve ()
-{
- // initialize search tree and active set
- cut_.resize (nodes_.size ());
- std::fill (cut_.begin (), cut_.end (), FREE);
- parents_.resize (nodes_.size ());
-
- clearActive ();
-
- // pre-augment paths
- preAugmentPaths ();
-
- // initialize search trees
- initializeTrees ();
-
- std::deque<int> orphans;
- while (!isActiveSetEmpty ())
- {
- const std::pair<int, int> path = expandTrees ();
- augmentPath (path, orphans);
- if (!orphans.empty ())
- {
- adoptOrphans (orphans);
- }
- }
- return (flow_value_);
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::initializeTrees ()
-{
- // initialize search tree
- for (int u = 0; u < (int)nodes_.size (); u++)
- {
- if (source_edges_[u] > 0.0)
- {
- cut_[u] = SOURCE;
- parents_[u].first = TERMINAL;
- markActive (u);
- }
- else
- {
- if (target_edges_[u] > 0.0)
- {
- cut_[u] = TARGET;
- parents_[u].first = TERMINAL;
- markActive (u);
- }
- }
- }
-}
-
-std::pair<int, int>
-pcl::segmentation::grabcut::BoykovKolmogorov::expandTrees ()
-{
- // expand trees looking for augmenting paths
- while (!isActiveSetEmpty ())
- {
- const int u = active_head_;
-
- if (cut_[u] == SOURCE) {
- for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
- {
- if (it->second > 0.0)
- {
- if (cut_[it->first] == FREE)
- {
- cut_[it->first] = SOURCE;
- parents_[it->first] = std::make_pair (u, std::make_pair (it, nodes_[it->first].find (u)));
- markActive (it->first);
- }
- else
- {
- if (cut_[it->first] == TARGET)
- {
- // found augmenting path
- return (std::make_pair (u, it->first));
- }
- }
- }
- }
- }
- else
- {
- for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
- {
- if (cut_[it->first] == TARGET) continue;
- if (nodes_[it->first][u] > 0.0)
- {
- if (cut_[it->first] == FREE)
- {
- cut_[it->first] = TARGET;
- parents_[it->first] = std::make_pair (u, std::make_pair (nodes_[it->first].find (u), it));
- markActive (it->first);
- }
- else
- {
- if (cut_[it->first] == SOURCE)
- {
- // found augmenting path
- return (std::make_pair (it->first, u));
- }
- }
- }
- }
- }
-
- // remove node from active set
- markInactive (u);
- }
-
- return (std::make_pair (TERMINAL, TERMINAL));
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::augmentPath (const std::pair<int, int>& path, std::deque<int>& orphans)
-{
- if ((path.first == TERMINAL) && (path.second == TERMINAL))
- return;
-
- // find path capacity
-
- // backtrack
- const edge_pair e = std::make_pair (nodes_[path.first].find (path.second),
- nodes_[path.second].find (path.first));
- double c = e.first->second;
- int u = path.first;
- while (parents_[u].first != TERMINAL)
- {
- c = std::min (c, parents_[u].second.first->second);
- u = parents_[u].first;
- //assert (cut_[u] == SOURCE);
- }
- c = std::min (c, source_edges_[u]);
-
- // forward track
- u = path.second;
- while (parents_[u].first != TERMINAL)
- {
- c = std::min (c, parents_[u].second.first->second);
- u = parents_[u].first;
- //assert (cut_[u] == TARGET);
- }
- c = std::min (c, target_edges_[u]);
-
- // augment path
- flow_value_ += c;
- //DRWN_LOG_DEBUG ("path capacity: " << c);
-
- // backtrack
- u = path.first;
- while (parents_[u].first != TERMINAL)
- {
- //nodes_[u][parents_[u].first] += c;
- parents_[u].second.second->second += c;
- parents_[u].second.first->second -= c;
- if (parents_[u].second.first->second == 0.0)
- {
- orphans.push_front (u);
- }
- u = parents_[u].first;
- }
- source_edges_[u] -= c;
- if (source_edges_[u] == 0.0)
- {
- orphans.push_front (u);
- }
-
- // link
- e.first->second -= c;
- e.second->second += c;
-
- // forward track
- u = path.second;
- while (parents_[u].first != TERMINAL) {
- //nodes_[parents_[u].first][u] += c;
- parents_[u].second.second->second += c;
- parents_[u].second.first->second -= c;
- if (parents_[u].second.first->second == 0.0) {
- orphans.push_back (u);
- }
- u = parents_[u].first;
- }
- target_edges_[u] -= c;
- if (target_edges_[u] == 0.0) {
- orphans.push_back (u);
- }
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::adoptOrphans (std::deque<int>& orphans)
-{
- // find new parent for orphaned subtree or free it
- while (!orphans.empty ())
- {
- const int u = orphans.front ();
- const char tree_label = cut_[u];
- orphans.pop_front ();
-
- // can occur if same node is inserted into orphans multiple times
- if (tree_label == FREE) continue;
- //assert (tree_label != FREE);
-
- // look for new parent
- bool b_free_orphan = true;
- for (capacitated_edge::iterator jt = nodes_[u].begin (); jt != nodes_[u].end (); ++jt) {
- // skip if different trees
- if (cut_[jt->first] != tree_label) continue;
-
- // check edge capacity
- const capacitated_edge::iterator kt = nodes_[jt->first].find (u);
- if (((tree_label == TARGET) && (jt->second <= 0.0)) ||
- ((tree_label == SOURCE) && (kt->second <= 0.0)))
- continue;
-
- // check that u is not an ancestor of jt->first
- int v = jt->first;
- while ((v != u) && (v != TERMINAL))
- {
- v = parents_[v].first;
- }
- if (v != TERMINAL) continue;
-
- // add as parent
- const edge_pair e = (tree_label == SOURCE) ? std::make_pair (kt, jt) : std::make_pair (jt, kt);
- parents_[u] = std::make_pair (jt->first, e);
- b_free_orphan = false;
- break;
- }
-
- // free the orphan subtree and remove it from the active set
- if (b_free_orphan)
- {
- for (capacitated_edge::const_iterator jt = nodes_[u].begin (); jt != nodes_[u].end (); ++jt)
- {
- if ((cut_[jt->first] == tree_label) && (parents_[jt->first].first == u))
- {
- orphans.push_front (jt->first);
- markActive (jt->first);
- }
- else if (cut_[jt->first] != FREE)
- {
- markActive (jt->first);
- }
- }
-
- // mark inactive and free
- markInactive (u);
- cut_[u] = FREE;
- }
- }
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::clearActive ()
-{
- active_head_ = active_tail_ = TERMINAL;
- active_list_.resize (nodes_.size ());
- std::fill (active_list_.begin (), active_list_.end (), std::make_pair (TERMINAL, TERMINAL));
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::markActive (int u)
-{
- if (isActive (u)) return;
-
- active_list_[u].first = active_tail_;
- active_list_[u].second = TERMINAL;
- if (active_tail_ == TERMINAL)
- active_head_ = u;
- else
- active_list_[active_tail_].second = u;
- active_tail_ = u;
-}
-
-void
-pcl::segmentation::grabcut::BoykovKolmogorov::markInactive (int u)
-{
- //if (!isActive (u)) return;
-
- if (u == active_head_)
- {
- active_head_ = active_list_[u].second;
- if (u != active_tail_)
- {
- active_list_[active_list_[u].second].first = TERMINAL;
- }
- }
- else
- if (u == active_tail_)
- {
- active_tail_ = active_list_[u].first;
- active_list_[active_list_[u].first].second = TERMINAL;
- }
- else
- if (active_list_[u].first != TERMINAL)
- {
- active_list_[active_list_[u].first].second = active_list_[u].second;
- active_list_[active_list_[u].second].first = active_list_[u].first;
- }
- //active_list_[u] = std::make_pair (TERMINAL, TERMINAL);
- active_list_[u].first = TERMINAL;
-}
-
-void
-pcl::segmentation::grabcut::GaussianFitter::add (const Color &c)
-{
- sum_[0] += c.r; sum_[1] += c.g; sum_[2] += c.b;
- accumulator_ (0,0) += c.r*c.r; accumulator_ (0,1) += c.r*c.g; accumulator_ (0,2) += c.r*c.b;
- accumulator_ (1,0) += c.g*c.r; accumulator_ (1,1) += c.g*c.g; accumulator_ (1,2) += c.g*c.b;
- accumulator_ (2,0) += c.b*c.r; accumulator_ (2,1) += c.b*c.g; accumulator_ (2,2) += c.b*c.b;
-
- ++count_;
-}
-
-// Build the gaussian out of all the added colors
-void
-pcl::segmentation::grabcut::GaussianFitter::fit (Gaussian& g, std::size_t total_count, bool compute_eigens) const
-{
- if (count_==0)
- {
- g.pi = 0;
- }
- else
- {
- const float count_f = static_cast<float> (count_);
-
- // Compute mean of gaussian
- g.mu.r = sum_[0]/count_f;
- g.mu.g = sum_[1]/count_f;
- g.mu.b = sum_[2]/count_f;
-
- // Compute covariance matrix
- g.covariance (0,0) = accumulator_ (0,0)/count_f - g.mu.r*g.mu.r + epsilon_;
- g.covariance (0,1) = accumulator_ (0,1)/count_f - g.mu.r*g.mu.g;
- g.covariance (0,2) = accumulator_ (0,2)/count_f - g.mu.r*g.mu.b;
- g.covariance (1,0) = accumulator_ (1,0)/count_f - g.mu.g*g.mu.r;
- g.covariance (1,1) = accumulator_ (1,1)/count_f - g.mu.g*g.mu.g + epsilon_;
- g.covariance (1,2) = accumulator_ (1,2)/count_f - g.mu.g*g.mu.b;
- g.covariance (2,0) = accumulator_ (2,0)/count_f - g.mu.b*g.mu.r;
- g.covariance (2,1) = accumulator_ (2,1)/count_f - g.mu.b*g.mu.g;
- g.covariance (2,2) = accumulator_ (2,2)/count_f - g.mu.b*g.mu.b + epsilon_;
-
- // Compute determinant of covariance matrix
- g.determinant = g.covariance (0,0)*(g.covariance (1,1)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,1))
- - g.covariance (0,1)*(g.covariance (1,0)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,0))
- + g.covariance (0,2)*(g.covariance (1,0)*g.covariance (2,1) - g.covariance (1,1)*g.covariance (2,0));
-
- // Compute inverse (cofactor matrix divided by determinant)
- g.inverse (0,0) = (g.covariance (1,1)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,1)) / g.determinant;
- g.inverse (1,0) = -(g.covariance (1,0)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,0)) / g.determinant;
- g.inverse (2,0) = (g.covariance (1,0)*g.covariance (2,1) - g.covariance (1,1)*g.covariance (2,0)) / g.determinant;
- g.inverse (0,1) = -(g.covariance (0,1)*g.covariance (2,2) - g.covariance (0,2)*g.covariance (2,1)) / g.determinant;
- g.inverse (1,1) = (g.covariance (0,0)*g.covariance (2,2) - g.covariance (0,2)*g.covariance (2,0)) / g.determinant;
- g.inverse (2,1) = -(g.covariance (0,0)*g.covariance (2,1) - g.covariance (0,1)*g.covariance (2,0)) / g.determinant;
- g.inverse (0,2) = (g.covariance (0,1)*g.covariance (1,2) - g.covariance (0,2)*g.covariance (1,1)) / g.determinant;
- g.inverse (1,2) = -(g.covariance (0,0)*g.covariance (1,2) - g.covariance (0,2)*g.covariance (1,0)) / g.determinant;
- g.inverse (2,2) = (g.covariance (0,0)*g.covariance (1,1) - g.covariance (0,1)*g.covariance (1,0)) / g.determinant;
-
- // The weight of the gaussian is the fraction of the number of pixels in this Gaussian to the number
- // of pixels in all the gaussians of this GMM.
- g.pi = count_f / static_cast<float> (total_count);
-
- if (compute_eigens)
- {
- // Compute eigenvalues and vectors using SVD
- Eigen::JacobiSVD<Eigen::Matrix3f> svd (g.covariance, Eigen::ComputeFullU);
- // Store highest eigenvalue
- g.eigenvalue = svd.singularValues ()[0];
- // Store corresponding eigenvector
- g.eigenvector = svd.matrixU ().col (0);
- }
- }
-}
-
-float
-pcl::segmentation::grabcut::GMM::probabilityDensity (const Color &c)
-{
- float result = 0;
-
- for (std::size_t i=0; i < gaussians_.size (); ++i)
- result += gaussians_[i].pi * probabilityDensity (i, c);
-
- return (result);
-}
-
-float
-pcl::segmentation::grabcut::GMM::probabilityDensity (std::size_t i, const Color &c)
-{
- float result = 0;
- const pcl::segmentation::grabcut::Gaussian &G = gaussians_[i];
- if (G.pi > 0 )
- {
- if (G.determinant > 0)
- {
- float r = c.r - G.mu.r;
- float g = c.g - G.mu.g;
- float b = c.b - G.mu.b;
-
- float d = r * (r*G.inverse (0,0) + g*G.inverse (1,0) + b*G.inverse (2,0)) +
- g * (r*G.inverse (0,1) + g*G.inverse (1,1) + b*G.inverse (2,1)) +
- b * (r*G.inverse (0,2) + g*G.inverse (1,2) + b*G.inverse (2,2));
-
- result = static_cast<float> (1.0/(sqrt (G.determinant)) * exp (-0.5*d));
- }
- }
-
- return (result);
-}
-
-void
-pcl::segmentation::grabcut::buildGMMs (const Image& image,
- const std::vector<int>& indices,
- const std::vector<SegmentationValue>& hard_segmentation,
- std::vector<std::size_t>& components,
- GMM& background_GMM, GMM& foreground_GMM)
-{
- // Step 3: Build GMMs using Orchard-Bouman clustering algorithm
-
- // Set up Gaussian Fitters
- std::vector<GaussianFitter> back_fitters (background_GMM.getK ());
- std::vector<GaussianFitter> fore_fitters (foreground_GMM.getK ());
-
- std::size_t fore_count = 0, back_count = 0;
- const int indices_size = static_cast<int> (indices.size ());
- // Initialize the first foreground and background clusters
- for (int idx = 0; idx < indices_size; ++idx)
- {
- components [idx] = 0;
-
- if (hard_segmentation [idx] == SegmentationForeground)
- {
- fore_fitters[0].add (image[indices[idx]]);
- fore_count++;
- }
- else
- {
- back_fitters[0].add (image[indices[idx]]);
- back_count++;
- }
- }
-
- back_fitters[0].fit (background_GMM[0], back_count, true);
- fore_fitters[0].fit (foreground_GMM[0], fore_count, true);
-
- std::size_t n_back = 0, n_fore = 0; // Which cluster will be split
- std::size_t max_K = (background_GMM.getK () > foreground_GMM.getK ()) ? background_GMM.getK () : foreground_GMM.getK ();
-
- // Compute clusters
- for (std::size_t i = 1; i < max_K; ++i)
- {
- // Reset the fitters for the splitting clusters
- back_fitters[n_back] = GaussianFitter ();
- fore_fitters[n_fore] = GaussianFitter ();
-
- // For brevity, get references to the splitting Gaussians
- Gaussian& bg = background_GMM[n_back];
- Gaussian& fg = foreground_GMM[n_fore];
-
- // Compute splitting points
- float split_background = bg.eigenvector[0] * bg.mu.r + bg.eigenvector[1] * bg.mu.g + bg.eigenvector[2] * bg.mu.b;
- float split_foreground = fg.eigenvector[0] * fg.mu.r + fg.eigenvector[1] * fg.mu.g + fg.eigenvector[2] * fg.mu.b;
-
- // Split clusters nBack and nFore, place split portion into cluster i
- for (int idx = 0; idx < indices_size; ++idx)
- {
- const Color &c = image[indices[idx]];
-
- // For each pixel
- if (i < foreground_GMM.getK () &&
- hard_segmentation[idx] == SegmentationForeground &&
- components[idx] == n_fore)
- {
- if (fg.eigenvector[0] * c.r + fg.eigenvector[1] * c.g + fg.eigenvector[2] * c.b > split_foreground)
- {
- components[idx] = i;
- fore_fitters[i].add (c);
- }
- else
- {
- fore_fitters[n_fore].add (c);
- }
- }
- else if (i < background_GMM.getK () &&
- hard_segmentation[idx] == SegmentationBackground &&
- components[idx] == n_back)
- {
- if (bg.eigenvector[0] * c.r + bg.eigenvector[1] * c.g + bg.eigenvector[2] * c.b > split_background)
- {
- components[idx] = i;
- back_fitters[i].add (c);
- }
- else
- {
- back_fitters[n_back].add (c);
- }
- }
- }
-
- // Compute new split Gaussians
- back_fitters[n_back].fit (background_GMM[n_back], back_count, true);
- fore_fitters[n_fore].fit (foreground_GMM[n_fore], fore_count, true);
-
- if (i < background_GMM.getK ())
- back_fitters[i].fit (background_GMM[i], back_count, true);
- if (i < foreground_GMM.getK ())
- fore_fitters[i].fit (foreground_GMM[i], fore_count, true);
-
- // Find clusters with highest eigenvalue
- n_back = 0;
- n_fore = 0;
-
- for (std::size_t j = 0; j <= i; ++j)
- {
- if (j < background_GMM.getK () && background_GMM[j].eigenvalue > background_GMM[n_back].eigenvalue)
- n_back = j;
-
- if (j < foreground_GMM.getK () && foreground_GMM[j].eigenvalue > foreground_GMM[n_fore].eigenvalue)
- n_fore = j;
- }
- }
-
- back_fitters.clear ();
- fore_fitters.clear ();
-}
-
-void
-pcl::segmentation::grabcut::learnGMMs (const Image& image,
- const std::vector<int>& indices,
- const std::vector<SegmentationValue>& hard_segmentation,
- std::vector<std::size_t>& components,
- GMM& background_GMM, GMM& foreground_GMM)
-{
- const std::size_t indices_size = static_cast<std::size_t> (indices.size ());
- // Step 4: Assign each pixel to the component which maximizes its probability
- for (std::size_t idx = 0; idx < indices_size; ++idx)
- {
- const Color &c = image[indices[idx]];
-
- if (hard_segmentation[idx] == SegmentationForeground)
- {
- std::size_t k = 0;
- float max = 0;
-
- for (std::size_t i = 0; i < foreground_GMM.getK (); i++)
- {
- float p = foreground_GMM.probabilityDensity (i, c);
- if (p > max)
- {
- k = i;
- max = p;
- }
- }
- components[idx] = k;
- }
- else
- {
- std::size_t k = 0;
- float max = 0;
-
- for (std::size_t i = 0; i < background_GMM.getK (); i++)
- {
- float p = background_GMM.probabilityDensity (i, c);
- if (p > max)
- {
- k = i;
- max = p;
- }
- }
- components[idx] = k;
- }
- }
-
- // Step 5: Relearn GMMs from new component assignments
-
- // Set up Gaussian Fitters
- std::vector<GaussianFitter> back_fitters (background_GMM.getK ());
- std::vector<GaussianFitter> fore_fitters (foreground_GMM.getK ());
-
- std::size_t fore_counter = 0, back_counter = 0;
- for (std::size_t idx = 0; idx < indices_size; ++idx)
- {
- const Color &c = image [indices [idx]];
-
- if (hard_segmentation[idx] == SegmentationForeground)
- {
- fore_fitters[components[idx]].add (c);
- fore_counter++;
- }
- else
- {
- back_fitters[components[idx]].add (c);
- back_counter++;
- }
- }
-
- for (std::size_t i = 0; i < background_GMM.getK (); ++i)
- back_fitters[i].fit (background_GMM[i], back_counter, false);
-
- for (std::size_t i = 0; i < foreground_GMM.getK (); ++i)
- fore_fitters[i].fit (foreground_GMM[i], fore_counter, false);
-
- back_fitters.clear ();
- fore_fitters.clear ();
-}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/segmentation/grabcut_segmentation.h>
+
+#include <cstdlib>
+#include <cassert>
+#include <vector>
+#include <map>
+#include <algorithm>
+
+pcl::segmentation::grabcut::BoykovKolmogorov::BoykovKolmogorov (std::size_t max_nodes)
+ : flow_value_(0.0)
+{
+ if (max_nodes > 0)
+ {
+ source_edges_.reserve (max_nodes);
+ target_edges_.reserve (max_nodes);
+ nodes_.reserve (max_nodes);
+ }
+}
+
+double
+pcl::segmentation::grabcut::BoykovKolmogorov::operator() (int u, int v) const
+{
+ if ((u < 0) && (v < 0)) return flow_value_;
+ if (u < 0) { return source_edges_[v]; }
+ if (v < 0) { return target_edges_[u]; }
+ capacitated_edge::const_iterator it = nodes_[u].find (v);
+ if (it == nodes_[u].end ()) return 0.0;
+ return it->second;
+}
+
+double
+pcl::segmentation::grabcut::BoykovKolmogorov::getSourceEdgeCapacity (int u) const
+{
+ return (source_edges_[u]);
+}
+
+double
+pcl::segmentation::grabcut::BoykovKolmogorov::getTargetEdgeCapacity (int u) const
+{
+ return (target_edges_[u]);
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::preAugmentPaths ()
+{
+ for (int u = 0; u < (int)nodes_.size (); u++)
+ {
+ // augment s-u-t paths
+ if ((source_edges_[u] > 0.0) && (target_edges_[u] > 0.0))
+ {
+ const double cap = std::min (source_edges_[u], target_edges_[u]);
+ flow_value_ += cap;
+ source_edges_[u] -= cap;
+ target_edges_[u] -= cap;
+ }
+
+ if (source_edges_[u] == 0.0) continue;
+
+ // augment s-u-v-t paths
+ for (std::map<int, double>::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
+ {
+ const int v = it->first;
+ if ((it->second == 0.0) || (target_edges_[v] == 0.0)) continue;
+ const double w = std::min (it->second, std::min (source_edges_[u], target_edges_[v]));
+ source_edges_[u] -= w;
+ target_edges_[v] -= w;
+ it->second -= w;
+ nodes_[v][u] += w;
+ flow_value_ += w;
+ if (source_edges_[u] == 0.0) break;
+ }
+ }
+}
+
+int
+pcl::segmentation::grabcut::BoykovKolmogorov::addNodes (size_t n)
+{
+ int node_id = (int)nodes_.size ();
+ nodes_.resize (nodes_.size () + n);
+ source_edges_.resize (nodes_.size (), 0.0);
+ target_edges_.resize (nodes_.size (), 0.0);
+ return (node_id);
+}
+
+// void
+// pcl::segmentation::grabcut::BoykovKolmogorov::addSourceAndTargetEdges (int u, double source_cap, double sink_cap)
+// {
+// addSourceEdge (u, source_cap);
+// addTargetEdge (u, sink_cap);
+
+// }
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::addSourceEdge (int u, double cap)
+{
+ assert ((u >= 0) && (u < (int)nodes_.size ()));
+ if (cap < 0.0)
+ {
+ flow_value_ += cap;
+ target_edges_[u] -= cap;
+ }
+ else
+ source_edges_[u] += cap;
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::addTargetEdge (int u, double cap)
+{
+ assert ((u >= 0) && (u < (int)nodes_.size ()));
+ if (cap < 0.0)
+ {
+ flow_value_ += cap;
+ source_edges_[u] -= cap;
+ }
+ else
+ target_edges_[u] += cap;
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::addEdge (int u, int v, double cap_uv, double cap_vu)
+{
+ assert ((u >= 0) && (u < (int)nodes_.size ()));
+ assert ((v >= 0) && (v < (int)nodes_.size ()));
+ assert (u != v);
+
+ capacitated_edge::iterator it = nodes_[u].find (v);
+ if (it == nodes_[u].end ())
+ {
+ assert (cap_uv + cap_vu >= 0.0);
+ if (cap_uv < 0.0)
+ {
+ nodes_[u].insert (std::make_pair (v, 0.0));
+ nodes_[v].insert (std::make_pair (u, cap_vu + cap_uv));
+ source_edges_[u] -= cap_uv;
+ target_edges_[v] -= cap_uv;
+ flow_value_ += cap_uv;
+ }
+ else
+ {
+ if (cap_vu < 0.0)
+ {
+ nodes_[u].insert (std::make_pair (v, cap_uv + cap_vu));
+ nodes_[v].insert (std::make_pair (u, 0.0));
+ source_edges_[v] -= cap_vu;
+ target_edges_[u] -= cap_vu;
+ flow_value_ += cap_vu;
+ }
+ else
+ {
+ nodes_[u].insert (std::make_pair (v, cap_uv));
+ nodes_[v].insert (std::make_pair (u, cap_vu));
+ }
+ }
+ }
+ else
+ {
+ capacitated_edge::iterator jt = nodes_[v].find (u);
+ it->second += cap_uv;
+ jt->second += cap_vu;
+ assert (it->second + jt->second >= 0.0);
+ if (it->second < 0.0)
+ {
+ jt->second += it->second;
+ source_edges_[u] -= it->second;
+ target_edges_[v] -= it->second;
+ flow_value_ += it->second;
+ it->second = 0.0;
+ }
+ else
+ {
+ if (jt->second < 0.0)
+ {
+ it->second += jt->second;
+ source_edges_[v] -= jt->second;
+ target_edges_[u] -= jt->second;
+ flow_value_ += jt->second;
+ jt->second = 0.0;
+ }
+ }
+ }
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::reset ()
+{
+ flow_value_ = 0.0;
+ std::fill (source_edges_.begin (), source_edges_.end (), 0.0);
+ std::fill (target_edges_.begin (), target_edges_.end (), 0.0);
+ for (int u = 0; u < (int)nodes_.size (); u++)
+ {
+ for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
+ {
+ it->second = 0.0;
+ }
+ }
+ std::fill (cut_.begin (), cut_.end (), FREE);
+ parents_.clear ();
+ clearActive ();
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::clear ()
+{
+ flow_value_ = 0.0;
+ source_edges_.clear ();
+ target_edges_.clear ();
+ nodes_.clear ();
+ cut_.clear ();
+ parents_.clear ();
+ clearActive ();
+}
+
+double
+pcl::segmentation::grabcut::BoykovKolmogorov::solve ()
+{
+ // initialize search tree and active set
+ cut_.resize (nodes_.size ());
+ std::fill (cut_.begin (), cut_.end (), FREE);
+ parents_.resize (nodes_.size ());
+
+ clearActive ();
+
+ // pre-augment paths
+ preAugmentPaths ();
+
+ // initialize search trees
+ initializeTrees ();
+
+ std::deque<int> orphans;
+ while (!isActiveSetEmpty ())
+ {
+ const std::pair<int, int> path = expandTrees ();
+ augmentPath (path, orphans);
+ if (!orphans.empty ())
+ {
+ adoptOrphans (orphans);
+ }
+ }
+ return (flow_value_);
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::initializeTrees ()
+{
+ // initialize search tree
+ for (int u = 0; u < (int)nodes_.size (); u++)
+ {
+ if (source_edges_[u] > 0.0)
+ {
+ cut_[u] = SOURCE;
+ parents_[u].first = TERMINAL;
+ markActive (u);
+ }
+ else
+ {
+ if (target_edges_[u] > 0.0)
+ {
+ cut_[u] = TARGET;
+ parents_[u].first = TERMINAL;
+ markActive (u);
+ }
+ }
+ }
+}
+
+std::pair<int, int>
+pcl::segmentation::grabcut::BoykovKolmogorov::expandTrees ()
+{
+ // expand trees looking for augmenting paths
+ while (!isActiveSetEmpty ())
+ {
+ const int u = active_head_;
+
+ if (cut_[u] == SOURCE) {
+ for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
+ {
+ if (it->second > 0.0)
+ {
+ if (cut_[it->first] == FREE)
+ {
+ cut_[it->first] = SOURCE;
+ parents_[it->first] = std::make_pair (u, std::make_pair (it, nodes_[it->first].find (u)));
+ markActive (it->first);
+ }
+ else
+ {
+ if (cut_[it->first] == TARGET)
+ {
+ // found augmenting path
+ return (std::make_pair (u, it->first));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ for (capacitated_edge::iterator it = nodes_[u].begin (); it != nodes_[u].end (); it++)
+ {
+ if (cut_[it->first] == TARGET) continue;
+ if (nodes_[it->first][u] > 0.0)
+ {
+ if (cut_[it->first] == FREE)
+ {
+ cut_[it->first] = TARGET;
+ parents_[it->first] = std::make_pair (u, std::make_pair (nodes_[it->first].find (u), it));
+ markActive (it->first);
+ }
+ else
+ {
+ if (cut_[it->first] == SOURCE)
+ {
+ // found augmenting path
+ return (std::make_pair (it->first, u));
+ }
+ }
+ }
+ }
+ }
+
+ // remove node from active set
+ markInactive (u);
+ }
+
+ return (std::make_pair (TERMINAL, TERMINAL));
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::augmentPath (const std::pair<int, int>& path, std::deque<int>& orphans)
+{
+ if ((path.first == TERMINAL) && (path.second == TERMINAL))
+ return;
+
+ // find path capacity
+
+ // backtrack
+ const edge_pair e = std::make_pair (nodes_[path.first].find (path.second),
+ nodes_[path.second].find (path.first));
+ double c = e.first->second;
+ int u = path.first;
+ while (parents_[u].first != TERMINAL)
+ {
+ c = std::min (c, parents_[u].second.first->second);
+ u = parents_[u].first;
+ //assert (cut_[u] == SOURCE);
+ }
+ c = std::min (c, source_edges_[u]);
+
+ // forward track
+ u = path.second;
+ while (parents_[u].first != TERMINAL)
+ {
+ c = std::min (c, parents_[u].second.first->second);
+ u = parents_[u].first;
+ //assert (cut_[u] == TARGET);
+ }
+ c = std::min (c, target_edges_[u]);
+
+ // augment path
+ flow_value_ += c;
+ //DRWN_LOG_DEBUG ("path capacity: " << c);
+
+ // backtrack
+ u = path.first;
+ while (parents_[u].first != TERMINAL)
+ {
+ //nodes_[u][parents_[u].first] += c;
+ parents_[u].second.second->second += c;
+ parents_[u].second.first->second -= c;
+ if (parents_[u].second.first->second == 0.0)
+ {
+ orphans.push_front (u);
+ }
+ u = parents_[u].first;
+ }
+ source_edges_[u] -= c;
+ if (source_edges_[u] == 0.0)
+ {
+ orphans.push_front (u);
+ }
+
+ // link
+ e.first->second -= c;
+ e.second->second += c;
+
+ // forward track
+ u = path.second;
+ while (parents_[u].first != TERMINAL) {
+ //nodes_[parents_[u].first][u] += c;
+ parents_[u].second.second->second += c;
+ parents_[u].second.first->second -= c;
+ if (parents_[u].second.first->second == 0.0) {
+ orphans.push_back (u);
+ }
+ u = parents_[u].first;
+ }
+ target_edges_[u] -= c;
+ if (target_edges_[u] == 0.0) {
+ orphans.push_back (u);
+ }
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::adoptOrphans (std::deque<int>& orphans)
+{
+ // find new parent for orphaned subtree or free it
+ while (!orphans.empty ())
+ {
+ const int u = orphans.front ();
+ const char tree_label = cut_[u];
+ orphans.pop_front ();
+
+ // can occur if same node is inserted into orphans multiple times
+ if (tree_label == FREE) continue;
+ //assert (tree_label != FREE);
+
+ // look for new parent
+ bool b_free_orphan = true;
+ for (capacitated_edge::iterator jt = nodes_[u].begin (); jt != nodes_[u].end (); ++jt) {
+ // skip if different trees
+ if (cut_[jt->first] != tree_label) continue;
+
+ // check edge capacity
+ const capacitated_edge::iterator kt = nodes_[jt->first].find (u);
+ if (((tree_label == TARGET) && (jt->second <= 0.0)) ||
+ ((tree_label == SOURCE) && (kt->second <= 0.0)))
+ continue;
+
+ // check that u is not an ancestor of jt->first
+ int v = jt->first;
+ while ((v != u) && (v != TERMINAL))
+ {
+ v = parents_[v].first;
+ }
+ if (v != TERMINAL) continue;
+
+ // add as parent
+ const edge_pair e = (tree_label == SOURCE) ? std::make_pair (kt, jt) : std::make_pair (jt, kt);
+ parents_[u] = std::make_pair (jt->first, e);
+ b_free_orphan = false;
+ break;
+ }
+
+ // free the orphan subtree and remove it from the active set
+ if (b_free_orphan)
+ {
+ for (capacitated_edge::const_iterator jt = nodes_[u].begin (); jt != nodes_[u].end (); ++jt)
+ {
+ if ((cut_[jt->first] == tree_label) && (parents_[jt->first].first == u))
+ {
+ orphans.push_front (jt->first);
+ markActive (jt->first);
+ }
+ else if (cut_[jt->first] != FREE)
+ {
+ markActive (jt->first);
+ }
+ }
+
+ // mark inactive and free
+ markInactive (u);
+ cut_[u] = FREE;
+ }
+ }
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::clearActive ()
+{
+ active_head_ = active_tail_ = TERMINAL;
+ active_list_.resize (nodes_.size ());
+ std::fill (active_list_.begin (), active_list_.end (), std::make_pair (TERMINAL, TERMINAL));
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::markActive (int u)
+{
+ if (isActive (u)) return;
+
+ active_list_[u].first = active_tail_;
+ active_list_[u].second = TERMINAL;
+ if (active_tail_ == TERMINAL)
+ active_head_ = u;
+ else
+ active_list_[active_tail_].second = u;
+ active_tail_ = u;
+}
+
+void
+pcl::segmentation::grabcut::BoykovKolmogorov::markInactive (int u)
+{
+ //if (!isActive (u)) return;
+
+ if (u == active_head_)
+ {
+ active_head_ = active_list_[u].second;
+ if (u != active_tail_)
+ {
+ active_list_[active_list_[u].second].first = TERMINAL;
+ }
+ }
+ else
+ if (u == active_tail_)
+ {
+ active_tail_ = active_list_[u].first;
+ active_list_[active_list_[u].first].second = TERMINAL;
+ }
+ else
+ if (active_list_[u].first != TERMINAL)
+ {
+ active_list_[active_list_[u].first].second = active_list_[u].second;
+ active_list_[active_list_[u].second].first = active_list_[u].first;
+ }
+ //active_list_[u] = std::make_pair (TERMINAL, TERMINAL);
+ active_list_[u].first = TERMINAL;
+}
+
+void
+pcl::segmentation::grabcut::GaussianFitter::add (const Color &c)
+{
+ sum_[0] += c.r; sum_[1] += c.g; sum_[2] += c.b;
+ accumulator_ (0,0) += c.r*c.r; accumulator_ (0,1) += c.r*c.g; accumulator_ (0,2) += c.r*c.b;
+ accumulator_ (1,0) += c.g*c.r; accumulator_ (1,1) += c.g*c.g; accumulator_ (1,2) += c.g*c.b;
+ accumulator_ (2,0) += c.b*c.r; accumulator_ (2,1) += c.b*c.g; accumulator_ (2,2) += c.b*c.b;
+
+ ++count_;
+}
+
+// Build the gaussian out of all the added colors
+void
+pcl::segmentation::grabcut::GaussianFitter::fit (Gaussian& g, std::size_t total_count, bool compute_eigens) const
+{
+ if (count_==0)
+ {
+ g.pi = 0;
+ }
+ else
+ {
+ const float count_f = static_cast<float> (count_);
+
+ // Compute mean of gaussian
+ g.mu.r = sum_[0]/count_f;
+ g.mu.g = sum_[1]/count_f;
+ g.mu.b = sum_[2]/count_f;
+
+ // Compute covariance matrix
+ g.covariance (0,0) = accumulator_ (0,0)/count_f - g.mu.r*g.mu.r + epsilon_;
+ g.covariance (0,1) = accumulator_ (0,1)/count_f - g.mu.r*g.mu.g;
+ g.covariance (0,2) = accumulator_ (0,2)/count_f - g.mu.r*g.mu.b;
+ g.covariance (1,0) = accumulator_ (1,0)/count_f - g.mu.g*g.mu.r;
+ g.covariance (1,1) = accumulator_ (1,1)/count_f - g.mu.g*g.mu.g + epsilon_;
+ g.covariance (1,2) = accumulator_ (1,2)/count_f - g.mu.g*g.mu.b;
+ g.covariance (2,0) = accumulator_ (2,0)/count_f - g.mu.b*g.mu.r;
+ g.covariance (2,1) = accumulator_ (2,1)/count_f - g.mu.b*g.mu.g;
+ g.covariance (2,2) = accumulator_ (2,2)/count_f - g.mu.b*g.mu.b + epsilon_;
+
+ // Compute determinant of covariance matrix
+ g.determinant = g.covariance (0,0)*(g.covariance (1,1)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,1))
+ - g.covariance (0,1)*(g.covariance (1,0)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,0))
+ + g.covariance (0,2)*(g.covariance (1,0)*g.covariance (2,1) - g.covariance (1,1)*g.covariance (2,0));
+
+ // Compute inverse (cofactor matrix divided by determinant)
+ g.inverse (0,0) = (g.covariance (1,1)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,1)) / g.determinant;
+ g.inverse (1,0) = -(g.covariance (1,0)*g.covariance (2,2) - g.covariance (1,2)*g.covariance (2,0)) / g.determinant;
+ g.inverse (2,0) = (g.covariance (1,0)*g.covariance (2,1) - g.covariance (1,1)*g.covariance (2,0)) / g.determinant;
+ g.inverse (0,1) = -(g.covariance (0,1)*g.covariance (2,2) - g.covariance (0,2)*g.covariance (2,1)) / g.determinant;
+ g.inverse (1,1) = (g.covariance (0,0)*g.covariance (2,2) - g.covariance (0,2)*g.covariance (2,0)) / g.determinant;
+ g.inverse (2,1) = -(g.covariance (0,0)*g.covariance (2,1) - g.covariance (0,1)*g.covariance (2,0)) / g.determinant;
+ g.inverse (0,2) = (g.covariance (0,1)*g.covariance (1,2) - g.covariance (0,2)*g.covariance (1,1)) / g.determinant;
+ g.inverse (1,2) = -(g.covariance (0,0)*g.covariance (1,2) - g.covariance (0,2)*g.covariance (1,0)) / g.determinant;
+ g.inverse (2,2) = (g.covariance (0,0)*g.covariance (1,1) - g.covariance (0,1)*g.covariance (1,0)) / g.determinant;
+
+ // The weight of the gaussian is the fraction of the number of pixels in this Gaussian to the number
+ // of pixels in all the gaussians of this GMM.
+ g.pi = count_f / static_cast<float> (total_count);
+
+ if (compute_eigens)
+ {
+ // Compute eigenvalues and vectors using SVD
+ Eigen::JacobiSVD<Eigen::Matrix3f> svd (g.covariance, Eigen::ComputeFullU);
+ // Store highest eigenvalue
+ g.eigenvalue = svd.singularValues ()[0];
+ // Store corresponding eigenvector
+ g.eigenvector = svd.matrixU ().col (0);
+ }
+ }
+}
+
+float
+pcl::segmentation::grabcut::GMM::probabilityDensity (const Color &c)
+{
+ float result = 0;
+
+ for (std::size_t i=0; i < gaussians_.size (); ++i)
+ result += gaussians_[i].pi * probabilityDensity (i, c);
+
+ return (result);
+}
+
+float
+pcl::segmentation::grabcut::GMM::probabilityDensity (std::size_t i, const Color &c)
+{
+ float result = 0;
+ const pcl::segmentation::grabcut::Gaussian &G = gaussians_[i];
+ if (G.pi > 0 )
+ {
+ if (G.determinant > 0)
+ {
+ float r = c.r - G.mu.r;
+ float g = c.g - G.mu.g;
+ float b = c.b - G.mu.b;
+
+ float d = r * (r*G.inverse (0,0) + g*G.inverse (1,0) + b*G.inverse (2,0)) +
+ g * (r*G.inverse (0,1) + g*G.inverse (1,1) + b*G.inverse (2,1)) +
+ b * (r*G.inverse (0,2) + g*G.inverse (1,2) + b*G.inverse (2,2));
+
+ result = static_cast<float> (1.0/(sqrt (G.determinant)) * exp (-0.5*d));
+ }
+ }
+
+ return (result);
+}
+
+void
+pcl::segmentation::grabcut::buildGMMs (const Image& image,
+ const std::vector<int>& indices,
+ const std::vector<SegmentationValue>& hard_segmentation,
+ std::vector<std::size_t>& components,
+ GMM& background_GMM, GMM& foreground_GMM)
+{
+ // Step 3: Build GMMs using Orchard-Bouman clustering algorithm
+
+ // Set up Gaussian Fitters
+ std::vector<GaussianFitter> back_fitters (background_GMM.getK ());
+ std::vector<GaussianFitter> fore_fitters (foreground_GMM.getK ());
+
+ std::size_t fore_count = 0, back_count = 0;
+ const int indices_size = static_cast<int> (indices.size ());
+ // Initialize the first foreground and background clusters
+ for (int idx = 0; idx < indices_size; ++idx)
+ {
+ components [idx] = 0;
+
+ if (hard_segmentation [idx] == SegmentationForeground)
+ {
+ fore_fitters[0].add (image[indices[idx]]);
+ fore_count++;
+ }
+ else
+ {
+ back_fitters[0].add (image[indices[idx]]);
+ back_count++;
+ }
+ }
+
+ back_fitters[0].fit (background_GMM[0], back_count, true);
+ fore_fitters[0].fit (foreground_GMM[0], fore_count, true);
+
+ std::size_t n_back = 0, n_fore = 0; // Which cluster will be split
+ std::size_t max_K = (background_GMM.getK () > foreground_GMM.getK ()) ? background_GMM.getK () : foreground_GMM.getK ();
+
+ // Compute clusters
+ for (std::size_t i = 1; i < max_K; ++i)
+ {
+ // Reset the fitters for the splitting clusters
+ back_fitters[n_back] = GaussianFitter ();
+ fore_fitters[n_fore] = GaussianFitter ();
+
+ // For brevity, get references to the splitting Gaussians
+ Gaussian& bg = background_GMM[n_back];
+ Gaussian& fg = foreground_GMM[n_fore];
+
+ // Compute splitting points
+ float split_background = bg.eigenvector[0] * bg.mu.r + bg.eigenvector[1] * bg.mu.g + bg.eigenvector[2] * bg.mu.b;
+ float split_foreground = fg.eigenvector[0] * fg.mu.r + fg.eigenvector[1] * fg.mu.g + fg.eigenvector[2] * fg.mu.b;
+
+ // Split clusters nBack and nFore, place split portion into cluster i
+ for (int idx = 0; idx < indices_size; ++idx)
+ {
+ const Color &c = image[indices[idx]];
+
+ // For each pixel
+ if (i < foreground_GMM.getK () &&
+ hard_segmentation[idx] == SegmentationForeground &&
+ components[idx] == n_fore)
+ {
+ if (fg.eigenvector[0] * c.r + fg.eigenvector[1] * c.g + fg.eigenvector[2] * c.b > split_foreground)
+ {
+ components[idx] = i;
+ fore_fitters[i].add (c);
+ }
+ else
+ {
+ fore_fitters[n_fore].add (c);
+ }
+ }
+ else if (i < background_GMM.getK () &&
+ hard_segmentation[idx] == SegmentationBackground &&
+ components[idx] == n_back)
+ {
+ if (bg.eigenvector[0] * c.r + bg.eigenvector[1] * c.g + bg.eigenvector[2] * c.b > split_background)
+ {
+ components[idx] = i;
+ back_fitters[i].add (c);
+ }
+ else
+ {
+ back_fitters[n_back].add (c);
+ }
+ }
+ }
+
+ // Compute new split Gaussians
+ back_fitters[n_back].fit (background_GMM[n_back], back_count, true);
+ fore_fitters[n_fore].fit (foreground_GMM[n_fore], fore_count, true);
+
+ if (i < background_GMM.getK ())
+ back_fitters[i].fit (background_GMM[i], back_count, true);
+ if (i < foreground_GMM.getK ())
+ fore_fitters[i].fit (foreground_GMM[i], fore_count, true);
+
+ // Find clusters with highest eigenvalue
+ n_back = 0;
+ n_fore = 0;
+
+ for (std::size_t j = 0; j <= i; ++j)
+ {
+ if (j < background_GMM.getK () && background_GMM[j].eigenvalue > background_GMM[n_back].eigenvalue)
+ n_back = j;
+
+ if (j < foreground_GMM.getK () && foreground_GMM[j].eigenvalue > foreground_GMM[n_fore].eigenvalue)
+ n_fore = j;
+ }
+ }
+
+ back_fitters.clear ();
+ fore_fitters.clear ();
+}
+
+void
+pcl::segmentation::grabcut::learnGMMs (const Image& image,
+ const std::vector<int>& indices,
+ const std::vector<SegmentationValue>& hard_segmentation,
+ std::vector<std::size_t>& components,
+ GMM& background_GMM, GMM& foreground_GMM)
+{
+ const std::size_t indices_size = static_cast<std::size_t> (indices.size ());
+ // Step 4: Assign each pixel to the component which maximizes its probability
+ for (std::size_t idx = 0; idx < indices_size; ++idx)
+ {
+ const Color &c = image[indices[idx]];
+
+ if (hard_segmentation[idx] == SegmentationForeground)
+ {
+ std::size_t k = 0;
+ float max = 0;
+
+ for (std::size_t i = 0; i < foreground_GMM.getK (); i++)
+ {
+ float p = foreground_GMM.probabilityDensity (i, c);
+ if (p > max)
+ {
+ k = i;
+ max = p;
+ }
+ }
+ components[idx] = k;
+ }
+ else
+ {
+ std::size_t k = 0;
+ float max = 0;
+
+ for (std::size_t i = 0; i < background_GMM.getK (); i++)
+ {
+ float p = background_GMM.probabilityDensity (i, c);
+ if (p > max)
+ {
+ k = i;
+ max = p;
+ }
+ }
+ components[idx] = k;
+ }
+ }
+
+ // Step 5: Relearn GMMs from new component assignments
+
+ // Set up Gaussian Fitters
+ std::vector<GaussianFitter> back_fitters (background_GMM.getK ());
+ std::vector<GaussianFitter> fore_fitters (foreground_GMM.getK ());
+
+ std::size_t fore_counter = 0, back_counter = 0;
+ for (std::size_t idx = 0; idx < indices_size; ++idx)
+ {
+ const Color &c = image [indices [idx]];
+
+ if (hard_segmentation[idx] == SegmentationForeground)
+ {
+ fore_fitters[components[idx]].add (c);
+ fore_counter++;
+ }
+ else
+ {
+ back_fitters[components[idx]].add (c);
+ back_counter++;
+ }
+ }
+
+ for (std::size_t i = 0; i < background_GMM.getK (); ++i)
+ back_fitters[i].fit (background_GMM[i], back_counter, false);
+
+ for (std::size_t i = 0; i < foreground_GMM.getK (); ++i)
+ fore_fitters[i].fit (foreground_GMM[i], fore_counter, false);
+
+ back_fitters.clear ();
+ fore_fitters.clear ();
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+#include <pcl/segmentation/impl/progressive_morphological_filter.hpp>
+
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+ PCL_INSTANTIATE(ProgressiveMorphologicalFilter, (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointXYZRGB))
+#else
+ PCL_INSTANTIATE(ProgressiveMorphologicalFilter, PCL_XYZ_POINT_TYPES)
+#endif
+
template class pcl::SupervoxelClustering<pcl::PointXYZRGBA>;
template class pcl::SupervoxelClustering<pcl::PointXYZRGB>;
+template class pcl::SupervoxelClustering<pcl::PointXYZ>;
+typedef pcl::SupervoxelClustering<pcl::PointXYZ>::VoxelData VoxelDataT;
typedef pcl::SupervoxelClustering<pcl::PointXYZRGB>::VoxelData VoxelDataRGBT;
typedef pcl::SupervoxelClustering<pcl::PointXYZRGBA>::VoxelData VoxelDataRGBAT;
+typedef pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZ, VoxelDataT> AdjacencyContainerT;
typedef pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZRGB, VoxelDataRGBT> AdjacencyContainerRGBT;
typedef pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZRGBA, VoxelDataRGBAT> AdjacencyContainerRGBAT;
+template class pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZ, VoxelDataT>;
template class pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZRGB, VoxelDataRGBT>;
template class pcl::octree::OctreePointCloudAdjacencyContainer<pcl::PointXYZRGBA, VoxelDataRGBAT>;
+template class pcl::octree::OctreePointCloudAdjacency<pcl::PointXYZ, AdjacencyContainerT>;
template class pcl::octree::OctreePointCloudAdjacency<pcl::PointXYZRGB, AdjacencyContainerRGBT>;
template class pcl::octree::OctreePointCloudAdjacency<pcl::PointXYZRGBA, AdjacencyContainerRGBAT>;
set(SUBSYS_DEPS common search kdtree octree)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS qhull)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS qhull)
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
if(QHULL_FOUND)
include_directories(${QHULL_INCLUDE_DIRS})
set(HULL_INCLUDES
- include/pcl/${SUBSYS_NAME}/concave_hull.h
- include/pcl/${SUBSYS_NAME}/convex_hull.h
- include/pcl/${SUBSYS_NAME}/qhull.h
+ "include/pcl/${SUBSYS_NAME}/concave_hull.h"
+ "include/pcl/${SUBSYS_NAME}/convex_hull.h"
+ "include/pcl/${SUBSYS_NAME}/qhull.h"
)
set(HULL_IMPLS
- include/pcl/${SUBSYS_NAME}/impl/concave_hull.hpp
- include/pcl/${SUBSYS_NAME}/impl/convex_hull.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/concave_hull.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/convex_hull.hpp"
)
set(HULL_SOURCES
src/concave_hull.cpp
endif(QHULL_FOUND)
if (VTK_FOUND AND NOT ANDROID)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
set(VTK_SMOOTHING_INCLUDES
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk.h
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_utils.h
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_subdivision.h
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_quadric_decimation.h
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_smoothing_laplacian.h
- include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.h)
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_utils.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_subdivision.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_quadric_decimation.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_smoothing_laplacian.h"
+ "include/pcl/${SUBSYS_NAME}/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.h")
set(VTK_SMOOTHING_SOURCE
src/vtk_smoothing/vtk_utils.cpp
src/vtk_smoothing/vtk_mesh_quadric_decimation.cpp
src/vtk_smoothing/vtk_mesh_smoothing_laplacian.cpp
src/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.cpp)
- set(VTK_SMOOTHING_TARGET_LINK_LIBRARIES vtkCommon vtkWidgets vtkGraphics)
+
+ if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "6.0")
+ set(VTK_SMOOTHING_TARGET_LINK_LIBRARIES vtkCommon vtkWidgets vtkGraphics)
+ else("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "6.0")
+ set(VTK_SMOOTHING_TARGET_LINK_LIBRARIES vtkCommonCore vtkCommonDataModel vtkCommonExecutionModel vtkFiltersModeling)
+ endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "6.0")
endif()
SET(BUILD_surface_on_nurbs 0 CACHE BOOL "Fitting NURBS to point-clouds using openNURBS" )
ENDIF(BUILD_surface_on_nurbs)
set(POISSON_INCLUDES
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/allocator.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/binary_node.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/bspline_data.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/factor.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/function_data.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/geometry.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/hash.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/marching_cubes_poisson.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/mat.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/multi_grid_octree_data.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/octree_poisson.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/polynomial.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/ppolynomial.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/sparse_matrix.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/vector.h
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/bspline_data.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/function_data.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/geometry.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/mat.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/multi_grid_octree_data.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/octree_poisson.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/polynomial.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/ppolynomial.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/sparse_matrix.hpp
- include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/vector.hpp
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/allocator.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/binary_node.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/bspline_data.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/factor.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/function_data.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/geometry.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/hash.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/marching_cubes_poisson.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/mat.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/multi_grid_octree_data.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/octree_poisson.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/polynomial.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/ppolynomial.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/sparse_matrix.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/vector.h"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/bspline_data.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/function_data.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/geometry.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/mat.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/multi_grid_octree_data.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/octree_poisson.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/polynomial.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/ppolynomial.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/sparse_matrix.hpp"
+ "include/pcl/${SUBSYS_NAME}/3rdparty/poisson4/vector.hpp"
)
set(POISSON_SOURCES
src/3rdparty/poisson4/factor.cpp
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/ear_clipping.h
- include/pcl/${SUBSYS_NAME}/gp3.h
- include/pcl/${SUBSYS_NAME}/grid_projection.h
- include/pcl/${SUBSYS_NAME}/marching_cubes.h
- include/pcl/${SUBSYS_NAME}/marching_cubes_hoppe.h
- include/pcl/${SUBSYS_NAME}/marching_cubes_rbf.h
- include/pcl/${SUBSYS_NAME}/bilateral_upsampling.h
- include/pcl/${SUBSYS_NAME}/mls.h
- include/pcl/${SUBSYS_NAME}/organized_fast_mesh.h
- include/pcl/${SUBSYS_NAME}/reconstruction.h
- include/pcl/${SUBSYS_NAME}/processing.h
- include/pcl/${SUBSYS_NAME}/simplification_remove_unused_vertices.h
- include/pcl/${SUBSYS_NAME}/surfel_smoothing.h
- include/pcl/${SUBSYS_NAME}/texture_mapping.h
- include/pcl/${SUBSYS_NAME}/poisson.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/ear_clipping.h"
+ "include/pcl/${SUBSYS_NAME}/gp3.h"
+ "include/pcl/${SUBSYS_NAME}/grid_projection.h"
+ "include/pcl/${SUBSYS_NAME}/marching_cubes.h"
+ "include/pcl/${SUBSYS_NAME}/marching_cubes_hoppe.h"
+ "include/pcl/${SUBSYS_NAME}/marching_cubes_rbf.h"
+ "include/pcl/${SUBSYS_NAME}/bilateral_upsampling.h"
+ "include/pcl/${SUBSYS_NAME}/mls.h"
+ "include/pcl/${SUBSYS_NAME}/organized_fast_mesh.h"
+ "include/pcl/${SUBSYS_NAME}/reconstruction.h"
+ "include/pcl/${SUBSYS_NAME}/processing.h"
+ "include/pcl/${SUBSYS_NAME}/simplification_remove_unused_vertices.h"
+ "include/pcl/${SUBSYS_NAME}/surfel_smoothing.h"
+ "include/pcl/${SUBSYS_NAME}/texture_mapping.h"
+ "include/pcl/${SUBSYS_NAME}/poisson.h"
${HULL_INCLUDES}
# ${VTK_SMOOTHING_INCLUDES}
# ${POISSON_INCLUDES}
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/gp3.hpp
- include/pcl/${SUBSYS_NAME}/impl/grid_projection.hpp
- include/pcl/${SUBSYS_NAME}/impl/marching_cubes.hpp
- include/pcl/${SUBSYS_NAME}/impl/marching_cubes_hoppe.hpp
- include/pcl/${SUBSYS_NAME}/impl/marching_cubes_rbf.hpp
- include/pcl/${SUBSYS_NAME}/impl/bilateral_upsampling.hpp
- include/pcl/${SUBSYS_NAME}/impl/mls.hpp
- include/pcl/${SUBSYS_NAME}/impl/organized_fast_mesh.hpp
- include/pcl/${SUBSYS_NAME}/impl/reconstruction.hpp
- include/pcl/${SUBSYS_NAME}/impl/processing.hpp
- include/pcl/${SUBSYS_NAME}/impl/surfel_smoothing.hpp
- include/pcl/${SUBSYS_NAME}/impl/texture_mapping.hpp
- include/pcl/${SUBSYS_NAME}/impl/poisson.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/gp3.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/grid_projection.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/marching_cubes.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/marching_cubes_hoppe.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/marching_cubes_rbf.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/bilateral_upsampling.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/mls.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/organized_fast_mesh.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/reconstruction.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/processing.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/surfel_smoothing.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/texture_mapping.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/poisson.hpp"
${HULL_IMPLS}
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${VTK_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR})
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include" ${VTK_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}")
link_directories(${VTK_LIBRARY_DIRS})
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs} ${VTK_SMOOTHING_INCLUDES} ${POISSON_INCLUDES} ${OPENNURBS_INCLUDES} ${ON_NURBS_INCLUDES})
- target_link_libraries(${LIB_NAME} pcl_common pcl_search pcl_kdtree pcl_octree ${VTK_SMOOTHING_TARGET_LINK_LIBRARIES} ${ON_NURBS_LIBRARIES})
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs} ${VTK_SMOOTHING_INCLUDES} ${POISSON_INCLUDES} ${OPENNURBS_INCLUDES} ${ON_NURBS_INCLUDES})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_search pcl_kdtree pcl_octree ${VTK_LIBRARIES} ${ON_NURBS_LIBRARIES})
if(QHULL_FOUND)
- target_link_libraries(${LIB_NAME} ${QHULL_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" ${QHULL_LIBRARIES})
endif(QHULL_FOUND)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}" "${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/3rdparty/poisson4 ${POISSON_INCLUDES})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/3rdparty/poisson4" ${POISSON_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
if(BUILD_surface_on_nurbs)
add_definitions(-DUNICODE -D_UNICODE)
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/3rdparty/opennurbs ${OPENNURBS_INCLUDES})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/on_nurbs ${ON_NURBS_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/3rdparty/opennurbs" ${OPENNURBS_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/on_nurbs" ${ON_NURBS_INCLUDES})
endif(BUILD_surface_on_nurbs)
if (VTK_FOUND AND NOT ANDROID)
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/vtk_smoothing ${VTK_SMOOTHING_INCLUDES})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/vtk_smoothing" ${VTK_SMOOTHING_INCLUDES})
endif (VTK_FOUND AND NOT ANDROID)
if(WIN32)
- target_link_libraries(${LIB_NAME} Rpcrt4.lib)
+ target_link_libraries("${LIB_NAME}" Rpcrt4.lib)
endif(WIN32)
endif(build)
int i , j , d , tIter=0;
SparseSymmetricMatrix< Real > _M;
- Vector< Real > B , _B , _X;
+ Vector< Real > B , B_ , X_;
AdjacencySetFunction asf;
AdjacencyCountFunction acf;
double systemTime = 0 , solveTime = 0 , memUsage = 0 , evaluateTime = 0 , gTime = 0, sTime = 0;
}
// Get the associated constraint vector
- _B.Resize( asf.adjacencyCount );
- for( j=0 ; j<asf.adjacencyCount ; j++ ) _B[j] = B[ asf.adjacencies[j]-sNodes.nodeCount[depth] ];
+ B_.Resize( asf.adjacencyCount );
+ for( j=0 ; j<asf.adjacencyCount ; j++ ) B_[j] = B[ asf.adjacencies[j]-sNodes.nodeCount[depth] ];
- _X.Resize( asf.adjacencyCount );
+ X_.Resize( asf.adjacencyCount );
#pragma omp parallel for num_threads( threads ) schedule( static )
for( j=0 ; j<asf.adjacencyCount ; j++ )
{
- _X[j] = sNodes.treeNodes[ asf.adjacencies[j] ]->nodeData.solution;
+ X_[j] = sNodes.treeNodes[ asf.adjacencies[j] ]->nodeData.solution;
}
// Get the associated matrix
SparseSymmetricMatrix< Real >::internalAllocator.rollBack();
#pragma omp parallel for num_threads( threads ) schedule( static )
for( j=0 ; j<asf.adjacencyCount ; j++ )
{
- _B[j] += sNodes.treeNodes[asf.adjacencies[j]]->nodeData.constraint;
+ B_[j] += sNodes.treeNodes[asf.adjacencies[j]]->nodeData.constraint;
sNodes.treeNodes[ asf.adjacencies[j] ]->nodeData.constraint = 0;
}
// Solve the matrix
// Since we don't have the full matrix, the system shouldn't be singular, so we shouldn't have to correct it
- iter += SparseSymmetricMatrix< Real >::Solve( _M , _B , std::max< int >( int( pow( _M.rows , ITERATION_POWER ) ) , minIters ) , _X , mrVector , Real(accuracy) , 0 );
+ iter += SparseSymmetricMatrix< Real >::Solve( _M , B_ , std::max< int >( int( pow( _M.rows , ITERATION_POWER ) ) , minIters ) , X_ , mrVector , Real(accuracy) , 0 );
if( showResidual )
{
double mNorm = 0;
for( int i=0 ; i<_M.rows ; i++ ) for( int j=0 ; j<_M.rowSizes[i] ; j++ ) mNorm += _M[i][j].Value * _M[i][j].Value;
- double bNorm = _B.Norm( 2 ) , rNorm = ( _B - _M * _X ).Norm( 2 );
+ double bNorm = B_.Norm( 2 ) , rNorm = ( B_ - _M * X_ ).Norm( 2 );
printf( "\t\tResidual: (%d %g) %g -> %g (%f) [%d]\n" , _M.Entries() , sqrt(mNorm) , bNorm , rNorm , rNorm/bNorm , iter );
}
{
TreeOctNode* temp=sNodes.treeNodes[ asf.adjacencies[j] ];
while( temp->depth()>sNodes.treeNodes[i]->depth() ) temp=temp->parent;
- if( temp->nodeData.nodeIndex>=sNodes.treeNodes[i]->nodeData.nodeIndex ) sNodes.treeNodes[ asf.adjacencies[j] ]->nodeData.solution = Real( _X[j] );
+ if( temp->nodeData.nodeIndex>=sNodes.treeNodes[i]->nodeData.nodeIndex ) sNodes.treeNodes[ asf.adjacencies[j] ]->nodeData.solution = Real( X_[j] );
}
systemTime += gTime;
solveTime += sTime;
void
performProcessing (pcl::PointCloud<PointOutT> &output);
+ /** \brief Computes the distance for depth and RGB.
+ * \param[out] val_exp_depth distance values for depth
+ * \param[out] val_exp_rgb distance values for RGB */
+ void
+ computeDistances (Eigen::MatrixXf &val_exp_depth, Eigen::VectorXf &val_exp_rgb);
+
private:
int window_size_;
float sigma_color_, sigma_depth_;
}
/** \brief Returns the dimensionality (2 or 3) of the calculated hull. */
- PCL_DEPRECATED (int getDim () const, "[pcl::ConcaveHull::getDim] This method is deprecated. Please use getDimension () instead.");
-
+ PCL_DEPRECATED ("[pcl::ConcaveHull::getDim] This method is deprecated. Please use getDimension () instead.")
+ int
+ getDim () const;
+
/** \brief Returns the dimensionality (2 or 3) of the calculated hull. */
inline int
getDimension () const
* \param[in] p the point to check
*/
bool
- isInsideTriangle (const Eigen::Vector2f& u,
- const Eigen::Vector2f& v,
- const Eigen::Vector2f& w,
- const Eigen::Vector2f& p);
-
+ isInsideTriangle (const Eigen::Vector3f& u,
+ const Eigen::Vector3f& v,
+ const Eigen::Vector3f& w,
+ const Eigen::Vector3f& p);
/** \brief Compute the cross product between 2D vectors.
* \param[in] p1 the first 2D vector
output.resize (input_->size ());
float nan = std::numeric_limits<float>::quiet_NaN ();
+ Eigen::MatrixXf val_exp_depth_matrix;
+ Eigen::VectorXf val_exp_rgb_vector;
+ computeDistances (val_exp_depth_matrix, val_exp_rgb_vector);
for (int x = 0; x < static_cast<int> (input_->width); ++x)
for (int y = 0; y < static_cast<int> (input_->height); ++y)
float dx = float (x - x_w),
dy = float (y - y_w);
- float val_exp_depth = expf (- (dx*dx + dy*dy) / (2.0f * static_cast<float> (sigma_depth_ * sigma_depth_)));
+ float val_exp_depth = val_exp_depth_matrix(dx+window_size_, dy+window_size_);
float d_color = static_cast<float> (
abs (input_->points[y_w * input_->width + x_w].r - input_->points[y * input_->width + x].r) +
abs (input_->points[y_w * input_->width + x_w].g - input_->points[y * input_->width + x].g) +
abs (input_->points[y_w * input_->width + x_w].b - input_->points[y * input_->width + x].b));
- float val_exp_rgb = expf (- d_color * d_color / (2.0f * sigma_color_ * sigma_color_));
+
+ float val_exp_rgb = val_exp_rgb_vector(d_color);
if (pcl_isfinite (input_->points[y_w*input_->width + x_w].z))
{
}
+template <typename PointInT, typename PointOutT> void
+pcl::BilateralUpsampling<PointInT, PointOutT>::computeDistances (Eigen::MatrixXf &val_exp_depth, Eigen::VectorXf &val_exp_rgb)
+{
+ val_exp_depth.resize (2*window_size_+1,2*window_size_+1);
+ val_exp_rgb.resize (3*255);
+
+ int j = 0;
+ for (int dx = -window_size_; dx < window_size_+1; ++dx)
+ {
+ int i = 0;
+ for (int dy = -window_size_; dy < window_size_+1; ++dy)
+ {
+ float val_exp = expf (- (dx*dx + dy*dy) / (2.0f * static_cast<float> (sigma_depth_ * sigma_depth_)));
+ val_exp_depth(i,j) = val_exp;
+ i++;
+ }
+ j++;
+ }
+
+ for (int d_color = 0; d_color < 3*255; d_color++)
+ {
+ float val_exp = expf (- d_color * d_color / (2.0f * sigma_color_ * sigma_color_));
+ val_exp_rgb(d_color) = val_exp;
+ }
+}
+
#define PCL_INSTANTIATE_BilateralUpsampling(T,OutT) template class PCL_EXPORTS pcl::BilateralUpsampling<T,OutT>;
if (exitcode != 0)
{
- PCL_ERROR ("[pcl::%s::performReconstrution] ERROR: qhull was unable to compute a concave hull for the given point cloud (%zu)!\n", getClassName ().c_str (), cloud_transformed.points.size ());
+ PCL_ERROR ("[pcl::%s::performReconstrution] ERROR: qhull was unable to compute a concave hull for the given point cloud (%lu)!\n", getClassName ().c_str (), cloud_transformed.points.size ());
//check if it fails because of NaN values...
if (!cloud_transformed.is_dense)
// 0 if no error from qhull or it doesn't find any vertices
if (exitcode != 0 || qh num_vertices == 0)
{
- PCL_ERROR ("[pcl::%s::performReconstrution2D] ERROR: qhull was unable to compute a convex hull for the given point cloud (%zu)!\n", getClassName ().c_str (), indices_->size ());
+ PCL_ERROR ("[pcl::%s::performReconstrution2D] ERROR: qhull was unable to compute a convex hull for the given point cloud (%lu)!\n", getClassName ().c_str (), indices_->size ());
hull.points.resize (0);
hull.width = hull.height = 0;
// 0 if no error from qhull
if (exitcode != 0)
{
- PCL_ERROR ("[pcl::%s::performReconstrution3D] ERROR: qhull was unable to compute a convex hull for the given point cloud (%zu)!\n", getClassName ().c_str (), input_->points.size ());
+ PCL_ERROR ("[pcl::%s::performReconstrution3D] ERROR: qhull was unable to compute a convex hull for the given point cloud (%lu)!\n", getClassName ().c_str (), input_->points.size ());
hull.points.resize (0);
hull.width = hull.height = 0;
}
}
}
- PCL_DEBUG ("Number of triangles: %zu\n", polygons.size());
+ PCL_DEBUG ("Number of triangles: %lu\n", polygons.size());
PCL_DEBUG ("Number of unconnected parts: %d\n", nr_parts);
if (increase_nnn4fn > 0)
PCL_WARN ("Number of neighborhood size increase requests for fringe neighbors: %d\n", increase_nnn4fn);
// sorting and removing doubles from fringe queue
std::sort (fringe_queue_.begin (), fringe_queue_.end ());
fringe_queue_.erase (std::unique (fringe_queue_.begin (), fringe_queue_.end ()), fringe_queue_.end ());
- PCL_DEBUG ("Number of processed points: %zu / %zu\n", fringe_queue_.size(), indices_->size ());
+ PCL_DEBUG ("Number of processed points: %lu / %lu\n", fringe_queue_.size(), indices_->size ());
return (true);
}
#include <pcl/point_traits.h>
#include <pcl/surface/mls.h>
#include <pcl/common/io.h>
+#include <pcl/common/copy_point.h>
#include <pcl/common/centroid.h>
#include <pcl/common/eigen.h>
#include <pcl/common/geometry.h>
boost::uniform_real<float> uniform_distrib (-tmp, tmp);
rng_uniform_distribution_.reset (new boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > (rng_alg_, uniform_distrib));
+ mls_results_.resize (1); // Need to have a reference to a single dummy result.
+
break;
}
case (VOXEL_GRID_DILATION):
case (DISTINCT_CLOUD):
{
- mls_results_.resize (input_->size ());
- break;
+ mls_results_.resize (input_->size ());
+ break;
}
default:
- break;
+ {
+ mls_results_.resize (1); // Need to have a reference to a single dummy result.
+ break;
+ }
}
// Perform the actual surface reconstruction
// \note resize is irrelevant for a radiusSearch ().
std::vector<int> nn_indices;
std::vector<float> nn_sqr_dists;
+
+ size_t mls_result_index = 0;
// For all points
for (size_t cp = 0; cp < indices_->size (); ++cp)
NormalCloud projected_points_normals;
// Get a plane approximating the local surface's tangent and project point onto it
int index = (*indices_)[cp];
- computeMLSPointNormal (index, nn_indices, nn_sqr_dists, projected_points, projected_points_normals, *corresponding_input_indices_, mls_results_[index]);
+
+ if (upsample_method_ == VOXEL_GRID_DILATION || upsample_method_ == DISTINCT_CLOUD)
+ mls_result_index = index; // otherwise we give it a dummy location.
+
+ computeMLSPointNormal (index, nn_indices, nn_sqr_dists, projected_points, projected_points_normals, *corresponding_input_indices_, mls_results_[mls_result_index]);
// Copy all information from the input cloud to the output points (not doing any interpolation)
// Get a plane approximating the local surface's tangent and project point onto it
int index = (*indices_)[cp];
- this->computeMLSPointNormal (index, nn_indices, nn_sqr_dists, projected_points[tn], projected_points_normals[tn], corresponding_input_indices[tn], this->mls_results_[index]);
+ size_t mls_result_index = 0;
+
+ if (upsample_method_ == VOXEL_GRID_DILATION || upsample_method_ == DISTINCT_CLOUD)
+ mls_result_index = index; // otherwise we give it a dummy location.
+
+ this->computeMLSPointNormal (index, nn_indices, nn_sqr_dists, projected_points[tn], projected_points_normals[tn], corresponding_input_indices[tn], this->mls_results_[mls_result_index]);
// Copy all information from the input cloud to the output points (not doing any interpolation)
for (size_t pp = pp_size; pp < projected_points[tn].size (); ++pp)
pcl::MovingLeastSquares<PointInT, PointOutT>::copyMissingFields (const PointInT &point_in,
PointOutT &point_out) const
{
- typedef typename pcl::traits::fieldList<typename PointCloudIn::PointType>::type FieldListInput;
- typedef typename pcl::traits::fieldList<typename PointCloudOut::PointType>::type FieldListOutput;
- typedef typename pcl::intersect<FieldListInput, FieldListOutput>::type FieldList;
-
PointOutT temp = point_out;
- pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointInT, PointOutT> (point_in,
- point_out));
+ copyPoint (point_in, point_out);
point_out.x = temp.x;
point_out.y = temp.y;
point_out.z = temp.z;
// compute image center and dimension
double sizeX = cam.width;
double sizeY = cam.height;
- double cx = sizeX / 2.0;
- double cy = sizeY / 2.0;
+ double cx, cy;
+ if (cam.center_w > 0)
+ cx = cam.center_w;
+ else
+ cx = sizeX / 2.0;
+ if (cam.center_h > 0)
+ cy = cam.center_h;
+ else
+ cy = sizeY / 2.0;
+
+ double focal_x, focal_y;
+ if (cam.focal_length_w > 0)
+ focal_x = cam.focal_length_w;
+ else
+ focal_x = cam.focal_length;
+ if (cam.focal_length_h > 0)
+ focal_y = cam.focal_length_h;
+ else
+ focal_y = cam.focal_length;
// project point on camera's image plane
- UV_coordinates.x = static_cast<float> ((cam.focal_length * (pt.x / pt.z) + cx) / sizeX); //horizontal
- UV_coordinates.y = 1.0f - static_cast<float> ((cam.focal_length * (pt.y / pt.z) + cy) / sizeY); //vertical
+ UV_coordinates.x = static_cast<float> ((focal_x * (pt.x / pt.z) + cx) / sizeX); //horizontal
+ UV_coordinates.y = 1.0f - static_cast<float> ((focal_y * (pt.y / pt.z) + cy) / sizeY); //vertical
// point is visible!
if (UV_coordinates.x >= 0.0 && UV_coordinates.x <= 1.0 && UV_coordinates.y >= 0.0 && UV_coordinates.y <= 1.0)
getSqrGaussParam () const { return (sqr_gauss_param_); }
/** \brief Set the upsampling method to be used
+ * \param method
* \note Options are: * NONE - no upsampling will be done, only the input points will be projected to their own
* MLS surfaces
* * DISTINCT_CLOUD - will project the points of the distinct cloud to the closest point on
* parameters
* * RANDOM_UNIFORM_DENSITY - the local plane of each input point will be sampled using an
* uniform random distribution such that the density of points is
- * constant throughout the cloud - given by the \ref \ref desired_num_points_in_radius_
+ * constant throughout the cloud - given by the \ref desired_num_points_in_radius_
* parameter
* * VOXEL_GRID_DILATION - the input cloud will be inserted into a voxel grid with voxels of
* size \ref voxel_size_; this voxel grid will be dilated \ref dilation_iteration_num_
}
/** \brief Smooth a given point and its neighborghood using Moving Least Squares.
- * \param[in] index the inex of the query point in the \ref input cloud
- * \param[in] nn_indices the set of nearest neighbors indices for \ref pt
- * \param[in] nn_sqr_dists the set of nearest neighbors squared distances for \ref pt
+ * \param[in] index the inex of the query point in the input cloud
+ * \param[in] nn_indices the set of nearest neighbors indices for pt
+ * \param[in] nn_sqr_dists the set of nearest neighbors squared distances for pt
* \param[out] projected_points the set of points projected points around the query point
* (in the case of upsampling method NONE, only the query point projected to its own fitted surface will be returned,
* in the case of the other upsampling methods, multiple points will be returned)
* the MLS surface of the input point
* \param[in] u_disp the u coordinate of the sample point in the local plane of the query point
* \param[in] v_disp the v coordinate of the sample point in the local plane of the query point
- * \param[in] u the axis corresponding to the u-coordinates of the local plane of the query point
- * \param[in] v the axis corresponding to the v-coordinates of the local plane of the query point
- * \param[in] plane_normal the normal to the local plane of the query point
+ * \param[in] u_axis the axis corresponding to the u-coordinates of the local plane of the query point
+ * \param[in] v_axis the axis corresponding to the v-coordinates of the local plane of the query point
+ * \param[in] n_axis
+ * \param mean
* \param[in] curvature the curvature of the surface at the query point
- * \param[in] query_point the absolute 3D position of the query point
* \param[in] c_vec the coefficients of the polynomial fit on the MLS surface of the query point
* \param[in] num_neighbors the number of neighbors of the query point in the input cloud
* \param[out] result_point the absolute 3D position of the resulting projected point
using MovingLeastSquares<PointInT, PointOutT>::nr_coeff_;
using MovingLeastSquares<PointInT, PointOutT>::order_;
using MovingLeastSquares<PointInT, PointOutT>::compute_normals_;
+ using MovingLeastSquares<PointInT, PointOutT>::upsample_method_;
+ using MovingLeastSquares<PointInT, PointOutT>::VOXEL_GRID_DILATION;
+ using MovingLeastSquares<PointInT, PointOutT>::DISTINCT_CLOUD;
typedef pcl::PointCloud<pcl::Normal> NormalCloud;
typedef pcl::PointCloud<pcl::Normal>::Ptr NormalCloudPtr;
};
}
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/surface/impl/poisson.hpp>
+#endif
+
#endif // PCL_SURFACE_POISSON_H_
namespace texture_mapping
{
- /** \brief Structure to store camera pose and focal length. */
+ /** \brief Structure to store camera pose and focal length.
+ *
+ * One can assign a value to focal_length, to be used along
+ * both camera axes or, optionally, axis-specific values
+ * (focal_length_w and focal_length_h). Optionally, one can
+ * also specify center-of-focus using parameters
+ * center_w and center_h. If the center-of-focus is not
+ * specified, it will be set to the geometric center of
+ * the camera, as defined by the width and height parameters.
+ */
struct Camera
{
- Camera () : pose (), focal_length (), height (), width (), texture_file () {}
+ Camera () : pose (), focal_length (), focal_length_w (-1), focal_length_h (-1),
+ center_w (-1), center_h (-1), height (), width (), texture_file () {}
Eigen::Affine3f pose;
double focal_length;
+ double focal_length_w; // optional
+ double focal_length_h; // optinoal
+ double center_w; // optional
+ double center_h; // optional
double height;
double width;
std::string texture_file;
// compute image center and dimension
double sizeX = cam.width;
double sizeY = cam.height;
- double cx = (sizeX) / 2.0;
- double cy = (sizeY) / 2.0;
-
- double focal_x = cam.focal_length;
- double focal_y = cam.focal_length;
+ double cx, cy;
+ if (cam.center_w > 0)
+ cx = cam.center_w;
+ else
+ cx = (sizeX) / 2.0;
+ if (cam.center_h > 0)
+ cy = cam.center_h;
+ else
+ cy = (sizeY) / 2.0;
+
+ double focal_x, focal_y;
+ if (cam.focal_length_w > 0)
+ focal_x = cam.focal_length_w;
+ else
+ focal_x = cam.focal_length;
+ if (cam.focal_length_h>0)
+ focal_y = cam.focal_length_h;
+ else
+ focal_y = cam.focal_length;
// project point on image frame
UV_coordinates[0] = static_cast<float> ((focal_x * (pt.x / pt.z) + cx) / sizeX); //horizontal
/** \brief Segment and texture faces by camera visibility. Face-based segmentation.
* \details With N camera, faces will be arranged into N+1 groups: 1 for each camera, plus 1 for faces not visible from any camera.
* The mesh will also contain uv coordinates for each face
- * \param[in/out] tex_mesh input mesh that needs sorting. Should contain only 1 sub-mesh.
+ * \param mesh input mesh that needs sorting. Should contain only 1 sub-mesh.
* \param[in] cameras vector containing the cameras used for texture mapping.
*/
void
* \param[out] radius the radius of the circumscribed circle.
*/
inline void
- getTriangleCircumcenterAndSize (const pcl::PointXY &p1, const pcl::PointXY &p2, const pcl::PointXY &p3, pcl::PointXY &circomcenter, double &radius);
+ getTriangleCircumcenterAndSize (const pcl::PointXY &p1, const pcl::PointXY &p2, const pcl::PointXY &p3, pcl::PointXY &circumcenter, double &radius);
/** \brief Returns the centroid of a triangle and the corresponding circumscribed circle's radius.
MeshQuadricDecimationVTK ();
/** \brief Set the percentage of faces that should be removed.
- * \param[in] float the factor
+ * \param[in] factor the factor
*/
inline void
setTargetReductionFactor (float factor)
};
/** \brief Turn on/off smoothing along sharp interior edges.
- * \param[in] status decision whether to enable/disable smoothing along sharp interior edges
+ * \param[in] feature_edge_smoothing whether to enable/disable smoothing along sharp interior edges
*/
inline void
setFeatureEdgeSmoothing (bool feature_edge_smoothing)
}
/** \brief Turn on/off smoothing along sharp interior edges.
- * \param[in] status decision whether to enable/disable smoothing along sharp interior edges
+ * \param[in] feature_edge_smoothing whether to enable/disable smoothing along sharp interior edges
*/
inline void
setFeatureEdgeSmoothing (bool feature_edge_smoothing)
public:
/** \brief Convert a PCL PolygonMesh to a VTK vtkPolyData.
* \param[in] triangles PolygonMesh to be converted to vtkPolyData, stored in the object.
+ * \param[out] triangles_out_vtk
*/
static int
convertToVTK (const pcl::PolygonMesh &triangles, vtkSmartPointer<vtkPolyData> &triangles_out_vtk);
/** \brief Convert the vtkPolyData object back to PolygonMesh.
+ * \param[in] vtk_polygons
* \param[out] triangles the PolygonMesh to store the vtkPolyData in.
*/
static void
{
const int n_vertices = static_cast<const int> (vertices.vertices.size ());
- if (n_vertices <= 3)
+ if (n_vertices < 3)
return;
+ else if (n_vertices == 3)
+ {
+ output.polygons.push_back( vertices );
+ return;
+ }
std::vector<uint32_t> remaining_vertices (n_vertices);
if (area (vertices.vertices) > 0) // clockwise?
float
pcl::EarClipping::area (const std::vector<uint32_t>& vertices)
{
- int n = static_cast<int> (vertices.size ());
- float area = 0.0f;
- Eigen::Vector2f prev_p, cur_p;
- for (int prev = n - 1, cur = 0; cur < n; prev = cur++)
- {
- prev_p[0] = points_->points[vertices[prev]].x;
- prev_p[1] = points_->points[vertices[prev]].y;
- cur_p[0] = points_->points[vertices[cur]].x;
- cur_p[1] = points_->points[vertices[cur]].y;
+ //if the polygon is projected onto the xy-plane, the area of the polygon is determined
+ //by the trapeze formula of Gauss. However this fails, if the projection is one 'line'.
+ //Therefore the following implementation determines the area of the flat polygon in 3D-space
+ //using Stoke's law: http://code.activestate.com/recipes/578276-3d-polygon-area/
+
+ int n = static_cast<int> (vertices.size ());
+ float area = 0.0f;
+ Eigen::Vector3f prev_p, cur_p;
+ Eigen::Vector3f total (0,0,0);
+ Eigen::Vector3f unit_normal;
+
+ if (n > 3)
+ {
+ for (int prev = n - 1, cur = 0; cur < n; prev = cur++)
+ {
+ prev_p = points_->points[vertices[prev]].getVector3fMap();
+ cur_p = points_->points[vertices[cur]].getVector3fMap();
- area += crossProduct (prev_p, cur_p);
- }
- return (area * 0.5f);
+ total += prev_p.cross( cur_p );
+ }
+
+ //unit_normal is unit normal vector of plane defined by the first three points
+ prev_p = points_->points[vertices[1]].getVector3fMap() - points_->points[vertices[0]].getVector3fMap();
+ cur_p = points_->points[vertices[2]].getVector3fMap() - points_->points[vertices[0]].getVector3fMap();
+ unit_normal = (prev_p.cross(cur_p)).normalized();
+
+ area = total.dot( unit_normal );
+ }
+
+ return area * 0.5f;
}
bool
pcl::EarClipping::isEar (int u, int v, int w, const std::vector<uint32_t>& vertices)
{
- Eigen::Vector2f p_u, p_v, p_w;
- p_u[0] = points_->points[vertices[u]].x;
- p_u[1] = points_->points[vertices[u]].y;
- p_v[0] = points_->points[vertices[v]].x;
- p_v[1] = points_->points[vertices[v]].y;
- p_w[0] = points_->points[vertices[w]].x;
- p_w[1] = points_->points[vertices[w]].y;
+ Eigen::Vector3f p_u, p_v, p_w;
+ p_u = points_->points[vertices[u]].getVector3fMap();
+ p_v = points_->points[vertices[v]].getVector3fMap();
+ p_w = points_->points[vertices[w]].getVector3fMap();
- // Avoid flat triangles.
- // FIXME: triangulation would fail if all the triangles are flat in the X-Y axis
const float eps = 1e-15f;
- Eigen::Vector2f p_uv, p_uw;
+ Eigen::Vector3f p_uv, p_uw;
p_uv = p_v - p_u;
p_uw = p_w - p_u;
- if (crossProduct (p_uv, p_uw) < eps)
+
+ // Avoid flat triangles.
+ if ((p_uv.cross(p_uw)).norm() < eps)
return (false);
- Eigen::Vector2f p;
+ Eigen::Vector3f p;
// Check if any other vertex is inside the triangle.
for (int k = 0; k < static_cast<int> (vertices.size ()); k++)
{
if ((k == u) || (k == v) || (k == w))
continue;
- p[0] = points_->points[vertices[k]].x;
- p[1] = points_->points[vertices[k]].y;
+ p = points_->points[vertices[k]].getVector3fMap();
if (isInsideTriangle (p_u, p_v, p_w, p))
return (false);
/////////////////////////////////////////////////////////////////////////////////////////////
bool
-pcl::EarClipping::isInsideTriangle (const Eigen::Vector2f& u,
- const Eigen::Vector2f& v,
- const Eigen::Vector2f& w,
- const Eigen::Vector2f& p)
+pcl::EarClipping::isInsideTriangle (const Eigen::Vector3f& u,
+ const Eigen::Vector3f& v,
+ const Eigen::Vector3f& w,
+ const Eigen::Vector3f& p)
{
- // Check first side.
- if (crossProduct (w - v, p - v) < 0)
- return (false);
-
- // Check second side.
- if (crossProduct (v - u, p - u) < 0)
- return (false);
-
- // Check third side.
- if (crossProduct (u - w, p - w) < 0)
- return (false);
-
- return (true);
+ // see http://www.blackpawn.com/texts/pointinpoly/default.html
+ // Barycentric Coordinates
+ Eigen::Vector3f v0 = w - u;
+ Eigen::Vector3f v1 = v - u;
+ Eigen::Vector3f v2 = p - u;
+
+ // Compute dot products
+ float dot00 = v0.dot(v0);
+ float dot01 = v0.dot(v1);
+ float dot02 = v0.dot(v2);
+ float dot11 = v1.dot(v1);
+ float dot12 = v1.dot(v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
+ float a = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float b = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ // Check if point is in triangle
+ return (a >= 0) && (b >= 0) && (a + b < 1);
}
if (unsigned (this->m_data.boundary.size ()) != num_bnd)
{
- printf ("[SequentialFitter::grow] %zu %u\n", this->m_data.boundary.size (), num_bnd);
+ printf ("[SequentialFitter::grow] %lu %u\n", this->m_data.boundary.size (), num_bnd);
throw std::runtime_error ("[SequentialFitter::grow] size of boundary and boundary parameters do not match.");
}
if (this->m_boundary_indices->indices.size () != num_bnd)
{
- printf ("[SequentialFitter::grow] %zu %u\n", this->m_boundary_indices->indices.size (), num_bnd);
+ printf ("[SequentialFitter::grow] %lu %u\n", this->m_boundary_indices->indices.size (), num_bnd);
throw std::runtime_error ("[SequentialFitter::grow] size of boundary indices and boundary parameters do not match.");
}
#include <pcl/surface/vtk_smoothing/vtk_mesh_quadric_decimation.h>
#include <pcl/surface/vtk_smoothing/vtk_utils.h>
+#include <vtkVersion.h>
#include <vtkQuadricDecimation.h>
//////////////////////////////////////////////////////////////////////////////////////////////
// Apply the VTK algorithm
vtkSmartPointer<vtkQuadricDecimation> vtk_quadric_decimation_filter = vtkSmartPointer<vtkQuadricDecimation>::New();
vtk_quadric_decimation_filter->SetTargetReduction (target_reduction_factor_);
+#if VTK_MAJOR_VERSION < 6
vtk_quadric_decimation_filter->SetInput (vtk_polygons_);
+#else
+ vtk_quadric_decimation_filter->SetInputData (vtk_polygons_);
+#endif
vtk_quadric_decimation_filter->Update ();
vtk_polygons_ = vtk_quadric_decimation_filter->GetOutput ();
#include <pcl/surface/vtk_smoothing/vtk_mesh_smoothing_laplacian.h>
#include <pcl/surface/vtk_smoothing/vtk_utils.h>
+#include <vtkVersion.h>
#include <vtkSmoothPolyDataFilter.h>
// Apply the VTK algorithm
vtkSmartPointer<vtkSmoothPolyDataFilter> vtk_smoother = vtkSmoothPolyDataFilter::New ();
+#if VTK_MAJOR_VERSION < 6
vtk_smoother->SetInput (vtk_polygons_);
+#else
+ vtk_smoother->SetInputData (vtk_polygons_);
+#endif
vtk_smoother->SetNumberOfIterations (num_iter_);
if (convergence_ != 0.0f)
vtk_smoother->SetConvergence (convergence_);
#include <pcl/surface/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.h>
#include <pcl/surface/vtk_smoothing/vtk_utils.h>
+#include <vtkVersion.h>
#include <vtkWindowedSincPolyDataFilter.h>
// Apply the VTK algorithm
vtkSmartPointer<vtkWindowedSincPolyDataFilter> vtk_smoother = vtkWindowedSincPolyDataFilter::New ();
+#if VTK_MAJOR_VERSION < 6
vtk_smoother->SetInput (vtk_polygons_);
+#else
+ vtk_smoother->SetInputData (vtk_polygons_);
+#endif
vtk_smoother->SetNumberOfIterations (num_iter_);
vtk_smoother->SetPassBand (pass_band_);
vtk_smoother->SetNormalizeCoordinates (normalize_coordinates_);
#include <pcl/surface/vtk_smoothing/vtk_mesh_subdivision.h>
#include <pcl/surface/vtk_smoothing/vtk_utils.h>
+#include <vtkVersion.h>
#include <vtkLinearSubdivisionFilter.h>
#include <vtkLoopSubdivisionFilter.h>
#include <vtkButterflySubdivisionFilter.h>
break;
}
+#if VTK_MAJOR_VERSION < 6
vtk_subdivision_filter->SetInput (vtk_polygons_);
+#else
+ vtk_subdivision_filter->SetInputData (vtk_polygons_);
+#endif
vtk_subdivision_filter->Update ();
vtk_polygons_ = vtk_subdivision_filter->GetOutput ();
#include <pcl/conversions.h>
#include <pcl/common/common.h>
+#include <vtkVersion.h>
#include <vtkCellArray.h>
#include <vtkTriangleFilter.h>
#include <vtkPoints.h>
mesh2vtk (triangles, vtk_polygons);
vtkSmartPointer<vtkTriangleFilter> vtk_triangles = vtkTriangleFilter::New ();
+#if VTK_MAJOR_VERSION < 6
vtk_triangles->SetInput (vtk_polygons);
+#else
+ vtk_triangles->SetInputData (vtk_polygons);
+#endif
vtk_triangles->Update();
triangles_out_vtk = vtk_triangles->GetOutput ();
of the surface estimation can be adjusted, and normals can be estimated in
the same step if needed.
-\image html http://www.pointclouds.org/documentation/tutorials/_images/resampling_1.png
+\image html http://www.pointclouds.org/documentation/tutorials/_images/resampling_1.jpg
Meshing is a general way to create a surface out of points, and currently
there are two algorithms provided: a very fast triangulation of the original
set(SUBSYS_DESC "Point cloud library global unit tests")
if(BUILD_visualization)
- include (${VTK_USE_FILE})
+ include("${VTK_USE_FILE}")
set(SUBSYS_DEPS common sample_consensus io kdtree features filters geometry keypoints search surface registration segmentation octree recognition people outofcore visualization)
set(OPT_DEPS vtk)
else()
set(DEFAULT OFF)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS ${OPT_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} OPT_DEPS ${OPT_DEPS})
if(build)
- include_directories(${PCL_SOURCE_DIR}/test/gtest-1.6.0/include)
- include_directories(${PCL_SOURCE_DIR}/test/gtest-1.6.0/)
- add_library(pcl_gtest STATIC gtest-1.6.0/src/gtest-all.cc)
+ find_package(Gtest REQUIRED)
+ include_directories(SYSTEM ${GTEST_INCLUDE_DIRS} ${GTEST_SRC_DIR})
+
+ add_library(pcl_gtest STATIC ${GTEST_SRC_DIR}/src/gtest-all.cc)
if( MSVC11 ) # VS2012 doesn't correctly support variadic templates yet
add_definitions("-D_VARIADIC_MAX=10")
enable_testing()
include_directories(${PCL_INCLUDE_DIRS})
+ add_custom_target(tests "${CMAKE_CTEST_COMMAND}" "-V" VERBATIM)
+
add_subdirectory(common)
add_subdirectory(features)
add_subdirectory(filters)
add_subdirectory(search)
add_subdirectory(keypoints)
add_subdirectory(surface)
+ add_subdirectory(sample_consensus)
- PCL_ADD_TEST(a_recognition_ism_test test_recognition_ism
+ PCL_ADD_TEST(a_bearing_angle_image_test test_bearing_angle_image
+ FILES test_bearing_angle_image.cpp
+ LINK_WITH pcl_gtest pcl_common pcl_io)
+
+ PCL_ADD_TEST(a_recognition_ism_test test_recognition_ism
FILES test_recognition_ism.cpp
LINK_WITH pcl_gtest pcl_io pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/ism_train.pcd ${PCL_SOURCE_DIR}/test/ism_test.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/ism_train.pcd" "${PCL_SOURCE_DIR}/test/ism_test.pcd")
PCL_ADD_TEST(search test_search
FILES test_search.cpp
LINK_WITH pcl_gtest pcl_search pcl_io pcl_kdtree
- ARGUMENTS ${PCL_SOURCE_DIR}/test/table_scene_mug_stereo_textured.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/table_scene_mug_stereo_textured.pcd")
- PCL_ADD_TEST(a_sample_consensus_test test_sample_consensus
- FILES test_sample_consensus.cpp
- LINK_WITH pcl_gtest pcl_io pcl_sample_consensus pcl_kdtree pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/sac_plane_test.pcd)
-
PCL_ADD_TEST(a_transforms_test test_transforms
FILES test_transforms.cpp
LINK_WITH pcl_gtest pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(a_segmentation_test test_segmentation
FILES test_segmentation.cpp
LINK_WITH pcl_gtest pcl_io pcl_segmentation pcl_features pcl_kdtree pcl_search pcl_common
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd ${PCL_SOURCE_DIR}/test/car6.pcd ${PCL_SOURCE_DIR}/test/colored_cloud.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd" "${PCL_SOURCE_DIR}/test/car6.pcd" "${PCL_SOURCE_DIR}/test/colored_cloud.pcd")
PCL_ADD_TEST(test_non_linear test_non_linear
FILES test_non_linear.cpp
LINK_WITH pcl_gtest pcl_common pcl_io pcl_sample_consensus pcl_segmentation pcl_kdtree pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/noisy_slice_displaced.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/noisy_slice_displaced.pcd")
PCL_ADD_TEST(a_recognition_cg_test test_recognition_cg
FILES test_recognition_cg.cpp
LINK_WITH pcl_gtest pcl_common pcl_io pcl_kdtree pcl_features pcl_recognition pcl_keypoints
- ARGUMENTS ${PCL_SOURCE_DIR}/test/milk.pcd ${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/milk.pcd" "${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd")
PCL_ADD_TEST(a_people_detection_test test_people_detection
FILES test_people_groundBasedPeopleDetectionApp.cpp
LINK_WITH pcl_gtest pcl_common pcl_io pcl_kdtree pcl_search pcl_features pcl_sample_consensus pcl_filters pcl_io pcl_segmentation pcl_people
- ARGUMENTS ${PCL_SOURCE_DIR}/people/data/trainedLinearSVMForPeopleDetectionWithHOG.yaml ${PCL_SOURCE_DIR}/test/five_people.pcd )
+ ARGUMENTS "${PCL_SOURCE_DIR}/people/data/trainedLinearSVMForPeopleDetectionWithHOG.yaml" "${PCL_SOURCE_DIR}/test/five_people.pcd")
if(BUILD_visualization AND (NOT UNIX OR (UNIX AND DEFINED ENV{DISPLAY})))
PCL_ADD_TEST(a_visualization_test test_visualization
FILES test_visualization.cpp
LINK_WITH pcl_gtest pcl_io pcl_visualization pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bunny.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bunny.pcd")
endif()
endif(build)
PCL_ADD_TEST(common_test_macros test_macros FILES test_macros.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_vector_average test_vector_average FILES test_vector_average.cpp LINK_WITH pcl_gtest)
PCL_ADD_TEST(common_common test_common FILES test_common.cpp LINK_WITH pcl_gtest pcl_common)
+PCL_ADD_TEST(common_copy_point test_copy_point FILES test_copy_point.cpp LINK_WITH pcl_gtest pcl_common)
+PCL_ADD_TEST(common_centroid test_centroid FILES test_centroid.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_int test_plane_intersection FILES test_plane_intersection.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_pca test_pca FILES test_pca.cpp LINK_WITH pcl_gtest pcl_common)
#PCL_ADD_TEST(common_spring test_spring FILES test_spring.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_intensity test_intensity FILES test_intensity.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_generator test_generator FILES test_generator.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_io test_common_io FILES test_io.cpp LINK_WITH pcl_gtest pcl_common)
+PCL_ADD_TEST(common_copy_make_borders test_copy_make_borders FILES test_copy_make_borders.cpp LINK_WITH pcl_gtest pcl_common)
PCL_ADD_TEST(common_point_type_conversion test_common_point_type_conversion FILES test_point_type_conversion.cpp LINK_WITH pcl_gtest pcl_common)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/common/common.h>
+#include <pcl/common/distances.h>
+#include <pcl/common/intersections.h>
+#include <pcl/common/io.h>
+#include <pcl/common/eigen.h>
+#include <pcl/point_types.h>
+#include <pcl/point_cloud.h>
+#include <pcl/pcl_tests.h>
+
+#include <pcl/common/centroid.h>
+
+using namespace pcl;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, compute3DCentroidFloat)
+{
+ pcl::PointIndices pindices;
+ std::vector<int> indices;
+ PointXYZ point;
+ PointCloud<PointXYZ> cloud;
+ Eigen::Vector4f centroid;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 0);
+
+ cloud.clear ();
+ indices.clear ();
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (centroid [3], 1);
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+ EXPECT_EQ (centroid [3], 1.0);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
+
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (centroid [3], 1);
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ indices.push_back (8); // add the NaN
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+ EXPECT_EQ (centroid [3], 1.0);
+
+ pindices.indices = indices;
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+ EXPECT_EQ (centroid [3], 1.0);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, compute3DCentroidDouble)
+{
+ pcl::PointIndices pindices;
+ std::vector<int> indices;
+ PointXYZ point;
+ PointCloud<PointXYZ> cloud;
+ Eigen::Vector4d centroid;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 0);
+
+ cloud.clear ();
+ indices.clear ();
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (centroid [3], 1);
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
+
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (centroid [3], 1);
+
+ centroid [0] = -100;
+ centroid [1] = -200;
+ centroid [2] = -300;
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ indices.push_back (8); // add the NaN
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+ EXPECT_EQ (centroid [3], 1.0);
+
+ pindices.indices = indices;
+ EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
+
+ EXPECT_EQ (centroid [0], 0.0);
+ EXPECT_EQ (centroid [1], 1.0);
+ EXPECT_EQ (centroid [2], 0.0);
+ EXPECT_EQ (centroid [3], 1.0);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, compute3DCentroidCloudIterator)
+{
+ pcl::PointIndices pindices;
+ std::vector<int> indices;
+ PointXYZ point;
+ PointCloud<PointXYZ> cloud;
+ Eigen::Vector4f centroid_f;
+
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+
+ ConstCloudIterator<PointXYZ> it (cloud, indices);
+
+ EXPECT_EQ (compute3DCentroid (it, centroid_f), 4);
+
+ EXPECT_EQ (centroid_f[0], 0.0f);
+ EXPECT_EQ (centroid_f[1], 1.0f);
+ EXPECT_EQ (centroid_f[2], 0.0f);
+ EXPECT_EQ (centroid_f[3], 1.0f);
+
+ Eigen::Vector4d centroid_d;
+ it.reset ();
+ EXPECT_EQ (compute3DCentroid (it, centroid_d), 4);
+
+ EXPECT_EQ (centroid_d[0], 0.0);
+ EXPECT_EQ (centroid_d[1], 1.0);
+ EXPECT_EQ (centroid_d[2], 0.0);
+ EXPECT_EQ (centroid_d[3], 1.0);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, computeCovarianceMatrix)
+{
+ PointCloud<PointXYZ> cloud;
+ PointXYZ point;
+ std::vector <int> indices;
+ Eigen::Vector4f centroid;
+ Eigen::Matrix3f covariance_matrix;
+
+ centroid [0] = 0;
+ centroid [1] = 0;
+ centroid [2] = 0;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 0);
+
+ cloud.clear ();
+ indices.clear ();
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = 0;
+ centroid [1] = 0;
+ centroid [2] = 0;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 8);
+ EXPECT_EQ (covariance_matrix (0, 0), 8);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 8);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 8);
+
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 1;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 4);
+ EXPECT_EQ (covariance_matrix (0, 0), 4);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 4);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 0;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 8);
+ EXPECT_EQ (covariance_matrix (0, 0), 8);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 8);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 8);
+
+ indices.push_back (8); // add the NaN
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 1;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 4);
+ EXPECT_EQ (covariance_matrix (0, 0), 4);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 4);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, computeCovarianceMatrixNormalized)
+{
+ PointCloud<PointXYZ> cloud;
+ PointXYZ point;
+ std::vector <int> indices;
+ Eigen::Vector4f centroid;
+ Eigen::Matrix3f covariance_matrix;
+
+ centroid [0] = 0;
+ centroid [1] = 0;
+ centroid [2] = 0;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 0);
+
+ cloud.clear ();
+ indices.clear ();
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = 0;
+ centroid [1] = 0;
+ centroid [2] = 0;
+
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 8);
+
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 1;
+
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 4);
+
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 0;
+
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 8);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.push_back (8); // add the NaN
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [1] = 1;
+
+ EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 4);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, computeDemeanedCovariance)
+{
+ PointCloud<PointXYZ> cloud;
+ PointXYZ point;
+ std::vector <int> indices;
+ Eigen::Matrix3f covariance_matrix;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 0);
+
+ cloud.clear ();
+ indices.clear ();
+
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 8);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 4);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 8);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.push_back (8); // add the NaN
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+
+ EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 4);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, computeMeanAndCovariance)
+{
+ PointCloud<PointXYZ> cloud;
+ PointXYZ point;
+ std::vector <int> indices;
+ Eigen::Matrix3f covariance_matrix;
+ Eigen::Vector4f centroid;
+
+ // test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
+
+ // test empty cloud non_dense
+ cloud.is_dense = false;
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
+
+ // test non-empty cloud non_dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 0);
+
+ cloud.clear ();
+ indices.clear ();
+
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
+
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = -100;
+ centroid [1] = -101;
+ centroid [2] = -102;
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 8);
+
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.resize (4); // only positive y values
+ indices [0] = 2;
+ indices [1] = 3;
+ indices [2] = 6;
+ indices [3] = 7;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = -100;
+ centroid [1] = -101;
+ centroid [2] = -102;
+
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 4);
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 1);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = -100;
+ centroid [1] = -101;
+ centroid [2] = -102;
+
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 8);
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 0);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 1);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+
+ indices.push_back (8); // add the NaN
+ covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
+ centroid [0] = -100;
+ centroid [1] = -101;
+ centroid [2] = -102;
+
+ EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 4);
+ EXPECT_EQ (centroid [0], 0);
+ EXPECT_EQ (centroid [1], 1);
+ EXPECT_EQ (centroid [2], 0);
+ EXPECT_EQ (covariance_matrix (0, 0), 1);
+ EXPECT_EQ (covariance_matrix (0, 1), 0);
+ EXPECT_EQ (covariance_matrix (0, 2), 0);
+ EXPECT_EQ (covariance_matrix (1, 0), 0);
+ EXPECT_EQ (covariance_matrix (1, 1), 0);
+ EXPECT_EQ (covariance_matrix (1, 2), 0);
+ EXPECT_EQ (covariance_matrix (2, 0), 0);
+ EXPECT_EQ (covariance_matrix (2, 1), 0);
+ EXPECT_EQ (covariance_matrix (2, 2), 1);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, CentroidPoint)
+{
+ PointXYZ p1; p1.getVector3fMap () << 1, 2, 3;
+ PointXYZ p2; p2.getVector3fMap () << 3, 2, 1;
+ PointXYZ p3; p3.getVector3fMap () << 5, 5, 5;
+
+ // Zero points (get should have no effect)
+ {
+ CentroidPoint<PointXYZ> centroid;
+ PointXYZ c (100, 100, 100);
+ centroid.get (c);
+ EXPECT_XYZ_EQ (PointXYZ (100, 100, 100), c);
+ }
+ // Single point
+ {
+ CentroidPoint<PointXYZ> centroid;
+ centroid.add (p1);
+ PointXYZ c;
+ centroid.get (c);
+ EXPECT_XYZ_EQ (p1, c);
+ }
+ // Multiple points
+ {
+ CentroidPoint<PointXYZ> centroid;
+ centroid.add (p1);
+ centroid.add (p2);
+ centroid.add (p3);
+ PointXYZ c;
+ centroid.get (c);
+ EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c);
+ }
+
+ // Retrieve centroid into a different point type
+ {
+ CentroidPoint<PointXYZ> centroid;
+ centroid.add (p1);
+ PointXYZRGB c; c.rgba = 0x00FFFFFF;
+ centroid.get (c);
+ EXPECT_XYZ_EQ (p1, c);
+ EXPECT_EQ (0x00FFFFFF, c.rgba);
+ }
+
+ // Centroid with XYZ and RGB
+ {
+ PointXYZRGB cp1; cp1.getVector3fMap () << 4, 2, 4; cp1.rgba = 0xFF330000;
+ PointXYZRGB cp2; cp2.getVector3fMap () << 2, 4, 2; cp2.rgba = 0xFF003300;
+ PointXYZRGB cp3; cp3.getVector3fMap () << 3, 3, 3; cp3.rgba = 0xFF000033;
+ CentroidPoint<PointXYZRGB> centroid;
+ centroid.add (cp1);
+ centroid.add (cp2);
+ centroid.add (cp3);
+ PointXYZRGB c;
+ centroid.get (c);
+ EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c);
+ EXPECT_EQ (0xFF111111, c.rgba);
+ }
+
+ // Centroid with normal and curavture
+ {
+ Normal np1; np1.getNormalVector4fMap () << 1, 0, 0, 0; np1.curvature = 0.2;
+ Normal np2; np2.getNormalVector4fMap () << -1, 0, 0, 0; np2.curvature = 0.1;
+ Normal np3; np3.getNormalVector4fMap () << 0, 1, 0, 0; np3.curvature = 0.9;
+ CentroidPoint<Normal> centroid;
+ centroid.add (np1);
+ centroid.add (np2);
+ centroid.add (np3);
+ Normal c;
+ centroid.get (c);
+ EXPECT_NORMAL_EQ (np3, c);
+ EXPECT_FLOAT_EQ (0.4, c.curvature);
+ }
+
+ // Centroid with XYZ and intensity
+ {
+ PointXYZI ip1; ip1.getVector3fMap () << 1, 2, 3; ip1.intensity = 0.8;
+ PointXYZI ip2; ip2.getVector3fMap () << 3, 2, 1; ip2.intensity = 0.2;
+ PointXYZI ip3; ip3.getVector3fMap () << 5, 5, 5; ip3.intensity = 0.2;
+ CentroidPoint<PointXYZI> centroid;
+ centroid.add (ip1);
+ centroid.add (ip2);
+ centroid.add (ip3);
+ PointXYZI c;
+ centroid.get (c);
+ EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c);
+ EXPECT_FLOAT_EQ (0.4, c.intensity);
+ }
+
+ // Centroid with label
+ {
+ Label lp1; lp1.label = 1;
+ Label lp2; lp2.label = 1;
+ Label lp3; lp3.label = 2;
+ CentroidPoint<Label> centroid;
+ centroid.add (lp1);
+ centroid.add (lp2);
+ centroid.add (lp3);
+ Label c;
+ centroid.get (c);
+ EXPECT_EQ (1, c.label);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, computeCentroid)
+{
+ std::vector<int> indices;
+ PointXYZI point;
+ PointCloud<PointXYZI> cloud;
+ PointXYZINormal centroid;
+
+ // Test empty cloud which is dense
+ cloud.is_dense = true;
+ EXPECT_EQ (0, computeCentroid (cloud, centroid));
+
+ // Test empty cloud which is not dense
+ cloud.is_dense = false;
+ EXPECT_EQ (0, computeCentroid (cloud, centroid));
+
+ // Test non-empty cloud which is not dense
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ EXPECT_EQ (0, computeCentroid (cloud, centroid));
+
+ // Test non-empty cloud which is not dense (with indices)
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ indices.push_back (1);
+ EXPECT_EQ (0, computeCentroid (cloud, indices, centroid));
+
+ cloud.clear ();
+ indices.clear ();
+ for (point.x = -1; point.x < 2; point.x += 2)
+ {
+ for (point.y = -1; point.y < 2; point.y += 2)
+ {
+ for (point.z = -1; point.z < 2; point.z += 2)
+ {
+ point.intensity = point.y;
+ cloud.push_back (point);
+ }
+ }
+ }
+ cloud.is_dense = true;
+
+ // Eight points with (0, 0, 0) as centroid
+ centroid.x = -100;
+ centroid.y = -200;
+ centroid.z = -300;
+ centroid.intensity = -400;
+ centroid.curvature = -500;
+
+ EXPECT_EQ (8, computeCentroid (cloud, centroid));
+ EXPECT_FLOAT_EQ (0, centroid.x);
+ EXPECT_FLOAT_EQ (0, centroid.y);
+ EXPECT_FLOAT_EQ (0, centroid.z);
+ EXPECT_FLOAT_EQ (0, centroid.intensity);
+ EXPECT_FLOAT_EQ (-500, centroid.curvature);
+
+ centroid.x = -100;
+ centroid.y = -200;
+ centroid.z = -300;
+ centroid.intensity = -400;
+ centroid.curvature = -500;
+
+ // Only positive y values
+ indices.resize (4);
+ indices[0] = 2;
+ indices[1] = 3;
+ indices[2] = 6;
+ indices[3] = 7;
+ EXPECT_EQ (4, computeCentroid (cloud, indices, centroid));
+
+ EXPECT_FLOAT_EQ (0, centroid.x);
+ EXPECT_FLOAT_EQ (1, centroid.y);
+ EXPECT_FLOAT_EQ (0, centroid.z);
+ EXPECT_FLOAT_EQ (1, centroid.intensity);
+ EXPECT_FLOAT_EQ (-500, centroid.curvature);
+
+ point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
+ cloud.push_back (point);
+ cloud.is_dense = false;
+
+ centroid.x = -100;
+ centroid.y = -200;
+ centroid.z = -300;
+ centroid.intensity = -400;
+ centroid.curvature = -500;
+
+ EXPECT_EQ (8, computeCentroid (cloud, centroid));
+
+ EXPECT_FLOAT_EQ (0, centroid.x);
+ EXPECT_FLOAT_EQ (0, centroid.y);
+ EXPECT_FLOAT_EQ (0, centroid.z);
+ EXPECT_FLOAT_EQ (0, centroid.intensity);
+ EXPECT_FLOAT_EQ (-500, centroid.curvature);
+
+ centroid.x = -100;
+ centroid.y = -200;
+ centroid.z = -300;
+ centroid.intensity = -400;
+ centroid.curvature = -500;
+
+ indices.push_back (8); // add the NaN
+ EXPECT_EQ (4, computeCentroid (cloud, indices, centroid));
+
+ EXPECT_FLOAT_EQ (0, centroid.x);
+ EXPECT_FLOAT_EQ (1, centroid.y);
+ EXPECT_FLOAT_EQ (0, centroid.z);
+ EXPECT_FLOAT_EQ (1, centroid.intensity);
+ EXPECT_FLOAT_EQ (-500, centroid.curvature);
+}
+
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, Intersections)
-{
- Eigen::VectorXf zline (6), yline (6);
- zline[0] = 0.543892f; zline[1] = -0.515623f; zline[2] = 1.321f; zline[3] = 0.0266191f; zline[4] = 0.600215f; zline[5] = -0.0387667f;
- yline[0] = 0.493479f; yline[1] = 0.169246f; yline[2] = 1.22677f; yline[3] = 0.5992f; yline[4] = 0.0505085f; yline[5] = 0.405749f;
- Eigen::Vector4f pt;
- EXPECT_EQ ((pcl::lineWithLineIntersection (zline, yline, pt)), true);
- EXPECT_NEAR (pt[0], 0.574544, 1e-3);
- EXPECT_NEAR (pt[1], 0.175526, 1e-3);
- EXPECT_NEAR (pt[2], 1.27636, 1e-3);
- EXPECT_EQ (pt[3], 0);
-
- zline << 0.545203f, -0.514419f, 1.31967f, 0.0243372f, 0.597946f, -0.0413579f;
- yline << 0.492706f, 0.164196f, 1.23192f, 0.598704f, 0.0442014f, 0.411328f;
- EXPECT_EQ ((pcl::lineWithLineIntersection (zline, yline, pt)), false);
- //intersection: [ 3.06416e+08 15.2237 3.06416e+08 4.04468e-34 ]
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, compute3DCentroidFloat)
+template <typename T> class XYZPointTypesTest : public ::testing::Test { };
+typedef ::testing::Types<BOOST_PP_SEQ_ENUM(PCL_XYZ_POINT_TYPES)> XYZPointTypes;
+TYPED_TEST_CASE(XYZPointTypesTest, XYZPointTypes);
+TYPED_TEST(XYZPointTypesTest, GetVectorXfMap)
{
- pcl::PointIndices pindices;
- std::vector<int> indices;
- PointXYZ point;
- PointCloud<PointXYZ> cloud;
- Eigen::Vector4f centroid;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 0);
-
- cloud.clear ();
- indices.clear ();
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
-
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
-
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- indices.push_back (8); // add the NaN
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
-
- pindices.indices = indices;
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, compute3DCentroidDouble)
-{
- pcl::PointIndices pindices;
- std::vector<int> indices;
- PointXYZ point;
- PointCloud<PointXYZ> cloud;
- Eigen::Vector4d centroid;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 0);
-
- cloud.clear ();
- indices.clear ();
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
-
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- EXPECT_EQ (compute3DCentroid (cloud, centroid), 8);
-
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
-
- centroid [0] = -100;
- centroid [1] = -200;
- centroid [2] = -300;
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- indices.push_back (8); // add the NaN
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
-
- pindices.indices = indices;
- EXPECT_EQ (compute3DCentroid (cloud, indices, centroid), 4);
-
- EXPECT_EQ (centroid [0], 0.0);
- EXPECT_EQ (centroid [1], 1.0);
- EXPECT_EQ (centroid [2], 0.0);
+ TypeParam pt;
+ for (size_t i = 0; i < 3; ++i)
+ EXPECT_EQ (&pt.data[i], &pt.getVector3fMap () (i));
+ for (size_t i = 0; i < 4; ++i)
+ EXPECT_EQ (&pt.data[i], &pt.getVector4fMap () (i));
}
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, compute3DCentroidCloudIterator)
+TYPED_TEST(XYZPointTypesTest, GetArrayXfMap)
{
- pcl::PointIndices pindices;
- std::vector<int> indices;
- PointXYZ point;
- PointCloud<PointXYZ> cloud;
- Eigen::Vector4f centroid_f;
-
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
-
- ConstCloudIterator<PointXYZ> it (cloud, indices);
-
- EXPECT_EQ (compute3DCentroid (it, centroid_f), 4);
-
- EXPECT_EQ (centroid_f[0], 0.0f);
- EXPECT_EQ (centroid_f[1], 1.0f);
- EXPECT_EQ (centroid_f[2], 0.0f);
-
- Eigen::Vector4d centroid_d;
- it.reset ();
- EXPECT_EQ (compute3DCentroid (it, centroid_d), 4);
-
- EXPECT_EQ (centroid_d[0], 0.0);
- EXPECT_EQ (centroid_d[1], 1.0);
- EXPECT_EQ (centroid_d[2], 0.0);
+ TypeParam pt;
+ for (size_t i = 0; i < 3; ++i)
+ EXPECT_EQ (&pt.data[i], &pt.getArray3fMap () (i));
+ for (size_t i = 0; i < 4; ++i)
+ EXPECT_EQ (&pt.data[i], &pt.getArray4fMap () (i));
}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, computeCovarianceMatrix)
+template <typename T> class NormalPointTypesTest : public ::testing::Test { };
+typedef ::testing::Types<BOOST_PP_SEQ_ENUM(PCL_NORMAL_POINT_TYPES)> NormalPointTypes;
+TYPED_TEST_CASE(NormalPointTypesTest, NormalPointTypes);
+TYPED_TEST(NormalPointTypesTest, GetNormalVectorXfMap)
{
- PointCloud<PointXYZ> cloud;
- PointXYZ point;
- std::vector <int> indices;
- Eigen::Vector4f centroid;
- Eigen::Matrix3f covariance_matrix;
-
- centroid [0] = 0;
- centroid [1] = 0;
- centroid [2] = 0;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 0);
-
- cloud.clear ();
- indices.clear ();
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
-
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = 0;
- centroid [1] = 0;
- centroid [2] = 0;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 8);
- EXPECT_EQ (covariance_matrix (0, 0), 8);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 8);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 8);
-
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 1;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 4);
- EXPECT_EQ (covariance_matrix (0, 0), 4);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 4);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 0;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, centroid, covariance_matrix), 8);
- EXPECT_EQ (covariance_matrix (0, 0), 8);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 8);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 8);
-
- indices.push_back (8); // add the NaN
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 1;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, centroid, covariance_matrix), 4);
- EXPECT_EQ (covariance_matrix (0, 0), 4);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 4);
+ TypeParam pt;
+ for (size_t i = 0; i < 3; ++i)
+ EXPECT_EQ (&pt.data_n[i], &pt.getNormalVector3fMap () (i));
+ for (size_t i = 0; i < 4; ++i)
+ EXPECT_EQ (&pt.data_n[i], &pt.getNormalVector4fMap () (i));
}
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, computeCovarianceMatrixNormalized)
+template <typename T> class RGBPointTypesTest : public ::testing::Test { };
+typedef ::testing::Types<BOOST_PP_SEQ_ENUM(PCL_RGB_POINT_TYPES)> RGBPointTypes;
+TYPED_TEST_CASE(RGBPointTypesTest, RGBPointTypes);
+TYPED_TEST(RGBPointTypesTest, GetRGBVectorXi)
{
- PointCloud<PointXYZ> cloud;
- PointXYZ point;
- std::vector <int> indices;
- Eigen::Vector4f centroid;
- Eigen::Matrix3f covariance_matrix;
-
- centroid [0] = 0;
- centroid [1] = 0;
- centroid [2] = 0;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 0);
-
- cloud.clear ();
- indices.clear ();
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
-
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = 0;
- centroid [1] = 0;
- centroid [2] = 0;
-
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 8);
-
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 1;
-
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 4);
-
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 0;
-
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, centroid, covariance_matrix), 8);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.push_back (8); // add the NaN
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [1] = 1;
-
- EXPECT_EQ (computeCovarianceMatrixNormalized (cloud, indices, centroid, covariance_matrix), 4);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
+ TypeParam pt; pt.r = 1; pt.g = 2; pt.b = 3; pt.a = 4;
+ EXPECT_EQ (pt.r, pt.getRGBVector3i () (0));
+ EXPECT_EQ (pt.g, pt.getRGBVector3i () (1));
+ EXPECT_EQ (pt.b, pt.getRGBVector3i () (2));
+ EXPECT_EQ (pt.r, pt.getRGBVector4i () (0));
+ EXPECT_EQ (pt.g, pt.getRGBVector4i () (1));
+ EXPECT_EQ (pt.b, pt.getRGBVector4i () (2));
+ EXPECT_EQ (pt.a, pt.getRGBVector4i () (3));
+ EXPECT_EQ (pt.r, pt.getRGBAVector4i () (0));
+ EXPECT_EQ (pt.g, pt.getRGBAVector4i () (1));
+ EXPECT_EQ (pt.b, pt.getRGBAVector4i () (2));
+ EXPECT_EQ (pt.a, pt.getRGBAVector4i () (3));
}
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, computeDemeanedCovariance)
+TYPED_TEST(RGBPointTypesTest, GetBGRVectorXcMap)
{
- PointCloud<PointXYZ> cloud;
- PointXYZ point;
- std::vector <int> indices;
- Eigen::Matrix3f covariance_matrix;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 0);
-
- cloud.clear ();
- indices.clear ();
-
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
-
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 8);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 4);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, covariance_matrix), 8);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.push_back (8); // add the NaN
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
-
- EXPECT_EQ (computeCovarianceMatrix (cloud, indices, covariance_matrix), 4);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
+ TypeParam pt;
+ EXPECT_EQ (&pt.b, &pt.getBGRVector3cMap () (0));
+ EXPECT_EQ (&pt.g, &pt.getBGRVector3cMap () (1));
+ EXPECT_EQ (&pt.r, &pt.getBGRVector3cMap () (2));
+ EXPECT_EQ (&pt.b, &pt.getBGRAVector4cMap () (0));
+ EXPECT_EQ (&pt.g, &pt.getBGRAVector4cMap () (1));
+ EXPECT_EQ (&pt.r, &pt.getBGRAVector4cMap () (2));
+ EXPECT_EQ (&pt.a, &pt.getBGRAVector4cMap () (3));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (PCL, computeMeanAndCovariance)
+TEST (PCL, Intersections)
{
- PointCloud<PointXYZ> cloud;
- PointXYZ point;
- std::vector <int> indices;
- Eigen::Matrix3f covariance_matrix;
- Eigen::Vector4f centroid;
-
- // test empty cloud which is dense
- cloud.is_dense = true;
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
-
- // test empty cloud non_dense
- cloud.is_dense = false;
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 0);
-
- // test non-empty cloud non_dense
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- indices.push_back (1);
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 0);
+ Eigen::VectorXf zline (6), yline (6);
+ zline[0] = 0.543892f; zline[1] = -0.515623f; zline[2] = 1.321f; zline[3] = 0.0266191f; zline[4] = 0.600215f; zline[5] = -0.0387667f;
+ yline[0] = 0.493479f; yline[1] = 0.169246f; yline[2] = 1.22677f; yline[3] = 0.5992f; yline[4] = 0.0505085f; yline[5] = 0.405749f;
- cloud.clear ();
- indices.clear ();
+ Eigen::Vector4f pt;
+ EXPECT_EQ ((pcl::lineWithLineIntersection (zline, yline, pt)), true);
+ EXPECT_NEAR (pt[0], 0.574544, 1e-3);
+ EXPECT_NEAR (pt[1], 0.175526, 1e-3);
+ EXPECT_NEAR (pt[2], 1.27636, 1e-3);
+ EXPECT_EQ (pt[3], 0);
- for (point.x = -1; point.x < 2; point.x += 2)
- {
- for (point.y = -1; point.y < 2; point.y += 2)
- {
- for (point.z = -1; point.z < 2; point.z += 2)
- {
- cloud.push_back (point);
- }
- }
- }
- cloud.is_dense = true;
-
- // eight points with (0, 0, 0) as centroid and covarmat (1, 0, 0, 0, 1, 0, 0, 0, 1)
-
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = -100;
- centroid [1] = -101;
- centroid [2] = -102;
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 8);
-
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.resize (4); // only positive y values
- indices [0] = 2;
- indices [1] = 3;
- indices [2] = 6;
- indices [3] = 7;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = -100;
- centroid [1] = -101;
- centroid [2] = -102;
-
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 4);
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 1);
- EXPECT_EQ (centroid [2], 0);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- point.x = point.y = point.z = std::numeric_limits<float>::quiet_NaN ();
- cloud.push_back (point);
- cloud.is_dense = false;
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = -100;
- centroid [1] = -101;
- centroid [2] = -102;
-
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, covariance_matrix, centroid), 8);
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 0);
- EXPECT_EQ (centroid [2], 0);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 1);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
-
- indices.push_back (8); // add the NaN
- covariance_matrix << -100, -101, -102, -110, -111, -112, -120, -121, -122;
- centroid [0] = -100;
- centroid [1] = -101;
- centroid [2] = -102;
-
- EXPECT_EQ (computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, centroid), 4);
- EXPECT_EQ (centroid [0], 0);
- EXPECT_EQ (centroid [1], 1);
- EXPECT_EQ (centroid [2], 0);
- EXPECT_EQ (covariance_matrix (0, 0), 1);
- EXPECT_EQ (covariance_matrix (0, 1), 0);
- EXPECT_EQ (covariance_matrix (0, 2), 0);
- EXPECT_EQ (covariance_matrix (1, 0), 0);
- EXPECT_EQ (covariance_matrix (1, 1), 0);
- EXPECT_EQ (covariance_matrix (1, 2), 0);
- EXPECT_EQ (covariance_matrix (2, 0), 0);
- EXPECT_EQ (covariance_matrix (2, 1), 0);
- EXPECT_EQ (covariance_matrix (2, 2), 1);
+ zline << 0.545203f, -0.514419f, 1.31967f, 0.0243372f, 0.597946f, -0.0413579f;
+ yline << 0.492706f, 0.164196f, 1.23192f, 0.598704f, 0.0442014f, 0.411328f;
+ EXPECT_EQ ((pcl::lineWithLineIntersection (zline, yline, pt)), false);
+ //intersection: [ 3.06416e+08 15.2237 3.06416e+08 4.04468e-34 ]
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EXPECT_FALSE (status);
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, HasField)
+{
+ // has_field
+ EXPECT_TRUE ((pcl::traits::has_field<pcl::Normal, pcl::fields::curvature>::value));
+ EXPECT_FALSE ((pcl::traits::has_field<pcl::PointXYZ, pcl::fields::curvature>::value));
+ // has_all_fields
+ EXPECT_TRUE ((pcl::traits::has_all_fields<pcl::PointXYZRGB, boost::mpl::vector<pcl::fields::x, pcl::fields::rgb> >::value));
+ EXPECT_FALSE ((pcl::traits::has_all_fields<pcl::PointXYZ, boost::mpl::vector<pcl::fields::x, pcl::fields::rgb> >::value));
+ // has_any_field
+ EXPECT_TRUE ((pcl::traits::has_any_field<pcl::PointXYZ, boost::mpl::vector<pcl::fields::x, pcl::fields::normal_x> >::value));
+ EXPECT_TRUE ((pcl::traits::has_any_field<pcl::Normal, boost::mpl::vector<pcl::fields::x, pcl::fields::normal_x> >::value));
+ EXPECT_FALSE ((pcl::traits::has_any_field<pcl::RGB, boost::mpl::vector<pcl::fields::x, pcl::fields::normal_x> >::value));
+ // has_xyz
+ EXPECT_TRUE ((pcl::traits::has_xyz<pcl::PointXYZ>::value));
+ EXPECT_FALSE ((pcl::traits::has_xyz<pcl::Normal>::value));
+ // has_normal
+ EXPECT_TRUE ((pcl::traits::has_normal<pcl::PointNormal>::value));
+ EXPECT_FALSE ((pcl::traits::has_normal<pcl::PointXYZ>::value));
+ // has_curvature
+ EXPECT_TRUE ((pcl::traits::has_curvature<pcl::PointNormal>::value));
+ EXPECT_FALSE ((pcl::traits::has_curvature<pcl::RGB>::value));
+ // has_intensity
+ EXPECT_TRUE ((pcl::traits::has_intensity<pcl::PointXYZI>::value));
+ EXPECT_FALSE ((pcl::traits::has_intensity<pcl::PointXYZ>::value));
+ // has_color
+ EXPECT_TRUE ((pcl::traits::has_color<pcl::PointXYZRGB>::value));
+ EXPECT_TRUE ((pcl::traits::has_color<pcl::PointXYZRGBA>::value));
+ EXPECT_FALSE ((pcl::traits::has_color<pcl::PointXYZ>::value));
+ // has_label
+ EXPECT_TRUE ((pcl::traits::has_label<pcl::PointXYZL>::value));
+ EXPECT_FALSE ((pcl::traits::has_label<pcl::Normal>::value));
+}
+
/* ---[ */
int
main (int argc, char** argv)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2013, Open Perception, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/pcl_config.h>
+#include <pcl/pcl_tests.h>
+#include <pcl/point_cloud.h>
+#include <pcl/common/io.h>
+
+using namespace pcl;
+using namespace pcl::test;
+
+pcl::PointCloud<pcl::PointXYZ> cloud (64,48);
+int top = 2, bottom = 2, left = 2, right = 2;
+const pcl::PointXYZ constant (0, 0, 0);
+
+TEST (CopyPointCloud, constant)
+{
+ pcl::PointCloud<pcl::PointXYZ> dst (cloud.width + left + right, cloud.height + top + bottom);
+ pcl::copyPointCloud (cloud, dst, top, bottom, left, right, pcl::BORDER_CONSTANT, constant);
+
+ for (int j = 0; j < top; ++j)
+ for (int i = 0; i < dst.width; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), constant);
+
+ for (int j = top; j < cloud.height+top; ++j)
+ {
+ for (int i = 0; i < dst.width; ++i)
+ {
+ if (i < left)
+ EXPECT_XYZ_EQ (dst (i,j), constant);
+ else
+ {
+ if (i >= (cloud.width + left))
+ EXPECT_XYZ_EQ (dst (i,j), constant);
+ else
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i - left, j -top));
+ }
+ }
+ }
+
+ for (int j = cloud.height+top; j < dst.height; ++j)
+ for (int i = 0; i < dst.width; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), constant);
+}
+
+TEST (CopyPointCloud, replicate)
+{
+ pcl::PointCloud<pcl::PointXYZ> dst (cloud.width + left + right, cloud.height + top + bottom);
+ pcl::copyPointCloud (cloud, dst, top, bottom, left, right, pcl::BORDER_REPLICATE, constant);
+
+ for (int j = 0; j < top; ++j)
+ {
+ for (int i = 0; i < left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (0,0));
+ for (int i = left; i < cloud.width+left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i-left,0));
+ for (int i = cloud.width+left; i < dst.width; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (cloud.width-1,0));
+ }
+
+ for (int j = top; j < cloud.height+top; ++j)
+ {
+ for (int i = 0; i < dst.width; ++i)
+ {
+ if (i < left)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (0,j-top));
+ else
+ {
+ if (i >= (cloud.width + left))
+ EXPECT_XYZ_EQ (dst (i,j), cloud (cloud.width-1,j-top));
+ else
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i - left, j -top));
+ }
+ }
+ }
+
+ for (int j = cloud.height+top; j < dst.height; ++j)
+ {
+ for (int i = 0; i < left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (0,cloud.height-1));
+ for (int i = left; i < cloud.width+left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i-left,cloud.height-1));
+ for (int i = cloud.width+left; i < dst.width; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (cloud.width-1,cloud.height-1));
+ }
+}
+
+TEST (CopyPointCloud, reflect)
+{
+ pcl::PointCloud<pcl::PointXYZ> dst (cloud.width + left + right, cloud.height + top + bottom);
+ pcl::copyPointCloud (cloud, dst, top, bottom, left, right, pcl::BORDER_REFLECT, constant);
+
+ for (int j = 0, k = top-1; j < top; ++j,--k)
+ {
+ for (int i = 0, l = left-1; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, k));
+
+ for (int i = left; i < cloud.width+left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i-left,k));
+
+ for (int i = cloud.width+left, l = cloud.width-left; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, k));
+ }
+
+ for (int j = top; j < cloud.height+top; ++j)
+ {
+ for (int i = 0, l = left-1; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, j-top));
+
+ for (int i = left; i < cloud.width + left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i-left,j-top));
+
+ for (int i = cloud.width+left, l = cloud.width-left; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, j-top));
+ }
+
+ for (int j = cloud.height+top, k = cloud.height-1; j < top; ++j,--k)
+ {
+ for (int i = 0, l = left-1; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, k));
+
+ for (int i = left; i < cloud.width+left; ++i)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (i-left,k));
+
+ for (int i = cloud.width+left, l = cloud.width-left; i < left; ++i, --l)
+ EXPECT_XYZ_EQ (dst (i,j), cloud (l, k));
+ }
+}
+
+int
+main (int argc, char** argv)
+{
+ for (std::size_t i = 0, j = 10; i < cloud.size (); ++j, ++i)
+ cloud[i] = pcl::PointXYZ (j, j*10, j*100);
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include <pcl/common/copy_point.h>
+
+TEST (CopyPointTest, SameTypeWithoutColor)
+{
+ {
+ pcl::PointXYZ p1 (1, 2, 3), p2 (4, 5, 6);
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ }
+ {
+ pcl::Normal p1 (1, 2, 3), p2 (4, 5, 6);
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.normal_x, p2.normal_x);
+ EXPECT_FLOAT_EQ (p1.normal_y, p2.normal_y);
+ EXPECT_FLOAT_EQ (p1.normal_z, p2.normal_z);
+ }
+}
+
+TEST (CopyPointTest, SameTypeWithColor)
+{
+ {
+ pcl::PointXYZRGBA p1, p2;
+ p1.getVector3fMap () << 1, 2, 3; p1.rgba = 0xFF0000FF;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ }
+}
+
+TEST (CopyPointTest, DifferentTypesWithoutColor)
+{
+ {
+ pcl::PointXYZ p1 (1, 2, 3);
+ pcl::PointXYZL p2;
+ p2.getVector3fMap () << 4, 5, 5; p2.label = 1;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (1, p2.label);
+ }
+ {
+ pcl::PointXY p1; p1.x = 1; p1.y = 2;
+ pcl::PointWithRange p2; p2.getVector3fMap () << 4, 5, 6; p2.range = 8;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (6, p2.z);
+ EXPECT_FLOAT_EQ (8, p2.range);
+ }
+}
+
+TEST (CopyPointTest, DifferentTypesOneWithColorAnotherWithout)
+{
+ // Source without color
+ {
+ pcl::PointXYZ p1 (1, 2, 3);
+ pcl::PointXYZRGB p2;
+ p2.getVector3fMap () << 4, 5, 5; p2.rgba = 0xFFFF00;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (0xFFFF00, p2.rgba);
+ }
+ // Target without color
+ {
+ pcl::PointXYZRGBNormal p1; p1.getVector3fMap () << 1, 2, 3; p1.rgba = 0xFF0000;
+ pcl::PointWithRange p2; p2.getVector3fMap () << 4, 5, 6; p2.range = 8;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_FLOAT_EQ (8, p2.range);
+ }
+}
+
+TEST (CopyPointTest, DifferentTypesWithDifferentColor)
+{
+ {
+ pcl::RGB p1;
+ pcl::PointXYZRGB p2; p2.getVector3fMap () << 4, 5, 6; p2.r = 7; p2.g = 8; p2.b = 9, p2.a = 10;
+ pcl::copyPoint (p1, p2);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ EXPECT_FLOAT_EQ (4, p2.x);
+ EXPECT_FLOAT_EQ (5, p2.y);
+ EXPECT_FLOAT_EQ (6, p2.z);
+ }
+ {
+ pcl::PointXYZRGBNormal p1; p1.getVector3fMap () << 1, 2, 3; p1.r = 7; p1.g = 8; p1.b = 9;
+ pcl::PointXYZRGBL p2; p2.getVector3fMap () << 4, 5, 6; p2.r = 3; p2.g = 2; p2.b = 1; p2.label = 8;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ EXPECT_EQ (8, p2.label);
+ }
+ {
+ pcl::PointXYZRGBA p1; p1.getVector3fMap () << 1, 2, 3; p1.rgba = 0xFF00FF;
+ pcl::PointXYZRGB p2; p2.getVector3fMap () << 4, 5, 6; p2.rgba = 0x00FF00;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ }
+}
+
+TEST (CopyPointTest, DifferentTypesWithSameColor)
+{
+ {
+ pcl::RGB p1;
+ pcl::PointXYZRGBA p2; p2.getVector3fMap () << 4, 5, 6; p2.r = 7; p2.g = 8; p2.b = 9, p2.a = 10;
+ pcl::copyPoint (p1, p2);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ EXPECT_FLOAT_EQ (4, p2.x);
+ EXPECT_FLOAT_EQ (5, p2.y);
+ EXPECT_FLOAT_EQ (6, p2.z);
+ }
+ {
+ pcl::PointXYZRGBNormal p1; p1.getVector3fMap () << 1, 2, 3; p1.r = 7; p1.g = 8; p1.b = 9;
+ pcl::PointXYZRGB p2; p2.getVector3fMap () << 4, 5, 6; p2.r = 3; p2.g = 2; p2.b = 1;
+ pcl::copyPoint (p1, p2);
+ EXPECT_FLOAT_EQ (p1.x, p2.x);
+ EXPECT_FLOAT_EQ (p1.y, p2.y);
+ EXPECT_FLOAT_EQ (p1.z, p2.z);
+ EXPECT_EQ (p1.rgba, p2.rgba);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ try
+ {
+ ::testing::InitGoogleTest (&argc, argv);
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ return RUN_ALL_TESTS ();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Unhandled exception: " << e.what () << "\n";
+ }
+ return 1;
+}
+
r_matrix.coeffRef (6) = r_matrix.coeffRef (2);
r_matrix.coeffRef (7) = r_matrix.coeffRef (5);
c_matrix = r_matrix;
-// c_matrix.coeffRef (3) = c_matrix.coeffRef (1);
-// c_matrix.coeffRef (6) = c_matrix.coeffRef (2);
-// c_matrix.coeffRef (7) = c_matrix.coeffRef (5);
+ //c_matrix.coeffRef (3) = c_matrix.coeffRef (1);
+ //c_matrix.coeffRef (6) = c_matrix.coeffRef (2);
+ //c_matrix.coeffRef (7) = c_matrix.coeffRef (5);
// test row-major -> row-major
determinant = invert3x3SymMatrix (r_matrix, r_inverse);
r_matrix.coeffRef (6) = r_matrix.coeffRef (2);
r_matrix.coeffRef (7) = r_matrix.coeffRef (5);
c_matrix = r_matrix;
-// c_matrix.coeffRef (3) = c_matrix.coeffRef (1);
-// c_matrix.coeffRef (6) = c_matrix.coeffRef (2);
-// c_matrix.coeffRef (7) = c_matrix.coeffRef (5);
+ //c_matrix.coeffRef (3) = c_matrix.coeffRef (1);
+ //c_matrix.coeffRef (6) = c_matrix.coeffRef (2);
+ //c_matrix.coeffRef (7) = c_matrix.coeffRef (5);
// test row-major -> row-major
determinant = invert3x3SymMatrix (r_matrix, r_inverse);
unsigned test_case = rand_uint () % 10;
- Scalar val1 = Scalar (rand_double ());
- Scalar val2 = Scalar (rand_double ());
+ Scalar val1 = Scalar (rand_double ());
+ Scalar val2 = Scalar (rand_double ());
// 10% of test cases include equal eigenvalues
if (test_case == 0)
}
eigenvalues (0, 0) = val1;
eigenvalues (1, 1) = val2;
- matrix = eigenvectors * eigenvalues * eigenvectors.adjoint();
+ matrix = eigenvectors * eigenvalues * eigenvectors.adjoint();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned test_case = rand_uint ();
- Scalar val1 = Scalar (rand_double ());
- Scalar val2 = Scalar (rand_double ());
- Scalar val3 = Scalar (rand_double ());
+ Scalar val1 = Scalar (rand_double ());
+ Scalar val2 = Scalar (rand_double ());
+ Scalar val3 = Scalar (rand_double ());
// 1%: all three values are equal and non-zero
if (test_case == 0)
eigenvalues (1, 1) = val2;
eigenvalues (2, 2) = val3;
- matrix = eigenvectors * eigenvalues * eigenvectors.adjoint();
+ matrix = eigenvectors * eigenvalues * eigenvectors.adjoint();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EXPECT_LE (float(r_fail_count) / float(iterations), 0.01);
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, transformLine)
+{
+ // This also tests transformPoint and transformVector
+ Eigen::VectorXf line;
+ Eigen::VectorXd lined, test;
+ line.resize(6);
+ lined.resize(6);
+ test.resize(6);
+ double tolerance = 1e-7;
+
+ // Simple translation
+ Eigen::Affine3f transformation = Eigen::Affine3f::Identity ();
+ Eigen::Affine3d transformationd = Eigen::Affine3d::Identity ();
+ transformation.translation() << 1, -2, 0;
+ transformationd.translation() << 1, -2, 0;
+ line << 1, 2, 3, 0, 1, 0;
+ lined << 1, 2, 3, 0, 1, 0;
+ test << 2, 0, 3, 0, 1, 0;
+
+ EXPECT_TRUE (pcl::transformLine (line, line, transformation));
+ EXPECT_TRUE (pcl::transformLine (lined, lined, transformationd));
+ for (int i = 0; i < 6; i++)
+ {
+ EXPECT_NEAR (line[i], test[i], tolerance);
+ EXPECT_NEAR (lined[i], test[i], tolerance);
+ }
+
+ // Simple rotation
+ transformation = Eigen::Affine3f::Identity ();
+ transformationd = Eigen::Affine3d::Identity ();
+ transformation.linear() = (Eigen::Matrix3f) Eigen::AngleAxisf(M_PI/2, Eigen::Vector3f::UnitZ());
+ transformationd.linear() = (Eigen::Matrix3d) Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d::UnitZ());
+
+ line << 1, 2, 3, 0, 1, 0;
+ lined << 1, 2, 3, 0, 1, 0;
+ test << -2, 1, 3, -1, 0, 0;
+ tolerance = 1e-4;
+
+ EXPECT_TRUE (pcl::transformLine (line, line, transformation));
+ EXPECT_TRUE (pcl::transformLine (lined, lined, transformationd));
+ for (int i = 0; i < 6; i++)
+ {
+ EXPECT_NEAR (line[i], test[i], tolerance);
+ EXPECT_NEAR (lined[i], test[i], tolerance);
+ }
+
+ // Random transformation
+ transformation = Eigen::Affine3f::Identity ();
+ transformationd = Eigen::Affine3d::Identity ();
+ transformation.translation() << 25.97, -2.45, 0.48941;
+ transformationd.translation() << 25.97, -2.45, 0.48941;
+ transformation.linear() = (Eigen::Matrix3f) Eigen::AngleAxisf(M_PI/5, Eigen::Vector3f::UnitX())
+ * Eigen::AngleAxisf(M_PI/3, Eigen::Vector3f::UnitY());
+ transformationd.linear() = (Eigen::Matrix3d) Eigen::AngleAxisd(M_PI/5, Eigen::Vector3d::UnitX())
+ * Eigen::AngleAxisd(M_PI/3, Eigen::Vector3d::UnitY());
+
+ line << -1, 9, 3, 1.5, 2.0, 0.2;
+ lined << -1, 9, 3, 1.5, 2.0, 0.2;
+ test << 28.0681, 3.44044, 7.69363, 0.923205, 2.32281, 0.205528;
+ tolerance = 1e-3;
+
+ EXPECT_TRUE (pcl::transformLine (line, line, transformation));
+ EXPECT_TRUE (pcl::transformLine (lined, lined, transformationd));
+ for (int i = 0; i < 6; i++)
+ {
+ EXPECT_NEAR (line[i], test[i], tolerance);
+ EXPECT_NEAR (lined[i], test[i], tolerance);
+ }
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, transformPlane)
+{
+ Eigen::Vector4d test;
+ double tolerance = 1e-8;
+ pcl::ModelCoefficients::Ptr plane (new pcl::ModelCoefficients);
+ plane->values.resize(4);
+ plane->values[0] = 1.0;
+ plane->values[1] = 0.0;
+ plane->values[2] = 0.0;
+ plane->values[3] = -2.0;
+
+ // Simple translation
+ Eigen::Affine3f transformation = Eigen::Affine3f::Identity ();
+ Eigen::Affine3d transformationd = Eigen::Affine3d::Identity ();
+ transformation.translation() << 1, 0, 0;
+ transformationd.translation() << 1, 0, 0;
+ test << 1, 0, 0, -3;
+
+ pcl::transformPlane (plane, plane, transformation);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+
+ plane->values[0] = 1.0;
+ plane->values[1] = 0.0;
+ plane->values[2] = 0.0;
+ plane->values[3] = -2.0;
+ pcl::transformPlane (plane, plane, transformationd);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+
+ // Simple rotation
+ transformation.translation() << 0, 0, 0;
+ transformationd.translation() << 0, 0, 0;
+ transformation.linear() = (Eigen::Matrix3f) Eigen::AngleAxisf(M_PI/2, Eigen::Vector3f::UnitZ());
+ transformationd.linear() = (Eigen::Matrix3d) Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d::UnitZ());
+ test << 0, 1, 0, -2;
+ tolerance = 1e-6;
+
+ plane->values[0] = 1.0;
+ plane->values[1] = 0.0;
+ plane->values[2] = 0.0;
+ plane->values[3] = -2.0;
+ pcl::transformPlane (plane, plane, transformation);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+
+ plane->values[0] = 1.0;
+ plane->values[1] = 0.0;
+ plane->values[2] = 0.0;
+ plane->values[3] = -2.0;
+ pcl::transformPlane (plane, plane, transformationd);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+
+ // Random transformation
+ transformation.translation() << 12.5, -5.4, 0.1;
+ transformationd.translation() << 12.5, -5.4, 0.1;
+ transformation.linear() = (Eigen::Matrix3f) Eigen::AngleAxisf(M_PI/7, Eigen::Vector3f::UnitY())
+ * Eigen::AngleAxisf(M_PI/4, Eigen::Vector3f::UnitZ());
+ transformationd.linear() = (Eigen::Matrix3d) Eigen::AngleAxisd(M_PI/7, Eigen::Vector3d::UnitY())
+ * Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ());
+ test << 5.35315, 2.89914, 0.196848, -49.2788;
+ tolerance = 1e-4;
+
+ plane->values[0] = 5.4;
+ plane->values[1] = -1.3;
+ plane->values[2] = 2.5;
+ plane->values[3] = 2.0;
+ pcl::transformPlane (plane, plane, transformation);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+
+ plane->values[0] = 5.4;
+ plane->values[1] = -1.3;
+ plane->values[2] = 2.5;
+ plane->values[3] = 2.0;
+ pcl::transformPlane (plane, plane, transformationd);
+ for (int i = 0; i < 4; i++)
+ EXPECT_NEAR (plane->values[i], test[i], tolerance);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, checkCoordinateSystem)
+{
+ Eigen::VectorXd line_x, line_y;
+ Eigen::VectorXd line_xd, line_yd;
+ line_x.resize(6); line_y.resize(6);
+ line_xd.resize(6); line_yd.resize(6);
+
+ Eigen::Vector3d origin, vector_x, vector_y;
+ Eigen::Vector3d origind, vector_xd, vector_yd;
+
+ // No translation, no rotation coordinate system
+ line_x << 0, 0, 0, 0, 1, 0;// Y
+ line_y << 0, 0, 0, 0, 0, 1;// Z
+ line_xd << 0, 0, 0, 0, 1, 0;
+ line_yd << 0, 0, 0, 0, 0, 1;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_x, line_y ));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_xd, line_yd));
+
+ origin << 0, 0, 0;
+ vector_x << 0, 1, 0;// Y
+ vector_y << 0, 0, 1;// Z
+ origind << 0, 0, 0;
+ vector_xd << 0, 1, 0;
+ vector_yd << 0, 0, 1;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origin, vector_x, vector_y ));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origind, vector_xd, vector_yd));
+
+ // Simple translated coordinate system
+ line_x << 10, -1, 0, 1, 0, 0;// X
+ line_y << 10, -1, 0, 0, 1, 0;// Y
+ line_xd << 10, -1, 0, 1, 0, 0;
+ line_yd << 10, -1, 0, 0, 1, 0;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_x, line_y ));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_xd, line_yd));
+
+ origin << 10, -1, 0;
+ vector_x << 1, 0, 0;
+ vector_y << 0, 1, 0;
+ origind << 10, -1, 0;
+ vector_xd << 1, 0, 0;
+ vector_yd << 0, 1, 0;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origin, vector_x, vector_y ));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origind, vector_xd, vector_yd));
+
+ // General coordinate system
+ line_x << 1234.56, 0.0, 0.0, 0.00387281179, 0.00572064891, -0.999976099;
+ line_y << 1234.56, 0.0, 0.0, 0.6113801, -0.79133445, -0.00202810019;
+ line_xd << 1234.56, 0.0, 0.0, 0.00387281179, 0.00572064891, -0.999976099;
+ line_yd << 1234.56, 0.0, 0.0, 0.6113801, -0.79133445, -0.00202810019;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_x, line_y , 1e-7, 5e-3));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (line_xd, line_yd, 1e-7, 5e-3));
+
+ origin << 1234.56, 0.0, 0.0;
+ vector_x << 0.00387281179, 0.00572064891, -0.999976099;
+ vector_y << 0.6113801, -0.79133445, -0.00202810019;
+ origind << 1234.56, 0.0, 0.0;
+ vector_xd << 0.00387281179, 0.00572064891, -0.999976099;
+ vector_yd << 0.6113801, -0.79133445, -0.00202810019;
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origin, vector_x, vector_y , 1e-7, 5e-3));
+ EXPECT_TRUE (pcl::checkCoordinateSystem (origind, vector_xd, vector_yd, 1e-7, 5e-3));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, transformBetween2CoordinateSystems)
+{
+ Eigen::Affine3f transformation;
+ Eigen::Affine3d transformationd;
+ Eigen::VectorXf from_line_x, from_line_y, to_line_x, to_line_y;
+ Eigen::VectorXd from_line_xd, from_line_yd, to_line_xd, to_line_yd;
+ from_line_x.resize(6); from_line_y.resize(6);
+ to_line_x.resize(6); to_line_y.resize(6);
+ from_line_xd.resize(6); from_line_yd.resize(6);
+ to_line_xd.resize(6); to_line_yd.resize(6);
+
+ Eigen::Matrix4d test;
+ double tolerance = 1e-3;
+
+ // Simple translation
+ test << 1, 0, 0, 10,
+ 0, 1, 0, -5,
+ 0, 0, 1, 1,
+ 0, 0, 0, 1;
+
+ from_line_x << 0, 0, 0, 1, 0, 0;
+ from_line_y << 0, 0, 0, 0, 1, 0;
+ to_line_x << 10, -5, 1, 1, 0, 0;
+ to_line_y << 10, -5, 1, 0, 1, 0;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_x, from_line_y, to_line_x, to_line_y, transformation));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformation.matrix())(i,j) - test(i,j), tolerance);
+
+ from_line_xd << 0, 0, 0, 1, 0, 0;
+ from_line_yd << 0, 0, 0, 0, 1, 0;
+ to_line_xd << 10, -5, 1, 1, 0, 0;
+ to_line_yd << 10, -5, 1, 0, 1, 0;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_xd, from_line_yd, to_line_xd, to_line_yd, transformationd));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformationd.matrix())(i,j) - test(i,j), tolerance);
+
+ // Simple rotation
+ test << 0, 0, 1, 0,
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 0, 1;
+
+ from_line_x << 0, 0, 0, 1, 0, 0;
+ from_line_y << 0, 0, 0, 0, 1, 0;
+ to_line_x << 0, 0, 0, 0, 1, 0;
+ to_line_y << 0, 0, 0, 0, 0, 1;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_x, from_line_y, to_line_x, to_line_y, transformation));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformation.matrix())(i,j) - test(i,j), tolerance);
+
+ from_line_xd << 0, 0, 0, 1, 0, 0;
+ from_line_yd << 0, 0, 0, 0, 1, 0;
+ to_line_xd << 0, 0, 1, 0, 1, 0;
+ to_line_yd << 0, 0, 1, 0, 0, 1;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_xd, from_line_yd, to_line_xd, to_line_yd, transformationd));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformationd.matrix())(i,j) - test(i,j), tolerance);
+
+ // General case
+ test << 0.00397405, 0.00563289, -0.999976, -4.9062,
+ 0.611348, -0.791359, -0.00213906, -754.746,
+ -0.791352, -0.611325, -0.00658855, 976.972,
+ 0, 0, 0, 1;
+
+ from_line_x << 1234.56, 0.0, 0.0, 0.00387281179, 0.00572064891, -0.999976099;
+ from_line_y << 1234.56, 0.0, 0.0, 0.6113801, -0.79133445, -0.00202810019;
+ to_line_x << 0, 0, 0, 1, 0, 0;
+ to_line_y << 0, 0, 0, 0, 1, 0;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_x, from_line_y, to_line_x, to_line_y, transformation));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformation.matrix())(i,j) - test(i,j), tolerance);
+
+ from_line_xd << 1234.56, 0.0, 0.0, 0.00387281179, 0.00572064891, -0.999976099;
+ from_line_yd << 1234.56, 0.0, 0.0, 0.6113801, -0.79133445, -0.00202810019;
+ to_line_xd << 0, 0, 0, 1, 0, 0;
+ to_line_yd << 0, 0, 0, 0, 1, 0;
+ EXPECT_TRUE (pcl::transformBetween2CoordinateSystems (from_line_xd, from_line_yd, to_line_xd, to_line_yd, transformationd));
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ EXPECT_LE ((transformationd.matrix())(i,j) - test(i,j), tolerance);
+}
+
/* ---[ */
int
main (int argc, char** argv)
*/
#include <gtest/gtest.h>
+#include <pcl/pcl_tests.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
EXPECT_EQ (int (cloud_xyz_rgb_normal.size ()), 5);
for (int i = 0; i < 5; ++i)
{
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].x, cloud_xyz_rgb_normal[i].x);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].y, cloud_xyz_rgb_normal[i].y);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].z, cloud_xyz_rgb_normal[i].z);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].r, cloud_xyz_rgb_normal[i].r);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].g, cloud_xyz_rgb_normal[i].g);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].b, cloud_xyz_rgb_normal[i].b);
+ EXPECT_XYZ_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
+ EXPECT_RGB_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
EXPECT_EQ (cloud_xyz_rgba[i].rgba, cloud_xyz_rgb_normal[i].rgba);
}
EXPECT_EQ (int (cloud_xyz_rgb_normal.size ()), 2);
for (int i = 0; i < 2; ++i)
{
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].x, cloud_xyz_rgb_normal[i].x);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].y, cloud_xyz_rgb_normal[i].y);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].z, cloud_xyz_rgb_normal[i].z);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].r, cloud_xyz_rgb_normal[i].r);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].g, cloud_xyz_rgb_normal[i].g);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].b, cloud_xyz_rgb_normal[i].b);
+ EXPECT_XYZ_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
+ EXPECT_RGB_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
EXPECT_EQ (cloud_xyz_rgba[i].rgba, cloud_xyz_rgb_normal[i].rgba);
}
EXPECT_EQ (int (cloud_xyz_rgb_normal.size ()), 3);
for (int i = 0; i < 3; ++i)
{
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].x, cloud_xyz_rgb_normal[i].x);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].y, cloud_xyz_rgb_normal[i].y);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].z, cloud_xyz_rgb_normal[i].z);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].r, cloud_xyz_rgb_normal[i].r);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].g, cloud_xyz_rgb_normal[i].g);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].b, cloud_xyz_rgb_normal[i].b);
+ EXPECT_XYZ_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
+ EXPECT_RGB_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
EXPECT_EQ (cloud_xyz_rgba[i].rgba, cloud_xyz_rgb_normal[i].rgba);
}
EXPECT_EQ (int (cloud_xyz_rgb_normal.size ()), 3);
for (int i = 0; i < 3; ++i)
{
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].x, cloud_xyz_rgb_normal[i].x);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].y, cloud_xyz_rgb_normal[i].y);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].z, cloud_xyz_rgb_normal[i].z);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].r, cloud_xyz_rgb_normal[i].r);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].g, cloud_xyz_rgb_normal[i].g);
- EXPECT_FLOAT_EQ (cloud_xyz_rgba[i].b, cloud_xyz_rgb_normal[i].b);
+ EXPECT_XYZ_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
+ EXPECT_RGB_EQ (cloud_xyz_rgba[i], cloud_xyz_rgb_normal[i]);
EXPECT_EQ (cloud_xyz_rgba[i].rgba, cloud_xyz_rgb_normal[i].rgba);
}
}
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgba[i].z);
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgba[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgba[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgba[i].b);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgba[i]);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgba[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgba[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgba2.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].x, cloud_xyz_rgba2[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].y, cloud_xyz_rgba2[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].z, cloud_xyz_rgba2[i].z);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].r, cloud_xyz_rgba2[i].r);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].g, cloud_xyz_rgba2[i].g);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].b, cloud_xyz_rgba2[i].b);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgba2[i]);
+ EXPECT_RGB_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgba2[i]);
EXPECT_EQ (cloud_all[cloud_xyz_rgba.size () + i].rgba, cloud_xyz_rgba2[i].rgba);
}
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgba[i].z);
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgba[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgba[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgba[i].b);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgba[i]);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgba[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgba[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].z, cloud_xyz_rgb[i].z);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].r, cloud_xyz_rgb[i].r);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].g, cloud_xyz_rgb[i].g);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].b, cloud_xyz_rgb[i].b);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgb[i]);
+ EXPECT_RGB_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgb[i]);
EXPECT_EQ (cloud_all[cloud_xyz_rgba.size () + i].rgba, cloud_xyz_rgb[i].rgba);
}
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgba[i].z);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgba[i]);
// Data doesn't get modified
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgba[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgba[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgba[i].b);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgba[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgba[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].z, cloud_xyz_rgb[i].z);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgb[i]);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].r, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].g, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].b, 0);
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgba[i].z);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgba[i]);
// Data doesn't get modified
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgba[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgba[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgba[i].b);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgba[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgba[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].z, cloud_xyz_rgb[i].z);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgb[i]);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].r, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].g, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].b, 0);
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgba[i].z);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgba[i]);
// Data doesn't get modified
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgba[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgba[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgba[i].b);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgba[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgba[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].z, cloud_xyz_rgb[i].z);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgba.size () + i], cloud_xyz_rgb[i]);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].r, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].g, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgba.size () + i].b, 0);
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgb[i].z);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgb[i]);
// Data doesn't get modified
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgb[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgb[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgb[i].b);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgb[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgb[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].z, cloud_xyz_rgba[i].z);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgb.size () + i], cloud_xyz_rgba[i]);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].r, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].g, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].b, 0);
EXPECT_EQ (cloud_all.size (), cloud_xyz_rgba.size () + cloud_xyz_rgba2.size ());
for (int i = 0; i < int (cloud_xyz_rgb.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[i].x, cloud_xyz_rgb[i].x);
- EXPECT_FLOAT_EQ (cloud_all[i].y, cloud_xyz_rgb[i].y);
- EXPECT_FLOAT_EQ (cloud_all[i].z, cloud_xyz_rgb[i].z);
+ EXPECT_XYZ_EQ (cloud_all[i], cloud_xyz_rgb[i]);
// Data doesn't get modified
- EXPECT_FLOAT_EQ (cloud_all[i].r, cloud_xyz_rgb[i].r);
- EXPECT_FLOAT_EQ (cloud_all[i].g, cloud_xyz_rgb[i].g);
- EXPECT_FLOAT_EQ (cloud_all[i].b, cloud_xyz_rgb[i].b);
+ EXPECT_RGB_EQ (cloud_all[i], cloud_xyz_rgb[i]);
EXPECT_EQ (cloud_all[i].rgba, cloud_xyz_rgb[i].rgba);
}
for (int i = 0; i < int (cloud_xyz_rgba.size ()); ++i)
{
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].x, cloud_xyz_rgba[i].x);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].y, cloud_xyz_rgba[i].y);
- EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].z, cloud_xyz_rgba[i].z);
+ EXPECT_XYZ_EQ (cloud_all[cloud_xyz_rgb.size () + i], cloud_xyz_rgba[i]);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].r, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].g, 0);
EXPECT_FLOAT_EQ (cloud_all[cloud_xyz_rgb.size () + i].b, 0);
}
}
+TEST (PCL, CopyPointCloudWithIndicesAndRGBToRGBA)
+{
+ CloudXYZRGB cloud_xyz_rgb;
+ CloudXYZRGBA cloud_xyz_rgba (5, 1, pt_xyz_rgba);
+
+ std::vector<int> indices;
+ indices.push_back (2);
+ indices.push_back (3);
+
+ pcl::copyPointCloud (cloud_xyz_rgba, indices, cloud_xyz_rgb);
+
+ EXPECT_EQ (indices.size (), cloud_xyz_rgb.size ());
+ for (size_t i = 0; i < indices.size (); ++i)
+ {
+ EXPECT_XYZ_EQ (cloud_xyz_rgb[i], cloud_xyz_rgba[indices[i]]);
+ EXPECT_EQ (cloud_xyz_rgb[i].rgba, cloud_xyz_rgba[indices[i]].rgba);
+ }
+}
+
/* ---[ */
int
main (int argc, char** argv)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TEST (PCL, lineWithLineIntersection)
{
- Eigen::VectorXf line_a(6);
- Eigen::VectorXf line_b(6);
+ Eigen::VectorXf line_a (6);
+ Eigen::VectorXf line_b (6);
//case 1
- line_a[0] = 0.01f;
- line_a[1] = 0.02f;
- line_a[2] = 0.03f;
- line_a[3] = 0.4f;
- line_a[4] = 0.5f;
- line_a[5] = 0.6f;
-
- line_b[0] = 0.1f;
- line_b[1] = 0.2f;
- line_b[2] = 0.3f;
- line_b[3] = 0.04f;
- line_b[4] = 0.05f;
- line_b[5] = 0.06f;
+ line_a[0] = 0.01;
+ line_a[1] = 0.02;
+ line_a[2] = 0.03;
+ line_a[3] = 0.4;
+ line_a[4] = 0.5;
+ line_a[5] = 0.6;
+
+ line_b[0] = 0.1;
+ line_b[1] = 0.2;
+ line_b[2] = 0.3;
+ line_b[3] = 0.04;
+ line_b[4] = 0.05;
+ line_b[5] = 0.06;
Eigen::Vector4f p1, p2;
lineToLineSegment (line_a, line_b, p1, p2);
Eigen::Vector4f point_case_1;
- bool result_case_1 = lineWithLineIntersection(line_a, line_b, point_case_1);
+ bool result_case_1 = lineWithLineIntersection (line_a, line_b, point_case_1);
double sqr_dist_case_1 = (p1 - p2).squaredNorm ();
double default_sqr_eps = 1e-4;
- EXPECT_GT(sqr_dist_case_1, default_sqr_eps);
- Eigen::Vector4f zero(0.0f, 0.0f, 0.0f, 0.0f);
+ EXPECT_GT (sqr_dist_case_1, default_sqr_eps);
+ Eigen::Vector4f zero (0.0, 0.0, 0.0, 0.0);
- EXPECT_EQ(point_case_1[0], zero[0]);
- EXPECT_EQ(point_case_1[1], zero[1]);
- EXPECT_EQ(point_case_1[2], zero[2]);
- EXPECT_EQ(point_case_1[3], zero[3]);
+ EXPECT_EQ (point_case_1[0], zero[0]);
+ EXPECT_EQ (point_case_1[1], zero[1]);
+ EXPECT_EQ (point_case_1[2], zero[2]);
+ EXPECT_EQ (point_case_1[3], zero[3]);
- EXPECT_FALSE(result_case_1);
+ EXPECT_FALSE (result_case_1);
pcl::ModelCoefficients line_a_mod;
pcl::ModelCoefficients line_b_mod;
std::vector<float> values_a_case_1;
- values_a_case_1.push_back(line_a[0]);
- values_a_case_1.push_back(line_a[1]);
- values_a_case_1.push_back(line_a[2]);
- values_a_case_1.push_back(line_a[3]);
- values_a_case_1.push_back(line_a[4]);
- values_a_case_1.push_back(line_a[5]);
+ values_a_case_1.push_back (line_a[0]);
+ values_a_case_1.push_back (line_a[1]);
+ values_a_case_1.push_back (line_a[2]);
+ values_a_case_1.push_back (line_a[3]);
+ values_a_case_1.push_back (line_a[4]);
+ values_a_case_1.push_back (line_a[5]);
std::vector<float> values_b_case_1;
- values_b_case_1.push_back(line_b[0]);
- values_b_case_1.push_back(line_b[1]);
- values_b_case_1.push_back(line_b[2]);
- values_b_case_1.push_back(line_b[3]);
- values_b_case_1.push_back(line_b[4]);
- values_b_case_1.push_back(line_b[5]);
+ values_b_case_1.push_back (line_b[0]);
+ values_b_case_1.push_back (line_b[1]);
+ values_b_case_1.push_back (line_b[2]);
+ values_b_case_1.push_back (line_b[3]);
+ values_b_case_1.push_back (line_b[4]);
+ values_b_case_1.push_back (line_b[5]);
line_a_mod.values = values_a_case_1;
line_b_mod.values = values_b_case_1;
Eigen::Vector4f point_mod_1;
- EXPECT_FALSE(lineWithLineIntersection(line_a_mod, line_b_mod, point_mod_1));
- EXPECT_EQ(result_case_1, lineWithLineIntersection(line_a_mod, line_b_mod, point_mod_1));
+ EXPECT_FALSE (lineWithLineIntersection (line_a_mod, line_b_mod, point_mod_1));
+ EXPECT_EQ (result_case_1, lineWithLineIntersection (line_a_mod, line_b_mod, point_mod_1));
- EXPECT_EQ(point_mod_1[0], zero[0]);
- EXPECT_EQ(point_mod_1[1], zero[1]);
- EXPECT_EQ(point_mod_1[2], zero[2]);
- EXPECT_EQ(point_mod_1[3], zero[3]);
+ EXPECT_EQ (point_mod_1[0], zero[0]);
+ EXPECT_EQ (point_mod_1[1], zero[1]);
+ EXPECT_EQ (point_mod_1[2], zero[2]);
+ EXPECT_EQ (point_mod_1[3], zero[3]);
//case 2
- line_a[0] = 0.00100f;
- line_a[1] = 0.00200f;
- line_a[2] = 0.00300f;
- line_a[3] = 0.00400f;
- line_a[4] = 0.00500f;
- line_a[5] = 0.00600f;
-
- line_b[0] = 0.00157f;
- line_b[1] = 0.00233f;
- line_b[2] = 0.00378f;
- line_b[3] = 0.00495f;
- line_b[4] = 0.00565f;
- line_b[5] = 0.00666f;
+ line_a[0] = 0.00100;
+ line_a[1] = 0.00200;
+ line_a[2] = 0.00300;
+ line_a[3] = 0.00400;
+ line_a[4] = 0.00500;
+ line_a[5] = 0.00600;
+
+ line_b[0] = 0.00157;
+ line_b[1] = 0.00233;
+ line_b[2] = 0.00378;
+ line_b[3] = 0.00495;
+ line_b[4] = 0.00565;
+ line_b[5] = 0.00666;
lineToLineSegment (line_a, line_b, p1, p2);
Eigen::Vector4f point_case_2;
double sqr_eps_case_2 = 1e-1;
- bool result_case_2 = lineWithLineIntersection(line_a, line_b, point_case_2, sqr_eps_case_2);
+ bool result_case_2 = lineWithLineIntersection (line_a, line_b, point_case_2, sqr_eps_case_2);
double sqr_dist_case_2 = (p1 - p2).squaredNorm ();
- EXPECT_LT(sqr_dist_case_2, sqr_eps_case_2);
+ EXPECT_LT (sqr_dist_case_2, sqr_eps_case_2);
- EXPECT_EQ(point_case_2[0], p1[0]);
- EXPECT_EQ(point_case_2[1], p1[1]);
- EXPECT_EQ(point_case_2[2], p1[2]);
- EXPECT_EQ(point_case_2[3], p1[3]);
+ EXPECT_EQ (point_case_2[0], p1[0]);
+ EXPECT_EQ (point_case_2[1], p1[1]);
+ EXPECT_EQ (point_case_2[2], p1[2]);
+ EXPECT_EQ (point_case_2[3], p1[3]);
- EXPECT_TRUE(result_case_2);
+ EXPECT_TRUE (result_case_2);
pcl::ModelCoefficients line_a_mod_2;
pcl::ModelCoefficients line_b_mod_2;
std::vector<float> values_a_case_2;
- values_a_case_2.push_back(0.1000f);
- values_a_case_2.push_back(0.2000f);
- values_a_case_2.push_back(0.3000f);
- values_a_case_2.push_back(0.4000f);
- values_a_case_2.push_back(0.5000f);
- values_a_case_2.push_back(0.6000f);
+ values_a_case_2.push_back (0.1000);
+ values_a_case_2.push_back (0.2000);
+ values_a_case_2.push_back (0.3000);
+ values_a_case_2.push_back (0.4000);
+ values_a_case_2.push_back (0.5000);
+ values_a_case_2.push_back (0.6000);
std::vector<float> values_b_case_2;
- values_b_case_2.push_back(0.1001f);
- values_b_case_2.push_back(0.2001f);
- values_b_case_2.push_back(0.3001f);
- values_b_case_2.push_back(0.4001f);
- values_b_case_2.push_back(0.5001f);
- values_b_case_2.push_back(0.6001f);
+ values_b_case_2.push_back (0.1001);
+ values_b_case_2.push_back (0.2001);
+ values_b_case_2.push_back (0.3001);
+ values_b_case_2.push_back (0.4001);
+ values_b_case_2.push_back (0.5001);
+ values_b_case_2.push_back (0.6001);
line_a_mod_2.values = values_a_case_2;
line_b_mod_2.values = values_b_case_2;
lineToLineSegment (coeff1, coeff2, p1_mod, p2_mod);
double sqr_mod_act_2 = (p1_mod - p2_mod).squaredNorm ();
- EXPECT_LT(sqr_mod_act_2, sqr_mod_case_2);
- EXPECT_EQ(lineWithLineIntersection (coeff1, coeff2, point_mod_case_2, sqr_mod_case_2),
- lineWithLineIntersection(line_a_mod_2, line_b_mod_2, point_mod_2, sqr_mod_case_2));
- EXPECT_TRUE(lineWithLineIntersection(line_a_mod_2, line_b_mod_2, point_mod_2, sqr_mod_case_2));
+ EXPECT_LT (sqr_mod_act_2, sqr_mod_case_2);
+ EXPECT_EQ (lineWithLineIntersection (coeff1, coeff2, point_mod_case_2, sqr_mod_case_2),
+ lineWithLineIntersection (line_a_mod_2, line_b_mod_2, point_mod_2, sqr_mod_case_2));
+ EXPECT_TRUE (lineWithLineIntersection (line_a_mod_2, line_b_mod_2, point_mod_2, sqr_mod_case_2));
- EXPECT_EQ(point_mod_2[0], point_mod_case_2[0]);
- EXPECT_EQ(point_mod_2[1], point_mod_case_2[1]);
- EXPECT_EQ(point_mod_2[2], point_mod_case_2[2]);
- EXPECT_EQ(point_mod_2[3], point_mod_case_2[3]);
+ EXPECT_EQ (point_mod_2[0], point_mod_case_2[0]);
+ EXPECT_EQ (point_mod_2[1], point_mod_case_2[1]);
+ EXPECT_EQ (point_mod_2[2], point_mod_case_2[2]);
+ EXPECT_EQ (point_mod_2[3], point_mod_case_2[3]);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TEST (PCL, planeWithPlaneIntersection)
{
- //Testing parallel planes
- const int k = 2;
- float x = 1.0f;
- float y = 2.0f;
- float z = 3.0f;
- float w = 4.0f;
- Eigen::Vector4f plane_a;
- plane_a.x() = x;
- plane_a.y() = y;
- plane_a.z() = z;
- plane_a.w() = w;
-
- EXPECT_EQ(1.0f, plane_a.x());
- EXPECT_EQ(2.0f, plane_a.y());
- EXPECT_EQ(3.0f, plane_a.z());
- EXPECT_EQ(4.0f, plane_a.w());
-
- Eigen::Vector4f plane_b;
- plane_b.x() = x;
- plane_b.y() = y;
- plane_b.z() = z;
- plane_b.w() = w + k;
-
- EXPECT_EQ(1.0f, plane_b.x());
- EXPECT_EQ(2.0f, plane_b.y());
- EXPECT_EQ(3.0f, plane_b.z());
- EXPECT_EQ(6.0f, plane_b.w());
-
+ Eigen::Vector4f plane_a, plane_b;
+ Eigen::Vector4d plane_ad, plane_bd;
Eigen::VectorXf line;
+ Eigen::VectorXd lined;
+
+ // Testing parallel planes, plane normal not normalized!
+ plane_a << 1.0, 2.0, 3.0, 0.0;
+ plane_b << plane_a;
+ plane_b[3] += 1.0;
+ plane_ad << 1.0, 2.0, 3.0, 0.0;
+ plane_bd << plane_ad;
+ plane_bd[3] -= -1.0;
+
+ EXPECT_FALSE (pcl::planeWithPlaneIntersection (plane_a, plane_b, line, 1e-6));
+ EXPECT_FALSE (pcl::planeWithPlaneIntersection (plane_ad, plane_bd, lined, 1e-6));
+
+ // Testing nearly parallel planes, plane normal not normalized!
+ plane_a << 1.0, 2.0, 3.0, -0.5;
+ plane_b << 1.0, 2.5, 3.0, 0.5;;
+ plane_ad << 1.0, 2.0, 3.0, -0.5;
+ plane_bd << 1.0, 2.5, 3.0, 0.5;
+
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_a, plane_b, line, 1e-3));
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_ad, plane_bd, lined, 1e-3));
+
+ double tolerance = 1e-4;
+ EXPECT_NEAR (line[0], 0.45, tolerance);
+ EXPECT_NEAR (line[1], -2.0, tolerance);
+ EXPECT_NEAR (line[2], 1.35, tolerance);
+ EXPECT_NEAR (line[3], -1.5, tolerance);
+ EXPECT_NEAR (line[4], 0.0, tolerance);
+ EXPECT_NEAR (line[5], 0.5, tolerance);
+ EXPECT_NEAR (lined[0], 0.45, tolerance);
+ EXPECT_NEAR (lined[1], -2.0, tolerance);
+ EXPECT_NEAR (lined[2], 1.35, tolerance);
+ EXPECT_NEAR (lined[3], -1.5, tolerance);
+ EXPECT_NEAR (lined[4], 0.0, tolerance);
+ EXPECT_NEAR (lined[5], 0.5, tolerance);
+
+ // Orthogonal planes, Hessian form (plane normal normalized)
+ plane_a << 0.0, 0.0, 1.0, +0.0;
+ plane_b << 1.0, 0.0, 0.0, -0.5;
+ plane_ad << 0.0, 0.0, 1.0, +0.0;
+ plane_bd << 1.0, 0.0, 0.0, -0.5;
+
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_a, plane_b, line, 0.1));
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_ad, plane_bd, lined, 0.1));
+
+ tolerance = 1e-5;
+ EXPECT_NEAR (line[0], 0.5, tolerance);
+ EXPECT_NEAR (line[1], 0.0, tolerance);
+ EXPECT_NEAR (line[2], 0.0, tolerance);
+ EXPECT_NEAR (line[3], 0.0, tolerance);
+ EXPECT_NEAR (line[4], 1.0, tolerance);
+ EXPECT_NEAR (line[5], 0.0, tolerance);
+ EXPECT_NEAR (lined[0], 0.5, tolerance);
+ EXPECT_NEAR (lined[1], 0.0, tolerance);
+ EXPECT_NEAR (lined[2], 0.0, tolerance);
+ EXPECT_NEAR (lined[3], 0.0, tolerance);
+ EXPECT_NEAR (lined[4], 1.0, tolerance);
+ EXPECT_NEAR (lined[5], 0.0, tolerance);
+
+ // Random planes, plane normal not normalized!
+ plane_a << 24.234, -22.234, 3.0823, -24.5;
+ plane_b << 689.0, 1239.01, 1.0003, 0.5;
+ plane_ad << 24.234, -22.234, 3.0823, -24.5;
+ plane_bd << 689.0, 1239.01, 1.0003, 0.5;
+
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_a, plane_b, line, 0.1));
+ EXPECT_TRUE (pcl::planeWithPlaneIntersection (plane_ad, plane_bd, lined, 0.1));
+
+ tolerance = 1e-2;
+ EXPECT_NEAR (line[0], 0.662983, tolerance);
+ EXPECT_NEAR (line[1], -0.369141, tolerance);
+ EXPECT_NEAR (line[2], 0.0732528, tolerance);
+ EXPECT_NEAR (line[3], -3841.24, tolerance);
+ EXPECT_NEAR (line[4], 2099.46, tolerance);
+ EXPECT_NEAR (line[5], 45345.4, tolerance);
+ EXPECT_NEAR (lined[0], 0.662983, tolerance);
+ EXPECT_NEAR (lined[1], -0.369141, tolerance);
+ EXPECT_NEAR (lined[2], 0.0732528, tolerance);
+ EXPECT_NEAR (lined[3], -3841.24, tolerance);
+ EXPECT_NEAR (lined[4], 2099.46, tolerance);
+ EXPECT_NEAR (lined[5], 45345.4, tolerance);
+}
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 45));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 90));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 180));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 360));
-
- plane_b.x() = k * x;
- plane_b.y() = k * y;
- plane_b.z() = k * z;
- plane_b.w() = k * w;
-
- EXPECT_EQ(2.0f, plane_b.x());
- EXPECT_EQ(4.0f, plane_b.y());
- EXPECT_EQ(6.0f, plane_b.z());
- EXPECT_EQ(8.0f, plane_b.w());
-
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 45));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 90));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 180));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 360));
-
- //overlapping planes
- plane_b.w() = w;
- EXPECT_EQ(4.0f, plane_b.w());
-
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 45));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 90));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 180));
- std::cout << std::endl;
- EXPECT_FALSE(planeWithPlaneIntersection(plane_a, plane_b, line, 360));
-
- //orthogonal planes
- plane_a.x() = 2.0f;
- plane_a.y() = 1.0f;
- plane_a.z() = -5.0f;
- plane_a.w() = 6.0f;
- EXPECT_EQ(2.0f, plane_a.x());
- EXPECT_EQ(1.0f, plane_a.y());
- EXPECT_EQ(-5.0f, plane_a.z());
- EXPECT_EQ(6.0f, plane_a.w());
-
- plane_b.x() = 2.0f;
- plane_b.y() = 1.0f;
- plane_b.z() = 1.0f;
- plane_b.w() = 7.0f;
-
- EXPECT_EQ(2.0f, plane_b.x());
- EXPECT_EQ(1.0f, plane_b.y());
- EXPECT_EQ(1.0f, plane_b.z());
- EXPECT_EQ(7.0f, plane_b.w());
-
- std::cout << std::endl;
- EXPECT_TRUE(planeWithPlaneIntersection(plane_a, plane_b, line, 0));
-
- //general planes
- plane_a.x() = 1.555f;
- plane_a.y() = 0.894f;
- plane_a.z() = 1.234f;
- plane_a.w() = 3.567f;
-
- plane_b.x() = 0.743f;
- plane_b.y() = 1.890f;
- plane_b.z() = 6.789f;
- plane_b.w() = 5.432f;
-
- std::cout << std::endl;
- EXPECT_TRUE(planeWithPlaneIntersection(plane_a, plane_b, line, 0));
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, threePlanesIntersection)
+{
+ // Testing with floats/doubles
+ // Testing 2 parallel planes
+ Eigen::Vector4d plane_a (1.0, 0.0, 0.0, -0.5);
+ Eigen::Vector4d plane_b (1.0, 0.0, 0.0, 0.5);
+ Eigen::Vector4d plane_c (0.0, 0.0, 1.0, -0.5);
+ Eigen::Vector3d point (1.0, 2.0, 3.0);
+
+ Eigen::Vector4f fplane_a (1.0, 0.0, 0.0, -0.5);
+ Eigen::Vector4f fplane_b (1.0, 0.0, 0.0, 0.5);
+ Eigen::Vector4f fplane_c (0.0, 0.0, 1.0, -0.5);
+ Eigen::Vector3f fpoint (1.0, 2.0, 3.0);
+
+ EXPECT_FALSE (threePlanesIntersection (plane_a, plane_b, plane_c, point, 1e-6));
+ EXPECT_FALSE (threePlanesIntersection (fplane_a, fplane_b, fplane_c, fpoint, 1e-6));
+ EXPECT_FALSE (threePlanesIntersection (plane_a, plane_b, plane_c, point, 1e-3));
+ EXPECT_FALSE (threePlanesIntersection (fplane_a, fplane_b, fplane_c, fpoint, 1e-3));
+
+ EXPECT_DOUBLE_EQ (1.0, point [0]);
+ EXPECT_DOUBLE_EQ (2.0, point [1]);
+ EXPECT_DOUBLE_EQ (3.0, point [2]);
+ EXPECT_FLOAT_EQ (1.0, fpoint [0]);
+ EXPECT_FLOAT_EQ (2.0, fpoint [1]);
+ EXPECT_FLOAT_EQ (3.0, fpoint [2]);
+
+ // Perfect box
+ plane_b << 0.0, 1.0, 0.0, 0.5;
+ fplane_b << 0.0, 1.0, 0.0, 0.5;
+
+ EXPECT_TRUE (threePlanesIntersection (plane_a, plane_b, plane_c, point));
+ EXPECT_TRUE (threePlanesIntersection (fplane_a, fplane_b, fplane_c, fpoint));
+
+ EXPECT_DOUBLE_EQ (0.5, point [0]);
+ EXPECT_DOUBLE_EQ (-0.5, point [1]);
+ EXPECT_DOUBLE_EQ (0.5, point [2]);
+ EXPECT_FLOAT_EQ (0.5, fpoint [0]);
+ EXPECT_FLOAT_EQ (-0.5, fpoint [1]);
+ EXPECT_FLOAT_EQ (0.5, fpoint [2]);
+
+ // Random planes
+ plane_a << 1.4564, 0.5465, -0.1325, 0.4685;
+ plane_b << -1.5619, 5.5461, 5.4569, 2.9414;
+ plane_c << 0.9852, 654.55, -0.1546, -45.1516;
+ fplane_a << 1.4564, 0.5465, -0.1325, 0.4685;
+ fplane_b << -1.5619, 5.5461, 5.4569, 2.9414;
+ fplane_c << 0.9852, 654.55, -0.1546, -45.1516;
+
+ EXPECT_TRUE (threePlanesIntersection (plane_a, plane_b, plane_c, point));
+ EXPECT_TRUE (threePlanesIntersection (fplane_a, fplane_b, fplane_c, fpoint));
+
+ EXPECT_NEAR (-0.413977, point [0], 1e-4);
+ EXPECT_NEAR (0.0694323, point [1], 1e-4);
+ EXPECT_NEAR (-0.728082, point [2], 1e-4);
+ EXPECT_NEAR (-0.413977, fpoint [0], 1e-4);
+ EXPECT_NEAR (0.0694323, fpoint [1], 1e-4);
+ EXPECT_NEAR (-0.728082, fpoint [2], 1e-4);
}
//* ---[ */
}
/* ]--- */
+
PCL_ADD_TEST(feature_base test_base_feature
FILES test_base_feature.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
+PCL_ADD_TEST(feature_cppf_estimation test_cppf_estimation
+ FILES test_cppf_estimation.cpp
+ LINK_WITH pcl_gtest pcl_features pcl_io
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/colored_cloud.pcd")
PCL_ADD_TEST(feature_normal_estimation test_normal_estimation
FILES test_normal_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_pfh_estimation test_pfh_estimation
FILES test_pfh_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_cvfh_estimation test_cvfh_estimation
FILES test_cvfh_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io pcl_filters
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd ${PCL_SOURCE_DIR}/test/milk.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd" "${PCL_SOURCE_DIR}/test/milk.pcd")
PCL_ADD_TEST(feature_ppf_estimation test_ppf_estimation
FILES test_ppf_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_shot_estimation test_shot_estimation
FILES test_shot_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_boundary_estimation test_boundary_estimation
FILES test_boundary_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_curvatures_estimation test_curvatures_estimation
FILES test_curvatures_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_spin_estimation test_spin_estimation
FILES test_spin_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_invariants_estimation test_invariants_estimation
FILES test_invariants_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_gradient_estimation test_gradient_estimation
FILES test_gradient_estimation.cpp
LINK_WITH pcl_gtest pcl_features)
PCL_ADD_TEST(feature_board_estimation test_board_estimation
FILES test_board_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(feature_shot_lrf_estimation test_shot_lrf_estimation
FILES test_shot_lrf_estimation.cpp
LINK_WITH pcl_gtest pcl_features pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(features_narf test_narf
FILES test_narf.cpp
LINK_WITH pcl_gtest pcl_features ${FLANN_LIBRARIES})
PCL_ADD_TEST(a_ii_normals_test test_ii_normals
FILES test_ii_normals.cpp
LINK_WITH pcl_gtest pcl_io pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/table_scene_mug_stereo_textured.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/table_scene_mug_stereo_textured.pcd")
+PCL_ADD_TEST(feature_moment_of_inertia_estimation test_moment_of_inertia_estimation
+ FILES test_moment_of_inertia_estimation.cpp
+ LINK_WITH pcl_gtest pcl_io pcl_features
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/lamppost.pcd")
+PCL_ADD_TEST(feature_rops_estimation test_rops_estimation
+ FILES test_rops_estimation.cpp
+ LINK_WITH pcl_gtest pcl_io pcl_features
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/rops_cloud.pcd" "${PCL_SOURCE_DIR}/test/rops_indices.txt" "${PCL_SOURCE_DIR}/test/rops_triangles.txt")
EXPECT_NEAR (centroid3[0], -0.0290809, 1e-4);
EXPECT_NEAR (centroid3[1], 0.102653, 1e-4);
EXPECT_NEAR (centroid3[2], 0.027302, 1e-4);
- EXPECT_NEAR (centroid3[3], 0, 1e-4);
+ EXPECT_NEAR (centroid3[3], 1, 1e-4);
// compute3Dcentroid
compute3DCentroid (cloud, centroid3);
EXPECT_NEAR (centroid3[0], -0.0290809, 1e-4);
EXPECT_NEAR (centroid3[1], 0.102653, 1e-4);
EXPECT_NEAR (centroid3[2], 0.027302, 1e-4);
- EXPECT_NEAR (centroid3[3], 0, 1e-4);
+ EXPECT_NEAR (centroid3[3], 1, 1e-4);
// computeNDCentroid (indices)
Eigen::VectorXf centroidn;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/point_cloud.h>
+#include <pcl/features/normal_3d.h>
+#include <pcl/features/cppf.h>
+#include <pcl/io/pcd_io.h>
+
+using namespace pcl;
+using namespace pcl::io;
+using namespace std;
+
+typedef search::KdTree<PointXYZRGBA>::Ptr KdTreePtr;
+
+PointCloud<PointXYZRGBA> cloud;
+vector<int> indices;
+KdTreePtr tree;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, CPPFEstimation)
+{
+ // Estimate normals
+ NormalEstimation<PointXYZRGBA, Normal> normal_estimation;
+ PointCloud<Normal>::Ptr normals (new PointCloud<Normal> ());
+ normal_estimation.setInputCloud (cloud.makeShared ());
+ boost::shared_ptr<vector<int> > indicesptr (new vector<int> (indices));
+ normal_estimation.setIndices (indicesptr);
+ normal_estimation.setSearchMethod (tree);
+ normal_estimation.setKSearch (10); // Use 10 nearest neighbors to estimate the normals
+ normal_estimation.compute (*normals);
+
+ CPPFEstimation <PointXYZRGBA, Normal, CPPFSignature> cppf_estimation;
+ cppf_estimation.setInputCloud (cloud.makeShared ());
+ cppf_estimation.setInputNormals (normals);
+ PointCloud<CPPFSignature>::Ptr feature_cloud (new PointCloud<CPPFSignature> ());
+ cppf_estimation.compute (*feature_cloud);
+
+ // Check for size of output
+ EXPECT_EQ (feature_cloud->points.size (), indices.size () * cloud.points.size ());
+
+ // Now check for a few values in the feature cloud
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f1));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f2));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f3));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f4));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f5));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f6));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f7));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f8));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f9));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].f10));
+ EXPECT_TRUE (pcl_isnan (feature_cloud->points[0].alpha_m));
+
+ EXPECT_NEAR (feature_cloud->points[2572].f1, 0.0669282, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f2, -0.1988939, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f3, 0.7856042, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f4, 0.0533117, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f5, 0.1875000, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f6, 0.0733944, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f7, 0.4274509, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f8, 0.2380952, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f9, 0.0619469, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].f10, 0.4431372, 1e-4);
+ EXPECT_NEAR (feature_cloud->points[2572].alpha_m, -1.852997, 1e-4);
+
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ std::cerr << "No test file given. Please download `colored_cloud.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ if (loadPCDFile<PointXYZRGBA> (argv[1], cloud) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `colored_cloud.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ indices.resize (cloud.points.size ());
+ for (int i = 0; i < static_cast<int> (indices.size ()); ++i)
+ indices[i] = i;
+
+ tree.reset (new search::KdTree<PointXYZRGBA> (false));
+ tree->setInputCloud (cloud.makeShared ());
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/point_cloud.h>
+#include <pcl/features/moment_of_inertia_estimation.h>
+#include <pcl/io/pcd_io.h>
+
+pcl::PointCloud <pcl::PointXYZ>::Ptr cloud;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (MomentOfInertia, FeatureExtraction)
+{
+ pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
+ feature_extractor.setInputCloud (cloud);
+ feature_extractor.compute ();
+
+ float major, middle, minor;
+ feature_extractor.getEigenValues (major, middle, minor);
+ EXPECT_LE (minor, middle);
+ EXPECT_LE (middle, major);
+
+ float dot_product = 0.0f;
+ Eigen::Vector3f major_vec, middle_vec, minor_vec;
+ feature_extractor.getEigenVectors (major_vec, middle_vec, minor_vec);
+ dot_product = major_vec.dot (middle_vec);
+ EXPECT_NEAR (0.0f, dot_product, 0.00001f);
+ dot_product = major_vec.dot (minor_vec);
+ EXPECT_NEAR (0.0f, dot_product, 0.00001f);
+ dot_product = middle_vec.dot (minor_vec);
+ EXPECT_NEAR (0.0f, dot_product, 0.00001f);
+
+ std::vector <float> moment_of_inertia;
+ std::vector <float> eccentricity;
+ feature_extractor.getMomentOfInertia (moment_of_inertia);
+ feature_extractor.getEccentricity (eccentricity);
+ unsigned int m_size = static_cast <unsigned int> (moment_of_inertia.size ());
+ unsigned int e_size = static_cast <unsigned int> (eccentricity.size ());
+ EXPECT_EQ (m_size, e_size);
+ EXPECT_NE (0, m_size);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (MomentOfInertia, InvalidParameters)
+{
+ float angle_step = 0.0f;
+ float point_mass = 0.0f;
+
+ pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
+ feature_extractor.setInputCloud (cloud);
+
+ angle_step = 0.0f;
+ feature_extractor.setAngleStep (angle_step);
+ angle_step = feature_extractor.getAngleStep ();
+ EXPECT_LT (0.0f, angle_step);
+
+ angle_step = -1.0f;
+ feature_extractor.setAngleStep (angle_step);
+ angle_step = feature_extractor.getAngleStep ();
+ EXPECT_LT (0.0f, angle_step);
+
+ point_mass = 0.0f;
+ feature_extractor.setPointMass (point_mass);
+ point_mass = feature_extractor.getPointMass ();
+ EXPECT_LT (0.0f, point_mass);
+
+ point_mass = -1.0f;
+ feature_extractor.setPointMass (point_mass);
+ point_mass = feature_extractor.getPointMass ();
+ EXPECT_LT (0.0f, point_mass);
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ std::cerr << "No test file given. Please download `lamppost.pcd` and pass its paths to the test." << std::endl;
+ return (-1);
+ }
+
+ cloud = (new pcl::PointCloud<pcl::PointXYZ> ())->makeShared ();
+ if (pcl::io::loadPCDFile (argv[1], *cloud) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `lamppost.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/point_cloud.h>
+#include <pcl/features/rops_estimation.h>
+#include <pcl/io/pcd_io.h>
+
+pcl::PointCloud <pcl::PointXYZ>::Ptr cloud;
+pcl::PointIndicesPtr indices;
+std::vector <pcl::Vertices> triangles;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (ROPSFeature, FeatureExtraction)
+{
+ float support_radius = 0.0285f;
+ unsigned int number_of_partition_bins = 5;
+ unsigned int number_of_rotations = 3;
+
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
+ search_method->setInputCloud (cloud);
+
+ pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
+ feature_estimator.setSearchMethod (search_method);
+ feature_estimator.setSearchSurface (cloud);
+ feature_estimator.setInputCloud (cloud);
+ feature_estimator.setIndices (indices);
+ feature_estimator.setTriangles (triangles);
+ feature_estimator.setRadiusSearch (support_radius);
+ feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
+ feature_estimator.setNumberOfRotations (number_of_rotations);
+ feature_estimator.setSupportRadius (support_radius);
+
+ pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
+ feature_estimator.compute (*histograms);
+
+ EXPECT_NE (0, histograms->points.size ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (ROPSFeature, InvalidParameters)
+{
+ float support_radius = 0.0285f;
+ unsigned int number_of_partition_bins = 5;
+ unsigned int number_of_rotations = 3;
+
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
+ search_method->setInputCloud (cloud);
+
+ pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
+ feature_estimator.setSearchMethod (search_method);
+ feature_estimator.setSearchSurface (cloud);
+ feature_estimator.setInputCloud (cloud);
+ feature_estimator.setIndices (indices);
+ feature_estimator.setTriangles (triangles);
+ feature_estimator.setRadiusSearch (support_radius);
+ feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
+ feature_estimator.setNumberOfRotations (number_of_rotations);
+ feature_estimator.setSupportRadius (support_radius);
+
+ pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
+
+ support_radius = -support_radius;
+ feature_estimator.setSupportRadius (support_radius);
+ support_radius = feature_estimator.getSupportRadius ();
+ EXPECT_LT (0.0f, support_radius);
+
+ number_of_partition_bins = 0;
+ feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
+ number_of_partition_bins = feature_estimator.getNumberOfPartitionBins ();
+ EXPECT_LT (0, number_of_partition_bins);
+
+ number_of_rotations = 0;
+ feature_estimator.setNumberOfRotations (number_of_rotations);
+ number_of_rotations = feature_estimator.getNumberOfRotations ();
+ EXPECT_LT (0, number_of_rotations);
+
+ std::vector <pcl::Vertices> empty_triangles;
+ feature_estimator.setTriangles (empty_triangles);
+ feature_estimator.compute (*histograms);
+ EXPECT_EQ (0, histograms->points.size ());
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ if (argc < 4)
+ {
+ std::cerr << "No test file given. Please download `rops_cloud.pcd`, `rops_indices.txt` and `rops_triangles.txt`" <<
+ " and pass their paths to the test." << std::endl;
+ return (-1);
+ }
+
+ cloud = (new pcl::PointCloud<pcl::PointXYZ> ())->makeShared ();
+ if (pcl::io::loadPCDFile (argv[1], *cloud) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `rops_cloud.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ indices = boost::shared_ptr <pcl::PointIndices> (new pcl::PointIndices ());
+ std::ifstream indices_file;
+ indices_file.open (argv[2], std::ifstream::in);
+ for (std::string line; std::getline (indices_file, line);)
+ {
+ std::istringstream in (line);
+ unsigned int index = 0;
+ in >> index;
+ indices->indices.push_back (index - 1);
+ }
+ indices_file.close ();
+
+ std::ifstream triangles_file;
+ triangles_file.open (argv[3], std::ifstream::in);
+ for (std::string line; std::getline (triangles_file, line);)
+ {
+ pcl::Vertices triangle;
+ std::istringstream in (line);
+ unsigned int vertex = 0;
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ in >> vertex;
+ triangle.vertices.push_back (vertex - 1);
+ triangles.push_back (triangle);
+ }
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
PCL_ADD_TEST(filters_filters test_filters
FILES test_filters.cpp
LINK_WITH pcl_gtest pcl_filters pcl_io pcl_sample_consensus pcl_kdtree pcl_features pcl_segmentation
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd ${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd" "${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd")
PCL_ADD_TEST(filters_sampling test_filters_sampling
FILES test_sampling.cpp
LINK_WITH pcl_gtest pcl_filters pcl_io pcl_kdtree pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/sac_plane_test.pcd ${PCL_SOURCE_DIR}/test/cturtle.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/sac_plane_test.pcd" "${PCL_SOURCE_DIR}/test/cturtle.pcd")
PCL_ADD_TEST(filters_bilateral test_filters_bilateral
FILES test_bilateral.cpp
LINK_WITH pcl_gtest pcl_filters pcl_io pcl_kdtree
- ARGUMENTS ${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd")
+PCL_ADD_TEST(filters_grid_minimum test_filters_grid_minimum
+ FILES test_grid_minimum.cpp
+ LINK_WITH pcl_gtest pcl_common pcl_filters)
+PCL_ADD_TEST(filters_model_outlier_removal test_model_outlier_removal
+ FILES test_model_outlier_removal.cpp
+ LINK_WITH pcl_gtest pcl_filters pcl_io pcl_sample_consensus pcl_kdtree pcl_features
+ ARGUMENTS ${PCL_SOURCE_DIR}/test/milk_cartoon_all_small_clorox.pcd)
+PCL_ADD_TEST(filters_morphological test_morphological
+ FILES test_morphological.cpp
+ LINK_WITH pcl_gtest pcl_common pcl_filters)
+
+PCL_ADD_TEST(filters_local_maximum test_filters_local_maximum
+ FILES test_local_maximum.cpp
+ LINK_WITH pcl_gtest pcl_common pcl_filters)
+
0.12)));
// build the filter
- ConditionalRemoval<PointXYZ> condrem (range_cond);
+ ConditionalRemoval<PointXYZ> condrem;
+ condrem.setCondition (range_cond);
condrem.setInputCloud (cloud);
// try the dense version
EXPECT_EQ (bool (output.is_dense), false);
// build the filter
- ConditionalRemoval<PointXYZ> condrem_ (range_cond,true);
+ ConditionalRemoval<PointXYZ> condrem_ (true);
+ condrem_.setCondition (range_cond);
condrem_.setInputCloud (cloud);
// try the dense version
Eigen::Vector3f::Zero (), 0)));
// build the filter
- ConditionalRemoval<PointXYZ> condrem2 (true_cond);
+ ConditionalRemoval<PointXYZ> condrem2;
+ condrem2.setCondition (true_cond);
condrem2.setInputCloud (cloud);
condrem2.setIndices (indices);
EXPECT_EQ (num_not_nan, 2);
// build the filter
- ConditionalRemoval<PointXYZ> condrem2_ (true_cond, true);
+ ConditionalRemoval<PointXYZ> condrem2_ (true);
+ condrem2_.setCondition (true_cond);
condrem2_.setIndices (indices);
condrem2_.setInputCloud (cloud);
cyl_cond->addComparison (cyl_comp);
// build the filter
- ConditionalRemoval<PointXYZ> condrem (cyl_cond);
+ ConditionalRemoval<PointXYZ> condrem;
+ condrem.setCondition (cyl_cond);
condrem.setInputCloud (input);
condrem.setKeepOrganized (false);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/filters/grid_minimum.h>
+#include <pcl/point_types.h>
+
+using namespace pcl;
+
+PointCloud<PointXYZ> cloud;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Grid, Minimum)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 3;
+ cloud_in.is_dense = true;
+ cloud_in.resize (3);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0.25;
+ cloud_in[1].x = 0.5; cloud_in[1].y = 0.5; cloud_in[1].z = 1;
+ cloud_in[2].x = 1.5; cloud_in[2].y = 1.5; cloud_in[2].z = 0.0;
+
+ GridMinimum<PointXYZ> gm (1.0f);
+ gm.setInputCloud (cloud_in.makeShared ());
+ gm.filter (cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 0.25f);
+ EXPECT_EQ (cloud_out[1].z, 0.0f);
+ EXPECT_EQ (cloud_out.size (), 2);
+ EXPECT_EQ (gm.getResolution (), 1.0f);
+
+ gm.setResolution (2.0f);
+ gm.filter (cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 0.0f);
+ EXPECT_EQ (cloud_out.size (), 1);
+ EXPECT_EQ (gm.getResolution (), 2.0f);
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/filters/local_maximum.h>
+#include <pcl/point_types.h>
+
+using namespace pcl;
+
+PointCloud<PointXYZ> cloud;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Filters, LocalMaximum)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 3;
+ cloud_in.is_dense = true;
+ cloud_in.resize (4);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0.25;
+ cloud_in[1].x = 0.25; cloud_in[1].y = 0.25; cloud_in[1].z = 0.5;
+ cloud_in[2].x = 0.5; cloud_in[2].y = 0.5; cloud_in[2].z = 1;
+ cloud_in[3].x = 5; cloud_in[3].y = 5; cloud_in[3].z = 2;
+
+ LocalMaximum<PointXYZ> lm;
+ lm.setInputCloud (cloud_in.makeShared ());
+ lm.setRadius (1.0f);
+ lm.filter (cloud_out);
+
+ EXPECT_EQ (0.25f, cloud_out[0].z);
+ EXPECT_EQ (0.50f, cloud_out[1].z);
+ EXPECT_EQ (2.00f, cloud_out[2].z);
+ EXPECT_EQ (3, cloud_out.size ());
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/filters/model_outlier_removal.h>
+
+#include <pcl/sample_consensus/ransac.h>
+#include <pcl/sample_consensus/sac_model_plane.h>
+
+/* Expectation:
+ A model found by ransac has the same inliers and outliers as the same model filtered with model_outlier_removal
+ as long as the thresholdfunction of ransac and model_outlier_removal is the same */
+
+using namespace pcl;
+
+PointCloud<PointXYZ>::Ptr cloud_in (new PointCloud<PointXYZ>);
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (ModelOutlierRemoval, Model_Outlier_Filter)
+{
+ PointCloud<PointXYZ>::Ptr cloud_filter_out (new PointCloud<PointXYZ>);
+ std::vector<int> ransac_inliers;
+ float thresh = 0.01;
+ //run ransac
+ Eigen::VectorXf model_coefficients;
+ pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud_in));
+ RandomSampleConsensus < pcl::PointXYZ > ransac (model_p);
+ ransac.setDistanceThreshold (thresh);
+ ransac.computeModel ();
+ ransac.getInliers (ransac_inliers);
+ ransac.getModelCoefficients (model_coefficients);
+ // test ransacs result
+ EXPECT_EQ (model_coefficients.size (), 4);
+ if (model_coefficients.size () != 4)
+ return;
+ //run filter
+ pcl::ModelCoefficients model_coeff;
+ model_coeff.values.resize (4);
+ for (int i = 0; i < 4; i++)
+ model_coeff.values[i] = model_coefficients[i];
+ pcl::ModelOutlierRemoval < pcl::PointXYZ > filter;
+ filter.setModelCoefficients (model_coeff);
+ filter.setThreshold (thresh);
+ filter.setModelType (pcl::SACMODEL_PLANE);
+ filter.setInputCloud (cloud_in);
+ filter.filter (*cloud_filter_out);
+ //compare results
+ EXPECT_EQ (cloud_filter_out->points.size (), ransac_inliers.size ());
+ //TODO: also compare content
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ // Load a standard PCD file from disk
+ if (argc < 2)
+ {
+ std::cerr << "No test file given. Please download `milk_cartoon_all_small_clorox.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ char* file_name = argv[1];
+ // Load a standard PCD file from disk
+ io::loadPCDFile (file_name, *cloud_in);
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/filters/morphological_filter.h>
+#include <pcl/point_types.h>
+
+using namespace pcl;
+
+PointCloud<PointXYZ> cloud;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Morphological, Dilate)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 2;
+ cloud_in.is_dense = true;
+ cloud_in.resize (2);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0;
+ cloud_in[1].x = 1; cloud_in[1].y = 1; cloud_in[1].z = 1;
+
+ float resolution = 5.0f;
+
+ applyMorphologicalOperator<PointXYZ> (cloud_in.makeShared (), resolution, MORPH_DILATE, cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 1.0f);
+ EXPECT_EQ (cloud_out[1].z, 1.0f);
+ EXPECT_EQ (cloud_in.size(), cloud_out.size());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Morphological, Erode)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 2;
+ cloud_in.is_dense = true;
+ cloud_in.resize (2);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0;
+ cloud_in[1].x = 1; cloud_in[1].y = 1; cloud_in[1].z = 1;
+
+ float resolution = 5.0f;
+
+ applyMorphologicalOperator<PointXYZ> (cloud_in.makeShared (), resolution, MORPH_ERODE, cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 0.0f);
+ EXPECT_EQ (cloud_out[1].z, 0.0f);
+ EXPECT_EQ (cloud_in.size(), cloud_out.size());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Morphological, Open)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 2;
+ cloud_in.is_dense = true;
+ cloud_in.resize (2);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0;
+ cloud_in[1].x = 1; cloud_in[1].y = 1; cloud_in[1].z = 1;
+
+ float resolution = 5.0f;
+
+ applyMorphologicalOperator<PointXYZ> (cloud_in.makeShared (), resolution, MORPH_OPEN, cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 0.0f);
+ EXPECT_EQ (cloud_out[1].z, 0.0f);
+ EXPECT_EQ (cloud_in.size (), cloud_out.size ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Morphological, Close)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 2;
+ cloud_in.is_dense = true;
+ cloud_in.resize (2);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0;
+ cloud_in[1].x = 1; cloud_in[1].y = 1; cloud_in[1].z = 1;
+
+ float resolution = 5.0f;
+
+ applyMorphologicalOperator<PointXYZ> (cloud_in.makeShared (), resolution, MORPH_CLOSE, cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 1.0f);
+ EXPECT_EQ (cloud_out[1].z, 1.0f);
+ EXPECT_EQ (cloud_in.size (), cloud_out.size ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (Morphological, Unsupported)
+{
+ PointCloud<PointXYZ> cloud_in, cloud_out;
+
+ cloud_in.height = 1;
+ cloud_in.width = 2;
+ cloud_in.is_dense = true;
+ cloud_in.resize (2);
+
+ cloud_in[0].x = 0; cloud_in[0].y = 0; cloud_in[0].z = 0;
+ cloud_in[1].x = 1; cloud_in[1].y = 1; cloud_in[1].z = 1;
+
+ float resolution = 5.0f;
+
+ applyMorphologicalOperator<PointXYZ> (cloud_in.makeShared (), resolution, 99, cloud_out);
+
+ EXPECT_EQ (cloud_out[0].z, 0.0f);
+ EXPECT_EQ (cloud_out[1].z, 1.0f);
+ EXPECT_EQ (cloud_in.size (), cloud_out.size ());
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
+
vi.push_back (VI (0)); vi.push_back (VI (4)); vi.push_back (VI (5)); faces_.push_back (vi); vi.clear ();
vi.push_back (VI (0)); vi.push_back (VI (5)); vi.push_back (VI (6)); faces_.push_back (vi); vi.clear ();
vi.push_back (VI (0)); vi.push_back (VI (6)); vi.push_back (VI (1)); faces_.push_back (vi); vi.clear ();
- for (int i=0; i<faces_.size (); ++i)
+ for (size_t i=0; i<faces_.size (); ++i)
{
ASSERT_TRUE (mesh_.addFace (faces_ [i]).isValid ()) << "Face number " << i;
}
{
FaceIndices expected, actual;
const int n = static_cast<int> (mesh_.sizeFaces ());
- for (unsigned int i = 0; i < mesh_.sizeFaces (); ++i)
+ for (int i = 0; i < static_cast<int> (mesh_.sizeFaces ()); ++i)
{
expected.clear ();
expected.push_back (FaceIndex (i==(n-1) ? 0 : (i+1)));
{
FaceIndices expected, actual;
const int n = static_cast<int> (mesh_.sizeFaces ());
- for (unsigned int i = 0; i < mesh_.sizeFaces (); ++i)
+ for (int i = 0; i < static_cast<int> (mesh_.sizeFaces ()); ++i)
{
expected.clear ();
expected.push_back (FaceIndex (i== 0 ? (n-1) : (i-1)));
for (size_t i=0; i<faces.size (); ++i)
{
vi.clear ();
- for (int j=0; j<faces [i].size (); ++j)
+ for (size_t j=0; j<faces [i].size (); ++j)
{
vi.push_back (VertexIndex (static_cast <int> (faces [i][j])));
}
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for death tests. It is
-// #included by gtest.h so a user doesn't need to include this
-// directly.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-
-#include "gtest/internal/gtest-death-test-internal.h"
-
-namespace testing {
-
-// This flag controls the style of death tests. Valid values are "threadsafe",
-// meaning that the death test child process will re-execute the test binary
-// from the start, running only a single death test, or "fast",
-// meaning that the child process will execute the test logic immediately
-// after forking.
-GTEST_DECLARE_string_(death_test_style);
-
-#if GTEST_HAS_DEATH_TEST
-
-// The following macros are useful for writing death tests.
-
-// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
-// executed:
-//
-// 1. It generates a warning if there is more than one active
-// thread. This is because it's safe to fork() or clone() only
-// when there is a single thread.
-//
-// 2. The parent process clone()s a sub-process and runs the death
-// test in it; the sub-process exits with code 0 at the end of the
-// death test, if it hasn't exited already.
-//
-// 3. The parent process waits for the sub-process to terminate.
-//
-// 4. The parent process checks the exit code and error message of
-// the sub-process.
-//
-// Examples:
-//
-// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
-// for (int i = 0; i < 5; i++) {
-// EXPECT_DEATH(server.ProcessRequest(i),
-// "Invalid request .* in ProcessRequest()")
-// << "Failed to die on request " << i);
-// }
-//
-// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
-//
-// bool KilledBySIGHUP(int exit_code) {
-// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
-// }
-//
-// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
-//
-// On the regular expressions used in death tests:
-//
-// On POSIX-compliant systems (*nix), we use the <regex.h> library,
-// which uses the POSIX extended regex syntax.
-//
-// On other platforms (e.g. Windows), we only support a simple regex
-// syntax implemented as part of Google Test. This limited
-// implementation should be enough most of the time when writing
-// death tests; though it lacks many features you can find in PCRE
-// or POSIX extended regex syntax. For example, we don't support
-// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
-// repetition count ("x{5,7}"), among others.
-//
-// Below is the syntax that we do support. We chose it to be a
-// subset of both PCRE and POSIX extended regex, so it's easy to
-// learn wherever you come from. In the following: 'A' denotes a
-// literal character, period (.), or a single \\ escape sequence;
-// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
-// natural numbers.
-//
-// c matches any literal character c
-// \\d matches any decimal digit
-// \\D matches any character that's not a decimal digit
-// \\f matches \f
-// \\n matches \n
-// \\r matches \r
-// \\s matches any ASCII whitespace, including \n
-// \\S matches any character that's not a whitespace
-// \\t matches \t
-// \\v matches \v
-// \\w matches any letter, _, or decimal digit
-// \\W matches any character that \\w doesn't match
-// \\c matches any literal character c, which must be a punctuation
-// . matches any single character except \n
-// A? matches 0 or 1 occurrences of A
-// A* matches 0 or many occurrences of A
-// A+ matches 1 or many occurrences of A
-// ^ matches the beginning of a string (not that of each line)
-// $ matches the end of a string (not that of each line)
-// xy matches x followed by y
-//
-// If you accidentally use PCRE or POSIX extended regex features
-// not implemented by us, you will get a run-time failure. In that
-// case, please try to rewrite your regular expression within the
-// above syntax.
-//
-// This implementation is *not* meant to be as highly tuned or robust
-// as a compiled regex library, but should perform well enough for a
-// death test, which already incurs significant overhead by launching
-// a child process.
-//
-// Known caveats:
-//
-// A "threadsafe" style death test obtains the path to the test
-// program from argv[0] and re-executes it in the sub-process. For
-// simplicity, the current implementation doesn't search the PATH
-// when launching the sub-process. This means that the user must
-// invoke the test program via a path that contains at least one
-// path separator (e.g. path/to/foo_test and
-// /absolute/path/to/bar_test are fine, but foo_test is not). This
-// is rarely a problem as people usually don't put the test binary
-// directory in PATH.
-//
-// TODO(wan@google.com): make thread-safe death tests search the PATH.
-
-// Asserts that a given statement causes the program to exit, with an
-// integer exit status that satisfies predicate, and emitting error output
-// that matches regex.
-# define ASSERT_EXIT(statement, predicate, regex) \
- GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
-
-// Like ASSERT_EXIT, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_EXIT(statement, predicate, regex) \
- GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
-
-// Asserts that a given statement causes the program to exit, either by
-// explicitly exiting with a nonzero exit code or being killed by a
-// signal, and emitting error output that matches regex.
-# define ASSERT_DEATH(statement, regex) \
- ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Like ASSERT_DEATH, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_DEATH(statement, regex) \
- EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
-
-// Tests that an exit code describes a normal exit with a given exit code.
-class GTEST_API_ ExitedWithCode {
- public:
- explicit ExitedWithCode(int exit_code);
- bool operator()(int exit_status) const;
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ExitedWithCode& other);
-
- const int exit_code_;
-};
-
-# if !GTEST_OS_WINDOWS
-// Tests that an exit code describes an exit due to termination by a
-// given signal.
-class GTEST_API_ KilledBySignal {
- public:
- explicit KilledBySignal(int signum);
- bool operator()(int exit_status) const;
- private:
- const int signum_;
-};
-# endif // !GTEST_OS_WINDOWS
-
-// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
-// The death testing framework causes this to have interesting semantics,
-// since the sideeffects of the call are only visible in opt mode, and not
-// in debug mode.
-//
-// In practice, this can be used to test functions that utilize the
-// LOG(DFATAL) macro using the following style:
-//
-// int DieInDebugOr12(int* sideeffect) {
-// if (sideeffect) {
-// *sideeffect = 12;
-// }
-// LOG(DFATAL) << "death";
-// return 12;
-// }
-//
-// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
-// int sideeffect = 0;
-// // Only asserts in dbg.
-// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
-//
-// #ifdef NDEBUG
-// // opt-mode has sideeffect visible.
-// EXPECT_EQ(12, sideeffect);
-// #else
-// // dbg-mode no visible sideeffect.
-// EXPECT_EQ(0, sideeffect);
-// #endif
-// }
-//
-// This will assert that DieInDebugReturn12InOpt() crashes in debug
-// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
-// appropriate fallback value (12 in this case) in opt mode. If you
-// need to test that a function has appropriate side-effects in opt
-// mode, include assertions against the side-effects. A general
-// pattern for this is:
-//
-// EXPECT_DEBUG_DEATH({
-// // Side-effects here will have an effect after this statement in
-// // opt mode, but none in debug mode.
-// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
-// }, "death");
-//
-# ifdef NDEBUG
-
-# define EXPECT_DEBUG_DEATH(statement, regex) \
- do { statement; } while (::testing::internal::AlwaysFalse())
-
-# define ASSERT_DEBUG_DEATH(statement, regex) \
- do { statement; } while (::testing::internal::AlwaysFalse())
-
-# else
-
-# define EXPECT_DEBUG_DEATH(statement, regex) \
- EXPECT_DEATH(statement, regex)
-
-# define ASSERT_DEBUG_DEATH(statement, regex) \
- ASSERT_DEATH(statement, regex)
-
-# endif // NDEBUG for EXPECT_DEBUG_DEATH
-#endif // GTEST_HAS_DEATH_TEST
-
-// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
-// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
-// death tests are supported; otherwise they just issue a warning. This is
-// useful when you are combining death test assertions with normal test
-// assertions in one test.
-#if GTEST_HAS_DEATH_TEST
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- EXPECT_DEATH(statement, regex)
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- ASSERT_DEATH(statement, regex)
-#else
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
-#endif
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the Message class.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
-// program!
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-
-#include <limits>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// The Message class works like an ostream repeater.
-//
-// Typical usage:
-//
-// 1. You stream a bunch of values to a Message object.
-// It will remember the text in a stringstream.
-// 2. Then you stream the Message object to an ostream.
-// This causes the text in the Message to be streamed
-// to the ostream.
-//
-// For example;
-//
-// testing::Message foo;
-// foo << 1 << " != " << 2;
-// std::cout << foo;
-//
-// will print "1 != 2".
-//
-// Message is not intended to be inherited from. In particular, its
-// destructor is not virtual.
-//
-// Note that stringstream behaves differently in gcc and in MSVC. You
-// can stream a NULL char pointer to it in the former, but not in the
-// latter (it causes an access violation if you do). The Message
-// class hides this difference by treating a NULL char pointer as
-// "(null)".
-class GTEST_API_ Message {
- private:
- // The type of basic IO manipulators (endl, ends, and flush) for
- // narrow streams.
- typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
-
- public:
- // Constructs an empty Message.
- // We allocate the stringstream separately because otherwise each use of
- // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
- // stack frame leading to huge stack frames in some cases; gcc does not reuse
- // the stack space.
- Message() : ss_(new ::std::stringstream) {
- // By default, we want there to be enough precision when printing
- // a double to a Message.
- *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
- }
-
- // Copy constructor.
- Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
- *ss_ << msg.GetString();
- }
-
- // Constructs a Message from a C-string.
- explicit Message(const char* str) : ss_(new ::std::stringstream) {
- *ss_ << str;
- }
-
-#if GTEST_OS_SYMBIAN
- // Streams a value (either a pointer or not) to this object.
- template <typename T>
- inline Message& operator <<(const T& value) {
- StreamHelper(typename internal::is_pointer<T>::type(), value);
- return *this;
- }
-#else
- // Streams a non-pointer value to this object.
- template <typename T>
- inline Message& operator <<(const T& val) {
- ::GTestStreamToHelper(ss_.get(), val);
- return *this;
- }
-
- // Streams a pointer value to this object.
- //
- // This function is an overload of the previous one. When you
- // stream a pointer to a Message, this definition will be used as it
- // is more specialized. (The C++ Standard, section
- // [temp.func.order].) If you stream a non-pointer, then the
- // previous definition will be used.
- //
- // The reason for this overload is that streaming a NULL pointer to
- // ostream is undefined behavior. Depending on the compiler, you
- // may get "0", "(nil)", "(null)", or an access violation. To
- // ensure consistent result across compilers, we always treat NULL
- // as "(null)".
- template <typename T>
- inline Message& operator <<(T* const& pointer) { // NOLINT
- if (pointer == NULL) {
- *ss_ << "(null)";
- } else {
- ::GTestStreamToHelper(ss_.get(), pointer);
- }
- return *this;
- }
-#endif // GTEST_OS_SYMBIAN
-
- // Since the basic IO manipulators are overloaded for both narrow
- // and wide streams, we have to provide this specialized definition
- // of operator <<, even though its body is the same as the
- // templatized version above. Without this definition, streaming
- // endl or other basic IO manipulators to Message will confuse the
- // compiler.
- Message& operator <<(BasicNarrowIoManip val) {
- *ss_ << val;
- return *this;
- }
-
- // Instead of 1/0, we want to see true/false for bool values.
- Message& operator <<(bool b) {
- return *this << (b ? "true" : "false");
- }
-
- // These two overloads allow streaming a wide C string to a Message
- // using the UTF-8 encoding.
- Message& operator <<(const wchar_t* wide_c_str) {
- return *this << internal::String::ShowWideCString(wide_c_str);
- }
- Message& operator <<(wchar_t* wide_c_str) {
- return *this << internal::String::ShowWideCString(wide_c_str);
- }
-
-#if GTEST_HAS_STD_WSTRING
- // Converts the given wide string to a narrow string using the UTF-8
- // encoding, and streams the result to this Message object.
- Message& operator <<(const ::std::wstring& wstr);
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
- // Converts the given wide string to a narrow string using the UTF-8
- // encoding, and streams the result to this Message object.
- Message& operator <<(const ::wstring& wstr);
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
- // Gets the text streamed to this object so far as a String.
- // Each '\0' character in the buffer is replaced with "\\0".
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- internal::String GetString() const {
- return internal::StringStreamToString(ss_.get());
- }
-
- private:
-
-#if GTEST_OS_SYMBIAN
- // These are needed as the Nokia Symbian Compiler cannot decide between
- // const T& and const T* in a function template. The Nokia compiler _can_
- // decide between class template specializations for T and T*, so a
- // tr1::type_traits-like is_pointer works, and we can overload on that.
- template <typename T>
- inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
- if (pointer == NULL) {
- *ss_ << "(null)";
- } else {
- ::GTestStreamToHelper(ss_.get(), pointer);
- }
- }
- template <typename T>
- inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
- ::GTestStreamToHelper(ss_.get(), value);
- }
-#endif // GTEST_OS_SYMBIAN
-
- // We'll hold the text streamed to this object here.
- const internal::scoped_ptr< ::std::stringstream> ss_;
-
- // We declare (but don't implement) this to prevent the compiler
- // from implementing the assignment operator.
- void operator=(const Message&);
-};
-
-// Streams a Message to an ostream.
-inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
- return os << sb.GetString();
-}
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+++ /dev/null
-// This file was GENERATED by command:
-// pump.py gtest-param-test.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: vladl@google.com (Vlad Losev)
-//
-// Macros and functions for implementing parameterized tests
-// in Google C++ Testing Framework (Google Test)
-//
-// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-
-
-// Value-parameterized tests allow you to test your code with different
-// parameters without writing multiple copies of the same test.
-//
-// Here is how you use value-parameterized tests:
-
-#if 0
-
-// To write value-parameterized tests, first you should define a fixture
-// class. It is usually derived from testing::TestWithParam<T> (see below for
-// another inheritance scheme that's sometimes useful in more complicated
-// class hierarchies), where the type of your parameter values.
-// TestWithParam<T> is itself derived from testing::Test. T can be any
-// copyable type. If it's a raw pointer, you are responsible for managing the
-// lifespan of the pointed values.
-
-class FooTest : public ::testing::TestWithParam<const char*> {
- // You can implement all the usual class fixture members here.
-};
-
-// Then, use the TEST_P macro to define as many parameterized tests
-// for this fixture as you want. The _P suffix is for "parameterized"
-// or "pattern", whichever you prefer to think.
-
-TEST_P(FooTest, DoesBlah) {
- // Inside a test, access the test parameter with the GetParam() method
- // of the TestWithParam<T> class:
- EXPECT_TRUE(foo.Blah(GetParam()));
- ...
-}
-
-TEST_P(FooTest, HasBlahBlah) {
- ...
-}
-
-// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
-// case with any set of parameters you want. Google Test defines a number
-// of functions for generating test parameters. They return what we call
-// (surprise!) parameter generators. Here is a summary of them, which
-// are all in the testing namespace:
-//
-//
-// Range(begin, end [, step]) - Yields values {begin, begin+step,
-// begin+step+step, ...}. The values do not
-// include end. step defaults to 1.
-// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
-// ValuesIn(container) - Yields values from a C-style array, an STL
-// ValuesIn(begin,end) container, or an iterator range [begin, end).
-// Bool() - Yields sequence {false, true}.
-// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
-// for the math savvy) of the values generated
-// by the N generators.
-//
-// For more details, see comments at the definitions of these functions below
-// in this file.
-//
-// The following statement will instantiate tests from the FooTest test case
-// each with parameter values "meeny", "miny", and "moe".
-
-INSTANTIATE_TEST_CASE_P(InstantiationName,
- FooTest,
- Values("meeny", "miny", "moe"));
-
-// To distinguish different instances of the pattern, (yes, you
-// can instantiate it more then once) the first argument to the
-// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
-// actual test case name. Remember to pick unique prefixes for different
-// instantiations. The tests from the instantiation above will have
-// these names:
-//
-// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
-// * InstantiationName/FooTest.DoesBlah/1 for "miny"
-// * InstantiationName/FooTest.DoesBlah/2 for "moe"
-// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
-// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
-// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
-//
-// You can use these names in --gtest_filter.
-//
-// This statement will instantiate all tests from FooTest again, each
-// with parameter values "cat" and "dog":
-
-const char* pets[] = {"cat", "dog"};
-INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
-
-// The tests from the instantiation above will have these names:
-//
-// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
-// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
-// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
-// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
-//
-// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
-// in the given test case, whether their definitions come before or
-// AFTER the INSTANTIATE_TEST_CASE_P statement.
-//
-// Please also note that generator expressions (including parameters to the
-// generators) are evaluated in InitGoogleTest(), after main() has started.
-// This allows the user on one hand, to adjust generator parameters in order
-// to dynamically determine a set of tests to run and on the other hand,
-// give the user a chance to inspect the generated tests with Google Test
-// reflection API before RUN_ALL_TESTS() is executed.
-//
-// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
-// for more examples.
-//
-// In the future, we plan to publish the API for defining new parameter
-// generators. But for now this interface remains part of the internal
-// implementation and is subject to change.
-//
-//
-// A parameterized test fixture must be derived from testing::Test and from
-// testing::WithParamInterface<T>, where T is the type of the parameter
-// values. Inheriting from TestWithParam<T> satisfies that requirement because
-// TestWithParam<T> inherits from both Test and WithParamInterface. In more
-// complicated hierarchies, however, it is occasionally useful to inherit
-// separately from Test and WithParamInterface. For example:
-
-class BaseTest : public ::testing::Test {
- // You can inherit all the usual members for a non-parameterized test
- // fixture here.
-};
-
-class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
- // The usual test fixture members go here too.
-};
-
-TEST_F(BaseTest, HasFoo) {
- // This is an ordinary non-parameterized test.
-}
-
-TEST_P(DerivedTest, DoesBlah) {
- // GetParam works just the same here as if you inherit from TestWithParam.
- EXPECT_TRUE(foo.Blah(GetParam()));
-}
-
-#endif // 0
-
-#include "gtest/internal/gtest-port.h"
-
-#if !GTEST_OS_SYMBIAN
-# include <utility>
-#endif
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-param-util-generated.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Functions producing parameter generators.
-//
-// Google Test uses these generators to produce parameters for value-
-// parameterized tests. When a parameterized test case is instantiated
-// with a particular generator, Google Test creates and runs tests
-// for each element in the sequence produced by the generator.
-//
-// In the following sample, tests from test case FooTest are instantiated
-// each three times with parameter values 3, 5, and 8:
-//
-// class FooTest : public TestWithParam<int> { ... };
-//
-// TEST_P(FooTest, TestThis) {
-// }
-// TEST_P(FooTest, TestThat) {
-// }
-// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
-//
-
-// Range() returns generators providing sequences of values in a range.
-//
-// Synopsis:
-// Range(start, end)
-// - returns a generator producing a sequence of values {start, start+1,
-// start+2, ..., }.
-// Range(start, end, step)
-// - returns a generator producing a sequence of values {start, start+step,
-// start+step+step, ..., }.
-// Notes:
-// * The generated sequences never include end. For example, Range(1, 5)
-// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
-// returns a generator producing {1, 3, 5, 7}.
-// * start and end must have the same type. That type may be any integral or
-// floating-point type or a user defined type satisfying these conditions:
-// * It must be assignable (have operator=() defined).
-// * It must have operator+() (operator+(int-compatible type) for
-// two-operand version).
-// * It must have operator<() defined.
-// Elements in the resulting sequences will also have that type.
-// * Condition start < end must be satisfied in order for resulting sequences
-// to contain any elements.
-//
-template <typename T, typename IncrementT>
-internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
- return internal::ParamGenerator<T>(
- new internal::RangeGenerator<T, IncrementT>(start, end, step));
-}
-
-template <typename T>
-internal::ParamGenerator<T> Range(T start, T end) {
- return Range(start, end, 1);
-}
-
-// ValuesIn() function allows generation of tests with parameters coming from
-// a container.
-//
-// Synopsis:
-// ValuesIn(const T (&array)[N])
-// - returns a generator producing sequences with elements from
-// a C-style array.
-// ValuesIn(const Container& container)
-// - returns a generator producing sequences with elements from
-// an STL-style container.
-// ValuesIn(Iterator begin, Iterator end)
-// - returns a generator producing sequences with elements from
-// a range [begin, end) defined by a pair of STL-style iterators. These
-// iterators can also be plain C pointers.
-//
-// Please note that ValuesIn copies the values from the containers
-// passed in and keeps them to generate tests in RUN_ALL_TESTS().
-//
-// Examples:
-//
-// This instantiates tests from test case StringTest
-// each with C-string values of "foo", "bar", and "baz":
-//
-// const char* strings[] = {"foo", "bar", "baz"};
-// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
-//
-// This instantiates tests from test case StlStringTest
-// each with STL strings with values "a" and "b":
-//
-// ::std::vector< ::std::string> GetParameterStrings() {
-// ::std::vector< ::std::string> v;
-// v.push_back("a");
-// v.push_back("b");
-// return v;
-// }
-//
-// INSTANTIATE_TEST_CASE_P(CharSequence,
-// StlStringTest,
-// ValuesIn(GetParameterStrings()));
-//
-//
-// This will also instantiate tests from CharTest
-// each with parameter values 'a' and 'b':
-//
-// ::std::list<char> GetParameterChars() {
-// ::std::list<char> list;
-// list.push_back('a');
-// list.push_back('b');
-// return list;
-// }
-// ::std::list<char> l = GetParameterChars();
-// INSTANTIATE_TEST_CASE_P(CharSequence2,
-// CharTest,
-// ValuesIn(l.begin(), l.end()));
-//
-template <typename ForwardIterator>
-internal::ParamGenerator<
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end) {
- typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
- ::value_type ParamType;
- return internal::ParamGenerator<ParamType>(
- new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
-}
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
- return ValuesIn(array, array + N);
-}
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container) {
- return ValuesIn(container.begin(), container.end());
-}
-
-// Values() allows generating tests from explicitly specified list of
-// parameters.
-//
-// Synopsis:
-// Values(T v1, T v2, ..., T vN)
-// - returns a generator producing sequences with elements v1, v2, ..., vN.
-//
-// For example, this instantiates tests from test case BarTest each
-// with values "one", "two", and "three":
-//
-// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
-//
-// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
-// The exact type of values will depend on the type of parameter in BazTest.
-//
-// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
-//
-// Currently, Values() supports from 1 to 50 parameters.
-//
-template <typename T1>
-internal::ValueArray1<T1> Values(T1 v1) {
- return internal::ValueArray1<T1>(v1);
-}
-
-template <typename T1, typename T2>
-internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
- return internal::ValueArray2<T1, T2>(v1, v2);
-}
-
-template <typename T1, typename T2, typename T3>
-internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
- return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
- return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5) {
- return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6) {
- return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7) {
- return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
- v6, v7);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
- return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
- v5, v6, v7, v8);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
- return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
- return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
- T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11) {
- return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
- T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12) {
- return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13) {
- return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
- return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
- return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16) {
- return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17) {
- return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18) {
- return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
- return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
- return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
- return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22) {
- return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23) {
- return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24) {
- return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
- v19, v20, v21, v22, v23, v24);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
- return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
- v18, v19, v20, v21, v22, v23, v24, v25);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26) {
- return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27) {
- return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28) {
- return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
- v28);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29) {
- return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
- v27, v28, v29);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
- return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
- v26, v27, v28, v29, v30);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
- return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
- v25, v26, v27, v28, v29, v30, v31);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32) {
- return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33) {
- return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
- T31 v31, T32 v32, T33 v33, T34 v34) {
- return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
- return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
- return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37) {
- return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36, v37);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37, T38 v38) {
- return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
- v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
- v33, v34, v35, v36, v37, v38);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37, T38 v38, T39 v39) {
- return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
- v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
- v32, v33, v34, v35, v36, v37, v38, v39);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
- T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
- T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
- return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
- v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
- return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
- v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42) {
- return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
- v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
- v42);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43) {
- return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
- v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
- v41, v42, v43);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44) {
- return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
- v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
- v40, v41, v42, v43, v44);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
- T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
- T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
- return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
- v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
- v39, v40, v41, v42, v43, v44, v45);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
- return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
- v38, v39, v40, v41, v42, v43, v44, v45, v46);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
- return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
- v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
- T48 v48) {
- return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
- v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
- T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
- T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
- T47 v47, T48 v48, T49 v49) {
- return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
- v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
- T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
- T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
- return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
- v48, v49, v50);
-}
-
-// Bool() allows generating tests with parameters in a set of (false, true).
-//
-// Synopsis:
-// Bool()
-// - returns a generator producing sequences with elements {false, true}.
-//
-// It is useful when testing code that depends on Boolean flags. Combinations
-// of multiple flags can be tested when several Bool()'s are combined using
-// Combine() function.
-//
-// In the following example all tests in the test case FlagDependentTest
-// will be instantiated twice with parameters false and true.
-//
-// class FlagDependentTest : public testing::TestWithParam<bool> {
-// virtual void SetUp() {
-// external_flag = GetParam();
-// }
-// }
-// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
-//
-inline internal::ParamGenerator<bool> Bool() {
- return Values(false, true);
-}
-
-# if GTEST_HAS_COMBINE
-// Combine() allows the user to combine two or more sequences to produce
-// values of a Cartesian product of those sequences' elements.
-//
-// Synopsis:
-// Combine(gen1, gen2, ..., genN)
-// - returns a generator producing sequences with elements coming from
-// the Cartesian product of elements from the sequences generated by
-// gen1, gen2, ..., genN. The sequence elements will have a type of
-// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
-// of elements from sequences produces by gen1, gen2, ..., genN.
-//
-// Combine can have up to 10 arguments. This number is currently limited
-// by the maximum number of elements in the tuple implementation used by Google
-// Test.
-//
-// Example:
-//
-// This will instantiate tests in test case AnimalTest each one with
-// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
-// tuple("dog", BLACK), and tuple("dog", WHITE):
-//
-// enum Color { BLACK, GRAY, WHITE };
-// class AnimalTest
-// : public testing::TestWithParam<tuple<const char*, Color> > {...};
-//
-// TEST_P(AnimalTest, AnimalLooksNice) {...}
-//
-// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
-// Combine(Values("cat", "dog"),
-// Values(BLACK, WHITE)));
-//
-// This will instantiate tests in FlagDependentTest with all variations of two
-// Boolean flags:
-//
-// class FlagDependentTest
-// : public testing::TestWithParam<tuple(bool, bool)> > {
-// virtual void SetUp() {
-// // Assigns external_flag_1 and external_flag_2 values from the tuple.
-// tie(external_flag_1, external_flag_2) = GetParam();
-// }
-// };
-//
-// TEST_P(FlagDependentTest, TestFeature1) {
-// // Test your code using external_flag_1 and external_flag_2 here.
-// }
-// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
-// Combine(Bool(), Bool()));
-//
-template <typename Generator1, typename Generator2>
-internal::CartesianProductHolder2<Generator1, Generator2> Combine(
- const Generator1& g1, const Generator2& g2) {
- return internal::CartesianProductHolder2<Generator1, Generator2>(
- g1, g2);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3>
-internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3) {
- return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
- g1, g2, g3);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4>
-internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
- Generator4> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4) {
- return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
- Generator4>(
- g1, g2, g3, g4);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5>
-internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
- Generator4, Generator5> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5) {
- return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
- Generator4, Generator5>(
- g1, g2, g3, g4, g5);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6>
-internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6) {
- return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6>(
- g1, g2, g3, g4, g5, g6);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7>
-internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7) {
- return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7>(
- g1, g2, g3, g4, g5, g6, g7);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8>
-internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8) {
- return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8>(
- g1, g2, g3, g4, g5, g6, g7, g8);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8, typename Generator9>
-internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8,
- Generator9> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8, const Generator9& g9) {
- return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
- g1, g2, g3, g4, g5, g6, g7, g8, g9);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8, typename Generator9,
- typename Generator10>
-internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
- Generator10> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8, const Generator9& g9,
- const Generator10& g10) {
- return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
- Generator10>(
- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
-}
-# endif // GTEST_HAS_COMBINE
-
-
-
-# define TEST_P(test_case_name, test_name) \
- class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
- : public test_case_name { \
- public: \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
- virtual void TestBody(); \
- private: \
- static int AddToRegistry() { \
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
- GetTestCasePatternHolder<test_case_name>(\
- #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
- #test_case_name, \
- #test_name, \
- new ::testing::internal::TestMetaFactory< \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
- return 0; \
- } \
- static int gtest_registering_dummy_; \
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
- }; \
- int GTEST_TEST_CLASS_NAME_(test_case_name, \
- test_name)::gtest_registering_dummy_ = \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
- void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
- ::testing::internal::ParamGenerator<test_case_name::ParamType> \
- gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
- int gtest_##prefix##test_case_name##_dummy_ = \
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
- GetTestCasePatternHolder<test_case_name>(\
- #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
- #prefix, \
- >est_##prefix##test_case_name##_EvalGenerator_, \
- __FILE__, __LINE__)
-
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+++ /dev/null
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// A user can teach this function how to print a class type T by
-// defining either operator<<() or PrintTo() in the namespace that
-// defines T. More specifically, the FIRST defined function in the
-// following list will be used (assuming T is defined in namespace
-// foo):
-//
-// 1. foo::PrintTo(const T&, ostream*)
-// 2. operator<<(ostream&, const T&) defined in either foo or the
-// global namespace.
-//
-// If none of the above is defined, it will print the debug string of
-// the value if it is a protocol buffer, or print the raw bytes in the
-// value otherwise.
-//
-// To aid debugging: when T is a reference type, the address of the
-// value is also printed; when T is a (const) char pointer, both the
-// pointer value and the NUL-terminated string it points to are
-// printed.
-//
-// We also provide some convenient wrappers:
-//
-// // Prints a value to a string. For a (const or not) char
-// // pointer, the NUL-terminated string (but not the pointer) is
-// // printed.
-// std::string ::testing::PrintToString(const T& value);
-//
-// // Prints a value tersely: for a reference type, the referenced
-// // value (but not the address) is printed; for a (const or not) char
-// // pointer, the NUL-terminated string (but not the pointer) is
-// // printed.
-// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
-//
-// // Prints value using the type inferred by the compiler. The difference
-// // from UniversalTersePrint() is that this function prints both the
-// // pointer and the NUL-terminated string for a (const or not) char pointer.
-// void ::testing::internal::UniversalPrint(const T& value, ostream*);
-//
-// // Prints the fields of a tuple tersely to a string vector, one
-// // element for each field. Tuple support must be enabled in
-// // gtest-port.h.
-// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
-// const Tuple& value);
-//
-// Known limitation:
-//
-// The print primitives print the elements of an STL-style container
-// using the compiler-inferred type of *iter where iter is a
-// const_iterator of the container. When const_iterator is an input
-// iterator but not a forward iterator, this inferred type may not
-// match value_type, and the print output may be incorrect. In
-// practice, this is rarely a problem as for most containers
-// const_iterator is a forward iterator. We'll fix this if there's an
-// actual need for it. Note that this fix cannot rely on value_type
-// being defined as many user-defined container types don't have
-// value_type.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-
-#include <ostream> // NOLINT
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// Definitions in the 'internal' and 'internal2' name spaces are
-// subject to change without notice. DO NOT USE THEM IN USER CODE!
-namespace internal2 {
-
-// Prints the given number of bytes in the given object to the given
-// ostream.
-GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
- size_t count,
- ::std::ostream* os);
-
-// For selecting which printer to use when a given type has neither <<
-// nor PrintTo().
-enum TypeKind {
- kProtobuf, // a protobuf type
- kConvertibleToInteger, // a type implicitly convertible to BiggestInt
- // (e.g. a named or unnamed enum type)
- kOtherType // anything else
-};
-
-// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
-// by the universal printer to print a value of type T when neither
-// operator<< nor PrintTo() is defined for T, where kTypeKind is the
-// "kind" of T as defined by enum TypeKind.
-template <typename T, TypeKind kTypeKind>
-class TypeWithoutFormatter {
- public:
- // This default version is called when kTypeKind is kOtherType.
- static void PrintValue(const T& value, ::std::ostream* os) {
- PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
- sizeof(value), os);
- }
-};
-
-// We print a protobuf using its ShortDebugString() when the string
-// doesn't exceed this many characters; otherwise we print it using
-// DebugString() for better readability.
-const size_t kProtobufOneLinerMaxLength = 50;
-
-template <typename T>
-class TypeWithoutFormatter<T, kProtobuf> {
- public:
- static void PrintValue(const T& value, ::std::ostream* os) {
- const ::testing::internal::string short_str = value.ShortDebugString();
- const ::testing::internal::string pretty_str =
- short_str.length() <= kProtobufOneLinerMaxLength ?
- short_str : ("\n" + value.DebugString());
- *os << ("<" + pretty_str + ">");
- }
-};
-
-template <typename T>
-class TypeWithoutFormatter<T, kConvertibleToInteger> {
- public:
- // Since T has no << operator or PrintTo() but can be implicitly
- // converted to BiggestInt, we print it as a BiggestInt.
- //
- // Most likely T is an enum type (either named or unnamed), in which
- // case printing it as an integer is the desired behavior. In case
- // T is not an enum, printing it as an integer is the best we can do
- // given that it has no user-defined printer.
- static void PrintValue(const T& value, ::std::ostream* os) {
- const internal::BiggestInt kBigInt = value;
- *os << kBigInt;
- }
-};
-
-// Prints the given value to the given ostream. If the value is a
-// protocol message, its debug string is printed; if it's an enum or
-// of a type implicitly convertible to BiggestInt, it's printed as an
-// integer; otherwise the bytes in the value are printed. This is
-// what UniversalPrinter<T>::Print() does when it knows nothing about
-// type T and T has neither << operator nor PrintTo().
-//
-// A user can override this behavior for a class type Foo by defining
-// a << operator in the namespace where Foo is defined.
-//
-// We put this operator in namespace 'internal2' instead of 'internal'
-// to simplify the implementation, as much code in 'internal' needs to
-// use << in STL, which would conflict with our own << were it defined
-// in 'internal'.
-//
-// Note that this operator<< takes a generic std::basic_ostream<Char,
-// CharTraits> type instead of the more restricted std::ostream. If
-// we define it to take an std::ostream instead, we'll get an
-// "ambiguous overloads" compiler error when trying to print a type
-// Foo that supports streaming to std::basic_ostream<Char,
-// CharTraits>, as the compiler cannot tell whether
-// operator<<(std::ostream&, const T&) or
-// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
-// specific.
-template <typename Char, typename CharTraits, typename T>
-::std::basic_ostream<Char, CharTraits>& operator<<(
- ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
- TypeWithoutFormatter<T,
- (internal::IsAProtocolMessage<T>::value ? kProtobuf :
- internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
- kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
- return os;
-}
-
-} // namespace internal2
-} // namespace testing
-
-// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
-// magic needed for implementing UniversalPrinter won't work.
-namespace testing_internal {
-
-// Used to print a value that is not an STL-style container when the
-// user doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
- // With the following statement, during unqualified name lookup,
- // testing::internal2::operator<< appears as if it was declared in
- // the nearest enclosing namespace that contains both
- // ::testing_internal and ::testing::internal2, i.e. the global
- // namespace. For more details, refer to the C++ Standard section
- // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
- // testing::internal2::operator<< in case T doesn't come with a <<
- // operator.
- //
- // We cannot write 'using ::testing::internal2::operator<<;', which
- // gcc 3.3 fails to compile due to a compiler bug.
- using namespace ::testing::internal2; // NOLINT
-
- // Assuming T is defined in namespace foo, in the next statement,
- // the compiler will consider all of:
- //
- // 1. foo::operator<< (thanks to Koenig look-up),
- // 2. ::operator<< (as the current namespace is enclosed in ::),
- // 3. testing::internal2::operator<< (thanks to the using statement above).
- //
- // The operator<< whose type matches T best will be picked.
- //
- // We deliberately allow #2 to be a candidate, as sometimes it's
- // impossible to define #1 (e.g. when foo is ::std, defining
- // anything in it is undefined behavior unless you are a compiler
- // vendor.).
- *os << value;
-}
-
-} // namespace testing_internal
-
-namespace testing {
-namespace internal {
-
-// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
-// value to the given ostream. The caller must ensure that
-// 'ostream_ptr' is not NULL, or the behavior is undefined.
-//
-// We define UniversalPrinter as a class template (as opposed to a
-// function template), as we need to partially specialize it for
-// reference types, which cannot be done with function templates.
-template <typename T>
-class UniversalPrinter;
-
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os);
-
-// Used to print an STL-style container when the user doesn't define
-// a PrintTo() for it.
-template <typename C>
-void DefaultPrintTo(IsContainer /* dummy */,
- false_type /* is not a pointer */,
- const C& container, ::std::ostream* os) {
- const size_t kMaxCount = 32; // The maximum number of elements to print.
- *os << '{';
- size_t count = 0;
- for (typename C::const_iterator it = container.begin();
- it != container.end(); ++it, ++count) {
- if (count > 0) {
- *os << ',';
- if (count == kMaxCount) { // Enough has been printed.
- *os << " ...";
- break;
- }
- }
- *os << ' ';
- // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
- // handle *it being a native array.
- internal::UniversalPrint(*it, os);
- }
-
- if (count > 0) {
- *os << ' ';
- }
- *os << '}';
-}
-
-// Used to print a pointer that is neither a char pointer nor a member
-// pointer, when the user doesn't define PrintTo() for it. (A member
-// variable pointer or member function pointer doesn't really point to
-// a location in the address space. Their representation is
-// implementation-defined. Therefore they will be printed as raw
-// bytes.)
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
- true_type /* is a pointer */,
- T* p, ::std::ostream* os) {
- if (p == NULL) {
- *os << "NULL";
- } else {
- // C++ doesn't allow casting from a function pointer to any object
- // pointer.
- //
- // IsTrue() silences warnings: "Condition is always true",
- // "unreachable code".
- if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
- // T is not a function type. We just call << to print p,
- // relying on ADL to pick up user-defined << for their pointer
- // types, if any.
- *os << p;
- } else {
- // T is a function type, so '*os << p' doesn't do what we want
- // (it just prints p as bool). We want to print p as a const
- // void*. However, we cannot cast it to const void* directly,
- // even using reinterpret_cast, as earlier versions of gcc
- // (e.g. 3.4.5) cannot compile the cast when p is a function
- // pointer. Casting to UInt64 first solves the problem.
- *os << reinterpret_cast<const void*>(
- reinterpret_cast<internal::UInt64>(p));
- }
- }
-}
-
-// Used to print a non-container, non-pointer value when the user
-// doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
- false_type /* is not a pointer */,
- const T& value, ::std::ostream* os) {
- ::testing_internal::DefaultPrintNonContainerTo(value, os);
-}
-
-// Prints the given value using the << operator if it has one;
-// otherwise prints the bytes in it. This is what
-// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
-// or overloaded for type T.
-//
-// A user can override this behavior for a class type Foo by defining
-// an overload of PrintTo() in the namespace where Foo is defined. We
-// give the user this option as sometimes defining a << operator for
-// Foo is not desirable (e.g. the coding style may prevent doing it,
-// or there is already a << operator but it doesn't do what the user
-// wants).
-template <typename T>
-void PrintTo(const T& value, ::std::ostream* os) {
- // DefaultPrintTo() is overloaded. The type of its first two
- // arguments determine which version will be picked. If T is an
- // STL-style container, the version for container will be called; if
- // T is a pointer, the pointer version will be called; otherwise the
- // generic version will be called.
- //
- // Note that we check for container types here, prior to we check
- // for protocol message types in our operator<<. The rationale is:
- //
- // For protocol messages, we want to give people a chance to
- // override Google Mock's format by defining a PrintTo() or
- // operator<<. For STL containers, other formats can be
- // incompatible with Google Mock's format for the container
- // elements; therefore we check for container types here to ensure
- // that our format is used.
- //
- // The second argument of DefaultPrintTo() is needed to bypass a bug
- // in Symbian's C++ compiler that prevents it from picking the right
- // overload between:
- //
- // PrintTo(const T& x, ...);
- // PrintTo(T* x, ...);
- DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
-}
-
-// The following list of PrintTo() overloads tells
-// UniversalPrinter<T>::Print() how to print standard types (built-in
-// types, strings, plain arrays, and pointers).
-
-// Overloads for various char types.
-GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
-GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
-inline void PrintTo(char c, ::std::ostream* os) {
- // When printing a plain char, we always treat it as unsigned. This
- // way, the output won't be affected by whether the compiler thinks
- // char is signed or not.
- PrintTo(static_cast<unsigned char>(c), os);
-}
-
-// Overloads for other simple built-in types.
-inline void PrintTo(bool x, ::std::ostream* os) {
- *os << (x ? "true" : "false");
-}
-
-// Overload for wchar_t type.
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its decimal code (except for L'\0').
-// The L'\0' char is printed as "L'\\0'". The decimal code is printed
-// as signed integer when wchar_t is implemented by the compiler
-// as a signed type and is printed as an unsigned integer when wchar_t
-// is implemented as an unsigned type.
-GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
-
-// Overloads for C strings.
-GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
-inline void PrintTo(char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char*>(s), os);
-}
-
-// signed/unsigned char is often used for representing binary data, so
-// we print pointers to it as void* to be safe.
-inline void PrintTo(const signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-
-// MSVC can be configured to define wchar_t as a typedef of unsigned
-// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
-// type. When wchar_t is a typedef, defining an overload for const
-// wchar_t* would cause unsigned short* be printed as a wide string,
-// possibly causing invalid memory accesses.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Overloads for wide C strings
-GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
-inline void PrintTo(wchar_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const wchar_t*>(s), os);
-}
-#endif
-
-// Overload for C arrays. Multi-dimensional arrays are printed
-// properly.
-
-// Prints the given number of elements in an array, without printing
-// the curly braces.
-template <typename T>
-void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
- UniversalPrint(a[0], os);
- for (size_t i = 1; i != count; i++) {
- *os << ", ";
- UniversalPrint(a[i], os);
- }
-}
-
-// Overloads for ::string and ::std::string.
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
-inline void PrintTo(const ::string& s, ::std::ostream* os) {
- PrintStringTo(s, os);
-}
-#endif // GTEST_HAS_GLOBAL_STRING
-
-GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
-inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
- PrintStringTo(s, os);
-}
-
-// Overloads for ::wstring and ::std::wstring.
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
- PrintWideStringTo(s, os);
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
- PrintWideStringTo(s, os);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_TR1_TUPLE
-// Overload for ::std::tr1::tuple. Needed for printing function arguments,
-// which are packed as tuples.
-
-// Helper function for printing a tuple. T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os);
-
-// Overloaded PrintTo() for tuples of various arities. We support
-// tuples of up-to 10 fields. The following implementation works
-// regardless of whether tr1::tuple is implemented using the
-// non-standard variadic template feature or not.
-
-inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1>
-void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2>
-void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-void PrintTo(
- const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Overload for std::pair.
-template <typename T1, typename T2>
-void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
- *os << '(';
- // We cannot use UniversalPrint(value.first, os) here, as T1 may be
- // a reference type. The same for printing value.second.
- UniversalPrinter<T1>::Print(value.first, os);
- *os << ", ";
- UniversalPrinter<T2>::Print(value.second, os);
- *os << ')';
-}
-
-// Implements printing a non-reference type T by letting the compiler
-// pick the right overload of PrintTo() for T.
-template <typename T>
-class UniversalPrinter {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4180) // Temporarily disables warning 4180.
-#endif // _MSC_VER
-
- // Note: we deliberately don't call this PrintTo(), as that name
- // conflicts with ::testing::internal::PrintTo in the body of the
- // function.
- static void Print(const T& value, ::std::ostream* os) {
- // By default, ::testing::internal::PrintTo() is used for printing
- // the value.
- //
- // Thanks to Koenig look-up, if T is a class and has its own
- // PrintTo() function defined in its namespace, that function will
- // be visible here. Since it is more specific than the generic ones
- // in ::testing::internal, it will be picked by the compiler in the
- // following statement - exactly what we want.
- PrintTo(value, os);
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif // _MSC_VER
-};
-
-// UniversalPrintArray(begin, len, os) prints an array of 'len'
-// elements, starting at address 'begin'.
-template <typename T>
-void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
- if (len == 0) {
- *os << "{}";
- } else {
- *os << "{ ";
- const size_t kThreshold = 18;
- const size_t kChunkSize = 8;
- // If the array has more than kThreshold elements, we'll have to
- // omit some details by printing only the first and the last
- // kChunkSize elements.
- // TODO(wan@google.com): let the user control the threshold using a flag.
- if (len <= kThreshold) {
- PrintRawArrayTo(begin, len, os);
- } else {
- PrintRawArrayTo(begin, kChunkSize, os);
- *os << ", ..., ";
- PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
- }
- *os << " }";
- }
-}
-// This overload prints a (const) char array compactly.
-GTEST_API_ void UniversalPrintArray(const char* begin,
- size_t len,
- ::std::ostream* os);
-
-// Implements printing an array type T[N].
-template <typename T, size_t N>
-class UniversalPrinter<T[N]> {
- public:
- // Prints the given array, omitting some elements when there are too
- // many.
- static void Print(const T (&a)[N], ::std::ostream* os) {
- UniversalPrintArray(a, N, os);
- }
-};
-
-// Implements printing a reference type T&.
-template <typename T>
-class UniversalPrinter<T&> {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4180) // Temporarily disables warning 4180.
-#endif // _MSC_VER
-
- static void Print(const T& value, ::std::ostream* os) {
- // Prints the address of the value. We use reinterpret_cast here
- // as static_cast doesn't compile when T is a function type.
- *os << "@" << reinterpret_cast<const void*>(&value) << " ";
-
- // Then prints the value itself.
- UniversalPrint(value, os);
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif // _MSC_VER
-};
-
-// Prints a value tersely: for a reference type, the referenced value
-// (but not the address) is printed; for a (const) char pointer, the
-// NUL-terminated string (but not the pointer) is printed.
-template <typename T>
-void UniversalTersePrint(const T& value, ::std::ostream* os) {
- UniversalPrint(value, os);
-}
-inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
- if (str == NULL) {
- *os << "NULL";
- } else {
- UniversalPrint(string(str), os);
- }
-}
-inline void UniversalTersePrint(char* str, ::std::ostream* os) {
- UniversalTersePrint(static_cast<const char*>(str), os);
-}
-
-// Prints a value using the type inferred by the compiler. The
-// difference between this and UniversalTersePrint() is that for a
-// (const) char pointer, this prints both the pointer and the
-// NUL-terminated string.
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os) {
- UniversalPrinter<T>::Print(value, os);
-}
-
-#if GTEST_HAS_TR1_TUPLE
-typedef ::std::vector<string> Strings;
-
-// This helper template allows PrintTo() for tuples and
-// UniversalTersePrintTupleFieldsToStrings() to be defined by
-// induction on the number of tuple fields. The idea is that
-// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
-// fields in tuple t, and can be defined in terms of
-// TuplePrefixPrinter<N - 1>.
-
-// The inductive case.
-template <size_t N>
-struct TuplePrefixPrinter {
- // Prints the first N fields of a tuple.
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
- TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
- *os << ", ";
- UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
- ::Print(::std::tr1::get<N - 1>(t), os);
- }
-
- // Tersely prints the first N fields of a tuple to a string vector,
- // one element for each field.
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
- TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
- ::std::stringstream ss;
- UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
- strings->push_back(ss.str());
- }
-};
-
-// Base cases.
-template <>
-struct TuplePrefixPrinter<0> {
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
-
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
-};
-// We have to specialize the entire TuplePrefixPrinter<> class
-// template here, even though the definition of
-// TersePrintPrefixToStrings() is the same as the generic version, as
-// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
-// support specializing a method template of a class template.
-template <>
-struct TuplePrefixPrinter<1> {
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
- UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
- Print(::std::tr1::get<0>(t), os);
- }
-
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
- ::std::stringstream ss;
- UniversalTersePrint(::std::tr1::get<0>(t), &ss);
- strings->push_back(ss.str());
- }
-};
-
-// Helper function for printing a tuple. T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os) {
- *os << "(";
- TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
- PrintPrefixTo(t, os);
- *os << ")";
-}
-
-// Prints the fields of a tuple tersely to a string vector, one
-// element for each field. See the comment before
-// UniversalTersePrint() for how we define "tersely".
-template <typename Tuple>
-Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
- Strings result;
- TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
- TersePrintPrefixToStrings(value, &result);
- return result;
-}
-#endif // GTEST_HAS_TR1_TUPLE
-
-} // namespace internal
-
-template <typename T>
-::std::string PrintToString(const T& value) {
- ::std::stringstream ss;
- internal::UniversalTersePrint(value, &ss);
- return ss.str();
-}
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+++ /dev/null
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// Utilities for testing Google Test itself and code that uses Google Test
-// (e.g. frameworks built on top of Google Test).
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-
-#include "gtest/gtest.h"
-
-namespace testing {
-
-// This helper class can be used to mock out Google Test failure reporting
-// so that we can test Google Test or code that builds on Google Test.
-//
-// An object of this class appends a TestPartResult object to the
-// TestPartResultArray object given in the constructor whenever a Google Test
-// failure is reported. It can either intercept only failures that are
-// generated in the same thread that created this object or it can intercept
-// all generated failures. The scope of this mock object can be controlled with
-// the second argument to the two arguments constructor.
-class GTEST_API_ ScopedFakeTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- // The two possible mocking modes of this object.
- enum InterceptMode {
- INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
- INTERCEPT_ALL_THREADS // Intercepts all failures.
- };
-
- // The c'tor sets this object as the test part result reporter used
- // by Google Test. The 'result' parameter specifies where to report the
- // results. This reporter will only catch failures generated in the current
- // thread. DEPRECATED
- explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
-
- // Same as above, but you can choose the interception scope of this object.
- ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
- TestPartResultArray* result);
-
- // The d'tor restores the previous test part result reporter.
- virtual ~ScopedFakeTestPartResultReporter();
-
- // Appends the TestPartResult object to the TestPartResultArray
- // received in the constructor.
- //
- // This method is from the TestPartResultReporterInterface
- // interface.
- virtual void ReportTestPartResult(const TestPartResult& result);
- private:
- void Init();
-
- const InterceptMode intercept_mode_;
- TestPartResultReporterInterface* old_reporter_;
- TestPartResultArray* const result_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
-};
-
-namespace internal {
-
-// A helper class for implementing EXPECT_FATAL_FAILURE() and
-// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring. If that's not the case, a
-// non-fatal failure will be generated.
-class GTEST_API_ SingleFailureChecker {
- public:
- // The constructor remembers the arguments.
- SingleFailureChecker(const TestPartResultArray* results,
- TestPartResult::Type type,
- const string& substr);
- ~SingleFailureChecker();
- private:
- const TestPartResultArray* const results_;
- const TestPartResult::Type type_;
- const string substr_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
-};
-
-} // namespace internal
-
-} // namespace testing
-
-// A set of macros for testing Google Test assertions or code that's expected
-// to generate Google Test fatal failures. It verifies that the given
-// statement will cause exactly one fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-// - 'statement' cannot reference local non-static variables or
-// non-static members of the current object.
-// - 'statement' cannot return a value.
-// - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
-// gtest_unittest.cc will fail to compile if we do that.
-#define EXPECT_FATAL_FAILURE(statement, substr) \
- do { \
- class GTestExpectFatalFailureHelper {\
- public:\
- static void Execute() { statement; }\
- };\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
- GTestExpectFatalFailureHelper::Execute();\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
- do { \
- class GTestExpectFatalFailureHelper {\
- public:\
- static void Execute() { statement; }\
- };\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ALL_THREADS, >est_failures);\
- GTestExpectFatalFailureHelper::Execute();\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-// A macro for testing Google Test assertions or code that's expected to
-// generate Google Test non-fatal failures. It asserts that the given
-// statement will cause exactly one non-fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// 'statement' is allowed to reference local variables and members of
-// the current object.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-// - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works. If we do that, the code won't compile when the user gives
-// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
-// expands to code containing an unprotected comma. The
-// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
-// catches that.
-//
-// For the same reason, we have to write
-// if (::testing::internal::AlwaysTrue()) { statement; }
-// instead of
-// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-// to avoid an MSVC warning on unreachable code.
-#define EXPECT_NONFATAL_FAILURE(statement, substr) \
- do {\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
- (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
- if (::testing::internal::AlwaysTrue()) { statement; }\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
- do {\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
- (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
- >est_failures);\
- if (::testing::internal::AlwaysTrue()) { statement; }\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule@google.com (Markus Heule)
-//
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-
-#include <iosfwd>
-#include <vector>
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-
-// A copyable object representing the result of a test part (i.e. an
-// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
-//
-// Don't inherit from TestPartResult as its destructor is not virtual.
-class GTEST_API_ TestPartResult {
- public:
- // The possible outcomes of a test part (i.e. an assertion or an
- // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
- enum Type {
- kSuccess, // Succeeded.
- kNonFatalFailure, // Failed but the test can continue.
- kFatalFailure // Failed and the test should be terminated.
- };
-
- // C'tor. TestPartResult does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestPartResult object.
- TestPartResult(Type a_type,
- const char* a_file_name,
- int a_line_number,
- const char* a_message)
- : type_(a_type),
- file_name_(a_file_name),
- line_number_(a_line_number),
- summary_(ExtractSummary(a_message)),
- message_(a_message) {
- }
-
- // Gets the outcome of the test part.
- Type type() const { return type_; }
-
- // Gets the name of the source file where the test part took place, or
- // NULL if it's unknown.
- const char* file_name() const { return file_name_.c_str(); }
-
- // Gets the line in the source file where the test part took place,
- // or -1 if it's unknown.
- int line_number() const { return line_number_; }
-
- // Gets the summary of the failure message.
- const char* summary() const { return summary_.c_str(); }
-
- // Gets the message associated with the test part.
- const char* message() const { return message_.c_str(); }
-
- // Returns true iff the test part passed.
- bool passed() const { return type_ == kSuccess; }
-
- // Returns true iff the test part failed.
- bool failed() const { return type_ != kSuccess; }
-
- // Returns true iff the test part non-fatally failed.
- bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
-
- // Returns true iff the test part fatally failed.
- bool fatally_failed() const { return type_ == kFatalFailure; }
- private:
- Type type_;
-
- // Gets the summary of the failure message by omitting the stack
- // trace in it.
- static internal::String ExtractSummary(const char* message);
-
- // The name of the source file where the test part took place, or
- // NULL if the source file is unknown.
- internal::String file_name_;
- // The line in the source file where the test part took place, or -1
- // if the line number is unknown.
- int line_number_;
- internal::String summary_; // The test failure summary.
- internal::String message_; // The test failure message.
-};
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
-
-// An array of TestPartResult objects.
-//
-// Don't inherit from TestPartResultArray as its destructor is not
-// virtual.
-class GTEST_API_ TestPartResultArray {
- public:
- TestPartResultArray() {}
-
- // Appends the given TestPartResult to the array.
- void Append(const TestPartResult& result);
-
- // Returns the TestPartResult at the given index (0-based).
- const TestPartResult& GetTestPartResult(int index) const;
-
- // Returns the number of TestPartResult objects in the array.
- int size() const;
-
- private:
- std::vector<TestPartResult> array_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
-};
-
-// This interface knows how to report a test part result.
-class TestPartResultReporterInterface {
- public:
- virtual ~TestPartResultReporterInterface() {}
-
- virtual void ReportTestPartResult(const TestPartResult& result) = 0;
-};
-
-namespace internal {
-
-// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
-// statement generates new fatal failures. To do so it registers itself as the
-// current test part result reporter. Besides checking if fatal failures were
-// reported, it only delegates the reporting to the former result reporter.
-// The original result reporter is restored in the destructor.
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-class GTEST_API_ HasNewFatalFailureHelper
- : public TestPartResultReporterInterface {
- public:
- HasNewFatalFailureHelper();
- virtual ~HasNewFatalFailureHelper();
- virtual void ReportTestPartResult(const TestPartResult& result);
- bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
- private:
- bool has_new_fatal_failure_;
- TestPartResultReporterInterface* original_reporter_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
-};
-
-} // namespace internal
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+++ /dev/null
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-
-// This header implements typed tests and type-parameterized tests.
-
-// Typed (aka type-driven) tests repeat the same test for types in a
-// list. You must know which types you want to test with when writing
-// typed tests. Here's how you do it:
-
-#if 0
-
-// First, define a fixture class template. It should be parameterized
-// by a type. Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
- public:
- ...
- typedef std::list<T> List;
- static T shared_;
- T value_;
-};
-
-// Next, associate a list of types with the test case, which will be
-// repeated for each type in the list. The typedef is necessary for
-// the macro to parse correctly.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-TYPED_TEST_CASE(FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-// TYPED_TEST_CASE(FooTest, int);
-
-// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
-// tests for this test case as you want.
-TYPED_TEST(FooTest, DoesBlah) {
- // Inside a test, refer to TypeParam to get the type parameter.
- // Since we are inside a derived class template, C++ requires use to
- // visit the members of FooTest via 'this'.
- TypeParam n = this->value_;
-
- // To visit static members of the fixture, add the TestFixture::
- // prefix.
- n += TestFixture::shared_;
-
- // To refer to typedefs in the fixture, add the "typename
- // TestFixture::" prefix.
- typename TestFixture::List values;
- values.push_back(n);
- ...
-}
-
-TYPED_TEST(FooTest, HasPropertyA) { ... }
-
-#endif // 0
-
-// Type-parameterized tests are abstract test patterns parameterized
-// by a type. Compared with typed tests, type-parameterized tests
-// allow you to define the test pattern without knowing what the type
-// parameters are. The defined pattern can be instantiated with
-// different types any number of times, in any number of translation
-// units.
-//
-// If you are designing an interface or concept, you can define a
-// suite of type-parameterized tests to verify properties that any
-// valid implementation of the interface/concept should have. Then,
-// each implementation can easily instantiate the test suite to verify
-// that it conforms to the requirements, without having to write
-// similar tests repeatedly. Here's an example:
-
-#if 0
-
-// First, define a fixture class template. It should be parameterized
-// by a type. Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
- ...
-};
-
-// Next, declare that you will define a type-parameterized test case
-// (the _P suffix is for "parameterized" or "pattern", whichever you
-// prefer):
-TYPED_TEST_CASE_P(FooTest);
-
-// Then, use TYPED_TEST_P() to define as many type-parameterized tests
-// for this type-parameterized test case as you want.
-TYPED_TEST_P(FooTest, DoesBlah) {
- // Inside a test, refer to TypeParam to get the type parameter.
- TypeParam n = 0;
- ...
-}
-
-TYPED_TEST_P(FooTest, HasPropertyA) { ... }
-
-// Now the tricky part: you need to register all test patterns before
-// you can instantiate them. The first argument of the macro is the
-// test case name; the rest are the names of the tests in this test
-// case.
-REGISTER_TYPED_TEST_CASE_P(FooTest,
- DoesBlah, HasPropertyA);
-
-// Finally, you are free to instantiate the pattern with the types you
-// want. If you put the above code in a header file, you can #include
-// it in multiple C++ source files and instantiate it multiple times.
-//
-// To distinguish different instances of the pattern, the first
-// argument to the INSTANTIATE_* macro is a prefix that will be added
-// to the actual test case name. Remember to pick unique prefixes for
-// different instances.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
-
-#endif // 0
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-type-util.h"
-
-// Implements typed tests.
-
-#if GTEST_HAS_TYPED_TEST
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the typedef for the type parameters of the
-// given test case.
-# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define TYPED_TEST_CASE(CaseName, Types) \
- typedef ::testing::internal::TypeList< Types >::type \
- GTEST_TYPE_PARAMS_(CaseName)
-
-# define TYPED_TEST(CaseName, TestName) \
- template <typename gtest_TypeParam_> \
- class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
- : public CaseName<gtest_TypeParam_> { \
- private: \
- typedef CaseName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- virtual void TestBody(); \
- }; \
- bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::internal::TypeParameterizedTest< \
- CaseName, \
- ::testing::internal::TemplateSel< \
- GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
- GTEST_TYPE_PARAMS_(CaseName)>::Register(\
- "", #CaseName, #TestName, 0); \
- template <typename gtest_TypeParam_> \
- void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
-
-#endif // GTEST_HAS_TYPED_TEST
-
-// Implements type-parameterized tests.
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the namespace name that the type-parameterized tests for
-// the given type-parameterized test case are defined in. The exact
-// name of the namespace is subject to change without notice.
-# define GTEST_CASE_NAMESPACE_(TestCaseName) \
- gtest_case_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the variable used to remember the names of
-// the defined tests in the given test case.
-# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
- gtest_typed_test_case_p_state_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
-//
-// Expands to the name of the variable used to remember the names of
-// the registered tests in the given test case.
-# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
- gtest_registered_test_names_##TestCaseName##_
-
-// The variables defined in the type-parameterized test macros are
-// static as typically these macros are used in a .h file that can be
-// #included in multiple translation units linked together.
-# define TYPED_TEST_CASE_P(CaseName) \
- static ::testing::internal::TypedTestCasePState \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
-
-# define TYPED_TEST_P(CaseName, TestName) \
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \
- template <typename gtest_TypeParam_> \
- class TestName : public CaseName<gtest_TypeParam_> { \
- private: \
- typedef CaseName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- virtual void TestBody(); \
- }; \
- static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
- __FILE__, __LINE__, #CaseName, #TestName); \
- } \
- template <typename gtest_TypeParam_> \
- void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
-
-# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \
- typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
- } \
- static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
- __FILE__, __LINE__, #__VA_ARGS__)
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
- bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::internal::TypeParameterizedTestCase<CaseName, \
- GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
- ::testing::internal::TypeList< Types >::type>::Register(\
- #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
-
-#endif // GTEST_HAS_TYPED_TEST_P
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for Google Test. It should be
-// included by any test program that uses Google Test.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
-// program!
-//
-// Acknowledgment: Google Test borrowed the idea of automatic test
-// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
-// easyUnit framework.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_H_
-
-#ifdef __GNUC__
-#pragma GCC system_header
-#endif
-
-#include <limits>
-#include <vector>
-
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-#include "gtest/gtest-death-test.h"
-#include "gtest/gtest-message.h"
-#include "gtest/gtest-param-test.h"
-#include "gtest/gtest-printers.h"
-#include "gtest/gtest_prod.h"
-#include "gtest/gtest-test-part.h"
-#include "gtest/gtest-typed-test.h"
-
-// Depending on the platform, different string classes are available.
-// On Linux, in addition to ::std::string, Google also makes use of
-// class ::string, which has the same interface as ::std::string, but
-// has a different implementation.
-//
-// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
-// ::string is available AND is a distinct type to ::std::string, or
-// define it to 0 to indicate otherwise.
-//
-// If the user's ::std::string and ::string are the same class due to
-// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
-//
-// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
-// heuristically.
-
-namespace testing {
-
-// Declares the flags.
-
-// This flag temporary enables the disabled tests.
-GTEST_DECLARE_bool_(also_run_disabled_tests);
-
-// This flag brings the debugger on an assertion failure.
-GTEST_DECLARE_bool_(break_on_failure);
-
-// This flag controls whether Google Test catches all test-thrown exceptions
-// and logs them as failures.
-GTEST_DECLARE_bool_(catch_exceptions);
-
-// This flag enables using colors in terminal output. Available values are
-// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
-// to let Google Test decide.
-GTEST_DECLARE_string_(color);
-
-// This flag sets up the filter to select by name using a glob pattern
-// the tests to run. If the filter is not given all tests are executed.
-GTEST_DECLARE_string_(filter);
-
-// This flag causes the Google Test to list tests. None of the tests listed
-// are actually run if the flag is provided.
-GTEST_DECLARE_bool_(list_tests);
-
-// This flag controls whether Google Test emits a detailed XML report to a file
-// in addition to its normal textual output.
-GTEST_DECLARE_string_(output);
-
-// This flags control whether Google Test prints the elapsed time for each
-// test.
-GTEST_DECLARE_bool_(print_time);
-
-// This flag specifies the random number seed.
-GTEST_DECLARE_int32_(random_seed);
-
-// This flag sets how many times the tests are repeated. The default value
-// is 1. If the value is -1 the tests are repeating forever.
-GTEST_DECLARE_int32_(repeat);
-
-// This flag controls whether Google Test includes Google Test internal
-// stack frames in failure stack traces.
-GTEST_DECLARE_bool_(show_internal_stack_frames);
-
-// When this flag is specified, tests' order is randomized on every iteration.
-GTEST_DECLARE_bool_(shuffle);
-
-// This flag specifies the maximum number of stack frames to be
-// printed in a failure message.
-GTEST_DECLARE_int32_(stack_trace_depth);
-
-// When this flag is specified, a failed assertion will throw an
-// exception if exceptions are enabled, or exit the program with a
-// non-zero code otherwise.
-GTEST_DECLARE_bool_(throw_on_failure);
-
-// When this flag is set with a "host:port" string, on supported
-// platforms test results are streamed to the specified port on
-// the specified host machine.
-GTEST_DECLARE_string_(stream_result_to);
-
-// The upper limit for valid stack trace depths.
-const int kMaxStackTraceDepth = 100;
-
-namespace internal {
-
-class AssertHelper;
-class DefaultGlobalTestPartResultReporter;
-class ExecDeathTest;
-class NoExecDeathTest;
-class FinalSuccessChecker;
-class GTestFlagSaver;
-class TestResultAccessor;
-class TestEventListenersAccessor;
-class TestEventRepeater;
-class WindowsDeathTest;
-class UnitTestImpl* GetUnitTestImpl();
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
- const String& message);
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared in gtest-internal.h but defined here, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable) {
- return (Message() << streamable).GetString();
-}
-
-} // namespace internal
-
-// The friend relationship of some of these classes is cyclic.
-// If we don't forward declare them the compiler might confuse the classes
-// in friendship clauses with same named classes on the scope.
-class Test;
-class TestCase;
-class TestInfo;
-class UnitTest;
-
-// A class for indicating whether an assertion was successful. When
-// the assertion wasn't successful, the AssertionResult object
-// remembers a non-empty message that describes how it failed.
-//
-// To create an instance of this class, use one of the factory functions
-// (AssertionSuccess() and AssertionFailure()).
-//
-// This class is useful for two purposes:
-// 1. Defining predicate functions to be used with Boolean test assertions
-// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
-// 2. Defining predicate-format functions to be
-// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
-//
-// For example, if you define IsEven predicate:
-//
-// testing::AssertionResult IsEven(int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess();
-// else
-// return testing::AssertionFailure() << n << " is odd";
-// }
-//
-// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
-// will print the message
-//
-// Value of: IsEven(Fib(5))
-// Actual: false (5 is odd)
-// Expected: true
-//
-// instead of a more opaque
-//
-// Value of: IsEven(Fib(5))
-// Actual: false
-// Expected: true
-//
-// in case IsEven is a simple Boolean predicate.
-//
-// If you expect your predicate to be reused and want to support informative
-// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
-// about half as often as positive ones in our tests), supply messages for
-// both success and failure cases:
-//
-// testing::AssertionResult IsEven(int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess() << n << " is even";
-// else
-// return testing::AssertionFailure() << n << " is odd";
-// }
-//
-// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
-//
-// Value of: IsEven(Fib(6))
-// Actual: true (8 is even)
-// Expected: false
-//
-// NB: Predicates that support negative Boolean assertions have reduced
-// performance in positive ones so be careful not to use them in tests
-// that have lots (tens of thousands) of positive Boolean assertions.
-//
-// To use this class with EXPECT_PRED_FORMAT assertions such as:
-//
-// // Verifies that Foo() returns an even number.
-// EXPECT_PRED_FORMAT1(IsEven, Foo());
-//
-// you need to define:
-//
-// testing::AssertionResult IsEven(const char* expr, int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess();
-// else
-// return testing::AssertionFailure()
-// << "Expected: " << expr << " is even\n Actual: it's " << n;
-// }
-//
-// If Foo() returns 5, you will see the following message:
-//
-// Expected: Foo() is even
-// Actual: it's 5
-//
-class GTEST_API_ AssertionResult {
- public:
- // Copy constructor.
- // Used in EXPECT_TRUE/FALSE(assertion_result).
- AssertionResult(const AssertionResult& other);
- // Used in the EXPECT_TRUE/FALSE(bool_expression).
- explicit AssertionResult(bool success) : success_(success) {}
-
- // Returns true iff the assertion succeeded.
- operator bool() const { return success_; } // NOLINT
-
- // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
- AssertionResult operator!() const;
-
- // Returns the text streamed into this AssertionResult. Test assertions
- // use it when they fail (i.e., the predicate's outcome doesn't match the
- // assertion's expectation). When nothing has been streamed into the
- // object, returns an empty string.
- const char* message() const {
- return message_.get() != NULL ? message_->c_str() : "";
- }
- // TODO(vladl@google.com): Remove this after making sure no clients use it.
- // Deprecated; please use message() instead.
- const char* failure_message() const { return message(); }
-
- // Streams a custom failure message into this object.
- template <typename T> AssertionResult& operator<<(const T& value) {
- AppendMessage(Message() << value);
- return *this;
- }
-
- // Allows streaming basic output manipulators such as endl or flush into
- // this object.
- AssertionResult& operator<<(
- ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
- AppendMessage(Message() << basic_manipulator);
- return *this;
- }
-
- private:
- // Appends the contents of message to message_.
- void AppendMessage(const Message& a_message) {
- if (message_.get() == NULL)
- message_.reset(new ::std::string);
- message_->append(a_message.GetString().c_str());
- }
-
- // Stores result of the assertion predicate.
- bool success_;
- // Stores the message describing the condition in case the expectation
- // construct is not satisfied with the predicate's outcome.
- // Referenced via a pointer to avoid taking too much stack frame space
- // with test assertions.
- internal::scoped_ptr< ::std::string> message_;
-
- GTEST_DISALLOW_ASSIGN_(AssertionResult);
-};
-
-// Makes a successful assertion result.
-GTEST_API_ AssertionResult AssertionSuccess();
-
-// Makes a failed assertion result.
-GTEST_API_ AssertionResult AssertionFailure();
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << msg.
-GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
-
-// The abstract class that all tests inherit from.
-//
-// In Google Test, a unit test program contains one or many TestCases, and
-// each TestCase contains one or many Tests.
-//
-// When you define a test using the TEST macro, you don't need to
-// explicitly derive from Test - the TEST macro automatically does
-// this for you.
-//
-// The only time you derive from Test is when defining a test fixture
-// to be used a TEST_F. For example:
-//
-// class FooTest : public testing::Test {
-// protected:
-// virtual void SetUp() { ... }
-// virtual void TearDown() { ... }
-// ...
-// };
-//
-// TEST_F(FooTest, Bar) { ... }
-// TEST_F(FooTest, Baz) { ... }
-//
-// Test is not copyable.
-class GTEST_API_ Test {
- public:
- friend class TestInfo;
-
- // Defines types for pointers to functions that set up and tear down
- // a test case.
- typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
- typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
-
- // The d'tor is virtual as we intend to inherit from Test.
- virtual ~Test();
-
- // Sets up the stuff shared by all tests in this test case.
- //
- // Google Test will call Foo::SetUpTestCase() before running the first
- // test in test case Foo. Hence a sub-class can define its own
- // SetUpTestCase() method to shadow the one defined in the super
- // class.
- static void SetUpTestCase() {}
-
- // Tears down the stuff shared by all tests in this test case.
- //
- // Google Test will call Foo::TearDownTestCase() after running the last
- // test in test case Foo. Hence a sub-class can define its own
- // TearDownTestCase() method to shadow the one defined in the super
- // class.
- static void TearDownTestCase() {}
-
- // Returns true iff the current test has a fatal failure.
- static bool HasFatalFailure();
-
- // Returns true iff the current test has a non-fatal failure.
- static bool HasNonfatalFailure();
-
- // Returns true iff the current test has a (either fatal or
- // non-fatal) failure.
- static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
-
- // Logs a property for the current test. Only the last value for a given
- // key is remembered.
- // These are public static so they can be called from utility functions
- // that are not members of the test fixture.
- // The arguments are const char* instead strings, as Google Test is used
- // on platforms where string doesn't compile.
- //
- // Note that a driving consideration for these RecordProperty methods
- // was to produce xml output suited to the Greenspan charting utility,
- // which at present will only chart values that fit in a 32-bit int. It
- // is the user's responsibility to restrict their values to 32-bit ints
- // if they intend them to be used with Greenspan.
- static void RecordProperty(const char* key, const char* value);
- static void RecordProperty(const char* key, int value);
-
- protected:
- // Creates a Test object.
- Test();
-
- // Sets up the test fixture.
- virtual void SetUp();
-
- // Tears down the test fixture.
- virtual void TearDown();
-
- private:
- // Returns true iff the current test has the same fixture class as
- // the first test in the current test case.
- static bool HasSameFixtureClass();
-
- // Runs the test after the test fixture has been set up.
- //
- // A sub-class must implement this to define the test logic.
- //
- // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
- // Instead, use the TEST or TEST_F macro.
- virtual void TestBody() = 0;
-
- // Sets up, executes, and tears down the test.
- void Run();
-
- // Deletes self. We deliberately pick an unusual name for this
- // internal method to avoid clashing with names used in user TESTs.
- void DeleteSelf_() { delete this; }
-
- // Uses a GTestFlagSaver to save and restore all Google Test flags.
- const internal::GTestFlagSaver* const gtest_flag_saver_;
-
- // Often a user mis-spells SetUp() as Setup() and spends a long time
- // wondering why it is never called by Google Test. The declaration of
- // the following method is solely for catching such an error at
- // compile time:
- //
- // - The return type is deliberately chosen to be not void, so it
- // will be a conflict if a user declares void Setup() in his test
- // fixture.
- //
- // - This method is private, so it will be another compiler error
- // if a user calls it from his test fixture.
- //
- // DO NOT OVERRIDE THIS FUNCTION.
- //
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-
- // We disallow copying Tests.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
-};
-
-typedef internal::TimeInMillis TimeInMillis;
-
-// A copyable object representing a user specified test property which can be
-// output as a key/value string pair.
-//
-// Don't inherit from TestProperty as its destructor is not virtual.
-class TestProperty {
- public:
- // C'tor. TestProperty does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestProperty object.
- TestProperty(const char* a_key, const char* a_value) :
- key_(a_key), value_(a_value) {
- }
-
- // Gets the user supplied key.
- const char* key() const {
- return key_.c_str();
- }
-
- // Gets the user supplied value.
- const char* value() const {
- return value_.c_str();
- }
-
- // Sets a new value, overriding the one supplied in the constructor.
- void SetValue(const char* new_value) {
- value_ = new_value;
- }
-
- private:
- // The key supplied by the user.
- internal::String key_;
- // The value supplied by the user.
- internal::String value_;
-};
-
-// The result of a single Test. This includes a list of
-// TestPartResults, a list of TestProperties, a count of how many
-// death tests there are in the Test, and how much time it took to run
-// the Test.
-//
-// TestResult is not copyable.
-class GTEST_API_ TestResult {
- public:
- // Creates an empty TestResult.
- TestResult();
-
- // D'tor. Do not inherit from TestResult.
- ~TestResult();
-
- // Gets the number of all test parts. This is the sum of the number
- // of successful test parts and the number of failed test parts.
- int total_part_count() const;
-
- // Returns the number of the test properties.
- int test_property_count() const;
-
- // Returns true iff the test passed (i.e. no test part failed).
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the test failed.
- bool Failed() const;
-
- // Returns true iff the test fatally failed.
- bool HasFatalFailure() const;
-
- // Returns true iff the test has a non-fatal failure.
- bool HasNonfatalFailure() const;
-
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns the i-th test part result among all the results. i can range
- // from 0 to test_property_count() - 1. If i is not in that range, aborts
- // the program.
- const TestPartResult& GetTestPartResult(int i) const;
-
- // Returns the i-th test property. i can range from 0 to
- // test_property_count() - 1. If i is not in that range, aborts the
- // program.
- const TestProperty& GetTestProperty(int i) const;
-
- private:
- friend class TestInfo;
- friend class UnitTest;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::ExecDeathTest;
- friend class internal::TestResultAccessor;
- friend class internal::UnitTestImpl;
- friend class internal::WindowsDeathTest;
-
- // Gets the vector of TestPartResults.
- const std::vector<TestPartResult>& test_part_results() const {
- return test_part_results_;
- }
-
- // Gets the vector of TestProperties.
- const std::vector<TestProperty>& test_properties() const {
- return test_properties_;
- }
-
- // Sets the elapsed time.
- void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
-
- // Adds a test property to the list. The property is validated and may add
- // a non-fatal failure if invalid (e.g., if it conflicts with reserved
- // key names). If a property is already recorded for the same key, the
- // value will be updated, rather than storing multiple values for the same
- // key.
- void RecordProperty(const TestProperty& test_property);
-
- // Adds a failure if the key is a reserved attribute of Google Test
- // testcase tags. Returns true if the property is valid.
- // TODO(russr): Validate attribute names are legal and human readable.
- static bool ValidateTestProperty(const TestProperty& test_property);
-
- // Adds a test part result to the list.
- void AddTestPartResult(const TestPartResult& test_part_result);
-
- // Returns the death test count.
- int death_test_count() const { return death_test_count_; }
-
- // Increments the death test count, returning the new count.
- int increment_death_test_count() { return ++death_test_count_; }
-
- // Clears the test part results.
- void ClearTestPartResults();
-
- // Clears the object.
- void Clear();
-
- // Protects mutable state of the property vector and of owned
- // properties, whose values may be updated.
- internal::Mutex test_properites_mutex_;
-
- // The vector of TestPartResults
- std::vector<TestPartResult> test_part_results_;
- // The vector of TestProperties
- std::vector<TestProperty> test_properties_;
- // Running count of death tests.
- int death_test_count_;
- // The elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
-
- // We disallow copying TestResult.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
-}; // class TestResult
-
-// A TestInfo object stores the following information about a test:
-//
-// Test case name
-// Test name
-// Whether the test should be run
-// A function pointer that creates the test object when invoked
-// Test result
-//
-// The constructor of TestInfo registers itself with the UnitTest
-// singleton such that the RUN_ALL_TESTS() macro knows which tests to
-// run.
-class GTEST_API_ TestInfo {
- public:
- // Destructs a TestInfo object. This function is not virtual, so
- // don't inherit from TestInfo.
- ~TestInfo();
-
- // Returns the test case name.
- const char* test_case_name() const { return test_case_name_.c_str(); }
-
- // Returns the test name.
- const char* name() const { return name_.c_str(); }
-
- // Returns the name of the parameter type, or NULL if this is not a typed
- // or a type-parameterized test.
- const char* type_param() const {
- if (type_param_.get() != NULL)
- return type_param_->c_str();
- return NULL;
- }
-
- // Returns the text representation of the value parameter, or NULL if this
- // is not a value-parameterized test.
- const char* value_param() const {
- if (value_param_.get() != NULL)
- return value_param_->c_str();
- return NULL;
- }
-
- // Returns true if this test should run, that is if the test is not disabled
- // (or it is disabled but the also_run_disabled_tests flag has been specified)
- // and its full name matches the user-specified filter.
- //
- // Google Test allows the user to filter the tests by their full names.
- // The full name of a test Bar in test case Foo is defined as
- // "Foo.Bar". Only the tests that match the filter will run.
- //
- // A filter is a colon-separated list of glob (not regex) patterns,
- // optionally followed by a '-' and a colon-separated list of
- // negative patterns (tests to exclude). A test is run if it
- // matches one of the positive patterns and does not match any of
- // the negative patterns.
- //
- // For example, *A*:Foo.* is a filter that matches any string that
- // contains the character 'A' or starts with "Foo.".
- bool should_run() const { return should_run_; }
-
- // Returns the result of the test.
- const TestResult* result() const { return &result_; }
-
- private:
-
-#if GTEST_HAS_DEATH_TEST
- friend class internal::DefaultDeathTestFactory;
-#endif // GTEST_HAS_DEATH_TEST
- friend class Test;
- friend class TestCase;
- friend class internal::UnitTestImpl;
- friend TestInfo* internal::MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- internal::TypeId fixture_class_id,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc,
- internal::TestFactoryBase* factory);
-
- // Constructs a TestInfo object. The newly constructed instance assumes
- // ownership of the factory object.
- TestInfo(const char* test_case_name, const char* name,
- const char* a_type_param,
- const char* a_value_param,
- internal::TypeId fixture_class_id,
- internal::TestFactoryBase* factory);
-
- // Increments the number of death tests encountered in this test so
- // far.
- int increment_death_test_count() {
- return result_.increment_death_test_count();
- }
-
- // Creates the test object, runs it, records its result, and then
- // deletes it.
- void Run();
-
- static void ClearTestResult(TestInfo* test_info) {
- test_info->result_.Clear();
- }
-
- // These fields are immutable properties of the test.
- const std::string test_case_name_; // Test case name
- const std::string name_; // Test name
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const internal::scoped_ptr<const ::std::string> type_param_;
- // Text representation of the value parameter, or NULL if this is not a
- // value-parameterized test.
- const internal::scoped_ptr<const ::std::string> value_param_;
- const internal::TypeId fixture_class_id_; // ID of the test fixture class
- bool should_run_; // True iff this test should run
- bool is_disabled_; // True iff this test is disabled
- bool matches_filter_; // True if this test matches the
- // user-specified filter.
- internal::TestFactoryBase* const factory_; // The factory that creates
- // the test object
-
- // This field is mutable and needs to be reset before running the
- // test for the second time.
- TestResult result_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
-};
-
-// A test case, which consists of a vector of TestInfos.
-//
-// TestCase is not copyable.
-class GTEST_API_ TestCase {
- public:
- // Creates a TestCase with the given name.
- //
- // TestCase does NOT have a default constructor. Always use this
- // constructor to create a TestCase object.
- //
- // Arguments:
- //
- // name: name of the test case
- // a_type_param: the name of the test's type parameter, or NULL if
- // this is not a type-parameterized test.
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- TestCase(const char* name, const char* a_type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc);
-
- // Destructor of TestCase.
- virtual ~TestCase();
-
- // Gets the name of the TestCase.
- const char* name() const { return name_.c_str(); }
-
- // Returns the name of the parameter type, or NULL if this is not a
- // type-parameterized test case.
- const char* type_param() const {
- if (type_param_.get() != NULL)
- return type_param_->c_str();
- return NULL;
- }
-
- // Returns true if any test in this test case should run.
- bool should_run() const { return should_run_; }
-
- // Gets the number of successful tests in this test case.
- int successful_test_count() const;
-
- // Gets the number of failed tests in this test case.
- int failed_test_count() const;
-
- // Gets the number of disabled tests in this test case.
- int disabled_test_count() const;
-
- // Get the number of tests in this test case that should run.
- int test_to_run_count() const;
-
- // Gets the number of all tests in this test case.
- int total_test_count() const;
-
- // Returns true iff the test case passed.
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the test case failed.
- bool Failed() const { return failed_test_count() > 0; }
-
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- const TestInfo* GetTestInfo(int i) const;
-
- private:
- friend class Test;
- friend class internal::UnitTestImpl;
-
- // Gets the (mutable) vector of TestInfos in this TestCase.
- std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
-
- // Gets the (immutable) vector of TestInfos in this TestCase.
- const std::vector<TestInfo*>& test_info_list() const {
- return test_info_list_;
- }
-
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- TestInfo* GetMutableTestInfo(int i);
-
- // Sets the should_run member.
- void set_should_run(bool should) { should_run_ = should; }
-
- // Adds a TestInfo to this test case. Will delete the TestInfo upon
- // destruction of the TestCase object.
- void AddTestInfo(TestInfo * test_info);
-
- // Clears the results of all tests in this test case.
- void ClearResult();
-
- // Clears the results of all tests in the given test case.
- static void ClearTestCaseResult(TestCase* test_case) {
- test_case->ClearResult();
- }
-
- // Runs every test in this TestCase.
- void Run();
-
- // Runs SetUpTestCase() for this TestCase. This wrapper is needed
- // for catching exceptions thrown from SetUpTestCase().
- void RunSetUpTestCase() { (*set_up_tc_)(); }
-
- // Runs TearDownTestCase() for this TestCase. This wrapper is
- // needed for catching exceptions thrown from TearDownTestCase().
- void RunTearDownTestCase() { (*tear_down_tc_)(); }
-
- // Returns true iff test passed.
- static bool TestPassed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Passed();
- }
-
- // Returns true iff test failed.
- static bool TestFailed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Failed();
- }
-
- // Returns true iff test is disabled.
- static bool TestDisabled(const TestInfo* test_info) {
- return test_info->is_disabled_;
- }
-
- // Returns true if the given test should run.
- static bool ShouldRunTest(const TestInfo* test_info) {
- return test_info->should_run();
- }
-
- // Shuffles the tests in this test case.
- void ShuffleTests(internal::Random* random);
-
- // Restores the test order to before the first shuffle.
- void UnshuffleTests();
-
- // Name of the test case.
- internal::String name_;
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const internal::scoped_ptr<const ::std::string> type_param_;
- // The vector of TestInfos in their original order. It owns the
- // elements in the vector.
- std::vector<TestInfo*> test_info_list_;
- // Provides a level of indirection for the test list to allow easy
- // shuffling and restoring the test order. The i-th element in this
- // vector is the index of the i-th test in the shuffled test list.
- std::vector<int> test_indices_;
- // Pointer to the function that sets up the test case.
- Test::SetUpTestCaseFunc set_up_tc_;
- // Pointer to the function that tears down the test case.
- Test::TearDownTestCaseFunc tear_down_tc_;
- // True iff any test in this test case should run.
- bool should_run_;
- // Elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
-
- // We disallow copying TestCases.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
-};
-
-// An Environment object is capable of setting up and tearing down an
-// environment. The user should subclass this to define his own
-// environment(s).
-//
-// An Environment object does the set-up and tear-down in virtual
-// methods SetUp() and TearDown() instead of the constructor and the
-// destructor, as:
-//
-// 1. You cannot safely throw from a destructor. This is a problem
-// as in some cases Google Test is used where exceptions are enabled, and
-// we may want to implement ASSERT_* using exceptions where they are
-// available.
-// 2. You cannot use ASSERT_* directly in a constructor or
-// destructor.
-class Environment {
- public:
- // The d'tor is virtual as we need to subclass Environment.
- virtual ~Environment() {}
-
- // Override this to define how to set up the environment.
- virtual void SetUp() {}
-
- // Override this to define how to tear down the environment.
- virtual void TearDown() {}
- private:
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-};
-
-// The interface for tracing execution of tests. The methods are organized in
-// the order the corresponding events are fired.
-class TestEventListener {
- public:
- virtual ~TestEventListener() {}
-
- // Fired before any test activity starts.
- virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
-
- // Fired before each iteration of tests starts. There may be more than
- // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
- // index, starting from 0.
- virtual void OnTestIterationStart(const UnitTest& unit_test,
- int iteration) = 0;
-
- // Fired before environment set-up for each iteration of tests starts.
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
-
- // Fired after environment set-up for each iteration of tests ends.
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
-
- // Fired before the test case starts.
- virtual void OnTestCaseStart(const TestCase& test_case) = 0;
-
- // Fired before the test starts.
- virtual void OnTestStart(const TestInfo& test_info) = 0;
-
- // Fired after a failed assertion or a SUCCEED() invocation.
- virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
-
- // Fired after the test ends.
- virtual void OnTestEnd(const TestInfo& test_info) = 0;
-
- // Fired after the test case ends.
- virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
-
- // Fired before environment tear-down for each iteration of tests starts.
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
-
- // Fired after environment tear-down for each iteration of tests ends.
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
-
- // Fired after each iteration of tests finishes.
- virtual void OnTestIterationEnd(const UnitTest& unit_test,
- int iteration) = 0;
-
- // Fired after all test activities have ended.
- virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
-};
-
-// The convenience class for users who need to override just one or two
-// methods and are not concerned that a possible change to a signature of
-// the methods they override will not be caught during the build. For
-// comments about each method please see the definition of TestEventListener
-// above.
-class EmptyTestEventListener : public TestEventListener {
- public:
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
- int /*iteration*/) {}
- virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
- virtual void OnTestStart(const TestInfo& /*test_info*/) {}
- virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
- virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
- virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
- virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
- int /*iteration*/) {}
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-};
-
-// TestEventListeners lets users add listeners to track events in Google Test.
-class GTEST_API_ TestEventListeners {
- public:
- TestEventListeners();
- ~TestEventListeners();
-
- // Appends an event listener to the end of the list. Google Test assumes
- // the ownership of the listener (i.e. it will delete the listener when
- // the test program finishes).
- void Append(TestEventListener* listener);
-
- // Removes the given event listener from the list and returns it. It then
- // becomes the caller's responsibility to delete the listener. Returns
- // NULL if the listener is not found in the list.
- TestEventListener* Release(TestEventListener* listener);
-
- // Returns the standard listener responsible for the default console
- // output. Can be removed from the listeners list to shut down default
- // console output. Note that removing this object from the listener list
- // with Release transfers its ownership to the caller and makes this
- // function return NULL the next time.
- TestEventListener* default_result_printer() const {
- return default_result_printer_;
- }
-
- // Returns the standard listener responsible for the default XML output
- // controlled by the --gtest_output=xml flag. Can be removed from the
- // listeners list by users who want to shut down the default XML output
- // controlled by this flag and substitute it with custom one. Note that
- // removing this object from the listener list with Release transfers its
- // ownership to the caller and makes this function return NULL the next
- // time.
- TestEventListener* default_xml_generator() const {
- return default_xml_generator_;
- }
-
- private:
- friend class TestCase;
- friend class TestInfo;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::NoExecDeathTest;
- friend class internal::TestEventListenersAccessor;
- friend class internal::UnitTestImpl;
-
- // Returns repeater that broadcasts the TestEventListener events to all
- // subscribers.
- TestEventListener* repeater();
-
- // Sets the default_result_printer attribute to the provided listener.
- // The listener is also added to the listener list and previous
- // default_result_printer is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultResultPrinter(TestEventListener* listener);
-
- // Sets the default_xml_generator attribute to the provided listener. The
- // listener is also added to the listener list and previous
- // default_xml_generator is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultXmlGenerator(TestEventListener* listener);
-
- // Controls whether events will be forwarded by the repeater to the
- // listeners in the list.
- bool EventForwardingEnabled() const;
- void SuppressEventForwarding();
-
- // The actual list of listeners.
- internal::TestEventRepeater* repeater_;
- // Listener responsible for the standard result output.
- TestEventListener* default_result_printer_;
- // Listener responsible for the creation of the XML output file.
- TestEventListener* default_xml_generator_;
-
- // We disallow copying TestEventListeners.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
-};
-
-// A UnitTest consists of a vector of TestCases.
-//
-// This is a singleton class. The only instance of UnitTest is
-// created when UnitTest::GetInstance() is first called. This
-// instance is never deleted.
-//
-// UnitTest is not copyable.
-//
-// This class is thread-safe as long as the methods are called
-// according to their specification.
-class GTEST_API_ UnitTest {
- public:
- // Gets the singleton UnitTest object. The first time this method
- // is called, a UnitTest object is constructed and returned.
- // Consecutive calls will return the same object.
- static UnitTest* GetInstance();
-
- // Runs all tests in this UnitTest object and prints the result.
- // Returns 0 if successful, or 1 otherwise.
- //
- // This method can only be called from the main thread.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- int Run() GTEST_MUST_USE_RESULT_;
-
- // Returns the working directory when the first TEST() or TEST_F()
- // was executed. The UnitTest object owns the string.
- const char* original_working_dir() const;
-
- // Returns the TestCase object for the test that's currently running,
- // or NULL if no test is running.
- const TestCase* current_test_case() const;
-
- // Returns the TestInfo object for the test that's currently running,
- // or NULL if no test is running.
- const TestInfo* current_test_info() const;
-
- // Returns the random seed used at the start of the current test run.
- int random_seed() const;
-
-#if GTEST_HAS_PARAM_TEST
- // Returns the ParameterizedTestCaseRegistry object used to keep track of
- // value-parameterized tests and instantiate and register them.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
-#endif // GTEST_HAS_PARAM_TEST
-
- // Gets the number of successful test cases.
- int successful_test_case_count() const;
-
- // Gets the number of failed test cases.
- int failed_test_case_count() const;
-
- // Gets the number of all test cases.
- int total_test_case_count() const;
-
- // Gets the number of all test cases that contain at least one test
- // that should run.
- int test_case_to_run_count() const;
-
- // Gets the number of successful tests.
- int successful_test_count() const;
-
- // Gets the number of failed tests.
- int failed_test_count() const;
-
- // Gets the number of disabled tests.
- int disabled_test_count() const;
-
- // Gets the number of all tests.
- int total_test_count() const;
-
- // Gets the number of tests that should run.
- int test_to_run_count() const;
-
- // Gets the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const;
-
- // Returns true iff the unit test passed (i.e. all test cases passed).
- bool Passed() const;
-
- // Returns true iff the unit test failed (i.e. some test case failed
- // or something outside of all tests failed).
- bool Failed() const;
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- const TestCase* GetTestCase(int i) const;
-
- // Returns the list of event listeners that can be used to track events
- // inside Google Test.
- TestEventListeners& listeners();
-
- private:
- // Registers and returns a global test environment. When a test
- // program is run, all global test environments will be set-up in
- // the order they were registered. After all tests in the program
- // have finished, all global test environments will be torn-down in
- // the *reverse* order they were registered.
- //
- // The UnitTest object takes ownership of the given environment.
- //
- // This method can only be called from the main thread.
- Environment* AddEnvironment(Environment* env);
-
- // Adds a TestPartResult to the current TestResult object. All
- // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
- // eventually call this to report their results. The user code
- // should use the assertion macros instead of calling this directly.
- void AddTestPartResult(TestPartResult::Type result_type,
- const char* file_name,
- int line_number,
- const internal::String& message,
- const internal::String& os_stack_trace);
-
- // Adds a TestProperty to the current TestResult object. If the result already
- // contains a property with the same key, the value will be updated.
- void RecordPropertyForCurrentTest(const char* key, const char* value);
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- TestCase* GetMutableTestCase(int i);
-
- // Accessors for the implementation object.
- internal::UnitTestImpl* impl() { return impl_; }
- const internal::UnitTestImpl* impl() const { return impl_; }
-
- // These classes and funcions are friends as they need to access private
- // members of UnitTest.
- friend class Test;
- friend class internal::AssertHelper;
- friend class internal::ScopedTrace;
- friend Environment* AddGlobalTestEnvironment(Environment* env);
- friend internal::UnitTestImpl* internal::GetUnitTestImpl();
- friend void internal::ReportFailureInUnknownLocation(
- TestPartResult::Type result_type,
- const internal::String& message);
-
- // Creates an empty UnitTest.
- UnitTest();
-
- // D'tor
- virtual ~UnitTest();
-
- // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
- // Google Test trace stack.
- void PushGTestTrace(const internal::TraceInfo& trace);
-
- // Pops a trace from the per-thread Google Test trace stack.
- void PopGTestTrace();
-
- // Protects mutable state in *impl_. This is mutable as some const
- // methods need to lock it too.
- mutable internal::Mutex mutex_;
-
- // Opaque implementation object. This field is never changed once
- // the object is constructed. We don't mark it as const here, as
- // doing so will cause a warning in the constructor of UnitTest.
- // Mutable state in *impl_ is protected by mutex_.
- internal::UnitTestImpl* impl_;
-
- // We disallow copying UnitTest.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
-};
-
-// A convenient wrapper for adding an environment for the test
-// program.
-//
-// You should call this before RUN_ALL_TESTS() is called, probably in
-// main(). If you use gtest_main, you need to call this before main()
-// starts for it to take effect. For example, you can define a global
-// variable like this:
-//
-// testing::Environment* const foo_env =
-// testing::AddGlobalTestEnvironment(new FooEnvironment);
-//
-// However, we strongly recommend you to write your own main() and
-// call AddGlobalTestEnvironment() there, as relying on initialization
-// of global variables makes the code harder to read and may cause
-// problems when you register multiple environments from different
-// translation units and the environments have dependencies among them
-// (remember that the compiler doesn't guarantee the order in which
-// global variables from different translation units are initialized).
-inline Environment* AddGlobalTestEnvironment(Environment* env) {
- return UnitTest::GetInstance()->AddEnvironment(env);
-}
-
-// Initializes Google Test. This must be called before calling
-// RUN_ALL_TESTS(). In particular, it parses a command line for the
-// flags that Google Test recognizes. Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned. Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-GTEST_API_ void InitGoogleTest(int* argc, char** argv);
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
-
-namespace internal {
-
-// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
-// operand to be used in a failure message. The type (but not value)
-// of the other operand may affect the format. This allows us to
-// print a char* as a raw pointer when it is compared against another
-// char*, and print it as a C string when it is compared against an
-// std::string object, for example.
-//
-// The default implementation ignores the type of the other operand.
-// Some specialized versions are used to handle formatting wide or
-// narrow C strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename T1, typename T2>
-String FormatForComparisonFailureMessage(const T1& value,
- const T2& /* other_operand */) {
- // C++Builder compiles this incorrectly if the namespace isn't explicitly
- // given.
- return ::testing::PrintToString(value);
-}
-
-// The helper function for {ASSERT|EXPECT}_EQ.
-template <typename T1, typename T2>
-AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual) {
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4389) // Temporarily disables warning on
- // signed/unsigned mismatch.
-#endif
-
- if (expected == actual) {
- return AssertionSuccess();
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif
-
- return EqFailure(expected_expression,
- actual_expression,
- FormatForComparisonFailureMessage(expected, actual),
- FormatForComparisonFailureMessage(actual, expected),
- false);
-}
-
-// With this overloaded version, we allow anonymous enums to be used
-// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
-// can be implicitly cast to BiggestInt.
-GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual);
-
-// The helper class for {ASSERT|EXPECT}_EQ. The template argument
-// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
-// is a null pointer literal. The following default implementation is
-// for lhs_is_null_literal being false.
-template <bool lhs_is_null_literal>
-class EqHelper {
- public:
- // This templatized version is for the general case.
- template <typename T1, typename T2>
- static AssertionResult Compare(const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-
- // With this overloaded version, we allow anonymous enums to be used
- // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
- // enums can be implicitly cast to BiggestInt.
- //
- // Even though its body looks the same as the above version, we
- // cannot merge the two, as it will make anonymous enums unhappy.
- static AssertionResult Compare(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-};
-
-// This specialization is used when the first argument to ASSERT_EQ()
-// is a null pointer literal, like NULL, false, or 0.
-template <>
-class EqHelper<true> {
- public:
- // We define two overloaded versions of Compare(). The first
- // version will be picked when the second argument to ASSERT_EQ() is
- // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
- // EXPECT_EQ(false, a_bool).
- template <typename T1, typename T2>
- static AssertionResult Compare(
- const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual,
- // The following line prevents this overload from being considered if T2
- // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)
- // expands to Compare("", "", NULL, my_ptr), which requires a conversion
- // to match the Secret* in the other overload, which would otherwise make
- // this template match better.
- typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-
- // This version will be picked when the second argument to ASSERT_EQ() is a
- // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
- template <typename T>
- static AssertionResult Compare(
- const char* expected_expression,
- const char* actual_expression,
- // We used to have a second template parameter instead of Secret*. That
- // template parameter would deduce to 'long', making this a better match
- // than the first overload even without the first overload's EnableIf.
- // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
- // non-pointer argument" (even a deduced integral argument), so the old
- // implementation caused warnings in user code.
- Secret* /* expected (NULL) */,
- T* actual) {
- // We already know that 'expected' is a null pointer.
- return CmpHelperEQ(expected_expression, actual_expression,
- static_cast<T*>(NULL), actual);
- }
-};
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
-// of similar code.
-//
-// For each templatized helper function, we also define an overloaded
-// version for BiggestInt in order to reduce code bloat and allow
-// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
-// with gcc 4.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-template <typename T1, typename T2>\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
- const T1& val1, const T2& val2) {\
- if (val1 op val2) {\
- return AssertionSuccess();\
- } else {\
- return AssertionFailure() \
- << "Expected: (" << expr1 << ") " #op " (" << expr2\
- << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
- << " vs " << FormatForComparisonFailureMessage(val2, val1);\
- }\
-}\
-GTEST_API_ AssertionResult CmpHelper##op_name(\
- const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-
-// Implements the helper function for {ASSERT|EXPECT}_NE
-GTEST_IMPL_CMP_HELPER_(NE, !=);
-// Implements the helper function for {ASSERT|EXPECT}_LE
-GTEST_IMPL_CMP_HELPER_(LE, <=);
-// Implements the helper function for {ASSERT|EXPECT}_LT
-GTEST_IMPL_CMP_HELPER_(LT, < );
-// Implements the helper function for {ASSERT|EXPECT}_GE
-GTEST_IMPL_CMP_HELPER_(GE, >=);
-// Implements the helper function for {ASSERT|EXPECT}_GT
-GTEST_IMPL_CMP_HELPER_(GT, > );
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
-
-
-// Helper function for *_STREQ on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const wchar_t* expected,
- const wchar_t* actual);
-
-// Helper function for *_STRNE on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2);
-
-} // namespace internal
-
-// IsSubstring() and IsNotSubstring() are intended to be used as the
-// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
-// themselves. They check whether needle is a substring of haystack
-// (NULL is considered a substring of itself only), and return an
-// appropriate error message when they fail.
-//
-// The {needle,haystack}_expr arguments are the stringified
-// expressions that generated the two real arguments.
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
-#endif // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-// Helper template function for comparing floating-points.
-//
-// Template parameter:
-//
-// RawType: the raw floating-point type (either float or double)
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename RawType>
-AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
- const char* actual_expression,
- RawType expected,
- RawType actual) {
- const FloatingPoint<RawType> lhs(expected), rhs(actual);
-
- if (lhs.AlmostEquals(rhs)) {
- return AssertionSuccess();
- }
-
- ::std::stringstream expected_ss;
- expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << expected;
-
- ::std::stringstream actual_ss;
- actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << actual;
-
- return EqFailure(expected_expression,
- actual_expression,
- StringStreamToString(&expected_ss),
- StringStreamToString(&actual_ss),
- false);
-}
-
-// Helper function for implementing ASSERT_NEAR.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
- const char* expr2,
- const char* abs_error_expr,
- double val1,
- double val2,
- double abs_error);
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-// A class that enables one to stream messages to assertion macros
-class GTEST_API_ AssertHelper {
- public:
- // Constructor.
- AssertHelper(TestPartResult::Type type,
- const char* file,
- int line,
- const char* message);
- ~AssertHelper();
-
- // Message assignment is a semantic trick to enable assertion
- // streaming; see the GTEST_MESSAGE_ macro below.
- void operator=(const Message& message) const;
-
- private:
- // We put our data in a struct so that the size of the AssertHelper class can
- // be as small as possible. This is important because gcc is incapable of
- // re-using stack space even for temporary variables, so every EXPECT_EQ
- // reserves stack space for another AssertHelper.
- struct AssertHelperData {
- AssertHelperData(TestPartResult::Type t,
- const char* srcfile,
- int line_num,
- const char* msg)
- : type(t), file(srcfile), line(line_num), message(msg) { }
-
- TestPartResult::Type const type;
- const char* const file;
- int const line;
- String const message;
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
- };
-
- AssertHelperData* const data_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
-};
-
-} // namespace internal
-
-#if GTEST_HAS_PARAM_TEST
-// The pure interface class that all value-parameterized tests inherit from.
-// A value-parameterized class must inherit from both ::testing::Test and
-// ::testing::WithParamInterface. In most cases that just means inheriting
-// from ::testing::TestWithParam, but more complicated test hierarchies
-// may need to inherit from Test and WithParamInterface at different levels.
-//
-// This interface has support for accessing the test parameter value via
-// the GetParam() method.
-//
-// Use it with one of the parameter generator defining functions, like Range(),
-// Values(), ValuesIn(), Bool(), and Combine().
-//
-// class FooTest : public ::testing::TestWithParam<int> {
-// protected:
-// FooTest() {
-// // Can use GetParam() here.
-// }
-// virtual ~FooTest() {
-// // Can use GetParam() here.
-// }
-// virtual void SetUp() {
-// // Can use GetParam() here.
-// }
-// virtual void TearDown {
-// // Can use GetParam() here.
-// }
-// };
-// TEST_P(FooTest, DoesBar) {
-// // Can use GetParam() method here.
-// Foo foo;
-// ASSERT_TRUE(foo.DoesBar(GetParam()));
-// }
-// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
-
-template <typename T>
-class WithParamInterface {
- public:
- typedef T ParamType;
- virtual ~WithParamInterface() {}
-
- // The current parameter value. Is also available in the test fixture's
- // constructor. This member function is non-static, even though it only
- // references static data, to reduce the opportunity for incorrect uses
- // like writing 'WithParamInterface<bool>::GetParam()' for a test that
- // uses a fixture whose parameter type is int.
- const ParamType& GetParam() const { return *parameter_; }
-
- private:
- // Sets parameter value. The caller is responsible for making sure the value
- // remains alive and unchanged throughout the current test.
- static void SetParam(const ParamType* parameter) {
- parameter_ = parameter;
- }
-
- // Static value used for accessing parameter during a test lifetime.
- static const ParamType* parameter_;
-
- // TestClass must be a subclass of WithParamInterface<T> and Test.
- template <class TestClass> friend class internal::ParameterizedTestFactory;
-};
-
-template <typename T>
-const T* WithParamInterface<T>::parameter_ = NULL;
-
-// Most value-parameterized classes can ignore the existence of
-// WithParamInterface, and can just inherit from ::testing::TestWithParam.
-
-template <typename T>
-class TestWithParam : public Test, public WithParamInterface<T> {
-};
-
-#endif // GTEST_HAS_PARAM_TEST
-
-// Macros for indicating success/failure in test code.
-
-// ADD_FAILURE unconditionally adds a failure to the current test.
-// SUCCEED generates a success - it doesn't automatically make the
-// current test successful, as a test is only successful when it has
-// no failure.
-//
-// EXPECT_* verifies that a certain condition is satisfied. If not,
-// it behaves like ADD_FAILURE. In particular:
-//
-// EXPECT_TRUE verifies that a Boolean condition is true.
-// EXPECT_FALSE verifies that a Boolean condition is false.
-//
-// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
-// that they will also abort the current function on failure. People
-// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
-// writing data-driven tests often find themselves using ADD_FAILURE
-// and EXPECT_* more.
-//
-// Examples:
-//
-// EXPECT_TRUE(server.StatusIsOK());
-// ASSERT_FALSE(server.HasPendingRequest(port))
-// << "There are still pending requests " << "on port " << port;
-
-// Generates a nonfatal failure with a generic message.
-#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
-
-// Generates a nonfatal failure at the given source file location with
-// a generic message.
-#define ADD_FAILURE_AT(file, line) \
- GTEST_MESSAGE_AT_(file, line, "Failed", \
- ::testing::TestPartResult::kNonFatalFailure)
-
-// Generates a fatal failure with a generic message.
-#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
-
-// Define this macro to 1 to omit the definition of FAIL(), which is a
-// generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_FAIL
-# define FAIL() GTEST_FAIL()
-#endif
-
-// Generates a success with a generic message.
-#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
-
-// Define this macro to 1 to omit the definition of SUCCEED(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_SUCCEED
-# define SUCCEED() GTEST_SUCCEED()
-#endif
-
-// Macros for testing exceptions.
-//
-// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
-// Tests that the statement throws the expected exception.
-// * {ASSERT|EXPECT}_NO_THROW(statement):
-// Tests that the statement doesn't throw any exception.
-// * {ASSERT|EXPECT}_ANY_THROW(statement):
-// Tests that the statement throws an exception.
-
-#define EXPECT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
-#define ASSERT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
-#define ASSERT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
-
-// Boolean assertions. Condition can be either a Boolean expression or an
-// AssertionResult. For more information on how to use AssertionResult with
-// these macros see comments on that class.
-#define EXPECT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_NONFATAL_FAILURE_)
-#define EXPECT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_NONFATAL_FAILURE_)
-#define ASSERT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_FATAL_FAILURE_)
-#define ASSERT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_FATAL_FAILURE_)
-
-// Includes the auto-generated header that implements a family of
-// generic predicate assertion macros.
-#include "gtest/gtest_pred_impl.h"
-
-// Macros for testing equalities and inequalities.
-//
-// * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
-// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
-// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
-// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
-// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
-// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
-//
-// When they are not, Google Test prints both the tested expressions and
-// their actual values. The values must be compatible built-in types,
-// or you will get a compiler error. By "compatible" we mean that the
-// values can be compared by the respective operator.
-//
-// Note:
-//
-// 1. It is possible to make a user-defined type work with
-// {ASSERT|EXPECT}_??(), but that requires overloading the
-// comparison operators and is thus discouraged by the Google C++
-// Usage Guide. Therefore, you are advised to use the
-// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
-// equal.
-//
-// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
-// pointers (in particular, C strings). Therefore, if you use it
-// with two C strings, you are testing how their locations in memory
-// are related, not how their content is related. To compare two C
-// strings by content, use {ASSERT|EXPECT}_STR*().
-//
-// 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
-// {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
-// what the actual value is when it fails, and similarly for the
-// other comparisons.
-//
-// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
-// evaluate their arguments, which is undefined.
-//
-// 5. These macros evaluate their arguments exactly once.
-//
-// Examples:
-//
-// EXPECT_NE(5, Foo());
-// EXPECT_EQ(NULL, a_pointer);
-// ASSERT_LT(i, array_size);
-// ASSERT_GT(records.size(), 0) << "There is no record left.";
-
-#define EXPECT_EQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal:: \
- EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
- expected, actual)
-#define EXPECT_NE(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
-#define EXPECT_LE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define EXPECT_LT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define EXPECT_GE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define EXPECT_GT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-#define GTEST_ASSERT_EQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal:: \
- EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
- expected, actual)
-#define GTEST_ASSERT_NE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
-#define GTEST_ASSERT_LE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define GTEST_ASSERT_LT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define GTEST_ASSERT_GE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define GTEST_ASSERT_GT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
-// ASSERT_XY(), which clashes with some users' own code.
-
-#if !GTEST_DONT_DEFINE_ASSERT_EQ
-# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_NE
-# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LE
-# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LT
-# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GE
-# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GT
-# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
-#endif
-
-// C String Comparisons. All tests treat NULL and any non-NULL string
-// as different. Two NULLs are equal.
-//
-// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
-// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
-// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
-// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
-//
-// For wide or narrow string objects, you can use the
-// {ASSERT|EXPECT}_??() macros.
-//
-// Don't depend on the order in which the arguments are evaluated,
-// which is undefined.
-//
-// These macros evaluate their arguments exactly once.
-
-#define EXPECT_STREQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define EXPECT_STRNE(s1, s2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define EXPECT_STRCASEEQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define EXPECT_STRCASENE(s1, s2)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-#define ASSERT_STREQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define ASSERT_STRNE(s1, s2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define ASSERT_STRCASEEQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define ASSERT_STRCASENE(s1, s2)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-// Macros for comparing floating-point numbers.
-//
-// * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
-// Tests that two float values are almost equal.
-// * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
-// Tests that two double values are almost equal.
-// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
-// Tests that v1 and v2 are within the given distance to each other.
-//
-// Google Test uses ULP-based comparison to automatically pick a default
-// error bound that is appropriate for the operands. See the
-// FloatingPoint template class in gtest-internal.h if you are
-// interested in the implementation details.
-
-#define EXPECT_FLOAT_EQ(expected, actual)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- expected, actual)
-
-#define EXPECT_DOUBLE_EQ(expected, actual)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- expected, actual)
-
-#define ASSERT_FLOAT_EQ(expected, actual)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- expected, actual)
-
-#define ASSERT_DOUBLE_EQ(expected, actual)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- expected, actual)
-
-#define EXPECT_NEAR(val1, val2, abs_error)\
- EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
-
-#define ASSERT_NEAR(val1, val2, abs_error)\
- ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
-
-// These predicate format functions work on floating-point values, and
-// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
-//
-// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
- float val1, float val2);
-GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
- double val1, double val2);
-
-
-#if GTEST_OS_WINDOWS
-
-// Macros that test for HRESULT failure and success, these are only useful
-// on Windows, and rely on Windows SDK macros and APIs to compile.
-//
-// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
-//
-// When expr unexpectedly fails or succeeds, Google Test prints the
-// expected result and the actual result with both a human-readable
-// string representation of the error, if available, as well as the
-// hex result code.
-# define EXPECT_HRESULT_SUCCEEDED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define ASSERT_HRESULT_SUCCEEDED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define EXPECT_HRESULT_FAILED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-# define ASSERT_HRESULT_FAILED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-#endif // GTEST_OS_WINDOWS
-
-// Macros that execute statement and check that it doesn't generate new fatal
-// failures in the current thread.
-//
-// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
-//
-// Examples:
-//
-// EXPECT_NO_FATAL_FAILURE(Process());
-// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
-//
-#define ASSERT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
-#define EXPECT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
-
-// Causes a trace (including the source file path, the current line
-// number, and the given message) to be included in every test failure
-// message generated by code in the current scope. The effect is
-// undone when the control leaves the current scope.
-//
-// The message argument can be anything streamable to std::ostream.
-//
-// In the implementation, we include the current line number as part
-// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
-// to appear in the same block - as long as they are on different
-// lines.
-#define SCOPED_TRACE(message) \
- ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
- __FILE__, __LINE__, ::testing::Message() << (message))
-
-// Compile-time assertion for type equality.
-// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
-// the same type. The value it returns is not interesting.
-//
-// Instead of making StaticAssertTypeEq a class template, we make it a
-// function template that invokes a helper class template. This
-// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
-// defining objects of that type.
-//
-// CAVEAT:
-//
-// When used inside a method of a class template,
-// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
-// instantiated. For example, given:
-//
-// template <typename T> class Foo {
-// public:
-// void Bar() { testing::StaticAssertTypeEq<int, T>(); }
-// };
-//
-// the code:
-//
-// void Test1() { Foo<bool> foo; }
-//
-// will NOT generate a compiler error, as Foo<bool>::Bar() is never
-// actually instantiated. Instead, you need:
-//
-// void Test2() { Foo<bool> foo; foo.Bar(); }
-//
-// to cause a compiler error.
-template <typename T1, typename T2>
-bool StaticAssertTypeEq() {
- (void)internal::StaticAssertTypeEqHelper<T1, T2>();
- return true;
-}
-
-// Defines a test.
-//
-// The first parameter is the name of the test case, and the second
-// parameter is the name of the test within the test case.
-//
-// The convention is to end the test case name with "Test". For
-// example, a test case for the Foo class can be named FooTest.
-//
-// The user should put his test code between braces after using this
-// macro. Example:
-//
-// TEST(FooTest, InitializesCorrectly) {
-// Foo foo;
-// EXPECT_TRUE(foo.StatusIsOK());
-// }
-
-// Note that we call GetTestTypeId() instead of GetTypeId<
-// ::testing::Test>() here to get the type ID of testing::Test. This
-// is to work around a suspected linker bug when using Google Test as
-// a framework on Mac OS X. The bug causes GetTypeId<
-// ::testing::Test>() to return different values depending on whether
-// the call is from the Google Test framework itself or from user test
-// code. GetTestTypeId() is guaranteed to always return the same
-// value, as it always calls GetTypeId<>() from the Google Test
-// framework.
-#define GTEST_TEST(test_case_name, test_name)\
- GTEST_TEST_(test_case_name, test_name, \
- ::testing::Test, ::testing::internal::GetTestTypeId())
-
-// Define this macro to 1 to omit the definition of TEST(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_TEST
-# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
-#endif
-
-// Defines a test that uses a test fixture.
-//
-// The first parameter is the name of the test fixture class, which
-// also doubles as the test case name. The second parameter is the
-// name of the test within the test case.
-//
-// A test fixture class must be declared earlier. The user should put
-// his test code between braces after using this macro. Example:
-//
-// class FooTest : public testing::Test {
-// protected:
-// virtual void SetUp() { b_.AddElement(3); }
-//
-// Foo a_;
-// Foo b_;
-// };
-//
-// TEST_F(FooTest, InitializesCorrectly) {
-// EXPECT_TRUE(a_.StatusIsOK());
-// }
-//
-// TEST_F(FooTest, ReturnsElementCountCorrectly) {
-// EXPECT_EQ(0, a_.size());
-// EXPECT_EQ(1, b_.size());
-// }
-
-#define TEST_F(test_fixture, test_name)\
- GTEST_TEST_(test_fixture, test_name, test_fixture, \
- ::testing::internal::GetTypeId<test_fixture>())
-
-// Use this macro in main() to run all tests. It returns 0 if all
-// tests are successful, or 1 otherwise.
-//
-// RUN_ALL_TESTS() should be invoked after the command line has been
-// parsed by InitGoogleTest().
-
-#define RUN_ALL_TESTS()\
- (::testing::UnitTest::GetInstance()->Run())
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_H_
+++ /dev/null
-// Copyright 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
-// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
-//
-// Implements a family of generic predicate assertion macros.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-
-// Makes sure this header is not included before gtest.h.
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
-#endif // GTEST_INCLUDE_GTEST_GTEST_H_
-
-// This header implements a family of generic predicate assertion
-// macros:
-//
-// ASSERT_PRED_FORMAT1(pred_format, v1)
-// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
-// ...
-//
-// where pred_format is a function or functor that takes n (in the
-// case of ASSERT_PRED_FORMATn) values and their source expression
-// text, and returns a testing::AssertionResult. See the definition
-// of ASSERT_EQ in gtest.h for an example.
-//
-// If you don't care about formatting, you can use the more
-// restrictive version:
-//
-// ASSERT_PRED1(pred, v1)
-// ASSERT_PRED2(pred, v1, v2)
-// ...
-//
-// where pred is an n-ary function or functor that returns bool,
-// and the values v1, v2, ..., must support the << operator for
-// streaming to std::ostream.
-//
-// We also define the EXPECT_* variations.
-//
-// For now we only support predicates whose arity is at most 5.
-// Please email googletestframework@googlegroups.com if you need
-// support for higher arities.
-
-// GTEST_ASSERT_ is the basic statement to which all of the assertions
-// in this file reduce. Don't use this in your code.
-
-#define GTEST_ASSERT_(expression, on_failure) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar = (expression)) \
- ; \
- else \
- on_failure(gtest_ar.failure_message())
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
-// this in your code.
-template <typename Pred,
- typename T1>
-AssertionResult AssertPred1Helper(const char* pred_text,
- const char* e1,
- Pred pred,
- const T1& v1) {
- if (pred(v1)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, v1),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
-// this in your code.
-#define GTEST_PRED1_(pred, v1, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
- #v1, \
- pred, \
- v1), on_failure)
-
-// Unary predicate assertion macros.
-#define EXPECT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2>
-AssertionResult AssertPred2Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- Pred pred,
- const T1& v1,
- const T2& v2) {
- if (pred(v1, v2)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
-// this in your code.
-#define GTEST_PRED2_(pred, v1, v2, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
- #v1, \
- #v2, \
- pred, \
- v1, \
- v2), on_failure)
-
-// Binary predicate assertion macros.
-#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3>
-AssertionResult AssertPred3Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3) {
- if (pred(v1, v2, v3)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
-// this in your code.
-#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- pred, \
- v1, \
- v2, \
- v3), on_failure)
-
-// Ternary predicate assertion macros.
-#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4>
-AssertionResult AssertPred4Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4) {
- if (pred(v1, v2, v3, v4)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ", "
- << e4 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3
- << "\n" << e4 << " evaluates to " << v4;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
-// this in your code.
-#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4), on_failure)
-
-// 4-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5>
-AssertionResult AssertPred5Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- const char* e5,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4,
- const T5& v5) {
- if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ", "
- << e4 << ", "
- << e5 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3
- << "\n" << e4 << " evaluates to " << v4
- << "\n" << e5 << " evaluates to " << v5;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
-// this in your code.
-#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- #v5, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4, \
- v5), on_failure)
-
-// 5-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-
-
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+++ /dev/null
-// Copyright 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// Google C++ Testing Framework definitions useful in production code.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-
-// When you need to test the private or protected members of a class,
-// use the FRIEND_TEST macro to declare your tests as friends of the
-// class. For example:
-//
-// class MyClass {
-// private:
-// void MyMethod();
-// FRIEND_TEST(MyClassTest, MyMethod);
-// };
-//
-// class MyClassTest : public testing::Test {
-// // ...
-// };
-//
-// TEST_F(MyClassTest, MyMethod) {
-// // Can call MyClass::MyMethod() here.
-// }
-
-#define FRIEND_TEST(test_case_name, test_name)\
-friend class test_case_name##_##test_name##_Test
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines internal utilities needed for implementing
-// death tests. They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-internal.h"
-
-#include <stdio.h>
-
-namespace testing {
-namespace internal {
-
-GTEST_DECLARE_string_(internal_run_death_test);
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kDeathTestStyleFlag[] = "death_test_style";
-const char kDeathTestUseFork[] = "death_test_use_fork";
-const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
-
-#if GTEST_HAS_DEATH_TEST
-
-// DeathTest is a class that hides much of the complexity of the
-// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
-// returns a concrete class that depends on the prevailing death test
-// style, as defined by the --gtest_death_test_style and/or
-// --gtest_internal_run_death_test flags.
-
-// In describing the results of death tests, these terms are used with
-// the corresponding definitions:
-//
-// exit status: The integer exit information in the format specified
-// by wait(2)
-// exit code: The integer code passed to exit(3), _exit(2), or
-// returned from main()
-class GTEST_API_ DeathTest {
- public:
- // Create returns false if there was an error determining the
- // appropriate action to take for the current death test; for example,
- // if the gtest_death_test_style flag is set to an invalid value.
- // The LastMessage method will return a more detailed message in that
- // case. Otherwise, the DeathTest pointer pointed to by the "test"
- // argument is set. If the death test should be skipped, the pointer
- // is set to NULL; otherwise, it is set to the address of a new concrete
- // DeathTest object that controls the execution of the current test.
- static bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test);
- DeathTest();
- virtual ~DeathTest() { }
-
- // A helper class that aborts a death test when it's deleted.
- class ReturnSentinel {
- public:
- explicit ReturnSentinel(DeathTest* test) : test_(test) { }
- ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
- private:
- DeathTest* const test_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
- } GTEST_ATTRIBUTE_UNUSED_;
-
- // An enumeration of possible roles that may be taken when a death
- // test is encountered. EXECUTE means that the death test logic should
- // be executed immediately. OVERSEE means that the program should prepare
- // the appropriate environment for a child process to execute the death
- // test, then wait for it to complete.
- enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
-
- // An enumeration of the three reasons that a test might be aborted.
- enum AbortReason {
- TEST_ENCOUNTERED_RETURN_STATEMENT,
- TEST_THREW_EXCEPTION,
- TEST_DID_NOT_DIE
- };
-
- // Assumes one of the above roles.
- virtual TestRole AssumeRole() = 0;
-
- // Waits for the death test to finish and returns its status.
- virtual int Wait() = 0;
-
- // Returns true if the death test passed; that is, the test process
- // exited during the test, its exit status matches a user-supplied
- // predicate, and its stderr output matches a user-supplied regular
- // expression.
- // The user-supplied predicate may be a macro expression rather
- // than a function pointer or functor, or else Wait and Passed could
- // be combined.
- virtual bool Passed(bool exit_status_ok) = 0;
-
- // Signals that the death test did not die as expected.
- virtual void Abort(AbortReason reason) = 0;
-
- // Returns a human-readable outcome message regarding the outcome of
- // the last death test.
- static const char* LastMessage();
-
- static void set_last_death_test_message(const String& message);
-
- private:
- // A string containing a description of the outcome of the last death test.
- static String last_death_test_message_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
-};
-
-// Factory interface for death tests. May be mocked out for testing.
-class DeathTestFactory {
- public:
- virtual ~DeathTestFactory() { }
- virtual bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test) = 0;
-};
-
-// A concrete DeathTestFactory implementation for normal use.
-class DefaultDeathTestFactory : public DeathTestFactory {
- public:
- virtual bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test);
-};
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
-
-// Traps C++ exceptions escaping statement and reports them as test
-// failures. Note that trapping SEH exceptions is not implemented here.
-# if GTEST_HAS_EXCEPTIONS
-# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } catch (const ::std::exception& gtest_exception) { \
- fprintf(\
- stderr, \
- "\n%s: Caught std::exception-derived exception escaping the " \
- "death test statement. Exception message: %s\n", \
- ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
- gtest_exception.what()); \
- fflush(stderr); \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- } catch (...) { \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- }
-
-# else
-# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-
-# endif
-
-// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
-// ASSERT_EXIT*, and EXPECT_EXIT*.
-# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- const ::testing::internal::RE& gtest_regex = (regex); \
- ::testing::internal::DeathTest* gtest_dt; \
- if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
- __FILE__, __LINE__, >est_dt)) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- if (gtest_dt != NULL) { \
- ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
- gtest_dt_ptr(gtest_dt); \
- switch (gtest_dt->AssumeRole()) { \
- case ::testing::internal::DeathTest::OVERSEE_TEST: \
- if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- break; \
- case ::testing::internal::DeathTest::EXECUTE_TEST: { \
- ::testing::internal::DeathTest::ReturnSentinel \
- gtest_sentinel(gtest_dt); \
- GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
- gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
- break; \
- } \
- default: \
- break; \
- } \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
- fail(::testing::internal::DeathTest::LastMessage())
-// The symbol "fail" here expands to something into which a message
-// can be streamed.
-
-// A class representing the parsed contents of the
-// --gtest_internal_run_death_test flag, as it existed when
-// RUN_ALL_TESTS was called.
-class InternalRunDeathTestFlag {
- public:
- InternalRunDeathTestFlag(const String& a_file,
- int a_line,
- int an_index,
- int a_write_fd)
- : file_(a_file), line_(a_line), index_(an_index),
- write_fd_(a_write_fd) {}
-
- ~InternalRunDeathTestFlag() {
- if (write_fd_ >= 0)
- posix::Close(write_fd_);
- }
-
- String file() const { return file_; }
- int line() const { return line_; }
- int index() const { return index_; }
- int write_fd() const { return write_fd_; }
-
- private:
- String file_;
- int line_;
- int index_;
- int write_fd_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
-};
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
-
-#else // GTEST_HAS_DEATH_TEST
-
-// This macro is used for implementing macros such as
-// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
-// death tests are not supported. Those macros must compile on such systems
-// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
-// systems that support death tests. This allows one to write such a macro
-// on a system that does not support death tests and be sure that it will
-// compile on a death-test supporting system.
-//
-// Parameters:
-// statement - A statement that a macro such as EXPECT_DEATH would test
-// for program termination. This macro has to make sure this
-// statement is compiled but not executed, to ensure that
-// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
-// parameter iff EXPECT_DEATH compiles with it.
-// regex - A regex that a macro such as EXPECT_DEATH would use to test
-// the output of statement. This parameter has to be
-// compiled but not evaluated by this macro, to ensure that
-// this macro only accepts expressions that a macro such as
-// EXPECT_DEATH would accept.
-// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
-// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
-// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
-// compile inside functions where ASSERT_DEATH doesn't
-// compile.
-//
-// The branch that has an always false condition is used to ensure that
-// statement and regex are compiled (and thus syntactically correct) but
-// never executed. The unreachable code macro protects the terminator
-// statement from generating an 'unreachable code' warning in case
-// statement unconditionally returns or throws. The Message constructor at
-// the end allows the syntax of streaming additional messages into the
-// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
-# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- GTEST_LOG_(WARNING) \
- << "Death tests are not supported on this platform.\n" \
- << "Statement '" #statement "' cannot be verified."; \
- } else if (::testing::internal::AlwaysFalse()) { \
- ::testing::internal::RE::PartialMatch(".*", (regex)); \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- terminator; \
- } else \
- ::testing::Message()
-
-#endif // GTEST_HAS_DEATH_TEST
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keith.ray@gmail.com (Keith Ray)
-//
-// Google Test filepath utilities
-//
-// This header file declares classes and functions used internally by
-// Google Test. They are subject to change without notice.
-//
-// This file is #included in <gtest/internal/gtest-internal.h>.
-// Do not include this header file separately!
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-// FilePath - a class for file and directory pathname manipulation which
-// handles platform-specific conventions (like the pathname separator).
-// Used for helper functions for naming files in a directory for xml output.
-// Except for Set methods, all methods are const or static, which provides an
-// "immutable value object" -- useful for peace of mind.
-// A FilePath with a value ending in a path separator ("like/this/") represents
-// a directory, otherwise it is assumed to represent a file. In either case,
-// it may or may not represent an actual file or directory in the file system.
-// Names are NOT checked for syntax correctness -- no checking for illegal
-// characters, malformed paths, etc.
-
-class GTEST_API_ FilePath {
- public:
- FilePath() : pathname_("") { }
- FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
-
- explicit FilePath(const char* pathname) : pathname_(pathname) {
- Normalize();
- }
-
- explicit FilePath(const String& pathname) : pathname_(pathname) {
- Normalize();
- }
-
- FilePath& operator=(const FilePath& rhs) {
- Set(rhs);
- return *this;
- }
-
- void Set(const FilePath& rhs) {
- pathname_ = rhs.pathname_;
- }
-
- String ToString() const { return pathname_; }
- const char* c_str() const { return pathname_.c_str(); }
-
- // Returns the current working directory, or "" if unsuccessful.
- static FilePath GetCurrentDir();
-
- // Given directory = "dir", base_name = "test", number = 0,
- // extension = "xml", returns "dir/test.xml". If number is greater
- // than zero (e.g., 12), returns "dir/test_12.xml".
- // On Windows platform, uses \ as the separator rather than /.
- static FilePath MakeFileName(const FilePath& directory,
- const FilePath& base_name,
- int number,
- const char* extension);
-
- // Given directory = "dir", relative_path = "test.xml",
- // returns "dir/test.xml".
- // On Windows, uses \ as the separator rather than /.
- static FilePath ConcatPaths(const FilePath& directory,
- const FilePath& relative_path);
-
- // Returns a pathname for a file that does not currently exist. The pathname
- // will be directory/base_name.extension or
- // directory/base_name_<number>.extension if directory/base_name.extension
- // already exists. The number will be incremented until a pathname is found
- // that does not already exist.
- // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
- // There could be a race condition if two or more processes are calling this
- // function at the same time -- they could both pick the same filename.
- static FilePath GenerateUniqueFileName(const FilePath& directory,
- const FilePath& base_name,
- const char* extension);
-
- // Returns true iff the path is NULL or "".
- bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
-
- // If input name has a trailing separator character, removes it and returns
- // the name, otherwise return the name string unmodified.
- // On Windows platform, uses \ as the separator, other platforms use /.
- FilePath RemoveTrailingPathSeparator() const;
-
- // Returns a copy of the FilePath with the directory part removed.
- // Example: FilePath("path/to/file").RemoveDirectoryName() returns
- // FilePath("file"). If there is no directory part ("just_a_file"), it returns
- // the FilePath unmodified. If there is no file part ("just_a_dir/") it
- // returns an empty FilePath ("").
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveDirectoryName() const;
-
- // RemoveFileName returns the directory path with the filename removed.
- // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
- // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
- // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
- // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveFileName() const;
-
- // Returns a copy of the FilePath with the case-insensitive extension removed.
- // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
- // FilePath("dir/file"). If a case-insensitive extension is not
- // found, returns a copy of the original FilePath.
- FilePath RemoveExtension(const char* extension) const;
-
- // Creates directories so that path exists. Returns true if successful or if
- // the directories already exist; returns false if unable to create
- // directories for any reason. Will also return false if the FilePath does
- // not represent a directory (that is, it doesn't end with a path separator).
- bool CreateDirectoriesRecursively() const;
-
- // Create the directory so that path exists. Returns true if successful or
- // if the directory already exists; returns false if unable to create the
- // directory for any reason, including if the parent directory does not
- // exist. Not named "CreateDirectory" because that's a macro on Windows.
- bool CreateFolder() const;
-
- // Returns true if FilePath describes something in the file-system,
- // either a file, directory, or whatever, and that something exists.
- bool FileOrDirectoryExists() const;
-
- // Returns true if pathname describes a directory in the file-system
- // that exists.
- bool DirectoryExists() const;
-
- // Returns true if FilePath ends with a path separator, which indicates that
- // it is intended to represent a directory. Returns false otherwise.
- // This does NOT check that a directory (or file) actually exists.
- bool IsDirectory() const;
-
- // Returns true if pathname describes a root directory. (Windows has one
- // root directory per disk drive.)
- bool IsRootDirectory() const;
-
- // Returns true if pathname describes an absolute path.
- bool IsAbsolutePath() const;
-
- private:
- // Replaces multiple consecutive separators with a single separator.
- // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
- // redundancies that might be in a pathname involving "." or "..".
- //
- // A pathname with multiple consecutive separators may occur either through
- // user error or as a result of some scripts or APIs that generate a pathname
- // with a trailing separator. On other platforms the same API or script
- // may NOT generate a pathname with a trailing "/". Then elsewhere that
- // pathname may have another "/" and pathname components added to it,
- // without checking for the separator already being there.
- // The script language and operating system may allow paths like "foo//bar"
- // but some of the functions in FilePath will not handle that correctly. In
- // particular, RemoveTrailingPathSeparator() only removes one separator, and
- // it is called in CreateDirectoriesRecursively() assuming that it will change
- // a pathname from directory syntax (trailing separator) to filename syntax.
- //
- // On Windows this method also replaces the alternate path separator '/' with
- // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
- // "bar\\foo".
-
- void Normalize();
-
- // Returns a pointer to the last occurence of a valid path separator in
- // the FilePath. On Windows, for example, both '/' and '\' are valid path
- // separators. Returns NULL if no path separator was found.
- const char* FindLastPathSeparator() const;
-
- String pathname_;
-}; // class FilePath
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares functions and macros used internally by
-// Google Test. They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_LINUX
-# include <stdlib.h>
-# include <sys/types.h>
-# include <sys/wait.h>
-# include <unistd.h>
-#endif // GTEST_OS_LINUX
-
-#include <ctype.h>
-#include <string.h>
-#include <iomanip>
-#include <limits>
-#include <set>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-type-util.h"
-
-// Due to C++ preprocessor weirdness, we need double indirection to
-// concatenate two tokens when one of them is __LINE__. Writing
-//
-// foo ## __LINE__
-//
-// will result in the token foo__LINE__, instead of foo followed by
-// the current line number. For more details, see
-// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
-#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
-#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
-
-// Google Test defines the testing::Message class to allow construction of
-// test messages via the << operator. The idea is that anything
-// streamable to std::ostream can be streamed to a testing::Message.
-// This allows a user to use his own types in Google Test assertions by
-// overloading the << operator.
-//
-// util/gtl/stl_logging-inl.h overloads << for STL containers. These
-// overloads cannot be defined in the std namespace, as that will be
-// undefined behavior. Therefore, they are defined in the global
-// namespace instead.
-//
-// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
-// overloads are visible in either the std namespace or the global
-// namespace, but not other namespaces, including the testing
-// namespace which Google Test's Message class is in.
-//
-// To allow STL containers (and other types that has a << operator
-// defined in the global namespace) to be used in Google Test assertions,
-// testing::Message must access the custom << operator from the global
-// namespace. Hence this helper function.
-//
-// Note: Jeffrey Yasskin suggested an alternative fix by "using
-// ::operator<<;" in the definition of Message's operator<<. That fix
-// doesn't require a helper function, but unfortunately doesn't
-// compile with MSVC.
-template <typename T>
-inline void GTestStreamToHelper(std::ostream* os, const T& val) {
- *os << val;
-}
-
-class ProtocolMessage;
-namespace proto2 { class Message; }
-
-namespace testing {
-
-// Forward declarations.
-
-class AssertionResult; // Result of an assertion.
-class Message; // Represents a failure message.
-class Test; // Represents a test.
-class TestInfo; // Information about a test.
-class TestPartResult; // Result of a test part.
-class UnitTest; // A collection of test cases.
-
-template <typename T>
-::std::string PrintToString(const T& value);
-
-namespace internal {
-
-struct TraceInfo; // Information about a trace point.
-class ScopedTrace; // Implements scoped trace.
-class TestInfoImpl; // Opaque implementation of TestInfo
-class UnitTestImpl; // Opaque implementation of UnitTest
-
-// How many times InitGoogleTest() has been called.
-extern int g_init_gtest_count;
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-GTEST_API_ extern const char kStackTraceMarker[];
-
-// A secret type that Google Test users don't know about. It has no
-// definition on purpose. Therefore it's impossible to create a
-// Secret object, which is what we want.
-class Secret;
-
-// Two overloaded helpers for checking at compile time whether an
-// expression is a null pointer literal (i.e. NULL or any 0-valued
-// compile-time integral constant). Their return values have
-// different sizes, so we can use sizeof() to test which version is
-// picked by the compiler. These helpers have no implementations, as
-// we only need their signatures.
-//
-// Given IsNullLiteralHelper(x), the compiler will pick the first
-// version if x can be implicitly converted to Secret*, and pick the
-// second version otherwise. Since Secret is a secret and incomplete
-// type, the only expression a user can write that has type Secret* is
-// a null pointer literal. Therefore, we know that x is a null
-// pointer literal if and only if the first version is picked by the
-// compiler.
-char IsNullLiteralHelper(Secret* p);
-char (&IsNullLiteralHelper(...))[2]; // NOLINT
-
-// A compile-time bool constant that is true if and only if x is a
-// null pointer literal (i.e. NULL or any 0-valued compile-time
-// integral constant).
-#ifdef GTEST_ELLIPSIS_NEEDS_POD_
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_IS_NULL_LITERAL_(x) false
-#else
-# define GTEST_IS_NULL_LITERAL_(x) \
- (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
-#endif // GTEST_ELLIPSIS_NEEDS_POD_
-
-// Appends the user-supplied message to the Google-Test-generated message.
-GTEST_API_ String AppendUserMessage(const String& gtest_msg,
- const Message& user_msg);
-
-// A helper class for creating scoped traces in user programs.
-class GTEST_API_ ScopedTrace {
- public:
- // The c'tor pushes the given source file location and message onto
- // a trace stack maintained by Google Test.
- ScopedTrace(const char* file, int line, const Message& message);
-
- // The d'tor pops the info pushed by the c'tor.
- //
- // Note that the d'tor is not virtual in order to be efficient.
- // Don't inherit from ScopedTrace!
- ~ScopedTrace();
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
-} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
- // c'tor and d'tor. Therefore it doesn't
- // need to be used otherwise.
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-// The Symbian compiler has a bug that prevents it from selecting the
-// correct overload of FormatForComparisonFailureMessage (see below)
-// unless we pass the first argument by reference. If we do that,
-// however, Visual Age C++ 10.1 generates a compiler error. Therefore
-// we only apply the work-around for Symbian.
-#if defined(__SYMBIAN32__)
-# define GTEST_CREF_WORKAROUND_ const&
-#else
-# define GTEST_CREF_WORKAROUND_
-#endif
-
-// When this operand is a const char* or char*, if the other operand
-// is a ::std::string or ::string, we print this operand as a C string
-// rather than a pointer (we do the same for wide strings); otherwise
-// we print it as a pointer to be safe.
-
-// This internal macro is used to avoid duplicated code.
-#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\
-inline String FormatForComparisonFailureMessage(\
- operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
- const operand2_type& /*operand2*/) {\
- return operand1_printer(str);\
-}\
-inline String FormatForComparisonFailureMessage(\
- const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
- const operand2_type& /*operand2*/) {\
- return operand1_printer(str);\
-}
-
-GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)
-#if GTEST_HAS_STD_WSTRING
-GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)
-#endif // GTEST_HAS_GLOBAL_STRING
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#undef GTEST_FORMAT_IMPL_
-
-// The next four overloads handle the case where the operand being
-// printed is a char/wchar_t pointer and the other operand is not a
-// string/wstring object. In such cases, we just print the operand as
-// a pointer to be safe.
-#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType) \
- template <typename T> \
- String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \
- const T&) { \
- return PrintToString(static_cast<const void*>(p)); \
- }
-
-GTEST_FORMAT_CHAR_PTR_IMPL_(char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)
-
-#undef GTEST_FORMAT_CHAR_PTR_IMPL_
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-// expected_expression: "foo"
-// actual_expression: "bar"
-// expected_value: "5"
-// actual_value: "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
- const char* actual_expression,
- const String& expected_value,
- const String& actual_value,
- bool ignoring_case);
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-GTEST_API_ String GetBoolAssertionFailureMessage(
- const AssertionResult& assertion_result,
- const char* expression_text,
- const char* actual_predicate_value,
- const char* expected_predicate_value);
-
-// This template class represents an IEEE floating-point number
-// (either single-precision or double-precision, depending on the
-// template parameters).
-//
-// The purpose of this class is to do more sophisticated number
-// comparison. (Due to round-off error, etc, it's very unlikely that
-// two floating-points will be equal exactly. Hence a naive
-// comparison by the == operation often doesn't work.)
-//
-// Format of IEEE floating-point:
-//
-// The most-significant bit being the leftmost, an IEEE
-// floating-point looks like
-//
-// sign_bit exponent_bits fraction_bits
-//
-// Here, sign_bit is a single bit that designates the sign of the
-// number.
-//
-// For float, there are 8 exponent bits and 23 fraction bits.
-//
-// For double, there are 11 exponent bits and 52 fraction bits.
-//
-// More details can be found at
-// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
-//
-// Template parameter:
-//
-// RawType: the raw floating-point type (either float or double)
-template <typename RawType>
-class FloatingPoint {
- public:
- // Defines the unsigned integer type that has the same size as the
- // floating point number.
- typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
-
- // Constants.
-
- // # of bits in a number.
- static const size_t kBitCount = 8*sizeof(RawType);
-
- // # of fraction bits in a number.
- static const size_t kFractionBitCount =
- std::numeric_limits<RawType>::digits - 1;
-
- // # of exponent bits in a number.
- static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
-
- // The mask for the sign bit.
- static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
-
- // The mask for the fraction bits.
- static const Bits kFractionBitMask =
- ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
-
- // The mask for the exponent bits.
- static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
-
- // How many ULP's (Units in the Last Place) we want to tolerate when
- // comparing two numbers. The larger the value, the more error we
- // allow. A 0 value means that two numbers must be exactly the same
- // to be considered equal.
- //
- // The maximum error of a single floating-point operation is 0.5
- // units in the last place. On Intel CPU's, all floating-point
- // calculations are done with 80-bit precision, while double has 64
- // bits. Therefore, 4 should be enough for ordinary use.
- //
- // See the following article for more details on ULP:
- // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
- static const size_t kMaxUlps = 4;
-
- // Constructs a FloatingPoint from a raw floating-point number.
- //
- // On an Intel CPU, passing a non-normalized NAN (Not a Number)
- // around may change its bits, although the new value is guaranteed
- // to be also a NAN. Therefore, don't expect this constructor to
- // preserve the bits in x when x is a NAN.
- explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
-
- // Static methods
-
- // Reinterprets a bit pattern as a floating-point number.
- //
- // This function is needed to test the AlmostEquals() method.
- static RawType ReinterpretBits(const Bits bits) {
- FloatingPoint fp(0);
- fp.u_.bits_ = bits;
- return fp.u_.value_;
- }
-
- // Returns the floating-point number that represent positive infinity.
- static RawType Infinity() {
- return ReinterpretBits(kExponentBitMask);
- }
-
- // Non-static methods
-
- // Returns the bits that represents this number.
- const Bits &bits() const { return u_.bits_; }
-
- // Returns the exponent bits of this number.
- Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
-
- // Returns the fraction bits of this number.
- Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
-
- // Returns the sign bit of this number.
- Bits sign_bit() const { return kSignBitMask & u_.bits_; }
-
- // Returns true iff this is NAN (not a number).
- bool is_nan() const {
- // It's a NAN if the exponent bits are all ones and the fraction
- // bits are not entirely zeros.
- return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
- }
-
- // Returns true iff this number is at most kMaxUlps ULP's away from
- // rhs. In particular, this function:
- //
- // - returns false if either number is (or both are) NAN.
- // - treats really large numbers as almost equal to infinity.
- // - thinks +0.0 and -0.0 are 0 DLP's apart.
- bool AlmostEquals(const FloatingPoint& rhs) const {
- // The IEEE standard says that any comparison operation involving
- // a NAN must return false.
- if (is_nan() || rhs.is_nan()) return false;
-
- return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
- <= kMaxUlps;
- }
-
- private:
- // The data type used to store the actual floating-point number.
- union FloatingPointUnion {
- RawType value_; // The raw floating-point number.
- Bits bits_; // The bits that represent the number.
- };
-
- // Converts an integer from the sign-and-magnitude representation to
- // the biased representation. More precisely, let N be 2 to the
- // power of (kBitCount - 1), an integer x is represented by the
- // unsigned number x + N.
- //
- // For instance,
- //
- // -N + 1 (the most negative number representable using
- // sign-and-magnitude) is represented by 1;
- // 0 is represented by N; and
- // N - 1 (the biggest number representable using
- // sign-and-magnitude) is represented by 2N - 1.
- //
- // Read http://en.wikipedia.org/wiki/Signed_number_representations
- // for more details on signed number representations.
- static Bits SignAndMagnitudeToBiased(const Bits &sam) {
- if (kSignBitMask & sam) {
- // sam represents a negative number.
- return ~sam + 1;
- } else {
- // sam represents a positive number.
- return kSignBitMask | sam;
- }
- }
-
- // Given two numbers in the sign-and-magnitude representation,
- // returns the distance between them as an unsigned number.
- static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
- const Bits &sam2) {
- const Bits biased1 = SignAndMagnitudeToBiased(sam1);
- const Bits biased2 = SignAndMagnitudeToBiased(sam2);
- return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
- }
-
- FloatingPointUnion u_;
-};
-
-// Typedefs the instances of the FloatingPoint template class that we
-// care to use.
-typedef FloatingPoint<float> Float;
-typedef FloatingPoint<double> Double;
-
-// In order to catch the mistake of putting tests that use different
-// test fixture classes in the same test case, we need to assign
-// unique IDs to fixture classes and compare them. The TypeId type is
-// used to hold such IDs. The user should treat TypeId as an opaque
-// type: the only operation allowed on TypeId values is to compare
-// them for equality using the == operator.
-typedef const void* TypeId;
-
-template <typename T>
-class TypeIdHelper {
- public:
- // dummy_ must not have a const type. Otherwise an overly eager
- // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
- // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
- static bool dummy_;
-};
-
-template <typename T>
-bool TypeIdHelper<T>::dummy_ = false;
-
-// GetTypeId<T>() returns the ID of type T. Different values will be
-// returned for different types. Calling the function twice with the
-// same type argument is guaranteed to return the same ID.
-template <typename T>
-TypeId GetTypeId() {
- // The compiler is required to allocate a different
- // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
- // the template. Therefore, the address of dummy_ is guaranteed to
- // be unique.
- return &(TypeIdHelper<T>::dummy_);
-}
-
-// Returns the type ID of ::testing::Test. Always call this instead
-// of GetTypeId< ::testing::Test>() to get the type ID of
-// ::testing::Test, as the latter may give the wrong result due to a
-// suspected linker bug when compiling Google Test as a Mac OS X
-// framework.
-GTEST_API_ TypeId GetTestTypeId();
-
-// Defines the abstract factory interface that creates instances
-// of a Test object.
-class TestFactoryBase {
- public:
- virtual ~TestFactoryBase() {}
-
- // Creates a test instance to run. The instance is both created and destroyed
- // within TestInfoImpl::Run()
- virtual Test* CreateTest() = 0;
-
- protected:
- TestFactoryBase() {}
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
-};
-
-// This class provides implementation of TeastFactoryBase interface.
-// It is used in TEST and TEST_F macros.
-template <class TestClass>
-class TestFactoryImpl : public TestFactoryBase {
- public:
- virtual Test* CreateTest() { return new TestClass; }
-};
-
-#if GTEST_OS_WINDOWS
-
-// Predicate-formatters for implementing the HRESULT checking macros
-// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
-// We pass a long instead of HRESULT to avoid causing an
-// include dependency for the HRESULT type.
-GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
- long hr); // NOLINT
-GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
- long hr); // NOLINT
-
-#endif // GTEST_OS_WINDOWS
-
-// Types of SetUpTestCase() and TearDownTestCase() functions.
-typedef void (*SetUpTestCaseFunc)();
-typedef void (*TearDownTestCaseFunc)();
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// name: name of the test
-// type_param the name of the test's type parameter, or NULL if
-// this is not a typed or a type-parameterized test.
-// value_param text representation of the test's value parameter,
-// or NULL if this is not a type-parameterized test.
-// fixture_class_id: ID of the test fixture class
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-// factory: pointer to the factory that creates a test object.
-// The newly created TestInfo instance will assume
-// ownership of the factory object.
-GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- TypeId fixture_class_id,
- SetUpTestCaseFunc set_up_tc,
- TearDownTestCaseFunc tear_down_tc,
- TestFactoryBase* factory);
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false. None of pstr, *pstr, and prefix can be NULL.
-GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// State of the definition of a type-parameterized test case.
-class GTEST_API_ TypedTestCasePState {
- public:
- TypedTestCasePState() : registered_(false) {}
-
- // Adds the given test name to defined_test_names_ and return true
- // if the test case hasn't been registered; otherwise aborts the
- // program.
- bool AddTestName(const char* file, int line, const char* case_name,
- const char* test_name) {
- if (registered_) {
- fprintf(stderr, "%s Test %s must be defined before "
- "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
- FormatFileLocation(file, line).c_str(), test_name, case_name);
- fflush(stderr);
- posix::Abort();
- }
- defined_test_names_.insert(test_name);
- return true;
- }
-
- // Verifies that registered_tests match the test names in
- // defined_test_names_; returns registered_tests if successful, or
- // aborts the program otherwise.
- const char* VerifyRegisteredTestNames(
- const char* file, int line, const char* registered_tests);
-
- private:
- bool registered_;
- ::std::set<const char*> defined_test_names_;
-};
-
-// Skips to the first non-space char after the first comma in 'str';
-// returns NULL if no comma is found in 'str'.
-inline const char* SkipComma(const char* str) {
- const char* comma = strchr(str, ',');
- if (comma == NULL) {
- return NULL;
- }
- while (IsSpace(*(++comma))) {}
- return comma;
-}
-
-// Returns the prefix of 'str' before the first comma in it; returns
-// the entire string if it contains no comma.
-inline String GetPrefixUntilComma(const char* str) {
- const char* comma = strchr(str, ',');
- return comma == NULL ? String(str) : String(str, comma - str);
-}
-
-// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
-// registers a list of type-parameterized tests with Google Test. The
-// return value is insignificant - we just need to return something
-// such that we can call this function in a namespace scope.
-//
-// Implementation note: The GTEST_TEMPLATE_ macro declares a template
-// template parameter. It's defined in gtest-type-util.h.
-template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
-class TypeParameterizedTest {
- public:
- // 'index' is the index of the test in the type list 'Types'
- // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
- // Types). Valid values for 'index' are [0, N - 1] where N is the
- // length of Types.
- static bool Register(const char* prefix, const char* case_name,
- const char* test_names, int index) {
- typedef typename Types::Head Type;
- typedef Fixture<Type> FixtureClass;
- typedef typename GTEST_BIND_(TestSel, Type) TestClass;
-
- // First, registers the first type-parameterized test in the type
- // list.
- MakeAndRegisterTestInfo(
- String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/",
- case_name, index).c_str(),
- GetPrefixUntilComma(test_names).c_str(),
- GetTypeName<Type>().c_str(),
- NULL, // No value parameter.
- GetTypeId<FixtureClass>(),
- TestClass::SetUpTestCase,
- TestClass::TearDownTestCase,
- new TestFactoryImpl<TestClass>);
-
- // Next, recurses (at compile time) with the tail of the type list.
- return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
- ::Register(prefix, case_name, test_names, index + 1);
- }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, class TestSel>
-class TypeParameterizedTest<Fixture, TestSel, Types0> {
- public:
- static bool Register(const char* /*prefix*/, const char* /*case_name*/,
- const char* /*test_names*/, int /*index*/) {
- return true;
- }
-};
-
-// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
-// registers *all combinations* of 'Tests' and 'Types' with Google
-// Test. The return value is insignificant - we just need to return
-// something such that we can call this function in a namespace scope.
-template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
-class TypeParameterizedTestCase {
- public:
- static bool Register(const char* prefix, const char* case_name,
- const char* test_names) {
- typedef typename Tests::Head Head;
-
- // First, register the first test in 'Test' for each type in 'Types'.
- TypeParameterizedTest<Fixture, Head, Types>::Register(
- prefix, case_name, test_names, 0);
-
- // Next, recurses (at compile time) with the tail of the test list.
- return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
- ::Register(prefix, case_name, SkipComma(test_names));
- }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, typename Types>
-class TypeParameterizedTestCase<Fixture, Templates0, Types> {
- public:
- static bool Register(const char* /*prefix*/, const char* /*case_name*/,
- const char* /*test_names*/) {
- return true;
- }
-};
-
-#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,
- int skip_count);
-
-// Helpers for suppressing warnings on unreachable code or constant
-// condition.
-
-// Always returns true.
-GTEST_API_ bool AlwaysTrue();
-
-// Always returns false.
-inline bool AlwaysFalse() { return !AlwaysTrue(); }
-
-// Helper for suppressing false warning from Clang on a const char*
-// variable declared in a conditional expression always being NULL in
-// the else branch.
-struct GTEST_API_ ConstCharPtr {
- ConstCharPtr(const char* str) : value(str) {}
- operator bool() const { return true; }
- const char* value;
-};
-
-// A simple Linear Congruential Generator for generating random
-// numbers with a uniform distribution. Unlike rand() and srand(), it
-// doesn't use global state (and therefore can't interfere with user
-// code). Unlike rand_r(), it's portable. An LCG isn't very random,
-// but it's good enough for our purposes.
-class GTEST_API_ Random {
- public:
- static const UInt32 kMaxRange = 1u << 31;
-
- explicit Random(UInt32 seed) : state_(seed) {}
-
- void Reseed(UInt32 seed) { state_ = seed; }
-
- // Generates a random number from [0, range). Crashes if 'range' is
- // 0 or greater than kMaxRange.
- UInt32 Generate(UInt32 range);
-
- private:
- UInt32 state_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
-};
-
-// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
-// compiler error iff T1 and T2 are different types.
-template <typename T1, typename T2>
-struct CompileAssertTypesEqual;
-
-template <typename T>
-struct CompileAssertTypesEqual<T, T> {
-};
-
-// Removes the reference from a type if it is a reference type,
-// otherwise leaves it unchanged. This is the same as
-// tr1::remove_reference, which is not widely available yet.
-template <typename T>
-struct RemoveReference { typedef T type; }; // NOLINT
-template <typename T>
-struct RemoveReference<T&> { typedef T type; }; // NOLINT
-
-// A handy wrapper around RemoveReference that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_REFERENCE_(T) \
- typename ::testing::internal::RemoveReference<T>::type
-
-// Removes const from a type if it is a const type, otherwise leaves
-// it unchanged. This is the same as tr1::remove_const, which is not
-// widely available yet.
-template <typename T>
-struct RemoveConst { typedef T type; }; // NOLINT
-template <typename T>
-struct RemoveConst<const T> { typedef T type; }; // NOLINT
-
-// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
-// definition to fail to remove the const in 'const int[3]' and 'const
-// char[3][4]'. The following specialization works around the bug.
-// However, it causes trouble with GCC and thus needs to be
-// conditionally compiled.
-#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
-template <typename T, size_t N>
-struct RemoveConst<const T[N]> {
- typedef typename RemoveConst<T>::type type[N];
-};
-#endif
-
-// A handy wrapper around RemoveConst that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_CONST_(T) \
- typename ::testing::internal::RemoveConst<T>::type
-
-// Turns const U&, U&, const U, and U all into U.
-#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
- GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
-
-// Adds reference to a type if it is not a reference type,
-// otherwise leaves it unchanged. This is the same as
-// tr1::add_reference, which is not widely available yet.
-template <typename T>
-struct AddReference { typedef T& type; }; // NOLINT
-template <typename T>
-struct AddReference<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper around AddReference that works when the argument T
-// depends on template parameters.
-#define GTEST_ADD_REFERENCE_(T) \
- typename ::testing::internal::AddReference<T>::type
-
-// Adds a reference to const on top of T as necessary. For example,
-// it transforms
-//
-// char ==> const char&
-// const char ==> const char&
-// char& ==> const char&
-// const char& ==> const char&
-//
-// The argument T must depend on some template parameters.
-#define GTEST_REFERENCE_TO_CONST_(T) \
- GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
-
-// ImplicitlyConvertible<From, To>::value is a compile-time bool
-// constant that's true iff type From can be implicitly converted to
-// type To.
-template <typename From, typename To>
-class ImplicitlyConvertible {
- private:
- // We need the following helper functions only for their types.
- // They have no implementations.
-
- // MakeFrom() is an expression whose type is From. We cannot simply
- // use From(), as the type From may not have a public default
- // constructor.
- static From MakeFrom();
-
- // These two functions are overloaded. Given an expression
- // Helper(x), the compiler will pick the first version if x can be
- // implicitly converted to type To; otherwise it will pick the
- // second version.
- //
- // The first version returns a value of size 1, and the second
- // version returns a value of size 2. Therefore, by checking the
- // size of Helper(x), which can be done at compile time, we can tell
- // which version of Helper() is used, and hence whether x can be
- // implicitly converted to type To.
- static char Helper(To);
- static char (&Helper(...))[2]; // NOLINT
-
- // We have to put the 'public' section after the 'private' section,
- // or MSVC refuses to compile the code.
- public:
- // MSVC warns about implicitly converting from double to int for
- // possible loss of data, so we need to temporarily disable the
- // warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4244) // Temporarily disables warning 4244.
-
- static const bool value =
- sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-# pragma warning(pop) // Restores the warning state.
-#elif defined(__BORLANDC__)
- // C++Builder cannot use member overload resolution during template
- // instantiation. The simplest workaround is to use its C++0x type traits
- // functions (C++Builder 2009 and above only).
- static const bool value = __is_convertible(From, To);
-#else
- static const bool value =
- sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-#endif // _MSV_VER
-};
-template <typename From, typename To>
-const bool ImplicitlyConvertible<From, To>::value;
-
-// IsAProtocolMessage<T>::value is a compile-time bool constant that's
-// true iff T is type ProtocolMessage, proto2::Message, or a subclass
-// of those.
-template <typename T>
-struct IsAProtocolMessage
- : public bool_constant<
- ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
- ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
-};
-
-// When the compiler sees expression IsContainerTest<C>(0), if C is an
-// STL-style container class, the first overload of IsContainerTest
-// will be viable (since both C::iterator* and C::const_iterator* are
-// valid types and NULL can be implicitly converted to them). It will
-// be picked over the second overload as 'int' is a perfect match for
-// the type of argument 0. If C::iterator or C::const_iterator is not
-// a valid type, the first overload is not viable, and the second
-// overload will be picked. Therefore, we can determine whether C is
-// a container class by checking the type of IsContainerTest<C>(0).
-// The value of the expression is insignificant.
-//
-// Note that we look for both C::iterator and C::const_iterator. The
-// reason is that C++ injects the name of a class as a member of the
-// class itself (e.g. you can refer to class iterator as either
-// 'iterator' or 'iterator::iterator'). If we look for C::iterator
-// only, for example, we would mistakenly think that a class named
-// iterator is an STL container.
-//
-// Also note that the simpler approach of overloading
-// IsContainerTest(typename C::const_iterator*) and
-// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
-typedef int IsContainer;
-template <class C>
-IsContainer IsContainerTest(int /* dummy */,
- typename C::iterator* /* it */ = NULL,
- typename C::const_iterator* /* const_it */ = NULL) {
- return 0;
-}
-
-typedef char IsNotContainer;
-template <class C>
-IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
-
-// EnableIf<condition>::type is void when 'Cond' is true, and
-// undefined when 'Cond' is false. To use SFINAE to make a function
-// overload only apply when a particular expression is true, add
-// "typename EnableIf<expression>::type* = 0" as the last parameter.
-template<bool> struct EnableIf;
-template<> struct EnableIf<true> { typedef void type; }; // NOLINT
-
-// Utilities for native arrays.
-
-// ArrayEq() compares two k-dimensional native arrays using the
-// elements' operator==, where k can be any integer >= 0. When k is
-// 0, ArrayEq() degenerates into comparing a single pair of values.
-
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
- return internal::ArrayEq(lhs, N, rhs);
-}
-
-// This helper reduces code bloat. If we instead put its logic inside
-// the previous ArrayEq() function, arrays with different sizes would
-// lead to different copies of the template code.
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
- for (size_t i = 0; i != size; i++) {
- if (!internal::ArrayEq(lhs[i], rhs[i]))
- return false;
- }
- return true;
-}
-
-// Finds the first element in the iterator range [begin, end) that
-// equals elem. Element may be a native array type itself.
-template <typename Iter, typename Element>
-Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
- for (Iter it = begin; it != end; ++it) {
- if (internal::ArrayEq(*it, elem))
- return it;
- }
- return end;
-}
-
-// CopyArray() copies a k-dimensional native array using the elements'
-// operator=, where k can be any integer >= 0. When k is 0,
-// CopyArray() degenerates into copying a single value.
-
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline void CopyArray(const T& from, U* to) { *to = from; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline void CopyArray(const T(&from)[N], U(*to)[N]) {
- internal::CopyArray(from, N, *to);
-}
-
-// This helper reduces code bloat. If we instead put its logic inside
-// the previous CopyArray() function, arrays with different sizes
-// would lead to different copies of the template code.
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to) {
- for (size_t i = 0; i != size; i++) {
- internal::CopyArray(from[i], to + i);
- }
-}
-
-// The relation between an NativeArray object (see below) and the
-// native array it represents.
-enum RelationToSource {
- kReference, // The NativeArray references the native array.
- kCopy // The NativeArray makes a copy of the native array and
- // owns the copy.
-};
-
-// Adapts a native array to a read-only STL-style container. Instead
-// of the complete STL container concept, this adaptor only implements
-// members useful for Google Mock's container matchers. New members
-// should be added as needed. To simplify the implementation, we only
-// support Element being a raw type (i.e. having no top-level const or
-// reference modifier). It's the client's responsibility to satisfy
-// this requirement. Element can be an array type itself (hence
-// multi-dimensional arrays are supported).
-template <typename Element>
-class NativeArray {
- public:
- // STL-style container typedefs.
- typedef Element value_type;
- typedef Element* iterator;
- typedef const Element* const_iterator;
-
- // Constructs from a native array.
- NativeArray(const Element* array, size_t count, RelationToSource relation) {
- Init(array, count, relation);
- }
-
- // Copy constructor.
- NativeArray(const NativeArray& rhs) {
- Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
- }
-
- ~NativeArray() {
- // Ensures that the user doesn't instantiate NativeArray with a
- // const or reference type.
- static_cast<void>(StaticAssertTypeEqHelper<Element,
- GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
- if (relation_to_source_ == kCopy)
- delete[] array_;
- }
-
- // STL-style container methods.
- size_t size() const { return size_; }
- const_iterator begin() const { return array_; }
- const_iterator end() const { return array_ + size_; }
- bool operator==(const NativeArray& rhs) const {
- return size() == rhs.size() &&
- ArrayEq(begin(), size(), rhs.begin());
- }
-
- private:
- // Initializes this object; makes a copy of the input array if
- // 'relation' is kCopy.
- void Init(const Element* array, size_t a_size, RelationToSource relation) {
- if (relation == kReference) {
- array_ = array;
- } else {
- Element* const copy = new Element[a_size];
- CopyArray(array, a_size, copy);
- array_ = copy;
- }
- size_ = a_size;
- relation_to_source_ = relation;
- }
-
- const Element* array_;
- size_t size_;
- RelationToSource relation_to_source_;
-
- GTEST_DISALLOW_ASSIGN_(NativeArray);
-};
-
-} // namespace internal
-} // namespace testing
-
-#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
- ::testing::internal::AssertHelper(result_type, file, line, message) \
- = ::testing::Message()
-
-#define GTEST_MESSAGE_(message, result_type) \
- GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
-
-#define GTEST_FATAL_FAILURE_(message) \
- return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
-
-#define GTEST_NONFATAL_FAILURE_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
-
-#define GTEST_SUCCESS_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
-
-// Suppresses MSVC warnings 4072 (unreachable code) for the code following
-// statement if it returns or throws (or doesn't return or throw in some
-// situations).
-#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
- if (::testing::internal::AlwaysTrue()) { statement; }
-
-#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::ConstCharPtr gtest_msg = "") { \
- bool gtest_caught_expected = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (expected_exception const&) { \
- gtest_caught_expected = true; \
- } \
- catch (...) { \
- gtest_msg.value = \
- "Expected: " #statement " throws an exception of type " \
- #expected_exception ".\n Actual: it throws a different type."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- if (!gtest_caught_expected) { \
- gtest_msg.value = \
- "Expected: " #statement " throws an exception of type " \
- #expected_exception ".\n Actual: it throws nothing."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
- fail(gtest_msg.value)
-
-#define GTEST_TEST_NO_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (...) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
- fail("Expected: " #statement " doesn't throw an exception.\n" \
- " Actual: it throws.")
-
-#define GTEST_TEST_ANY_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- bool gtest_caught_any = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (...) { \
- gtest_caught_any = true; \
- } \
- if (!gtest_caught_any) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
- fail("Expected: " #statement " throws an exception.\n" \
- " Actual: it doesn't.")
-
-
-// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
-// either a boolean expression or an AssertionResult. text is a textual
-// represenation of expression as it was passed into the EXPECT_TRUE.
-#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar_ = \
- ::testing::AssertionResult(expression)) \
- ; \
- else \
- fail(::testing::internal::GetBoolAssertionFailureMessage(\
- gtest_ar_, text, #actual, #expected).c_str())
-
-#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
- fail("Expected: " #statement " doesn't generate new fatal " \
- "failures in the current thread.\n" \
- " Actual: it does.")
-
-// Expands to the name of the class that implements the given test.
-#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
- test_case_name##_##test_name##_Test
-
-// Helper macro for defining tests.
-#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
-class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
- public:\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
- private:\
- virtual void TestBody();\
- static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
-};\
-\
-::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
- ::test_info_ =\
- ::testing::internal::MakeAndRegisterTestInfo(\
- #test_case_name, #test_name, NULL, NULL, \
- (parent_id), \
- parent_class::SetUpTestCase, \
- parent_class::TearDownTestCase, \
- new ::testing::internal::TestFactoryImpl<\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
-void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+++ /dev/null
-// Copyright 2003 Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: Dan Egnor (egnor@google.com)
-//
-// A "smart" pointer type with reference tracking. Every pointer to a
-// particular object is kept on a circular linked list. When the last pointer
-// to an object is destroyed or reassigned, the object is deleted.
-//
-// Used properly, this deletes the object when the last reference goes away.
-// There are several caveats:
-// - Like all reference counting schemes, cycles lead to leaks.
-// - Each smart pointer is actually two pointers (8 bytes instead of 4).
-// - Every time a pointer is assigned, the entire list of pointers to that
-// object is traversed. This class is therefore NOT SUITABLE when there
-// will often be more than two or three pointers to a particular object.
-// - References are only tracked as long as linked_ptr<> objects are copied.
-// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
-// will happen (double deletion).
-//
-// A good use of this class is storing object references in STL containers.
-// You can safely put linked_ptr<> in a vector<>.
-// Other uses may not be as good.
-//
-// Note: If you use an incomplete type with linked_ptr<>, the class
-// *containing* linked_ptr<> must have a constructor and destructor (even
-// if they do nothing!).
-//
-// Bill Gibbons suggested we use something like this.
-//
-// Thread Safety:
-// Unlike other linked_ptr implementations, in this implementation
-// a linked_ptr object is thread-safe in the sense that:
-// - it's safe to copy linked_ptr objects concurrently,
-// - it's safe to copy *from* a linked_ptr and read its underlying
-// raw pointer (e.g. via get()) concurrently, and
-// - it's safe to write to two linked_ptrs that point to the same
-// shared object concurrently.
-// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
-// confusion with normal linked_ptr.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-
-#include <stdlib.h>
-#include <assert.h>
-
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-namespace internal {
-
-// Protects copying of all linked_ptr objects.
-GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// This is used internally by all instances of linked_ptr<>. It needs to be
-// a non-template class because different types of linked_ptr<> can refer to
-// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
-// So, it needs to be possible for different types of linked_ptr to participate
-// in the same circular linked list, so we need a single class type here.
-//
-// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
-class linked_ptr_internal {
- public:
- // Create a new circle that includes only this instance.
- void join_new() {
- next_ = this;
- }
-
- // Many linked_ptr operations may change p.link_ for some linked_ptr
- // variable p in the same circle as this object. Therefore we need
- // to prevent two such operations from occurring concurrently.
- //
- // Note that different types of linked_ptr objects can coexist in a
- // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
- // linked_ptr<Derived2>). Therefore we must use a single mutex to
- // protect all linked_ptr objects. This can create serious
- // contention in production code, but is acceptable in a testing
- // framework.
-
- // Join an existing circle.
- // L < g_linked_ptr_mutex
- void join(linked_ptr_internal const* ptr) {
- MutexLock lock(&g_linked_ptr_mutex);
-
- linked_ptr_internal const* p = ptr;
- while (p->next_ != ptr) p = p->next_;
- p->next_ = this;
- next_ = ptr;
- }
-
- // Leave whatever circle we're part of. Returns true if we were the
- // last member of the circle. Once this is done, you can join() another.
- // L < g_linked_ptr_mutex
- bool depart() {
- MutexLock lock(&g_linked_ptr_mutex);
-
- if (next_ == this) return true;
- linked_ptr_internal const* p = next_;
- while (p->next_ != this) p = p->next_;
- p->next_ = next_;
- return false;
- }
-
- private:
- mutable linked_ptr_internal const* next_;
-};
-
-template <typename T>
-class linked_ptr {
- public:
- typedef T element_type;
-
- // Take over ownership of a raw pointer. This should happen as soon as
- // possible after the object is created.
- explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
- ~linked_ptr() { depart(); }
-
- // Copy an existing linked_ptr<>, adding ourselves to the list of references.
- template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
- linked_ptr(linked_ptr const& ptr) { // NOLINT
- assert(&ptr != this);
- copy(&ptr);
- }
-
- // Assignment releases the old value and acquires the new.
- template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
- depart();
- copy(&ptr);
- return *this;
- }
-
- linked_ptr& operator=(linked_ptr const& ptr) {
- if (&ptr != this) {
- depart();
- copy(&ptr);
- }
- return *this;
- }
-
- // Smart pointer members.
- void reset(T* ptr = NULL) {
- depart();
- capture(ptr);
- }
- T* get() const { return value_; }
- T* operator->() const { return value_; }
- T& operator*() const { return *value_; }
-
- bool operator==(T* p) const { return value_ == p; }
- bool operator!=(T* p) const { return value_ != p; }
- template <typename U>
- bool operator==(linked_ptr<U> const& ptr) const {
- return value_ == ptr.get();
- }
- template <typename U>
- bool operator!=(linked_ptr<U> const& ptr) const {
- return value_ != ptr.get();
- }
-
- private:
- template <typename U>
- friend class linked_ptr;
-
- T* value_;
- linked_ptr_internal link_;
-
- void depart() {
- if (link_.depart()) delete value_;
- }
-
- void capture(T* ptr) {
- value_ = ptr;
- link_.join_new();
- }
-
- template <typename U> void copy(linked_ptr<U> const* ptr) {
- value_ = ptr->get();
- if (value_)
- link_.join(&ptr->link_);
- else
- link_.join_new();
- }
-};
-
-template<typename T> inline
-bool operator==(T* ptr, const linked_ptr<T>& x) {
- return ptr == x.get();
-}
-
-template<typename T> inline
-bool operator!=(T* ptr, const linked_ptr<T>& x) {
- return ptr != x.get();
-}
-
-// A function to convert T* into linked_ptr<T>
-// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
-// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
-template <typename T>
-linked_ptr<T> make_linked_ptr(T* ptr) {
- return linked_ptr<T>(ptr);
-}
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+++ /dev/null
-// This file was GENERATED by command:
-// pump.py gtest-param-util-generated.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl@google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-// Currently Google Test supports at most 50 arguments in Values,
-// and at most 10 arguments in Combine. Please contact
-// googletestframework@googlegroups.com if you need more.
-// Please note that the number of arguments to Combine is limited
-// by the maximum arity of the implementation of tr1::tuple which is
-// currently set at 10.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Forward declarations of ValuesIn(), which is implemented in
-// include/gtest/gtest-param-test.h.
-template <typename ForwardIterator>
-internal::ParamGenerator<
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end);
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container);
-
-namespace internal {
-
-// Used in the Values() function to provide polymorphic capabilities.
-template <typename T1>
-class ValueArray1 {
- public:
- explicit ValueArray1(T1 v1) : v1_(v1) {}
-
- template <typename T>
- operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray1& other);
-
- const T1 v1_;
-};
-
-template <typename T1, typename T2>
-class ValueArray2 {
- public:
- ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray2& other);
-
- const T1 v1_;
- const T2 v2_;
-};
-
-template <typename T1, typename T2, typename T3>
-class ValueArray3 {
- public:
- ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray3& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-class ValueArray4 {
- public:
- ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray4& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class ValueArray5 {
- public:
- ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray5& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-class ValueArray6 {
- public:
- ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray6& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-class ValueArray7 {
- public:
- ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray7& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-class ValueArray8 {
- public:
- ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray8& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-class ValueArray9 {
- public:
- ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray9& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-class ValueArray10 {
- public:
- ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray10& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-class ValueArray11 {
- public:
- ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray11& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-class ValueArray12 {
- public:
- ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray12& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-class ValueArray13 {
- public:
- ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray13& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-class ValueArray14 {
- public:
- ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray14& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-class ValueArray15 {
- public:
- ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray15& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-class ValueArray16 {
- public:
- ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray16& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-class ValueArray17 {
- public:
- ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray17& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-class ValueArray18 {
- public:
- ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray18& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-class ValueArray19 {
- public:
- ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray19& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-class ValueArray20 {
- public:
- ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray20& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-class ValueArray21 {
- public:
- ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray21& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-class ValueArray22 {
- public:
- ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray22& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-class ValueArray23 {
- public:
- ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
- v23_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray23& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-class ValueArray24 {
- public:
- ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray24& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-class ValueArray25 {
- public:
- ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray25& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-class ValueArray26 {
- public:
- ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray26& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-class ValueArray27 {
- public:
- ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray27& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-class ValueArray28 {
- public:
- ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray28& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-class ValueArray29 {
- public:
- ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray29& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-class ValueArray30 {
- public:
- ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray30& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-class ValueArray31 {
- public:
- ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray31& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-class ValueArray32 {
- public:
- ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray32& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-class ValueArray33 {
- public:
- ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
- T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray33& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-class ValueArray34 {
- public:
- ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray34& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-class ValueArray35 {
- public:
- ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
- v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
- v35_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray35& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-class ValueArray36 {
- public:
- ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray36& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-class ValueArray37 {
- public:
- ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
- v36_(v36), v37_(v37) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray37& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-class ValueArray38 {
- public:
- ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray38& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-class ValueArray39 {
- public:
- ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray39& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-class ValueArray40 {
- public:
- ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
- v40_(v40) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray40& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-class ValueArray41 {
- public:
- ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
- T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray41& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-class ValueArray42 {
- public:
- ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray42& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-class ValueArray43 {
- public:
- ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
- v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
- v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray43& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-class ValueArray44 {
- public:
- ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
- v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
- v43_(v43), v44_(v44) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray44& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-class ValueArray45 {
- public:
- ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
- v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
- v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray45& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-class ValueArray46 {
- public:
- ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray46& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-class ValueArray47 {
- public:
- ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
- v47_(v47) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
- v47_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray47& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-class ValueArray48 {
- public:
- ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
- v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
- v46_(v46), v47_(v47), v48_(v48) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray48& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-class ValueArray49 {
- public:
- ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
- T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_, v49_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray49& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
- const T49 v49_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-class ValueArray50 {
- public:
- ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
- T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_, v49_, v50_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray50& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
- const T49 v49_;
- const T50 v50_;
-};
-
-# if GTEST_HAS_COMBINE
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Generates values from the Cartesian product of values produced
-// by the argument generators.
-//
-template <typename T1, typename T2>
-class CartesianProductGenerator2
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
- public:
- typedef ::std::tr1::tuple<T1, T2> ParamType;
-
- CartesianProductGenerator2(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2)
- : g1_(g1), g2_(g2) {}
- virtual ~CartesianProductGenerator2() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current2_;
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- ParamType current_value_;
- }; // class CartesianProductGenerator2::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator2& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
-}; // class CartesianProductGenerator2
-
-
-template <typename T1, typename T2, typename T3>
-class CartesianProductGenerator3
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
-
- CartesianProductGenerator3(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
- : g1_(g1), g2_(g2), g3_(g3) {}
- virtual ~CartesianProductGenerator3() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current3_;
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- ParamType current_value_;
- }; // class CartesianProductGenerator3::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator3& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
-}; // class CartesianProductGenerator3
-
-
-template <typename T1, typename T2, typename T3, typename T4>
-class CartesianProductGenerator4
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
-
- CartesianProductGenerator4(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
- virtual ~CartesianProductGenerator4() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current4_;
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- ParamType current_value_;
- }; // class CartesianProductGenerator4::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator4& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
-}; // class CartesianProductGenerator4
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class CartesianProductGenerator5
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
-
- CartesianProductGenerator5(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
- virtual ~CartesianProductGenerator5() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current5_;
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- ParamType current_value_;
- }; // class CartesianProductGenerator5::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator5& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
-}; // class CartesianProductGenerator5
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-class CartesianProductGenerator6
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
- T6> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
-
- CartesianProductGenerator6(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
- virtual ~CartesianProductGenerator6() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current6_;
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- ParamType current_value_;
- }; // class CartesianProductGenerator6::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator6& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
-}; // class CartesianProductGenerator6
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-class CartesianProductGenerator7
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
-
- CartesianProductGenerator7(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
- virtual ~CartesianProductGenerator7() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current7_;
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- ParamType current_value_;
- }; // class CartesianProductGenerator7::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator7& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
-}; // class CartesianProductGenerator7
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-class CartesianProductGenerator8
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
-
- CartesianProductGenerator8(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
- g8_(g8) {}
- virtual ~CartesianProductGenerator8() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current8_;
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- ParamType current_value_;
- }; // class CartesianProductGenerator8::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator8& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
-}; // class CartesianProductGenerator8
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-class CartesianProductGenerator9
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8, T9> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
-
- CartesianProductGenerator9(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9) {}
- virtual ~CartesianProductGenerator9() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end(), g9_, g9_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8,
- const ParamGenerator<T9>& g9,
- const typename ParamGenerator<T9>::iterator& current9)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current9_;
- if (current9_ == end9_) {
- current9_ = begin9_;
- ++current8_;
- }
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_ &&
- current9_ == typed_other->current9_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_),
- begin9_(other.begin9_),
- end9_(other.end9_),
- current9_(other.current9_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_,
- *current9_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_ ||
- current9_ == end9_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- const typename ParamGenerator<T9>::iterator begin9_;
- const typename ParamGenerator<T9>::iterator end9_;
- typename ParamGenerator<T9>::iterator current9_;
- ParamType current_value_;
- }; // class CartesianProductGenerator9::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator9& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
- const ParamGenerator<T9> g9_;
-}; // class CartesianProductGenerator9
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-class CartesianProductGenerator10
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8, T9, T10> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
-
- CartesianProductGenerator10(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
- const ParamGenerator<T10>& g10)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9), g10_(g10) {}
- virtual ~CartesianProductGenerator10() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end(), g9_, g9_.end(), g10_, g10_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8,
- const ParamGenerator<T9>& g9,
- const typename ParamGenerator<T9>::iterator& current9,
- const ParamGenerator<T10>& g10,
- const typename ParamGenerator<T10>::iterator& current10)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
- begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current10_;
- if (current10_ == end10_) {
- current10_ = begin10_;
- ++current9_;
- }
- if (current9_ == end9_) {
- current9_ = begin9_;
- ++current8_;
- }
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_ &&
- current9_ == typed_other->current9_ &&
- current10_ == typed_other->current10_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_),
- begin9_(other.begin9_),
- end9_(other.end9_),
- current9_(other.current9_),
- begin10_(other.begin10_),
- end10_(other.end10_),
- current10_(other.current10_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_,
- *current9_, *current10_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_ ||
- current9_ == end9_ ||
- current10_ == end10_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- const typename ParamGenerator<T9>::iterator begin9_;
- const typename ParamGenerator<T9>::iterator end9_;
- typename ParamGenerator<T9>::iterator current9_;
- const typename ParamGenerator<T10>::iterator begin10_;
- const typename ParamGenerator<T10>::iterator end10_;
- typename ParamGenerator<T10>::iterator current10_;
- ParamType current_value_;
- }; // class CartesianProductGenerator10::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator10& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
- const ParamGenerator<T9> g9_;
- const ParamGenerator<T10> g10_;
-}; // class CartesianProductGenerator10
-
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Helper classes providing Combine() with polymorphic features. They allow
-// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
-// convertible to U.
-//
-template <class Generator1, class Generator2>
-class CartesianProductHolder2 {
- public:
-CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
- : g1_(g1), g2_(g2) {}
- template <typename T1, typename T2>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
- new CartesianProductGenerator2<T1, T2>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder2& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
-}; // class CartesianProductHolder2
-
-template <class Generator1, class Generator2, class Generator3>
-class CartesianProductHolder3 {
- public:
-CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
- const Generator3& g3)
- : g1_(g1), g2_(g2), g3_(g3) {}
- template <typename T1, typename T2, typename T3>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
- new CartesianProductGenerator3<T1, T2, T3>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder3& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
-}; // class CartesianProductHolder3
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4>
-class CartesianProductHolder4 {
- public:
-CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
- template <typename T1, typename T2, typename T3, typename T4>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
- new CartesianProductGenerator4<T1, T2, T3, T4>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder4& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
-}; // class CartesianProductHolder4
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5>
-class CartesianProductHolder5 {
- public:
-CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
- new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder5& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
-}; // class CartesianProductHolder5
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6>
-class CartesianProductHolder6 {
- public:
-CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
- new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder6& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
-}; // class CartesianProductHolder6
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7>
-class CartesianProductHolder7 {
- public:
-CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
- new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder7& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
-}; // class CartesianProductHolder7
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8>
-class CartesianProductHolder8 {
- public:
-CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
- g8_(g8) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
- T8> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
- new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder8& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
-}; // class CartesianProductHolder8
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8, class Generator9>
-class CartesianProductHolder9 {
- public:
-CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8,
- const Generator9& g9)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9> >(
- new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_),
- static_cast<ParamGenerator<T9> >(g9_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder9& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
- const Generator9 g9_;
-}; // class CartesianProductHolder9
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8, class Generator9, class Generator10>
-class CartesianProductHolder10 {
- public:
-CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8,
- const Generator9& g9, const Generator10& g10)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9), g10_(g10) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9, T10> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9, T10> >(
- new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
- T10>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_),
- static_cast<ParamGenerator<T9> >(g9_),
- static_cast<ParamGenerator<T10> >(g10_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder10& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
- const Generator9 g9_;
- const Generator10 g10_;
-}; // class CartesianProductHolder10
-
-# endif // GTEST_HAS_COMBINE
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+++ /dev/null
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl@google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-
-#include <iterator>
-#include <utility>
-#include <vector>
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-linked_ptr.h"
-#include "gtest/internal/gtest-port.h"
-#include "gtest/gtest-printers.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-namespace internal {
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Outputs a message explaining invalid registration of different
-// fixture class for the same test case. This may happen when
-// TEST_P macro is used to define two tests with the same name
-// but in different namespaces.
-GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
- const char* file, int line);
-
-template <typename> class ParamGeneratorInterface;
-template <typename> class ParamGenerator;
-
-// Interface for iterating over elements provided by an implementation
-// of ParamGeneratorInterface<T>.
-template <typename T>
-class ParamIteratorInterface {
- public:
- virtual ~ParamIteratorInterface() {}
- // A pointer to the base generator instance.
- // Used only for the purposes of iterator comparison
- // to make sure that two iterators belong to the same generator.
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
- // Advances iterator to point to the next element
- // provided by the generator. The caller is responsible
- // for not calling Advance() on an iterator equal to
- // BaseGenerator()->End().
- virtual void Advance() = 0;
- // Clones the iterator object. Used for implementing copy semantics
- // of ParamIterator<T>.
- virtual ParamIteratorInterface* Clone() const = 0;
- // Dereferences the current iterator and provides (read-only) access
- // to the pointed value. It is the caller's responsibility not to call
- // Current() on an iterator equal to BaseGenerator()->End().
- // Used for implementing ParamGenerator<T>::operator*().
- virtual const T* Current() const = 0;
- // Determines whether the given iterator and other point to the same
- // element in the sequence generated by the generator.
- // Used for implementing ParamGenerator<T>::operator==().
- virtual bool Equals(const ParamIteratorInterface& other) const = 0;
-};
-
-// Class iterating over elements provided by an implementation of
-// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
-// and implements the const forward iterator concept.
-template <typename T>
-class ParamIterator {
- public:
- typedef T value_type;
- typedef const T& reference;
- typedef ptrdiff_t difference_type;
-
- // ParamIterator assumes ownership of the impl_ pointer.
- ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
- ParamIterator& operator=(const ParamIterator& other) {
- if (this != &other)
- impl_.reset(other.impl_->Clone());
- return *this;
- }
-
- const T& operator*() const { return *impl_->Current(); }
- const T* operator->() const { return impl_->Current(); }
- // Prefix version of operator++.
- ParamIterator& operator++() {
- impl_->Advance();
- return *this;
- }
- // Postfix version of operator++.
- ParamIterator operator++(int /*unused*/) {
- ParamIteratorInterface<T>* clone = impl_->Clone();
- impl_->Advance();
- return ParamIterator(clone);
- }
- bool operator==(const ParamIterator& other) const {
- return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
- }
- bool operator!=(const ParamIterator& other) const {
- return !(*this == other);
- }
-
- private:
- friend class ParamGenerator<T>;
- explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
- scoped_ptr<ParamIteratorInterface<T> > impl_;
-};
-
-// ParamGeneratorInterface<T> is the binary interface to access generators
-// defined in other translation units.
-template <typename T>
-class ParamGeneratorInterface {
- public:
- typedef T ParamType;
-
- virtual ~ParamGeneratorInterface() {}
-
- // Generator interface definition
- virtual ParamIteratorInterface<T>* Begin() const = 0;
- virtual ParamIteratorInterface<T>* End() const = 0;
-};
-
-// Wraps ParamGeneratorInterface<T> and provides general generator syntax
-// compatible with the STL Container concept.
-// This class implements copy initialization semantics and the contained
-// ParamGeneratorInterface<T> instance is shared among all copies
-// of the original object. This is possible because that instance is immutable.
-template<typename T>
-class ParamGenerator {
- public:
- typedef ParamIterator<T> iterator;
-
- explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
- ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
-
- ParamGenerator& operator=(const ParamGenerator& other) {
- impl_ = other.impl_;
- return *this;
- }
-
- iterator begin() const { return iterator(impl_->Begin()); }
- iterator end() const { return iterator(impl_->End()); }
-
- private:
- linked_ptr<const ParamGeneratorInterface<T> > impl_;
-};
-
-// Generates values from a range of two comparable values. Can be used to
-// generate sequences of user-defined types that implement operator+() and
-// operator<().
-// This class is used in the Range() function.
-template <typename T, typename IncrementT>
-class RangeGenerator : public ParamGeneratorInterface<T> {
- public:
- RangeGenerator(T begin, T end, IncrementT step)
- : begin_(begin), end_(end),
- step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
- virtual ~RangeGenerator() {}
-
- virtual ParamIteratorInterface<T>* Begin() const {
- return new Iterator(this, begin_, 0, step_);
- }
- virtual ParamIteratorInterface<T>* End() const {
- return new Iterator(this, end_, end_index_, step_);
- }
-
- private:
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
- IncrementT step)
- : base_(base), value_(value), index_(index), step_(step) {}
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
- return base_;
- }
- virtual void Advance() {
- value_ = value_ + step_;
- index_++;
- }
- virtual ParamIteratorInterface<T>* Clone() const {
- return new Iterator(*this);
- }
- virtual const T* Current() const { return &value_; }
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const int other_index =
- CheckedDowncastToActualType<const Iterator>(&other)->index_;
- return index_ == other_index;
- }
-
- private:
- Iterator(const Iterator& other)
- : ParamIteratorInterface<T>(),
- base_(other.base_), value_(other.value_), index_(other.index_),
- step_(other.step_) {}
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<T>* const base_;
- T value_;
- int index_;
- const IncrementT step_;
- }; // class RangeGenerator::Iterator
-
- static int CalculateEndIndex(const T& begin,
- const T& end,
- const IncrementT& step) {
- int end_index = 0;
- for (T i = begin; i < end; i = i + step)
- end_index++;
- return end_index;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const RangeGenerator& other);
-
- const T begin_;
- const T end_;
- const IncrementT step_;
- // The index for the end() iterator. All the elements in the generated
- // sequence are indexed (0-based) to aid iterator comparison.
- const int end_index_;
-}; // class RangeGenerator
-
-
-// Generates values from a pair of STL-style iterators. Used in the
-// ValuesIn() function. The elements are copied from the source range
-// since the source can be located on the stack, and the generator
-// is likely to persist beyond that stack frame.
-template <typename T>
-class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
- public:
- template <typename ForwardIterator>
- ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
- : container_(begin, end) {}
- virtual ~ValuesInIteratorRangeGenerator() {}
-
- virtual ParamIteratorInterface<T>* Begin() const {
- return new Iterator(this, container_.begin());
- }
- virtual ParamIteratorInterface<T>* End() const {
- return new Iterator(this, container_.end());
- }
-
- private:
- typedef typename ::std::vector<T> ContainerType;
-
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base,
- typename ContainerType::const_iterator iterator)
- : base_(base), iterator_(iterator) {}
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
- return base_;
- }
- virtual void Advance() {
- ++iterator_;
- value_.reset();
- }
- virtual ParamIteratorInterface<T>* Clone() const {
- return new Iterator(*this);
- }
- // We need to use cached value referenced by iterator_ because *iterator_
- // can return a temporary object (and of type other then T), so just
- // having "return &*iterator_;" doesn't work.
- // value_ is updated here and not in Advance() because Advance()
- // can advance iterator_ beyond the end of the range, and we cannot
- // detect that fact. The client code, on the other hand, is
- // responsible for not calling Current() on an out-of-range iterator.
- virtual const T* Current() const {
- if (value_.get() == NULL)
- value_.reset(new T(*iterator_));
- return value_.get();
- }
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- return iterator_ ==
- CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
- }
-
- private:
- Iterator(const Iterator& other)
- // The explicit constructor call suppresses a false warning
- // emitted by gcc when supplied with the -Wextra option.
- : ParamIteratorInterface<T>(),
- base_(other.base_),
- iterator_(other.iterator_) {}
-
- const ParamGeneratorInterface<T>* const base_;
- typename ContainerType::const_iterator iterator_;
- // A cached value of *iterator_. We keep it here to allow access by
- // pointer in the wrapping iterator's operator->().
- // value_ needs to be mutable to be accessed in Current().
- // Use of scoped_ptr helps manage cached value's lifetime,
- // which is bound by the lifespan of the iterator itself.
- mutable scoped_ptr<const T> value_;
- }; // class ValuesInIteratorRangeGenerator::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const ValuesInIteratorRangeGenerator& other);
-
- const ContainerType container_;
-}; // class ValuesInIteratorRangeGenerator
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Stores a parameter value and later creates tests parameterized with that
-// value.
-template <class TestClass>
-class ParameterizedTestFactory : public TestFactoryBase {
- public:
- typedef typename TestClass::ParamType ParamType;
- explicit ParameterizedTestFactory(ParamType parameter) :
- parameter_(parameter) {}
- virtual Test* CreateTest() {
- TestClass::SetParam(¶meter_);
- return new TestClass();
- }
-
- private:
- const ParamType parameter_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactoryBase is a base class for meta-factories that create
-// test factories for passing into MakeAndRegisterTestInfo function.
-template <class ParamType>
-class TestMetaFactoryBase {
- public:
- virtual ~TestMetaFactoryBase() {}
-
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactory creates test factories for passing into
-// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
-// ownership of test factory pointer, same factory object cannot be passed
-// into that method twice. But ParameterizedTestCaseInfo is going to call
-// it for each Test/Parameter value combination. Thus it needs meta factory
-// creator class.
-template <class TestCase>
-class TestMetaFactory
- : public TestMetaFactoryBase<typename TestCase::ParamType> {
- public:
- typedef typename TestCase::ParamType ParamType;
-
- TestMetaFactory() {}
-
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
- return new ParameterizedTestFactory<TestCase>(parameter);
- }
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfoBase is a generic interface
-// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
-// accumulates test information provided by TEST_P macro invocations
-// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
-// and uses that information to register all resulting test instances
-// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
-// a collection of pointers to the ParameterizedTestCaseInfo objects
-// and calls RegisterTests() on each of them when asked.
-class ParameterizedTestCaseInfoBase {
- public:
- virtual ~ParameterizedTestCaseInfoBase() {}
-
- // Base part of test case name for display purposes.
- virtual const string& GetTestCaseName() const = 0;
- // Test case id to verify identity.
- virtual TypeId GetTestCaseTypeId() const = 0;
- // UnitTest class invokes this method to register tests in this
- // test case right before running them in RUN_ALL_TESTS macro.
- // This method should not be called more then once on any single
- // instance of a ParameterizedTestCaseInfoBase derived class.
- virtual void RegisterTests() = 0;
-
- protected:
- ParameterizedTestCaseInfoBase() {}
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
-// macro invocations for a particular test case and generators
-// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
-// test case. It registers tests with all values generated by all
-// generators when asked.
-template <class TestCase>
-class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
- public:
- // ParamType and GeneratorCreationFunc are private types but are required
- // for declarations of public methods AddTestPattern() and
- // AddTestCaseInstantiation().
- typedef typename TestCase::ParamType ParamType;
- // A function that returns an instance of appropriate generator type.
- typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
-
- explicit ParameterizedTestCaseInfo(const char* name)
- : test_case_name_(name) {}
-
- // Test case base name for display purposes.
- virtual const string& GetTestCaseName() const { return test_case_name_; }
- // Test case id to verify identity.
- virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
- // TEST_P macro uses AddTestPattern() to record information
- // about a single test in a LocalTestInfo structure.
- // test_case_name is the base name of the test case (without invocation
- // prefix). test_base_name is the name of an individual test without
- // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
- // test case base name and DoBar is test base name.
- void AddTestPattern(const char* test_case_name,
- const char* test_base_name,
- TestMetaFactoryBase<ParamType>* meta_factory) {
- tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
- test_base_name,
- meta_factory)));
- }
- // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
- // about a generator.
- int AddTestCaseInstantiation(const string& instantiation_name,
- GeneratorCreationFunc* func,
- const char* /* file */,
- int /* line */) {
- instantiations_.push_back(::std::make_pair(instantiation_name, func));
- return 0; // Return value used only to run this method in namespace scope.
- }
- // UnitTest class invokes this method to register tests in this test case
- // test cases right before running tests in RUN_ALL_TESTS macro.
- // This method should not be called more then once on any single
- // instance of a ParameterizedTestCaseInfoBase derived class.
- // UnitTest has a guard to prevent from calling this method more then once.
- virtual void RegisterTests() {
- for (typename TestInfoContainer::iterator test_it = tests_.begin();
- test_it != tests_.end(); ++test_it) {
- linked_ptr<TestInfo> test_info = *test_it;
- for (typename InstantiationContainer::iterator gen_it =
- instantiations_.begin(); gen_it != instantiations_.end();
- ++gen_it) {
- const string& instantiation_name = gen_it->first;
- ParamGenerator<ParamType> generator((*gen_it->second)());
-
- Message test_case_name_stream;
- if ( !instantiation_name.empty() )
- test_case_name_stream << instantiation_name << "/";
- test_case_name_stream << test_info->test_case_base_name;
-
- int i = 0;
- for (typename ParamGenerator<ParamType>::iterator param_it =
- generator.begin();
- param_it != generator.end(); ++param_it, ++i) {
- Message test_name_stream;
- test_name_stream << test_info->test_base_name << "/" << i;
- MakeAndRegisterTestInfo(
- test_case_name_stream.GetString().c_str(),
- test_name_stream.GetString().c_str(),
- NULL, // No type parameter.
- PrintToString(*param_it).c_str(),
- GetTestCaseTypeId(),
- TestCase::SetUpTestCase,
- TestCase::TearDownTestCase,
- test_info->test_meta_factory->CreateTestFactory(*param_it));
- } // for param_it
- } // for gen_it
- } // for test_it
- } // RegisterTests
-
- private:
- // LocalTestInfo structure keeps information about a single test registered
- // with TEST_P macro.
- struct TestInfo {
- TestInfo(const char* a_test_case_base_name,
- const char* a_test_base_name,
- TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
- test_case_base_name(a_test_case_base_name),
- test_base_name(a_test_base_name),
- test_meta_factory(a_test_meta_factory) {}
-
- const string test_case_base_name;
- const string test_base_name;
- const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
- };
- typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
- // Keeps pairs of <Instantiation name, Sequence generator creation function>
- // received from INSTANTIATE_TEST_CASE_P macros.
- typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
- InstantiationContainer;
-
- const string test_case_name_;
- TestInfoContainer tests_;
- InstantiationContainer instantiations_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
-}; // class ParameterizedTestCaseInfo
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
-// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
-// macros use it to locate their corresponding ParameterizedTestCaseInfo
-// descriptors.
-class ParameterizedTestCaseRegistry {
- public:
- ParameterizedTestCaseRegistry() {}
- ~ParameterizedTestCaseRegistry() {
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- delete *it;
- }
- }
-
- // Looks up or creates and returns a structure containing information about
- // tests and instantiations of a particular test case.
- template <class TestCase>
- ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
- const char* test_case_name,
- const char* file,
- int line) {
- ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- if ((*it)->GetTestCaseName() == test_case_name) {
- if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
- // Complain about incorrect usage of Google Test facilities
- // and terminate the program since we cannot guaranty correct
- // test case setup and tear-down in this case.
- ReportInvalidTestCaseType(test_case_name, file, line);
- posix::Abort();
- } else {
- // At this point we are sure that the object we found is of the same
- // type we are looking for, so we downcast it to that type
- // without further checks.
- typed_test_info = CheckedDowncastToActualType<
- ParameterizedTestCaseInfo<TestCase> >(*it);
- }
- break;
- }
- }
- if (typed_test_info == NULL) {
- typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
- test_case_infos_.push_back(typed_test_info);
- }
- return typed_test_info;
- }
- void RegisterTests() {
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- (*it)->RegisterTests();
- }
- }
-
- private:
- typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
-
- TestCaseInfoContainer test_case_infos_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
-};
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan@google.com (Zhanyong Wan)
-//
-// Low-level types and utilities for porting Google Test to various
-// platforms. They are subject to change without notice. DO NOT USE
-// THEM IN USER CODE.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-
-// The user can define the following macros in the build script to
-// control Google Test's behavior. If the user doesn't define a macro
-// in this list, Google Test will define it.
-//
-// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
-// is/isn't available.
-// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
-// are enabled.
-// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
-// is/isn't available (some systems define
-// ::string, which is different to std::string).
-// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
-// is/isn't available (some systems define
-// ::wstring, which is different to std::wstring).
-// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
-// expressions are/aren't available.
-// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
-// is/isn't available.
-// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
-// enabled.
-// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
-// std::wstring does/doesn't work (Google Test can
-// be used where std::wstring is unavailable).
-// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
-// is/isn't available.
-// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
-// compiler supports Microsoft's "Structured
-// Exception Handling".
-// GTEST_HAS_STREAM_REDIRECTION
-// - Define it to 1/0 to indicate whether the
-// platform supports I/O stream redirection using
-// dup() and dup2().
-// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
-// Test's own tr1 tuple implementation should be
-// used. Unused when the user sets
-// GTEST_HAS_TR1_TUPLE to 0.
-// GTEST_LINKED_AS_SHARED_LIBRARY
-// - Define to 1 when compiling tests that use
-// Google Test as a shared library (known as
-// DLL on Windows).
-// GTEST_CREATE_SHARED_LIBRARY
-// - Define to 1 when compiling Google Test itself
-// as a shared library.
-
-// This header defines the following utilities:
-//
-// Macros indicating the current platform (defined to 1 if compiled on
-// the given platform; otherwise undefined):
-// GTEST_OS_AIX - IBM AIX
-// GTEST_OS_CYGWIN - Cygwin
-// GTEST_OS_HPUX - HP-UX
-// GTEST_OS_LINUX - Linux
-// GTEST_OS_LINUX_ANDROID - Google Android
-// GTEST_OS_MAC - Mac OS X
-// GTEST_OS_NACL - Google Native Client (NaCl)
-// GTEST_OS_SOLARIS - Sun Solaris
-// GTEST_OS_SYMBIAN - Symbian
-// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
-// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
-// GTEST_OS_WINDOWS_MINGW - MinGW
-// GTEST_OS_WINDOWS_MOBILE - Windows Mobile
-// GTEST_OS_ZOS - z/OS
-//
-// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
-// most stable support. Since core members of the Google Test project
-// don't have access to other platforms, support for them may be less
-// stable. If you notice any problems on your platform, please notify
-// googletestframework@googlegroups.com (patches for fixing them are
-// even more welcome!).
-//
-// Note that it is possible that none of the GTEST_OS_* macros are defined.
-//
-// Macros indicating available Google Test features (defined to 1 if
-// the corresponding feature is supported; otherwise undefined):
-// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
-// tests)
-// GTEST_HAS_DEATH_TEST - death tests
-// GTEST_HAS_PARAM_TEST - value-parameterized tests
-// GTEST_HAS_TYPED_TEST - typed tests
-// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
-// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
-// GTEST_HAS_POSIX_RE (see above) which users can
-// define themselves.
-// GTEST_USES_SIMPLE_RE - our own simple regex is used;
-// the above two are mutually exclusive.
-// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
-//
-// Macros for basic C++ coding:
-// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
-// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
-// variable don't have to be used.
-// GTEST_DISALLOW_ASSIGN_ - disables operator=.
-// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
-// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
-//
-// Synchronization:
-// Mutex, MutexLock, ThreadLocal, GetThreadCount()
-// - synchronization primitives.
-// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
-// synchronization primitives have real implementations
-// and Google Test is thread-safe; or 0 otherwise.
-//
-// Template meta programming:
-// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
-// IteratorTraits - partial implementation of std::iterator_traits, which
-// is not available in libCstd when compiled with Sun C++.
-//
-// Smart pointers:
-// scoped_ptr - as in TR2.
-//
-// Regular expressions:
-// RE - a simple regular expression class using the POSIX
-// Extended Regular Expression syntax on UNIX-like
-// platforms, or a reduced regular exception syntax on
-// other platforms, including Windows.
-//
-// Logging:
-// GTEST_LOG_() - logs messages at the specified severity level.
-// LogToStderr() - directs all log messages to stderr.
-// FlushInfoLog() - flushes informational log messages.
-//
-// Stdout and stderr capturing:
-// CaptureStdout() - starts capturing stdout.
-// GetCapturedStdout() - stops capturing stdout and returns the captured
-// string.
-// CaptureStderr() - starts capturing stderr.
-// GetCapturedStderr() - stops capturing stderr and returns the captured
-// string.
-//
-// Integer types:
-// TypeWithSize - maps an integer to a int type.
-// Int32, UInt32, Int64, UInt64, TimeInMillis
-// - integers of known sizes.
-// BiggestInt - the biggest signed integer type.
-//
-// Command-line utilities:
-// GTEST_FLAG() - references a flag.
-// GTEST_DECLARE_*() - declares a flag.
-// GTEST_DEFINE_*() - defines a flag.
-// GetArgvs() - returns the command line as a vector of strings.
-//
-// Environment variable utilities:
-// GetEnv() - gets the value of an environment variable.
-// BoolFromGTestEnv() - parses a bool environment variable.
-// Int32FromGTestEnv() - parses an Int32 environment variable.
-// StringFromGTestEnv() - parses a string environment variable.
-
-#include <ctype.h> // for isspace, etc
-#include <stddef.h> // for ptrdiff_t
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifndef _WIN32_WCE
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif // !_WIN32_WCE
-
-#include <iostream> // NOLINT
-#include <sstream> // NOLINT
-#include <string> // NOLINT
-
-#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
-#define GTEST_FLAG_PREFIX_ "gtest_"
-#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
-#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
-#define GTEST_NAME_ "Google Test"
-#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
-
-// Determines the version of gcc that is used to compile this.
-#ifdef __GNUC__
-// 40302 means version 4.3.2.
-# define GTEST_GCC_VER_ \
- (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
-#endif // __GNUC__
-
-// Determines the platform on which Google Test is compiled.
-#ifdef __CYGWIN__
-# define GTEST_OS_CYGWIN 1
-#elif defined __SYMBIAN32__
-# define GTEST_OS_SYMBIAN 1
-#elif defined _WIN32
-# define GTEST_OS_WINDOWS 1
-# ifdef _WIN32_WCE
-# define GTEST_OS_WINDOWS_MOBILE 1
-# elif defined(__MINGW__) || defined(__MINGW32__)
-# define GTEST_OS_WINDOWS_MINGW 1
-# else
-# define GTEST_OS_WINDOWS_DESKTOP 1
-# endif // _WIN32_WCE
-#elif defined __APPLE__
-# define GTEST_OS_MAC 1
-#elif defined __linux__
-# define GTEST_OS_LINUX 1
-# ifdef ANDROID
-# define GTEST_OS_LINUX_ANDROID 1
-# endif // ANDROID
-#elif defined __MVS__
-# define GTEST_OS_ZOS 1
-#elif defined(__sun) && defined(__SVR4)
-# define GTEST_OS_SOLARIS 1
-#elif defined(_AIX)
-# define GTEST_OS_AIX 1
-#elif defined(__hpux)
-# define GTEST_OS_HPUX 1
-#elif defined __native_client__
-# define GTEST_OS_NACL 1
-#endif // __CYGWIN__
-
-// Brings in definitions for functions used in the testing::internal::posix
-// namespace (read, write, close, chdir, isatty, stat). We do not currently
-// use them on Windows Mobile.
-#if !GTEST_OS_WINDOWS
-// This assumes that non-Windows OSes provide unistd.h. For OSes where this
-// is not the case, we need to include headers that provide the functions
-// mentioned above.
-# include <unistd.h>
-# if !GTEST_OS_NACL
-// TODO(vladl@google.com): Remove this condition when Native Client SDK adds
-// strings.h (tracked in
-// http://code.google.com/p/nativeclient/issues/detail?id=1175).
-# include <strings.h> // Native Client doesn't provide strings.h.
-# endif
-#elif !GTEST_OS_WINDOWS_MOBILE
-# include <direct.h>
-# include <io.h>
-#endif
-
-// Defines this to true iff Google Test can use POSIX regular expressions.
-#ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
-#endif
-
-#if GTEST_HAS_POSIX_RE
-
-// On some platforms, <regex.h> needs someone to define size_t, and
-// won't compile otherwise. We can #include it here as we already
-// included <stdlib.h>, which is guaranteed to define size_t through
-// <stddef.h>.
-# include <regex.h> // NOLINT
-
-# define GTEST_USES_POSIX_RE 1
-
-#elif GTEST_OS_WINDOWS
-
-// <regex.h> is not available on Windows. Use our own simple regex
-// implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#else
-
-// <regex.h> may not be available on this platform. Use our own
-// simple regex implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#endif // GTEST_HAS_POSIX_RE
-
-#ifndef GTEST_HAS_EXCEPTIONS
-// The user didn't tell us whether exceptions are enabled, so we need
-// to figure it out.
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
-// macro to enable exceptions, so we'll do the same.
-// Assumes that exceptions are enabled by default.
-# ifndef _HAS_EXCEPTIONS
-# define _HAS_EXCEPTIONS 1
-# endif // _HAS_EXCEPTIONS
-# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
-# elif defined(__GNUC__) && __EXCEPTIONS
-// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__SUNPRO_CC)
-// Sun Pro CC supports exceptions. However, there is no compile-time way of
-// detecting whether they are enabled or not. Therefore, we assume that
-// they are enabled unless the user tells us otherwise.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__IBMCPP__) && __EXCEPTIONS
-// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__HP_aCC)
-// Exception handling is in effect by default in HP aCC compiler. It has to
-// be turned of by +noeh compiler option if desired.
-# define GTEST_HAS_EXCEPTIONS 1
-# else
-// For other compilers, we assume exceptions are disabled to be
-// conservative.
-# define GTEST_HAS_EXCEPTIONS 0
-# endif // defined(_MSC_VER) || defined(__BORLANDC__)
-#endif // GTEST_HAS_EXCEPTIONS
-
-#if !defined(GTEST_HAS_STD_STRING)
-// Even though we don't use this macro any longer, we keep it in case
-// some clients still depend on it.
-# define GTEST_HAS_STD_STRING 1
-#elif !GTEST_HAS_STD_STRING
-// The user told us that ::std::string isn't available.
-# error "Google Test cannot be used where ::std::string isn't available."
-#endif // !defined(GTEST_HAS_STD_STRING)
-
-#ifndef GTEST_HAS_GLOBAL_STRING
-// The user didn't tell us whether ::string is available, so we need
-// to figure it out.
-
-# define GTEST_HAS_GLOBAL_STRING 0
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
-#ifndef GTEST_HAS_STD_WSTRING
-// The user didn't tell us whether ::std::wstring is available, so we need
-// to figure it out.
-// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
-// is available.
-
-// Cygwin 1.7 and below doesn't support ::std::wstring.
-// Solaris' libc++ doesn't support it either. Android has
-// no support for it at least as recent as Froyo (2.2).
-# define GTEST_HAS_STD_WSTRING \
- (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
-
-#endif // GTEST_HAS_STD_WSTRING
-
-#ifndef GTEST_HAS_GLOBAL_WSTRING
-// The user didn't tell us whether ::wstring is available, so we need
-// to figure it out.
-# define GTEST_HAS_GLOBAL_WSTRING \
- (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// Determines whether RTTI is available.
-#ifndef GTEST_HAS_RTTI
-// The user didn't tell us whether RTTI is enabled, so we need to
-// figure it out.
-
-# ifdef _MSC_VER
-
-# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif
-
-// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
-
-# ifdef __GXX_RTTI
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif // __GXX_RTTI
-
-// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
-// both the typeid and dynamic_cast features are present.
-# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
-
-# ifdef __RTTI_ALL__
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif
-
-# else
-
-// For all other compilers, we assume RTTI is enabled.
-# define GTEST_HAS_RTTI 1
-
-# endif // _MSC_VER
-
-#endif // GTEST_HAS_RTTI
-
-// It's this header's responsibility to #include <typeinfo> when RTTI
-// is enabled.
-#if GTEST_HAS_RTTI
-# include <typeinfo>
-#endif
-
-// Determines whether Google Test can use the pthreads library.
-#ifndef GTEST_HAS_PTHREAD
-// The user didn't tell us explicitly, so we assume pthreads support is
-// available on Linux and Mac.
-//
-// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
-// to your compiler flags.
-# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
-#endif // GTEST_HAS_PTHREAD
-
-#if GTEST_HAS_PTHREAD
-// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
-// true.
-# include <pthread.h> // NOLINT
-
-// For timespec and nanosleep, used below.
-# include <time.h> // NOLINT
-#endif
-
-// Determines whether Google Test can use tr1/tuple. You can define
-// this macro to 0 to prevent Google Test from using tuple (any
-// feature depending on tuple with be disabled in this mode).
-#ifndef GTEST_HAS_TR1_TUPLE
-// The user didn't tell us not to do it, so we assume it's OK.
-# define GTEST_HAS_TR1_TUPLE 1
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Determines whether Google Test's own tr1 tuple implementation
-// should be used.
-#ifndef GTEST_USE_OWN_TR1_TUPLE
-// The user didn't tell us, so we need to figure it out.
-
-// We use our own TR1 tuple if we aren't sure the user has an
-// implementation of it already. At this time, GCC 4.0.0+ and MSVC
-// 2010 are the only mainstream compilers that come with a TR1 tuple
-// implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by
-// defining __GNUC__ and friends, but cannot compile GCC's tuple
-// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
-// Feature Pack download, which we cannot assume the user has.
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
- || _MSC_VER >= 1600
-# define GTEST_USE_OWN_TR1_TUPLE 0
-# else
-# define GTEST_USE_OWN_TR1_TUPLE 1
-# endif
-
-#endif // GTEST_USE_OWN_TR1_TUPLE
-
-// To avoid conditional compilation everywhere, we make it
-// gtest-port.h's responsibility to #include the header implementing
-// tr1/tuple.
-#if GTEST_HAS_TR1_TUPLE
-
-# if GTEST_USE_OWN_TR1_TUPLE
-# include "gtest/internal/gtest-tuple.h"
-# elif GTEST_OS_SYMBIAN
-
-// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
-// use STLport's tuple implementation, which unfortunately doesn't
-// work as the copy of STLport distributed with Symbian is incomplete.
-// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
-// use its own tuple implementation.
-# ifdef BOOST_HAS_TR1_TUPLE
-# undef BOOST_HAS_TR1_TUPLE
-# endif // BOOST_HAS_TR1_TUPLE
-
-// This prevents <boost/tr1/detail/config.hpp>, which defines
-// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
-# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
-# include <tuple>
-
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
-// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
-// not conform to the TR1 spec, which requires the header to be <tuple>.
-
-# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
-// which is #included by <tr1/tuple>, to not compile when RTTI is
-// disabled. _TR1_FUNCTIONAL is the header guard for
-// <tr1/functional>. Hence the following #define is a hack to prevent
-// <tr1/functional> from being included.
-# define _TR1_FUNCTIONAL 1
-# include <tr1/tuple>
-# undef _TR1_FUNCTIONAL // Allows the user to #include
- // <tr1/functional> if he chooses to.
-# else
-# include <tr1/tuple> // NOLINT
-# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-
-# else
-// If the compiler is not GCC 4.0+, we assume the user is using a
-// spec-conforming TR1 implementation.
-# include <tuple> // NOLINT
-# endif // GTEST_USE_OWN_TR1_TUPLE
-
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Determines whether clone(2) is supported.
-// Usually it will only be available on Linux, excluding
-// Linux on the Itanium architecture.
-// Also see http://linux.die.net/man/2/clone.
-#ifndef GTEST_HAS_CLONE
-// The user didn't tell us, so we need to figure it out.
-
-# if GTEST_OS_LINUX && !defined(__ia64__)
-# define GTEST_HAS_CLONE 1
-# else
-# define GTEST_HAS_CLONE 0
-# endif // GTEST_OS_LINUX && !defined(__ia64__)
-
-#endif // GTEST_HAS_CLONE
-
-// Determines whether to support stream redirection. This is used to test
-// output correctness and to implement death tests.
-#ifndef GTEST_HAS_STREAM_REDIRECTION
-// By default, we assume that stream redirection is supported on all
-// platforms except known mobile ones.
-# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
-# define GTEST_HAS_STREAM_REDIRECTION 0
-# else
-# define GTEST_HAS_STREAM_REDIRECTION 1
-# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-// Determines whether to support death tests.
-// Google Test does not support death tests for VC 7.1 and earlier as
-// abort() in a VC 7.1 application compiled as GUI in debug config
-// pops up a dialog window that cannot be suppressed programmatically.
-#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
- (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
- GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
-# define GTEST_HAS_DEATH_TEST 1
-# include <vector> // NOLINT
-#endif
-
-// We don't support MSVC 7.1 with exceptions disabled now. Therefore
-// all the compilers we care about are adequate for supporting
-// value-parameterized tests.
-#define GTEST_HAS_PARAM_TEST 1
-
-// Determines whether to support type-driven tests.
-
-// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
-// Sun Pro CC, IBM Visual Age, and HP aCC support.
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
- defined(__IBMCPP__) || defined(__HP_aCC)
-# define GTEST_HAS_TYPED_TEST 1
-# define GTEST_HAS_TYPED_TEST_P 1
-#endif
-
-// Determines whether to support Combine(). This only makes sense when
-// value-parameterized tests are enabled. The implementation doesn't
-// work on Sun Studio since it doesn't understand templated conversion
-// operators.
-#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
-# define GTEST_HAS_COMBINE 1
-#endif
-
-// Determines whether the system compiler uses UTF-16 for encoding wide strings.
-#define GTEST_WIDE_STRING_USES_UTF16_ \
- (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
-
-// Determines whether test results can be streamed to a socket.
-#if GTEST_OS_LINUX
-# define GTEST_CAN_STREAM_RESULTS_ 1
-#endif
-
-// Defines some utility macros.
-
-// The GNU compiler emits a warning if nested "if" statements are followed by
-// an "else" statement and braces are not used to explicitly disambiguate the
-// "else" binding. This leads to problems with code like:
-//
-// if (gate)
-// ASSERT_*(condition) << "Some message";
-//
-// The "switch (0) case 0:" idiom is used to suppress this.
-#ifdef __INTEL_COMPILER
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
-#else
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
-#endif
-
-// Use this annotation at the end of a struct/class definition to
-// prevent the compiler from optimizing away instances that are never
-// used. This is useful when all interesting logic happens inside the
-// c'tor and / or d'tor. Example:
-//
-// struct Foo {
-// Foo() { ... }
-// } GTEST_ATTRIBUTE_UNUSED_;
-//
-// Also use it after a variable or parameter declaration to tell the
-// compiler the variable/parameter does not have to be used.
-#if defined(__GNUC__) && !defined(COMPILER_ICC)
-# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
-#else
-# define GTEST_ATTRIBUTE_UNUSED_
-#endif
-
-// A macro to disallow operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_ASSIGN_(type)\
- void operator=(type const &)
-
-// A macro to disallow copy constructor and operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
- type(type const &);\
- GTEST_DISALLOW_ASSIGN_(type)
-
-// Tell the compiler to warn about unused return values for functions declared
-// with this macro. The macro should be used on function declarations
-// following the argument list:
-//
-// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
-#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
-# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
-#else
-# define GTEST_MUST_USE_RESULT_
-#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
-
-// Determine whether the compiler supports Microsoft's Structured Exception
-// Handling. This is supported by several Windows compilers but generally
-// does not exist on any other system.
-#ifndef GTEST_HAS_SEH
-// The user didn't tell us, so we need to figure it out.
-
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// These two compilers are known to support SEH.
-# define GTEST_HAS_SEH 1
-# else
-// Assume no SEH.
-# define GTEST_HAS_SEH 0
-# endif
-
-#endif // GTEST_HAS_SEH
-
-#ifdef _MSC_VER
-
-# if GTEST_LINKED_AS_SHARED_LIBRARY
-# define GTEST_API_ __declspec(dllimport)
-# elif GTEST_CREATE_SHARED_LIBRARY
-# define GTEST_API_ __declspec(dllexport)
-# endif
-
-#endif // _MSC_VER
-
-#ifndef GTEST_API_
-# define GTEST_API_
-#endif
-
-#ifdef __GNUC__
-// Ask the compiler to never inline a given function.
-# define GTEST_NO_INLINE_ __attribute__((noinline))
-#else
-# define GTEST_NO_INLINE_
-#endif
-
-namespace testing {
-
-class Message;
-
-namespace internal {
-
-class String;
-
-// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
-// expression is true. For example, you could use it to verify the
-// size of a static array:
-//
-// GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
-// content_type_names_incorrect_size);
-//
-// or to make sure a struct is smaller than a certain size:
-//
-// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
-//
-// The second argument to the macro is the name of the variable. If
-// the expression is false, most compilers will issue a warning/error
-// containing the name of the variable.
-
-template <bool>
-struct CompileAssert {
-};
-
-#define GTEST_COMPILE_ASSERT_(expr, msg) \
- typedef ::testing::internal::CompileAssert<(bool(expr))> \
- msg[bool(expr) ? 1 : -1]
-
-// Implementation details of GTEST_COMPILE_ASSERT_:
-//
-// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
-// elements (and thus is invalid) when the expression is false.
-//
-// - The simpler definition
-//
-// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
-//
-// does not work, as gcc supports variable-length arrays whose sizes
-// are determined at run-time (this is gcc's extension and not part
-// of the C++ standard). As a result, gcc fails to reject the
-// following code with the simple definition:
-//
-// int foo;
-// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
-// // not a compile-time constant.
-//
-// - By using the type CompileAssert<(bool(expr))>, we ensures that
-// expr is a compile-time constant. (Template arguments must be
-// determined at compile-time.)
-//
-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
-// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
-//
-// CompileAssert<bool(expr)>
-//
-// instead, these compilers will refuse to compile
-//
-// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
-//
-// (They seem to think the ">" in "5 > 0" marks the end of the
-// template argument list.)
-//
-// - The array size is (bool(expr) ? 1 : -1), instead of simply
-//
-// ((expr) ? 1 : -1).
-//
-// This is to avoid running into a bug in MS VC 7.1, which
-// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
-
-// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
-//
-// This template is declared, but intentionally undefined.
-template <typename T1, typename T2>
-struct StaticAssertTypeEqHelper;
-
-template <typename T>
-struct StaticAssertTypeEqHelper<T, T> {};
-
-#if GTEST_HAS_GLOBAL_STRING
-typedef ::string string;
-#else
-typedef ::std::string string;
-#endif // GTEST_HAS_GLOBAL_STRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-typedef ::wstring wstring;
-#elif GTEST_HAS_STD_WSTRING
-typedef ::std::wstring wstring;
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// A helper for suppressing warnings on constant condition. It just
-// returns 'condition'.
-GTEST_API_ bool IsTrue(bool condition);
-
-// Defines scoped_ptr.
-
-// This implementation of scoped_ptr is PARTIAL - it only contains
-// enough stuff to satisfy Google Test's need.
-template <typename T>
-class scoped_ptr {
- public:
- typedef T element_type;
-
- explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
- ~scoped_ptr() { reset(); }
-
- T& operator*() const { return *ptr_; }
- T* operator->() const { return ptr_; }
- T* get() const { return ptr_; }
-
- T* release() {
- T* const ptr = ptr_;
- ptr_ = NULL;
- return ptr;
- }
-
- void reset(T* p = NULL) {
- if (p != ptr_) {
- if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.
- delete ptr_;
- }
- ptr_ = p;
- }
- }
- private:
- T* ptr_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
-};
-
-// Defines RE.
-
-// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
-// Regular Expression syntax.
-class GTEST_API_ RE {
- public:
- // A copy constructor is required by the Standard to initialize object
- // references from r-values.
- RE(const RE& other) { Init(other.pattern()); }
-
- // Constructs an RE from a string.
- RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
-
-#if GTEST_HAS_GLOBAL_STRING
-
- RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
- RE(const char* regex) { Init(regex); } // NOLINT
- ~RE();
-
- // Returns the string representation of the regex.
- const char* pattern() const { return pattern_; }
-
- // FullMatch(str, re) returns true iff regular expression re matches
- // the entire str.
- // PartialMatch(str, re) returns true iff regular expression re
- // matches a substring of str (including str itself).
- //
- // TODO(wan@google.com): make FullMatch() and PartialMatch() work
- // when str contains NUL characters.
- static bool FullMatch(const ::std::string& str, const RE& re) {
- return FullMatch(str.c_str(), re);
- }
- static bool PartialMatch(const ::std::string& str, const RE& re) {
- return PartialMatch(str.c_str(), re);
- }
-
-#if GTEST_HAS_GLOBAL_STRING
-
- static bool FullMatch(const ::string& str, const RE& re) {
- return FullMatch(str.c_str(), re);
- }
- static bool PartialMatch(const ::string& str, const RE& re) {
- return PartialMatch(str.c_str(), re);
- }
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
- static bool FullMatch(const char* str, const RE& re);
- static bool PartialMatch(const char* str, const RE& re);
-
- private:
- void Init(const char* regex);
-
- // We use a const char* instead of a string, as Google Test may be used
- // where string is not available. We also do not use Google Test's own
- // String type here, in order to simplify dependencies between the
- // files.
- const char* pattern_;
- bool is_valid_;
-
-#if GTEST_USES_POSIX_RE
-
- regex_t full_regex_; // For FullMatch().
- regex_t partial_regex_; // For PartialMatch().
-
-#else // GTEST_USES_SIMPLE_RE
-
- const char* full_pattern_; // For FullMatch();
-
-#endif
-
- GTEST_DISALLOW_ASSIGN_(RE);
-};
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
- int line);
-
-// Defines logging utilities:
-// GTEST_LOG_(severity) - logs messages at the specified severity level. The
-// message itself is streamed into the macro.
-// LogToStderr() - directs all log messages to stderr.
-// FlushInfoLog() - flushes informational log messages.
-
-enum GTestLogSeverity {
- GTEST_INFO,
- GTEST_WARNING,
- GTEST_ERROR,
- GTEST_FATAL
-};
-
-// Formats log entry severity, provides a stream object for streaming the
-// log message, and terminates the message with a newline when going out of
-// scope.
-class GTEST_API_ GTestLog {
- public:
- GTestLog(GTestLogSeverity severity, const char* file, int line);
-
- // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
- ~GTestLog();
-
- ::std::ostream& GetStream() { return ::std::cerr; }
-
- private:
- const GTestLogSeverity severity_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
-};
-
-#define GTEST_LOG_(severity) \
- ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
- __FILE__, __LINE__).GetStream()
-
-inline void LogToStderr() {}
-inline void FlushInfoLog() { fflush(NULL); }
-
-// INTERNAL IMPLEMENTATION - DO NOT USE.
-//
-// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
-// is not satisfied.
-// Synopsys:
-// GTEST_CHECK_(boolean_condition);
-// or
-// GTEST_CHECK_(boolean_condition) << "Additional message";
-//
-// This checks the condition and if the condition is not satisfied
-// it prints message about the condition violation, including the
-// condition itself, plus additional message streamed into it, if any,
-// and then it aborts the program. It aborts the program irrespective of
-// whether it is built in the debug mode or not.
-#define GTEST_CHECK_(condition) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::IsTrue(condition)) \
- ; \
- else \
- GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
-
-// An all-mode assert to verify that the given POSIX-style function
-// call returns 0 (indicating success). Known limitation: this
-// doesn't expand to a balanced 'if' statement, so enclose the macro
-// in {} if you need to use it as the only statement in an 'if'
-// branch.
-#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
- if (const int gtest_error = (posix_call)) \
- GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
- << gtest_error
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Use ImplicitCast_ as a safe version of static_cast for upcasting in
-// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
-// const Foo*). When you use ImplicitCast_, the compiler checks that
-// the cast is safe. Such explicit ImplicitCast_s are necessary in
-// surprisingly many situations where C++ demands an exact type match
-// instead of an argument type convertable to a target type.
-//
-// The syntax for using ImplicitCast_ is the same as for static_cast:
-//
-// ImplicitCast_<ToType>(expr)
-//
-// ImplicitCast_ would have been part of the C++ standard library,
-// but the proposal was submitted too late. It will probably make
-// its way into the language in the future.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., implicit_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To>
-inline To ImplicitCast_(To x) { return x; }
-
-// When you upcast (that is, cast a pointer from type Foo to type
-// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
-// always succeed. When you downcast (that is, cast a pointer from
-// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
-// how do you know the pointer is really of type SubclassOfFoo? It
-// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
-// when you downcast, you should use this macro. In debug mode, we
-// use dynamic_cast<> to double-check the downcast is legal (we die
-// if it's not). In normal mode, we do the efficient static_cast<>
-// instead. Thus, it's important to test in debug mode to make sure
-// the cast is legal!
-// This is the only place in the code we should use dynamic_cast<>.
-// In particular, you SHOULDN'T be using dynamic_cast<> in order to
-// do RTTI (eg code like this:
-// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
-// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
-// You should design the code some other way not to need this.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., down_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To, typename From> // use like this: DownCast_<T*>(foo);
-inline To DownCast_(From* f) { // so we only accept pointers
- // Ensures that To is a sub-type of From *. This test is here only
- // for compile-time type checking, and has no overhead in an
- // optimized build at run-time, as it will be optimized away
- // completely.
- if (false) {
- const To to = NULL;
- ::testing::internal::ImplicitCast_<From*>(to);
- }
-
-#if GTEST_HAS_RTTI
- // RTTI: debug mode only!
- GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
-#endif
- return static_cast<To>(f);
-}
-
-// Downcasts the pointer of type Base to Derived.
-// Derived must be a subclass of Base. The parameter MUST
-// point to a class of type Derived, not any subclass of it.
-// When RTTI is available, the function performs a runtime
-// check to enforce this.
-template <class Derived, class Base>
-Derived* CheckedDowncastToActualType(Base* base) {
-#if GTEST_HAS_RTTI
- GTEST_CHECK_(typeid(*base) == typeid(Derived));
- return dynamic_cast<Derived*>(base); // NOLINT
-#else
- return static_cast<Derived*>(base); // Poor man's downcast.
-#endif
-}
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Defines the stderr capturer:
-// CaptureStdout - starts capturing stdout.
-// GetCapturedStdout - stops capturing stdout and returns the captured string.
-// CaptureStderr - starts capturing stderr.
-// GetCapturedStderr - stops capturing stderr and returns the captured string.
-//
-GTEST_API_ void CaptureStdout();
-GTEST_API_ String GetCapturedStdout();
-GTEST_API_ void CaptureStderr();
-GTEST_API_ String GetCapturedStderr();
-
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments. Set by InitGoogleTest().
-extern ::std::vector<String> g_argvs;
-
-// GTEST_HAS_DEATH_TEST implies we have ::std::string.
-const ::std::vector<String>& GetArgvs();
-
-#endif // GTEST_HAS_DEATH_TEST
-
-// Defines synchronization primitives.
-
-#if GTEST_HAS_PTHREAD
-
-// Sleeps for (roughly) n milli-seconds. This function is only for
-// testing Google Test's own constructs. Don't use it in user tests,
-// either directly or indirectly.
-inline void SleepMilliseconds(int n) {
- const timespec time = {
- 0, // 0 seconds.
- n * 1000L * 1000L, // And n ms.
- };
- nanosleep(&time, NULL);
-}
-
-// Allows a controller thread to pause execution of newly created
-// threads until notified. Instances of this class must be created
-// and destroyed in the controller thread.
-//
-// This class is only for testing Google Test's own constructs. Do not
-// use it in user tests, either directly or indirectly.
-class Notification {
- public:
- Notification() : notified_(false) {}
-
- // Notifies all threads created with this notification to start. Must
- // be called from the controller thread.
- void Notify() { notified_ = true; }
-
- // Blocks until the controller thread notifies. Must be called from a test
- // thread.
- void WaitForNotification() {
- while(!notified_) {
- SleepMilliseconds(10);
- }
- }
-
- private:
- volatile bool notified_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
-};
-
-// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
-// Consequently, it cannot select a correct instantiation of ThreadWithParam
-// in order to call its Run(). Introducing ThreadWithParamBase as a
-// non-templated base class for ThreadWithParam allows us to bypass this
-// problem.
-class ThreadWithParamBase {
- public:
- virtual ~ThreadWithParamBase() {}
- virtual void Run() = 0;
-};
-
-// pthread_create() accepts a pointer to a function type with the C linkage.
-// According to the Standard (7.5/1), function types with different linkages
-// are different even if they are otherwise identical. Some compilers (for
-// example, SunStudio) treat them as different types. Since class methods
-// cannot be defined with C-linkage we need to define a free C-function to
-// pass into pthread_create().
-extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
- static_cast<ThreadWithParamBase*>(thread)->Run();
- return NULL;
-}
-
-// Helper class for testing Google Test's multi-threading constructs.
-// To use it, write:
-//
-// void ThreadFunc(int param) { /* Do things with param */ }
-// Notification thread_can_start;
-// ...
-// // The thread_can_start parameter is optional; you can supply NULL.
-// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
-// thread_can_start.Notify();
-//
-// These classes are only for testing Google Test's own constructs. Do
-// not use them in user tests, either directly or indirectly.
-template <typename T>
-class ThreadWithParam : public ThreadWithParamBase {
- public:
- typedef void (*UserThreadFunc)(T);
-
- ThreadWithParam(
- UserThreadFunc func, T param, Notification* thread_can_start)
- : func_(func),
- param_(param),
- thread_can_start_(thread_can_start),
- finished_(false) {
- ThreadWithParamBase* const base = this;
- // The thread can be created only after all fields except thread_
- // have been initialized.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
- }
- ~ThreadWithParam() { Join(); }
-
- void Join() {
- if (!finished_) {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
- finished_ = true;
- }
- }
-
- virtual void Run() {
- if (thread_can_start_ != NULL)
- thread_can_start_->WaitForNotification();
- func_(param_);
- }
-
- private:
- const UserThreadFunc func_; // User-supplied thread function.
- const T param_; // User-supplied parameter to the thread function.
- // When non-NULL, used to block execution until the controller thread
- // notifies.
- Notification* const thread_can_start_;
- bool finished_; // true iff we know that the thread function has finished.
- pthread_t thread_; // The native thread object.
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
-};
-
-// MutexBase and Mutex implement mutex on pthreads-based platforms. They
-// are used in conjunction with class MutexLock:
-//
-// Mutex mutex;
-// ...
-// MutexLock lock(&mutex); // Acquires the mutex and releases it at the end
-// // of the current scope.
-//
-// MutexBase implements behavior for both statically and dynamically
-// allocated mutexes. Do not use MutexBase directly. Instead, write
-// the following to define a static mutex:
-//
-// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
-//
-// You can forward declare a static mutex like this:
-//
-// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
-//
-// To create a dynamic mutex, just define an object of type Mutex.
-class MutexBase {
- public:
- // Acquires this mutex.
- void Lock() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
- owner_ = pthread_self();
- }
-
- // Releases this mutex.
- void Unlock() {
- // We don't protect writing to owner_ here, as it's the caller's
- // responsibility to ensure that the current thread holds the
- // mutex when this is called.
- owner_ = 0;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
- }
-
- // Does nothing if the current thread holds the mutex. Otherwise, crashes
- // with high probability.
- void AssertHeld() const {
- GTEST_CHECK_(owner_ == pthread_self())
- << "The current thread is not holding the mutex @" << this;
- }
-
- // A static mutex may be used before main() is entered. It may even
- // be used before the dynamic initialization stage. Therefore we
- // must be able to initialize a static mutex object at link time.
- // This means MutexBase has to be a POD and its member variables
- // have to be public.
- public:
- pthread_mutex_t mutex_; // The underlying pthread mutex.
- pthread_t owner_; // The thread holding the mutex; 0 means no one holds it.
-};
-
-// Forward-declares a static mutex.
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::MutexBase mutex
-
-// Defines and statically (i.e. at link time) initializes a static mutex.
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
- ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }
-
-// The Mutex class can only be used for mutexes created at runtime. It
-// shares its API with MutexBase otherwise.
-class Mutex : public MutexBase {
- public:
- Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
- owner_ = 0;
- }
- ~Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
- }
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
-};
-
-// We cannot name this class MutexLock as the ctor declaration would
-// conflict with a macro named MutexLock, which is defined on some
-// platforms. Hence the typedef trick below.
-class GTestMutexLock {
- public:
- explicit GTestMutexLock(MutexBase* mutex)
- : mutex_(mutex) { mutex_->Lock(); }
-
- ~GTestMutexLock() { mutex_->Unlock(); }
-
- private:
- MutexBase* const mutex_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
-};
-
-typedef GTestMutexLock MutexLock;
-
-// Helpers for ThreadLocal.
-
-// pthread_key_create() requires DeleteThreadLocalValue() to have
-// C-linkage. Therefore it cannot be templatized to access
-// ThreadLocal<T>. Hence the need for class
-// ThreadLocalValueHolderBase.
-class ThreadLocalValueHolderBase {
- public:
- virtual ~ThreadLocalValueHolderBase() {}
-};
-
-// Called by pthread to delete thread-local data stored by
-// pthread_setspecific().
-extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
- delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
-}
-
-// Implements thread-local storage on pthreads-based systems.
-//
-// // Thread 1
-// ThreadLocal<int> tl(100); // 100 is the default value for each thread.
-//
-// // Thread 2
-// tl.set(150); // Changes the value for thread 2 only.
-// EXPECT_EQ(150, tl.get());
-//
-// // Thread 1
-// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
-// tl.set(200);
-// EXPECT_EQ(200, tl.get());
-//
-// The template type argument T must have a public copy constructor.
-// In addition, the default ThreadLocal constructor requires T to have
-// a public default constructor.
-//
-// An object managed for a thread by a ThreadLocal instance is deleted
-// when the thread exits. Or, if the ThreadLocal instance dies in
-// that thread, when the ThreadLocal dies. It's the user's
-// responsibility to ensure that all other threads using a ThreadLocal
-// have exited when it dies, or the per-thread objects for those
-// threads will not be deleted.
-//
-// Google Test only uses global ThreadLocal objects. That means they
-// will die after main() has returned. Therefore, no per-thread
-// object managed by Google Test will be leaked as long as all threads
-// using Google Test have exited when main() returns.
-template <typename T>
-class ThreadLocal {
- public:
- ThreadLocal() : key_(CreateKey()),
- default_() {}
- explicit ThreadLocal(const T& value) : key_(CreateKey()),
- default_(value) {}
-
- ~ThreadLocal() {
- // Destroys the managed object for the current thread, if any.
- DeleteThreadLocalValue(pthread_getspecific(key_));
-
- // Releases resources associated with the key. This will *not*
- // delete managed objects for other threads.
- GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
- }
-
- T* pointer() { return GetOrCreateValue(); }
- const T* pointer() const { return GetOrCreateValue(); }
- const T& get() const { return *pointer(); }
- void set(const T& value) { *pointer() = value; }
-
- private:
- // Holds a value of type T.
- class ValueHolder : public ThreadLocalValueHolderBase {
- public:
- explicit ValueHolder(const T& value) : value_(value) {}
-
- T* pointer() { return &value_; }
-
- private:
- T value_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
- };
-
- static pthread_key_t CreateKey() {
- pthread_key_t key;
- // When a thread exits, DeleteThreadLocalValue() will be called on
- // the object managed for that thread.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_key_create(&key, &DeleteThreadLocalValue));
- return key;
- }
-
- T* GetOrCreateValue() const {
- ThreadLocalValueHolderBase* const holder =
- static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
- if (holder != NULL) {
- return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
- }
-
- ValueHolder* const new_holder = new ValueHolder(default_);
- ThreadLocalValueHolderBase* const holder_base = new_holder;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
- return new_holder->pointer();
- }
-
- // A key pthreads uses for looking up per-thread values.
- const pthread_key_t key_;
- const T default_; // The default value for each thread.
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
-};
-
-# define GTEST_IS_THREADSAFE 1
-
-#else // GTEST_HAS_PTHREAD
-
-// A dummy implementation of synchronization primitives (mutex, lock,
-// and thread-local variable). Necessary for compiling Google Test where
-// mutex is not supported - using Google Test in multiple threads is not
-// supported on such platforms.
-
-class Mutex {
- public:
- Mutex() {}
- void AssertHeld() const {}
-};
-
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::Mutex mutex
-
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
-
-class GTestMutexLock {
- public:
- explicit GTestMutexLock(Mutex*) {} // NOLINT
-};
-
-typedef GTestMutexLock MutexLock;
-
-template <typename T>
-class ThreadLocal {
- public:
- ThreadLocal() : value_() {}
- explicit ThreadLocal(const T& value) : value_(value) {}
- T* pointer() { return &value_; }
- const T* pointer() const { return &value_; }
- const T& get() const { return value_; }
- void set(const T& value) { value_ = value; }
- private:
- T value_;
-};
-
-// The above synchronization primitives have dummy implementations.
-// Therefore Google Test is not thread-safe.
-# define GTEST_IS_THREADSAFE 0
-
-#endif // GTEST_HAS_PTHREAD
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-GTEST_API_ size_t GetThreadCount();
-
-// Passing non-POD classes through ellipsis (...) crashes the ARM
-// compiler and generates a warning in Sun Studio. The Nokia Symbian
-// and the IBM XL C/C++ compiler try to instantiate a copy constructor
-// for objects passed through ellipsis (...), failing for uncopyable
-// objects. We define this to ensure that only POD is passed through
-// ellipsis on these systems.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_ELLIPSIS_NEEDS_POD_ 1
-#else
-# define GTEST_CAN_COMPARE_NULL 1
-#endif
-
-// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
-// const T& and const T* in a function template. These compilers
-// _can_ decide between class template specializations for T and T*,
-// so a tr1::type_traits-like is_pointer works.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
-# define GTEST_NEEDS_IS_POINTER_ 1
-#endif
-
-template <bool bool_value>
-struct bool_constant {
- typedef bool_constant<bool_value> type;
- static const bool value = bool_value;
-};
-template <bool bool_value> const bool bool_constant<bool_value>::value;
-
-typedef bool_constant<false> false_type;
-typedef bool_constant<true> true_type;
-
-template <typename T>
-struct is_pointer : public false_type {};
-
-template <typename T>
-struct is_pointer<T*> : public true_type {};
-
-template <typename Iterator>
-struct IteratorTraits {
- typedef typename Iterator::value_type value_type;
-};
-
-template <typename T>
-struct IteratorTraits<T*> {
- typedef T value_type;
-};
-
-template <typename T>
-struct IteratorTraits<const T*> {
- typedef T value_type;
-};
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_SEP_ "\\"
-# define GTEST_HAS_ALT_PATH_SEP_ 1
-// The biggest signed integer type the compiler supports.
-typedef __int64 BiggestInt;
-#else
-# define GTEST_PATH_SEP_ "/"
-# define GTEST_HAS_ALT_PATH_SEP_ 0
-typedef long long BiggestInt; // NOLINT
-#endif // GTEST_OS_WINDOWS
-
-// Utilities for char.
-
-// isspace(int ch) and friends accept an unsigned char or EOF. char
-// may be signed, depending on the compiler (or compiler flags).
-// Therefore we need to cast a char to unsigned char before calling
-// isspace(), etc.
-
-inline bool IsAlpha(char ch) {
- return isalpha(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsAlNum(char ch) {
- return isalnum(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsDigit(char ch) {
- return isdigit(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsLower(char ch) {
- return islower(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsSpace(char ch) {
- return isspace(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsUpper(char ch) {
- return isupper(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsXDigit(char ch) {
- return isxdigit(static_cast<unsigned char>(ch)) != 0;
-}
-
-inline char ToLower(char ch) {
- return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
-}
-inline char ToUpper(char ch) {
- return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
-}
-
-// The testing::internal::posix namespace holds wrappers for common
-// POSIX functions. These wrappers hide the differences between
-// Windows/MSVC and POSIX systems. Since some compilers define these
-// standard functions as macros, the wrapper cannot have the same name
-// as the wrapped function.
-
-namespace posix {
-
-// Functions with a different name on Windows.
-
-#if GTEST_OS_WINDOWS
-
-typedef struct _stat StatStruct;
-
-# ifdef __BORLANDC__
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-# else // !__BORLANDC__
-# if GTEST_OS_WINDOWS_MOBILE
-inline int IsATTY(int /* fd */) { return 0; }
-# else
-inline int IsATTY(int fd) { return _isatty(fd); }
-# endif // GTEST_OS_WINDOWS_MOBILE
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return _stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return _strdup(src); }
-# endif // __BORLANDC__
-
-# if GTEST_OS_WINDOWS_MOBILE
-inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
-// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
-// time and thus not defined there.
-# else
-inline int FileNo(FILE* file) { return _fileno(file); }
-inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
-inline int RmDir(const char* dir) { return _rmdir(dir); }
-inline bool IsDir(const StatStruct& st) {
- return (_S_IFDIR & st.st_mode) != 0;
-}
-# endif // GTEST_OS_WINDOWS_MOBILE
-
-#else
-
-typedef struct stat StatStruct;
-
-inline int FileNo(FILE* file) { return fileno(file); }
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return strcasecmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-inline int RmDir(const char* dir) { return rmdir(dir); }
-inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
-
-#endif // GTEST_OS_WINDOWS
-
-// Functions deprecated by MSVC 8.0.
-
-#ifdef _MSC_VER
-// Temporarily disable warning 4996 (deprecated function).
-# pragma warning(push)
-# pragma warning(disable:4996)
-#endif
-
-inline const char* StrNCpy(char* dest, const char* src, size_t n) {
- return strncpy(dest, src, n);
-}
-
-// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
-// StrError() aren't needed on Windows CE at this time and thus not
-// defined there.
-
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int ChDir(const char* dir) { return chdir(dir); }
-#endif
-inline FILE* FOpen(const char* path, const char* mode) {
- return fopen(path, mode);
-}
-#if !GTEST_OS_WINDOWS_MOBILE
-inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
- return freopen(path, mode, stream);
-}
-inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
-#endif
-inline int FClose(FILE* fp) { return fclose(fp); }
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int Read(int fd, void* buf, unsigned int count) {
- return static_cast<int>(read(fd, buf, count));
-}
-inline int Write(int fd, const void* buf, unsigned int count) {
- return static_cast<int>(write(fd, buf, count));
-}
-inline int Close(int fd) { return close(fd); }
-inline const char* StrError(int errnum) { return strerror(errnum); }
-#endif
-inline const char* GetEnv(const char* name) {
-#if GTEST_OS_WINDOWS_MOBILE
- // We are on Windows CE, which has no environment variables.
- return NULL;
-#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
- // Environment variables which we programmatically clear will be set to the
- // empty string rather than unset (NULL). Handle that case.
- const char* const env = getenv(name);
- return (env != NULL && env[0] != '\0') ? env : NULL;
-#else
- return getenv(name);
-#endif
-}
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Windows CE has no C library. The abort() function is used in
-// several places in Google Test. This implementation provides a reasonable
-// imitation of standard behaviour.
-void Abort();
-#else
-inline void Abort() { abort(); }
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-} // namespace posix
-
-// The maximum number a BiggestInt can represent. This definition
-// works no matter BiggestInt is represented in one's complement or
-// two's complement.
-//
-// We cannot rely on numeric_limits in STL, as __int64 and long long
-// are not part of standard C++ and numeric_limits doesn't need to be
-// defined for them.
-const BiggestInt kMaxBiggestInt =
- ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
-
-// This template class serves as a compile-time function from size to
-// type. It maps a size in bytes to a primitive type with that
-// size. e.g.
-//
-// TypeWithSize<4>::UInt
-//
-// is typedef-ed to be unsigned int (unsigned integer made up of 4
-// bytes).
-//
-// Such functionality should belong to STL, but I cannot find it
-// there.
-//
-// Google Test uses this class in the implementation of floating-point
-// comparison.
-//
-// For now it only handles UInt (unsigned int) as that's all Google Test
-// needs. Other types can be easily added in the future if need
-// arises.
-template <size_t size>
-class TypeWithSize {
- public:
- // This prevents the user from using TypeWithSize<N> with incorrect
- // values of N.
- typedef void UInt;
-};
-
-// The specialization for size 4.
-template <>
-class TypeWithSize<4> {
- public:
- // unsigned int has size 4 in both gcc and MSVC.
- //
- // As base/basictypes.h doesn't compile on Windows, we cannot use
- // uint32, uint64, and etc here.
- typedef int Int;
- typedef unsigned int UInt;
-};
-
-// The specialization for size 8.
-template <>
-class TypeWithSize<8> {
- public:
-
-#if GTEST_OS_WINDOWS
- typedef __int64 Int;
- typedef unsigned __int64 UInt;
-#else
- typedef long long Int; // NOLINT
- typedef unsigned long long UInt; // NOLINT
-#endif // GTEST_OS_WINDOWS
-};
-
-// Integer types of known sizes.
-typedef TypeWithSize<4>::Int Int32;
-typedef TypeWithSize<4>::UInt UInt32;
-typedef TypeWithSize<8>::Int Int64;
-typedef TypeWithSize<8>::UInt UInt64;
-typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
-
-// Utilities for command line flags and environment variables.
-
-// Macro for referencing flags.
-#define GTEST_FLAG(name) FLAGS_gtest_##name
-
-// Macros for declaring flags.
-#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
-#define GTEST_DECLARE_int32_(name) \
- GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
-#define GTEST_DECLARE_string_(name) \
- GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)
-
-// Macros for defining flags.
-#define GTEST_DEFINE_bool_(name, default_val, doc) \
- GTEST_API_ bool GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_int32_(name, default_val, doc) \
- GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_string_(name, default_val, doc) \
- GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
-
-// Parses 'str' for a 32-bit signed integer. If successful, writes the result
-// to *value and returns true; otherwise leaves *value unchanged and returns
-// false.
-// TODO(chandlerc): Find a better way to refactor flag and environment parsing
-// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
-// function.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value);
-
-// Parses a bool/Int32/string from the environment variable
-// corresponding to the given Google Test flag.
-bool BoolFromGTestEnv(const char* flag, bool default_val);
-GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
-const char* StringFromGTestEnv(const char* flag, const char* default_val);
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares the String class and functions used internally by
-// Google Test. They are subject to change without notice. They should not used
-// by code external to Google Test.
-//
-// This header file is #included by <gtest/internal/gtest-internal.h>.
-// It should not be #included by other files.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-
-#ifdef __BORLANDC__
-// string.h is not guaranteed to provide strcpy on C++ Builder.
-# include <mem.h>
-#endif
-
-#include <string.h>
-#include "gtest/internal/gtest-port.h"
-
-#include <string>
-
-namespace testing {
-namespace internal {
-
-// String - a UTF-8 string class.
-//
-// For historic reasons, we don't use std::string.
-//
-// TODO(wan@google.com): replace this class with std::string or
-// implement it in terms of the latter.
-//
-// Note that String can represent both NULL and the empty string,
-// while std::string cannot represent NULL.
-//
-// NULL and the empty string are considered different. NULL is less
-// than anything (including the empty string) except itself.
-//
-// This class only provides minimum functionality necessary for
-// implementing Google Test. We do not intend to implement a full-fledged
-// string class here.
-//
-// Since the purpose of this class is to provide a substitute for
-// std::string on platforms where it cannot be used, we define a copy
-// constructor and assignment operators such that we don't need
-// conditional compilation in a lot of places.
-//
-// In order to make the representation efficient, the d'tor of String
-// is not virtual. Therefore DO NOT INHERIT FROM String.
-class GTEST_API_ String {
- public:
- // Static utility methods
-
- // Returns the input enclosed in double quotes if it's not NULL;
- // otherwise returns "(null)". For example, "\"Hello\"" is returned
- // for input "Hello".
- //
- // This is useful for printing a C string in the syntax of a literal.
- //
- // Known issue: escape sequences are not handled yet.
- static String ShowCStringQuoted(const char* c_str);
-
- // Clones a 0-terminated C string, allocating memory using new. The
- // caller is responsible for deleting the return value using
- // delete[]. Returns the cloned string, or NULL if the input is
- // NULL.
- //
- // This is different from strdup() in string.h, which allocates
- // memory using malloc().
- static const char* CloneCString(const char* c_str);
-
-#if GTEST_OS_WINDOWS_MOBILE
- // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
- // able to pass strings to Win32 APIs on CE we need to convert them
- // to 'Unicode', UTF-16.
-
- // Creates a UTF-16 wide string from the given ANSI string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the wide string, or NULL if the
- // input is NULL.
- //
- // The wide string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static LPCWSTR AnsiToUtf16(const char* c_str);
-
- // Creates an ANSI string from the given wide string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the ANSI string, or NULL if the
- // input is NULL.
- //
- // The returned string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static const char* Utf16ToAnsi(LPCWSTR utf16_str);
-#endif
-
- // Compares two C strings. Returns true iff they have the same content.
- //
- // Unlike strcmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CStringEquals(const char* lhs, const char* rhs);
-
- // Converts a wide C string to a String using the UTF-8 encoding.
- // NULL will be converted to "(null)". If an error occurred during
- // the conversion, "(failed to convert from wide string)" is
- // returned.
- static String ShowWideCString(const wchar_t* wide_c_str);
-
- // Similar to ShowWideCString(), except that this function encloses
- // the converted string in double quotes.
- static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
-
- // Compares two wide C strings. Returns true iff they have the same
- // content.
- //
- // Unlike wcscmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
-
- // Compares two C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike strcasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CaseInsensitiveCStringEquals(const char* lhs,
- const char* rhs);
-
- // Compares two wide C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike wcscasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL wide C string,
- // including the empty string.
- // NB: The implementations on different platforms slightly differ.
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
- // environment variable. On GNU platform this method uses wcscasecmp
- // which compares according to LC_CTYPE category of the current locale.
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
- // current locale.
- static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
- const wchar_t* rhs);
-
- // Formats a list of arguments to a String, using the same format
- // spec string as for printf.
- //
- // We do not use the StringPrintf class as it is not universally
- // available.
- //
- // The result is limited to 4096 characters (including the tailing
- // 0). If 4096 characters are not enough to format the input,
- // "<buffer exceeded>" is returned.
- static String Format(const char* format, ...);
-
- // C'tors
-
- // The default c'tor constructs a NULL string.
- String() : c_str_(NULL), length_(0) {}
-
- // Constructs a String by cloning a 0-terminated C string.
- String(const char* a_c_str) { // NOLINT
- if (a_c_str == NULL) {
- c_str_ = NULL;
- length_ = 0;
- } else {
- ConstructNonNull(a_c_str, strlen(a_c_str));
- }
- }
-
- // Constructs a String by copying a given number of chars from a
- // buffer. E.g. String("hello", 3) creates the string "hel",
- // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "",
- // and String(NULL, 1) results in access violation.
- String(const char* buffer, size_t a_length) {
- ConstructNonNull(buffer, a_length);
- }
-
- // The copy c'tor creates a new copy of the string. The two
- // String objects do not share content.
- String(const String& str) : c_str_(NULL), length_(0) { *this = str; }
-
- // D'tor. String is intended to be a final class, so the d'tor
- // doesn't need to be virtual.
- ~String() { delete[] c_str_; }
-
- // Allows a String to be implicitly converted to an ::std::string or
- // ::string, and vice versa. Converting a String containing a NULL
- // pointer to ::std::string or ::string is undefined behavior.
- // Converting a ::std::string or ::string containing an embedded NUL
- // character to a String will result in the prefix up to the first
- // NUL character.
- String(const ::std::string& str) {
- ConstructNonNull(str.c_str(), str.length());
- }
-
- operator ::std::string() const { return ::std::string(c_str(), length()); }
-
-#if GTEST_HAS_GLOBAL_STRING
- String(const ::string& str) {
- ConstructNonNull(str.c_str(), str.length());
- }
-
- operator ::string() const { return ::string(c_str(), length()); }
-#endif // GTEST_HAS_GLOBAL_STRING
-
- // Returns true iff this is an empty string (i.e. "").
- bool empty() const { return (c_str() != NULL) && (length() == 0); }
-
- // Compares this with another String.
- // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
- // if this is greater than rhs.
- int Compare(const String& rhs) const;
-
- // Returns true iff this String equals the given C string. A NULL
- // string and a non-NULL string are considered not equal.
- bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }
-
- // Returns true iff this String is less than the given String. A
- // NULL string is considered less than "".
- bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
-
- // Returns true iff this String doesn't equal the given C string. A NULL
- // string and a non-NULL string are considered not equal.
- bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }
-
- // Returns true iff this String ends with the given suffix. *Any*
- // String is considered to end with a NULL or empty suffix.
- bool EndsWith(const char* suffix) const;
-
- // Returns true iff this String ends with the given suffix, not considering
- // case. Any String is considered to end with a NULL or empty suffix.
- bool EndsWithCaseInsensitive(const char* suffix) const;
-
- // Returns the length of the encapsulated string, or 0 if the
- // string is NULL.
- size_t length() const { return length_; }
-
- // Gets the 0-terminated C string this String object represents.
- // The String object still owns the string. Therefore the caller
- // should NOT delete the return value.
- const char* c_str() const { return c_str_; }
-
- // Assigns a C string to this object. Self-assignment works.
- const String& operator=(const char* a_c_str) {
- return *this = String(a_c_str);
- }
-
- // Assigns a String object to this object. Self-assignment works.
- const String& operator=(const String& rhs) {
- if (this != &rhs) {
- delete[] c_str_;
- if (rhs.c_str() == NULL) {
- c_str_ = NULL;
- length_ = 0;
- } else {
- ConstructNonNull(rhs.c_str(), rhs.length());
- }
- }
-
- return *this;
- }
-
- private:
- // Constructs a non-NULL String from the given content. This
- // function can only be called when c_str_ has not been allocated.
- // ConstructNonNull(NULL, 0) results in an empty string ("").
- // ConstructNonNull(NULL, non_zero) is undefined behavior.
- void ConstructNonNull(const char* buffer, size_t a_length) {
- char* const str = new char[a_length + 1];
- memcpy(str, buffer, a_length);
- str[a_length] = '\0';
- c_str_ = str;
- length_ = a_length;
- }
-
- const char* c_str_;
- size_t length_;
-}; // class String
-
-// Streams a String to an ostream. Each '\0' character in the String
-// is replaced with "\\0".
-inline ::std::ostream& operator<<(::std::ostream& os, const String& str) {
- if (str.c_str() == NULL) {
- os << "(null)";
- } else {
- const char* const c_str = str.c_str();
- for (size_t i = 0; i != str.length(); i++) {
- if (c_str[i] == '\0') {
- os << "\\0";
- } else {
- os << c_str[i];
- }
- }
- }
- return os;
-}
-
-// Gets the content of the stringstream's buffer as a String. Each '\0'
-// character in the buffer is replaced with "\\0".
-GTEST_API_ String StringStreamToString(::std::stringstream* stream);
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+++ /dev/null
-// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
-
-// Copyright 2009 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-
-#include <utility> // For ::std::pair.
-
-// The compiler used in Symbian has a bug that prevents us from declaring the
-// tuple template as a friend (it complains that tuple is redefined). This
-// hack bypasses the bug by declaring the members that should otherwise be
-// private as public.
-// Sun Studio versions < 12 also have the above bug.
-#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
-#else
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
- template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
- private:
-#endif
-
-// GTEST_n_TUPLE_(T) is the type of an n-tuple.
-#define GTEST_0_TUPLE_(T) tuple<>
-#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
- void, void, void>
-#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
- void, void, void>
-#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
- void, void, void>
-#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
- void, void, void>
-#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
- void, void, void>
-#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
- void, void, void>
-#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- void, void, void>
-#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, void, void>
-#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, T##8, void>
-#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, T##8, T##9>
-
-// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
-#define GTEST_0_TYPENAMES_(T)
-#define GTEST_1_TYPENAMES_(T) typename T##0
-#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
-#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
-#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3
-#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4
-#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5
-#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6
-#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
-#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, \
- typename T##7, typename T##8
-#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, \
- typename T##7, typename T##8, typename T##9
-
-// In theory, defining stuff in the ::std namespace is undefined
-// behavior. We can do this as we are playing the role of a standard
-// library vendor.
-namespace std {
-namespace tr1 {
-
-template <typename T0 = void, typename T1 = void, typename T2 = void,
- typename T3 = void, typename T4 = void, typename T5 = void,
- typename T6 = void, typename T7 = void, typename T8 = void,
- typename T9 = void>
-class tuple;
-
-// Anything in namespace gtest_internal is Google Test's INTERNAL
-// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
-namespace gtest_internal {
-
-// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
-template <typename T>
-struct ByRef { typedef const T& type; }; // NOLINT
-template <typename T>
-struct ByRef<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper for ByRef.
-#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
-
-// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
-// is the same as tr1::add_reference<T>::type.
-template <typename T>
-struct AddRef { typedef T& type; }; // NOLINT
-template <typename T>
-struct AddRef<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper for AddRef.
-#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
-
-// A helper for implementing get<k>().
-template <int k> class Get;
-
-// A helper for implementing tuple_element<k, T>. kIndexValid is true
-// iff k < the number of fields in tuple type T.
-template <bool kIndexValid, int kIndex, class Tuple>
-struct TupleElement;
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
-
-} // namespace gtest_internal
-
-template <>
-class tuple<> {
- public:
- tuple() {}
- tuple(const tuple& /* t */) {}
- tuple& operator=(const tuple& /* t */) { return *this; }
-};
-
-template <GTEST_1_TYPENAMES_(T)>
-class GTEST_1_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
-
- tuple(const tuple& t) : f0_(t.f0_) {}
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
- f0_ = t.f0_;
- return *this;
- }
-
- T0 f0_;
-};
-
-template <GTEST_2_TYPENAMES_(T)>
-class GTEST_2_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
- f1_(f1) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
- template <typename U0, typename U1>
- tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
- template <typename U0, typename U1>
- tuple& operator=(const ::std::pair<U0, U1>& p) {
- f0_ = p.first;
- f1_ = p.second;
- return *this;
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
-};
-
-template <GTEST_3_TYPENAMES_(T)>
-class GTEST_3_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
-};
-
-template <GTEST_4_TYPENAMES_(T)>
-class GTEST_4_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
-};
-
-template <GTEST_5_TYPENAMES_(T)>
-class GTEST_5_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
- GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_) {}
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
-};
-
-template <GTEST_6_TYPENAMES_(T)>
-class GTEST_6_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_) {}
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
-};
-
-template <GTEST_7_TYPENAMES_(T)>
-class GTEST_7_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
-};
-
-template <GTEST_8_TYPENAMES_(T)>
-class GTEST_8_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
- GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5), f6_(f6), f7_(f7) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
-};
-
-template <GTEST_9_TYPENAMES_(T)>
-class GTEST_9_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
- GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- f8_ = t.f8_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
- T8 f8_;
-};
-
-template <GTEST_10_TYPENAMES_(T)>
-class tuple {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
- f9_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
- GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
- f9_(t.f9_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- f8_ = t.f8_;
- f9_ = t.f9_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
- T8 f8_;
- T9 f9_;
-};
-
-// 6.1.3.2 Tuple creation functions.
-
-// Known limitations: we don't support passing an
-// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
-// implement tie().
-
-inline tuple<> make_tuple() { return tuple<>(); }
-
-template <GTEST_1_TYPENAMES_(T)>
-inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
- return GTEST_1_TUPLE_(T)(f0);
-}
-
-template <GTEST_2_TYPENAMES_(T)>
-inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
- return GTEST_2_TUPLE_(T)(f0, f1);
-}
-
-template <GTEST_3_TYPENAMES_(T)>
-inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
- return GTEST_3_TUPLE_(T)(f0, f1, f2);
-}
-
-template <GTEST_4_TYPENAMES_(T)>
-inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3) {
- return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
-}
-
-template <GTEST_5_TYPENAMES_(T)>
-inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4) {
- return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
-}
-
-template <GTEST_6_TYPENAMES_(T)>
-inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5) {
- return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
-}
-
-template <GTEST_7_TYPENAMES_(T)>
-inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
- return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
-}
-
-template <GTEST_8_TYPENAMES_(T)>
-inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
- return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
-}
-
-template <GTEST_9_TYPENAMES_(T)>
-inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
- const T8& f8) {
- return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
-}
-
-template <GTEST_10_TYPENAMES_(T)>
-inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
- const T8& f8, const T9& f9) {
- return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
-}
-
-// 6.1.3.3 Tuple helper classes.
-
-template <typename Tuple> struct tuple_size;
-
-template <GTEST_0_TYPENAMES_(T)>
-struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
-
-template <GTEST_1_TYPENAMES_(T)>
-struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
-
-template <GTEST_2_TYPENAMES_(T)>
-struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
-
-template <GTEST_3_TYPENAMES_(T)>
-struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
-
-template <GTEST_4_TYPENAMES_(T)>
-struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
-
-template <GTEST_5_TYPENAMES_(T)>
-struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
-
-template <GTEST_6_TYPENAMES_(T)>
-struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
-
-template <GTEST_7_TYPENAMES_(T)>
-struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
-
-template <GTEST_8_TYPENAMES_(T)>
-struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
-
-template <GTEST_9_TYPENAMES_(T)>
-struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
-
-template <int k, class Tuple>
-struct tuple_element {
- typedef typename gtest_internal::TupleElement<
- k < (tuple_size<Tuple>::value), k, Tuple>::type type;
-};
-
-#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
-
-// 6.1.3.4 Element access.
-
-namespace gtest_internal {
-
-template <>
-class Get<0> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
- Field(Tuple& t) { return t.f0_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
- ConstField(const Tuple& t) { return t.f0_; }
-};
-
-template <>
-class Get<1> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
- Field(Tuple& t) { return t.f1_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
- ConstField(const Tuple& t) { return t.f1_; }
-};
-
-template <>
-class Get<2> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
- Field(Tuple& t) { return t.f2_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
- ConstField(const Tuple& t) { return t.f2_; }
-};
-
-template <>
-class Get<3> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
- Field(Tuple& t) { return t.f3_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
- ConstField(const Tuple& t) { return t.f3_; }
-};
-
-template <>
-class Get<4> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
- Field(Tuple& t) { return t.f4_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
- ConstField(const Tuple& t) { return t.f4_; }
-};
-
-template <>
-class Get<5> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
- Field(Tuple& t) { return t.f5_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
- ConstField(const Tuple& t) { return t.f5_; }
-};
-
-template <>
-class Get<6> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
- Field(Tuple& t) { return t.f6_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
- ConstField(const Tuple& t) { return t.f6_; }
-};
-
-template <>
-class Get<7> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
- Field(Tuple& t) { return t.f7_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
- ConstField(const Tuple& t) { return t.f7_; }
-};
-
-template <>
-class Get<8> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
- Field(Tuple& t) { return t.f8_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
- ConstField(const Tuple& t) { return t.f8_; }
-};
-
-template <>
-class Get<9> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
- Field(Tuple& t) { return t.f9_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
- ConstField(const Tuple& t) { return t.f9_; }
-};
-
-} // namespace gtest_internal
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
-get(GTEST_10_TUPLE_(T)& t) {
- return gtest_internal::Get<k>::Field(t);
-}
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
-get(const GTEST_10_TUPLE_(T)& t) {
- return gtest_internal::Get<k>::ConstField(t);
-}
-
-// 6.1.3.5 Relational operators
-
-// We only implement == and !=, as we don't have a need for the rest yet.
-
-namespace gtest_internal {
-
-// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
-// first k fields of t1 equals the first k fields of t2.
-// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
-// k1 != k2.
-template <int kSize1, int kSize2>
-struct SameSizeTuplePrefixComparator;
-
-template <>
-struct SameSizeTuplePrefixComparator<0, 0> {
- template <class Tuple1, class Tuple2>
- static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
- return true;
- }
-};
-
-template <int k>
-struct SameSizeTuplePrefixComparator<k, k> {
- template <class Tuple1, class Tuple2>
- static bool Eq(const Tuple1& t1, const Tuple2& t2) {
- return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
- ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
- }
-};
-
-} // namespace gtest_internal
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator==(const GTEST_10_TUPLE_(T)& t,
- const GTEST_10_TUPLE_(U)& u) {
- return gtest_internal::SameSizeTuplePrefixComparator<
- tuple_size<GTEST_10_TUPLE_(T)>::value,
- tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
-}
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
- const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
-
-// 6.1.4 Pairs.
-// Unimplemented.
-
-} // namespace tr1
-} // namespace std
-
-#undef GTEST_0_TUPLE_
-#undef GTEST_1_TUPLE_
-#undef GTEST_2_TUPLE_
-#undef GTEST_3_TUPLE_
-#undef GTEST_4_TUPLE_
-#undef GTEST_5_TUPLE_
-#undef GTEST_6_TUPLE_
-#undef GTEST_7_TUPLE_
-#undef GTEST_8_TUPLE_
-#undef GTEST_9_TUPLE_
-#undef GTEST_10_TUPLE_
-
-#undef GTEST_0_TYPENAMES_
-#undef GTEST_1_TYPENAMES_
-#undef GTEST_2_TYPENAMES_
-#undef GTEST_3_TYPENAMES_
-#undef GTEST_4_TYPENAMES_
-#undef GTEST_5_TYPENAMES_
-#undef GTEST_6_TYPENAMES_
-#undef GTEST_7_TYPENAMES_
-#undef GTEST_8_TYPENAMES_
-#undef GTEST_9_TYPENAMES_
-#undef GTEST_10_TYPENAMES_
-
-#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
-#undef GTEST_BY_REF_
-#undef GTEST_ADD_REF_
-#undef GTEST_TUPLE_ELEMENT_
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+++ /dev/null
-// This file was GENERATED by command:
-// pump.py gtest-type-util.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-// Type utilities needed for implementing typed and type-parameterized
-// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-// Currently we support at most 50 types in a list, and at most 50
-// type-parameterized tests in one type-parameterized test case.
-// Please contact googletestframework@googlegroups.com if you need
-// more.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-string.h"
-
-// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
-// libstdc++ (which is where cxxabi.h comes from).
-# ifdef __GLIBCXX__
-# include <cxxabi.h>
-# elif defined(__HP_aCC)
-# include <acxx_demangle.h>
-# endif // __GLIBCXX__
-
-namespace testing {
-namespace internal {
-
-// GetTypeName<T>() returns a human-readable name of type T.
-// NB: This function is also used in Google Mock, so don't move it inside of
-// the typed-test-only section below.
-template <typename T>
-String GetTypeName() {
-# if GTEST_HAS_RTTI
-
- const char* const name = typeid(T).name();
-# if defined(__GLIBCXX__) || defined(__HP_aCC)
- int status = 0;
- // gcc's implementation of typeid(T).name() mangles the type name,
- // so we have to demangle it.
-# ifdef __GLIBCXX__
- using abi::__cxa_demangle;
-# endif // __GLIBCXX__
- char* const readable_name = __cxa_demangle(name, 0, 0, &status);
- const String name_str(status == 0 ? readable_name : name);
- free(readable_name);
- return name_str;
-# else
- return name;
-# endif // __GLIBCXX__ || __HP_aCC
-
-# else
-
- return "<type>";
-
-# endif // GTEST_HAS_RTTI
-}
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
-// type. This can be used as a compile-time assertion to ensure that
-// two types are equal.
-
-template <typename T1, typename T2>
-struct AssertTypeEq;
-
-template <typename T>
-struct AssertTypeEq<T, T> {
- typedef bool type;
-};
-
-// A unique type used as the default value for the arguments of class
-// template Types. This allows us to simulate variadic templates
-// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
-// support directly.
-struct None {};
-
-// The following family of struct and struct templates are used to
-// represent type lists. In particular, TypesN<T1, T2, ..., TN>
-// represents a type list with N types (T1, T2, ..., and TN) in it.
-// Except for Types0, every struct in the family has two member types:
-// Head for the first type in the list, and Tail for the rest of the
-// list.
-
-// The empty type list.
-struct Types0 {};
-
-// Type lists of length 1, 2, 3, and so on.
-
-template <typename T1>
-struct Types1 {
- typedef T1 Head;
- typedef Types0 Tail;
-};
-template <typename T1, typename T2>
-struct Types2 {
- typedef T1 Head;
- typedef Types1<T2> Tail;
-};
-
-template <typename T1, typename T2, typename T3>
-struct Types3 {
- typedef T1 Head;
- typedef Types2<T2, T3> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types4 {
- typedef T1 Head;
- typedef Types3<T2, T3, T4> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types5 {
- typedef T1 Head;
- typedef Types4<T2, T3, T4, T5> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-struct Types6 {
- typedef T1 Head;
- typedef Types5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-struct Types7 {
- typedef T1 Head;
- typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-struct Types8 {
- typedef T1 Head;
- typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-struct Types9 {
- typedef T1 Head;
- typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types10 {
- typedef T1 Head;
- typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-struct Types11 {
- typedef T1 Head;
- typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-struct Types12 {
- typedef T1 Head;
- typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-struct Types13 {
- typedef T1 Head;
- typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-struct Types14 {
- typedef T1 Head;
- typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types15 {
- typedef T1 Head;
- typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-struct Types16 {
- typedef T1 Head;
- typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-struct Types17 {
- typedef T1 Head;
- typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-struct Types18 {
- typedef T1 Head;
- typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-struct Types19 {
- typedef T1 Head;
- typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types20 {
- typedef T1 Head;
- typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-struct Types21 {
- typedef T1 Head;
- typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-struct Types22 {
- typedef T1 Head;
- typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-struct Types23 {
- typedef T1 Head;
- typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-struct Types24 {
- typedef T1 Head;
- typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types25 {
- typedef T1 Head;
- typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-struct Types26 {
- typedef T1 Head;
- typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-struct Types27 {
- typedef T1 Head;
- typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-struct Types28 {
- typedef T1 Head;
- typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-struct Types29 {
- typedef T1 Head;
- typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types30 {
- typedef T1 Head;
- typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-struct Types31 {
- typedef T1 Head;
- typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-struct Types32 {
- typedef T1 Head;
- typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-struct Types33 {
- typedef T1 Head;
- typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-struct Types34 {
- typedef T1 Head;
- typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types35 {
- typedef T1 Head;
- typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-struct Types36 {
- typedef T1 Head;
- typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-struct Types37 {
- typedef T1 Head;
- typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-struct Types38 {
- typedef T1 Head;
- typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-struct Types39 {
- typedef T1 Head;
- typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types40 {
- typedef T1 Head;
- typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-struct Types41 {
- typedef T1 Head;
- typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-struct Types42 {
- typedef T1 Head;
- typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-struct Types43 {
- typedef T1 Head;
- typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-struct Types44 {
- typedef T1 Head;
- typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types45 {
- typedef T1 Head;
- typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-struct Types46 {
- typedef T1 Head;
- typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-struct Types47 {
- typedef T1 Head;
- typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-struct Types48 {
- typedef T1 Head;
- typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-struct Types49 {
- typedef T1 Head;
- typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-struct Types50 {
- typedef T1 Head;
- typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-} // namespace internal
-
-// We don't want to require the users to write TypesN<...> directly,
-// as that would require them to count the length. Types<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Types<int>
-// will appear as Types<int, None, None, ..., None> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Types<T1, ..., TN>, and Google Test will translate
-// that to TypesN<T1, ..., TN> internally to make error messages
-// readable. The translation is done by the 'type' member of the
-// Types template.
-template <typename T1 = internal::None, typename T2 = internal::None,
- typename T3 = internal::None, typename T4 = internal::None,
- typename T5 = internal::None, typename T6 = internal::None,
- typename T7 = internal::None, typename T8 = internal::None,
- typename T9 = internal::None, typename T10 = internal::None,
- typename T11 = internal::None, typename T12 = internal::None,
- typename T13 = internal::None, typename T14 = internal::None,
- typename T15 = internal::None, typename T16 = internal::None,
- typename T17 = internal::None, typename T18 = internal::None,
- typename T19 = internal::None, typename T20 = internal::None,
- typename T21 = internal::None, typename T22 = internal::None,
- typename T23 = internal::None, typename T24 = internal::None,
- typename T25 = internal::None, typename T26 = internal::None,
- typename T27 = internal::None, typename T28 = internal::None,
- typename T29 = internal::None, typename T30 = internal::None,
- typename T31 = internal::None, typename T32 = internal::None,
- typename T33 = internal::None, typename T34 = internal::None,
- typename T35 = internal::None, typename T36 = internal::None,
- typename T37 = internal::None, typename T38 = internal::None,
- typename T39 = internal::None, typename T40 = internal::None,
- typename T41 = internal::None, typename T42 = internal::None,
- typename T43 = internal::None, typename T44 = internal::None,
- typename T45 = internal::None, typename T46 = internal::None,
- typename T47 = internal::None, typename T48 = internal::None,
- typename T49 = internal::None, typename T50 = internal::None>
-struct Types {
- typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Types<internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types0 type;
-};
-template <typename T1>
-struct Types<T1, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types1<T1> type;
-};
-template <typename T1, typename T2>
-struct Types<T1, T2, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types2<T1, T2> type;
-};
-template <typename T1, typename T2, typename T3>
-struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types3<T1, T2, T3> type;
-};
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types4<T1, T2, T3, T4> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types5<T1, T2, T3, T4, T5> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, internal::None, internal::None, internal::None> {
- typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, T48, internal::None, internal::None> {
- typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, T48, T49, internal::None> {
- typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-namespace internal {
-
-# define GTEST_TEMPLATE_ template <typename T> class
-
-// The template "selector" struct TemplateSel<Tmpl> is used to
-// represent Tmpl, which must be a class template with one type
-// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
-// as the type Tmpl<T>. This allows us to actually instantiate the
-// template "selected" by TemplateSel<Tmpl>.
-//
-// This trick is necessary for simulating typedef for class templates,
-// which C++ doesn't support directly.
-template <GTEST_TEMPLATE_ Tmpl>
-struct TemplateSel {
- template <typename T>
- struct Bind {
- typedef Tmpl<T> type;
- };
-};
-
-# define GTEST_BIND_(TmplSel, T) \
- TmplSel::template Bind<T>::type
-
-// A unique struct template used as the default value for the
-// arguments of class template Templates. This allows us to simulate
-// variadic templates (e.g. Templates<int>, Templates<int, double>,
-// and etc), which C++ doesn't support directly.
-template <typename T>
-struct NoneT {};
-
-// The following family of struct and struct templates are used to
-// represent template lists. In particular, TemplatesN<T1, T2, ...,
-// TN> represents a list of N templates (T1, T2, ..., and TN). Except
-// for Templates0, every struct in the family has two member types:
-// Head for the selector of the first template in the list, and Tail
-// for the rest of the list.
-
-// The empty template list.
-struct Templates0 {};
-
-// Template lists of length 1, 2, 3, and so on.
-
-template <GTEST_TEMPLATE_ T1>
-struct Templates1 {
- typedef TemplateSel<T1> Head;
- typedef Templates0 Tail;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates2 {
- typedef TemplateSel<T1> Head;
- typedef Templates1<T2> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates3 {
- typedef TemplateSel<T1> Head;
- typedef Templates2<T2, T3> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4>
-struct Templates4 {
- typedef TemplateSel<T1> Head;
- typedef Templates3<T2, T3, T4> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates5 {
- typedef TemplateSel<T1> Head;
- typedef Templates4<T2, T3, T4, T5> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates6 {
- typedef TemplateSel<T1> Head;
- typedef Templates5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7>
-struct Templates7 {
- typedef TemplateSel<T1> Head;
- typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates8 {
- typedef TemplateSel<T1> Head;
- typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates9 {
- typedef TemplateSel<T1> Head;
- typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10>
-struct Templates10 {
- typedef TemplateSel<T1> Head;
- typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates11 {
- typedef TemplateSel<T1> Head;
- typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates12 {
- typedef TemplateSel<T1> Head;
- typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13>
-struct Templates13 {
- typedef TemplateSel<T1> Head;
- typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates14 {
- typedef TemplateSel<T1> Head;
- typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates15 {
- typedef TemplateSel<T1> Head;
- typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16>
-struct Templates16 {
- typedef TemplateSel<T1> Head;
- typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates17 {
- typedef TemplateSel<T1> Head;
- typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates18 {
- typedef TemplateSel<T1> Head;
- typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19>
-struct Templates19 {
- typedef TemplateSel<T1> Head;
- typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates20 {
- typedef TemplateSel<T1> Head;
- typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates21 {
- typedef TemplateSel<T1> Head;
- typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22>
-struct Templates22 {
- typedef TemplateSel<T1> Head;
- typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates23 {
- typedef TemplateSel<T1> Head;
- typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates24 {
- typedef TemplateSel<T1> Head;
- typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25>
-struct Templates25 {
- typedef TemplateSel<T1> Head;
- typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates26 {
- typedef TemplateSel<T1> Head;
- typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates27 {
- typedef TemplateSel<T1> Head;
- typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28>
-struct Templates28 {
- typedef TemplateSel<T1> Head;
- typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates29 {
- typedef TemplateSel<T1> Head;
- typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates30 {
- typedef TemplateSel<T1> Head;
- typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31>
-struct Templates31 {
- typedef TemplateSel<T1> Head;
- typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates32 {
- typedef TemplateSel<T1> Head;
- typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates33 {
- typedef TemplateSel<T1> Head;
- typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34>
-struct Templates34 {
- typedef TemplateSel<T1> Head;
- typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates35 {
- typedef TemplateSel<T1> Head;
- typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates36 {
- typedef TemplateSel<T1> Head;
- typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37>
-struct Templates37 {
- typedef TemplateSel<T1> Head;
- typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates38 {
- typedef TemplateSel<T1> Head;
- typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates39 {
- typedef TemplateSel<T1> Head;
- typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40>
-struct Templates40 {
- typedef TemplateSel<T1> Head;
- typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates41 {
- typedef TemplateSel<T1> Head;
- typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates42 {
- typedef TemplateSel<T1> Head;
- typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43>
-struct Templates43 {
- typedef TemplateSel<T1> Head;
- typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates44 {
- typedef TemplateSel<T1> Head;
- typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates45 {
- typedef TemplateSel<T1> Head;
- typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46>
-struct Templates46 {
- typedef TemplateSel<T1> Head;
- typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates47 {
- typedef TemplateSel<T1> Head;
- typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates48 {
- typedef TemplateSel<T1> Head;
- typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49>
-struct Templates49 {
- typedef TemplateSel<T1> Head;
- typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
-struct Templates50 {
- typedef TemplateSel<T1> Head;
- typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-// We don't want to require the users to write TemplatesN<...> directly,
-// as that would require them to count the length. Templates<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Templates<list>
-// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Templates<T1, ..., TN>, and Google Test will translate
-// that to TemplatesN<T1, ..., TN> internally to make error messages
-// readable. The translation is done by the 'type' member of the
-// Templates template.
-template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
- GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
- GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
- GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
- GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
- GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
- GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
- GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
- GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
- GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
- GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
- GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
- GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
- GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
- GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
- GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
- GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
- GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
- GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
- GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
- GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
- GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
- GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
- GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
- GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
-struct Templates {
- typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates0 type;
-};
-template <GTEST_TEMPLATE_ T1>
-struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates1<T1> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates2<T1, T2> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates3<T1, T2, T3> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4>
-struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates4<T1, T2, T3, T4> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates5<T1, T2, T3, T4, T5> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates6<T1, T2, T3, T4, T5, T6> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, NoneT, NoneT, NoneT> {
- typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, T48, NoneT, NoneT> {
- typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, T48, T49, NoneT> {
- typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-// The TypeList template makes it possible to use either a single type
-// or a Types<...> list in TYPED_TEST_CASE() and
-// INSTANTIATE_TYPED_TEST_CASE_P().
-
-template <typename T>
-struct TypeList { typedef Types1<T> type; };
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> > {
- typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
-};
-
-#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule@google.com (Markus Heule)
-//
-// Google C++ Testing Framework (Google Test)
-//
-// Sometimes it's desirable to build Google Test by compiling a single file.
-// This file serves this purpose.
-
-// This line ensures that gtest.h can be compiled on its own, even
-// when it's fused.
-#include "gtest/gtest.h"
-
-// The following lines pull in the real gtest *.cc files.
-#include "src/gtest.cc"
-#include "src/gtest-death-test.cc"
-#include "src/gtest-filepath.cc"
-#include "src/gtest-port.cc"
-#include "src/gtest-printers.cc"
-#include "src/gtest-test-part.cc"
-#include "src/gtest-typed-test.cc"
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
-//
-// This file implements death tests.
-
-#ifdef __GNUC__
-#pragma GCC system_header
-#endif
-
-#include "gtest/gtest-death-test.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_DEATH_TEST
-
-# if GTEST_OS_MAC
-# include <crt_externs.h>
-# endif // GTEST_OS_MAC
-
-# include <errno.h>
-# include <fcntl.h>
-# include <limits.h>
-# include <stdarg.h>
-
-# if GTEST_OS_WINDOWS
-# include <windows.h>
-# else
-# include <sys/mman.h>
-# include <sys/wait.h>
-# endif // GTEST_OS_WINDOWS
-
-#endif // GTEST_HAS_DEATH_TEST
-
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-// Constants.
-
-// The default death test style.
-static const char kDefaultDeathTestStyle[] = "fast";
-
-GTEST_DEFINE_string_(
- death_test_style,
- internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
- "Indicates how to run a death test in a forked child process: "
- "\"threadsafe\" (child process re-executes the test binary "
- "from the beginning, running only the specific death test) or "
- "\"fast\" (child process runs the death test immediately "
- "after forking).");
-
-GTEST_DEFINE_bool_(
- death_test_use_fork,
- internal::BoolFromGTestEnv("death_test_use_fork", false),
- "Instructs to use fork()/_exit() instead of clone() in death tests. "
- "Ignored and always uses fork() on POSIX systems where clone() is not "
- "implemented. Useful when running under valgrind or similar tools if "
- "those do not support clone(). Valgrind 3.3.1 will just fail if "
- "it sees an unsupported combination of clone() flags. "
- "It is not recommended to use this flag w/o valgrind though it will "
- "work in 99% of the cases. Once valgrind is fixed, this flag will "
- "most likely be removed.");
-
-namespace internal {
-GTEST_DEFINE_string_(
- internal_run_death_test, "",
- "Indicates the file, line number, temporal index of "
- "the single death test to run, and a file descriptor to "
- "which a success code may be sent, all separated by "
- "colons. This flag is specified if and only if the current "
- "process is a sub-process launched for running a thread-safe "
- "death test. FOR INTERNAL USE ONLY.");
-} // namespace internal
-
-#if GTEST_HAS_DEATH_TEST
-
-// ExitedWithCode constructor.
-ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
-}
-
-// ExitedWithCode function-call operator.
-bool ExitedWithCode::operator()(int exit_status) const {
-# if GTEST_OS_WINDOWS
-
- return exit_status == exit_code_;
-
-# else
-
- return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
-
-# endif // GTEST_OS_WINDOWS
-}
-
-# if !GTEST_OS_WINDOWS
-// KilledBySignal constructor.
-KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
-}
-
-// KilledBySignal function-call operator.
-bool KilledBySignal::operator()(int exit_status) const {
- return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
-}
-# endif // !GTEST_OS_WINDOWS
-
-namespace internal {
-
-// Utilities needed for death tests.
-
-// Generates a textual description of a given exit code, in the format
-// specified by wait(2).
-static String ExitSummary(int exit_code) {
- Message m;
-
-# if GTEST_OS_WINDOWS
-
- m << "Exited with exit status " << exit_code;
-
-# else
-
- if (WIFEXITED(exit_code)) {
- m << "Exited with exit status " << WEXITSTATUS(exit_code);
- } else if (WIFSIGNALED(exit_code)) {
- m << "Terminated by signal " << WTERMSIG(exit_code);
- }
-# ifdef WCOREDUMP
- if (WCOREDUMP(exit_code)) {
- m << " (core dumped)";
- }
-# endif
-# endif // GTEST_OS_WINDOWS
-
- return m.GetString();
-}
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-bool ExitedUnsuccessfully(int exit_status) {
- return !ExitedWithCode(0)(exit_status);
-}
-
-# if !GTEST_OS_WINDOWS
-// Generates a textual failure message when a death test finds more than
-// one thread running, or cannot determine the number of threads, prior
-// to executing the given statement. It is the responsibility of the
-// caller not to pass a thread_count of 1.
-static String DeathTestThreadWarning(size_t thread_count) {
- Message msg;
- msg << "Death tests use fork(), which is unsafe particularly"
- << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
- if (thread_count == 0)
- msg << "couldn't detect the number of threads.";
- else
- msg << "detected " << thread_count << " threads.";
- return msg.GetString();
-}
-# endif // !GTEST_OS_WINDOWS
-
-// Flag characters for reporting a death test that did not die.
-static const char kDeathTestLived = 'L';
-static const char kDeathTestReturned = 'R';
-static const char kDeathTestThrew = 'T';
-static const char kDeathTestInternalError = 'I';
-
-// An enumeration describing all of the possible ways that a death test can
-// conclude. DIED means that the process died while executing the test
-// code; LIVED means that process lived beyond the end of the test code;
-// RETURNED means that the test statement attempted to execute a return
-// statement, which is not allowed; THREW means that the test statement
-// returned control by throwing an exception. IN_PROGRESS means the test
-// has not yet concluded.
-// TODO(vladl@google.com): Unify names and possibly values for
-// AbortReason, DeathTestOutcome, and flag characters above.
-enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
-
-// Routine for aborting the program which is safe to call from an
-// exec-style death test child process, in which case the error
-// message is propagated back to the parent process. Otherwise, the
-// message is simply printed to stderr. In either case, the program
-// then exits with status 1.
-void DeathTestAbort(const String& message) {
- // On a POSIX system, this function may be called from a threadsafe-style
- // death test child process, which operates on a very small stack. Use
- // the heap for any additional non-minuscule memory requirements.
- const InternalRunDeathTestFlag* const flag =
- GetUnitTestImpl()->internal_run_death_test_flag();
- if (flag != NULL) {
- FILE* parent = posix::FDOpen(flag->write_fd(), "w");
- fputc(kDeathTestInternalError, parent);
- fprintf(parent, "%s", message.c_str());
- fflush(parent);
- _exit(1);
- } else {
- fprintf(stderr, "%s", message.c_str());
- fflush(stderr);
- posix::Abort();
- }
-}
-
-// A replacement for CHECK that calls DeathTestAbort if the assertion
-// fails.
-# define GTEST_DEATH_TEST_CHECK_(expression) \
- do { \
- if (!::testing::internal::IsTrue(expression)) { \
- DeathTestAbort(::testing::internal::String::Format( \
- "CHECK failed: File %s, line %d: %s", \
- __FILE__, __LINE__, #expression)); \
- } \
- } while (::testing::internal::AlwaysFalse())
-
-// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
-// evaluating any system call that fulfills two conditions: it must return
-// -1 on failure, and set errno to EINTR when it is interrupted and
-// should be tried again. The macro expands to a loop that repeatedly
-// evaluates the expression as long as it evaluates to -1 and sets
-// errno to EINTR. If the expression evaluates to -1 but errno is
-// something other than EINTR, DeathTestAbort is called.
-# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
- do { \
- int gtest_retval; \
- do { \
- gtest_retval = (expression); \
- } while (gtest_retval == -1 && errno == EINTR); \
- if (gtest_retval == -1) { \
- DeathTestAbort(::testing::internal::String::Format( \
- "CHECK failed: File %s, line %d: %s != -1", \
- __FILE__, __LINE__, #expression)); \
- } \
- } while (::testing::internal::AlwaysFalse())
-
-// Returns the message describing the last system error in errno.
-String GetLastErrnoDescription() {
- return String(errno == 0 ? "" : posix::StrError(errno));
-}
-
-// This is called from a death test parent process to read a failure
-// message from the death test child process and log it with the FATAL
-// severity. On Windows, the message is read from a pipe handle. On other
-// platforms, it is read from a file descriptor.
-static void FailFromInternalError(int fd) {
- Message error;
- char buffer[256];
- int num_read;
-
- do {
- while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
- buffer[num_read] = '\0';
- error << buffer;
- }
- } while (num_read == -1 && errno == EINTR);
-
- if (num_read == 0) {
- GTEST_LOG_(FATAL) << error.GetString();
- } else {
- const int last_error = errno;
- GTEST_LOG_(FATAL) << "Error while reading death test internal: "
- << GetLastErrnoDescription() << " [" << last_error << "]";
- }
-}
-
-// Death test constructor. Increments the running death test count
-// for the current test.
-DeathTest::DeathTest() {
- TestInfo* const info = GetUnitTestImpl()->current_test_info();
- if (info == NULL) {
- DeathTestAbort("Cannot run a death test outside of a TEST or "
- "TEST_F construct");
- }
-}
-
-// Creates and returns a death test by dispatching to the current
-// death test factory.
-bool DeathTest::Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test) {
- return GetUnitTestImpl()->death_test_factory()->Create(
- statement, regex, file, line, test);
-}
-
-const char* DeathTest::LastMessage() {
- return last_death_test_message_.c_str();
-}
-
-void DeathTest::set_last_death_test_message(const String& message) {
- last_death_test_message_ = message;
-}
-
-String DeathTest::last_death_test_message_;
-
-// Provides cross platform implementation for some death functionality.
-class DeathTestImpl : public DeathTest {
- protected:
- DeathTestImpl(const char* a_statement, const RE* a_regex)
- : statement_(a_statement),
- regex_(a_regex),
- spawned_(false),
- status_(-1),
- outcome_(IN_PROGRESS),
- read_fd_(-1),
- write_fd_(-1) {}
-
- // read_fd_ is expected to be closed and cleared by a derived class.
- ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
-
- void Abort(AbortReason reason);
- virtual bool Passed(bool status_ok);
-
- const char* statement() const { return statement_; }
- const RE* regex() const { return regex_; }
- bool spawned() const { return spawned_; }
- void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
- int status() const { return status_; }
- void set_status(int a_status) { status_ = a_status; }
- DeathTestOutcome outcome() const { return outcome_; }
- void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
- int read_fd() const { return read_fd_; }
- void set_read_fd(int fd) { read_fd_ = fd; }
- int write_fd() const { return write_fd_; }
- void set_write_fd(int fd) { write_fd_ = fd; }
-
- // Called in the parent process only. Reads the result code of the death
- // test child process via a pipe, interprets it to set the outcome_
- // member, and closes read_fd_. Outputs diagnostics and terminates in
- // case of unexpected codes.
- void ReadAndInterpretStatusByte();
-
- private:
- // The textual content of the code this object is testing. This class
- // doesn't own this string and should not attempt to delete it.
- const char* const statement_;
- // The regular expression which test output must match. DeathTestImpl
- // doesn't own this object and should not attempt to delete it.
- const RE* const regex_;
- // True if the death test child process has been successfully spawned.
- bool spawned_;
- // The exit status of the child process.
- int status_;
- // How the death test concluded.
- DeathTestOutcome outcome_;
- // Descriptor to the read end of the pipe to the child process. It is
- // always -1 in the child process. The child keeps its write end of the
- // pipe in write_fd_.
- int read_fd_;
- // Descriptor to the child's write end of the pipe to the parent process.
- // It is always -1 in the parent process. The parent keeps its end of the
- // pipe in read_fd_.
- int write_fd_;
-};
-
-// Called in the parent process only. Reads the result code of the death
-// test child process via a pipe, interprets it to set the outcome_
-// member, and closes read_fd_. Outputs diagnostics and terminates in
-// case of unexpected codes.
-void DeathTestImpl::ReadAndInterpretStatusByte() {
- char flag;
- int bytes_read;
-
- // The read() here blocks until data is available (signifying the
- // failure of the death test) or until the pipe is closed (signifying
- // its success), so it's okay to call this in the parent before
- // the child process has exited.
- do {
- bytes_read = posix::Read(read_fd(), &flag, 1);
- } while (bytes_read == -1 && errno == EINTR);
-
- if (bytes_read == 0) {
- set_outcome(DIED);
- } else if (bytes_read == 1) {
- switch (flag) {
- case kDeathTestReturned:
- set_outcome(RETURNED);
- break;
- case kDeathTestThrew:
- set_outcome(THREW);
- break;
- case kDeathTestLived:
- set_outcome(LIVED);
- break;
- case kDeathTestInternalError:
- FailFromInternalError(read_fd()); // Does not return.
- break;
- default:
- GTEST_LOG_(FATAL) << "Death test child process reported "
- << "unexpected status byte ("
- << static_cast<unsigned int>(flag) << ")";
- }
- } else {
- GTEST_LOG_(FATAL) << "Read from death test child process failed: "
- << GetLastErrnoDescription();
- }
- GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
- set_read_fd(-1);
-}
-
-// Signals that the death test code which should have exited, didn't.
-// Should be called only in a death test child process.
-// Writes a status byte to the child's status file descriptor, then
-// calls _exit(1).
-void DeathTestImpl::Abort(AbortReason reason) {
- // The parent process considers the death test to be a failure if
- // it finds any data in our pipe. So, here we write a single flag byte
- // to the pipe, then exit.
- const char status_ch =
- reason == TEST_DID_NOT_DIE ? kDeathTestLived :
- reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
-
- GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
- // We are leaking the descriptor here because on some platforms (i.e.,
- // when built as Windows DLL), destructors of global objects will still
- // run after calling _exit(). On such systems, write_fd_ will be
- // indirectly closed from the destructor of UnitTestImpl, causing double
- // close if it is also closed here. On debug configurations, double close
- // may assert. As there are no in-process buffers to flush here, we are
- // relying on the OS to close the descriptor after the process terminates
- // when the destructors are not run.
- _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
-}
-
-// Returns an indented copy of stderr output for a death test.
-// This makes distinguishing death test output lines from regular log lines
-// much easier.
-static ::std::string FormatDeathTestOutput(const ::std::string& output) {
- ::std::string ret;
- for (size_t at = 0; ; ) {
- const size_t line_end = output.find('\n', at);
- ret += "[ DEATH ] ";
- if (line_end == ::std::string::npos) {
- ret += output.substr(at);
- break;
- }
- ret += output.substr(at, line_end + 1 - at);
- at = line_end + 1;
- }
- return ret;
-}
-
-// Assesses the success or failure of a death test, using both private
-// members which have previously been set, and one argument:
-//
-// Private data members:
-// outcome: An enumeration describing how the death test
-// concluded: DIED, LIVED, THREW, or RETURNED. The death test
-// fails in the latter three cases.
-// status: The exit status of the child process. On *nix, it is in the
-// in the format specified by wait(2). On Windows, this is the
-// value supplied to the ExitProcess() API or a numeric code
-// of the exception that terminated the program.
-// regex: A regular expression object to be applied to
-// the test's captured standard error output; the death test
-// fails if it does not match.
-//
-// Argument:
-// status_ok: true if exit_status is acceptable in the context of
-// this particular death test, which fails if it is false
-//
-// Returns true iff all of the above conditions are met. Otherwise, the
-// first failing condition, in the order given above, is the one that is
-// reported. Also sets the last death test message string.
-bool DeathTestImpl::Passed(bool status_ok) {
- if (!spawned())
- return false;
-
- const String error_message = GetCapturedStderr();
-
- bool success = false;
- Message buffer;
-
- buffer << "Death test: " << statement() << "\n";
- switch (outcome()) {
- case LIVED:
- buffer << " Result: failed to die.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case THREW:
- buffer << " Result: threw an exception.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case RETURNED:
- buffer << " Result: illegal return in test statement.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case DIED:
- if (status_ok) {
- const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
- if (matched) {
- success = true;
- } else {
- buffer << " Result: died but not with expected error.\n"
- << " Expected: " << regex()->pattern() << "\n"
- << "Actual msg:\n" << FormatDeathTestOutput(error_message);
- }
- } else {
- buffer << " Result: died but not with expected exit code:\n"
- << " " << ExitSummary(status()) << "\n"
- << "Actual msg:\n" << FormatDeathTestOutput(error_message);
- }
- break;
- case IN_PROGRESS:
- default:
- GTEST_LOG_(FATAL)
- << "DeathTest::Passed somehow called before conclusion of test";
- }
-
- DeathTest::set_last_death_test_message(buffer.GetString());
- return success;
-}
-
-# if GTEST_OS_WINDOWS
-// WindowsDeathTest implements death tests on Windows. Due to the
-// specifics of starting new processes on Windows, death tests there are
-// always threadsafe, and Google Test considers the
-// --gtest_death_test_style=fast setting to be equivalent to
-// --gtest_death_test_style=threadsafe there.
-//
-// A few implementation notes: Like the Linux version, the Windows
-// implementation uses pipes for child-to-parent communication. But due to
-// the specifics of pipes on Windows, some extra steps are required:
-//
-// 1. The parent creates a communication pipe and stores handles to both
-// ends of it.
-// 2. The parent starts the child and provides it with the information
-// necessary to acquire the handle to the write end of the pipe.
-// 3. The child acquires the write end of the pipe and signals the parent
-// using a Windows event.
-// 4. Now the parent can release the write end of the pipe on its side. If
-// this is done before step 3, the object's reference count goes down to
-// 0 and it is destroyed, preventing the child from acquiring it. The
-// parent now has to release it, or read operations on the read end of
-// the pipe will not return when the child terminates.
-// 5. The parent reads child's output through the pipe (outcome code and
-// any possible error messages) from the pipe, and its stderr and then
-// determines whether to fail the test.
-//
-// Note: to distinguish Win32 API calls from the local method and function
-// calls, the former are explicitly resolved in the global namespace.
-//
-class WindowsDeathTest : public DeathTestImpl {
- public:
- WindowsDeathTest(const char* a_statement,
- const RE* a_regex,
- const char* file,
- int line)
- : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
-
- // All of these virtual functions are inherited from DeathTest.
- virtual int Wait();
- virtual TestRole AssumeRole();
-
- private:
- // The name of the file in which the death test is located.
- const char* const file_;
- // The line number on which the death test is located.
- const int line_;
- // Handle to the write end of the pipe to the child process.
- AutoHandle write_handle_;
- // Child process handle.
- AutoHandle child_handle_;
- // Event the child process uses to signal the parent that it has
- // acquired the handle to the write end of the pipe. After seeing this
- // event the parent can release its own handles to make sure its
- // ReadFile() calls return when the child terminates.
- AutoHandle event_handle_;
-};
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists. As a side effect, sets the
-// outcome data member.
-int WindowsDeathTest::Wait() {
- if (!spawned())
- return 0;
-
- // Wait until the child either signals that it has acquired the write end
- // of the pipe or it dies.
- const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
- switch (::WaitForMultipleObjects(2,
- wait_handles,
- FALSE, // Waits for any of the handles.
- INFINITE)) {
- case WAIT_OBJECT_0:
- case WAIT_OBJECT_0 + 1:
- break;
- default:
- GTEST_DEATH_TEST_CHECK_(false); // Should not get here.
- }
-
- // The child has acquired the write end of the pipe or exited.
- // We release the handle on our side and continue.
- write_handle_.Reset();
- event_handle_.Reset();
-
- ReadAndInterpretStatusByte();
-
- // Waits for the child process to exit if it haven't already. This
- // returns immediately if the child has already exited, regardless of
- // whether previous calls to WaitForMultipleObjects synchronized on this
- // handle or not.
- GTEST_DEATH_TEST_CHECK_(
- WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
- INFINITE));
- DWORD status_code;
- GTEST_DEATH_TEST_CHECK_(
- ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
- child_handle_.Reset();
- set_status(static_cast<int>(status_code));
- return status();
-}
-
-// The AssumeRole process for a Windows death test. It creates a child
-// process with the same executable as the current process to run the
-// death test. The child process is given the --gtest_filter and
-// --gtest_internal_run_death_test flags such that it knows to run the
-// current death test only.
-DeathTest::TestRole WindowsDeathTest::AssumeRole() {
- const UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const TestInfo* const info = impl->current_test_info();
- const int death_test_index = info->result()->death_test_count();
-
- if (flag != NULL) {
- // ParseInternalRunDeathTestFlag() has performed all the necessary
- // processing.
- set_write_fd(flag->write_fd());
- return EXECUTE_TEST;
- }
-
- // WindowsDeathTest uses an anonymous pipe to communicate results of
- // a death test.
- SECURITY_ATTRIBUTES handles_are_inheritable = {
- sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- HANDLE read_handle, write_handle;
- GTEST_DEATH_TEST_CHECK_(
- ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
- 0) // Default buffer size.
- != FALSE);
- set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
- O_RDONLY));
- write_handle_.Reset(write_handle);
- event_handle_.Reset(::CreateEvent(
- &handles_are_inheritable,
- TRUE, // The event will automatically reset to non-signaled state.
- FALSE, // The initial state is non-signalled.
- NULL)); // The even is unnamed.
- GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
- const String filter_flag = String::Format("--%s%s=%s.%s",
- GTEST_FLAG_PREFIX_, kFilterFlag,
- info->test_case_name(),
- info->name());
- const String internal_flag = String::Format(
- "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
- GTEST_FLAG_PREFIX_,
- kInternalRunDeathTestFlag,
- file_, line_,
- death_test_index,
- static_cast<unsigned int>(::GetCurrentProcessId()),
- // size_t has the same with as pointers on both 32-bit and 64-bit
- // Windows platforms.
- // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
- reinterpret_cast<size_t>(write_handle),
- reinterpret_cast<size_t>(event_handle_.Get()));
-
- char executable_path[_MAX_PATH + 1]; // NOLINT
- GTEST_DEATH_TEST_CHECK_(
- _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
- executable_path,
- _MAX_PATH));
-
- String command_line = String::Format("%s %s \"%s\"",
- ::GetCommandLineA(),
- filter_flag.c_str(),
- internal_flag.c_str());
-
- DeathTest::set_last_death_test_message("");
-
- CaptureStderr();
- // Flush the log buffers since the log streams are shared with the child.
- FlushInfoLog();
-
- // The child process will share the standard handles with the parent.
- STARTUPINFOA startup_info;
- memset(&startup_info, 0, sizeof(STARTUPINFO));
- startup_info.dwFlags = STARTF_USESTDHANDLES;
- startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
- startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
- startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
-
- PROCESS_INFORMATION process_info;
- GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
- executable_path,
- const_cast<char*>(command_line.c_str()),
- NULL, // Retuned process handle is not inheritable.
- NULL, // Retuned thread handle is not inheritable.
- TRUE, // Child inherits all inheritable handles (for write_handle_).
- 0x0, // Default creation flags.
- NULL, // Inherit the parent's environment.
- UnitTest::GetInstance()->original_working_dir(),
- &startup_info,
- &process_info) != FALSE);
- child_handle_.Reset(process_info.hProcess);
- ::CloseHandle(process_info.hThread);
- set_spawned(true);
- return OVERSEE_TEST;
-}
-# else // We are not on Windows.
-
-// ForkingDeathTest provides implementations for most of the abstract
-// methods of the DeathTest interface. Only the AssumeRole method is
-// left undefined.
-class ForkingDeathTest : public DeathTestImpl {
- public:
- ForkingDeathTest(const char* statement, const RE* regex);
-
- // All of these virtual functions are inherited from DeathTest.
- virtual int Wait();
-
- protected:
- void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
-
- private:
- // PID of child process during death test; 0 in the child process itself.
- pid_t child_pid_;
-};
-
-// Constructs a ForkingDeathTest.
-ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
- : DeathTestImpl(a_statement, a_regex),
- child_pid_(-1) {}
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists. As a side effect, sets the
-// outcome data member.
-int ForkingDeathTest::Wait() {
- if (!spawned())
- return 0;
-
- ReadAndInterpretStatusByte();
-
- int status_value;
- GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
- set_status(status_value);
- return status_value;
-}
-
-// A concrete death test class that forks, then immediately runs the test
-// in the child process.
-class NoExecDeathTest : public ForkingDeathTest {
- public:
- NoExecDeathTest(const char* a_statement, const RE* a_regex) :
- ForkingDeathTest(a_statement, a_regex) { }
- virtual TestRole AssumeRole();
-};
-
-// The AssumeRole process for a fork-and-run death test. It implements a
-// straightforward fork, with a simple pipe to transmit the status byte.
-DeathTest::TestRole NoExecDeathTest::AssumeRole() {
- const size_t thread_count = GetThreadCount();
- if (thread_count != 1) {
- GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
- }
-
- int pipe_fd[2];
- GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
-
- DeathTest::set_last_death_test_message("");
- CaptureStderr();
- // When we fork the process below, the log file buffers are copied, but the
- // file descriptors are shared. We flush all log files here so that closing
- // the file descriptors in the child process doesn't throw off the
- // synchronization between descriptors and buffers in the parent process.
- // This is as close to the fork as possible to avoid a race condition in case
- // there are multiple threads running before the death test, and another
- // thread writes to the log file.
- FlushInfoLog();
-
- const pid_t child_pid = fork();
- GTEST_DEATH_TEST_CHECK_(child_pid != -1);
- set_child_pid(child_pid);
- if (child_pid == 0) {
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
- set_write_fd(pipe_fd[1]);
- // Redirects all logging to stderr in the child process to prevent
- // concurrent writes to the log files. We capture stderr in the parent
- // process and append the child process' output to a log.
- LogToStderr();
- // Event forwarding to the listeners of event listener API mush be shut
- // down in death test subprocesses.
- GetUnitTestImpl()->listeners()->SuppressEventForwarding();
- return EXECUTE_TEST;
- } else {
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
- set_read_fd(pipe_fd[0]);
- set_spawned(true);
- return OVERSEE_TEST;
- }
-}
-
-// A concrete death test class that forks and re-executes the main
-// program from the beginning, with command-line flags set that cause
-// only this specific death test to be run.
-class ExecDeathTest : public ForkingDeathTest {
- public:
- ExecDeathTest(const char* a_statement, const RE* a_regex,
- const char* file, int line) :
- ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
- virtual TestRole AssumeRole();
- private:
- // The name of the file in which the death test is located.
- const char* const file_;
- // The line number on which the death test is located.
- const int line_;
-};
-
-// Utility class for accumulating command-line arguments.
-class Arguments {
- public:
- Arguments() {
- args_.push_back(NULL);
- }
-
- ~Arguments() {
- for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
- ++i) {
- free(*i);
- }
- }
- void AddArgument(const char* argument) {
- args_.insert(args_.end() - 1, posix::StrDup(argument));
- }
-
- template <typename Str>
- void AddArguments(const ::std::vector<Str>& arguments) {
- for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
- i != arguments.end();
- ++i) {
- args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
- }
- }
- char* const* Argv() {
- return &args_[0];
- }
- private:
- std::vector<char*> args_;
-};
-
-// A struct that encompasses the arguments to the child process of a
-// threadsafe-style death test process.
-struct ExecDeathTestArgs {
- char* const* argv; // Command-line arguments for the child's call to exec
- int close_fd; // File descriptor to close; the read end of a pipe
-};
-
-# if GTEST_OS_MAC
-inline char** GetEnviron() {
- // When Google Test is built as a framework on MacOS X, the environ variable
- // is unavailable. Apple's documentation (man environ) recommends using
- // _NSGetEnviron() instead.
- return *_NSGetEnviron();
-}
-# else
-// Some POSIX platforms expect you to declare environ. extern "C" makes
-// it reside in the global namespace.
-extern "C" char** environ;
-inline char** GetEnviron() { return environ; }
-# endif // GTEST_OS_MAC
-
-// The main function for a threadsafe-style death test child process.
-// This function is called in a clone()-ed process and thus must avoid
-// any potentially unsafe operations like malloc or libc functions.
-static int ExecDeathTestChildMain(void* child_arg) {
- ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
-
- // We need to execute the test program in the same environment where
- // it was originally invoked. Therefore we change to the original
- // working directory first.
- const char* const original_dir =
- UnitTest::GetInstance()->original_working_dir();
- // We can safely call chdir() as it's a direct system call.
- if (chdir(original_dir) != 0) {
- DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
- original_dir,
- GetLastErrnoDescription().c_str()));
- return EXIT_FAILURE;
- }
-
- // We can safely call execve() as it's a direct system call. We
- // cannot use execvp() as it's a libc function and thus potentially
- // unsafe. Since execve() doesn't search the PATH, the user must
- // invoke the test program via a valid path that contains at least
- // one path separator.
- execve(args->argv[0], args->argv, GetEnviron());
- DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
- args->argv[0],
- original_dir,
- GetLastErrnoDescription().c_str()));
- return EXIT_FAILURE;
-}
-
-// Two utility routines that together determine the direction the stack
-// grows.
-// This could be accomplished more elegantly by a single recursive
-// function, but we want to guard against the unlikely possibility of
-// a smart compiler optimizing the recursion away.
-//
-// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
-// StackLowerThanAddress into StackGrowsDown, which then doesn't give
-// correct answer.
-bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
-bool StackLowerThanAddress(const void* ptr) {
- int dummy;
- return &dummy < ptr;
-}
-
-bool StackGrowsDown() {
- int dummy;
- return StackLowerThanAddress(&dummy);
-}
-
-// A threadsafe implementation of fork(2) for threadsafe-style death tests
-// that uses clone(2). It dies with an error message if anything goes
-// wrong.
-static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
- ExecDeathTestArgs args = { argv, close_fd };
- pid_t child_pid = -1;
-
-# if GTEST_HAS_CLONE
- const bool use_fork = GTEST_FLAG(death_test_use_fork);
-
- if (!use_fork) {
- static const bool stack_grows_down = StackGrowsDown();
- const size_t stack_size = getpagesize();
- // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
- void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE, -1, 0);
- GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
- void* const stack_top =
- static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
-
- child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
-
- GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
- }
-# else
- const bool use_fork = true;
-# endif // GTEST_HAS_CLONE
-
- if (use_fork && (child_pid = fork()) == 0) {
- ExecDeathTestChildMain(&args);
- _exit(0);
- }
-
- GTEST_DEATH_TEST_CHECK_(child_pid != -1);
- return child_pid;
-}
-
-// The AssumeRole process for a fork-and-exec death test. It re-executes the
-// main program from the beginning, setting the --gtest_filter
-// and --gtest_internal_run_death_test flags to cause only the current
-// death test to be re-run.
-DeathTest::TestRole ExecDeathTest::AssumeRole() {
- const UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const TestInfo* const info = impl->current_test_info();
- const int death_test_index = info->result()->death_test_count();
-
- if (flag != NULL) {
- set_write_fd(flag->write_fd());
- return EXECUTE_TEST;
- }
-
- int pipe_fd[2];
- GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
- // Clear the close-on-exec flag on the write end of the pipe, lest
- // it be closed when the child process does an exec:
- GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
-
- const String filter_flag =
- String::Format("--%s%s=%s.%s",
- GTEST_FLAG_PREFIX_, kFilterFlag,
- info->test_case_name(), info->name());
- const String internal_flag =
- String::Format("--%s%s=%s|%d|%d|%d",
- GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
- file_, line_, death_test_index, pipe_fd[1]);
- Arguments args;
- args.AddArguments(GetArgvs());
- args.AddArgument(filter_flag.c_str());
- args.AddArgument(internal_flag.c_str());
-
- DeathTest::set_last_death_test_message("");
-
- CaptureStderr();
- // See the comment in NoExecDeathTest::AssumeRole for why the next line
- // is necessary.
- FlushInfoLog();
-
- const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
- set_child_pid(child_pid);
- set_read_fd(pipe_fd[0]);
- set_spawned(true);
- return OVERSEE_TEST;
-}
-
-# endif // !GTEST_OS_WINDOWS
-
-// Creates a concrete DeathTest-derived class that depends on the
-// --gtest_death_test_style flag, and sets the pointer pointed to
-// by the "test" argument to its address. If the test should be
-// skipped, sets that pointer to NULL. Returns true, unless the
-// flag is set to an invalid value.
-bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
- const char* file, int line,
- DeathTest** test) {
- UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const int death_test_index = impl->current_test_info()
- ->increment_death_test_count();
-
- if (flag != NULL) {
- if (death_test_index > flag->index()) {
- DeathTest::set_last_death_test_message(String::Format(
- "Death test count (%d) somehow exceeded expected maximum (%d)",
- death_test_index, flag->index()));
- return false;
- }
-
- if (!(flag->file() == file && flag->line() == line &&
- flag->index() == death_test_index)) {
- *test = NULL;
- return true;
- }
- }
-
-# if GTEST_OS_WINDOWS
-
- if (GTEST_FLAG(death_test_style) == "threadsafe" ||
- GTEST_FLAG(death_test_style) == "fast") {
- *test = new WindowsDeathTest(statement, regex, file, line);
- }
-
-# else
-
- if (GTEST_FLAG(death_test_style) == "threadsafe") {
- *test = new ExecDeathTest(statement, regex, file, line);
- } else if (GTEST_FLAG(death_test_style) == "fast") {
- *test = new NoExecDeathTest(statement, regex);
- }
-
-# endif // GTEST_OS_WINDOWS
-
- else { // NOLINT - this is more readable than unbalanced brackets inside #if.
- DeathTest::set_last_death_test_message(String::Format(
- "Unknown death test style \"%s\" encountered",
- GTEST_FLAG(death_test_style).c_str()));
- return false;
- }
-
- return true;
-}
-
-// Splits a given string on a given delimiter, populating a given
-// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
-// ::std::string, so we can use it here.
-static void SplitString(const ::std::string& str, char delimiter,
- ::std::vector< ::std::string>* dest) {
- ::std::vector< ::std::string> parsed;
- ::std::string::size_type pos = 0;
- while (::testing::internal::AlwaysTrue()) {
- const ::std::string::size_type colon = str.find(delimiter, pos);
- if (colon == ::std::string::npos) {
- parsed.push_back(str.substr(pos));
- break;
- } else {
- parsed.push_back(str.substr(pos, colon - pos));
- pos = colon + 1;
- }
- }
- dest->swap(parsed);
-}
-
-# if GTEST_OS_WINDOWS
-// Recreates the pipe and event handles from the provided parameters,
-// signals the event, and returns a file descriptor wrapped around the pipe
-// handle. This function is called in the child process only.
-int GetStatusFileDescriptor(unsigned int parent_process_id,
- size_t write_handle_as_size_t,
- size_t event_handle_as_size_t) {
- AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
- FALSE, // Non-inheritable.
- parent_process_id));
- if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
- DeathTestAbort(String::Format("Unable to open parent process %u",
- parent_process_id));
- }
-
- // TODO(vladl@google.com): Replace the following check with a
- // compile-time assertion when available.
- GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
-
- const HANDLE write_handle =
- reinterpret_cast<HANDLE>(write_handle_as_size_t);
- HANDLE dup_write_handle;
-
- // The newly initialized handle is accessible only in in the parent
- // process. To obtain one accessible within the child, we need to use
- // DuplicateHandle.
- if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
- ::GetCurrentProcess(), &dup_write_handle,
- 0x0, // Requested privileges ignored since
- // DUPLICATE_SAME_ACCESS is used.
- FALSE, // Request non-inheritable handler.
- DUPLICATE_SAME_ACCESS)) {
- DeathTestAbort(String::Format(
- "Unable to duplicate the pipe handle %Iu from the parent process %u",
- write_handle_as_size_t, parent_process_id));
- }
-
- const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
- HANDLE dup_event_handle;
-
- if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
- ::GetCurrentProcess(), &dup_event_handle,
- 0x0,
- FALSE,
- DUPLICATE_SAME_ACCESS)) {
- DeathTestAbort(String::Format(
- "Unable to duplicate the event handle %Iu from the parent process %u",
- event_handle_as_size_t, parent_process_id));
- }
-
- const int write_fd =
- ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
- if (write_fd == -1) {
- DeathTestAbort(String::Format(
- "Unable to convert pipe handle %Iu to a file descriptor",
- write_handle_as_size_t));
- }
-
- // Signals the parent that the write end of the pipe has been acquired
- // so the parent can release its own write end.
- ::SetEvent(dup_event_handle);
-
- return write_fd;
-}
-# endif // GTEST_OS_WINDOWS
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
- if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
-
- // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
- // can use it here.
- int line = -1;
- int index = -1;
- ::std::vector< ::std::string> fields;
- SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
- int write_fd = -1;
-
-# if GTEST_OS_WINDOWS
-
- unsigned int parent_process_id = 0;
- size_t write_handle_as_size_t = 0;
- size_t event_handle_as_size_t = 0;
-
- if (fields.size() != 6
- || !ParseNaturalNumber(fields[1], &line)
- || !ParseNaturalNumber(fields[2], &index)
- || !ParseNaturalNumber(fields[3], &parent_process_id)
- || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
- || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
- DeathTestAbort(String::Format(
- "Bad --gtest_internal_run_death_test flag: %s",
- GTEST_FLAG(internal_run_death_test).c_str()));
- }
- write_fd = GetStatusFileDescriptor(parent_process_id,
- write_handle_as_size_t,
- event_handle_as_size_t);
-# else
-
- if (fields.size() != 4
- || !ParseNaturalNumber(fields[1], &line)
- || !ParseNaturalNumber(fields[2], &index)
- || !ParseNaturalNumber(fields[3], &write_fd)) {
- DeathTestAbort(String::Format(
- "Bad --gtest_internal_run_death_test flag: %s",
- GTEST_FLAG(internal_run_death_test).c_str()));
- }
-
-# endif // GTEST_OS_WINDOWS
-
- return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
-}
-
-} // namespace internal
-
-#endif // GTEST_HAS_DEATH_TEST
-
-} // namespace testing
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: keith.ray@gmail.com (Keith Ray)
-
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-port.h"
-
-#include <stdlib.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h>
-#elif GTEST_OS_WINDOWS
-# include <direct.h>
-# include <io.h>
-#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL
-// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h
-# include <sys/syslimits.h>
-#else
-# include <limits.h>
-# include <climits> // Some Linux distributions define PATH_MAX here.
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_MAX_ _MAX_PATH
-#elif defined(PATH_MAX)
-# define GTEST_PATH_MAX_ PATH_MAX
-#elif defined(_XOPEN_PATH_MAX)
-# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
-#else
-# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
-#endif // GTEST_OS_WINDOWS
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-// On Windows, '\\' is the standard path separator, but many tools and the
-// Windows API also accept '/' as an alternate path separator. Unless otherwise
-// noted, a file path can contain either kind of path separators, or a mixture
-// of them.
-const char kPathSeparator = '\\';
-const char kAlternatePathSeparator = '/';
-const char kPathSeparatorString[] = "\\";
-const char kAlternatePathSeparatorString[] = "/";
-# if GTEST_OS_WINDOWS_MOBILE
-// Windows CE doesn't have a current directory. You should not use
-// the current directory in tests on Windows CE, but this at least
-// provides a reasonable fallback.
-const char kCurrentDirectoryString[] = "\\";
-// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
-const DWORD kInvalidFileAttributes = 0xffffffff;
-# else
-const char kCurrentDirectoryString[] = ".\\";
-# endif // GTEST_OS_WINDOWS_MOBILE
-#else
-const char kPathSeparator = '/';
-const char kPathSeparatorString[] = "/";
-const char kCurrentDirectoryString[] = "./";
-#endif // GTEST_OS_WINDOWS
-
-// Returns whether the given character is a valid path separator.
-static bool IsPathSeparator(char c) {
-#if GTEST_HAS_ALT_PATH_SEP_
- return (c == kPathSeparator) || (c == kAlternatePathSeparator);
-#else
- return c == kPathSeparator;
-#endif
-}
-
-// Returns the current working directory, or "" if unsuccessful.
-FilePath FilePath::GetCurrentDir() {
-#if GTEST_OS_WINDOWS_MOBILE
- // Windows CE doesn't have a current directory, so we just return
- // something reasonable.
- return FilePath(kCurrentDirectoryString);
-#elif GTEST_OS_WINDOWS
- char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
- return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#else
- char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
- return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#endif // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns a copy of the FilePath with the case-insensitive extension removed.
-// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
-// FilePath("dir/file"). If a case-insensitive extension is not
-// found, returns a copy of the original FilePath.
-FilePath FilePath::RemoveExtension(const char* extension) const {
- String dot_extension(String::Format(".%s", extension));
- if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
- return FilePath(String(pathname_.c_str(), pathname_.length() - 4));
- }
- return *this;
-}
-
-// Returns a pointer to the last occurence of a valid path separator in
-// the FilePath. On Windows, for example, both '/' and '\' are valid path
-// separators. Returns NULL if no path separator was found.
-const char* FilePath::FindLastPathSeparator() const {
- const char* const last_sep = strrchr(c_str(), kPathSeparator);
-#if GTEST_HAS_ALT_PATH_SEP_
- const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
- // Comparing two pointers of which only one is NULL is undefined.
- if (last_alt_sep != NULL &&
- (last_sep == NULL || last_alt_sep > last_sep)) {
- return last_alt_sep;
- }
-#endif
- return last_sep;
-}
-
-// Returns a copy of the FilePath with the directory part removed.
-// Example: FilePath("path/to/file").RemoveDirectoryName() returns
-// FilePath("file"). If there is no directory part ("just_a_file"), it returns
-// the FilePath unmodified. If there is no file part ("just_a_dir/") it
-// returns an empty FilePath ("").
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveDirectoryName() const {
- const char* const last_sep = FindLastPathSeparator();
- return last_sep ? FilePath(String(last_sep + 1)) : *this;
-}
-
-// RemoveFileName returns the directory path with the filename removed.
-// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
-// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
-// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
-// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveFileName() const {
- const char* const last_sep = FindLastPathSeparator();
- String dir;
- if (last_sep) {
- dir = String(c_str(), last_sep + 1 - c_str());
- } else {
- dir = kCurrentDirectoryString;
- }
- return FilePath(dir);
-}
-
-// Helper functions for naming files in a directory for xml output.
-
-// Given directory = "dir", base_name = "test", number = 0,
-// extension = "xml", returns "dir/test.xml". If number is greater
-// than zero (e.g., 12), returns "dir/test_12.xml".
-// On Windows platform, uses \ as the separator rather than /.
-FilePath FilePath::MakeFileName(const FilePath& directory,
- const FilePath& base_name,
- int number,
- const char* extension) {
- String file;
- if (number == 0) {
- file = String::Format("%s.%s", base_name.c_str(), extension);
- } else {
- file = String::Format("%s_%d.%s", base_name.c_str(), number, extension);
- }
- return ConcatPaths(directory, FilePath(file));
-}
-
-// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
-// On Windows, uses \ as the separator rather than /.
-FilePath FilePath::ConcatPaths(const FilePath& directory,
- const FilePath& relative_path) {
- if (directory.IsEmpty())
- return relative_path;
- const FilePath dir(directory.RemoveTrailingPathSeparator());
- return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
- relative_path.c_str()));
-}
-
-// Returns true if pathname describes something findable in the file-system,
-// either a file, directory, or whatever.
-bool FilePath::FileOrDirectoryExists() const {
-#if GTEST_OS_WINDOWS_MOBILE
- LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
- const DWORD attributes = GetFileAttributes(unicode);
- delete [] unicode;
- return attributes != kInvalidFileAttributes;
-#else
- posix::StatStruct file_stat;
- return posix::Stat(pathname_.c_str(), &file_stat) == 0;
-#endif // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns true if pathname describes a directory in the file-system
-// that exists.
-bool FilePath::DirectoryExists() const {
- bool result = false;
-#if GTEST_OS_WINDOWS
- // Don't strip off trailing separator if path is a root directory on
- // Windows (like "C:\\").
- const FilePath& path(IsRootDirectory() ? *this :
- RemoveTrailingPathSeparator());
-#else
- const FilePath& path(*this);
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
- LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
- const DWORD attributes = GetFileAttributes(unicode);
- delete [] unicode;
- if ((attributes != kInvalidFileAttributes) &&
- (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
- result = true;
- }
-#else
- posix::StatStruct file_stat;
- result = posix::Stat(path.c_str(), &file_stat) == 0 &&
- posix::IsDir(file_stat);
-#endif // GTEST_OS_WINDOWS_MOBILE
-
- return result;
-}
-
-// Returns true if pathname describes a root directory. (Windows has one
-// root directory per disk drive.)
-bool FilePath::IsRootDirectory() const {
-#if GTEST_OS_WINDOWS
- // TODO(wan@google.com): on Windows a network share like
- // \\server\share can be a root directory, although it cannot be the
- // current directory. Handle this properly.
- return pathname_.length() == 3 && IsAbsolutePath();
-#else
- return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
-#endif
-}
-
-// Returns true if pathname describes an absolute path.
-bool FilePath::IsAbsolutePath() const {
- const char* const name = pathname_.c_str();
-#if GTEST_OS_WINDOWS
- return pathname_.length() >= 3 &&
- ((name[0] >= 'a' && name[0] <= 'z') ||
- (name[0] >= 'A' && name[0] <= 'Z')) &&
- name[1] == ':' &&
- IsPathSeparator(name[2]);
-#else
- return IsPathSeparator(name[0]);
-#endif
-}
-
-// Returns a pathname for a file that does not currently exist. The pathname
-// will be directory/base_name.extension or
-// directory/base_name_<number>.extension if directory/base_name.extension
-// already exists. The number will be incremented until a pathname is found
-// that does not already exist.
-// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
-// There could be a race condition if two or more processes are calling this
-// function at the same time -- they could both pick the same filename.
-FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
- const FilePath& base_name,
- const char* extension) {
- FilePath full_pathname;
- int number = 0;
- do {
- full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
- } while (full_pathname.FileOrDirectoryExists());
- return full_pathname;
-}
-
-// Returns true if FilePath ends with a path separator, which indicates that
-// it is intended to represent a directory. Returns false otherwise.
-// This does NOT check that a directory (or file) actually exists.
-bool FilePath::IsDirectory() const {
- return !pathname_.empty() &&
- IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
-}
-
-// Create directories so that path exists. Returns true if successful or if
-// the directories already exist; returns false if unable to create directories
-// for any reason.
-bool FilePath::CreateDirectoriesRecursively() const {
- if (!this->IsDirectory()) {
- return false;
- }
-
- if (pathname_.length() == 0 || this->DirectoryExists()) {
- return true;
- }
-
- const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
- return parent.CreateDirectoriesRecursively() && this->CreateFolder();
-}
-
-// Create the directory so that path exists. Returns true if successful or
-// if the directory already exists; returns false if unable to create the
-// directory for any reason, including if the parent directory does not
-// exist. Not named "CreateDirectory" because that's a macro on Windows.
-bool FilePath::CreateFolder() const {
-#if GTEST_OS_WINDOWS_MOBILE
- FilePath removed_sep(this->RemoveTrailingPathSeparator());
- LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
- int result = CreateDirectory(unicode, NULL) ? 0 : -1;
- delete [] unicode;
-#elif GTEST_OS_WINDOWS
- int result = _mkdir(pathname_.c_str());
-#else
- int result = mkdir(pathname_.c_str(), 0777);
-#endif // GTEST_OS_WINDOWS_MOBILE
-
- if (result == -1) {
- return this->DirectoryExists(); // An error is OK if the directory exists.
- }
- return true; // No error.
-}
-
-// If input name has a trailing separator character, remove it and return the
-// name, otherwise return the name string unmodified.
-// On Windows platform, uses \ as the separator, other platforms use /.
-FilePath FilePath::RemoveTrailingPathSeparator() const {
- return IsDirectory()
- ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))
- : *this;
-}
-
-// Removes any redundant separators that might be in the pathname.
-// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
-// redundancies that might be in a pathname involving "." or "..".
-// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share).
-void FilePath::Normalize() {
- if (pathname_.c_str() == NULL) {
- pathname_ = "";
- return;
- }
- const char* src = pathname_.c_str();
- char* const dest = new char[pathname_.length() + 1];
- char* dest_ptr = dest;
- memset(dest_ptr, 0, pathname_.length() + 1);
-
- while (*src != '\0') {
- *dest_ptr = *src;
- if (!IsPathSeparator(*src)) {
- src++;
- } else {
-#if GTEST_HAS_ALT_PATH_SEP_
- if (*dest_ptr == kAlternatePathSeparator) {
- *dest_ptr = kPathSeparator;
- }
-#endif
- while (IsPathSeparator(*src))
- src++;
- }
- dest_ptr++;
- }
- *dest_ptr = '\0';
- pathname_ = dest;
- delete[] dest;
-}
-
-} // namespace internal
-} // namespace testing
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Utility functions and classes used by the Google C++ testing framework.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// This file contains purely Google Test's internal implementation. Please
-// DO NOT #INCLUDE IT IN A USER PROGRAM.
-
-#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
-#define GTEST_SRC_GTEST_INTERNAL_INL_H_
-
-// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
-// part of Google Test's implementation; otherwise it's undefined.
-#if !GTEST_IMPLEMENTATION_
-// A user is trying to include this from his code - just say no.
-# error "gtest-internal-inl.h is part of Google Test's internal implementation."
-# error "It must not be included except by Google Test itself."
-#endif // GTEST_IMPLEMENTATION_
-
-#ifndef _WIN32_WCE
-# include <errno.h>
-#endif // !_WIN32_WCE
-#include <stddef.h>
-#include <stdlib.h> // For strtoll/_strtoul64/malloc/free.
-#include <string.h> // For memmove.
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_WINDOWS
-# include <windows.h> // NOLINT
-#endif // GTEST_OS_WINDOWS
-
-#include "gtest/gtest.h" // NOLINT
-#include "gtest/gtest-spi.h"
-
-namespace testing {
-
-// Declares the flags.
-//
-// We don't want the users to modify this flag in the code, but want
-// Google Test's own unit tests to be able to access it. Therefore we
-// declare it here as opposed to in gtest.h.
-GTEST_DECLARE_bool_(death_test_use_fork);
-
-namespace internal {
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library. This is solely for testing GetTestTypeId().
-GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
-const char kBreakOnFailureFlag[] = "break_on_failure";
-const char kCatchExceptionsFlag[] = "catch_exceptions";
-const char kColorFlag[] = "color";
-const char kFilterFlag[] = "filter";
-const char kListTestsFlag[] = "list_tests";
-const char kOutputFlag[] = "output";
-const char kPrintTimeFlag[] = "print_time";
-const char kRandomSeedFlag[] = "random_seed";
-const char kRepeatFlag[] = "repeat";
-const char kShuffleFlag[] = "shuffle";
-const char kStackTraceDepthFlag[] = "stack_trace_depth";
-const char kStreamResultToFlag[] = "stream_result_to";
-const char kThrowOnFailureFlag[] = "throw_on_failure";
-
-// A valid random seed must be in [1, kMaxRandomSeed].
-const int kMaxRandomSeed = 99999;
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-GTEST_API_ extern bool g_help_flag;
-
-// Returns the current time in milliseconds.
-GTEST_API_ TimeInMillis GetTimeInMillis();
-
-// Returns true iff Google Test should use colors in the output.
-GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
-
-// Formats the given time in milliseconds as seconds.
-GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
-
-// Parses a string for an Int32 flag, in the form of "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-GTEST_API_ bool ParseInt32Flag(
- const char* str, const char* flag, Int32* value);
-
-// Returns a random seed in range [1, kMaxRandomSeed] based on the
-// given --gtest_random_seed flag value.
-inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
- const unsigned int raw_seed = (random_seed_flag == 0) ?
- static_cast<unsigned int>(GetTimeInMillis()) :
- static_cast<unsigned int>(random_seed_flag);
-
- // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
- // it's easy to type.
- const int normalized_seed =
- static_cast<int>((raw_seed - 1U) %
- static_cast<unsigned int>(kMaxRandomSeed)) + 1;
- return normalized_seed;
-}
-
-// Returns the first valid random seed after 'seed'. The behavior is
-// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is
-// considered to be 1.
-inline int GetNextRandomSeed(int seed) {
- GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
- << "Invalid random seed " << seed << " - must be in [1, "
- << kMaxRandomSeed << "].";
- const int next_seed = seed + 1;
- return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
-}
-
-// This class saves the values of all Google Test flags in its c'tor, and
-// restores them in its d'tor.
-class GTestFlagSaver {
- public:
- // The c'tor.
- GTestFlagSaver() {
- also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
- break_on_failure_ = GTEST_FLAG(break_on_failure);
- catch_exceptions_ = GTEST_FLAG(catch_exceptions);
- color_ = GTEST_FLAG(color);
- death_test_style_ = GTEST_FLAG(death_test_style);
- death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
- filter_ = GTEST_FLAG(filter);
- internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
- list_tests_ = GTEST_FLAG(list_tests);
- output_ = GTEST_FLAG(output);
- print_time_ = GTEST_FLAG(print_time);
- random_seed_ = GTEST_FLAG(random_seed);
- repeat_ = GTEST_FLAG(repeat);
- shuffle_ = GTEST_FLAG(shuffle);
- stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
- stream_result_to_ = GTEST_FLAG(stream_result_to);
- throw_on_failure_ = GTEST_FLAG(throw_on_failure);
- }
-
- // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
- ~GTestFlagSaver() {
- GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
- GTEST_FLAG(break_on_failure) = break_on_failure_;
- GTEST_FLAG(catch_exceptions) = catch_exceptions_;
- GTEST_FLAG(color) = color_;
- GTEST_FLAG(death_test_style) = death_test_style_;
- GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
- GTEST_FLAG(filter) = filter_;
- GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
- GTEST_FLAG(list_tests) = list_tests_;
- GTEST_FLAG(output) = output_;
- GTEST_FLAG(print_time) = print_time_;
- GTEST_FLAG(random_seed) = random_seed_;
- GTEST_FLAG(repeat) = repeat_;
- GTEST_FLAG(shuffle) = shuffle_;
- GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
- GTEST_FLAG(stream_result_to) = stream_result_to_;
- GTEST_FLAG(throw_on_failure) = throw_on_failure_;
- }
- private:
- // Fields for saving the original values of flags.
- bool also_run_disabled_tests_;
- bool break_on_failure_;
- bool catch_exceptions_;
- String color_;
- String death_test_style_;
- bool death_test_use_fork_;
- String filter_;
- String internal_run_death_test_;
- bool list_tests_;
- String output_;
- bool print_time_;
- bool pretty_;
- internal::Int32 random_seed_;
- internal::Int32 repeat_;
- bool shuffle_;
- internal::Int32 stack_trace_depth_;
- String stream_result_to_;
- bool throw_on_failure_;
-} GTEST_ATTRIBUTE_UNUSED_;
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded();
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (e.g., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-GTEST_API_ bool ShouldShard(const char* total_shards_str,
- const char* shard_index_str,
- bool in_subprocess_for_death_test);
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error and
-// and aborts.
-GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-GTEST_API_ bool ShouldRunTestOnShard(
- int total_shards, int shard_index, int test_id);
-
-// STL container utilities.
-
-// Returns the number of elements in the given container that satisfy
-// the given predicate.
-template <class Container, typename Predicate>
-inline int CountIf(const Container& c, Predicate predicate) {
- // Implemented as an explicit loop since std::count_if() in libCstd on
- // Solaris has a non-standard signature.
- int count = 0;
- for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
- if (predicate(*it))
- ++count;
- }
- return count;
-}
-
-// Applies a function/functor to each element in the container.
-template <class Container, typename Functor>
-void ForEach(const Container& c, Functor functor) {
- std::for_each(c.begin(), c.end(), functor);
-}
-
-// Returns the i-th element of the vector, or default_value if i is not
-// in range [0, v.size()).
-template <typename E>
-inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
- return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
-}
-
-// Performs an in-place shuffle of a range of the vector's elements.
-// 'begin' and 'end' are element indices as an STL-style range;
-// i.e. [begin, end) are shuffled, where 'end' == size() means to
-// shuffle to the end of the vector.
-template <typename E>
-void ShuffleRange(internal::Random* random, int begin, int end,
- std::vector<E>* v) {
- const int size = static_cast<int>(v->size());
- GTEST_CHECK_(0 <= begin && begin <= size)
- << "Invalid shuffle range start " << begin << ": must be in range [0, "
- << size << "].";
- GTEST_CHECK_(begin <= end && end <= size)
- << "Invalid shuffle range finish " << end << ": must be in range ["
- << begin << ", " << size << "].";
-
- // Fisher-Yates shuffle, from
- // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
- for (int range_width = end - begin; range_width >= 2; range_width--) {
- const int last_in_range = begin + range_width - 1;
- const int selected = begin + random->Generate(range_width);
- std::swap((*v)[selected], (*v)[last_in_range]);
- }
-}
-
-// Performs an in-place shuffle of the vector's elements.
-template <typename E>
-inline void Shuffle(internal::Random* random, std::vector<E>* v) {
- ShuffleRange(random, 0, static_cast<int>(v->size()), v);
-}
-
-// A function for deleting an object. Handy for being used as a
-// functor.
-template <typename T>
-static void Delete(T* x) {
- delete x;
-}
-
-// A predicate that checks the key of a TestProperty against a known key.
-//
-// TestPropertyKeyIs is copyable.
-class TestPropertyKeyIs {
- public:
- // Constructor.
- //
- // TestPropertyKeyIs has NO default constructor.
- explicit TestPropertyKeyIs(const char* key)
- : key_(key) {}
-
- // Returns true iff the test name of test property matches on key_.
- bool operator()(const TestProperty& test_property) const {
- return String(test_property.key()).Compare(key_) == 0;
- }
-
- private:
- String key_;
-};
-
-// Class UnitTestOptions.
-//
-// This class contains functions for processing options the user
-// specifies when running the tests. It has only static members.
-//
-// In most cases, the user can specify an option using either an
-// environment variable or a command line flag. E.g. you can set the
-// test filter using either GTEST_FILTER or --gtest_filter. If both
-// the variable and the flag are present, the latter overrides the
-// former.
-class GTEST_API_ UnitTestOptions {
- public:
- // Functions for processing the gtest_output flag.
-
- // Returns the output format, or "" for normal printed output.
- static String GetOutputFormat();
-
- // Returns the absolute path of the requested output file, or the
- // default (test_detail.xml in the original working directory) if
- // none was explicitly specified.
- static String GetAbsolutePathToOutputFile();
-
- // Functions for processing the gtest_filter flag.
-
- // Returns true iff the wildcard pattern matches the string. The
- // first ':' or '\0' character in pattern marks the end of it.
- //
- // This recursive algorithm isn't very efficient, but is clear and
- // works well enough for matching test names, which are short.
- static bool PatternMatchesString(const char *pattern, const char *str);
-
- // Returns true iff the user-specified filter matches the test case
- // name and the test name.
- static bool FilterMatchesTest(const String &test_case_name,
- const String &test_name);
-
-#if GTEST_OS_WINDOWS
- // Function for supporting the gtest_catch_exception flag.
-
- // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
- // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
- // This function is useful as an __except condition.
- static int GTestShouldProcessSEH(DWORD exception_code);
-#endif // GTEST_OS_WINDOWS
-
- // Returns true if "name" matches the ':' separated list of glob-style
- // filters in "filter".
- static bool MatchesFilter(const String& name, const char* filter);
-};
-
-// Returns the current application's name, removing directory path if that
-// is present. Used by UnitTestOptions::GetOutputFile.
-GTEST_API_ FilePath GetCurrentExecutableName();
-
-// The role interface for getting the OS stack trace as a string.
-class OsStackTraceGetterInterface {
- public:
- OsStackTraceGetterInterface() {}
- virtual ~OsStackTraceGetterInterface() {}
-
- // Returns the current OS stack trace as a String. Parameters:
- //
- // max_depth - the maximum number of stack frames to be included
- // in the trace.
- // skip_count - the number of top frames to be skipped; doesn't count
- // against max_depth.
- virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
-
- // UponLeavingGTest() should be called immediately before Google Test calls
- // user code. It saves some information about the current stack that
- // CurrentStackTrace() will use to find and hide Google Test stack frames.
- virtual void UponLeavingGTest() = 0;
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
-};
-
-// A working implementation of the OsStackTraceGetterInterface interface.
-class OsStackTraceGetter : public OsStackTraceGetterInterface {
- public:
- OsStackTraceGetter() : caller_frame_(NULL) {}
- virtual String CurrentStackTrace(int max_depth, int skip_count);
- virtual void UponLeavingGTest();
-
- // This string is inserted in place of stack frames that are part of
- // Google Test's implementation.
- static const char* const kElidedFramesMarker;
-
- private:
- Mutex mutex_; // protects all internal state
-
- // We save the stack frame below the frame that calls user code.
- // We do this because the address of the frame immediately below
- // the user code changes between the call to UponLeavingGTest()
- // and any calls to CurrentStackTrace() from within the user code.
- void* caller_frame_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
-};
-
-// Information about a Google Test trace point.
-struct TraceInfo {
- const char* file;
- int line;
- String message;
-};
-
-// This is the default global test part result reporter used in UnitTestImpl.
-// This class should only be used by UnitTestImpl.
-class DefaultGlobalTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
- // Implements the TestPartResultReporterInterface. Reports the test part
- // result in the current test.
- virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
- UnitTestImpl* const unit_test_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
-};
-
-// This is the default per thread test part result reporter used in
-// UnitTestImpl. This class should only be used by UnitTestImpl.
-class DefaultPerThreadTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
- // Implements the TestPartResultReporterInterface. The implementation just
- // delegates to the current global test part result reporter of *unit_test_.
- virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
- UnitTestImpl* const unit_test_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
-};
-
-// The private implementation of the UnitTest class. We don't protect
-// the methods under a mutex, as this class is not accessible by a
-// user and the UnitTest class that delegates work to this class does
-// proper locking.
-class GTEST_API_ UnitTestImpl {
- public:
- explicit UnitTestImpl(UnitTest* parent);
- virtual ~UnitTestImpl();
-
- // There are two different ways to register your own TestPartResultReporter.
- // You can register your own repoter to listen either only for test results
- // from the current thread or for results from all threads.
- // By default, each per-thread test result repoter just passes a new
- // TestPartResult to the global test result reporter, which registers the
- // test part result for the currently running test.
-
- // Returns the global test part result reporter.
- TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
-
- // Sets the global test part result reporter.
- void SetGlobalTestPartResultReporter(
- TestPartResultReporterInterface* reporter);
-
- // Returns the test part result reporter for the current thread.
- TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
-
- // Sets the test part result reporter for the current thread.
- void SetTestPartResultReporterForCurrentThread(
- TestPartResultReporterInterface* reporter);
-
- // Gets the number of successful test cases.
- int successful_test_case_count() const;
-
- // Gets the number of failed test cases.
- int failed_test_case_count() const;
-
- // Gets the number of all test cases.
- int total_test_case_count() const;
-
- // Gets the number of all test cases that contain at least one test
- // that should run.
- int test_case_to_run_count() const;
-
- // Gets the number of successful tests.
- int successful_test_count() const;
-
- // Gets the number of failed tests.
- int failed_test_count() const;
-
- // Gets the number of disabled tests.
- int disabled_test_count() const;
-
- // Gets the number of all tests.
- int total_test_count() const;
-
- // Gets the number of tests that should run.
- int test_to_run_count() const;
-
- // Gets the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns true iff the unit test passed (i.e. all test cases passed).
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the unit test failed (i.e. some test case failed
- // or something outside of all tests failed).
- bool Failed() const {
- return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
- }
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- const TestCase* GetTestCase(int i) const {
- const int index = GetElementOr(test_case_indices_, i, -1);
- return index < 0 ? NULL : test_cases_[i];
- }
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- TestCase* GetMutableTestCase(int i) {
- const int index = GetElementOr(test_case_indices_, i, -1);
- return index < 0 ? NULL : test_cases_[index];
- }
-
- // Provides access to the event listener list.
- TestEventListeners* listeners() { return &listeners_; }
-
- // Returns the TestResult for the test that's currently running, or
- // the TestResult for the ad hoc test if no test is running.
- TestResult* current_test_result();
-
- // Returns the TestResult for the ad hoc test.
- const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
-
- // Sets the OS stack trace getter.
- //
- // Does nothing if the input and the current OS stack trace getter
- // are the same; otherwise, deletes the old getter and makes the
- // input the current getter.
- void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
-
- // Returns the current OS stack trace getter if it is not NULL;
- // otherwise, creates an OsStackTraceGetter, makes it the current
- // getter, and returns it.
- OsStackTraceGetterInterface* os_stack_trace_getter();
-
- // Returns the current OS stack trace as a String.
- //
- // The maximum number of stack frames to be included is specified by
- // the gtest_stack_trace_depth flag. The skip_count parameter
- // specifies the number of top frames to be skipped, which doesn't
- // count against the number of frames to be included.
- //
- // For example, if Foo() calls Bar(), which in turn calls
- // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
- // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
- String CurrentOsStackTraceExceptTop(int skip_count);
-
- // Finds and returns a TestCase with the given name. If one doesn't
- // exist, creates one and returns it.
- //
- // Arguments:
- //
- // test_case_name: name of the test case
- // type_param: the name of the test's type parameter, or NULL if
- // this is not a typed or a type-parameterized test.
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- TestCase* GetTestCase(const char* test_case_name,
- const char* type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc);
-
- // Adds a TestInfo to the unit test.
- //
- // Arguments:
- //
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- // test_info: the TestInfo object
- void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc,
- TestInfo* test_info) {
- // In order to support thread-safe death tests, we need to
- // remember the original working directory when the test program
- // was first invoked. We cannot do this in RUN_ALL_TESTS(), as
- // the user may have changed the current directory before calling
- // RUN_ALL_TESTS(). Therefore we capture the current directory in
- // AddTestInfo(), which is called to register a TEST or TEST_F
- // before main() is reached.
- if (original_working_dir_.IsEmpty()) {
- original_working_dir_.Set(FilePath::GetCurrentDir());
- GTEST_CHECK_(!original_working_dir_.IsEmpty())
- << "Failed to get the current working directory.";
- }
-
- GetTestCase(test_info->test_case_name(),
- test_info->type_param(),
- set_up_tc,
- tear_down_tc)->AddTestInfo(test_info);
- }
-
-#if GTEST_HAS_PARAM_TEST
- // Returns ParameterizedTestCaseRegistry object used to keep track of
- // value-parameterized tests and instantiate and register them.
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
- return parameterized_test_registry_;
- }
-#endif // GTEST_HAS_PARAM_TEST
-
- // Sets the TestCase object for the test that's currently running.
- void set_current_test_case(TestCase* a_current_test_case) {
- current_test_case_ = a_current_test_case;
- }
-
- // Sets the TestInfo object for the test that's currently running. If
- // current_test_info is NULL, the assertion results will be stored in
- // ad_hoc_test_result_.
- void set_current_test_info(TestInfo* a_current_test_info) {
- current_test_info_ = a_current_test_info;
- }
-
- // Registers all parameterized tests defined using TEST_P and
- // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
- // combination. This method can be called more then once; it has guards
- // protecting from registering the tests more then once. If
- // value-parameterized tests are disabled, RegisterParameterizedTests is
- // present but does nothing.
- void RegisterParameterizedTests();
-
- // Runs all tests in this UnitTest object, prints the result, and
- // returns true if all tests are successful. If any exception is
- // thrown during a test, this test is considered to be failed, but
- // the rest of the tests will still be run.
- bool RunAllTests();
-
- // Clears the results of all tests, except the ad hoc tests.
- void ClearNonAdHocTestResult() {
- ForEach(test_cases_, TestCase::ClearTestCaseResult);
- }
-
- // Clears the results of ad-hoc test assertions.
- void ClearAdHocTestResult() {
- ad_hoc_test_result_.Clear();
- }
-
- enum ReactionToSharding {
- HONOR_SHARDING_PROTOCOL,
- IGNORE_SHARDING_PROTOCOL
- };
-
- // Matches the full name of each test against the user-specified
- // filter to decide whether the test should run, then records the
- // result in each TestCase and TestInfo object.
- // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
- // based on sharding variables in the environment.
- // Returns the number of tests that should run.
- int FilterTests(ReactionToSharding shard_tests);
-
- // Prints the names of the tests matching the user-specified filter flag.
- void ListTestsMatchingFilter();
-
- const TestCase* current_test_case() const { return current_test_case_; }
- TestInfo* current_test_info() { return current_test_info_; }
- const TestInfo* current_test_info() const { return current_test_info_; }
-
- // Returns the vector of environments that need to be set-up/torn-down
- // before/after the tests are run.
- std::vector<Environment*>& environments() { return environments_; }
-
- // Getters for the per-thread Google Test trace stack.
- std::vector<TraceInfo>& gtest_trace_stack() {
- return *(gtest_trace_stack_.pointer());
- }
- const std::vector<TraceInfo>& gtest_trace_stack() const {
- return gtest_trace_stack_.get();
- }
-
-#if GTEST_HAS_DEATH_TEST
- void InitDeathTestSubprocessControlInfo() {
- internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
- }
- // Returns a pointer to the parsed --gtest_internal_run_death_test
- // flag, or NULL if that flag was not specified.
- // This information is useful only in a death test child process.
- // Must not be called before a call to InitGoogleTest.
- const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
- return internal_run_death_test_flag_.get();
- }
-
- // Returns a pointer to the current death test factory.
- internal::DeathTestFactory* death_test_factory() {
- return death_test_factory_.get();
- }
-
- void SuppressTestEventsIfInSubprocess();
-
- friend class ReplaceDeathTestFactory;
-#endif // GTEST_HAS_DEATH_TEST
-
- // Initializes the event listener performing XML output as specified by
- // UnitTestOptions. Must not be called before InitGoogleTest.
- void ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
- // Initializes the event listener for streaming test results to a socket.
- // Must not be called before InitGoogleTest.
- void ConfigureStreamingOutput();
-#endif
-
- // Performs initialization dependent upon flag values obtained in
- // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
- // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
- // this function is also called from RunAllTests. Since this function can be
- // called more than once, it has to be idempotent.
- void PostFlagParsingInit();
-
- // Gets the random seed used at the start of the current test iteration.
- int random_seed() const { return random_seed_; }
-
- // Gets the random number generator.
- internal::Random* random() { return &random_; }
-
- // Shuffles all test cases, and the tests within each test case,
- // making sure that death tests are still run first.
- void ShuffleTests();
-
- // Restores the test cases and tests to their order before the first shuffle.
- void UnshuffleTests();
-
- // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
- // UnitTest::Run() starts.
- bool catch_exceptions() const { return catch_exceptions_; }
-
- private:
- friend class ::testing::UnitTest;
-
- // Used by UnitTest::Run() to capture the state of
- // GTEST_FLAG(catch_exceptions) at the moment it starts.
- void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
-
- // The UnitTest object that owns this implementation object.
- UnitTest* const parent_;
-
- // The working directory when the first TEST() or TEST_F() was
- // executed.
- internal::FilePath original_working_dir_;
-
- // The default test part result reporters.
- DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
- DefaultPerThreadTestPartResultReporter
- default_per_thread_test_part_result_reporter_;
-
- // Points to (but doesn't own) the global test part result reporter.
- TestPartResultReporterInterface* global_test_part_result_repoter_;
-
- // Protects read and write access to global_test_part_result_reporter_.
- internal::Mutex global_test_part_result_reporter_mutex_;
-
- // Points to (but doesn't own) the per-thread test part result reporter.
- internal::ThreadLocal<TestPartResultReporterInterface*>
- per_thread_test_part_result_reporter_;
-
- // The vector of environments that need to be set-up/torn-down
- // before/after the tests are run.
- std::vector<Environment*> environments_;
-
- // The vector of TestCases in their original order. It owns the
- // elements in the vector.
- std::vector<TestCase*> test_cases_;
-
- // Provides a level of indirection for the test case list to allow
- // easy shuffling and restoring the test case order. The i-th
- // element of this vector is the index of the i-th test case in the
- // shuffled order.
- std::vector<int> test_case_indices_;
-
-#if GTEST_HAS_PARAM_TEST
- // ParameterizedTestRegistry object used to register value-parameterized
- // tests.
- internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
-
- // Indicates whether RegisterParameterizedTests() has been called already.
- bool parameterized_tests_registered_;
-#endif // GTEST_HAS_PARAM_TEST
-
- // Index of the last death test case registered. Initially -1.
- int last_death_test_case_;
-
- // This points to the TestCase for the currently running test. It
- // changes as Google Test goes through one test case after another.
- // When no test is running, this is set to NULL and Google Test
- // stores assertion results in ad_hoc_test_result_. Initially NULL.
- TestCase* current_test_case_;
-
- // This points to the TestInfo for the currently running test. It
- // changes as Google Test goes through one test after another. When
- // no test is running, this is set to NULL and Google Test stores
- // assertion results in ad_hoc_test_result_. Initially NULL.
- TestInfo* current_test_info_;
-
- // Normally, a user only writes assertions inside a TEST or TEST_F,
- // or inside a function called by a TEST or TEST_F. Since Google
- // Test keeps track of which test is current running, it can
- // associate such an assertion with the test it belongs to.
- //
- // If an assertion is encountered when no TEST or TEST_F is running,
- // Google Test attributes the assertion result to an imaginary "ad hoc"
- // test, and records the result in ad_hoc_test_result_.
- TestResult ad_hoc_test_result_;
-
- // The list of event listeners that can be used to track events inside
- // Google Test.
- TestEventListeners listeners_;
-
- // The OS stack trace getter. Will be deleted when the UnitTest
- // object is destructed. By default, an OsStackTraceGetter is used,
- // but the user can set this field to use a custom getter if that is
- // desired.
- OsStackTraceGetterInterface* os_stack_trace_getter_;
-
- // True iff PostFlagParsingInit() has been called.
- bool post_flag_parse_init_performed_;
-
- // The random number seed used at the beginning of the test run.
- int random_seed_;
-
- // Our random number generator.
- internal::Random random_;
-
- // How long the test took to run, in milliseconds.
- TimeInMillis elapsed_time_;
-
-#if GTEST_HAS_DEATH_TEST
- // The decomposed components of the gtest_internal_run_death_test flag,
- // parsed when RUN_ALL_TESTS is called.
- internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
- internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
-#endif // GTEST_HAS_DEATH_TEST
-
- // A per-thread stack of traces created by the SCOPED_TRACE() macro.
- internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
-
- // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
- // starts.
- bool catch_exceptions_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
-}; // class UnitTestImpl
-
-// Convenience function for accessing the global UnitTest
-// implementation object.
-inline UnitTestImpl* GetUnitTestImpl() {
- return UnitTest::GetInstance()->impl();
-}
-
-#if GTEST_USES_SIMPLE_RE
-
-// Internal helper functions for implementing the simple regular
-// expression matcher.
-GTEST_API_ bool IsInSet(char ch, const char* str);
-GTEST_API_ bool IsAsciiDigit(char ch);
-GTEST_API_ bool IsAsciiPunct(char ch);
-GTEST_API_ bool IsRepeat(char ch);
-GTEST_API_ bool IsAsciiWhiteSpace(char ch);
-GTEST_API_ bool IsAsciiWordChar(char ch);
-GTEST_API_ bool IsValidEscape(char ch);
-GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
-GTEST_API_ bool ValidateRegex(const char* regex);
-GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
-GTEST_API_ bool MatchRepetitionAndRegexAtHead(
- bool escaped, char ch, char repeat, const char* regex, const char* str);
-GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
-
-#endif // GTEST_USES_SIMPLE_RE
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
-
-#if GTEST_HAS_DEATH_TEST
-
-// Returns the message describing the last system error, regardless of the
-// platform.
-GTEST_API_ String GetLastErrnoDescription();
-
-# if GTEST_OS_WINDOWS
-// Provides leak-safe Windows kernel handle ownership.
-class AutoHandle {
- public:
- AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
- explicit AutoHandle(HANDLE handle) : handle_(handle) {}
-
- ~AutoHandle() { Reset(); }
-
- HANDLE Get() const { return handle_; }
- void Reset() { Reset(INVALID_HANDLE_VALUE); }
- void Reset(HANDLE handle) {
- if (handle != handle_) {
- if (handle_ != INVALID_HANDLE_VALUE)
- ::CloseHandle(handle_);
- handle_ = handle;
- }
- }
-
- private:
- HANDLE handle_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
-};
-# endif // GTEST_OS_WINDOWS
-
-// Attempts to parse a string into a positive integer pointed to by the
-// number parameter. Returns true if that is possible.
-// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
-// it here.
-template <typename Integer>
-bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
- // Fail fast if the given string does not begin with a digit;
- // this bypasses strtoXXX's "optional leading whitespace and plus
- // or minus sign" semantics, which are undesirable here.
- if (str.empty() || !IsDigit(str[0])) {
- return false;
- }
- errno = 0;
-
- char* end;
- // BiggestConvertible is the largest integer type that system-provided
- // string-to-number conversion routines can return.
-
-# if GTEST_OS_WINDOWS && !defined(__GNUC__)
-
- // MSVC and C++ Builder define __int64 instead of the standard long long.
- typedef unsigned __int64 BiggestConvertible;
- const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
-
-# else
-
- typedef unsigned long long BiggestConvertible; // NOLINT
- const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
-
-# endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
-
- const bool parse_success = *end == '\0' && errno == 0;
-
- // TODO(vladl@google.com): Convert this to compile time assertion when it is
- // available.
- GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
-
- const Integer result = static_cast<Integer>(parsed);
- if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
- *number = result;
- return true;
- }
- return false;
-}
-#endif // GTEST_HAS_DEATH_TEST
-
-// TestResult contains some private methods that should be hidden from
-// Google Test user but are required for testing. This class allow our tests
-// to access them.
-//
-// This class is supplied only for the purpose of testing Google Test's own
-// constructs. Do not use it in user tests, either directly or indirectly.
-class TestResultAccessor {
- public:
- static void RecordProperty(TestResult* test_result,
- const TestProperty& property) {
- test_result->RecordProperty(property);
- }
-
- static void ClearTestPartResults(TestResult* test_result) {
- test_result->ClearTestPartResults();
- }
-
- static const std::vector<testing::TestPartResult>& test_part_results(
- const TestResult& test_result) {
- return test_result.test_part_results();
- }
-};
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-#include "gtest/internal/gtest-port.h"
-
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h> // For TerminateProcess()
-#elif GTEST_OS_WINDOWS
-# include <io.h>
-# include <sys/stat.h>
-#else
-# include <unistd.h>
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_MAC
-# include <mach/mach_init.h>
-# include <mach/task.h>
-# include <mach/vm_map.h>
-#endif // GTEST_OS_MAC
-
-#include "gtest/gtest-spi.h"
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-namespace internal {
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
-const int kStdOutFileno = 1;
-const int kStdErrFileno = 2;
-#else
-const int kStdOutFileno = STDOUT_FILENO;
-const int kStdErrFileno = STDERR_FILENO;
-#endif // _MSC_VER
-
-#if GTEST_OS_MAC
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-size_t GetThreadCount() {
- const task_t task = mach_task_self();
- mach_msg_type_number_t thread_count;
- thread_act_array_t thread_list;
- const kern_return_t status = task_threads(task, &thread_list, &thread_count);
- if (status == KERN_SUCCESS) {
- // task_threads allocates resources in thread_list and we need to free them
- // to avoid leaks.
- vm_deallocate(task,
- reinterpret_cast<vm_address_t>(thread_list),
- sizeof(thread_t) * thread_count);
- return static_cast<size_t>(thread_count);
- } else {
- return 0;
- }
-}
-
-#else
-
-size_t GetThreadCount() {
- // There's no portable way to detect the number of threads, so we just
- // return 0 to indicate that we cannot detect it.
- return 0;
-}
-
-#endif // GTEST_OS_MAC
-
-#if GTEST_USES_POSIX_RE
-
-// Implements RE. Currently only needed for death tests.
-
-RE::~RE() {
- if (is_valid_) {
- // regfree'ing an invalid regex might crash because the content
- // of the regex is undefined. Since the regex's are essentially
- // the same, one cannot be valid (or invalid) without the other
- // being so too.
- regfree(&partial_regex_);
- regfree(&full_regex_);
- }
- free(const_cast<char*>(pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
- if (!re.is_valid_) return false;
-
- regmatch_t match;
- return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
- if (!re.is_valid_) return false;
-
- regmatch_t match;
- return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
- pattern_ = posix::StrDup(regex);
-
- // Reserves enough bytes to hold the regular expression used for a
- // full match.
- const size_t full_regex_len = strlen(regex) + 10;
- char* const full_pattern = new char[full_regex_len];
-
- snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
- is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
- // We want to call regcomp(&partial_regex_, ...) even if the
- // previous expression returns false. Otherwise partial_regex_ may
- // not be properly initialized can may cause trouble when it's
- // freed.
- //
- // Some implementation of POSIX regex (e.g. on at least some
- // versions of Cygwin) doesn't accept the empty string as a valid
- // regex. We change it to an equivalent form "()" to be safe.
- if (is_valid_) {
- const char* const partial_regex = (*regex == '\0') ? "()" : regex;
- is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
- }
- EXPECT_TRUE(is_valid_)
- << "Regular expression \"" << regex
- << "\" is not a valid POSIX Extended regular expression.";
-
- delete[] full_pattern;
-}
-
-#elif GTEST_USES_SIMPLE_RE
-
-// Returns true iff ch appears anywhere in str (excluding the
-// terminating '\0' character).
-bool IsInSet(char ch, const char* str) {
- return ch != '\0' && strchr(str, ch) != NULL;
-}
-
-// Returns true iff ch belongs to the given classification. Unlike
-// similar functions in <ctype.h>, these aren't affected by the
-// current locale.
-bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
-bool IsAsciiPunct(char ch) {
- return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
-}
-bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
-bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
-bool IsAsciiWordChar(char ch) {
- return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
- ('0' <= ch && ch <= '9') || ch == '_';
-}
-
-// Returns true iff "\\c" is a supported escape sequence.
-bool IsValidEscape(char c) {
- return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
-}
-
-// Returns true iff the given atom (specified by escaped and pattern)
-// matches ch. The result is undefined if the atom is invalid.
-bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
- if (escaped) { // "\\p" where p is pattern_char.
- switch (pattern_char) {
- case 'd': return IsAsciiDigit(ch);
- case 'D': return !IsAsciiDigit(ch);
- case 'f': return ch == '\f';
- case 'n': return ch == '\n';
- case 'r': return ch == '\r';
- case 's': return IsAsciiWhiteSpace(ch);
- case 'S': return !IsAsciiWhiteSpace(ch);
- case 't': return ch == '\t';
- case 'v': return ch == '\v';
- case 'w': return IsAsciiWordChar(ch);
- case 'W': return !IsAsciiWordChar(ch);
- }
- return IsAsciiPunct(pattern_char) && pattern_char == ch;
- }
-
- return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
-}
-
-// Helper function used by ValidateRegex() to format error messages.
-String FormatRegexSyntaxError(const char* regex, int index) {
- return (Message() << "Syntax error at index " << index
- << " in simple regular expression \"" << regex << "\": ").GetString();
-}
-
-// Generates non-fatal failures and returns false if regex is invalid;
-// otherwise returns true.
-bool ValidateRegex(const char* regex) {
- if (regex == NULL) {
- // TODO(wan@google.com): fix the source file location in the
- // assertion failures to match where the regex is used in user
- // code.
- ADD_FAILURE() << "NULL is not a valid simple regular expression.";
- return false;
- }
-
- bool is_valid = true;
-
- // True iff ?, *, or + can follow the previous atom.
- bool prev_repeatable = false;
- for (int i = 0; regex[i]; i++) {
- if (regex[i] == '\\') { // An escape sequence
- i++;
- if (regex[i] == '\0') {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
- << "'\\' cannot appear at the end.";
- return false;
- }
-
- if (!IsValidEscape(regex[i])) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
- << "invalid escape sequence \"\\" << regex[i] << "\".";
- is_valid = false;
- }
- prev_repeatable = true;
- } else { // Not an escape sequence.
- const char ch = regex[i];
-
- if (ch == '^' && i > 0) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'^' can only appear at the beginning.";
- is_valid = false;
- } else if (ch == '$' && regex[i + 1] != '\0') {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'$' can only appear at the end.";
- is_valid = false;
- } else if (IsInSet(ch, "()[]{}|")) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'" << ch << "' is unsupported.";
- is_valid = false;
- } else if (IsRepeat(ch) && !prev_repeatable) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'" << ch << "' can only follow a repeatable token.";
- is_valid = false;
- }
-
- prev_repeatable = !IsInSet(ch, "^$?*+");
- }
- }
-
- return is_valid;
-}
-
-// Matches a repeated regex atom followed by a valid simple regular
-// expression. The regex atom is defined as c if escaped is false,
-// or \c otherwise. repeat is the repetition meta character (?, *,
-// or +). The behavior is undefined if str contains too many
-// characters to be indexable by size_t, in which case the test will
-// probably time out anyway. We are fine with this limitation as
-// std::string has it too.
-bool MatchRepetitionAndRegexAtHead(
- bool escaped, char c, char repeat, const char* regex,
- const char* str) {
- const size_t min_count = (repeat == '+') ? 1 : 0;
- const size_t max_count = (repeat == '?') ? 1 :
- static_cast<size_t>(-1) - 1;
- // We cannot call numeric_limits::max() as it conflicts with the
- // max() macro on Windows.
-
- for (size_t i = 0; i <= max_count; ++i) {
- // We know that the atom matches each of the first i characters in str.
- if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
- // We have enough matches at the head, and the tail matches too.
- // Since we only care about *whether* the pattern matches str
- // (as opposed to *how* it matches), there is no need to find a
- // greedy match.
- return true;
- }
- if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
- return false;
- }
- return false;
-}
-
-// Returns true iff regex matches a prefix of str. regex must be a
-// valid simple regular expression and not start with "^", or the
-// result is undefined.
-bool MatchRegexAtHead(const char* regex, const char* str) {
- if (*regex == '\0') // An empty regex matches a prefix of anything.
- return true;
-
- // "$" only matches the end of a string. Note that regex being
- // valid guarantees that there's nothing after "$" in it.
- if (*regex == '$')
- return *str == '\0';
-
- // Is the first thing in regex an escape sequence?
- const bool escaped = *regex == '\\';
- if (escaped)
- ++regex;
- if (IsRepeat(regex[1])) {
- // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
- // here's an indirect recursion. It terminates as the regex gets
- // shorter in each recursion.
- return MatchRepetitionAndRegexAtHead(
- escaped, regex[0], regex[1], regex + 2, str);
- } else {
- // regex isn't empty, isn't "$", and doesn't start with a
- // repetition. We match the first atom of regex with the first
- // character of str and recurse.
- return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
- MatchRegexAtHead(regex + 1, str + 1);
- }
-}
-
-// Returns true iff regex matches any substring of str. regex must be
-// a valid simple regular expression, or the result is undefined.
-//
-// The algorithm is recursive, but the recursion depth doesn't exceed
-// the regex length, so we won't need to worry about running out of
-// stack space normally. In rare cases the time complexity can be
-// exponential with respect to the regex length + the string length,
-// but usually it's must faster (often close to linear).
-bool MatchRegexAnywhere(const char* regex, const char* str) {
- if (regex == NULL || str == NULL)
- return false;
-
- if (*regex == '^')
- return MatchRegexAtHead(regex + 1, str);
-
- // A successful match can be anywhere in str.
- do {
- if (MatchRegexAtHead(regex, str))
- return true;
- } while (*str++ != '\0');
- return false;
-}
-
-// Implements the RE class.
-
-RE::~RE() {
- free(const_cast<char*>(pattern_));
- free(const_cast<char*>(full_pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
- return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
- return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
- pattern_ = full_pattern_ = NULL;
- if (regex != NULL) {
- pattern_ = posix::StrDup(regex);
- }
-
- is_valid_ = ValidateRegex(regex);
- if (!is_valid_) {
- // No need to calculate the full pattern when the regex is invalid.
- return;
- }
-
- const size_t len = strlen(regex);
- // Reserves enough bytes to hold the regular expression used for a
- // full match: we need space to prepend a '^', append a '$', and
- // terminate the string with '\0'.
- char* buffer = static_cast<char*>(malloc(len + 3));
- full_pattern_ = buffer;
-
- if (*regex != '^')
- *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
-
- // We don't use snprintf or strncpy, as they trigger a warning when
- // compiled with VC++ 8.0.
- memcpy(buffer, regex, len);
- buffer += len;
-
- if (len == 0 || regex[len - 1] != '$')
- *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
-
- *buffer = '\0';
-}
-
-#endif // GTEST_USES_POSIX_RE
-
-const char kUnknownFile[] = "unknown file";
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
- const char* const file_name = file == NULL ? kUnknownFile : file;
-
- if (line < 0) {
- return String::Format("%s:", file_name).c_str();
- }
-#ifdef _MSC_VER
- return String::Format("%s(%d):", file_name, line).c_str();
-#else
- return String::Format("%s:%d:", file_name, line).c_str();
-#endif // _MSC_VER
-}
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-// Note that FormatCompilerIndependentFileLocation() does NOT append colon
-// to the file location it produces, unlike FormatFileLocation().
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
- const char* file, int line) {
- const char* const file_name = file == NULL ? kUnknownFile : file;
-
- if (line < 0)
- return file_name;
- else
- return String::Format("%s:%d", file_name, line).c_str();
-}
-
-
-GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
- : severity_(severity) {
- const char* const marker =
- severity == GTEST_INFO ? "[ INFO ]" :
- severity == GTEST_WARNING ? "[WARNING]" :
- severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
- GetStream() << ::std::endl << marker << " "
- << FormatFileLocation(file, line).c_str() << ": ";
-}
-
-// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
-GTestLog::~GTestLog() {
- GetStream() << ::std::endl;
- if (severity_ == GTEST_FATAL) {
- fflush(stderr);
- posix::Abort();
- }
-}
-// Disable Microsoft deprecation warnings for POSIX functions called from
-// this class (creat, dup, dup2, and close)
-#ifdef _MSC_VER
-# pragma warning(push)
-# pragma warning(disable: 4996)
-#endif // _MSC_VER
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Object that captures an output stream (stdout/stderr).
-class CapturedStream {
- public:
- // The ctor redirects the stream to a temporary file.
- CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
-
-# if GTEST_OS_WINDOWS
- char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
- char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
-
- ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
- const UINT success = ::GetTempFileNameA(temp_dir_path,
- "gtest_redir",
- 0, // Generate unique file name.
- temp_file_path);
- GTEST_CHECK_(success != 0)
- << "Unable to create a temporary file in " << temp_dir_path;
- const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
- GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
- << temp_file_path;
- filename_ = temp_file_path;
-# else
- // There's no guarantee that a test has write access to the
- // current directory, so we create the temporary file in the /tmp
- // directory instead.
- char name_template[] = "/tmp/captured_stream.XXXXXX";
- const int captured_fd = mkstemp(name_template);
- filename_ = name_template;
-# endif // GTEST_OS_WINDOWS
- fflush(NULL);
- dup2(captured_fd, fd_);
- close(captured_fd);
- }
-
- ~CapturedStream() {
- remove(filename_.c_str());
- }
-
- String GetCapturedString() {
- if (uncaptured_fd_ != -1) {
- // Restores the original stream.
- fflush(NULL);
- dup2(uncaptured_fd_, fd_);
- close(uncaptured_fd_);
- uncaptured_fd_ = -1;
- }
-
- FILE* const file = posix::FOpen(filename_.c_str(), "r");
- const String content = ReadEntireFile(file);
- posix::FClose(file);
- return content;
- }
-
- private:
- // Reads the entire content of a file as a String.
- static String ReadEntireFile(FILE* file);
-
- // Returns the size (in bytes) of a file.
- static size_t GetFileSize(FILE* file);
-
- const int fd_; // A stream to capture.
- int uncaptured_fd_;
- // Name of the temporary file holding the stderr output.
- ::std::string filename_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
-};
-
-// Returns the size (in bytes) of a file.
-size_t CapturedStream::GetFileSize(FILE* file) {
- fseek(file, 0, SEEK_END);
- return static_cast<size_t>(ftell(file));
-}
-
-// Reads the entire content of a file as a string.
-String CapturedStream::ReadEntireFile(FILE* file) {
- const size_t file_size = GetFileSize(file);
- char* const buffer = new char[file_size];
-
- size_t bytes_last_read = 0; // # of bytes read in the last fread()
- size_t bytes_read = 0; // # of bytes read so far
-
- fseek(file, 0, SEEK_SET);
-
- // Keeps reading the file until we cannot read further or the
- // pre-determined file size is reached.
- do {
- bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
- bytes_read += bytes_last_read;
- } while (bytes_last_read > 0 && bytes_read < file_size);
-
- const String content(buffer, bytes_read);
- delete[] buffer;
-
- return content;
-}
-
-# ifdef _MSC_VER
-# pragma warning(pop)
-# endif // _MSC_VER
-
-static CapturedStream* g_captured_stderr = NULL;
-static CapturedStream* g_captured_stdout = NULL;
-
-// Starts capturing an output stream (stdout/stderr).
-void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
- if (*stream != NULL) {
- GTEST_LOG_(FATAL) << "Only one " << stream_name
- << " capturer can exist at a time.";
- }
- *stream = new CapturedStream(fd);
-}
-
-// Stops capturing the output stream and returns the captured string.
-String GetCapturedStream(CapturedStream** captured_stream) {
- const String content = (*captured_stream)->GetCapturedString();
-
- delete *captured_stream;
- *captured_stream = NULL;
-
- return content;
-}
-
-// Starts capturing stdout.
-void CaptureStdout() {
- CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
-}
-
-// Starts capturing stderr.
-void CaptureStderr() {
- CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
-}
-
-// Stops capturing stdout and returns the captured string.
-String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }
-
-// Stops capturing stderr and returns the captured string.
-String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
-
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments. Set by InitGoogleTest().
-::std::vector<String> g_argvs;
-
-// Returns the command line as a vector of strings.
-const ::std::vector<String>& GetArgvs() { return g_argvs; }
-
-#endif // GTEST_HAS_DEATH_TEST
-
-#if GTEST_OS_WINDOWS_MOBILE
-namespace posix {
-void Abort() {
- DebugBreak();
- TerminateProcess(GetCurrentProcess(), 1);
-}
-} // namespace posix
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Returns the name of the environment variable corresponding to the
-// given flag. For example, FlagToEnvVar("foo") will return
-// "GTEST_FOO" in the open-source version.
-static String FlagToEnvVar(const char* flag) {
- const String full_flag =
- (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
-
- Message env_var;
- for (size_t i = 0; i != full_flag.length(); i++) {
- env_var << ToUpper(full_flag.c_str()[i]);
- }
-
- return env_var.GetString();
-}
-
-// Parses 'str' for a 32-bit signed integer. If successful, writes
-// the result to *value and returns true; otherwise leaves *value
-// unchanged and returns false.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
- // Parses the environment variable as a decimal integer.
- char* end = NULL;
- const long long_value = strtol(str, &end, 10); // NOLINT
-
- // Has strtol() consumed all characters in the string?
- if (*end != '\0') {
- // No - an invalid character was encountered.
- Message msg;
- msg << "WARNING: " << src_text
- << " is expected to be a 32-bit integer, but actually"
- << " has value \"" << str << "\".\n";
- printf("%s", msg.GetString().c_str());
- fflush(stdout);
- return false;
- }
-
- // Is the parsed value in the range of an Int32?
- const Int32 result = static_cast<Int32>(long_value);
- if (long_value == LONG_MAX || long_value == LONG_MIN ||
- // The parsed value overflows as a long. (strtol() returns
- // LONG_MAX or LONG_MIN when the input overflows.)
- result != long_value
- // The parsed value overflows as an Int32.
- ) {
- Message msg;
- msg << "WARNING: " << src_text
- << " is expected to be a 32-bit integer, but actually"
- << " has value " << str << ", which overflows.\n";
- printf("%s", msg.GetString().c_str());
- fflush(stdout);
- return false;
- }
-
- *value = result;
- return true;
-}
-
-// Reads and returns the Boolean environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-//
-// The value is considered true iff it's not "0".
-bool BoolFromGTestEnv(const char* flag, bool default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const string_value = posix::GetEnv(env_var.c_str());
- return string_value == NULL ?
- default_value : strcmp(string_value, "0") != 0;
-}
-
-// Reads and returns a 32-bit integer stored in the environment
-// variable corresponding to the given flag; if it isn't set or
-// doesn't represent a valid 32-bit integer, returns default_value.
-Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const string_value = posix::GetEnv(env_var.c_str());
- if (string_value == NULL) {
- // The environment variable is not set.
- return default_value;
- }
-
- Int32 result = default_value;
- if (!ParseInt32(Message() << "Environment variable " << env_var,
- string_value, &result)) {
- printf("The default value %s is used.\n",
- (Message() << default_value).GetString().c_str());
- fflush(stdout);
- return default_value;
- }
-
- return result;
-}
-
-// Reads and returns the string environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-const char* StringFromGTestEnv(const char* flag, const char* default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const value = posix::GetEnv(env_var.c_str());
- return value == NULL ? default_value : value;
-}
-
-} // namespace internal
-} // namespace testing
+++ /dev/null
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// It uses the << operator when possible, and prints the bytes in the
-// object otherwise. A user can override its behavior for a class
-// type Foo by defining either operator<<(::std::ostream&, const Foo&)
-// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
-// defines Foo.
-
-#include "gtest/gtest-printers.h"
-#include <ctype.h>
-#include <stdio.h>
-#include <ostream> // NOLINT
-#include <string>
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-
-namespace {
-
-using ::std::ostream;
-
-#if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s.
-# define snprintf _snprintf
-#elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf.
-# define snprintf _snprintf_s
-#elif _MSC_VER
-# define snprintf _snprintf
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Prints a segment of bytes in the given object.
-void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
- size_t count, ostream* os) {
- char text[5] = "";
- for (size_t i = 0; i != count; i++) {
- const size_t j = start + i;
- if (i != 0) {
- // Organizes the bytes into groups of 2 for easy parsing by
- // human.
- if ((j % 2) == 0)
- *os << ' ';
- else
- *os << '-';
- }
- snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
- *os << text;
- }
-}
-
-// Prints the bytes in the given value to the given ostream.
-void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
- ostream* os) {
- // Tells the user how big the object is.
- *os << count << "-byte object <";
-
- const size_t kThreshold = 132;
- const size_t kChunkSize = 64;
- // If the object size is bigger than kThreshold, we'll have to omit
- // some details by printing only the first and the last kChunkSize
- // bytes.
- // TODO(wan): let the user control the threshold using a flag.
- if (count < kThreshold) {
- PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
- } else {
- PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
- *os << " ... ";
- // Rounds up to 2-byte boundary.
- const size_t resume_pos = (count - kChunkSize + 1)/2*2;
- PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
- }
- *os << ">";
-}
-
-} // namespace
-
-namespace internal2 {
-
-// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
-// given object. The delegation simplifies the implementation, which
-// uses the << operator and thus is easier done outside of the
-// ::testing::internal namespace, which contains a << operator that
-// sometimes conflicts with the one in STL.
-void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
- ostream* os) {
- PrintBytesInObjectToImpl(obj_bytes, count, os);
-}
-
-} // namespace internal2
-
-namespace internal {
-
-// Depending on the value of a char (or wchar_t), we print it in one
-// of three formats:
-// - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
-// - as a hexidecimal escape sequence (e.g. '\x7F'), or
-// - as a special escape sequence (e.g. '\r', '\n').
-enum CharFormat {
- kAsIs,
- kHexEscape,
- kSpecialEscape
-};
-
-// Returns true if c is a printable ASCII character. We test the
-// value of c directly instead of calling isprint(), which is buggy on
-// Windows Mobile.
-inline bool IsPrintableAscii(wchar_t c) {
- return 0x20 <= c && c <= 0x7E;
-}
-
-// Prints a wide or narrow char c as a character literal without the
-// quotes, escaping it when necessary; returns how c was formatted.
-// The template argument UnsignedChar is the unsigned version of Char,
-// which is the type of c.
-template <typename UnsignedChar, typename Char>
-static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
- switch (static_cast<wchar_t>(c)) {
- case L'\0':
- *os << "\\0";
- break;
- case L'\'':
- *os << "\\'";
- break;
- case L'\\':
- *os << "\\\\";
- break;
- case L'\a':
- *os << "\\a";
- break;
- case L'\b':
- *os << "\\b";
- break;
- case L'\f':
- *os << "\\f";
- break;
- case L'\n':
- *os << "\\n";
- break;
- case L'\r':
- *os << "\\r";
- break;
- case L'\t':
- *os << "\\t";
- break;
- case L'\v':
- *os << "\\v";
- break;
- default:
- if (IsPrintableAscii(c)) {
- *os << static_cast<char>(c);
- return kAsIs;
- } else {
- *os << String::Format("\\x%X", static_cast<UnsignedChar>(c));
- return kHexEscape;
- }
- }
- return kSpecialEscape;
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
- switch (c) {
- case L'\'':
- *os << "'";
- return kAsIs;
- case L'"':
- *os << "\\\"";
- return kSpecialEscape;
- default:
- return PrintAsCharLiteralTo<wchar_t>(c, os);
- }
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {
- return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);
-}
-
-// Prints a wide or narrow character c and its code. '\0' is printed
-// as "'\\0'", other unprintable characters are also properly escaped
-// using the standard C++ escape sequence. The template argument
-// UnsignedChar is the unsigned version of Char, which is the type of c.
-template <typename UnsignedChar, typename Char>
-void PrintCharAndCodeTo(Char c, ostream* os) {
- // First, print c as a literal in the most readable form we can find.
- *os << ((sizeof(c) > 1) ? "L'" : "'");
- const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
- *os << "'";
-
- // To aid user debugging, we also print c's code in decimal, unless
- // it's 0 (in which case c was printed as '\\0', making the code
- // obvious).
- if (c == 0)
- return;
- *os << " (" << String::Format("%d", c).c_str();
-
- // For more convenience, we print c's code again in hexidecimal,
- // unless c was already printed in the form '\x##' or the code is in
- // [1, 9].
- if (format == kHexEscape || (1 <= c && c <= 9)) {
- // Do nothing.
- } else {
- *os << String::Format(", 0x%X",
- static_cast<UnsignedChar>(c)).c_str();
- }
- *os << ")";
-}
-
-void PrintTo(unsigned char c, ::std::ostream* os) {
- PrintCharAndCodeTo<unsigned char>(c, os);
-}
-void PrintTo(signed char c, ::std::ostream* os) {
- PrintCharAndCodeTo<unsigned char>(c, os);
-}
-
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its code. L'\0' is printed as "L'\\0'".
-void PrintTo(wchar_t wc, ostream* os) {
- PrintCharAndCodeTo<wchar_t>(wc, os);
-}
-
-// Prints the given array of characters to the ostream.
-// The array starts at *begin, the length is len, it may include '\0' characters
-// and may not be null-terminated.
-static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {
- *os << "\"";
- bool is_previous_hex = false;
- for (size_t index = 0; index < len; ++index) {
- const char cur = begin[index];
- if (is_previous_hex && IsXDigit(cur)) {
- // Previous character is of '\x..' form and this character can be
- // interpreted as another hexadecimal digit in its number. Break string to
- // disambiguate.
- *os << "\" \"";
- }
- is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;
- }
- *os << "\"";
-}
-
-// Prints a (const) char array of 'len' elements, starting at address 'begin'.
-void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
- PrintCharsAsStringTo(begin, len, os);
-}
-
-// Prints the given array of wide characters to the ostream.
-// The array starts at *begin, the length is len, it may include L'\0'
-// characters and may not be null-terminated.
-static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,
- ostream* os) {
- *os << "L\"";
- bool is_previous_hex = false;
- for (size_t index = 0; index < len; ++index) {
- const wchar_t cur = begin[index];
- if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {
- // Previous character is of '\x..' form and this character can be
- // interpreted as another hexadecimal digit in its number. Break string to
- // disambiguate.
- *os << "\" L\"";
- }
- is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;
- }
- *os << "\"";
-}
-
-// Prints the given C string to the ostream.
-void PrintTo(const char* s, ostream* os) {
- if (s == NULL) {
- *os << "NULL";
- } else {
- *os << ImplicitCast_<const void*>(s) << " pointing to ";
- PrintCharsAsStringTo(s, strlen(s), os);
- }
-}
-
-// MSVC compiler can be configured to define whar_t as a typedef
-// of unsigned short. Defining an overload for const wchar_t* in that case
-// would cause pointers to unsigned shorts be printed as wide strings,
-// possibly accessing more memory than intended and causing invalid
-// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
-// wchar_t is implemented as a native type.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Prints the given wide C string to the ostream.
-void PrintTo(const wchar_t* s, ostream* os) {
- if (s == NULL) {
- *os << "NULL";
- } else {
- *os << ImplicitCast_<const void*>(s) << " pointing to ";
- PrintWideCharsAsStringTo(s, wcslen(s), os);
- }
-}
-#endif // wchar_t is native
-
-// Prints a ::string object.
-#if GTEST_HAS_GLOBAL_STRING
-void PrintStringTo(const ::string& s, ostream* os) {
- PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_GLOBAL_STRING
-
-void PrintStringTo(const ::std::string& s, ostream* os) {
- PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-
-// Prints a ::wstring object.
-#if GTEST_HAS_GLOBAL_WSTRING
-void PrintWideStringTo(const ::wstring& s, ostream* os) {
- PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
- PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-} // namespace internal
-
-} // namespace testing
+++ /dev/null
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule@google.com (Markus Heule)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest-test-part.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-using internal::GetUnitTestImpl;
-
-// Gets the summary of the failure message by omitting the stack trace
-// in it.
-internal::String TestPartResult::ExtractSummary(const char* message) {
- const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
- return stack_trace == NULL ? internal::String(message) :
- internal::String(message, stack_trace - message);
-}
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
- return os
- << result.file_name() << ":" << result.line_number() << ": "
- << (result.type() == TestPartResult::kSuccess ? "Success" :
- result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
- "Non-fatal failure") << ":\n"
- << result.message() << std::endl;
-}
-
-// Appends a TestPartResult to the array.
-void TestPartResultArray::Append(const TestPartResult& result) {
- array_.push_back(result);
-}
-
-// Returns the TestPartResult at the given index (0-based).
-const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
- if (index < 0 || index >= size()) {
- printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
- internal::posix::Abort();
- }
-
- return array_[index];
-}
-
-// Returns the number of TestPartResult objects in the array.
-int TestPartResultArray::size() const {
- return static_cast<int>(array_.size());
-}
-
-namespace internal {
-
-HasNewFatalFailureHelper::HasNewFatalFailureHelper()
- : has_new_fatal_failure_(false),
- original_reporter_(GetUnitTestImpl()->
- GetTestPartResultReporterForCurrentThread()) {
- GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
-}
-
-HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
- GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
- original_reporter_);
-}
-
-void HasNewFatalFailureHelper::ReportTestPartResult(
- const TestPartResult& result) {
- if (result.fatally_failed())
- has_new_fatal_failure_ = true;
- original_reporter_->ReportTestPartResult(result);
-}
-
-} // namespace internal
-
-} // namespace testing
+++ /dev/null
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-
-#include "gtest/gtest-typed-test.h"
-#include "gtest/gtest.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// Skips to the first non-space char in str. Returns an empty string if str
-// contains only whitespace characters.
-static const char* SkipSpaces(const char* str) {
- while (IsSpace(*str))
- str++;
- return str;
-}
-
-// Verifies that registered_tests match the test names in
-// defined_test_names_; returns registered_tests if successful, or
-// aborts the program otherwise.
-const char* TypedTestCasePState::VerifyRegisteredTestNames(
- const char* file, int line, const char* registered_tests) {
- typedef ::std::set<const char*>::const_iterator DefinedTestIter;
- registered_ = true;
-
- // Skip initial whitespace in registered_tests since some
- // preprocessors prefix stringizied literals with whitespace.
- registered_tests = SkipSpaces(registered_tests);
-
- Message errors;
- ::std::set<String> tests;
- for (const char* names = registered_tests; names != NULL;
- names = SkipComma(names)) {
- const String name = GetPrefixUntilComma(names);
- if (tests.count(name) != 0) {
- errors << "Test " << name << " is listed more than once.\n";
- continue;
- }
-
- bool found = false;
- for (DefinedTestIter it = defined_test_names_.begin();
- it != defined_test_names_.end();
- ++it) {
- if (name == *it) {
- found = true;
- break;
- }
- }
-
- if (found) {
- tests.insert(name);
- } else {
- errors << "No test named " << name
- << " can be found in this test case.\n";
- }
- }
-
- for (DefinedTestIter it = defined_test_names_.begin();
- it != defined_test_names_.end();
- ++it) {
- if (tests.count(*it) == 0) {
- errors << "You forgot to list test " << *it << ".\n";
- }
- }
-
- const String& errors_str = errors.GetString();
- if (errors_str != "") {
- fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
- errors_str.c_str());
- fflush(stderr);
- posix::Abort();
- }
-
- return registered_tests;
-}
-
-#endif // GTEST_HAS_TYPED_TEST_P
-
-} // namespace internal
-} // namespace testing
+++ /dev/null
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan@google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest.h"
-#include "gtest/gtest-spi.h"
-
-#include <ctype.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include <algorithm>
-#include <ostream> // NOLINT
-#include <sstream>
-#include <vector>
-
-#if GTEST_OS_LINUX
-
-// TODO(kenton@google.com): Use autoconf to detect availability of
-// gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-# include <fcntl.h> // NOLINT
-# include <limits.h> // NOLINT
-# include <sched.h> // NOLINT
-// Declares vsnprintf(). This header is not available on Windows.
-# include <strings.h> // NOLINT
-# include <sys/mman.h> // NOLINT
-# include <sys/time.h> // NOLINT
-# include <unistd.h> // NOLINT
-# include <string>
-
-#elif GTEST_OS_SYMBIAN
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-
-#elif GTEST_OS_ZOS
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-
-// On z/OS we additionally need strings.h for strcasecmp.
-# include <strings.h> // NOLINT
-
-#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
-
-# include <windows.h> // NOLINT
-
-#elif GTEST_OS_WINDOWS // We are on Windows proper.
-
-# include <io.h> // NOLINT
-# include <sys/timeb.h> // NOLINT
-# include <sys/types.h> // NOLINT
-# include <sys/stat.h> // NOLINT
-
-# if GTEST_OS_WINDOWS_MINGW
-// MinGW has gettimeofday() but not _ftime64().
-// TODO(kenton@google.com): Use autoconf to detect availability of
-// gettimeofday().
-// TODO(kenton@google.com): There are other ways to get the time on
-// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
-// supports these. consider using them instead.
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-# endif // GTEST_OS_WINDOWS_MINGW
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <windows.h> // NOLINT
-
-#else
-
-// Assume other platforms have gettimeofday().
-// TODO(kenton@google.com): Use autoconf to detect availability of
-// gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <sys/time.h> // NOLINT
-# include <unistd.h> // NOLINT
-
-#endif // GTEST_OS_LINUX
-
-#if GTEST_HAS_EXCEPTIONS
-# include <stdexcept>
-#endif
-
-#if GTEST_CAN_STREAM_RESULTS_
-# include <arpa/inet.h> // NOLINT
-# include <netdb.h> // NOLINT
-#endif
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-#if GTEST_OS_WINDOWS
-# define vsnprintf _vsnprintf
-#endif // GTEST_OS_WINDOWS
-
-namespace testing {
-
-using internal::CountIf;
-using internal::ForEach;
-using internal::GetElementOr;
-using internal::Shuffle;
-
-// Constants.
-
-// A test whose test case name or test name matches this filter is
-// disabled and not run.
-static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
-
-// A test case whose name matches this filter is considered a death
-// test case and will be run before test cases whose name doesn't
-// match this filter.
-static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
-
-// A test filter that matches everything.
-static const char kUniversalFilter[] = "*";
-
-// The default output file for XML output.
-static const char kDefaultOutputFile[] = "test_detail.xml";
-
-// The environment variable name for the test shard index.
-static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
-// The environment variable name for the total number of test shards.
-static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
-// The environment variable name for the test shard status file.
-static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
-
-namespace internal {
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-const char kStackTraceMarker[] = "\nStack trace:\n";
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-bool g_help_flag = false;
-
-} // namespace internal
-
-GTEST_DEFINE_bool_(
- also_run_disabled_tests,
- internal::BoolFromGTestEnv("also_run_disabled_tests", false),
- "Run disabled tests too, in addition to the tests normally being run.");
-
-GTEST_DEFINE_bool_(
- break_on_failure,
- internal::BoolFromGTestEnv("break_on_failure", false),
- "True iff a failed assertion should be a debugger break-point.");
-
-GTEST_DEFINE_bool_(
- catch_exceptions,
- internal::BoolFromGTestEnv("catch_exceptions", true),
- "True iff " GTEST_NAME_
- " should catch exceptions and treat them as test failures.");
-
-GTEST_DEFINE_string_(
- color,
- internal::StringFromGTestEnv("color", "auto"),
- "Whether to use colors in the output. Valid values: yes, no, "
- "and auto. 'auto' means to use colors if the output is "
- "being sent to a terminal and the TERM environment variable "
- "is set to xterm, xterm-color, xterm-256color, linux or cygwin.");
-
-GTEST_DEFINE_string_(
- filter,
- internal::StringFromGTestEnv("filter", kUniversalFilter),
- "A colon-separated list of glob (not regex) patterns "
- "for filtering the tests to run, optionally followed by a "
- "'-' and a : separated list of negative patterns (tests to "
- "exclude). A test is run if it matches one of the positive "
- "patterns and does not match any of the negative patterns.");
-
-GTEST_DEFINE_bool_(list_tests, false,
- "List all tests without running them.");
-
-GTEST_DEFINE_string_(
- output,
- internal::StringFromGTestEnv("output", ""),
- "A format (currently must be \"xml\"), optionally followed "
- "by a colon and an output file name or directory. A directory "
- "is indicated by a trailing pathname separator. "
- "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
- "If a directory is specified, output files will be created "
- "within that directory, with file-names based on the test "
- "executable's name and, if necessary, made unique by adding "
- "digits.");
-
-GTEST_DEFINE_bool_(
- print_time,
- internal::BoolFromGTestEnv("print_time", true),
- "True iff " GTEST_NAME_
- " should display elapsed time in text output.");
-
-GTEST_DEFINE_int32_(
- random_seed,
- internal::Int32FromGTestEnv("random_seed", 0),
- "Random number seed to use when shuffling test orders. Must be in range "
- "[1, 99999], or 0 to use a seed based on the current time.");
-
-GTEST_DEFINE_int32_(
- repeat,
- internal::Int32FromGTestEnv("repeat", 1),
- "How many times to repeat each test. Specify a negative number "
- "for repeating forever. Useful for shaking out flaky tests.");
-
-GTEST_DEFINE_bool_(
- show_internal_stack_frames, false,
- "True iff " GTEST_NAME_ " should include internal stack frames when "
- "printing test failure stack traces.");
-
-GTEST_DEFINE_bool_(
- shuffle,
- internal::BoolFromGTestEnv("shuffle", false),
- "True iff " GTEST_NAME_
- " should randomize tests' order on every run.");
-
-GTEST_DEFINE_int32_(
- stack_trace_depth,
- internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
- "The maximum number of stack frames to print when an "
- "assertion fails. The valid range is 0 through 100, inclusive.");
-
-GTEST_DEFINE_string_(
- stream_result_to,
- internal::StringFromGTestEnv("stream_result_to", ""),
- "This flag specifies the host name and the port number on which to stream "
- "test results. Example: \"localhost:555\". The flag is effective only on "
- "Linux.");
-
-GTEST_DEFINE_bool_(
- throw_on_failure,
- internal::BoolFromGTestEnv("throw_on_failure", false),
- "When this flag is specified, a failed assertion will throw an exception "
- "if exceptions are enabled or exit the program with a non-zero code "
- "otherwise.");
-
-namespace internal {
-
-// Generates a random number from [0, range), using a Linear
-// Congruential Generator (LCG). Crashes if 'range' is 0 or greater
-// than kMaxRange.
-UInt32 Random::Generate(UInt32 range) {
- // These constants are the same as are used in glibc's rand(3).
- state_ = (1103515245U*state_ + 12345U) % kMaxRange;
-
- GTEST_CHECK_(range > 0)
- << "Cannot generate a number in the range [0, 0).";
- GTEST_CHECK_(range <= kMaxRange)
- << "Generation of a number in [0, " << range << ") was requested, "
- << "but this can only generate numbers in [0, " << kMaxRange << ").";
-
- // Converting via modulus introduces a bit of downward bias, but
- // it's simple, and a linear congruential generator isn't too good
- // to begin with.
- return state_ % range;
-}
-
-// GTestIsInitialized() returns true iff the user has initialized
-// Google Test. Useful for catching the user mistake of not initializing
-// Google Test before calling RUN_ALL_TESTS().
-//
-// A user must call testing::InitGoogleTest() to initialize Google
-// Test. g_init_gtest_count is set to the number of times
-// InitGoogleTest() has been called. We don't protect this variable
-// under a mutex as it is only accessed in the main thread.
-int g_init_gtest_count = 0;
-static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
-
-// Iterates over a vector of TestCases, keeping a running sum of the
-// results of calling a given int-returning method on each.
-// Returns the sum.
-static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
- int (TestCase::*method)() const) {
- int sum = 0;
- for (size_t i = 0; i < case_list.size(); i++) {
- sum += (case_list[i]->*method)();
- }
- return sum;
-}
-
-// Returns true iff the test case passed.
-static bool TestCasePassed(const TestCase* test_case) {
- return test_case->should_run() && test_case->Passed();
-}
-
-// Returns true iff the test case failed.
-static bool TestCaseFailed(const TestCase* test_case) {
- return test_case->should_run() && test_case->Failed();
-}
-
-// Returns true iff test_case contains at least one test that should
-// run.
-static bool ShouldRunTestCase(const TestCase* test_case) {
- return test_case->should_run();
-}
-
-// AssertHelper constructor.
-AssertHelper::AssertHelper(TestPartResult::Type type,
- const char* file,
- int line,
- const char* message)
- : data_(new AssertHelperData(type, file, line, message)) {
-}
-
-AssertHelper::~AssertHelper() {
- delete data_;
-}
-
-// Message assignment, for assertion streaming support.
-void AssertHelper::operator=(const Message& message) const {
- UnitTest::GetInstance()->
- AddTestPartResult(data_->type, data_->file, data_->line,
- AppendUserMessage(data_->message, message),
- UnitTest::GetInstance()->impl()
- ->CurrentOsStackTraceExceptTop(1)
- // Skips the stack frame for this function itself.
- ); // NOLINT
-}
-
-// Mutex for linked pointers.
-GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// Application pathname gotten in InitGoogleTest.
-String g_executable_path;
-
-// Returns the current application's name, removing directory path if that
-// is present.
-FilePath GetCurrentExecutableName() {
- FilePath result;
-
-#if GTEST_OS_WINDOWS
- result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
-#else
- result.Set(FilePath(g_executable_path));
-#endif // GTEST_OS_WINDOWS
-
- return result.RemoveDirectoryName();
-}
-
-// Functions for processing the gtest_output flag.
-
-// Returns the output format, or "" for normal printed output.
-String UnitTestOptions::GetOutputFormat() {
- const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
- if (gtest_output_flag == NULL) return String("");
-
- const char* const colon = strchr(gtest_output_flag, ':');
- return (colon == NULL) ?
- String(gtest_output_flag) :
- String(gtest_output_flag, colon - gtest_output_flag);
-}
-
-// Returns the name of the requested output file, or the default if none
-// was explicitly specified.
-String UnitTestOptions::GetAbsolutePathToOutputFile() {
- const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
- if (gtest_output_flag == NULL)
- return String("");
-
- const char* const colon = strchr(gtest_output_flag, ':');
- if (colon == NULL)
- return String(internal::FilePath::ConcatPaths(
- internal::FilePath(
- UnitTest::GetInstance()->original_working_dir()),
- internal::FilePath(kDefaultOutputFile)).ToString() );
-
- internal::FilePath output_name(colon + 1);
- if (!output_name.IsAbsolutePath())
- // TODO(wan@google.com): on Windows \some\path is not an absolute
- // path (as its meaning depends on the current drive), yet the
- // following logic for turning it into an absolute path is wrong.
- // Fix it.
- output_name = internal::FilePath::ConcatPaths(
- internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
- internal::FilePath(colon + 1));
-
- if (!output_name.IsDirectory())
- return output_name.ToString();
-
- internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
- output_name, internal::GetCurrentExecutableName(),
- GetOutputFormat().c_str()));
- return result.ToString();
-}
-
-// Returns true iff the wildcard pattern matches the string. The
-// first ':' or '\0' character in pattern marks the end of it.
-//
-// This recursive algorithm isn't very efficient, but is clear and
-// works well enough for matching test names, which are short.
-bool UnitTestOptions::PatternMatchesString(const char *pattern,
- const char *str) {
- switch (*pattern) {
- case '\0':
- case ':': // Either ':' or '\0' marks the end of the pattern.
- return *str == '\0';
- case '?': // Matches any single character.
- return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
- case '*': // Matches any string (possibly empty) of characters.
- return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
- PatternMatchesString(pattern + 1, str);
- default: // Non-special character. Matches itself.
- return *pattern == *str &&
- PatternMatchesString(pattern + 1, str + 1);
- }
-}
-
-bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
- const char *cur_pattern = filter;
- for (;;) {
- if (PatternMatchesString(cur_pattern, name.c_str())) {
- return true;
- }
-
- // Finds the next pattern in the filter.
- cur_pattern = strchr(cur_pattern, ':');
-
- // Returns if no more pattern can be found.
- if (cur_pattern == NULL) {
- return false;
- }
-
- // Skips the pattern separater (the ':' character).
- cur_pattern++;
- }
-}
-
-// TODO(keithray): move String function implementations to gtest-string.cc.
-
-// Returns true iff the user-specified filter matches the test case
-// name and the test name.
-bool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
- const String &test_name) {
- const String& full_name = String::Format("%s.%s",
- test_case_name.c_str(),
- test_name.c_str());
-
- // Split --gtest_filter at '-', if there is one, to separate into
- // positive filter and negative filter portions
- const char* const p = GTEST_FLAG(filter).c_str();
- const char* const dash = strchr(p, '-');
- String positive;
- String negative;
- if (dash == NULL) {
- positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter
- negative = String("");
- } else {
- positive = String(p, dash - p); // Everything up to the dash
- negative = String(dash+1); // Everything after the dash
- if (positive.empty()) {
- // Treat '-test1' as the same as '*-test1'
- positive = kUniversalFilter;
- }
- }
-
- // A filter is a colon-separated list of patterns. It matches a
- // test if any pattern in it matches the test.
- return (MatchesFilter(full_name, positive.c_str()) &&
- !MatchesFilter(full_name, negative.c_str()));
-}
-
-#if GTEST_HAS_SEH
-// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
-// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
-// This function is useful as an __except condition.
-int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
- // Google Test should handle a SEH exception if:
- // 1. the user wants it to, AND
- // 2. this is not a breakpoint exception, AND
- // 3. this is not a C++ exception (VC++ implements them via SEH,
- // apparently).
- //
- // SEH exception code for C++ exceptions.
- // (see http://support.microsoft.com/kb/185294 for more information).
- const DWORD kCxxExceptionCode = 0xe06d7363;
-
- bool should_handle = true;
-
- if (!GTEST_FLAG(catch_exceptions))
- should_handle = false;
- else if (exception_code == EXCEPTION_BREAKPOINT)
- should_handle = false;
- else if (exception_code == kCxxExceptionCode)
- should_handle = false;
-
- return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
-}
-#endif // GTEST_HAS_SEH
-
-} // namespace internal
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test. The 'result' parameter specifies where to report the
-// results. Intercepts only failures from the current thread.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
- TestPartResultArray* result)
- : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
- result_(result) {
- Init();
-}
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test. The 'result' parameter specifies where to report the
-// results.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
- InterceptMode intercept_mode, TestPartResultArray* result)
- : intercept_mode_(intercept_mode),
- result_(result) {
- Init();
-}
-
-void ScopedFakeTestPartResultReporter::Init() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
- old_reporter_ = impl->GetGlobalTestPartResultReporter();
- impl->SetGlobalTestPartResultReporter(this);
- } else {
- old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
- impl->SetTestPartResultReporterForCurrentThread(this);
- }
-}
-
-// The d'tor restores the test part result reporter used by Google Test
-// before.
-ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
- impl->SetGlobalTestPartResultReporter(old_reporter_);
- } else {
- impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
- }
-}
-
-// Increments the test part result count and remembers the result.
-// This method is from the TestPartResultReporterInterface interface.
-void ScopedFakeTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- result_->Append(result);
-}
-
-namespace internal {
-
-// Returns the type ID of ::testing::Test. We should always call this
-// instead of GetTypeId< ::testing::Test>() to get the type ID of
-// testing::Test. This is to work around a suspected linker bug when
-// using Google Test as a framework on Mac OS X. The bug causes
-// GetTypeId< ::testing::Test>() to return different values depending
-// on whether the call is from the Google Test framework itself or
-// from user test code. GetTestTypeId() is guaranteed to always
-// return the same value, as it always calls GetTypeId<>() from the
-// gtest.cc, which is within the Google Test framework.
-TypeId GetTestTypeId() {
- return GetTypeId<Test>();
-}
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library. This is solely for testing GetTestTypeId().
-extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
-
-// This predicate-formatter checks that 'results' contains a test part
-// failure of the given type and that the failure message contains the
-// given substring.
-AssertionResult HasOneFailure(const char* /* results_expr */,
- const char* /* type_expr */,
- const char* /* substr_expr */,
- const TestPartResultArray& results,
- TestPartResult::Type type,
- const string& substr) {
- const String expected(type == TestPartResult::kFatalFailure ?
- "1 fatal failure" :
- "1 non-fatal failure");
- Message msg;
- if (results.size() != 1) {
- msg << "Expected: " << expected << "\n"
- << " Actual: " << results.size() << " failures";
- for (int i = 0; i < results.size(); i++) {
- msg << "\n" << results.GetTestPartResult(i);
- }
- return AssertionFailure() << msg;
- }
-
- const TestPartResult& r = results.GetTestPartResult(0);
- if (r.type() != type) {
- return AssertionFailure() << "Expected: " << expected << "\n"
- << " Actual:\n"
- << r;
- }
-
- if (strstr(r.message(), substr.c_str()) == NULL) {
- return AssertionFailure() << "Expected: " << expected << " containing \""
- << substr << "\"\n"
- << " Actual:\n"
- << r;
- }
-
- return AssertionSuccess();
-}
-
-// The constructor of SingleFailureChecker remembers where to look up
-// test part results, what type of failure we expect, and what
-// substring the failure message should contain.
-SingleFailureChecker:: SingleFailureChecker(
- const TestPartResultArray* results,
- TestPartResult::Type type,
- const string& substr)
- : results_(results),
- type_(type),
- substr_(substr) {}
-
-// The destructor of SingleFailureChecker verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring. If that's not the case, a
-// non-fatal failure will be generated.
-SingleFailureChecker::~SingleFailureChecker() {
- EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
-}
-
-DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
- UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- unit_test_->current_test_result()->AddTestPartResult(result);
- unit_test_->listeners()->repeater()->OnTestPartResult(result);
-}
-
-DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
- UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
-}
-
-// Returns the global test part result reporter.
-TestPartResultReporterInterface*
-UnitTestImpl::GetGlobalTestPartResultReporter() {
- internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
- return global_test_part_result_repoter_;
-}
-
-// Sets the global test part result reporter.
-void UnitTestImpl::SetGlobalTestPartResultReporter(
- TestPartResultReporterInterface* reporter) {
- internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
- global_test_part_result_repoter_ = reporter;
-}
-
-// Returns the test part result reporter for the current thread.
-TestPartResultReporterInterface*
-UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
- return per_thread_test_part_result_reporter_.get();
-}
-
-// Sets the test part result reporter for the current thread.
-void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
- TestPartResultReporterInterface* reporter) {
- per_thread_test_part_result_reporter_.set(reporter);
-}
-
-// Gets the number of successful test cases.
-int UnitTestImpl::successful_test_case_count() const {
- return CountIf(test_cases_, TestCasePassed);
-}
-
-// Gets the number of failed test cases.
-int UnitTestImpl::failed_test_case_count() const {
- return CountIf(test_cases_, TestCaseFailed);
-}
-
-// Gets the number of all test cases.
-int UnitTestImpl::total_test_case_count() const {
- return static_cast<int>(test_cases_.size());
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTestImpl::test_case_to_run_count() const {
- return CountIf(test_cases_, ShouldRunTestCase);
-}
-
-// Gets the number of successful tests.
-int UnitTestImpl::successful_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
-}
-
-// Gets the number of failed tests.
-int UnitTestImpl::failed_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
-}
-
-// Gets the number of disabled tests.
-int UnitTestImpl::disabled_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
-}
-
-// Gets the number of all tests.
-int UnitTestImpl::total_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
-}
-
-// Gets the number of tests that should run.
-int UnitTestImpl::test_to_run_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
-// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
- (void)skip_count;
- return String("");
-}
-
-// Returns the current time in milliseconds.
-TimeInMillis GetTimeInMillis() {
-#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
- // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
- // http://analogous.blogspot.com/2005/04/epoch.html
- const TimeInMillis kJavaEpochToWinFileTimeDelta =
- static_cast<TimeInMillis>(116444736UL) * 100000UL;
- const DWORD kTenthMicrosInMilliSecond = 10000;
-
- SYSTEMTIME now_systime;
- FILETIME now_filetime;
- ULARGE_INTEGER now_int64;
- // TODO(kenton@google.com): Shouldn't this just use
- // GetSystemTimeAsFileTime()?
- GetSystemTime(&now_systime);
- if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
- now_int64.LowPart = now_filetime.dwLowDateTime;
- now_int64.HighPart = now_filetime.dwHighDateTime;
- now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
- kJavaEpochToWinFileTimeDelta;
- return now_int64.QuadPart;
- }
- return 0;
-#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
- __timeb64 now;
-
-# ifdef _MSC_VER
-
- // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
- // (deprecated function) there.
- // TODO(kenton@google.com): Use GetTickCount()? Or use
- // SystemTimeToFileTime()
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4996) // Temporarily disables warning 4996.
- _ftime64(&now);
-# pragma warning(pop) // Restores the warning state.
-# else
-
- _ftime64(&now);
-
-# endif // _MSC_VER
-
- return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
-#elif GTEST_HAS_GETTIMEOFDAY_
- struct timeval now;
- gettimeofday(&now, NULL);
- return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
-#else
-# error "Don't know how to get the current time on your system."
-#endif
-}
-
-// Utilities
-
-// class String
-
-// Returns the input enclosed in double quotes if it's not NULL;
-// otherwise returns "(null)". For example, "\"Hello\"" is returned
-// for input "Hello".
-//
-// This is useful for printing a C string in the syntax of a literal.
-//
-// Known issue: escape sequences are not handled yet.
-String String::ShowCStringQuoted(const char* c_str) {
- return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
-}
-
-// Copies at most length characters from str into a newly-allocated
-// piece of memory of size length+1. The memory is allocated with new[].
-// A terminating null byte is written to the memory, and a pointer to it
-// is returned. If str is NULL, NULL is returned.
-static char* CloneString(const char* str, size_t length) {
- if (str == NULL) {
- return NULL;
- } else {
- char* const clone = new char[length + 1];
- posix::StrNCpy(clone, str, length);
- clone[length] = '\0';
- return clone;
- }
-}
-
-// Clones a 0-terminated C string, allocating memory using new. The
-// caller is responsible for deleting[] the return value. Returns the
-// cloned string, or NULL if the input is NULL.
-const char * String::CloneCString(const char* c_str) {
- return (c_str == NULL) ?
- NULL : CloneString(c_str, strlen(c_str));
-}
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Creates a UTF-16 wide string from the given ANSI string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the wide string, or NULL if the
-// input is NULL.
-LPCWSTR String::AnsiToUtf16(const char* ansi) {
- if (!ansi) return NULL;
- const int length = strlen(ansi);
- const int unicode_length =
- MultiByteToWideChar(CP_ACP, 0, ansi, length,
- NULL, 0);
- WCHAR* unicode = new WCHAR[unicode_length + 1];
- MultiByteToWideChar(CP_ACP, 0, ansi, length,
- unicode, unicode_length);
- unicode[unicode_length] = 0;
- return unicode;
-}
-
-// Creates an ANSI string from the given wide string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the ANSI string, or NULL if the
-// input is NULL.
-const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {
- if (!utf16_str) return NULL;
- const int ansi_length =
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
- NULL, 0, NULL, NULL);
- char* ansi = new char[ansi_length + 1];
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
- ansi, ansi_length, NULL, NULL);
- ansi[ansi_length] = 0;
- return ansi;
-}
-
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Compares two C strings. Returns true iff they have the same content.
-//
-// Unlike strcmp(), this function can handle NULL argument(s). A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CStringEquals(const char * lhs, const char * rhs) {
- if ( lhs == NULL ) return rhs == NULL;
-
- if ( rhs == NULL ) return false;
-
- return strcmp(lhs, rhs) == 0;
-}
-
-#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-// Converts an array of wide chars to a narrow string using the UTF-8
-// encoding, and streams the result to the given Message object.
-static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
- Message* msg) {
- // TODO(wan): consider allowing a testing::String object to
- // contain '\0'. This will make it behave more like std::string,
- // and will allow ToUtf8String() to return the correct encoding
- // for '\0' s.t. we can get rid of the conditional here (and in
- // several other places).
- for (size_t i = 0; i != length; ) { // NOLINT
- if (wstr[i] != L'\0') {
- *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
- while (i != length && wstr[i] != L'\0')
- i++;
- } else {
- *msg << '\0';
- i++;
- }
- }
-}
-
-#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-} // namespace internal
-
-#if GTEST_HAS_STD_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::std::wstring& wstr) {
- internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
- return *this;
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::wstring& wstr) {
- internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
- return *this;
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// AssertionResult constructors.
-// Used in EXPECT_TRUE/FALSE(assertion_result).
-AssertionResult::AssertionResult(const AssertionResult& other)
- : success_(other.success_),
- message_(other.message_.get() != NULL ?
- new ::std::string(*other.message_) :
- static_cast< ::std::string*>(NULL)) {
-}
-
-// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
-AssertionResult AssertionResult::operator!() const {
- AssertionResult negation(!success_);
- if (message_.get() != NULL)
- negation << *message_;
- return negation;
-}
-
-// Makes a successful assertion result.
-AssertionResult AssertionSuccess() {
- return AssertionResult(true);
-}
-
-// Makes a failed assertion result.
-AssertionResult AssertionFailure() {
- return AssertionResult(false);
-}
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << message.
-AssertionResult AssertionFailure(const Message& message) {
- return AssertionFailure() << message;
-}
-
-namespace internal {
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-// expected_expression: "foo"
-// actual_expression: "bar"
-// expected_value: "5"
-// actual_value: "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-AssertionResult EqFailure(const char* expected_expression,
- const char* actual_expression,
- const String& expected_value,
- const String& actual_value,
- bool ignoring_case) {
- Message msg;
- msg << "Value of: " << actual_expression;
- if (actual_value != actual_expression) {
- msg << "\n Actual: " << actual_value;
- }
-
- msg << "\nExpected: " << expected_expression;
- if (ignoring_case) {
- msg << " (ignoring case)";
- }
- if (expected_value != expected_expression) {
- msg << "\nWhich is: " << expected_value;
- }
-
- return AssertionFailure() << msg;
-}
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,
- const char* expression_text,
- const char* actual_predicate_value,
- const char* expected_predicate_value) {
- const char* actual_message = assertion_result.message();
- Message msg;
- msg << "Value of: " << expression_text
- << "\n Actual: " << actual_predicate_value;
- if (actual_message[0] != '\0')
- msg << " (" << actual_message << ")";
- msg << "\nExpected: " << expected_predicate_value;
- return msg.GetString();
-}
-
-// Helper function for implementing ASSERT_NEAR.
-AssertionResult DoubleNearPredFormat(const char* expr1,
- const char* expr2,
- const char* abs_error_expr,
- double val1,
- double val2,
- double abs_error) {
- const double diff = fabs(val1 - val2);
- if (diff <= abs_error) return AssertionSuccess();
-
- // TODO(wan): do not print the value of an expression if it's
- // already a literal.
- return AssertionFailure()
- << "The difference between " << expr1 << " and " << expr2
- << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
- << expr1 << " evaluates to " << val1 << ",\n"
- << expr2 << " evaluates to " << val2 << ", and\n"
- << abs_error_expr << " evaluates to " << abs_error << ".";
-}
-
-
-// Helper template for implementing FloatLE() and DoubleLE().
-template <typename RawType>
-AssertionResult FloatingPointLE(const char* expr1,
- const char* expr2,
- RawType val1,
- RawType val2) {
- // Returns success if val1 is less than val2,
- if (val1 < val2) {
- return AssertionSuccess();
- }
-
- // or if val1 is almost equal to val2.
- const FloatingPoint<RawType> lhs(val1), rhs(val2);
- if (lhs.AlmostEquals(rhs)) {
- return AssertionSuccess();
- }
-
- // Note that the above two checks will both fail if either val1 or
- // val2 is NaN, as the IEEE floating-point standard requires that
- // any predicate involving a NaN must return false.
-
- ::std::stringstream val1_ss;
- val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << val1;
-
- ::std::stringstream val2_ss;
- val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << val2;
-
- return AssertionFailure()
- << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
- << " Actual: " << StringStreamToString(&val1_ss) << " vs "
- << StringStreamToString(&val2_ss);
-}
-
-} // namespace internal
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-AssertionResult FloatLE(const char* expr1, const char* expr2,
- float val1, float val2) {
- return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
-}
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-AssertionResult DoubleLE(const char* expr1, const char* expr2,
- double val1, double val2) {
- return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
-}
-
-namespace internal {
-
-// The helper function for {ASSERT|EXPECT}_EQ with int or enum
-// arguments.
-AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual) {
- if (expected == actual) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- FormatForComparisonFailureMessage(expected, actual),
- FormatForComparisonFailureMessage(actual, expected),
- false);
-}
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here
-// just to avoid copy-and-paste of similar code.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
- BiggestInt val1, BiggestInt val2) {\
- if (val1 op val2) {\
- return AssertionSuccess();\
- } else {\
- return AssertionFailure() \
- << "Expected: (" << expr1 << ") " #op " (" << expr2\
- << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
- << " vs " << FormatForComparisonFailureMessage(val2, val1);\
- }\
-}
-
-// Implements the helper function for {ASSERT|EXPECT}_NE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(NE, !=)
-// Implements the helper function for {ASSERT|EXPECT}_LE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LE, <=)
-// Implements the helper function for {ASSERT|EXPECT}_LT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LT, < )
-// Implements the helper function for {ASSERT|EXPECT}_GE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GE, >=)
-// Implements the helper function for {ASSERT|EXPECT}_GT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GT, > )
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual) {
- if (String::CStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowCStringQuoted(expected),
- String::ShowCStringQuoted(actual),
- false);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual) {
- if (String::CaseInsensitiveCStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowCStringQuoted(expected),
- String::ShowCStringQuoted(actual),
- true);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2) {
- if (!String::CStringEquals(s1, s2)) {
- return AssertionSuccess();
- } else {
- return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
- << s2_expression << "), actual: \""
- << s1 << "\" vs \"" << s2 << "\"";
- }
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2) {
- if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
- return AssertionSuccess();
- } else {
- return AssertionFailure()
- << "Expected: (" << s1_expression << ") != ("
- << s2_expression << ") (ignoring case), actual: \""
- << s1 << "\" vs \"" << s2 << "\"";
- }
-}
-
-} // namespace internal
-
-namespace {
-
-// Helper functions for implementing IsSubString() and IsNotSubstring().
-
-// This group of overloaded functions return true iff needle is a
-// substring of haystack. NULL is considered a substring of itself
-// only.
-
-bool IsSubstringPred(const char* needle, const char* haystack) {
- if (needle == NULL || haystack == NULL)
- return needle == haystack;
-
- return strstr(haystack, needle) != NULL;
-}
-
-bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
- if (needle == NULL || haystack == NULL)
- return needle == haystack;
-
- return wcsstr(haystack, needle) != NULL;
-}
-
-// StringType here can be either ::std::string or ::std::wstring.
-template <typename StringType>
-bool IsSubstringPred(const StringType& needle,
- const StringType& haystack) {
- return haystack.find(needle) != StringType::npos;
-}
-
-// This function implements either IsSubstring() or IsNotSubstring(),
-// depending on the value of the expected_to_be_substring parameter.
-// StringType here can be const char*, const wchar_t*, ::std::string,
-// or ::std::wstring.
-template <typename StringType>
-AssertionResult IsSubstringImpl(
- bool expected_to_be_substring,
- const char* needle_expr, const char* haystack_expr,
- const StringType& needle, const StringType& haystack) {
- if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
- return AssertionSuccess();
-
- const bool is_wide_string = sizeof(needle[0]) > 1;
- const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
- return AssertionFailure()
- << "Value of: " << needle_expr << "\n"
- << " Actual: " << begin_string_quote << needle << "\"\n"
- << "Expected: " << (expected_to_be_substring ? "" : "not ")
- << "a substring of " << haystack_expr << "\n"
- << "Which is: " << begin_string_quote << haystack << "\"";
-}
-
-} // namespace
-
-// IsSubstring() and IsNotSubstring() check whether needle is a
-// substring of haystack (NULL is considered a substring of itself
-// only), and return an appropriate error message when they fail.
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-#if GTEST_HAS_STD_WSTRING
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-
-namespace {
-
-// Helper function for IsHRESULT{SuccessFailure} predicates
-AssertionResult HRESULTFailureHelper(const char* expr,
- const char* expected,
- long hr) { // NOLINT
-# if GTEST_OS_WINDOWS_MOBILE
-
- // Windows CE doesn't support FormatMessage.
- const char error_text[] = "";
-
-# else
-
- // Looks up the human-readable system message for the HRESULT code
- // and since we're not passing any params to FormatMessage, we don't
- // want inserts expanded.
- const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS;
- const DWORD kBufSize = 4096; // String::Format can't exceed this length.
- // Gets the system's human readable message string for this HRESULT.
- char error_text[kBufSize] = { '\0' };
- DWORD message_length = ::FormatMessageA(kFlags,
- 0, // no source, we're asking system
- hr, // the error
- 0, // no line width restrictions
- error_text, // output buffer
- kBufSize, // buf size
- NULL); // no arguments for inserts
- // Trims tailing white space (FormatMessage leaves a trailing cr-lf)
- for (; message_length && IsSpace(error_text[message_length - 1]);
- --message_length) {
- error_text[message_length - 1] = '\0';
- }
-
-# endif // GTEST_OS_WINDOWS_MOBILE
-
- const String error_hex(String::Format("0x%08X ", hr));
- return ::testing::AssertionFailure()
- << "Expected: " << expr << " " << expected << ".\n"
- << " Actual: " << error_hex << error_text << "\n";
-}
-
-} // namespace
-
-AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT
- if (SUCCEEDED(hr)) {
- return AssertionSuccess();
- }
- return HRESULTFailureHelper(expr, "succeeds", hr);
-}
-
-AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT
- if (FAILED(hr)) {
- return AssertionSuccess();
- }
- return HRESULTFailureHelper(expr, "fails", hr);
-}
-
-#endif // GTEST_OS_WINDOWS
-
-// Utility functions for encoding Unicode text (wide strings) in
-// UTF-8.
-
-// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
-// like this:
-//
-// Code-point length Encoding
-// 0 - 7 bits 0xxxxxxx
-// 8 - 11 bits 110xxxxx 10xxxxxx
-// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx
-// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
-// The maximum code-point a one-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
-
-// The maximum code-point a two-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
-
-// The maximum code-point a three-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
-
-// The maximum code-point a four-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
-
-// Chops off the n lowest bits from a bit pattern. Returns the n
-// lowest bits. As a side effect, the original bit pattern will be
-// shifted to the right by n bits.
-inline UInt32 ChopLowBits(UInt32* bits, int n) {
- const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
- *bits >>= n;
- return low_bits;
-}
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-char* CodePointToUtf8(UInt32 code_point, char* str) {
- if (code_point <= kMaxCodePoint1) {
- str[1] = '\0';
- str[0] = static_cast<char>(code_point); // 0xxxxxxx
- } else if (code_point <= kMaxCodePoint2) {
- str[2] = '\0';
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx
- } else if (code_point <= kMaxCodePoint3) {
- str[3] = '\0';
- str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx
- } else if (code_point <= kMaxCodePoint4) {
- str[4] = '\0';
- str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx
- } else {
- // The longest string String::Format can produce when invoked
- // with these parameters is 28 character long (not including
- // the terminating nul character). We are asking for 32 character
- // buffer just in case. This is also enough for strncpy to
- // null-terminate the destination string.
- posix::StrNCpy(
- str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32);
- str[31] = '\0'; // Makes sure no change in the format to strncpy leaves
- // the result unterminated.
- }
- return str;
-}
-
-// The following two functions only make sense if the the system
-// uses UTF-16 for wide string encoding. All supported systems
-// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
-
-// Determines if the arguments constitute UTF-16 surrogate pair
-// and thus should be combined into a single Unicode code point
-// using CreateCodePointFromUtf16SurrogatePair.
-inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
- return sizeof(wchar_t) == 2 &&
- (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
-}
-
-// Creates a Unicode code point from UTF16 surrogate pair.
-inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
- wchar_t second) {
- const UInt32 mask = (1 << 10) - 1;
- return (sizeof(wchar_t) == 2) ?
- (((first & mask) << 10) | (second & mask)) + 0x10000 :
- // This function should not be called when the condition is
- // false, but we provide a sensible default in case it is.
- static_cast<UInt32>(first);
-}
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-String WideStringToUtf8(const wchar_t* str, int num_chars) {
- if (num_chars == -1)
- num_chars = static_cast<int>(wcslen(str));
-
- ::std::stringstream stream;
- for (int i = 0; i < num_chars; ++i) {
- UInt32 unicode_code_point;
-
- if (str[i] == L'\0') {
- break;
- } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
- unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
- str[i + 1]);
- i++;
- } else {
- unicode_code_point = static_cast<UInt32>(str[i]);
- }
-
- char buffer[32]; // CodePointToUtf8 requires a buffer this big.
- stream << CodePointToUtf8(unicode_code_point, buffer);
- }
- return StringStreamToString(&stream);
-}
-
-// Converts a wide C string to a String using the UTF-8 encoding.
-// NULL will be converted to "(null)".
-String String::ShowWideCString(const wchar_t * wide_c_str) {
- if (wide_c_str == NULL) return String("(null)");
-
- return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
-}
-
-// Similar to ShowWideCString(), except that this function encloses
-// the converted string in double quotes.
-String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
- if (wide_c_str == NULL) return String("(null)");
-
- return String::Format("L\"%s\"",
- String::ShowWideCString(wide_c_str).c_str());
-}
-
-// Compares two wide C strings. Returns true iff they have the same
-// content.
-//
-// Unlike wcscmp(), this function can handle NULL argument(s). A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
- if (lhs == NULL) return rhs == NULL;
-
- if (rhs == NULL) return false;
-
- return wcscmp(lhs, rhs) == 0;
-}
-
-// Helper function for *_STREQ on wide strings.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const wchar_t* expected,
- const wchar_t* actual) {
- if (String::WideCStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowWideCStringQuoted(expected),
- String::ShowWideCStringQuoted(actual),
- false);
-}
-
-// Helper function for *_STRNE on wide strings.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2) {
- if (!String::WideCStringEquals(s1, s2)) {
- return AssertionSuccess();
- }
-
- return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
- << s2_expression << "), actual: "
- << String::ShowWideCStringQuoted(s1)
- << " vs " << String::ShowWideCStringQuoted(s2);
-}
-
-// Compares two C strings, ignoring case. Returns true iff they have
-// the same content.
-//
-// Unlike strcasecmp(), this function can handle NULL argument(s). A
-// NULL C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
- if (lhs == NULL)
- return rhs == NULL;
- if (rhs == NULL)
- return false;
- return posix::StrCaseCmp(lhs, rhs) == 0;
-}
-
- // Compares two wide C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike wcscasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL wide C string,
- // including the empty string.
- // NB: The implementations on different platforms slightly differ.
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
- // environment variable. On GNU platform this method uses wcscasecmp
- // which compares according to LC_CTYPE category of the current locale.
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
- // current locale.
-bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
- const wchar_t* rhs) {
- if (lhs == NULL) return rhs == NULL;
-
- if (rhs == NULL) return false;
-
-#if GTEST_OS_WINDOWS
- return _wcsicmp(lhs, rhs) == 0;
-#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
- return wcscasecmp(lhs, rhs) == 0;
-#else
- // Android, Mac OS X and Cygwin don't define wcscasecmp.
- // Other unknown OSes may not define it either.
- wint_t left, right;
- do {
- left = towlower(*lhs++);
- right = towlower(*rhs++);
- } while (left && left == right);
- return left == right;
-#endif // OS selector
-}
-
-// Compares this with another String.
-// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-// if this is greater than rhs.
-int String::Compare(const String & rhs) const {
- const char* const lhs_c_str = c_str();
- const char* const rhs_c_str = rhs.c_str();
-
- if (lhs_c_str == NULL) {
- return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL
- } else if (rhs_c_str == NULL) {
- return 1;
- }
-
- const size_t shorter_str_len =
- length() <= rhs.length() ? length() : rhs.length();
- for (size_t i = 0; i != shorter_str_len; i++) {
- if (lhs_c_str[i] < rhs_c_str[i]) {
- return -1;
- } else if (lhs_c_str[i] > rhs_c_str[i]) {
- return 1;
- }
- }
- return (length() < rhs.length()) ? -1 :
- (length() > rhs.length()) ? 1 : 0;
-}
-
-// Returns true iff this String ends with the given suffix. *Any*
-// String is considered to end with a NULL or empty suffix.
-bool String::EndsWith(const char* suffix) const {
- if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
- if (c_str() == NULL) return false;
-
- const size_t this_len = strlen(c_str());
- const size_t suffix_len = strlen(suffix);
- return (this_len >= suffix_len) &&
- CStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Returns true iff this String ends with the given suffix, ignoring case.
-// Any String is considered to end with a NULL or empty suffix.
-bool String::EndsWithCaseInsensitive(const char* suffix) const {
- if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
- if (c_str() == NULL) return false;
-
- const size_t this_len = strlen(c_str());
- const size_t suffix_len = strlen(suffix);
- return (this_len >= suffix_len) &&
- CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Formats a list of arguments to a String, using the same format
-// spec string as for printf.
-//
-// We do not use the StringPrintf class as it is not universally
-// available.
-//
-// The result is limited to 4096 characters (including the tailing 0).
-// If 4096 characters are not enough to format the input, or if
-// there's an error, "<formatting error or buffer exceeded>" is
-// returned.
-String String::Format(const char * format, ...) {
- va_list args;
- va_start(args, format);
-
- char buffer[4096];
- const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);
-
- // MSVC 8 deprecates vsnprintf(), so we want to suppress warning
- // 4996 (deprecated function) there.
-#ifdef _MSC_VER // We are using MSVC.
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4996) // Temporarily disables warning 4996.
-
- const int size = vsnprintf(buffer, kBufferSize, format, args);
-
-# pragma warning(pop) // Restores the warning state.
-#else // We are not using MSVC.
- const int size = vsnprintf(buffer, kBufferSize, format, args);
-#endif // _MSC_VER
- va_end(args);
-
- // vsnprintf()'s behavior is not portable. When the buffer is not
- // big enough, it returns a negative value in MSVC, and returns the
- // needed buffer size on Linux. When there is an output error, it
- // always returns a negative value. For simplicity, we lump the two
- // error cases together.
- if (size < 0 || size >= kBufferSize) {
- return String("<formatting error or buffer exceeded>");
- } else {
- return String(buffer, size);
- }
-}
-
-// Converts the buffer in a stringstream to a String, converting NUL
-// bytes to "\\0" along the way.
-String StringStreamToString(::std::stringstream* ss) {
- const ::std::string& str = ss->str();
- const char* const start = str.c_str();
- const char* const end = start + str.length();
-
- // We need to use a helper stringstream to do this transformation
- // because String doesn't support push_back().
- ::std::stringstream helper;
- for (const char* ch = start; ch != end; ++ch) {
- if (*ch == '\0') {
- helper << "\\0"; // Replaces NUL with "\\0";
- } else {
- helper.put(*ch);
- }
- }
-
- return String(helper.str().c_str());
-}
-
-// Appends the user-supplied message to the Google-Test-generated message.
-String AppendUserMessage(const String& gtest_msg,
- const Message& user_msg) {
- // Appends the user message if it's non-empty.
- const String user_msg_string = user_msg.GetString();
- if (user_msg_string.empty()) {
- return gtest_msg;
- }
-
- Message msg;
- msg << gtest_msg << "\n" << user_msg_string;
-
- return msg.GetString();
-}
-
-} // namespace internal
-
-// class TestResult
-
-// Creates an empty TestResult.
-TestResult::TestResult()
- : death_test_count_(0),
- elapsed_time_(0) {
-}
-
-// D'tor.
-TestResult::~TestResult() {
-}
-
-// Returns the i-th test part result among all the results. i can
-// range from 0 to total_part_count() - 1. If i is not in that range,
-// aborts the program.
-const TestPartResult& TestResult::GetTestPartResult(int i) const {
- if (i < 0 || i >= total_part_count())
- internal::posix::Abort();
- return test_part_results_.at(i);
-}
-
-// Returns the i-th test property. i can range from 0 to
-// test_property_count() - 1. If i is not in that range, aborts the
-// program.
-const TestProperty& TestResult::GetTestProperty(int i) const {
- if (i < 0 || i >= test_property_count())
- internal::posix::Abort();
- return test_properties_.at(i);
-}
-
-// Clears the test part results.
-void TestResult::ClearTestPartResults() {
- test_part_results_.clear();
-}
-
-// Adds a test part result to the list.
-void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
- test_part_results_.push_back(test_part_result);
-}
-
-// Adds a test property to the list. If a property with the same key as the
-// supplied property is already represented, the value of this test_property
-// replaces the old value for that key.
-void TestResult::RecordProperty(const TestProperty& test_property) {
- if (!ValidateTestProperty(test_property)) {
- return;
- }
- internal::MutexLock lock(&test_properites_mutex_);
- const std::vector<TestProperty>::iterator property_with_matching_key =
- std::find_if(test_properties_.begin(), test_properties_.end(),
- internal::TestPropertyKeyIs(test_property.key()));
- if (property_with_matching_key == test_properties_.end()) {
- test_properties_.push_back(test_property);
- return;
- }
- property_with_matching_key->SetValue(test_property.value());
-}
-
-// Adds a failure if the key is a reserved attribute of Google Test
-// testcase tags. Returns true if the property is valid.
-bool TestResult::ValidateTestProperty(const TestProperty& test_property) {
- internal::String key(test_property.key());
- if (key == "name" || key == "status" || key == "time" || key == "classname") {
- ADD_FAILURE()
- << "Reserved key used in RecordProperty(): "
- << key
- << " ('name', 'status', 'time', and 'classname' are reserved by "
- << GTEST_NAME_ << ")";
- return false;
- }
- return true;
-}
-
-// Clears the object.
-void TestResult::Clear() {
- test_part_results_.clear();
- test_properties_.clear();
- death_test_count_ = 0;
- elapsed_time_ = 0;
-}
-
-// Returns true iff the test failed.
-bool TestResult::Failed() const {
- for (int i = 0; i < total_part_count(); ++i) {
- if (GetTestPartResult(i).failed())
- return true;
- }
- return false;
-}
-
-// Returns true iff the test part fatally failed.
-static bool TestPartFatallyFailed(const TestPartResult& result) {
- return result.fatally_failed();
-}
-
-// Returns true iff the test fatally failed.
-bool TestResult::HasFatalFailure() const {
- return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
-}
-
-// Returns true iff the test part non-fatally failed.
-static bool TestPartNonfatallyFailed(const TestPartResult& result) {
- return result.nonfatally_failed();
-}
-
-// Returns true iff the test has a non-fatal failure.
-bool TestResult::HasNonfatalFailure() const {
- return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
-}
-
-// Gets the number of all test parts. This is the sum of the number
-// of successful test parts and the number of failed test parts.
-int TestResult::total_part_count() const {
- return static_cast<int>(test_part_results_.size());
-}
-
-// Returns the number of the test properties.
-int TestResult::test_property_count() const {
- return static_cast<int>(test_properties_.size());
-}
-
-// class Test
-
-// Creates a Test object.
-
-// The c'tor saves the values of all Google Test flags.
-Test::Test()
- : gtest_flag_saver_(new internal::GTestFlagSaver) {
-}
-
-// The d'tor restores the values of all Google Test flags.
-Test::~Test() {
- delete gtest_flag_saver_;
-}
-
-// Sets up the test fixture.
-//
-// A sub-class may override this.
-void Test::SetUp() {
-}
-
-// Tears down the test fixture.
-//
-// A sub-class may override this.
-void Test::TearDown() {
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, const char* value) {
- UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, int value) {
- Message value_message;
- value_message << value;
- RecordProperty(key, value_message.GetString().c_str());
-}
-
-namespace internal {
-
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
- const String& message) {
- // This function is a friend of UnitTest and as such has access to
- // AddTestPartResult.
- UnitTest::GetInstance()->AddTestPartResult(
- result_type,
- NULL, // No info about the source file where the exception occurred.
- -1, // We have no info on which line caused the exception.
- message,
- String()); // No stack trace, either.
-}
-
-} // namespace internal
-
-// Google Test requires all tests in the same test case to use the same test
-// fixture class. This function checks if the current test has the
-// same fixture class as the first test in the current test case. If
-// yes, it returns true; otherwise it generates a Google Test failure and
-// returns false.
-bool Test::HasSameFixtureClass() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- const TestCase* const test_case = impl->current_test_case();
-
- // Info about the first test in the current test case.
- const TestInfo* const first_test_info = test_case->test_info_list()[0];
- const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
- const char* const first_test_name = first_test_info->name();
-
- // Info about the current test.
- const TestInfo* const this_test_info = impl->current_test_info();
- const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
- const char* const this_test_name = this_test_info->name();
-
- if (this_fixture_id != first_fixture_id) {
- // Is the first test defined using TEST?
- const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
- // Is this test defined using TEST?
- const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
-
- if (first_is_TEST || this_is_TEST) {
- // The user mixed TEST and TEST_F in this test case - we'll tell
- // him/her how to fix it.
-
- // Gets the name of the TEST and the name of the TEST_F. Note
- // that first_is_TEST and this_is_TEST cannot both be true, as
- // the fixture IDs are different for the two tests.
- const char* const TEST_name =
- first_is_TEST ? first_test_name : this_test_name;
- const char* const TEST_F_name =
- first_is_TEST ? this_test_name : first_test_name;
-
- ADD_FAILURE()
- << "All tests in the same test case must use the same test fixture\n"
- << "class, so mixing TEST_F and TEST in the same test case is\n"
- << "illegal. In test case " << this_test_info->test_case_name()
- << ",\n"
- << "test " << TEST_F_name << " is defined using TEST_F but\n"
- << "test " << TEST_name << " is defined using TEST. You probably\n"
- << "want to change the TEST to TEST_F or move it to another test\n"
- << "case.";
- } else {
- // The user defined two fixture classes with the same name in
- // two namespaces - we'll tell him/her how to fix it.
- ADD_FAILURE()
- << "All tests in the same test case must use the same test fixture\n"
- << "class. However, in test case "
- << this_test_info->test_case_name() << ",\n"
- << "you defined test " << first_test_name
- << " and test " << this_test_name << "\n"
- << "using two different test fixture classes. This can happen if\n"
- << "the two classes are from different namespaces or translation\n"
- << "units and have the same name. You should probably rename one\n"
- << "of the classes to put the tests into different test cases.";
- }
- return false;
- }
-
- return true;
-}
-
-#if GTEST_HAS_SEH
-
-// Adds an "exception thrown" fatal failure to the current test. This
-// function returns its result via an output parameter pointer because VC++
-// prohibits creation of objects with destructors on stack in functions
-// using __try (see error C2712).
-static internal::String* FormatSehExceptionMessage(DWORD exception_code,
- const char* location) {
- Message message;
- message << "SEH exception with code 0x" << std::setbase(16) <<
- exception_code << std::setbase(10) << " thrown in " << location << ".";
-
- return new internal::String(message.GetString());
-}
-
-#endif // GTEST_HAS_SEH
-
-#if GTEST_HAS_EXCEPTIONS
-
-// Adds an "exception thrown" fatal failure to the current test.
-static internal::String FormatCxxExceptionMessage(const char* description,
- const char* location) {
- Message message;
- if (description != NULL) {
- message << "C++ exception with description \"" << description << "\"";
- } else {
- message << "Unknown C++ exception";
- }
- message << " thrown in " << location << ".";
-
- return message.GetString();
-}
-
-static internal::String PrintTestPartResultToString(
- const TestPartResult& test_part_result);
-
-// A failed Google Test assertion will throw an exception of this type when
-// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled). We
-// derive it from std::runtime_error, which is for errors presumably
-// detectable only at run time. Since std::runtime_error inherits from
-// std::exception, many testing frameworks know how to extract and print the
-// message inside it.
-class GoogleTestFailureException : public ::std::runtime_error {
- public:
- explicit GoogleTestFailureException(const TestPartResult& failure)
- : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
-};
-#endif // GTEST_HAS_EXCEPTIONS
-
-namespace internal {
-// We put these helper functions in the internal namespace as IBM's xlC
-// compiler rejects the code if they were declared static.
-
-// Runs the given method and handles SEH exceptions it throws, when
-// SEH is supported; returns the 0-value for type Result in case of an
-// SEH exception. (Microsoft compilers cannot handle SEH and C++
-// exceptions in the same function. Therefore, we provide a separate
-// wrapper function for handling SEH exceptions.)
-template <class T, typename Result>
-Result HandleSehExceptionsInMethodIfSupported(
- T* object, Result (T::*method)(), const char* location) {
-#if GTEST_HAS_SEH
- __try {
- return (object->*method)();
- } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT
- GetExceptionCode())) {
- // We create the exception message on the heap because VC++ prohibits
- // creation of objects with destructors on stack in functions using __try
- // (see error C2712).
- internal::String* exception_message = FormatSehExceptionMessage(
- GetExceptionCode(), location);
- internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
- *exception_message);
- delete exception_message;
- return static_cast<Result>(0);
- }
-#else
- (void)location;
- return (object->*method)();
-#endif // GTEST_HAS_SEH
-}
-
-// Runs the given method and catches and reports C++ and/or SEH-style
-// exceptions, if they are supported; returns the 0-value for type
-// Result in case of an SEH exception.
-template <class T, typename Result>
-Result HandleExceptionsInMethodIfSupported(
- T* object, Result (T::*method)(), const char* location) {
- // NOTE: The user code can affect the way in which Google Test handles
- // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
- // RUN_ALL_TESTS() starts. It is technically possible to check the flag
- // after the exception is caught and either report or re-throw the
- // exception based on the flag's value:
- //
- // try {
- // // Perform the test method.
- // } catch (...) {
- // if (GTEST_FLAG(catch_exceptions))
- // // Report the exception as failure.
- // else
- // throw; // Re-throws the original exception.
- // }
- //
- // However, the purpose of this flag is to allow the program to drop into
- // the debugger when the exception is thrown. On most platforms, once the
- // control enters the catch block, the exception origin information is
- // lost and the debugger will stop the program at the point of the
- // re-throw in this function -- instead of at the point of the original
- // throw statement in the code under test. For this reason, we perform
- // the check early, sacrificing the ability to affect Google Test's
- // exception handling in the method where the exception is thrown.
- if (internal::GetUnitTestImpl()->catch_exceptions()) {
-#if GTEST_HAS_EXCEPTIONS
- try {
- return HandleSehExceptionsInMethodIfSupported(object, method, location);
- } catch (const GoogleTestFailureException&) { // NOLINT
- // This exception doesn't originate in code under test. It makes no
- // sense to report it as a test failure.
- throw;
- } catch (const std::exception& e) { // NOLINT
- internal::ReportFailureInUnknownLocation(
- TestPartResult::kFatalFailure,
- FormatCxxExceptionMessage(e.what(), location));
- } catch (...) { // NOLINT
- internal::ReportFailureInUnknownLocation(
- TestPartResult::kFatalFailure,
- FormatCxxExceptionMessage(NULL, location));
- }
- return static_cast<Result>(0);
-#else
- return HandleSehExceptionsInMethodIfSupported(object, method, location);
-#endif // GTEST_HAS_EXCEPTIONS
- } else {
- return (object->*method)();
- }
-}
-
-} // namespace internal
-
-// Runs the test and updates the test result.
-void Test::Run() {
- if (!HasSameFixtureClass()) return;
-
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
- // We will run the test only if SetUp() was successful.
- if (!HasFatalFailure()) {
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &Test::TestBody, "the test body");
- }
-
- // However, we want to clean up as much as possible. Hence we will
- // always call TearDown(), even if SetUp() or the test body has
- // failed.
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &Test::TearDown, "TearDown()");
-}
-
-// Returns true iff the current test has a fatal failure.
-bool Test::HasFatalFailure() {
- return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
-}
-
-// Returns true iff the current test has a non-fatal failure.
-bool Test::HasNonfatalFailure() {
- return internal::GetUnitTestImpl()->current_test_result()->
- HasNonfatalFailure();
-}
-
-// class TestInfo
-
-// Constructs a TestInfo object. It assumes ownership of the test factory
-// object.
-// TODO(vladl@google.com): Make a_test_case_name and a_name const string&'s
-// to signify they cannot be NULLs.
-TestInfo::TestInfo(const char* a_test_case_name,
- const char* a_name,
- const char* a_type_param,
- const char* a_value_param,
- internal::TypeId fixture_class_id,
- internal::TestFactoryBase* factory)
- : test_case_name_(a_test_case_name),
- name_(a_name),
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),
- value_param_(a_value_param ? new std::string(a_value_param) : NULL),
- fixture_class_id_(fixture_class_id),
- should_run_(false),
- is_disabled_(false),
- matches_filter_(false),
- factory_(factory),
- result_() {}
-
-// Destructs a TestInfo object.
-TestInfo::~TestInfo() { delete factory_; }
-
-namespace internal {
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// name: name of the test
-// type_param: the name of the test's type parameter, or NULL if
-// this is not a typed or a type-parameterized test.
-// value_param: text representation of the test's value parameter,
-// or NULL if this is not a value-parameterized test.
-// fixture_class_id: ID of the test fixture class
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-// factory: pointer to the factory that creates a test object.
-// The newly created TestInfo instance will assume
-// ownership of the factory object.
-TestInfo* MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- TypeId fixture_class_id,
- SetUpTestCaseFunc set_up_tc,
- TearDownTestCaseFunc tear_down_tc,
- TestFactoryBase* factory) {
- TestInfo* const test_info =
- new TestInfo(test_case_name, name, type_param, value_param,
- fixture_class_id, factory);
- GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
- return test_info;
-}
-
-#if GTEST_HAS_PARAM_TEST
-void ReportInvalidTestCaseType(const char* test_case_name,
- const char* file, int line) {
- Message errors;
- errors
- << "Attempted redefinition of test case " << test_case_name << ".\n"
- << "All tests in the same test case must use the same test fixture\n"
- << "class. However, in test case " << test_case_name << ", you tried\n"
- << "to define a test using a fixture class different from the one\n"
- << "used earlier. This can happen if the two fixture classes are\n"
- << "from different namespaces and have the same name. You should\n"
- << "probably rename one of the classes to put the tests into different\n"
- << "test cases.";
-
- fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
- errors.GetString().c_str());
-}
-#endif // GTEST_HAS_PARAM_TEST
-
-} // namespace internal
-
-namespace {
-
-// A predicate that checks the test name of a TestInfo against a known
-// value.
-//
-// This is used for implementation of the TestCase class only. We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestNameIs is copyable.
-class TestNameIs {
- public:
- // Constructor.
- //
- // TestNameIs has NO default constructor.
- explicit TestNameIs(const char* name)
- : name_(name) {}
-
- // Returns true iff the test name of test_info matches name_.
- bool operator()(const TestInfo * test_info) const {
- return test_info && internal::String(test_info->name()).Compare(name_) == 0;
- }
-
- private:
- internal::String name_;
-};
-
-} // namespace
-
-namespace internal {
-
-// This method expands all parameterized tests registered with macros TEST_P
-// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
-// This will be done just once during the program runtime.
-void UnitTestImpl::RegisterParameterizedTests() {
-#if GTEST_HAS_PARAM_TEST
- if (!parameterized_tests_registered_) {
- parameterized_test_registry_.RegisterTests();
- parameterized_tests_registered_ = true;
- }
-#endif
-}
-
-} // namespace internal
-
-// Creates the test object, runs it, records its result, and then
-// deletes it.
-void TestInfo::Run() {
- if (!should_run_) return;
-
- // Tells UnitTest where to store test result.
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->set_current_test_info(this);
-
- TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
- // Notifies the unit test event listeners that a test is about to start.
- repeater->OnTestStart(*this);
-
- const TimeInMillis start = internal::GetTimeInMillis();
-
- impl->os_stack_trace_getter()->UponLeavingGTest();
-
- // Creates the test object.
- Test* const test = internal::HandleExceptionsInMethodIfSupported(
- factory_, &internal::TestFactoryBase::CreateTest,
- "the test fixture's constructor");
-
- // Runs the test only if the test object was created and its
- // constructor didn't generate a fatal failure.
- if ((test != NULL) && !Test::HasFatalFailure()) {
- // This doesn't throw as all user code that can throw are wrapped into
- // exception handling code.
- test->Run();
- }
-
- // Deletes the test object.
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- test, &Test::DeleteSelf_, "the test fixture's destructor");
-
- result_.set_elapsed_time(internal::GetTimeInMillis() - start);
-
- // Notifies the unit test event listener that a test has just finished.
- repeater->OnTestEnd(*this);
-
- // Tells UnitTest to stop associating assertion results to this
- // test.
- impl->set_current_test_info(NULL);
-}
-
-// class TestCase
-
-// Gets the number of successful tests in this test case.
-int TestCase::successful_test_count() const {
- return CountIf(test_info_list_, TestPassed);
-}
-
-// Gets the number of failed tests in this test case.
-int TestCase::failed_test_count() const {
- return CountIf(test_info_list_, TestFailed);
-}
-
-int TestCase::disabled_test_count() const {
- return CountIf(test_info_list_, TestDisabled);
-}
-
-// Get the number of tests in this test case that should run.
-int TestCase::test_to_run_count() const {
- return CountIf(test_info_list_, ShouldRunTest);
-}
-
-// Gets the number of all tests.
-int TestCase::total_test_count() const {
- return static_cast<int>(test_info_list_.size());
-}
-
-// Creates a TestCase with the given name.
-//
-// Arguments:
-//
-// name: name of the test case
-// a_type_param: the name of the test case's type parameter, or NULL if
-// this is not a typed or a type-parameterized test case.
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-TestCase::TestCase(const char* a_name, const char* a_type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc)
- : name_(a_name),
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),
- set_up_tc_(set_up_tc),
- tear_down_tc_(tear_down_tc),
- should_run_(false),
- elapsed_time_(0) {
-}
-
-// Destructor of TestCase.
-TestCase::~TestCase() {
- // Deletes every Test in the collection.
- ForEach(test_info_list_, internal::Delete<TestInfo>);
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-const TestInfo* TestCase::GetTestInfo(int i) const {
- const int index = GetElementOr(test_indices_, i, -1);
- return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-TestInfo* TestCase::GetMutableTestInfo(int i) {
- const int index = GetElementOr(test_indices_, i, -1);
- return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Adds a test to this test case. Will delete the test upon
-// destruction of the TestCase object.
-void TestCase::AddTestInfo(TestInfo * test_info) {
- test_info_list_.push_back(test_info);
- test_indices_.push_back(static_cast<int>(test_indices_.size()));
-}
-
-// Runs every test in this TestCase.
-void TestCase::Run() {
- if (!should_run_) return;
-
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->set_current_test_case(this);
-
- TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
- repeater->OnTestCaseStart(*this);
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
-
- const internal::TimeInMillis start = internal::GetTimeInMillis();
- for (int i = 0; i < total_test_count(); i++) {
- GetMutableTestInfo(i)->Run();
- }
- elapsed_time_ = internal::GetTimeInMillis() - start;
-
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
-
- repeater->OnTestCaseEnd(*this);
- impl->set_current_test_case(NULL);
-}
-
-// Clears the results of all tests in this test case.
-void TestCase::ClearResult() {
- ForEach(test_info_list_, TestInfo::ClearTestResult);
-}
-
-// Shuffles the tests in this test case.
-void TestCase::ShuffleTests(internal::Random* random) {
- Shuffle(random, &test_indices_);
-}
-
-// Restores the test order to before the first shuffle.
-void TestCase::UnshuffleTests() {
- for (size_t i = 0; i < test_indices_.size(); i++) {
- test_indices_[i] = static_cast<int>(i);
- }
-}
-
-// Formats a countable noun. Depending on its quantity, either the
-// singular form or the plural form is used. e.g.
-//
-// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
-// FormatCountableNoun(5, "book", "books") returns "5 books".
-static internal::String FormatCountableNoun(int count,
- const char * singular_form,
- const char * plural_form) {
- return internal::String::Format("%d %s", count,
- count == 1 ? singular_form : plural_form);
-}
-
-// Formats the count of tests.
-static internal::String FormatTestCount(int test_count) {
- return FormatCountableNoun(test_count, "test", "tests");
-}
-
-// Formats the count of test cases.
-static internal::String FormatTestCaseCount(int test_case_count) {
- return FormatCountableNoun(test_case_count, "test case", "test cases");
-}
-
-// Converts a TestPartResult::Type enum to human-friendly string
-// representation. Both kNonFatalFailure and kFatalFailure are translated
-// to "Failure", as the user usually doesn't care about the difference
-// between the two when viewing the test result.
-static const char * TestPartResultTypeToString(TestPartResult::Type type) {
- switch (type) {
- case TestPartResult::kSuccess:
- return "Success";
-
- case TestPartResult::kNonFatalFailure:
- case TestPartResult::kFatalFailure:
-#ifdef _MSC_VER
- return "error: ";
-#else
- return "Failure\n";
-#endif
- default:
- return "Unknown result type";
- }
-}
-
-// Prints a TestPartResult to a String.
-static internal::String PrintTestPartResultToString(
- const TestPartResult& test_part_result) {
- return (Message()
- << internal::FormatFileLocation(test_part_result.file_name(),
- test_part_result.line_number())
- << " " << TestPartResultTypeToString(test_part_result.type())
- << test_part_result.message()).GetString();
-}
-
-// Prints a TestPartResult.
-static void PrintTestPartResult(const TestPartResult& test_part_result) {
- const internal::String& result =
- PrintTestPartResultToString(test_part_result);
- printf("%s\n", result.c_str());
- fflush(stdout);
- // If the test program runs in Visual Studio or a debugger, the
- // following statements add the test part result message to the Output
- // window such that the user can double-click on it to jump to the
- // corresponding source code location; otherwise they do nothing.
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- // We don't call OutputDebugString*() on Windows Mobile, as printing
- // to stdout is done by OutputDebugString() there already - we don't
- // want the same message printed twice.
- ::OutputDebugStringA(result.c_str());
- ::OutputDebugStringA("\n");
-#endif
-}
-
-// class PrettyUnitTestResultPrinter
-
-namespace internal {
-
-enum GTestColor {
- COLOR_DEFAULT,
- COLOR_RED,
- COLOR_GREEN,
- COLOR_YELLOW
-};
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns the character attribute for the given color.
-WORD GetColorAttribute(GTestColor color) {
- switch (color) {
- case COLOR_RED: return FOREGROUND_RED;
- case COLOR_GREEN: return FOREGROUND_GREEN;
- case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
- default: return 0;
- }
-}
-
-#else
-
-// Returns the ANSI color code for the given color. COLOR_DEFAULT is
-// an invalid input.
-const char* GetAnsiColorCode(GTestColor color) {
- switch (color) {
- case COLOR_RED: return "1";
- case COLOR_GREEN: return "2";
- case COLOR_YELLOW: return "3";
- default: return NULL;
- };
-}
-
-#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns true iff Google Test should use colors in the output.
-bool ShouldUseColor(bool stdout_is_tty) {
- const char* const gtest_color = GTEST_FLAG(color).c_str();
-
- if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
-#if GTEST_OS_WINDOWS
- // On Windows the TERM variable is usually not set, but the
- // console there does support colors.
- return stdout_is_tty;
-#else
- // On non-Windows platforms, we rely on the TERM variable.
- const char* const term = posix::GetEnv("TERM");
- const bool term_supports_color =
- String::CStringEquals(term, "xterm") ||
- String::CStringEquals(term, "xterm-color") ||
- String::CStringEquals(term, "xterm-256color") ||
- String::CStringEquals(term, "screen") ||
- String::CStringEquals(term, "linux") ||
- String::CStringEquals(term, "cygwin");
- return stdout_is_tty && term_supports_color;
-#endif // GTEST_OS_WINDOWS
- }
-
- return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
- String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
- String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
- String::CStringEquals(gtest_color, "1");
- // We take "yes", "true", "t", and "1" as meaning "yes". If the
- // value is neither one of these nor "auto", we treat it as "no" to
- // be conservative.
-}
-
-// Helpers for printing colored strings to stdout. Note that on Windows, we
-// cannot simply emit special characters and have the terminal change colors.
-// This routine must actually emit the characters rather than return a string
-// that would be colored when printed, as can be done on Linux.
-void ColoredPrintf(GTestColor color, const char* fmt, ...) {
- va_list args;
- va_start(args, fmt);
-
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
- const bool use_color = false;
-#else
- static const bool in_color_mode =
- ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
- const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
-#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
- // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
-
- if (!use_color) {
- vprintf(fmt, args);
- va_end(args);
- return;
- }
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
-
- // Gets the current text color.
- CONSOLE_SCREEN_BUFFER_INFO buffer_info;
- GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
- const WORD old_color_attrs = buffer_info.wAttributes;
-
- // We need to flush the stream buffers into the console before each
- // SetConsoleTextAttribute call lest it affect the text that is already
- // printed but has not yet reached the console.
- fflush(stdout);
- SetConsoleTextAttribute(stdout_handle,
- GetColorAttribute(color) | FOREGROUND_INTENSITY);
- vprintf(fmt, args);
-
- fflush(stdout);
- // Restores the text color.
- SetConsoleTextAttribute(stdout_handle, old_color_attrs);
-#else
- printf("\033[0;3%sm", GetAnsiColorCode(color));
- vprintf(fmt, args);
- printf("\033[m"); // Resets the terminal to default.
-#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- va_end(args);
-}
-
-void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
- const char* const type_param = test_info.type_param();
- const char* const value_param = test_info.value_param();
-
- if (type_param != NULL || value_param != NULL) {
- printf(", where ");
- if (type_param != NULL) {
- printf("TypeParam = %s", type_param);
- if (value_param != NULL)
- printf(" and ");
- }
- if (value_param != NULL) {
- printf("GetParam() = %s", value_param);
- }
- }
-}
-
-// This class implements the TestEventListener interface.
-//
-// Class PrettyUnitTestResultPrinter is copyable.
-class PrettyUnitTestResultPrinter : public TestEventListener {
- public:
- PrettyUnitTestResultPrinter() {}
- static void PrintTestName(const char * test_case, const char * test) {
- printf("%s.%s", test_case, test);
- }
-
- // The following methods override what's in the TestEventListener class.
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestCaseStart(const TestCase& test_case);
- virtual void OnTestStart(const TestInfo& test_info);
- virtual void OnTestPartResult(const TestPartResult& result);
- virtual void OnTestEnd(const TestInfo& test_info);
- virtual void OnTestCaseEnd(const TestCase& test_case);
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-
- private:
- static void PrintFailedTests(const UnitTest& unit_test);
-
- internal::String test_case_name_;
-};
-
- // Fired before each iteration of tests starts.
-void PrettyUnitTestResultPrinter::OnTestIterationStart(
- const UnitTest& unit_test, int iteration) {
- if (GTEST_FLAG(repeat) != 1)
- printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
-
- const char* const filter = GTEST_FLAG(filter).c_str();
-
- // Prints the filter if it's not *. This reminds the user that some
- // tests may be skipped.
- if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
- ColoredPrintf(COLOR_YELLOW,
- "Note: %s filter = %s\n", GTEST_NAME_, filter);
- }
-
- if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
- const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
- ColoredPrintf(COLOR_YELLOW,
- "Note: This is test shard %d of %s.\n",
- static_cast<int>(shard_index) + 1,
- internal::posix::GetEnv(kTestTotalShards));
- }
-
- if (GTEST_FLAG(shuffle)) {
- ColoredPrintf(COLOR_YELLOW,
- "Note: Randomizing tests' orders with a seed of %d .\n",
- unit_test.random_seed());
- }
-
- ColoredPrintf(COLOR_GREEN, "[==========] ");
- printf("Running %s from %s.\n",
- FormatTestCount(unit_test.test_to_run_count()).c_str(),
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
- const UnitTest& /*unit_test*/) {
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("Global test environment set-up.\n");
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
- test_case_name_ = test_case.name();
- const internal::String counts =
- FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("%s from %s", counts.c_str(), test_case_name_.c_str());
- if (test_case.type_param() == NULL) {
- printf("\n");
- } else {
- printf(", where TypeParam = %s\n", test_case.type_param());
- }
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
- ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
- PrintTestName(test_case_name_.c_str(), test_info.name());
- printf("\n");
- fflush(stdout);
-}
-
-// Called after an assertion failure.
-void PrettyUnitTestResultPrinter::OnTestPartResult(
- const TestPartResult& result) {
- // If the test part succeeded, we don't need to do anything.
- if (result.type() == TestPartResult::kSuccess)
- return;
-
- // Print failure message from the assertion (e.g. expected this and got that).
- PrintTestPartResult(result);
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
- if (test_info.result()->Passed()) {
- ColoredPrintf(COLOR_GREEN, "[ OK ] ");
- } else {
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- }
- PrintTestName(test_case_name_.c_str(), test_info.name());
- if (test_info.result()->Failed())
- PrintFullTestCommentIfPresent(test_info);
-
- if (GTEST_FLAG(print_time)) {
- printf(" (%s ms)\n", internal::StreamableToString(
- test_info.result()->elapsed_time()).c_str());
- } else {
- printf("\n");
- }
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
- if (!GTEST_FLAG(print_time)) return;
-
- test_case_name_ = test_case.name();
- const internal::String counts =
- FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("%s from %s (%s ms total)\n\n",
- counts.c_str(), test_case_name_.c_str(),
- internal::StreamableToString(test_case.elapsed_time()).c_str());
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
- const UnitTest& /*unit_test*/) {
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("Global test environment tear-down\n");
- fflush(stdout);
-}
-
-// Internal helper for printing the list of failed tests.
-void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
- const int failed_test_count = unit_test.failed_test_count();
- if (failed_test_count == 0) {
- return;
- }
-
- for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
- const TestCase& test_case = *unit_test.GetTestCase(i);
- if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
- continue;
- }
- for (int j = 0; j < test_case.total_test_count(); ++j) {
- const TestInfo& test_info = *test_case.GetTestInfo(j);
- if (!test_info.should_run() || test_info.result()->Passed()) {
- continue;
- }
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- printf("%s.%s", test_case.name(), test_info.name());
- PrintFullTestCommentIfPresent(test_info);
- printf("\n");
- }
- }
-}
-
-void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
- int /*iteration*/) {
- ColoredPrintf(COLOR_GREEN, "[==========] ");
- printf("%s from %s ran.",
- FormatTestCount(unit_test.test_to_run_count()).c_str(),
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
- if (GTEST_FLAG(print_time)) {
- printf(" (%s ms total)",
- internal::StreamableToString(unit_test.elapsed_time()).c_str());
- }
- printf("\n");
- ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");
- printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
-
- int num_failures = unit_test.failed_test_count();
- if (!unit_test.Passed()) {
- const int failed_test_count = unit_test.failed_test_count();
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
- PrintFailedTests(unit_test);
- printf("\n%2d FAILED %s\n", num_failures,
- num_failures == 1 ? "TEST" : "TESTS");
- }
-
- int num_disabled = unit_test.disabled_test_count();
- if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
- if (!num_failures) {
- printf("\n"); // Add a spacer if no FAILURE banner is displayed.
- }
- ColoredPrintf(COLOR_YELLOW,
- " YOU HAVE %d DISABLED %s\n\n",
- num_disabled,
- num_disabled == 1 ? "TEST" : "TESTS");
- }
- // Ensure that Google Test output is printed before, e.g., heapchecker output.
- fflush(stdout);
-}
-
-// End PrettyUnitTestResultPrinter
-
-// class TestEventRepeater
-//
-// This class forwards events to other event listeners.
-class TestEventRepeater : public TestEventListener {
- public:
- TestEventRepeater() : forwarding_enabled_(true) {}
- virtual ~TestEventRepeater();
- void Append(TestEventListener *listener);
- TestEventListener* Release(TestEventListener* listener);
-
- // Controls whether events will be forwarded to listeners_. Set to false
- // in death test child processes.
- bool forwarding_enabled() const { return forwarding_enabled_; }
- void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
-
- virtual void OnTestProgramStart(const UnitTest& unit_test);
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
- virtual void OnTestCaseStart(const TestCase& test_case);
- virtual void OnTestStart(const TestInfo& test_info);
- virtual void OnTestPartResult(const TestPartResult& result);
- virtual void OnTestEnd(const TestInfo& test_info);
- virtual void OnTestCaseEnd(const TestCase& test_case);
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
- virtual void OnTestProgramEnd(const UnitTest& unit_test);
-
- private:
- // Controls whether events will be forwarded to listeners_. Set to false
- // in death test child processes.
- bool forwarding_enabled_;
- // The list of listeners that receive events.
- std::vector<TestEventListener*> listeners_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
-};
-
-TestEventRepeater::~TestEventRepeater() {
- ForEach(listeners_, Delete<TestEventListener>);
-}
-
-void TestEventRepeater::Append(TestEventListener *listener) {
- listeners_.push_back(listener);
-}
-
-// TODO(vladl@google.com): Factor the search functionality into Vector::Find.
-TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
- for (size_t i = 0; i < listeners_.size(); ++i) {
- if (listeners_[i] == listener) {
- listeners_.erase(listeners_.begin() + i);
- return listener;
- }
- }
-
- return NULL;
-}
-
-// Since most methods are very similar, use macros to reduce boilerplate.
-// This defines a member that forwards the call to all listeners.
-#define GTEST_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
- if (forwarding_enabled_) { \
- for (size_t i = 0; i < listeners_.size(); i++) { \
- listeners_[i]->Name(parameter); \
- } \
- } \
-}
-// This defines a member that forwards the call to all listeners in reverse
-// order.
-#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
- if (forwarding_enabled_) { \
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
- listeners_[i]->Name(parameter); \
- } \
- } \
-}
-
-GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
-GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
-GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
-GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
-
-#undef GTEST_REPEATER_METHOD_
-#undef GTEST_REVERSE_REPEATER_METHOD_
-
-void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
- int iteration) {
- if (forwarding_enabled_) {
- for (size_t i = 0; i < listeners_.size(); i++) {
- listeners_[i]->OnTestIterationStart(unit_test, iteration);
- }
- }
-}
-
-void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
- int iteration) {
- if (forwarding_enabled_) {
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
- listeners_[i]->OnTestIterationEnd(unit_test, iteration);
- }
- }
-}
-
-// End TestEventRepeater
-
-// This class generates an XML output file.
-class XmlUnitTestResultPrinter : public EmptyTestEventListener {
- public:
- explicit XmlUnitTestResultPrinter(const char* output_file);
-
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
-
- private:
- // Is c a whitespace character that is normalized to a space character
- // when it appears in an XML attribute value?
- static bool IsNormalizableWhitespace(char c) {
- return c == 0x9 || c == 0xA || c == 0xD;
- }
-
- // May c appear in a well-formed XML document?
- static bool IsValidXmlCharacter(char c) {
- return IsNormalizableWhitespace(c) || c >= 0x20;
- }
-
- // Returns an XML-escaped copy of the input string str. If
- // is_attribute is true, the text is meant to appear as an attribute
- // value, and normalizable whitespace is preserved by replacing it
- // with character references.
- static String EscapeXml(const char* str, bool is_attribute);
-
- // Returns the given string with all characters invalid in XML removed.
- static string RemoveInvalidXmlCharacters(const string& str);
-
- // Convenience wrapper around EscapeXml when str is an attribute value.
- static String EscapeXmlAttribute(const char* str) {
- return EscapeXml(str, true);
- }
-
- // Convenience wrapper around EscapeXml when str is not an attribute value.
- static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }
-
- // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
- static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
-
- // Streams an XML representation of a TestInfo object.
- static void OutputXmlTestInfo(::std::ostream* stream,
- const char* test_case_name,
- const TestInfo& test_info);
-
- // Prints an XML representation of a TestCase object
- static void PrintXmlTestCase(FILE* out, const TestCase& test_case);
-
- // Prints an XML summary of unit_test to output stream out.
- static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);
-
- // Produces a string representing the test properties in a result as space
- // delimited XML attributes based on the property key="value" pairs.
- // When the String is not empty, it includes a space at the beginning,
- // to delimit this attribute from prior attributes.
- static String TestPropertiesAsXmlAttributes(const TestResult& result);
-
- // The output file.
- const String output_file_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
-};
-
-// Creates a new XmlUnitTestResultPrinter.
-XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
- : output_file_(output_file) {
- if (output_file_.c_str() == NULL || output_file_.empty()) {
- fprintf(stderr, "XML output file may not be null\n");
- fflush(stderr);
- exit(EXIT_FAILURE);
- }
-}
-
-// Called after the unit test ends.
-void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
- int /*iteration*/) {
- FILE* xmlout = NULL;
- FilePath output_file(output_file_);
- FilePath output_dir(output_file.RemoveFileName());
-
- if (output_dir.CreateDirectoriesRecursively()) {
- xmlout = posix::FOpen(output_file_.c_str(), "w");
- }
- if (xmlout == NULL) {
- // TODO(wan): report the reason of the failure.
- //
- // We don't do it for now as:
- //
- // 1. There is no urgent need for it.
- // 2. It's a bit involved to make the errno variable thread-safe on
- // all three operating systems (Linux, Windows, and Mac OS).
- // 3. To interpret the meaning of errno in a thread-safe way,
- // we need the strerror_r() function, which is not available on
- // Windows.
- fprintf(stderr,
- "Unable to open file \"%s\"\n",
- output_file_.c_str());
- fflush(stderr);
- exit(EXIT_FAILURE);
- }
- PrintXmlUnitTest(xmlout, unit_test);
- fclose(xmlout);
-}
-
-// Returns an XML-escaped copy of the input string str. If is_attribute
-// is true, the text is meant to appear as an attribute value, and
-// normalizable whitespace is preserved by replacing it with character
-// references.
-//
-// Invalid XML characters in str, if any, are stripped from the output.
-// It is expected that most, if not all, of the text processed by this
-// module will consist of ordinary English text.
-// If this module is ever modified to produce version 1.1 XML output,
-// most invalid characters can be retained using character references.
-// TODO(wan): It might be nice to have a minimally invasive, human-readable
-// escaping scheme for invalid characters, rather than dropping them.
-String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
- Message m;
-
- if (str != NULL) {
- for (const char* src = str; *src; ++src) {
- switch (*src) {
- case '<':
- m << "<";
- break;
- case '>':
- m << ">";
- break;
- case '&':
- m << "&";
- break;
- case '\'':
- if (is_attribute)
- m << "'";
- else
- m << '\'';
- break;
- case '"':
- if (is_attribute)
- m << """;
- else
- m << '"';
- break;
- default:
- if (IsValidXmlCharacter(*src)) {
- if (is_attribute && IsNormalizableWhitespace(*src))
- m << String::Format("&#x%02X;", unsigned(*src));
- else
- m << *src;
- }
- break;
- }
- }
- }
-
- return m.GetString();
-}
-
-// Returns the given string with all characters invalid in XML removed.
-// Currently invalid characters are dropped from the string. An
-// alternative is to replace them with certain characters such as . or ?.
-string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {
- string output;
- output.reserve(str.size());
- for (string::const_iterator it = str.begin(); it != str.end(); ++it)
- if (IsValidXmlCharacter(*it))
- output.push_back(*it);
-
- return output;
-}
-
-// The following routines generate an XML representation of a UnitTest
-// object.
-//
-// This is how Google Test concepts map to the DTD:
-//
-// <testsuites name="AllTests"> <-- corresponds to a UnitTest object
-// <testsuite name="testcase-name"> <-- corresponds to a TestCase object
-// <testcase name="test-name"> <-- corresponds to a TestInfo object
-// <failure message="...">...</failure>
-// <failure message="...">...</failure>
-// <failure message="...">...</failure>
-// <-- individual assertion failures
-// </testcase>
-// </testsuite>
-// </testsuites>
-
-// Formats the given time in milliseconds as seconds.
-std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
- ::std::stringstream ss;
- ss << double (ms) / 1000.0;
- return ss.str();
-}
-
-// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
-void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
- const char* data) {
- const char* segment = data;
- *stream << "<![CDATA[";
- for (;;) {
- const char* const next_segment = strstr(segment, "]]>");
- if (next_segment != NULL) {
- stream->write(
- segment, static_cast<std::streamsize>(next_segment - segment));
- *stream << "]]>]]><![CDATA[";
- segment = next_segment + strlen("]]>");
- } else {
- *stream << segment;
- break;
- }
- }
- *stream << "]]>";
-}
-
-// Prints an XML representation of a TestInfo object.
-// TODO(wan): There is also value in printing properties with the plain printer.
-void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
- const char* test_case_name,
- const TestInfo& test_info) {
- const TestResult& result = *test_info.result();
- *stream << " <testcase name=\""
- << EscapeXmlAttribute(test_info.name()).c_str() << "\"";
-
- if (test_info.value_param() != NULL) {
- *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param())
- << "\"";
- }
- if (test_info.type_param() != NULL) {
- *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param())
- << "\"";
- }
-
- *stream << " status=\""
- << (test_info.should_run() ? "run" : "notrun")
- << "\" time=\""
- << FormatTimeInMillisAsSeconds(result.elapsed_time())
- << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str()
- << "\"" << TestPropertiesAsXmlAttributes(result).c_str();
-
- int failures = 0;
- for (int i = 0; i < result.total_part_count(); ++i) {
- const TestPartResult& part = result.GetTestPartResult(i);
- if (part.failed()) {
- if (++failures == 1)
- *stream << ">\n";
- *stream << " <failure message=\""
- << EscapeXmlAttribute(part.summary()).c_str()
- << "\" type=\"\">";
- const string location = internal::FormatCompilerIndependentFileLocation(
- part.file_name(), part.line_number());
- const string message = location + "\n" + part.message();
- OutputXmlCDataSection(stream,
- RemoveInvalidXmlCharacters(message).c_str());
- *stream << "</failure>\n";
- }
- }
-
- if (failures == 0)
- *stream << " />\n";
- else
- *stream << " </testcase>\n";
-}
-
-// Prints an XML representation of a TestCase object
-void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
- const TestCase& test_case) {
- fprintf(out,
- " <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
- "disabled=\"%d\" ",
- EscapeXmlAttribute(test_case.name()).c_str(),
- test_case.total_test_count(),
- test_case.failed_test_count(),
- test_case.disabled_test_count());
- fprintf(out,
- "errors=\"0\" time=\"%s\">\n",
- FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());
- for (int i = 0; i < test_case.total_test_count(); ++i) {
- ::std::stringstream stream;
- OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));
- fprintf(out, "%s", StringStreamToString(&stream).c_str());
- }
- fprintf(out, " </testsuite>\n");
-}
-
-// Prints an XML summary of unit_test to output stream out.
-void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
- const UnitTest& unit_test) {
- fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
- fprintf(out,
- "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
- "errors=\"0\" time=\"%s\" ",
- unit_test.total_test_count(),
- unit_test.failed_test_count(),
- unit_test.disabled_test_count(),
- FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
- if (GTEST_FLAG(shuffle)) {
- fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
- }
- fprintf(out, "name=\"AllTests\">\n");
- for (int i = 0; i < unit_test.total_test_case_count(); ++i)
- PrintXmlTestCase(out, *unit_test.GetTestCase(i));
- fprintf(out, "</testsuites>\n");
-}
-
-// Produces a string representing the test properties in a result as space
-// delimited XML attributes based on the property key="value" pairs.
-String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
- const TestResult& result) {
- Message attributes;
- for (int i = 0; i < result.test_property_count(); ++i) {
- const TestProperty& property = result.GetTestProperty(i);
- attributes << " " << property.key() << "="
- << "\"" << EscapeXmlAttribute(property.value()) << "\"";
- }
- return attributes.GetString();
-}
-
-// End XmlUnitTestResultPrinter
-
-#if GTEST_CAN_STREAM_RESULTS_
-
-// Streams test results to the given port on the given host machine.
-class StreamingListener : public EmptyTestEventListener {
- public:
- // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
- static string UrlEncode(const char* str);
-
- StreamingListener(const string& host, const string& port)
- : sockfd_(-1), host_name_(host), port_num_(port) {
- MakeConnection();
- Send("gtest_streaming_protocol_version=1.0\n");
- }
-
- virtual ~StreamingListener() {
- if (sockfd_ != -1)
- CloseConnection();
- }
-
- void OnTestProgramStart(const UnitTest& /* unit_test */) {
- Send("event=TestProgramStart\n");
- }
-
- void OnTestProgramEnd(const UnitTest& unit_test) {
- // Note that Google Test current only report elapsed time for each
- // test iteration, not for the entire test program.
- Send(String::Format("event=TestProgramEnd&passed=%d\n",
- unit_test.Passed()));
-
- // Notify the streaming server to stop.
- CloseConnection();
- }
-
- void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
- Send(String::Format("event=TestIterationStart&iteration=%d\n",
- iteration));
- }
-
- void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
- Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n",
- unit_test.Passed(),
- StreamableToString(unit_test.elapsed_time()).c_str()));
- }
-
- void OnTestCaseStart(const TestCase& test_case) {
- Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name()));
- }
-
- void OnTestCaseEnd(const TestCase& test_case) {
- Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n",
- test_case.Passed(),
- StreamableToString(test_case.elapsed_time()).c_str()));
- }
-
- void OnTestStart(const TestInfo& test_info) {
- Send(String::Format("event=TestStart&name=%s\n", test_info.name()));
- }
-
- void OnTestEnd(const TestInfo& test_info) {
- Send(String::Format(
- "event=TestEnd&passed=%d&elapsed_time=%sms\n",
- (test_info.result())->Passed(),
- StreamableToString((test_info.result())->elapsed_time()).c_str()));
- }
-
- void OnTestPartResult(const TestPartResult& test_part_result) {
- const char* file_name = test_part_result.file_name();
- if (file_name == NULL)
- file_name = "";
- Send(String::Format("event=TestPartResult&file=%s&line=%d&message=",
- UrlEncode(file_name).c_str(),
- test_part_result.line_number()));
- Send(UrlEncode(test_part_result.message()) + "\n");
- }
-
- private:
- // Creates a client socket and connects to the server.
- void MakeConnection();
-
- // Closes the socket.
- void CloseConnection() {
- GTEST_CHECK_(sockfd_ != -1)
- << "CloseConnection() can be called only when there is a connection.";
-
- close(sockfd_);
- sockfd_ = -1;
- }
-
- // Sends a string to the socket.
- void Send(const string& message) {
- GTEST_CHECK_(sockfd_ != -1)
- << "Send() can be called only when there is a connection.";
-
- const int len = static_cast<int>(message.length());
- if (write(sockfd_, message.c_str(), len) != len) {
- GTEST_LOG_(WARNING)
- << "stream_result_to: failed to stream to "
- << host_name_ << ":" << port_num_;
- }
- }
-
- int sockfd_; // socket file descriptor
- const string host_name_;
- const string port_num_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
-}; // class StreamingListener
-
-// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
-// replaces them by "%xx" where xx is their hexadecimal value. For
-// example, replaces "=" with "%3D". This algorithm is O(strlen(str))
-// in both time and space -- important as the input str may contain an
-// arbitrarily long test failure message and stack trace.
-string StreamingListener::UrlEncode(const char* str) {
- string result;
- result.reserve(strlen(str) + 1);
- for (char ch = *str; ch != '\0'; ch = *++str) {
- switch (ch) {
- case '%':
- case '=':
- case '&':
- case '\n':
- result.append(String::Format("%%%02x", static_cast<unsigned char>(ch)));
- break;
- default:
- result.push_back(ch);
- break;
- }
- }
- return result;
-}
-
-void StreamingListener::MakeConnection() {
- GTEST_CHECK_(sockfd_ == -1)
- << "MakeConnection() can't be called when there is already a connection.";
-
- addrinfo hints;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses.
- hints.ai_socktype = SOCK_STREAM;
- addrinfo* servinfo = NULL;
-
- // Use the getaddrinfo() to get a linked list of IP addresses for
- // the given host name.
- const int error_num = getaddrinfo(
- host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
- if (error_num != 0) {
- GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
- << gai_strerror(error_num);
- }
-
- // Loop through all the results and connect to the first we can.
- for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
- cur_addr = cur_addr->ai_next) {
- sockfd_ = socket(
- cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
- if (sockfd_ != -1) {
- // Connect the client socket to the server socket.
- if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
- close(sockfd_);
- sockfd_ = -1;
- }
- }
- }
-
- freeaddrinfo(servinfo); // all done with this structure
-
- if (sockfd_ == -1) {
- GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
- << host_name_ << ":" << port_num_;
- }
-}
-
-// End of class Streaming Listener
-#endif // GTEST_CAN_STREAM_RESULTS__
-
-// Class ScopedTrace
-
-// Pushes the given source file location and message onto a per-thread
-// trace stack maintained by Google Test.
-// L < UnitTest::mutex_
-ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
- TraceInfo trace;
- trace.file = file;
- trace.line = line;
- trace.message = message.GetString();
-
- UnitTest::GetInstance()->PushGTestTrace(trace);
-}
-
-// Pops the info pushed by the c'tor.
-// L < UnitTest::mutex_
-ScopedTrace::~ScopedTrace() {
- UnitTest::GetInstance()->PopGTestTrace();
-}
-
-
-// class OsStackTraceGetter
-
-// Returns the current OS stack trace as a String. Parameters:
-//
-// max_depth - the maximum number of stack frames to be included
-// in the trace.
-// skip_count - the number of top frames to be skipped; doesn't count
-// against max_depth.
-//
-// L < mutex_
-// We use "L < mutex_" to denote that the function may acquire mutex_.
-String OsStackTraceGetter::CurrentStackTrace(int, int) {
- return String("");
-}
-
-// L < mutex_
-void OsStackTraceGetter::UponLeavingGTest() {
-}
-
-const char* const
-OsStackTraceGetter::kElidedFramesMarker =
- "... " GTEST_NAME_ " internal frames ...";
-
-} // namespace internal
-
-// class TestEventListeners
-
-TestEventListeners::TestEventListeners()
- : repeater_(new internal::TestEventRepeater()),
- default_result_printer_(NULL),
- default_xml_generator_(NULL) {
-}
-
-TestEventListeners::~TestEventListeners() { delete repeater_; }
-
-// Returns the standard listener responsible for the default console
-// output. Can be removed from the listeners list to shut down default
-// console output. Note that removing this object from the listener list
-// with Release transfers its ownership to the user.
-void TestEventListeners::Append(TestEventListener* listener) {
- repeater_->Append(listener);
-}
-
-// Removes the given event listener from the list and returns it. It then
-// becomes the caller's responsibility to delete the listener. Returns
-// NULL if the listener is not found in the list.
-TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
- if (listener == default_result_printer_)
- default_result_printer_ = NULL;
- else if (listener == default_xml_generator_)
- default_xml_generator_ = NULL;
- return repeater_->Release(listener);
-}
-
-// Returns repeater that broadcasts the TestEventListener events to all
-// subscribers.
-TestEventListener* TestEventListeners::repeater() { return repeater_; }
-
-// Sets the default_result_printer attribute to the provided listener.
-// The listener is also added to the listener list and previous
-// default_result_printer is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
- if (default_result_printer_ != listener) {
- // It is an error to pass this method a listener that is already in the
- // list.
- delete Release(default_result_printer_);
- default_result_printer_ = listener;
- if (listener != NULL)
- Append(listener);
- }
-}
-
-// Sets the default_xml_generator attribute to the provided listener. The
-// listener is also added to the listener list and previous
-// default_xml_generator is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
- if (default_xml_generator_ != listener) {
- // It is an error to pass this method a listener that is already in the
- // list.
- delete Release(default_xml_generator_);
- default_xml_generator_ = listener;
- if (listener != NULL)
- Append(listener);
- }
-}
-
-// Controls whether events will be forwarded by the repeater to the
-// listeners in the list.
-bool TestEventListeners::EventForwardingEnabled() const {
- return repeater_->forwarding_enabled();
-}
-
-void TestEventListeners::SuppressEventForwarding() {
- repeater_->set_forwarding_enabled(false);
-}
-
-// class UnitTest
-
-// Gets the singleton UnitTest object. The first time this method is
-// called, a UnitTest object is constructed and returned. Consecutive
-// calls will return the same object.
-//
-// We don't protect this under mutex_ as a user is not supposed to
-// call this before main() starts, from which point on the return
-// value will never change.
-UnitTest * UnitTest::GetInstance() {
- // When compiled with MSVC 7.1 in optimized mode, destroying the
- // UnitTest object upon exiting the program messes up the exit code,
- // causing successful tests to appear failed. We have to use a
- // different implementation in this case to bypass the compiler bug.
- // This implementation makes the compiler happy, at the cost of
- // leaking the UnitTest object.
-
- // CodeGear C++Builder insists on a public destructor for the
- // default implementation. Use this implementation to keep good OO
- // design with private destructor.
-
-#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
- static UnitTest* const instance = new UnitTest;
- return instance;
-#else
- static UnitTest instance;
- return &instance;
-#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
-}
-
-// Gets the number of successful test cases.
-int UnitTest::successful_test_case_count() const {
- return impl()->successful_test_case_count();
-}
-
-// Gets the number of failed test cases.
-int UnitTest::failed_test_case_count() const {
- return impl()->failed_test_case_count();
-}
-
-// Gets the number of all test cases.
-int UnitTest::total_test_case_count() const {
- return impl()->total_test_case_count();
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTest::test_case_to_run_count() const {
- return impl()->test_case_to_run_count();
-}
-
-// Gets the number of successful tests.
-int UnitTest::successful_test_count() const {
- return impl()->successful_test_count();
-}
-
-// Gets the number of failed tests.
-int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
-
-// Gets the number of disabled tests.
-int UnitTest::disabled_test_count() const {
- return impl()->disabled_test_count();
-}
-
-// Gets the number of all tests.
-int UnitTest::total_test_count() const { return impl()->total_test_count(); }
-
-// Gets the number of tests that should run.
-int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
-
-// Gets the elapsed time, in milliseconds.
-internal::TimeInMillis UnitTest::elapsed_time() const {
- return impl()->elapsed_time();
-}
-
-// Returns true iff the unit test passed (i.e. all test cases passed).
-bool UnitTest::Passed() const { return impl()->Passed(); }
-
-// Returns true iff the unit test failed (i.e. some test case failed
-// or something outside of all tests failed).
-bool UnitTest::Failed() const { return impl()->Failed(); }
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-const TestCase* UnitTest::GetTestCase(int i) const {
- return impl()->GetTestCase(i);
-}
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-TestCase* UnitTest::GetMutableTestCase(int i) {
- return impl()->GetMutableTestCase(i);
-}
-
-// Returns the list of event listeners that can be used to track events
-// inside Google Test.
-TestEventListeners& UnitTest::listeners() {
- return *impl()->listeners();
-}
-
-// Registers and returns a global test environment. When a test
-// program is run, all global test environments will be set-up in the
-// order they were registered. After all tests in the program have
-// finished, all global test environments will be torn-down in the
-// *reverse* order they were registered.
-//
-// The UnitTest object takes ownership of the given environment.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-Environment* UnitTest::AddEnvironment(Environment* env) {
- if (env == NULL) {
- return NULL;
- }
-
- impl_->environments().push_back(env);
- return env;
-}
-
-// Adds a TestPartResult to the current TestResult object. All Google Test
-// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
-// this to report their results. The user code should use the
-// assertion macros instead of calling this directly.
-// L < mutex_
-void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
- const char* file_name,
- int line_number,
- const internal::String& message,
- const internal::String& os_stack_trace) {
- Message msg;
- msg << message;
-
- internal::MutexLock lock(&mutex_);
- if (impl_->gtest_trace_stack().size() > 0) {
- msg << "\n" << GTEST_NAME_ << " trace:";
-
- for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
- i > 0; --i) {
- const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
- msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
- << " " << trace.message;
- }
- }
-
- if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
- msg << internal::kStackTraceMarker << os_stack_trace;
- }
-
- const TestPartResult result =
- TestPartResult(result_type, file_name, line_number,
- msg.GetString().c_str());
- impl_->GetTestPartResultReporterForCurrentThread()->
- ReportTestPartResult(result);
-
- if (result_type != TestPartResult::kSuccess) {
- // gtest_break_on_failure takes precedence over
- // gtest_throw_on_failure. This allows a user to set the latter
- // in the code (perhaps in order to use Google Test assertions
- // with another testing framework) and specify the former on the
- // command line for debugging.
- if (GTEST_FLAG(break_on_failure)) {
-#if GTEST_OS_WINDOWS
- // Using DebugBreak on Windows allows gtest to still break into a debugger
- // when a failure happens and both the --gtest_break_on_failure and
- // the --gtest_catch_exceptions flags are specified.
- DebugBreak();
-#else
- // Dereference NULL through a volatile pointer to prevent the compiler
- // from removing. We use this rather than abort() or __builtin_trap() for
- // portability: Symbian doesn't implement abort() well, and some debuggers
- // don't correctly trap abort().
- *static_cast<volatile int*>(NULL) = 1;
-#endif // GTEST_OS_WINDOWS
- } else if (GTEST_FLAG(throw_on_failure)) {
-#if GTEST_HAS_EXCEPTIONS
- throw GoogleTestFailureException(result);
-#else
- // We cannot call abort() as it generates a pop-up in debug mode
- // that cannot be suppressed in VC 7.1 or below.
- exit(1);
-#endif
- }
- }
-}
-
-// Creates and adds a property to the current TestResult. If a property matching
-// the supplied value already exists, updates its value instead.
-void UnitTest::RecordPropertyForCurrentTest(const char* key,
- const char* value) {
- const TestProperty test_property(key, value);
- impl_->current_test_result()->RecordProperty(test_property);
-}
-
-// Runs all tests in this UnitTest object and prints the result.
-// Returns 0 if successful, or 1 otherwise.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-int UnitTest::Run() {
- // Captures the value of GTEST_FLAG(catch_exceptions). This value will be
- // used for the duration of the program.
- impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
-
-#if GTEST_HAS_SEH
- const bool in_death_test_child_process =
- internal::GTEST_FLAG(internal_run_death_test).length() > 0;
-
- // Either the user wants Google Test to catch exceptions thrown by the
- // tests or this is executing in the context of death test child
- // process. In either case the user does not want to see pop-up dialogs
- // about crashes - they are expected.
- if (impl()->catch_exceptions() || in_death_test_child_process) {
-
-# if !GTEST_OS_WINDOWS_MOBILE
- // SetErrorMode doesn't exist on CE.
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
- SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-# endif // !GTEST_OS_WINDOWS_MOBILE
-
-# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
- // Death test children can be terminated with _abort(). On Windows,
- // _abort() can show a dialog with a warning message. This forces the
- // abort message to go to stderr instead.
- _set_error_mode(_OUT_TO_STDERR);
-# endif
-
-# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
- // In the debug version, Visual Studio pops up a separate dialog
- // offering a choice to debug the aborted program. We need to suppress
- // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
- // executed. Google Test will notify the user of any unexpected
- // failure via stderr.
- //
- // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
- // Users of prior VC versions shall suffer the agony and pain of
- // clicking through the countless debug dialogs.
- // TODO(vladl@google.com): find a way to suppress the abort dialog() in the
- // debug mode when compiled with VC 7.1 or lower.
- if (!GTEST_FLAG(break_on_failure))
- _set_abort_behavior(
- 0x0, // Clear the following flags:
- _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
-# endif
-
- }
-#endif // GTEST_HAS_SEH
-
- return internal::HandleExceptionsInMethodIfSupported(
- impl(),
- &internal::UnitTestImpl::RunAllTests,
- "auxiliary test code (environments or event listeners)") ? 0 : 1;
-}
-
-// Returns the working directory when the first TEST() or TEST_F() was
-// executed.
-const char* UnitTest::original_working_dir() const {
- return impl_->original_working_dir_.c_str();
-}
-
-// Returns the TestCase object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestCase* UnitTest::current_test_case() const {
- internal::MutexLock lock(&mutex_);
- return impl_->current_test_case();
-}
-
-// Returns the TestInfo object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestInfo* UnitTest::current_test_info() const {
- internal::MutexLock lock(&mutex_);
- return impl_->current_test_info();
-}
-
-// Returns the random seed used at the start of the current test run.
-int UnitTest::random_seed() const { return impl_->random_seed(); }
-
-#if GTEST_HAS_PARAM_TEST
-// Returns ParameterizedTestCaseRegistry object used to keep track of
-// value-parameterized tests and instantiate and register them.
-// L < mutex_
-internal::ParameterizedTestCaseRegistry&
- UnitTest::parameterized_test_registry() {
- return impl_->parameterized_test_registry();
-}
-#endif // GTEST_HAS_PARAM_TEST
-
-// Creates an empty UnitTest.
-UnitTest::UnitTest() {
- impl_ = new internal::UnitTestImpl(this);
-}
-
-// Destructor of UnitTest.
-UnitTest::~UnitTest() {
- delete impl_;
-}
-
-// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
-// Google Test trace stack.
-// L < mutex_
-void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
- internal::MutexLock lock(&mutex_);
- impl_->gtest_trace_stack().push_back(trace);
-}
-
-// Pops a trace from the per-thread Google Test trace stack.
-// L < mutex_
-void UnitTest::PopGTestTrace() {
- internal::MutexLock lock(&mutex_);
- impl_->gtest_trace_stack().pop_back();
-}
-
-namespace internal {
-
-UnitTestImpl::UnitTestImpl(UnitTest* parent)
- : parent_(parent),
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4355) // Temporarily disables warning 4355
- // (using this in initializer).
- default_global_test_part_result_reporter_(this),
- default_per_thread_test_part_result_reporter_(this),
-# pragma warning(pop) // Restores the warning state again.
-#else
- default_global_test_part_result_reporter_(this),
- default_per_thread_test_part_result_reporter_(this),
-#endif // _MSC_VER
- global_test_part_result_repoter_(
- &default_global_test_part_result_reporter_),
- per_thread_test_part_result_reporter_(
- &default_per_thread_test_part_result_reporter_),
-#if GTEST_HAS_PARAM_TEST
- parameterized_test_registry_(),
- parameterized_tests_registered_(false),
-#endif // GTEST_HAS_PARAM_TEST
- last_death_test_case_(-1),
- current_test_case_(NULL),
- current_test_info_(NULL),
- ad_hoc_test_result_(),
- os_stack_trace_getter_(NULL),
- post_flag_parse_init_performed_(false),
- random_seed_(0), // Will be overridden by the flag before first use.
- random_(0), // Will be reseeded before first use.
- elapsed_time_(0),
-#if GTEST_HAS_DEATH_TEST
- internal_run_death_test_flag_(NULL),
- death_test_factory_(new DefaultDeathTestFactory),
-#endif
- // Will be overridden by the flag before first use.
- catch_exceptions_(false) {
- listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
-}
-
-UnitTestImpl::~UnitTestImpl() {
- // Deletes every TestCase.
- ForEach(test_cases_, internal::Delete<TestCase>);
-
- // Deletes every Environment.
- ForEach(environments_, internal::Delete<Environment>);
-
- delete os_stack_trace_getter_;
-}
-
-#if GTEST_HAS_DEATH_TEST
-// Disables event forwarding if the control is currently in a death test
-// subprocess. Must not be called before InitGoogleTest.
-void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
- if (internal_run_death_test_flag_.get() != NULL)
- listeners()->SuppressEventForwarding();
-}
-#endif // GTEST_HAS_DEATH_TEST
-
-// Initializes event listeners performing XML output as specified by
-// UnitTestOptions. Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureXmlOutput() {
- const String& output_format = UnitTestOptions::GetOutputFormat();
- if (output_format == "xml") {
- listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
- UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
- } else if (output_format != "") {
- printf("WARNING: unrecognized output format \"%s\" ignored.\n",
- output_format.c_str());
- fflush(stdout);
- }
-}
-
-#if GTEST_CAN_STREAM_RESULTS_
-// Initializes event listeners for streaming test results in String form.
-// Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureStreamingOutput() {
- const string& target = GTEST_FLAG(stream_result_to);
- if (!target.empty()) {
- const size_t pos = target.find(':');
- if (pos != string::npos) {
- listeners()->Append(new StreamingListener(target.substr(0, pos),
- target.substr(pos+1)));
- } else {
- printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
- target.c_str());
- fflush(stdout);
- }
- }
-}
-#endif // GTEST_CAN_STREAM_RESULTS_
-
-// Performs initialization dependent upon flag values obtained in
-// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
-// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
-// this function is also called from RunAllTests. Since this function can be
-// called more than once, it has to be idempotent.
-void UnitTestImpl::PostFlagParsingInit() {
- // Ensures that this function does not execute more than once.
- if (!post_flag_parse_init_performed_) {
- post_flag_parse_init_performed_ = true;
-
-#if GTEST_HAS_DEATH_TEST
- InitDeathTestSubprocessControlInfo();
- SuppressTestEventsIfInSubprocess();
-#endif // GTEST_HAS_DEATH_TEST
-
- // Registers parameterized tests. This makes parameterized tests
- // available to the UnitTest reflection API without running
- // RUN_ALL_TESTS.
- RegisterParameterizedTests();
-
- // Configures listeners for XML output. This makes it possible for users
- // to shut down the default XML output before invoking RUN_ALL_TESTS.
- ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
- // Configures listeners for streaming test results to the specified server.
- ConfigureStreamingOutput();
-#endif // GTEST_CAN_STREAM_RESULTS_
- }
-}
-
-// A predicate that checks the name of a TestCase against a known
-// value.
-//
-// This is used for implementation of the UnitTest class only. We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestCaseNameIs is copyable.
-class TestCaseNameIs {
- public:
- // Constructor.
- explicit TestCaseNameIs(const String& name)
- : name_(name) {}
-
- // Returns true iff the name of test_case matches name_.
- bool operator()(const TestCase* test_case) const {
- return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
- }
-
- private:
- String name_;
-};
-
-// Finds and returns a TestCase with the given name. If one doesn't
-// exist, creates one and returns it. It's the CALLER'S
-// RESPONSIBILITY to ensure that this function is only called WHEN THE
-// TESTS ARE NOT SHUFFLED.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// type_param: the name of the test case's type parameter, or NULL if
-// this is not a typed or a type-parameterized test case.
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
- const char* type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc) {
- // Can we find a TestCase with the given name?
- const std::vector<TestCase*>::const_iterator test_case =
- std::find_if(test_cases_.begin(), test_cases_.end(),
- TestCaseNameIs(test_case_name));
-
- if (test_case != test_cases_.end())
- return *test_case;
-
- // No. Let's create one.
- TestCase* const new_test_case =
- new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
-
- // Is this a death test case?
- if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),
- kDeathTestCaseFilter)) {
- // Yes. Inserts the test case after the last death test case
- // defined so far. This only works when the test cases haven't
- // been shuffled. Otherwise we may end up running a death test
- // after a non-death test.
- ++last_death_test_case_;
- test_cases_.insert(test_cases_.begin() + last_death_test_case_,
- new_test_case);
- } else {
- // No. Appends to the end of the list.
- test_cases_.push_back(new_test_case);
- }
-
- test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
- return new_test_case;
-}
-
-// Helpers for setting up / tearing down the given environment. They
-// are for use in the ForEach() function.
-static void SetUpEnvironment(Environment* env) { env->SetUp(); }
-static void TearDownEnvironment(Environment* env) { env->TearDown(); }
-
-// Runs all tests in this UnitTest object, prints the result, and
-// returns true if all tests are successful. If any exception is
-// thrown during a test, the test is considered to be failed, but the
-// rest of the tests will still be run.
-//
-// When parameterized tests are enabled, it expands and registers
-// parameterized tests first in RegisterParameterizedTests().
-// All other functions called from RunAllTests() may safely assume that
-// parameterized tests are ready to be counted and run.
-bool UnitTestImpl::RunAllTests() {
- // Makes sure InitGoogleTest() was called.
- if (!GTestIsInitialized()) {
- printf("%s",
- "\nThis test program did NOT call ::testing::InitGoogleTest "
- "before calling RUN_ALL_TESTS(). Please fix it.\n");
- return false;
- }
-
- // Do not run any test if the --help flag was specified.
- if (g_help_flag)
- return true;
-
- // Repeats the call to the post-flag parsing initialization in case the
- // user didn't call InitGoogleTest.
- PostFlagParsingInit();
-
- // Even if sharding is not on, test runners may want to use the
- // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
- // protocol.
- internal::WriteToShardStatusFileIfNeeded();
-
- // True iff we are in a subprocess for running a thread-safe-style
- // death test.
- bool in_subprocess_for_death_test = false;
-
-#if GTEST_HAS_DEATH_TEST
- in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
-#endif // GTEST_HAS_DEATH_TEST
-
- const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
- in_subprocess_for_death_test);
-
- // Compares the full test names with the filter to decide which
- // tests to run.
- const bool has_tests_to_run = FilterTests(should_shard
- ? HONOR_SHARDING_PROTOCOL
- : IGNORE_SHARDING_PROTOCOL) > 0;
-
- // Lists the tests and exits if the --gtest_list_tests flag was specified.
- if (GTEST_FLAG(list_tests)) {
- // This must be called *after* FilterTests() has been called.
- ListTestsMatchingFilter();
- return true;
- }
-
- random_seed_ = GTEST_FLAG(shuffle) ?
- GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
-
- // True iff at least one test has failed.
- bool failed = false;
-
- TestEventListener* repeater = listeners()->repeater();
-
- repeater->OnTestProgramStart(*parent_);
-
- // How many times to repeat the tests? We don't want to repeat them
- // when we are inside the subprocess of a death test.
- const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
- // Repeats forever if the repeat count is negative.
- const bool forever = repeat < 0;
- for (int i = 0; forever || i != repeat; i++) {
- // We want to preserve failures generated by ad-hoc test
- // assertions executed before RUN_ALL_TESTS().
- ClearNonAdHocTestResult();
-
- const TimeInMillis start = GetTimeInMillis();
-
- // Shuffles test cases and tests if requested.
- if (has_tests_to_run && GTEST_FLAG(shuffle)) {
- random()->Reseed(random_seed_);
- // This should be done before calling OnTestIterationStart(),
- // such that a test event listener can see the actual test order
- // in the event.
- ShuffleTests();
- }
-
- // Tells the unit test event listeners that the tests are about to start.
- repeater->OnTestIterationStart(*parent_, i);
-
- // Runs each test case if there is at least one test to run.
- if (has_tests_to_run) {
- // Sets up all environments beforehand.
- repeater->OnEnvironmentsSetUpStart(*parent_);
- ForEach(environments_, SetUpEnvironment);
- repeater->OnEnvironmentsSetUpEnd(*parent_);
-
- // Runs the tests only if there was no fatal failure during global
- // set-up.
- if (!Test::HasFatalFailure()) {
- for (int test_index = 0; test_index < total_test_case_count();
- test_index++) {
- GetMutableTestCase(test_index)->Run();
- }
- }
-
- // Tears down all environments in reverse order afterwards.
- repeater->OnEnvironmentsTearDownStart(*parent_);
- std::for_each(environments_.rbegin(), environments_.rend(),
- TearDownEnvironment);
- repeater->OnEnvironmentsTearDownEnd(*parent_);
- }
-
- elapsed_time_ = GetTimeInMillis() - start;
-
- // Tells the unit test event listener that the tests have just finished.
- repeater->OnTestIterationEnd(*parent_, i);
-
- // Gets the result and clears it.
- if (!Passed()) {
- failed = true;
- }
-
- // Restores the original test order after the iteration. This
- // allows the user to quickly repro a failure that happens in the
- // N-th iteration without repeating the first (N - 1) iterations.
- // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
- // case the user somehow changes the value of the flag somewhere
- // (it's always safe to unshuffle the tests).
- UnshuffleTests();
-
- if (GTEST_FLAG(shuffle)) {
- // Picks a new random seed for each iteration.
- random_seed_ = GetNextRandomSeed(random_seed_);
- }
- }
-
- repeater->OnTestProgramEnd(*parent_);
-
- return !failed;
-}
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded() {
- const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
- if (test_shard_file != NULL) {
- FILE* const file = posix::FOpen(test_shard_file, "w");
- if (file == NULL) {
- ColoredPrintf(COLOR_RED,
- "Could not write to the test shard status file \"%s\" "
- "specified by the %s environment variable.\n",
- test_shard_file, kTestShardStatusFile);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- fclose(file);
- }
-}
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (i.e., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-bool ShouldShard(const char* total_shards_env,
- const char* shard_index_env,
- bool in_subprocess_for_death_test) {
- if (in_subprocess_for_death_test) {
- return false;
- }
-
- const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
- const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
-
- if (total_shards == -1 && shard_index == -1) {
- return false;
- } else if (total_shards == -1 && shard_index != -1) {
- const Message msg = Message()
- << "Invalid environment variables: you have "
- << kTestShardIndex << " = " << shard_index
- << ", but have left " << kTestTotalShards << " unset.\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- } else if (total_shards != -1 && shard_index == -1) {
- const Message msg = Message()
- << "Invalid environment variables: you have "
- << kTestTotalShards << " = " << total_shards
- << ", but have left " << kTestShardIndex << " unset.\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- } else if (shard_index < 0 || shard_index >= total_shards) {
- const Message msg = Message()
- << "Invalid environment variables: we require 0 <= "
- << kTestShardIndex << " < " << kTestTotalShards
- << ", but you have " << kTestShardIndex << "=" << shard_index
- << ", " << kTestTotalShards << "=" << total_shards << ".\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
-
- return total_shards > 1;
-}
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error
-// and aborts.
-Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
- const char* str_val = posix::GetEnv(var);
- if (str_val == NULL) {
- return default_val;
- }
-
- Int32 result;
- if (!ParseInt32(Message() << "The value of environment variable " << var,
- str_val, &result)) {
- exit(EXIT_FAILURE);
- }
- return result;
-}
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
- return (test_id % total_shards) == shard_index;
-}
-
-// Compares the name of each test with the user-specified filter to
-// decide whether the test should be run, then records the result in
-// each TestCase and TestInfo object.
-// If shard_tests == true, further filters tests based on sharding
-// variables in the environment - see
-// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
-// Returns the number of tests that should run.
-int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
- const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
- Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
- const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
- Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
-
- // num_runnable_tests are the number of tests that will
- // run across all shards (i.e., match filter and are not disabled).
- // num_selected_tests are the number of tests to be run on
- // this shard.
- int num_runnable_tests = 0;
- int num_selected_tests = 0;
- for (size_t i = 0; i < test_cases_.size(); i++) {
- TestCase* const test_case = test_cases_[i];
- const String &test_case_name = test_case->name();
- test_case->set_should_run(false);
-
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
- TestInfo* const test_info = test_case->test_info_list()[j];
- const String test_name(test_info->name());
- // A test is disabled if test case name or test name matches
- // kDisableTestFilter.
- const bool is_disabled =
- internal::UnitTestOptions::MatchesFilter(test_case_name,
- kDisableTestFilter) ||
- internal::UnitTestOptions::MatchesFilter(test_name,
- kDisableTestFilter);
- test_info->is_disabled_ = is_disabled;
-
- const bool matches_filter =
- internal::UnitTestOptions::FilterMatchesTest(test_case_name,
- test_name);
- test_info->matches_filter_ = matches_filter;
-
- const bool is_runnable =
- (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
- matches_filter;
-
- const bool is_selected = is_runnable &&
- (shard_tests == IGNORE_SHARDING_PROTOCOL ||
- ShouldRunTestOnShard(total_shards, shard_index,
- num_runnable_tests));
-
- num_runnable_tests += is_runnable;
- num_selected_tests += is_selected;
-
- test_info->should_run_ = is_selected;
- test_case->set_should_run(test_case->should_run() || is_selected);
- }
- }
- return num_selected_tests;
-}
-
-// Prints the names of the tests matching the user-specified filter flag.
-void UnitTestImpl::ListTestsMatchingFilter() {
- for (size_t i = 0; i < test_cases_.size(); i++) {
- const TestCase* const test_case = test_cases_[i];
- bool printed_test_case_name = false;
-
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
- const TestInfo* const test_info =
- test_case->test_info_list()[j];
- if (test_info->matches_filter_) {
- if (!printed_test_case_name) {
- printed_test_case_name = true;
- printf("%s.\n", test_case->name());
- }
- printf(" %s\n", test_info->name());
- }
- }
- }
- fflush(stdout);
-}
-
-// Sets the OS stack trace getter.
-//
-// Does nothing if the input and the current OS stack trace getter are
-// the same; otherwise, deletes the old getter and makes the input the
-// current getter.
-void UnitTestImpl::set_os_stack_trace_getter(
- OsStackTraceGetterInterface* getter) {
- if (os_stack_trace_getter_ != getter) {
- delete os_stack_trace_getter_;
- os_stack_trace_getter_ = getter;
- }
-}
-
-// Returns the current OS stack trace getter if it is not NULL;
-// otherwise, creates an OsStackTraceGetter, makes it the current
-// getter, and returns it.
-OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
- if (os_stack_trace_getter_ == NULL) {
- os_stack_trace_getter_ = new OsStackTraceGetter;
- }
-
- return os_stack_trace_getter_;
-}
-
-// Returns the TestResult for the test that's currently running, or
-// the TestResult for the ad hoc test if no test is running.
-TestResult* UnitTestImpl::current_test_result() {
- return current_test_info_ ?
- &(current_test_info_->result_) : &ad_hoc_test_result_;
-}
-
-// Shuffles all test cases, and the tests within each test case,
-// making sure that death tests are still run first.
-void UnitTestImpl::ShuffleTests() {
- // Shuffles the death test cases.
- ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
-
- // Shuffles the non-death test cases.
- ShuffleRange(random(), last_death_test_case_ + 1,
- static_cast<int>(test_cases_.size()), &test_case_indices_);
-
- // Shuffles the tests inside each test case.
- for (size_t i = 0; i < test_cases_.size(); i++) {
- test_cases_[i]->ShuffleTests(random());
- }
-}
-
-// Restores the test cases and tests to their order before the first shuffle.
-void UnitTestImpl::UnshuffleTests() {
- for (size_t i = 0; i < test_cases_.size(); i++) {
- // Unshuffles the tests in each test case.
- test_cases_[i]->UnshuffleTests();
- // Resets the index of each test case.
- test_case_indices_[i] = static_cast<int>(i);
- }
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
- int skip_count) {
- // We pass skip_count + 1 to skip this wrapper function in addition
- // to what the user really wants to skip.
- return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
-}
-
-// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
-// suppress unreachable code warnings.
-namespace {
-class ClassUniqueToAlwaysTrue {};
-}
-
-bool IsTrue(bool condition) { return condition; }
-
-bool AlwaysTrue() {
-#if GTEST_HAS_EXCEPTIONS
- // This condition is always false so AlwaysTrue() never actually throws,
- // but it makes the compiler think that it may throw.
- if (IsTrue(false))
- throw ClassUniqueToAlwaysTrue();
-#endif // GTEST_HAS_EXCEPTIONS
- return true;
-}
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false. None of pstr, *pstr, and prefix can be NULL.
-bool SkipPrefix(const char* prefix, const char** pstr) {
- const size_t prefix_len = strlen(prefix);
- if (strncmp(*pstr, prefix, prefix_len) == 0) {
- *pstr += prefix_len;
- return true;
- }
- return false;
-}
-
-// Parses a string as a command line flag. The string should have
-// the format "--flag=value". When def_optional is true, the "=value"
-// part can be omitted.
-//
-// Returns the value of the flag, or NULL if the parsing failed.
-const char* ParseFlagValue(const char* str,
- const char* flag,
- bool def_optional) {
- // str and flag must not be NULL.
- if (str == NULL || flag == NULL) return NULL;
-
- // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
- const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag);
- const size_t flag_len = flag_str.length();
- if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
-
- // Skips the flag name.
- const char* flag_end = str + flag_len;
-
- // When def_optional is true, it's OK to not have a "=value" part.
- if (def_optional && (flag_end[0] == '\0')) {
- return flag_end;
- }
-
- // If def_optional is true and there are more characters after the
- // flag name, or if def_optional is false, there must be a '=' after
- // the flag name.
- if (flag_end[0] != '=') return NULL;
-
- // Returns the string after "=".
- return flag_end + 1;
-}
-
-// Parses a string for a bool flag, in the form of either
-// "--flag=value" or "--flag".
-//
-// In the former case, the value is taken as true as long as it does
-// not start with '0', 'f', or 'F'.
-//
-// In the latter case, the value is taken as true.
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, true);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Converts the string value to a bool.
- *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
- return true;
-}
-
-// Parses a string for an Int32 flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, false);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Sets *value to the value of the flag.
- return ParseInt32(Message() << "The value of flag --" << flag,
- value_str, value);
-}
-
-// Parses a string for a string flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseStringFlag(const char* str, const char* flag, String* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, false);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Sets *value to the value of the flag.
- *value = value_str;
- return true;
-}
-
-// Determines whether a string has a prefix that Google Test uses for its
-// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
-// If Google Test detects that a command line flag has its prefix but is not
-// recognized, it will print its help message. Flags starting with
-// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
-// internal flags and do not trigger the help message.
-static bool HasGoogleTestFlagPrefix(const char* str) {
- return (SkipPrefix("--", &str) ||
- SkipPrefix("-", &str) ||
- SkipPrefix("/", &str)) &&
- !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
- (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
- SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
-}
-
-// Prints a string containing code-encoded text. The following escape
-// sequences can be used in the string to control the text color:
-//
-// @@ prints a single '@' character.
-// @R changes the color to red.
-// @G changes the color to green.
-// @Y changes the color to yellow.
-// @D changes to the default terminal text color.
-//
-// TODO(wan@google.com): Write tests for this once we add stdout
-// capturing to Google Test.
-static void PrintColorEncoded(const char* str) {
- GTestColor color = COLOR_DEFAULT; // The current color.
-
- // Conceptually, we split the string into segments divided by escape
- // sequences. Then we print one segment at a time. At the end of
- // each iteration, the str pointer advances to the beginning of the
- // next segment.
- for (;;) {
- const char* p = strchr(str, '@');
- if (p == NULL) {
- ColoredPrintf(color, "%s", str);
- return;
- }
-
- ColoredPrintf(color, "%s", String(str, p - str).c_str());
-
- const char ch = p[1];
- str = p + 2;
- if (ch == '@') {
- ColoredPrintf(color, "@");
- } else if (ch == 'D') {
- color = COLOR_DEFAULT;
- } else if (ch == 'R') {
- color = COLOR_RED;
- } else if (ch == 'G') {
- color = COLOR_GREEN;
- } else if (ch == 'Y') {
- color = COLOR_YELLOW;
- } else {
- --str;
- }
- }
-}
-
-static const char kColorEncodedHelpMessage[] =
-"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
-"following command line flags to control its behavior:\n"
-"\n"
-"Test Selection:\n"
-" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n"
-" List the names of all tests instead of running them. The name of\n"
-" TEST(Foo, Bar) is \"Foo.Bar\".\n"
-" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
- "[@G-@YNEGATIVE_PATTERNS]@D\n"
-" Run only the tests whose name matches one of the positive patterns but\n"
-" none of the negative patterns. '?' matches any single character; '*'\n"
-" matches any substring; ':' separates two patterns.\n"
-" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
-" Run all disabled tests too.\n"
-"\n"
-"Test Execution:\n"
-" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
-" Run the tests repeatedly; use a negative count to repeat forever.\n"
-" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n"
-" Randomize tests' orders on every iteration.\n"
-" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
-" Random number seed to use for shuffling test orders (between 1 and\n"
-" 99999, or 0 to use a seed based on the current time).\n"
-"\n"
-"Test Output:\n"
-" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
-" Enable/disable colored output. The default is @Gauto@D.\n"
-" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n"
-" Don't print the elapsed time of each test.\n"
-" @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G"
- GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
-" Generate an XML report in the given directory or with the given file\n"
-" name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"
-#if GTEST_CAN_STREAM_RESULTS_
-" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n"
-" Stream test results to the given server.\n"
-#endif // GTEST_CAN_STREAM_RESULTS_
-"\n"
-"Assertion Behavior:\n"
-#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
-" Set the default death test style.\n"
-#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n"
-" Turn assertion failures into debugger break-points.\n"
-" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n"
-" Turn assertion failures into C++ exceptions.\n"
-" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n"
-" Do not report exceptions as test failures. Instead, allow them\n"
-" to crash the program or throw a pop-up (on Windows).\n"
-"\n"
-"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set "
- "the corresponding\n"
-"environment variable of a flag (all letters in upper-case). For example, to\n"
-"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
- "color=no@D or set\n"
-"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n"
-"\n"
-"For more information, please read the " GTEST_NAME_ " documentation at\n"
-"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
-"(not one in your own code or tests), please report it to\n"
-"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test. The type parameter CharType can be
-// instantiated to either char or wchar_t.
-template <typename CharType>
-void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
- for (int i = 1; i < *argc; i++) {
- const String arg_string = StreamableToString(argv[i]);
- const char* const arg = arg_string.c_str();
-
- using internal::ParseBoolFlag;
- using internal::ParseInt32Flag;
- using internal::ParseStringFlag;
-
- // Do we see a Google Test flag?
- if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
- >EST_FLAG(also_run_disabled_tests)) ||
- ParseBoolFlag(arg, kBreakOnFailureFlag,
- >EST_FLAG(break_on_failure)) ||
- ParseBoolFlag(arg, kCatchExceptionsFlag,
- >EST_FLAG(catch_exceptions)) ||
- ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) ||
- ParseStringFlag(arg, kDeathTestStyleFlag,
- >EST_FLAG(death_test_style)) ||
- ParseBoolFlag(arg, kDeathTestUseFork,
- >EST_FLAG(death_test_use_fork)) ||
- ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) ||
- ParseStringFlag(arg, kInternalRunDeathTestFlag,
- >EST_FLAG(internal_run_death_test)) ||
- ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
- ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
- ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) ||
- ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) ||
- ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) ||
- ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) ||
- ParseInt32Flag(arg, kStackTraceDepthFlag,
- >EST_FLAG(stack_trace_depth)) ||
- ParseStringFlag(arg, kStreamResultToFlag,
- >EST_FLAG(stream_result_to)) ||
- ParseBoolFlag(arg, kThrowOnFailureFlag,
- >EST_FLAG(throw_on_failure))
- ) {
- // Yes. Shift the remainder of the argv list left by one. Note
- // that argv has (*argc + 1) elements, the last one always being
- // NULL. The following loop moves the trailing NULL element as
- // well.
- for (int j = i; j != *argc; j++) {
- argv[j] = argv[j + 1];
- }
-
- // Decrements the argument count.
- (*argc)--;
-
- // We also need to decrement the iterator as we just removed
- // an element.
- i--;
- } else if (arg_string == "--help" || arg_string == "-h" ||
- arg_string == "-?" || arg_string == "/?" ||
- HasGoogleTestFlagPrefix(arg)) {
- // Both help flag and unrecognized Google Test flags (excluding
- // internal ones) trigger help display.
- g_help_flag = true;
- }
- }
-
- if (g_help_flag) {
- // We print the help here instead of in RUN_ALL_TESTS(), as the
- // latter may not be called at all if the user is using Google
- // Test with another testing framework.
- PrintColorEncoded(kColorEncodedHelpMessage);
- }
-}
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
- ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
- ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-
-// The internal implementation of InitGoogleTest().
-//
-// The type parameter CharType can be instantiated to either char or
-// wchar_t.
-template <typename CharType>
-void InitGoogleTestImpl(int* argc, CharType** argv) {
- g_init_gtest_count++;
-
- // We don't want to run the initialization code twice.
- if (g_init_gtest_count != 1) return;
-
- if (*argc <= 0) return;
-
- internal::g_executable_path = internal::StreamableToString(argv[0]);
-
-#if GTEST_HAS_DEATH_TEST
-
- g_argvs.clear();
- for (int i = 0; i != *argc; i++) {
- g_argvs.push_back(StreamableToString(argv[i]));
- }
-
-#endif // GTEST_HAS_DEATH_TEST
-
- ParseGoogleTestFlagsOnly(argc, argv);
- GetUnitTestImpl()->PostFlagParsingInit();
-}
-
-} // namespace internal
-
-// Initializes Google Test. This must be called before calling
-// RUN_ALL_TESTS(). In particular, it parses a command line for the
-// flags that Google Test recognizes. Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned. Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-void InitGoogleTest(int* argc, char** argv) {
- internal::InitGoogleTestImpl(argc, argv);
-}
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-void InitGoogleTest(int* argc, wchar_t** argv) {
- internal::InitGoogleTestImpl(argc, argv);
-}
-
-} // namespace testing
+++ /dev/null
-// Copyright 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <iostream>
-
-#include "gtest/gtest.h"
-
-GTEST_API_ int main(int argc, char **argv) {
- std::cout << "Running main() from gtest_main.cc\n";
-
- testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}
PCL_ADD_TEST (io_grabbers test_grabbers
FILES test_grabbers.cpp
LINK_WITH pcl_gtest pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/grabber_sequences)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/grabber_sequences")
# Uses VTK readers to verify
if (VTK_FOUND AND NOT ANDROID)
PCL_ADD_TEST (io_ply_mesh_io test_ply_mesh_io
FILES test_ply_mesh_io.cpp
LINK_WITH pcl_gtest pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/tum_rabbit.vtk)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/tum_rabbit.vtk")
endif ()
PCL_ADD_TEST(point_cloud_image_extractors test_point_cloud_image_extractors
{
EXPECT_EQ (pcds_[i]->width, tiff_clouds[i]->width);
EXPECT_EQ (pcds_[i]->height, tiff_clouds[i]->height);
- for (int x = 0; x < pcds_[i]->width; x++)
+ for (uint32_t x = 0; x < pcds_[i]->width; x++)
{
- for (int y = 0; y < pcds_[i]->height; y++)
+ for (uint32_t y = 0; y < pcds_[i]->height; y++)
{
const PointT &pcd_pt = pcds_[i]->operator()(x,y);
const PointT &tiff_pt = tiff_clouds[i]->operator()(x,y);
{
EXPECT_EQ (pcds_[i]->width, pclzf_clouds[i]->width);
EXPECT_EQ (pcds_[i]->height, pclzf_clouds[i]->height);
- for (int x = 0; x < pcds_[i]->width; x++)
+ for (uint32_t x = 0; x < pcds_[i]->width; x++)
{
- for (int y = 0; y < pcds_[i]->height; y++)
+ for (uint32_t y = 0; y < pcds_[i]->height; y++)
{
const PointT &pcd_pt = pcds_[i]->operator()(x,y);
const PointT &pclzf_pt = pclzf_clouds[i]->operator()(x,y);
pcl::io::savePLYFile ("test_mesh_ascii.ply", mesh);
// Save binary
pcl::io::savePLYFileBinary ("test_mesh_binary.ply", mesh);
- // Load both
- pcl::PolygonMesh mesh_ascii;
- pcl::io::loadPolygonFilePLY ("test_mesh_ascii.ply", mesh_ascii);
- pcl::PolygonMesh mesh_binary;
- pcl::io::loadPolygonFilePLY ("test_mesh_binary.ply", mesh_binary);
+ // Load both with vtk ply parser
+ pcl::PolygonMesh mesh_ascii_vtk;
+ pcl::io::loadPolygonFilePLY ("test_mesh_ascii.ply", mesh_ascii_vtk);
+ pcl::PolygonMesh mesh_binary_vtk;
+ pcl::io::loadPolygonFilePLY ("test_mesh_binary.ply", mesh_binary_vtk);
+ // Load both with pcl ply parser
+ pcl::PolygonMesh mesh_ascii_pcl;
+ pcl::io::loadPLYFile ("test_mesh_ascii.ply", mesh_ascii_pcl);
+ pcl::PolygonMesh mesh_binary_pcl;
+ pcl::io::loadPLYFile ("test_mesh_binary.ply", mesh_binary_pcl);
// Compare the 3
- pcl::PointCloud<pcl::PointXYZ> verts, verts_ascii, verts_binary;
+ pcl::PointCloud<pcl::PointXYZ> verts, verts_ascii_vtk, verts_binary_vtk, verts_ascii_pcl, verts_binary_pcl;
pcl::fromPCLPointCloud2 (mesh.cloud, verts);
- pcl::fromPCLPointCloud2 (mesh_ascii.cloud, verts_ascii);
- pcl::fromPCLPointCloud2 (mesh_binary.cloud, verts_binary);
- EXPECT_EQ (verts_ascii.size (), verts.size ());
- EXPECT_EQ (verts_binary.size (), verts.size ());
+ pcl::fromPCLPointCloud2 (mesh_ascii_vtk.cloud, verts_ascii_vtk);
+ pcl::fromPCLPointCloud2 (mesh_binary_vtk.cloud, verts_binary_vtk);
+ pcl::fromPCLPointCloud2 (mesh_ascii_pcl.cloud, verts_ascii_pcl);
+ pcl::fromPCLPointCloud2 (mesh_binary_pcl.cloud, verts_binary_pcl);
+ EXPECT_EQ (verts_ascii_vtk.size (), verts.size ());
+ EXPECT_EQ (verts_binary_vtk.size (), verts.size ());
+ EXPECT_EQ (verts_ascii_pcl.size (), verts.size ());
+ EXPECT_EQ (verts_binary_pcl.size (), verts.size ());
for (size_t i = 0; i < verts.size (); i++)
{
- EXPECT_NEAR (verts_ascii.at (i).x, verts.at (i).x, 1E-2);
- EXPECT_NEAR (verts_ascii.at (i).y, verts.at (i).y, 1E-2);
- EXPECT_NEAR (verts_ascii.at (i).z, verts.at (i).z, 1E-2);
- EXPECT_NEAR (verts_binary.at (i).x, verts.at (i).x, 1E-4);
- EXPECT_NEAR (verts_binary.at (i).y, verts.at (i).y, 1E-4);
- EXPECT_NEAR (verts_binary.at (i).z, verts.at (i).z, 1E-4);
+ EXPECT_NEAR (verts_ascii_vtk.at (i).x, verts.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_ascii_vtk.at (i).y, verts.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_ascii_vtk.at (i).z, verts.at (i).z, 1E-2);
+ EXPECT_NEAR (verts_binary_vtk.at (i).x, verts.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_binary_vtk.at (i).y, verts.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_binary_vtk.at (i).z, verts.at (i).z, 1E-4);
+ EXPECT_NEAR (verts_ascii_pcl.at (i).x, verts.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_ascii_pcl.at (i).y, verts.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_ascii_pcl.at (i).z, verts.at (i).z, 1E-2);
+ EXPECT_NEAR (verts_binary_pcl.at (i).x, verts.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_binary_pcl.at (i).y, verts.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_binary_pcl.at (i).z, verts.at (i).z, 1E-4);
}
- ASSERT_EQ (mesh_ascii.polygons.size (), mesh.polygons.size ());
- ASSERT_EQ (mesh_binary.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_ascii_vtk.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_binary_vtk.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_ascii_pcl.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_binary_pcl.polygons.size (), mesh.polygons.size ());
for (size_t i = 0; i < mesh.polygons.size (); i++)
{
- ASSERT_EQ (mesh_ascii.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
- ASSERT_EQ (mesh_binary.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_ascii_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_binary_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_ascii_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_binary_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
for (size_t j = 0; j < mesh.polygons[i].vertices.size (); j++)
{
- EXPECT_EQ (mesh_ascii.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
- EXPECT_EQ (mesh_binary.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_ascii_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_binary_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_ascii_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_binary_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
}
}
}
// Save binary
pcl::io::savePLYFileBinary ("test_mesh_rgb_binary.ply", mesh_rgb);
pcl::io::savePLYFileBinary ("test_mesh_rgba_binary.ply", mesh_rgba);
- // Load both
- pcl::PolygonMesh mesh_rgb_ascii;
- pcl::PolygonMesh mesh_rgba_ascii;
- pcl::io::loadPolygonFilePLY ("test_mesh_rgb_ascii.ply", mesh_rgb_ascii);
- pcl::io::loadPolygonFilePLY ("test_mesh_rgba_ascii.ply", mesh_rgba_ascii);
- pcl::PolygonMesh mesh_rgb_binary;
- pcl::PolygonMesh mesh_rgba_binary;
- pcl::io::loadPolygonFilePLY ("test_mesh_rgb_binary.ply", mesh_rgb_binary);
- pcl::io::loadPolygonFilePLY ("test_mesh_rgba_binary.ply", mesh_rgba_binary);
+ // Load both with vtk ply parser
+ pcl::PolygonMesh mesh_rgb_ascii_vtk;
+ pcl::PolygonMesh mesh_rgba_ascii_vtk;
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgb_ascii.ply", mesh_rgb_ascii_vtk);
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgba_ascii.ply", mesh_rgba_ascii_vtk);
+ pcl::PolygonMesh mesh_rgb_binary_vtk;
+ pcl::PolygonMesh mesh_rgba_binary_vtk;
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgb_binary.ply", mesh_rgb_binary_vtk);
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgba_binary.ply", mesh_rgba_binary_vtk);
+ // Load both with pcl ply parser
+ pcl::PolygonMesh mesh_rgb_ascii_pcl;
+ pcl::PolygonMesh mesh_rgba_ascii_pcl;
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgb_ascii.ply", mesh_rgb_ascii_pcl);
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgba_ascii.ply", mesh_rgba_ascii_pcl);
+ pcl::PolygonMesh mesh_rgb_binary_pcl;
+ pcl::PolygonMesh mesh_rgba_binary_pcl;
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgb_binary.ply", mesh_rgb_binary_pcl);
+ pcl::io::loadPolygonFilePLY ("test_mesh_rgba_binary.ply", mesh_rgba_binary_pcl);
// Compare the 5
- pcl::PointCloud<pcl::PointXYZRGBA> verts_rgba_ascii, verts_rgba_binary;
- pcl::PointCloud<pcl::PointXYZRGB> verts_rgb_ascii, verts_rgb_binary;
- pcl::fromPCLPointCloud2 (mesh_rgb_ascii.cloud, verts_rgb_ascii);
- pcl::fromPCLPointCloud2 (mesh_rgba_ascii.cloud, verts_rgba_ascii);
- pcl::fromPCLPointCloud2 (mesh_rgb_binary.cloud, verts_rgb_binary);
- pcl::fromPCLPointCloud2 (mesh_rgba_binary.cloud, verts_rgba_binary);
- ASSERT_EQ (verts_rgb_ascii.size (), vertices_rgba.size ());
- ASSERT_EQ (verts_rgba_ascii.size (), vertices_rgba.size ());
- ASSERT_EQ (verts_rgb_binary.size (), vertices_rgba.size ());
- ASSERT_EQ (verts_rgba_binary.size (), vertices_rgba.size ());
+ pcl::PointCloud<pcl::PointXYZRGBA> verts_rgba_ascii_vtk, verts_rgba_binary_vtk;
+ pcl::PointCloud<pcl::PointXYZRGB> verts_rgb_ascii_vtk, verts_rgb_binary_vtk;
+ pcl::fromPCLPointCloud2 (mesh_rgb_ascii_vtk.cloud, verts_rgb_ascii_vtk);
+ pcl::fromPCLPointCloud2 (mesh_rgba_ascii_vtk.cloud, verts_rgba_ascii_vtk);
+ pcl::fromPCLPointCloud2 (mesh_rgb_binary_vtk.cloud, verts_rgb_binary_vtk);
+ pcl::fromPCLPointCloud2 (mesh_rgba_binary_vtk.cloud, verts_rgba_binary_vtk);
+ pcl::PointCloud<pcl::PointXYZRGBA> verts_rgba_ascii_pcl, verts_rgba_binary_pcl;
+ pcl::PointCloud<pcl::PointXYZRGB> verts_rgb_ascii_pcl, verts_rgb_binary_pcl;
+ pcl::fromPCLPointCloud2 (mesh_rgb_ascii_pcl.cloud, verts_rgb_ascii_pcl);
+ pcl::fromPCLPointCloud2 (mesh_rgba_ascii_pcl.cloud, verts_rgba_ascii_pcl);
+ pcl::fromPCLPointCloud2 (mesh_rgb_binary_pcl.cloud, verts_rgb_binary_pcl);
+ pcl::fromPCLPointCloud2 (mesh_rgba_binary_pcl.cloud, verts_rgba_binary_pcl);
+ ASSERT_EQ (verts_rgb_ascii_vtk.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgba_ascii_vtk.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgb_binary_vtk.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgba_binary_vtk.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgb_ascii_pcl.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgba_ascii_pcl.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgb_binary_pcl.size (), vertices_rgba.size ());
+ ASSERT_EQ (verts_rgba_binary_pcl.size (), vertices_rgba.size ());
for (size_t i = 0; i < vertices_rgba.size (); i++)
{
- EXPECT_NEAR (verts_rgba_ascii.at (i).x, vertices_rgba.at (i).x, 1E-2);
- EXPECT_NEAR (verts_rgba_ascii.at (i).y, vertices_rgba.at (i).y, 1E-2);
- EXPECT_NEAR (verts_rgba_ascii.at (i).z, vertices_rgba.at (i).z, 1E-2);
- EXPECT_EQ (verts_rgba_ascii.at (i).r, vertices_rgba.at (i).r);
- EXPECT_EQ (verts_rgba_ascii.at (i).g, vertices_rgba.at (i).g);
- EXPECT_EQ (verts_rgba_ascii.at (i).b, vertices_rgba.at (i).b);
- EXPECT_NEAR (verts_rgba_binary.at (i).x, vertices_rgba.at (i).x, 1E-4);
- EXPECT_NEAR (verts_rgba_binary.at (i).y, vertices_rgba.at (i).y, 1E-4);
- EXPECT_NEAR (verts_rgba_binary.at (i).z, vertices_rgba.at (i).z, 1E-4);
- EXPECT_EQ (verts_rgba_binary.at (i).r, vertices_rgba.at (i).r);
- EXPECT_EQ (verts_rgba_binary.at (i).g, vertices_rgba.at (i).g);
- EXPECT_EQ (verts_rgba_binary.at (i).b, vertices_rgba.at (i).b);
- EXPECT_NEAR (verts_rgb_ascii.at (i).x, vertices_rgba.at (i).x, 1E-2);
- EXPECT_NEAR (verts_rgb_ascii.at (i).y, vertices_rgba.at (i).y, 1E-2);
- EXPECT_NEAR (verts_rgb_ascii.at (i).z, vertices_rgba.at (i).z, 1E-2);
- EXPECT_EQ (verts_rgb_ascii.at (i).r, vertices_rgba.at (i).r);
- EXPECT_EQ (verts_rgb_ascii.at (i).g, vertices_rgba.at (i).g);
- EXPECT_EQ (verts_rgb_ascii.at (i).b, vertices_rgba.at (i).b);
- EXPECT_NEAR (verts_rgb_binary.at (i).x, vertices_rgba.at (i).x, 1E-4);
- EXPECT_NEAR (verts_rgb_binary.at (i).y, vertices_rgba.at (i).y, 1E-4);
- EXPECT_NEAR (verts_rgb_binary.at (i).z, vertices_rgba.at (i).z, 1E-4);
- EXPECT_EQ (verts_rgb_binary.at (i).r, vertices_rgba.at (i).r);
- EXPECT_EQ (verts_rgb_binary.at (i).g, vertices_rgba.at (i).g);
- EXPECT_EQ (verts_rgb_binary.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgba_ascii_vtk.at (i).x, vertices_rgba.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_rgba_ascii_vtk.at (i).y, vertices_rgba.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_rgba_ascii_vtk.at (i).z, vertices_rgba.at (i).z, 1E-2);
+ EXPECT_EQ (verts_rgba_ascii_vtk.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgba_ascii_vtk.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgba_ascii_vtk.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgba_binary_vtk.at (i).x, vertices_rgba.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_rgba_binary_vtk.at (i).y, vertices_rgba.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_rgba_binary_vtk.at (i).z, vertices_rgba.at (i).z, 1E-4);
+ EXPECT_EQ (verts_rgba_binary_vtk.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgba_binary_vtk.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgba_binary_vtk.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgb_ascii_vtk.at (i).x, vertices_rgba.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_rgb_ascii_vtk.at (i).y, vertices_rgba.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_rgb_ascii_vtk.at (i).z, vertices_rgba.at (i).z, 1E-2);
+ EXPECT_EQ (verts_rgb_ascii_vtk.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgb_ascii_vtk.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgb_ascii_vtk.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgb_binary_vtk.at (i).x, vertices_rgba.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_rgb_binary_vtk.at (i).y, vertices_rgba.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_rgb_binary_vtk.at (i).z, vertices_rgba.at (i).z, 1E-4);
+ EXPECT_EQ (verts_rgb_binary_vtk.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgb_binary_vtk.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgb_binary_vtk.at (i).b, vertices_rgba.at (i).b);
+
+ EXPECT_NEAR (verts_rgba_ascii_pcl.at (i).x, vertices_rgba.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_rgba_ascii_pcl.at (i).y, vertices_rgba.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_rgba_ascii_pcl.at (i).z, vertices_rgba.at (i).z, 1E-2);
+ EXPECT_EQ (verts_rgba_ascii_pcl.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgba_ascii_pcl.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgba_ascii_pcl.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgba_binary_pcl.at (i).x, vertices_rgba.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_rgba_binary_pcl.at (i).y, vertices_rgba.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_rgba_binary_pcl.at (i).z, vertices_rgba.at (i).z, 1E-4);
+ EXPECT_EQ (verts_rgba_binary_pcl.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgba_binary_pcl.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgba_binary_pcl.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgb_ascii_pcl.at (i).x, vertices_rgba.at (i).x, 1E-2);
+ EXPECT_NEAR (verts_rgb_ascii_pcl.at (i).y, vertices_rgba.at (i).y, 1E-2);
+ EXPECT_NEAR (verts_rgb_ascii_pcl.at (i).z, vertices_rgba.at (i).z, 1E-2);
+ EXPECT_EQ (verts_rgb_ascii_pcl.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgb_ascii_pcl.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgb_ascii_pcl.at (i).b, vertices_rgba.at (i).b);
+ EXPECT_NEAR (verts_rgb_binary_pcl.at (i).x, vertices_rgba.at (i).x, 1E-4);
+ EXPECT_NEAR (verts_rgb_binary_pcl.at (i).y, vertices_rgba.at (i).y, 1E-4);
+ EXPECT_NEAR (verts_rgb_binary_pcl.at (i).z, vertices_rgba.at (i).z, 1E-4);
+ EXPECT_EQ (verts_rgb_binary_pcl.at (i).r, vertices_rgba.at (i).r);
+ EXPECT_EQ (verts_rgb_binary_pcl.at (i).g, vertices_rgba.at (i).g);
+ EXPECT_EQ (verts_rgb_binary_pcl.at (i).b, vertices_rgba.at (i).b);
+ }
+ ASSERT_EQ (mesh_rgb_ascii_vtk.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgba_ascii_vtk.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgb_binary_vtk.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgba_binary_vtk.polygons.size (), mesh.polygons.size ());
+ for (size_t i = 0; i < mesh.polygons.size (); i++)
+ {
+ ASSERT_EQ (mesh_rgb_ascii_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgba_ascii_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgb_binary_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgba_binary_vtk.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ for (size_t j = 0; j < mesh.polygons[i].vertices.size (); j++)
+ {
+ EXPECT_EQ (mesh_rgb_ascii_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgba_ascii_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgb_binary_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgba_binary_vtk.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ }
}
- ASSERT_EQ (mesh_rgb_ascii.polygons.size (), mesh.polygons.size ());
- ASSERT_EQ (mesh_rgba_ascii.polygons.size (), mesh.polygons.size ());
- ASSERT_EQ (mesh_rgb_binary.polygons.size (), mesh.polygons.size ());
- ASSERT_EQ (mesh_rgba_binary.polygons.size (), mesh.polygons.size ());
+
+ ASSERT_EQ (mesh_rgb_ascii_pcl.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgba_ascii_pcl.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgb_binary_pcl.polygons.size (), mesh.polygons.size ());
+ ASSERT_EQ (mesh_rgba_binary_pcl.polygons.size (), mesh.polygons.size ());
for (size_t i = 0; i < mesh.polygons.size (); i++)
{
- ASSERT_EQ (mesh_rgb_ascii.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
- ASSERT_EQ (mesh_rgba_ascii.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
- ASSERT_EQ (mesh_rgb_binary.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
- ASSERT_EQ (mesh_rgba_binary.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgb_ascii_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgba_ascii_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgb_binary_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
+ ASSERT_EQ (mesh_rgba_binary_pcl.polygons[i].vertices.size (), mesh.polygons[i].vertices.size ());
for (size_t j = 0; j < mesh.polygons[i].vertices.size (); j++)
{
- EXPECT_EQ (mesh_rgb_ascii.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
- EXPECT_EQ (mesh_rgba_ascii.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
- EXPECT_EQ (mesh_rgb_binary.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
- EXPECT_EQ (mesh_rgba_binary.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgb_ascii_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgba_ascii_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgb_binary_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
+ EXPECT_EQ (mesh_rgba_binary_pcl.polygons[i].vertices[j], mesh.polygons[i].vertices[j]);
}
}
}
EXPECT_EQ (b1, image.data[3 * 3 + 2]);
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, PointCloudImageExtractorFromLabelFieldGlasbey)
+{
+ typedef PointXYZL PointT;
+ PointCloud<PointT> cloud;
+ cloud.width = 2;
+ cloud.height = 2;
+ cloud.is_dense = true;
+ cloud.points.resize (cloud.width * cloud.height);
+ for (size_t i = 0; i < cloud.points.size (); i++)
+ cloud.points[i].label = i % 2;
+
+ pcl::PCLImage image;
+ PointCloudImageExtractorFromLabelField<PointT> pcie;
+ pcie.setColorMode (pcie.COLORS_RGB_GLASBEY);
+
+ ASSERT_TRUE (pcie.extract(cloud, image));
+
+ EXPECT_EQ ("rgb8", image.encoding);
+ EXPECT_EQ (cloud.width, image.width);
+ EXPECT_EQ (cloud.height, image.height);
+
+ // Fill in different labels and extract another image
+ for (size_t i = 0; i < cloud.points.size (); i++)
+ cloud.points[i].label = i % 2 + 10;
+ pcl::PCLImage image2;
+ ASSERT_TRUE (pcie.extract(cloud, image2));
+
+ // The first color should be pure blue
+ EXPECT_EQ (0, image.data[0]);
+ EXPECT_EQ (0, image.data[1]);
+ EXPECT_EQ (255, image.data[2]);
+ // Make sure the colors are the same
+ for (size_t i = 0; i < 2 * 2 * 3; ++i)
+ EXPECT_EQ (image2.data[i], image.data[i]);
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TEST (PCL, PointCloudImageExtractorFromZField)
{
}
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, PointCloudImageExtractorBlackNaNs)
+{
+ typedef PointNormal PointT;
+ PointCloud<PointT> cloud;
+ cloud.width = 2;
+ cloud.height = 2;
+ cloud.is_dense = false;
+ cloud.points.resize (cloud.width * cloud.height);
+
+ cloud.points[0].curvature = 1.0;
+ cloud.points[1].curvature = 2.0;
+ cloud.points[2].curvature = 1.0;
+ cloud.points[3].curvature = 2.0;
+ cloud.points[3].z = std::numeric_limits<float>::quiet_NaN ();
+
+ pcl::PCLImage image;
+
+ PointCloudImageExtractorFromCurvatureField<PointT> pcie;
+
+ ASSERT_TRUE (pcie.extract(cloud, image));
+
+ {
+ unsigned short* data = reinterpret_cast<unsigned short*> (&image.data[0]);
+ EXPECT_EQ (std::numeric_limits<unsigned short>::max(), data[3]);
+ }
+
+ pcie.setPaintNaNsWithBlack (true);
+
+ ASSERT_TRUE (pcie.extract(cloud, image));
+
+ {
+ unsigned short* data = reinterpret_cast<unsigned short*> (&image.data[0]);
+ EXPECT_EQ (0, data[3]);
+ }
+}
+
int
main (int argc, char** argv)
{
PCL_ADD_TEST (kdtree_kdtree test_kdtree
FILES test_kdtree.cpp
LINK_WITH pcl_gtest pcl_kdtree pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/sac_plane_test.pcd ${PCL_SOURCE_DIR}/test/kdtree/kdtree_unit_test_results.xml)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/sac_plane_test.pcd" "${PCL_SOURCE_DIR}/test/kdtree/kdtree_unit_test_results.xml")
PCL_ADD_TEST(keypoints_general test_keypoints
FILES test_keypoints.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_filters pcl_keypoints
- ARGUMENTS ${PCL_SOURCE_DIR}/test/cturtle.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/cturtle.pcd")
PCL_ADD_TEST(keypoints_iss_3d test_iss_3d
FILES test_iss_3d.cpp
LINK_WITH pcl_gtest pcl_keypoints pcl_io
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
--- /dev/null
+# .PCD v0.7 - Point Cloud Data file format
+VERSION 0.7
+FIELDS x y z
+SIZE 4 4 4
+TYPE F F F
+COUNT 1 1 1
+WIDTH 1771
+HEIGHT 1
+VIEWPOINT 0 0 0 1 0 0 0
+POINTS 1771
+DATA ascii
+-10 0 0
+-10.015625 0 0.042999268
+-10.015625 0 0.10300064
+-10.046875 0 0.15100098
+-10.0625 0 0.20299911
+-9.984375 0 -0.125
+-10 0 -0.091999054
+-10.015625 0 -0.041000366
+-10.015625 0 0.012001038
+-10.046875 0 0.076000214
+-10.046875 0.03125 0.12200165
+-10.0625 0.03125 0.16699982
+-10.078125 0.03125 0.2140007
+-10.109375 0.03125 0.26399994
+-9.984375 0 -0.21999741
+-10 0 -0.17300034
+-10.015625 0 -0.13000107
+-10.015625 0 -0.065998077
+-10.015625 0.03125 -0.0060005188
+-10.0625 0.0625 0.14900208
+-10.09375 0.0625 0.19599915
+-10.109375 0.03125 0.22800064
+-10.140625 0.03125 0.26700211
+-9.96875 0 -0.34199905
+-10 0 -0.31499863
+-10 0 -0.26300049
+-10.015625 0 -0.20899963
+-10.015625 0 -0.15200043
+-10.015625 0.03125 -0.085998535
+-10.140625 0.0625 0.25
+-10.171875 0.0625 0.28300095
+-10.1875 0.0625 0.32799911
+-9.96875 0 -0.46199799
+-9.984375 0 -0.43499756
+-10 0 -0.39500046
+-10 0 -0.34499741
+-10.015625 0 -0.29499817
+-10.015625 0.03125 -0.23600006
+-10.15625 0.09375 0.27700043
+-10.1875 0.09375 0.29400253
+-10.21875 0.09375 0.32900238
+-9.984375 0 -0.56399918
+-9.984375 0 -0.52000046
+-10 0 -0.47399902
+-10 0.03125 -0.41799927
+-10 0 -0.36899948
+-10 0.03125 -0.30500031
+-10.21875 0.09375 0.30500031
+-10.25 0.09375 0.33800125
+-9.96875 0 -0.68099976
+-9.984375 0 -0.64699936
+-10 0 -0.60400009
+-10 0 -0.55299759
+-10 0 -0.50600052
+-10 0.03125 -0.44300079
+-10.25 0.125 0.31900024
+-10.265625 0.09375 0.34600067
+-9.96875 0 -0.79399872
+-9.984375 0 -0.75600052
+-9.984375 0 -0.7140007
+-9.984375 0 -0.66999817
+-10 0.03125 -0.62199783
+-10 0.03125 -0.5739975
+-10 0.03125 -0.51900101
+-10.265625 0.125 0.32500076
+-10.3125 0.125 0.34400177
+-9.96875 0 -0.90699768
+-9.984375 0 -0.875
+-9.984375 0 -0.82999802
+-9.984375 0 -0.79000092
+-10 0 -0.74399948
+-10 0.03125 -0.6969986
+-10 0.03125 -0.64699936
+-10.3125 0.15625 0.32699966
+-10.328125 0.125 0.35200119
+-9.953125 0 -1.0149994
+-9.96875 0 -0.97900009
+-9.984375 0 -0.94400024
+-9.984375 0 -0.90100098
+-9.984375 0 -0.85499954
+-10 0.03125 -0.81299973
+-10 0.03125 -0.76699829
+-10.328125 0.15625 0.33300018
+-10.359375 0.15625 0.35499954
+-9.921875 0 -1.1469994
+-9.9375 -0.03125 -1.1240005
+-9.96875 0 -1.0879974
+-9.984375 0 -1.0550003
+-9.984375 0 -1.0109978
+-9.984375 0 -0.97200012
+-10 0.03125 -0.92799759
+-10 0.03125 -0.88499832
+-10.359375 0.1875 0.34000015
+-10.40625 0.15625 0.35900116
+-9.9375 -0.03125 -1.257
+-9.953125 0 -1.2229996
+-9.96875 0 -1.1919975
+-9.96875 0 -1.1529999
+-9.984375 0 -1.1110001
+-9.984375 0 -1.0709991
+-9.984375 0.03125 -1.0330009
+-9.984375 0.03125 -0.98600006
+-10 0.03125 -0.95599747
+-10.40625 0.1875 0.33800125
+-10.421875 0.1875 0.36500168
+-9.90625 -0.03125 -1.3849983
+-9.9375 -0.03125 -1.3610001
+-9.953125 0 -1.3250008
+-9.96875 0 -1.2939987
+-9.96875 0 -1.2529984
+-9.984375 0 -1.2229996
+-9.984375 0 -1.1800003
+-9.984375 0.03125 -1.1380005
+-9.984375 0.03125 -1.093998
+-9.96875 0.0625 -1.0239983
+-10.421875 0.21875 0.34899902
+-10.46875 0.1875 0.36400223
+-9.90625 -0.03125 -1.4799995
+-9.9375 -0.03125 -1.4519997
+-9.9375 -0.03125 -1.4220009
+-9.96875 0 -1.3859978
+-9.96875 0 -1.3499985
+-9.984375 0 -1.3149986
+-9.984375 0 -1.2779999
+-9.984375 0.03125 -1.2369995
+-9.984375 0.03125 -1.1909981
+-10.46875 0.21875 0.34000015
+-10.484375 0.21875 0.3710022
+-9.90625 -0.03125 -1.6049995
+-9.9375 -0.03125 -1.5809975
+-9.9375 -0.03125 -1.5470009
+-9.96875 0 -1.5159988
+-9.96875 0 -1.4829979
+-9.96875 0 -1.4469986
+-9.96875 0 -1.4099998
+-9.984375 0 -1.3730011
+-9.984375 0.03125 -1.3289986
+-9.984375 0.03125 -1.2869987
+-10.484375 0.21875 0.34899902
+-10.5 0.21875 0.38100052
+-10.578125 0.1875 0.37400055
+-10.59375 0.1875 0.41600037
+-9.90625 0 -1.6930008
+-9.921875 -0.03125 -1.6669998
+-9.953125 0 -1.6339989
+-9.953125 0 -1.6020012
+-9.96875 0 -1.5690002
+-9.96875 0 -1.5340004
+-9.96875 0 -1.4980011
+-9.984375 0.03125 -1.4640007
+-9.96875 0.03125 -1.4209976
+-9.96875 0.03125 -1.3829994
+-10.5 0.25 0.35400009
+-10.578125 0.1875 0.32200241
+-10.609375 0.1875 0.35000229
+-10.609375 0.1875 0.41600037
+-9.90625 -0.03125 -1.8110008
+-9.90625 -0.03125 -1.7819977
+-9.9375 -0.03125 -1.7550011
+-9.953125 0 -1.7220001
+-9.953125 0 -1.6899986
+-9.96875 0 -1.6559982
+-9.96875 0 -1.6209984
+-9.96875 0 -1.5879974
+-9.96875 0.03125 -1.5499992
+-9.96875 0.03125 -1.5099983
+-9.96875 0.0625 -1.4640007
+-10.5 0.25 0.32400131
+-10.5625 0.21875 0.32300186
+-10.609375 0.21875 0.32400131
+-10.640625 0.1875 0.34400177
+-10.65625 0.21875 0.40500259
+-9.890625 -0.03125 -1.9239998
+-9.90625 -0.03125 -1.8959999
+-9.921875 -0.03125 -1.8699989
+-9.9375 -0.03125 -1.8400002
+-9.953125 0 -1.8059998
+-9.953125 0 -1.7729988
+-9.96875 0 -1.7410011
+-9.96875 0 -1.7109985
+-9.96875 0.03125 -1.6769981
+-9.96875 0.03125 -1.6380005
+-9.96875 0.03125 -1.5999985
+-10.5625 0.25 0.31800079
+-10.59375 0.25 0.31299973
+-10.640625 0.21875 0.31800079
+-10.671875 0.15625 0.33100128
+-10.6875 0.1875 0.39900208
+-10.140625 -0.34375 -2.6699982
+-10.125 -0.3125 -2.6409988
+-9.890625 0 -2.0309982
+-9.90625 -0.03125 -2.0089989
+-9.921875 -0.03125 -1.9799995
+-9.921875 0 -1.9469986
+-9.953125 0 -1.9189987
+-9.953125 0 -1.8899994
+-9.953125 0 -1.8530006
+-9.96875 0 -1.8250008
+-9.96875 0.03125 -1.7910004
+-9.96875 0.03125 -1.757
+-9.96875 0.03125 -1.7199974
+-9.96875 0.0625 -1.6809998
+-10.546875 0.3125 0.31600189
+-10.578125 0.28125 0.32099915
+-10.640625 0.25 0.31100082
+-10.671875 0.1875 0.30800247
+-10.703125 0.1875 0.32200241
+-10.703125 0.1875 0.38399887
+-10.125 -0.34375 -2.7779999
+-10.140625 -0.34375 -2.7560005
+-10.171875 -0.34375 -2.7340012
+-10.171875 -0.34375 -2.7080002
+-10.140625 -0.3125 -2.6809998
+-10.140625 -0.3125 -2.6559982
+-9.90625 -0.03125 -2.1469994
+-9.90625 -0.03125 -2.1139984
+-9.90625 0 -2.0839996
+-9.921875 0 -2.0579987
+-9.921875 0 -2.0270004
+-9.953125 0 -1.9980011
+-9.921875 0.03125 -1.9529991
+-9.953125 0 -1.9370003
+-9.96875 0 -1.9069977
+-9.96875 0.03125 -1.8730011
+-9.96875 0.03125 -1.8359985
+-9.96875 0.0625 -1.7999992
+-10.5625 0.3125 0.32099915
+-10.609375 0.28125 0.31500244
+-10.65625 0.28125 0.31900024
+-10.6875 0.21875 0.31299973
+-10.75 0.1875 0.31000137
+-10.765625 0.1875 0.36700058
+-10.109375 -0.3125 -2.8069992
+-10.140625 -0.3125 -2.7879982
+-10.140625 -0.3125 -2.762001
+-10.1875 -0.34375 -2.7459984
+-10.140625 -0.3125 -2.7130013
+-10.15625 -0.28125 -2.6870003
+-10.125 -0.28125 -2.6559982
+-9.890625 -0.03125 -2.2439995
+-9.90625 -0.03125 -2.218998
+-9.90625 -0.03125 -2.1930008
+-9.90625 0 -2.1629982
+-9.921875 0 -2.132
+-9.953125 0 -2.1040001
+-9.90625 0.03125 -2.0610008
+-9.953125 0 -2.0400009
+-9.953125 0.03125 -2.012001
+-9.953125 0.03125 -1.9790001
+-9.953125 0.03125 -1.9449997
+-9.953125 0.03125 -1.9139977
+-9.953125 0.0625 -1.8789978
+-10.546875 0.34375 0.33000183
+-10.59375 0.3125 0.31999969
+-10.640625 0.28125 0.31800079
+-10.6875 0.25 0.30500031
+-10.734375 0.21875 0.31000137
+-10.765625 0.1875 0.31399918
+-10.78125 0.21875 0.36299896
+-10.15625 -0.28125 -2.7939987
+-10.125 -0.28125 -2.7669983
+-10.125 -0.28125 -2.7410011
+-10.125 -0.25 -2.7150002
+-10.109375 -0.25 -2.6879997
+-10.109375 -0.25 -2.6619987
+-9.875 -0.03125 -2.3719978
+-9.890625 -0.03125 -2.3479996
+-9.90625 -0.03125 -2.3250008
+-9.921875 -0.03125 -2.2980003
+-9.9375 -0.03125 -2.2700005
+-9.921875 0 -2.2389984
+-9.953125 0 -2.211998
+-9.96875 -0.03125 -2.1919975
+-9.953125 0 -2.1520004
+-9.96875 0 -2.1230011
+-9.96875 0.03125 -2.0900002
+-9.953125 0.03125 -2.0529976
+-9.953125 0.0625 -2.0179977
+-9.953125 0.0625 -1.9869995
+-10.578125 0.375 0.32699966
+-10.609375 0.3125 0.31800079
+-10.671875 0.28125 0.31200027
+-10.734375 0.25 0.30599976
+-10.765625 0.21875 0.30800247
+-10.8125 0.21875 0.31100082
+-10.828125 0.21875 0.35800171
+-10.109375 -0.25 -2.7959976
+-10.15625 -0.25 -2.7779999
+-10.125 -0.25 -2.7480011
+-10.078125 -0.1875 -2.7109985
+-10.078125 -0.1875 -2.6870003
+-10.09375 -0.1875 -2.6660004
+-9.875 -0.03125 -2.473999
+-9.890625 -0.03125 -2.447998
+-9.90625 -0.03125 -2.4209976
+-9.90625 -0.03125 -2.3929977
+-9.90625 0 -2.3660011
+-9.921875 0 -2.3380013
+-9.953125 0 -2.3120003
+-9.890625 0.03125 -2.2679977
+-9.953125 0 -2.2519989
+-9.953125 0.03125 -2.2220001
+-9.953125 0.03125 -2.1909981
+-9.953125 0.03125 -2.1619987
+-9.953125 0.03125 -2.1300011
+-9.953125 0.0625 -2.0929985
+-10.59375 0.34375 0.32400131
+-10.65625 0.3125 0.32200241
+-10.71875 0.28125 0.31000137
+-10.75 0.28125 0.31000137
+-10.78125 0.25 0.31600189
+-10.828125 0.21875 0.31200027
+-10.84375 0.21875 0.35000229
+-10.109375 -0.21875 -2.8029976
+-10.09375 -0.21875 -2.7770004
+-10.09375 -0.1875 -2.7509995
+-10.15625 -0.21875 -2.7340012
+-10.109375 -0.1875 -2.7019997
+-10.078125 -0.15625 -2.6699982
+-9.828125 0 -2.5880013
+-9.890625 -0.03125 -2.5709991
+-9.890625 -0.03125 -2.5429993
+-9.890625 -0.03125 -2.5169983
+-9.90625 0 -2.4899979
+-9.90625 0 -2.4640007
+-9.921875 0 -2.4370003
+-9.953125 0 -2.4090004
+-9.953125 0 -2.3810005
+-9.953125 0 -2.3509979
+-9.953125 0.03125 -2.3219986
+-9.953125 0.03125 -2.2939987
+-9.953125 0.03125 -2.2630005
+-9.953125 0.03125 -2.2350006
+-9.953125 0.0625 -2.2010002
+-10.578125 0.40625 0.33300018
+-10.640625 0.34375 0.31800079
+-10.6875 0.34375 0.32200241
+-10.734375 0.28125 0.3030014
+-10.765625 0.28125 0.31299973
+-10.8125 0.25 0.33100128
+-10.84375 0.21875 0.31900024
+-10.875 0.21875 0.34799957
+-10.078125 -0.1875 -2.8069992
+-10.109375 -0.1875 -2.7879982
+-10.078125 -0.15625 -2.7539978
+-10.109375 -0.15625 -2.7350006
+-10.09375 -0.15625 -2.7060013
+-10.0625 -0.125 -2.6720009
+-9.90625 -0.03125 -2.6149979
+-9.90625 -0.03125 -2.5859985
+-9.90625 0 -2.5589981
+-9.921875 0 -2.5319977
+-9.90625 0 -2.5019989
+-9.921875 0 -2.4749985
+-9.953125 0 -2.447998
+-9.953125 0 -2.4220009
+-9.953125 0.03125 -2.3929977
+-9.953125 0.03125 -2.3619995
+-9.953125 0.03125 -2.3310013
+-9.953125 0.0625 -2.2989998
+-10.625 0.40625 0.31999969
+-10.671875 0.34375 0.31299973
+-10.71875 0.34375 0.31100082
+-10.75 0.3125 0.31299973
+-10.8125 0.28125 0.30599976
+-10.84375 0.28125 0.31900024
+-10.875 0.25 0.31500244
+-10.921875 0.25 0.34300232
+-9.84375 -0.03125 -2.8069992
+-10.0625 -0.125 -2.8120003
+-10.078125 -0.125 -2.7879982
+-10.03125 -0.125 -2.757
+-10.03125 -0.09375 -2.7299995
+-10.03125 -0.09375 -2.7039986
+-10.03125 -0.09375 -2.6759987
+-9.984375 -0.03125 -2.6389999
+-9.921875 0 -2.5950012
+-9.921875 0 -2.5709991
+-9.953125 0 -2.5439987
+-9.921875 0.03125 -2.5139999
+-9.953125 0.03125 -2.4850006
+-9.953125 0.03125 -2.4580002
+-9.953125 0.03125 -2.4290009
+-9.921875 0.0625 -2.3959999
+-10.65625 0.40625 0.31700134
+-10.71875 0.375 0.31100082
+-10.75 0.34375 0.31500244
+-10.78125 0.3125 0.31500244
+-10.78125 0.34375 0.3769989
+-10.84375 0.3125 0.35499954
+-10.921875 0.25 0.31299973
+-10.9375 0.25 0.35300064
+-9.875 -0.03125 -2.8909988
+-9.890625 -0.03125 -2.8660011
+-9.890625 -0.03125 -2.8479996
+-9.890625 -0.03125 -2.8219986
+-10.03125 -0.09375 -2.8159981
+-10.03125 -0.09375 -2.7900009
+-10.03125 -0.09375 -2.7630005
+-10.03125 -0.0625 -2.7360001
+-10.015625 -0.0625 -2.7080002
+-10.015625 -0.03125 -2.6809998
+-10.015625 -0.03125 -2.6529999
+-9.953125 0.03125 -2.6079979
+-9.953125 0.03125 -2.5810013
+-9.953125 0.03125 -2.5519981
+-9.953125 0.03125 -2.5249977
+-9.921875 0.0625 -2.4939995
+-10.6875 0.40625 0.31000137
+-10.734375 0.375 0.31299973
+-10.765625 0.375 0.32900238
+-10.8125 0.34375 0.34000015
+-10.78125 0.375 0.44800186
+-10.859375 0.34375 0.4109993
+-10.9375 0.25 0.30800247
+-10.953125 0.25 0.34600067
+-9.84375 -0.03125 -3.0060005
+-9.875 -0.03125 -2.9799995
+-9.875 -0.03125 -2.9529991
+-9.890625 0 -2.9269981
+-9.890625 0 -2.9020004
+-9.90625 0 -2.8759995
+-9.90625 0 -2.848999
+-9.90625 0 -2.8310013
+-9.90625 0 -2.8040009
+-10.015625 -0.0625 -2.7949982
+-9.984375 -0.03125 -2.762001
+-10 -0.03125 -2.7389984
+-9.984375 0 -2.7080002
+-10 0 -2.6870003
+-9.984375 0 -2.6559982
+-9.921875 0.0625 -2.6139984
+-9.90625 0.09375 -2.579998
+-10.671875 0.4375 0.32099915
+-10.71875 0.40625 0.31500244
+-10.75 0.40625 0.3370018
+-10.8125 0.34375 0.2859993
+-10.859375 0.3125 0.25400162
+-10.859375 0.34375 0.37900162
+-10.890625 0.375 0.43500137
+-10.953125 0.28125 0.3030014
+-10.984375 0.28125 0.35200119
+-9.84375 -0.03125 -3.1199989
+-9.875 -0.03125 -3.093998
+-9.875 -0.03125 -3.0669975
+-9.890625 -0.03125 -3.0419998
+-9.890625 0 -3.0149994
+-9.90625 0 -2.9899979
+-9.90625 0 -2.9640007
+-9.90625 0 -2.9370003
+-9.921875 0 -2.9119987
+-9.890625 0.03125 -2.882
+-9.921875 0 -2.8590012
+-9.921875 0.03125 -2.8409996
+-9.921875 0.03125 -2.8149986
+-10 0 -2.7989998
+-10 0 -2.7729988
+-10.046875 -0.03125 -2.7539978
+-10.015625 0 -2.7220001
+-10.015625 0 -2.6969986
+-9.984375 0.03125 -2.6609993
+-10.703125 0.46875 0.32099915
+-10.734375 0.4375 0.34600067
+-10.828125 0.375 0.23300171
+-10.859375 0.34375 0.2460022
+-10.859375 0.375 0.33200073
+-10.890625 0.375 0.40399933
+-10.90625 0.375 0.44100189
+-11 0.28125 0.31000137
+-11.015625 0.28125 0.35800171
+-9.84375 -0.03125 -3.2329979
+-9.875 -0.03125 -3.2060013
+-9.875 -0.03125 -3.1800003
+-9.890625 -0.03125 -3.1539993
+-9.890625 -0.03125 -3.1279984
+-9.890625 0 -3.1009979
+-9.90625 0 -3.0760002
+-9.90625 0 -3.0499992
+-9.90625 0 -3.0239983
+-9.890625 0.03125 -2.9959984
+-9.921875 0 -2.9720001
+-9.921875 0.03125 -2.9459991
+-9.921875 0.03125 -2.9199982
+-9.921875 0.03125 -2.8929977
+-9.921875 0.03125 -2.8670006
+-9.921875 0.0625 -2.8479996
+-9.921875 0.0625 -2.8209991
+-9.984375 0.03125 -2.8040009
+-9.96875 0.03125 -2.776001
+-9.984375 0.03125 -2.7519989
+-9.96875 0.0625 -2.7220001
+-9.953125 0.0625 -2.6909981
+-9.96875 0.0625 -2.6650009
+-10.734375 0.46875 0.29999924
+-10.796875 0.40625 0.28100204
+-10.84375 0.375 0.25099945
+-10.828125 0.4375 0.39200211
+-10.890625 0.40625 0.35599899
+-10.890625 0.40625 0.44400024
+-10.9375 0.375 0.39699936
+-11.015625 0.3125 0.30800247
+-11.015625 0.3125 0.38299942
+-9.828125 -0.03125 -3.3460007
+-9.84375 -0.03125 -3.3180008
+-9.84375 -0.03125 -3.2919998
+-9.875 -0.03125 -3.2649994
+-9.890625 -0.03125 -3.2389984
+-9.890625 0 -3.2130013
+-9.890625 0 -3.1870003
+-9.90625 0 -3.1609993
+-9.890625 0 -3.1349983
+-9.890625 0 -3.1090012
+-9.921875 0 -3.0830002
+-9.921875 0 -3.0579987
+-9.921875 0.03125 -3.0319977
+-9.921875 0.03125 -3.0050011
+-9.921875 0.03125 -2.9799995
+-9.921875 0.03125 -2.9539986
+-9.921875 0.0625 -2.9269981
+-9.921875 0.0625 -2.8999977
+-9.96875 0.0625 -2.8089981
+-9.96875 0.0625 -2.7819977
+-9.953125 0.09375 -2.7529984
+-9.953125 0.09375 -2.7249985
+-9.921875 0.09375 -2.6949997
+-9.953125 0.09375 -2.6699982
+-10.75 0.46875 0.31900024
+-10.828125 0.40625 0.25
+-10.84375 0.4375 0.31500244
+-10.84375 0.46875 0.41699982
+-10.890625 0.4375 0.40299988
+-10.921875 0.4375 0.44000244
+-10.984375 0.375 0.36999893
+-11.046875 0.3125 0.31999969
+-11.046875 0.3125 0.38600159
+-9.8125 -0.03125 -3.4589996
+-9.84375 -0.03125 -3.4300003
+-9.84375 -0.03125 -3.4029999
+-9.875 -0.03125 -3.3759995
+-9.890625 -0.03125 -3.348999
+-9.890625 0 -3.322998
+-9.890625 0 -3.2970009
+-9.890625 0 -3.2709999
+-9.890625 0 -3.2449989
+-9.890625 0.03125 -3.2200012
+-9.90625 0 -3.1940002
+-9.921875 0 -3.1679993
+-9.921875 0.03125 -3.1429977
+-9.921875 0.03125 -3.1170006
+-9.921875 0.03125 -3.0909996
+-9.921875 0.03125 -3.0649986
+-9.921875 0.0625 -3.0389977
+-9.90625 0.0625 -3.0130005
+-9.890625 0.09375 -2.9850006
+-9.953125 0.09375 -2.8139992
+-9.921875 0.125 -2.7840004
+-9.921875 0.125 -2.757
+-9.96875 0.09375 -2.737999
+-9.921875 0.125 -2.7019997
+-9.9375 0.15625 -2.6749992
+-10.796875 0.5 0.30900192
+-10.828125 0.46875 0.34799957
+-10.84375 0.46875 0.36700058
+-10.859375 0.46875 0.41799927
+-10.953125 0.375 0.28700256
+-10.96875 0.40625 0.3769989
+-11.03125 0.34375 0.30900192
+-11.078125 0.3125 0.31200027
+-11.078125 0.34375 0.40100098
+-9.8125 -0.03125 -3.5719986
+-9.828125 -0.03125 -3.5419998
+-9.84375 -0.03125 -3.5139999
+-9.84375 -0.03125 -3.4869995
+-9.875 -0.03125 -3.4599991
+-9.875 0 -3.4329987
+-9.890625 0 -3.4059982
+-9.890625 0 -3.3810005
+-9.90625 0 -3.3540001
+-9.953125 0 -3.3269997
+-9.890625 0 -3.3040009
+-9.890625 0.03125 -3.2779999
+-9.90625 0.03125 -3.2519989
+-9.921875 0.03125 -3.2270012
+-9.921875 0.03125 -3.2010002
+-9.90625 0.03125 -3.1759987
+-9.921875 0.0625 -3.1499977
+-9.90625 0.0625 -3.1240005
+-9.90625 0.0625 -3.0979996
+-9.921875 0.125 -2.8180008
+-9.9375 0.15625 -2.7910004
+-9.90625 0.15625 -2.762001
+-9.90625 0.15625 -2.7350006
+-9.90625 0.1875 -2.7070007
+-9.90625 0.1875 -2.6790009
+-10.8125 0.5 0.32400131
+-10.84375 0.5 0.36100006
+-10.875 0.5 0.38199997
+-10.90625 0.46875 0.41699982
+-10.96875 0.40625 0.32799911
+-11.015625 0.40625 0.34000015
+-11.0625 0.375 0.3370018
+-11.09375 0.34375 0.31399918
+-9.8125 -0.03125 -3.6849976
+-9.84375 -0.03125 -3.6520004
+-9.84375 -0.03125 -3.625
+-9.875 -0.03125 -3.5960007
+-9.875 -0.03125 -3.5699997
+-9.875 0 -3.5429993
+-9.890625 0 -3.5159988
+-9.890625 0 -3.4899979
+-9.890625 0 -3.4640007
+-9.9375 -0.03125 -3.4339981
+-9.875 0.03125 -3.4160004
+-9.921875 0 -3.3849983
+-9.90625 0.03125 -3.3099976
+-9.90625 0.03125 -3.2849998
+-9.90625 0.0625 -3.2589989
+-9.90625 0.0625 -3.2340012
+-9.90625 0.0625 -3.2089996
+-9.90625 0.1875 -2.8240013
+-9.9375 0.15625 -2.7999992
+-9.890625 0.1875 -2.7679977
+-9.9375 0.1875 -2.7469978
+-9.890625 0.21875 -2.7130013
+-9.890625 0.21875 -2.6829987
+-10.84375 0.53125 0.33100128
+-10.875 0.5 0.36199951
+-10.9375 0.4375 0.28000259
+-10.9375 0.46875 0.37400055
+-11.015625 0.40625 0.30900192
+-11.03125 0.40625 0.34199905
+-11.078125 0.375 0.3390007
+-11.109375 0.34375 0.32300186
+-9.796875 0 -3.8029976
+-9.828125 -0.03125 -3.7669983
+-9.84375 -0.03125 -3.7369995
+-9.84375 -0.03125 -3.7080002
+-9.84375 -0.03125 -3.6809998
+-9.875 0 -3.6539993
+-9.875 0 -3.6269989
+-9.890625 0 -3.5999985
+-9.875 0 -3.5750008
+-9.890625 0 -3.5489998
+-9.875 0.03125 -3.5249977
+-9.890625 0.03125 -3.4969978
+-9.90625 0.03125 -3.4700012
+-9.90625 0.03125 -3.4440002
+-9.921875 0.03125 -3.4179993
+-9.90625 0.03125 -3.3929977
+-9.90625 0.03125 -3.368
+-9.90625 0.0625 -3.3419991
+-9.90625 0.0625 -3.3180008
+-9.875 0.09375 -3.2939987
+-9.875 0.21875 -2.8260002
+-9.890625 0.21875 -2.8009987
+-9.875 0.25 -2.7719994
+-9.859375 0.25 -2.7420006
+-9.875 0.25 -2.7159996
+-9.859375 0.28125 -2.6860008
+-9.859375 0.28125 -2.6559982
+-10.875 0.53125 0.3370018
+-10.890625 0.53125 0.36700058
+-10.921875 0.5 0.38999939
+-11 0.46875 0.32600021
+-11 0.46875 0.39500046
+-11.078125 0.40625 0.32099915
+-11.109375 0.375 0.31399918
+-9.828125 -0.03125 -3.8789978
+-9.84375 -0.03125 -3.8470001
+-9.84375 -0.03125 -3.8190002
+-9.84375 -0.03125 -3.7919998
+-9.875 -0.03125 -3.7630005
+-9.875 0 -3.7369995
+-9.890625 0 -3.7089996
+-9.890625 0 -3.6819992
+-9.890625 0 -3.6549988
+-9.875 0 -3.6329994
+-9.90625 0 -3.6020012
+-9.890625 0.03125 -3.5789986
+-9.890625 0.03125 -3.5540009
+-9.90625 0.03125 -3.5270004
+-9.890625 0.03125 -3.5029984
+-9.90625 0.03125 -3.4759979
+-9.90625 0.0625 -3.4510002
+-9.90625 0.0625 -3.4269981
+-9.875 0.09375 -3.4039993
+-9.859375 0.25 -2.8059998
+-9.859375 0.28125 -2.7779999
+-9.859375 0.28125 -2.75
+-9.875 0.28125 -2.7249985
+-9.84375 0.3125 -2.6909981
+-9.84375 0.3125 -2.6629982
+-10.890625 0.53125 0.32699966
+-10.96875 0.5 0.28499985
+-10.96875 0.5 0.35499954
+-11 0.5 0.37200165
+-11.0625 0.4375 0.33200073
+-11.09375 0.40625 0.30900192
+-9.8125 -0.03125 -3.9969978
+-9.828125 -0.03125 -3.9630013
+-9.84375 -0.03125 -3.9319992
+-9.84375 -0.03125 -3.9049988
+-9.84375 -0.03125 -3.8759995
+-9.875 0 -3.8479996
+-9.875 0 -3.8190002
+-9.875 0 -3.7939987
+-9.890625 0 -3.7669983
+-9.84375 0.03125 -3.7469978
+-9.875 0.03125 -3.7159996
+-9.890625 0.03125 -3.6889992
+-9.890625 0.03125 -3.6619987
+-9.890625 0.03125 -3.6359978
+-9.890625 0.03125 -3.6110001
+-9.90625 0.0625 -3.5859985
+-9.890625 0.0625 -3.5620003
+-9.890625 0.0625 -3.5359993
+-9.890625 0.0625 -3.512001
+-9.84375 0.3125 -2.8099976
+-9.84375 0.3125 -2.7830009
+-9.84375 0.3125 -2.7539978
+-9.84375 0.34375 -2.7249985
+-9.859375 0.3125 -2.7019997
+-9.8125 0.34375 -2.6669998
+-10.9375 0.53125 0.30800247
+-10.96875 0.53125 0.34799957
+-11 0.5 0.31900024
+-11.03125 0.5 0.3370018
+-11.078125 0.4375 0.31700134
+-9.8125 -0.03125 -4.1119995
+-9.828125 -0.03125 -4.0789986
+-9.84375 -0.03125 -4.0459976
+-9.84375 -0.03125 -4.0200005
+-9.84375 -0.03125 -3.9889984
+-9.875 0 -3.9609985
+-9.875 0 -3.9319992
+-9.875 0 -3.9039993
+-9.890625 0 -3.8769989
+-9.875 0 -3.8509979
+-9.890625 0 -3.8250008
+-9.890625 0.03125 -3.7970009
+-9.890625 0.03125 -3.7709999
+-9.890625 0.03125 -3.7439995
+-9.890625 0.03125 -3.7179985
+-9.890625 0.03125 -3.6930008
+-9.90625 0.0625 -3.6679993
+-9.90625 0.0625 -3.6429977
+-9.890625 0.0625 -3.6189995
+-9.8125 0.34375 -2.8169975
+-9.796875 0.375 -2.7840004
+-9.8125 0.375 -2.7589989
+-9.796875 0.375 -2.7290001
+-9.8125 0.375 -2.704998
+-9.796875 0.40625 -2.6720009
+-10.96875 0.5625 0.32500076
+-10.984375 0.53125 0.33600235
+-11.015625 0.53125 0.33499908
+-11.078125 0.5 0.32799911
+-9.78125 -0.03125 -4.2469978
+-9.828125 -0.03125 -4.1959991
+-9.828125 -0.03125 -4.1650009
+-9.84375 -0.03125 -4.1339989
+-9.84375 -0.03125 -4.1049995
+-9.875 -0.03125 -4.072998
+-9.875 0 -4.0459976
+-9.875 0 -4.019001
+-9.875 0 -3.987999
+-9.875 0 -3.9640007
+-9.90625 0 -3.9269981
+-9.890625 0.03125 -3.9080009
+-9.890625 0.03125 -3.8810005
+-9.890625 0.03125 -3.8549995
+-9.890625 0.03125 -3.829998
+-9.890625 0.03125 -3.8040009
+-9.890625 0.0625 -3.7779999
+-9.890625 0.0625 -3.7529984
+-9.890625 0.0625 -3.7280006
+-9.859375 0.09375 -3.7089996
+-9.796875 0.375 -2.8219986
+-9.78125 0.40625 -2.7900009
+-9.765625 0.40625 -2.7599983
+-9.796875 0.40625 -2.7350006
+-9.765625 0.4375 -2.7010002
+-9.78125 0.4375 -2.6759987
+-10.984375 0.5625 0.34000015
+-11.015625 0.5625 0.3409996
+-11.0625 0.53125 0.32699966
+-9.796875 -0.03125 -4.3260002
+-9.828125 -0.03125 -4.2869987
+-9.828125 -0.03125 -4.2550011
+-9.84375 -0.03125 -4.2220001
+-9.84375 -0.03125 -4.1909981
+-9.84375 0 -4.1609993
+-9.875 0 -4.132
+-9.875 0 -4.1040001
+-9.875 0 -4.0760002
+-9.84375 0.03125 -4.0599976
+-9.875 0 -4.0209999
+-9.890625 0.03125 -3.9920006
+-9.890625 0.03125 -3.9640007
+-9.890625 0.03125 -3.9389992
+-9.890625 0.03125 -3.9129982
+-9.890625 0.0625 -3.887001
+-9.890625 0.0625 -3.8639984
+-9.875 0.0625 -3.8380013
+-9.875 0.09375 -3.8169975
+-9.78125 0.40625 -2.8269997
+-9.78125 0.4375 -2.7980003
+-9.78125 0.4375 -2.7700005
+-9.78125 0.4375 -2.7410011
+-9.765625 0.46875 -2.7099991
+-11 0.59375 0.33100128
+-11.046875 0.5625 0.34199905
+-9.8125 -0.03125 -4.4139977
+-9.828125 -0.03125 -4.3769989
+-9.828125 -0.03125 -4.3419991
+-9.84375 -0.03125 -4.3110008
+-9.84375 -0.03125 -4.2799988
+-9.84375 0 -4.25
+-9.875 0 -4.2200012
+-9.875 0 -4.1919975
+-9.875 0 -4.1619987
+-9.875 0 -4.1349983
+-9.890625 0.03125 -4.1040001
+-9.890625 0.03125 -4.0789986
+-9.890625 0.03125 -4.0509987
+-9.890625 0.03125 -4.0249977
+-9.890625 0.0625 -3.9990005
+-9.890625 0.0625 -3.973999
+-9.875 0.0625 -3.9500008
+-9.875 0.0625 -3.9249992
+-9.78125 -0.03125 -4.5589981
+-9.8125 -0.03125 -4.512001
+-9.828125 -0.03125 -4.4710007
+-9.828125 -0.03125 -4.4389992
+-9.84375 -0.03125 -4.4039993
+-9.84375 0 -4.3709984
+-9.84375 0 -4.3400002
+-9.875 0 -4.3110008
+-9.875 0 -4.2799988
+-9.875 0 -4.2509995
+-9.875 0.03125 -4.223999
+-9.875 0.03125 -4.1949997
+-9.875 0.03125 -4.1669998
+-9.875 0.03125 -4.1419983
+-9.890625 0.03125 -4.1119995
+-9.875 0.0625 -4.0890007
+-9.875 0.0625 -4.0599976
+-9.875 0.0625 -4.0369987
+-9.859375 0.09375 -4.0209999
+-9.796875 -0.03125 -4.6499977
+-9.8125 -0.03125 -4.598999
+-9.828125 -0.03125 -4.5639992
+-9.828125 -0.03125 -4.5289993
+-9.84375 -0.03125 -4.4969978
+-9.84375 0 -4.4650002
+-9.84375 0 -4.4319992
+-9.875 0 -4.401001
+-9.875 0 -4.3719978
+-9.875 0 -4.3390007
+-9.875 0.03125 -4.3110008
+-9.875 0.03125 -4.2830009
+-9.890625 0.03125 -4.2539978
+-9.890625 0.03125 -4.2249985
+-9.875 0.0625 -4.2010002
+-9.875 0.0625 -4.1769981
+-9.875 0.0625 -4.151001
+-9.875 0.09375 -4.125
+-9.796875 -0.03125 -4.75
+-9.8125 -0.03125 -4.6959991
+-9.8125 -0.03125 -4.6669998
+-9.828125 -0.03125 -4.6269989
+-9.84375 -0.03125 -4.5909996
+-9.84375 0 -4.5589981
+-9.84375 0 -4.526001
+-9.875 0 -4.4939995
+-9.84375 0 -4.4700012
+-9.875 0 -4.4319992
+-9.875 0.03125 -4.4029999
+-9.875 0.03125 -4.375
+-9.875 0.03125 -4.348999
+-9.875 0.0625 -4.3190002
+-9.875 0.0625 -4.2939987
+-9.875 0.0625 -4.2679977
+-9.859375 0.0625 -4.2439995
+-9.8125 0.09375 -4.2340012
+-9.796875 -0.03125 -4.8499985
+-9.8125 -0.03125 -4.8019981
+-9.8125 -0.03125 -4.7719994
+-9.828125 -0.03125 -4.7259979
+-9.828125 0 -4.6909981
+-9.84375 0 -4.6580009
+-9.84375 0 -4.6199989
+-9.84375 0 -4.5919991
+-9.84375 0 -4.5620003
+-9.875 0.03125 -4.5289993
+-9.875 0.03125 -4.4990005
+-9.875 0.03125 -4.4669991
+-9.875 0.03125 -4.4379997
+-9.875 0.0625 -4.4109993
+-9.875 0.0625 -4.3849983
+-9.859375 0.0625 -4.3610001
+-9.859375 0.09375 -4.3390007
+-9.78125 -0.03125 -4.9599991
+-9.796875 -0.03125 -4.9139977
+-9.8125 -0.03125 -4.875
+-9.828125 -0.03125 -4.8320007
+-9.828125 0 -4.7929993
+-9.84375 0 -4.757
+-9.84375 0 -4.718998
+-9.875 0 -4.6849976
+-9.84375 0 -4.6569977
+-9.875 0.03125 -4.6230011
+-9.875 0.03125 -4.593998
+-9.875 0.03125 -4.5610008
+-9.875 0.03125 -4.5309982
+-9.875 0.0625 -4.507
+-9.875 0.0625 -4.4790001
+-9.859375 0.0625 -4.4539986
+-9.78125 -0.03125 -5.0750008
+-9.796875 -0.03125 -5.0219994
+-9.8125 -0.03125 -4.9829979
+-9.8125 0 -4.9459991
+-9.828125 0 -4.8979988
+-9.828125 0 -4.868
+-9.84375 0 -4.8239975
+-9.84375 0 -4.7949982
+-9.84375 0 -4.7550011
+-9.84375 0.03125 -4.7259979
+-9.875 0.03125 -4.6909981
+-9.84375 0.03125 -4.6619987
+-9.859375 0.0625 -4.6339989
+-9.859375 0.0625 -4.6049995
+-9.859375 0.0625 -4.5769997
+-9.859375 0.09375 -4.5550003
+-9.796875 -0.03125 -5.132
+-9.8125 -0.03125 -5.0919991
+-9.8125 -0.03125 -5.0540009
+-9.828125 0 -5.0099983
+-9.84375 0 -4.961998
+-9.828125 0 -4.9349976
+-9.84375 0 -4.894001
+-9.84375 0.03125 -4.8649979
+-9.84375 0.03125 -4.8250008
+-9.84375 0.03125 -4.7980003
+-9.875 0.03125 -4.7589989
+-9.890625 0.03125 -4.7150002
+-9.859375 0.0625 -4.7059975
+-9.828125 0.0625 -4.6809998
+-9.8125 0.09375 -4.6629982
+-9.78125 -0.03125 -5.2630005
+-9.796875 -0.03125 -5.2089996
+-9.8125 -0.03125 -5.1599998
+-9.828125 0 -5.118
+-9.828125 0 -5.086998
+-9.828125 0 -5.0459976
+-9.828125 0 -5.012001
+-9.84375 0.03125 -4.9710007
+-9.828125 0.03125 -4.9419975
+-9.828125 0.03125 -4.9059982
+-9.84375 0.03125 -4.8699989
+-9.875 0.03125 -4.8219986
+-9.78125 -0.03125 -5.3419991
+-9.8125 -0.03125 -5.2859993
+-9.8125 -0.03125 -5.2389984
+-9.828125 0 -5.1940002
+-9.828125 0 -5.1539993
+-9.828125 0 -5.112999
+-9.828125 0.03125 -5.0839996
+-9.828125 0.03125 -5.0480003
+-9.828125 0.03125 -5.012001
+-9.84375 0.03125 -4.9759979
+-9.859375 0.0625 -4.9319992
+-9.796875 -0.03125 -5.447998
+-9.796875 -0.03125 -5.4139977
+-9.8125 -0.03125 -5.3670006
+-9.8125 0 -5.3180008
+-9.828125 0 -5.2700005
+-9.828125 0 -5.2290001
+-9.828125 0 -5.1909981
+-9.84375 0.03125 -5.1539993
+-9.84375 0.03125 -5.1189995
+-9.828125 0.03125 -5.0880013
+-9.828125 0.0625 -5.0550003
+-9.8125 -0.03125 -5.4389992
+-9.8125 0 -5.4080009
+-9.828125 0 -5.355999
+-9.828125 0 -5.3169975
+-9.828125 0.03125 -5.2729988
+-9.84375 0.03125 -5.230999
+-9.828125 0.03125 -5.2010002
+-9.828125 0.0625 -5.1650009
+-9.828125 0 -5.4349976
+-9.828125 0 -5.3959999
+-9.828125 0.03125 -5.3590012
+-9.828125 0.03125 -5.3190002
+-9.828125 0.03125 -5.2799988
+-9.828125 0.03125 -5.4409981
+-9.828125 0.03125 -5.4029999
+-9.84375 0.03125 -5.348999
+-9.875 0 -5.2719994
+-9.875 0.03125 -5.3989983
+-9.875 0 -5.2270012
+-9.890625 -0.03125 -5.0519981
+-9.875 0.03125 -5.1829987
+-9.890625 0 -5.0109978
+-9.875 0.03125 -5.1409988
+-9.890625 0 -4.9659996
+-9.890625 -0.03125 -4.7939987
+-9.890625 0.03125 -4.9230003
+-9.90625 0 -4.75
+-9.890625 0.03125 -4.8789978
+-9.890625 0 -4.7089996
+-9.875 0.03125 -4.8390007
+-9.890625 -0.03125 -4.5379982
+-9.890625 0 -4.6660004
+-9.90625 -0.03125 -4.4949989
+-9.921875 0 -4.4510002
+-10.1875 -0.375 -2.7039986
+-9.90625 -0.03125 -4.2819977
+-9.90625 0 -4.4099998
+-10.1875 -0.375 -2.6609993
+-10.1875 -0.34375 -2.7929993
+-9.90625 -0.03125 -4.237999
+-9.890625 0.03125 -4.3699989
+-10.171875 -0.3125 -2.75
+-9.90625 0 -4.1959991
+-9.90625 0.03125 -4.3269997
+-9.875 0.0625 -4.4599991
+-10.171875 -0.3125 -2.7070007
+-9.90625 -0.03125 -4.026001
+-9.921875 0 -4.1549988
+-9.90625 0.03125 -4.2859993
+-9.84375 0.03125 -4.4220009
+-10.171875 -0.28125 -2.6650009
+-10.171875 -0.25 -2.7970009
+-9.921875 -0.03125 -3.9829979
+-9.921875 0.03125 -4.112999
+-9.90625 0.0625 -4.2449989
+-9.859375 0.0625 -4.3800011
+-10.125 -0.28125 -2.7529984
+-9.921875 0 -3.9419975
+-9.921875 0.03125 -4.0719986
+-9.890625 0.0625 -4.204998
+-10.171875 -0.21875 -2.7130013
+-9.921875 0 -3.8999977
+-9.90625 0.03125 -4.0309982
+-9.875 0.0625 -4.1639977
+-10.15625 -0.25 -2.6699982
+-10.109375 -0.21875 -2.8009987
+-9.921875 -0.03125 -3.7280006
+-9.921875 0 -3.8590012
+-9.90625 0.03125 -3.9899979
+-9.859375 0.0625 -4.125
+-10.109375 -0.25 -2.6259995
+-10.109375 -0.1875 -2.7599983
+-9.953125 0 -3.6860008
+-9.921875 0.03125 -3.8169975
+-9.890625 0.03125 -3.9500008
+-9.828125 0.03125 -4.086998
+-10.109375 -0.1875 -2.7179985
+-9.953125 0 -3.6429977
+-9.921875 0.03125 -3.776001
+-9.875 0.03125 -3.9099998
+-10.125 -0.15625 -2.6769981
+-10.078125 -0.15625 -2.8079987
+-9.921875 -0.0625 -3.4710007
+-9.953125 0 -3.6040001
+-9.921875 0.03125 -3.7360001
+-9.875 0.03125 -3.8699989
+-10.109375 -0.1875 -2.6349983
+-10.078125 -0.15625 -2.7669983
+-9.9375 -0.03125 -3.4300003
+-9.953125 0.03125 -3.5620003
+-9.90625 0.0625 -3.6959991
+-9.859375 0.0625 -3.829998
+-10.078125 -0.15625 -2.7259979
+-9.96875 0 -3.3899994
+-9.953125 0.03125 -3.5229988
+-9.890625 0.03125 -3.6569977
+-10.078125 -0.125 -2.6860008
+-10.03125 -0.125 -2.8190002
+-9.921875 -0.03125 -3.3499985
+-9.921875 0.03125 -3.4819984
+-9.890625 0.0625 -3.6170006
+-10.078125 -0.125 -2.6459999
+-10.0625 -0.09375 -2.7789993
+-9.9375 -0.03125 -3.1769981
+-9.953125 0 -3.3099976
+-9.90625 0.03125 -3.4440002
+-9.84375 0.03125 -3.5789986
+-10.0625 -0.0625 -2.7389984
+-9.96875 -0.03125 -3.137001
+-9.953125 0.03125 -3.2700005
+-9.921875 0.0625 -3.4039993
+-10.0625 -0.0625 -2.697998
+-9.96875 0 -3.0970001
+-9.953125 0.03125 -3.2299995
+-9.890625 0.03125 -3.362999
+-10.03125 -0.0625 -2.6559982
+-10.046875 -0.03125 -2.7900009
+-9.96875 0 -3.0559998
+-9.953125 0.03125 -3.1889992
+-9.890625 0.03125 -3.322998
+-10.015625 -0.03125 -2.7490005
+-9.96875 -0.03125 -2.8810005
+-9.96875 0.03125 -3.0149994
+-9.921875 0.03125 -3.1489983
+-10.015625 0 -2.7080002
+-9.96875 -0.03125 -2.8400002
+-9.953125 0.03125 -2.973999
+-9.90625 0.03125 -3.1079979
+-10.015625 0 -2.6669998
+-10 0.03125 -2.7999992
+-9.953125 0.03125 -2.9329987
+-9.90625 0.03125 -3.0669975
+-9.96875 -0.0625 -2.6230011
+-9.984375 0.03125 -2.7589989
+-9.953125 0.03125 -2.8929977
+-9.984375 -0.03125 -2.5830002
+-9.984375 0.03125 -2.7200012
+-9.921875 0.03125 -2.8520012
+-9.984375 0 -2.5439987
+-10 0.0625 -2.6800003
+-9.953125 0.0625 -2.8129997
+-9.984375 0 -2.5039978
+-10 0.0625 -2.6399994
+-9.984375 0.09375 -2.7749977
+-9.984375 0 -2.4640007
+-9.953125 0.03125 -2.5979996
+-9.984375 0.09375 -2.7360001
+-9.984375 -0.03125 -2.2869987
+-9.984375 0.03125 -2.4239998
+-9.953125 0.03125 -2.5579987
+-9.96875 0.09375 -2.6949997
+-9.953125 0.125 -2.829998
+-10 0 -2.2480011
+-9.984375 0.03125 -2.3829994
+-9.953125 0.03125 -2.5169983
+-9.96875 0.09375 -2.6549988
+-9.953125 0.125 -2.7889977
+-9.984375 0 -2.2060013
+-9.96875 0.03125 -2.3419991
+-9.921875 0.03125 -2.4759979
+-9.921875 0.125 -2.7490005
+-10 0 -2.1650009
+-9.96875 0.03125 -2.3009987
+-9.921875 0.125 -2.7080002
+-9.984375 0 -2.1230011
+-9.96875 0.03125 -2.2589989
+-9.9375 0.15625 -2.6679993
+-9.90625 0.1875 -2.8019981
+-10 -0.03125 -1.9419975
+-9.984375 0 -2.0820007
+-9.953125 0.03125 -2.2169991
+-9.90625 0.1875 -2.762001
+-10 -0.03125 -1.9020004
+-9.984375 0 -2.0389977
+-9.953125 0.03125 -2.1749992
+-9.90625 0.1875 -2.7210007
+-10 0 -1.8610001
+-9.984375 0.03125 -1.9990005
+-9.921875 0.03125 -2.1329994
+-9.90625 0.21875 -2.6819992
+-9.890625 0.21875 -2.8169975
+-10 0 -1.8199997
+-9.984375 0.03125 -1.9570007
+-9.90625 0.21875 -2.6419983
+-9.890625 0.25 -2.7770004
+-10 0 -1.7779999
+-9.984375 0.03125 -1.9150009
+-9.890625 0.25 -2.7369995
+-10 0 -1.7389984
+-9.984375 0.03125 -1.875
+-9.890625 0.25 -2.697998
+-9.84375 0.25 -2.8330002
+-10 0 -1.6969986
+-9.96875 0.03125 -1.8330002
+-9.890625 0.25 -2.6580009
+-9.875 0.28125 -2.7939987
+-10 -0.03125 -1.5149994
+-10.015625 0 -1.6569977
+-9.96875 0.03125 -1.7919998
+-9.875 0.28125 -2.7539978
+-10 -0.03125 -1.4729996
+-10.015625 0 -1.6149979
+-9.96875 0.03125 -1.75
+-9.875 0.28125 -2.7150002
+-10.015625 -0.03125 -1.4319992
+-10.015625 0 -1.572998
+-9.953125 0.03125 -1.7059975
+-9.875 0.28125 -2.6739998
+-9.859375 0.3125 -2.8099976
+-10.015625 -0.03125 -1.3899994
+-10 0 -1.5299988
+-9.96875 0.03125 -1.6660004
+-9.859375 0.3125 -2.7700005
+-10.015625 -0.03125 -1.3479996
+-10 0 -1.487999
+-9.859375 0.3125 -2.7290001
+-10.015625 -0.03125 -1.3029976
+-10 0 -1.4440002
+-9.859375 0.34375 -2.6879997
+-9.8125 0.34375 -2.8240013
+-10.015625 -0.03125 -1.2599983
+-10 0 -1.3999977
+-9.859375 0.34375 -2.6479988
+-9.84375 0.375 -2.7840004
+-10.015625 -0.03125 -1.2179985
+-10.015625 0.03125 -1.3600006
+-9.84375 0.375 -2.7439995
+-10.015625 0 -1.1759987
+-10 0 -1.3159981
+-9.8125 0.34375 -2.7019997
+-10.015625 -0.03125 -1.132
+-10 0 -1.2719994
+-9.84375 0.375 -2.6619987
+-9.828125 0.40625 -2.7989998
+-11.171875 0.3125 0.35499954
+-10.046875 0 -1.0919991
+-10 0 -1.2299995
+-9.828125 0.40625 -2.7589989
+-10.015625 -0.03125 -1.0470009
+-10 0 -1.1879997
+-9.828125 0.40625 -2.718998
+-11.046875 0.25 0.33200073
+-10.046875 -0.03125 -1.0050011
+-10.015625 0 -1.1459999
+-9.828125 0.40625 -2.6800003
+-11.171875 0.34375 0.3409996
+-10.046875 -0.03125 -0.96199799
+-10.015625 0 -1.1040001
+-9.796875 0.4375 -2.7770004
+-11.109375 0.28125 0.40100098
+-10.046875 -0.03125 -0.91999817
+-10.015625 0 -1.0610008
+-9.796875 0.4375 -2.7369995
+-10.96875 0.21875 0.34500122
+-10.046875 -0.03125 -0.87400055
+-10.015625 0 -1.019001
+-9.796875 0.4375 -2.6969986
+-11.15625 0.34375 0.33600235
+-10.046875 -0.03125 -0.83099747
+-10.015625 0 -0.97399902
+-9.796875 0.4375 -2.6559982
+-11.15625 0.34375 0.37900162
+-10.015625 -0.03125 -0.78499985
+-10.015625 0 -0.93199921
+-11.125 0.3125 0.42900085
+-10.046875 -0.03125 -0.74499893
+-10.046875 0 -0.88899994
+-10.046875 0 -0.84499741
+-9.96875 0 -0.97900009
+-11.15625 0.375 0.36800003
+-10.046875 0 -0.80099869
+-10 0.03125 -0.94099808
+-11.15625 0.34375 0.41600037
+-10.859375 0.15625 0.35800171
+-10.0625 0 -0.76099777
+-10 0 -0.89899826
+-11.015625 0.28125 0.35700226
+-10.046875 0 -0.71500015
+-10 0 -0.85499954
+-11.15625 0.375 0.36000061
+-10.046875 -0.03125 -0.67300034
+-10.015625 0.03125 -0.81599808
+-11.125 0.375 0.4070015
+-10.875 0.21875 0.3390007
+-10.0625 -0.03125 -0.63000107
+-10.015625 0 -0.77099991
+-11.125 0.34375 0.45100021
+-10.90625 0.21875 0.3769989
+-10.046875 -0.03125 -0.58499908
+-10.015625 0 -0.72800064
+-11.125 0.40625 0.34799957
+-10.875 0.25 0.28000259
+-10.046875 -0.03125 -0.54100037
+-10.046875 0 -0.68899918
+-11.109375 0.375 0.39599991
+-10.875 0.21875 0.32500076
+-10.046875 0 -0.64500046
+-11.125 0.375 0.43600082
+-10.859375 0.21875 0.36999893
+-10.0625 0 -0.60699844
+-10.9375 0.25 0.39099884
+-10.046875 0 -0.56299973
+-10.015625 0 -0.70599747
+-11.15625 0.40625 0.36999893
+-10.84375 0.21875 0.31399918
+-10.0625 0 -0.52399826
+-10.015625 0.03125 -0.66699982
+-11.109375 0.375 0.42300034
+-10.84375 0.21875 0.35800171
+-10.0625 -0.03125 -0.48099899
+-10.015625 0 -0.625
+-10.875 0.21875 0.39099884
+-10.0625 -0.03125 -0.43799973
+-10.046875 0 -0.58399963
+-11.125 0.4375 0.35499954
+-10.875 0.28125 0.28800201
+-10.015625 -0.0625 -0.38800049
+-10.046875 0 -0.54000092
+-11.125 0.40625 0.40299988
+-10.84375 0.21875 0.3409996
+-10.046875 0 -0.49900055
+-11.109375 0.375 0.44800186
+-10.90625 0.25 0.37200165
+-10.046875 0 -0.45700073
+-10.015625 0.03125 -0.60200119
+-11.125 0.4375 0.34199905
+-10.90625 0.3125 0.26599884
+-10.0625 -0.03125 -0.41500092
+-10.046875 0.03125 -0.56100082
+-11.109375 0.40625 0.38800049
+-10.859375 0.25 0.31999969
+-10.0625 -0.03125 -0.3730011
+-10.046875 0 -0.51799774
+-11.109375 0.40625 0.43300247
+-10.859375 0.25 0.35900116
+-10.0625 -0.03125 -0.32799911
+-10.046875 0 -0.47599792
+-10.921875 0.28125 0.38600159
+-10.0625 0 -0.43600082
+-11.125 0.4375 0.36800003
+-10.859375 0.28125 0.30200195
+-10.0625 0 -0.39400101
+-10 0 -0.5340004
+-11.125 0.40625 0.4109993
+-10.84375 0.25 0.34799957
+-10.0625 -0.03125 -0.34899902
+-10.015625 0 -0.49499893
+-11.09375 0.375 0.46699905
+-10.875 0.25 0.38199997
+-10.0625 -0.03125 -0.30500031
+-10.046875 0 -0.45299911
+-11.125 0.4375 0.35300064
+-10.84375 0.28125 0.29100037
+-10.0625 -0.03125 -0.26300049
+-10.046875 0 -0.40999985
+-11.109375 0.40625 0.39900208
+-10.84375 0.25 0.33300018
+-10.0625 0 -0.36899948
+-11.109375 0.40625 0.44700241
+-10.859375 0.25 0.3730011
+-10.0625 -0.03125 -0.3219986
+-10 0 -0.46500015
+-11.109375 0.4375 0.34300232
+-10.84375 0.28125 0.27400208
+-10.0625 -0.03125 -0.27999878
+-10.046875 0 -0.42699814
+-11.109375 0.40625 0.38899994
+-10.84375 0.25 0.32099915
+-10.0625 -0.03125 -0.23299789
+-10.046875 0 -0.38399887
+-11.109375 0.40625 0.43199921
+-10.859375 0.28125 0.35900116
+-10.046875 0 -0.3390007
+-11.078125 0.40625 0.34199905
+-10.0625 0 -0.29499817
+-11.125 0.4375 0.3710022
+-10.84375 0.28125 0.30900192
+-10.0625 -0.03125 -0.25
+-10.015625 0 -0.39500046
+-11.109375 0.40625 0.42399979
+-10.84375 0.25 0.35400009
+-10.0625 -0.03125 -0.20399857
+-10.046875 0 -0.35400009
+-10.9375 0.3125 0.3710022
+-10.0625 0 -0.31100082
+-11.125 0.4375 0.36000061
+-10.828125 0.25 0.3030014
+-10.0625 0 -0.26599884
+-9.984375 0 -0.40299988
+-11.109375 0.40625 0.41200256
+-10.84375 0.25 0.34400177
+-10.0625 -0.03125 -0.21999741
+-10.046875 0 -0.36700058
+-11.09375 0.375 0.46300125
+-10.875 0.28125 0.37800217
+-10.0625 -0.03125 -0.17200089
+-10.046875 0 -0.3239975
+-11.125 0.4375 0.35000229
+-10.859375 0.28125 0.28000259
+-10.0625 0 -0.27999878
+-11.109375 0.40625 0.39799881
+-10.828125 0.25 0.33200073
+-10.0625 -0.03125 -0.23400116
+-10.015625 0 -0.3789978
+-11.109375 0.40625 0.44700241
+-10.859375 0.28125 0.36899948
+-10.0625 -0.03125 -0.18799973
+-10.046875 0 -0.3390007
+-11.109375 0.4375 0.34600067
+-10.0625 0 -0.29599762
+-11.109375 0.40625 0.38800049
+-10.84375 0.28125 0.31800079
+-10.0625 0 -0.25
+-11.109375 0.40625 0.43600082
+-10.859375 0.28125 0.35700226
+-10.0625 -0.03125 -0.20399857
+-10.046875 0 -0.35099792
+-10.921875 0.28125 0.38899994
+-10.0625 0 -0.30899811
+-11.125 0.4375 0.37200165
+-10.84375 0.25 0.30599976
+-10.0625 0 -0.26300049
+-11.109375 0.40625 0.42399979
+-10.84375 0.25 0.35000229
+-10.0625 -0.03125 -0.2179985
+-10.046875 0 -0.36700058
+-10.90625 0.25 0.38500214
+-10.046875 0 -0.32299805
+-11.125 0.40625 0.36500168
+-10.828125 0.25 0.3030014
+-10.0625 0 -0.27799988
+-10 0 -0.41999817
+-11.125 0.40625 0.41400146
+-10.84375 0.25 0.3409996
+-10.0625 -0.03125 -0.22800064
+-10.046875 0 -0.38000107
+-10.859375 0.25 0.38500214
+-10.0625 0 -0.33699799
+-11.15625 0.40625 0.35200119
+-10.0625 0 -0.29100037
+-10.015625 0 -0.43600082
+-11.125 0.375 0.40200043
+-10.84375 0.21875 0.33399963
+-10.0625 -0.03125 -0.24300003
+-10.015625 0 -0.39199829
+-11.125 0.375 0.45199966
+-10.875 0.25 0.36899948
+-10.0625 0 -0.35099792
+-11.15625 0.40625 0.3409996
+-10.84375 0.25 0.27600098
+-10.046875 -0.03125 -0.30099869
+-10.015625 0 -0.45000076
+-11.125 0.375 0.39300156
+-10.84375 0.21875 0.31999969
+-10.0625 -0.03125 -0.25500107
+-10.015625 0 -0.40499878
+-11.125 0.34375 0.44100189
+-10.875 0.21875 0.36199951
+-10.0625 0 -0.36399841
+-11.125 0.375 0.3390007
+-10.0625 -0.03125 -0.31499863
+-10.015625 0 -0.4640007
+-11.125 0.375 0.38399887
+-10.828125 0.21875 0.31900024
+-10.046875 0 -0.41999817
+-11.125 0.34375 0.43799973
+-10.859375 0.1875 0.36299896
+-10.0625 0 -0.3730011
+-10 0 -0.51799774
+-10.0625 -0.03125 -0.32299805
+-10.046875 0 -0.47599792
+-11.15625 0.375 0.37900162
+-10.859375 0.21875 0.30200195
+-10.046875 0 -0.43099976
+-11.125 0.3125 0.43300247
+-10.84375 0.1875 0.35700226
+-10.046875 -0.03125 -0.38199997
+-10.015625 0 -0.53300095
+-11.078125 0.3125 0.34199905
+-10.046875 -0.03125 -0.33300018
+-10.046875 0 -0.48799896
+-11.171875 0.375 0.36700058
+-10.046875 0 -0.44300079
+-9.984375 0 -0.58799744
+-11.125 0.3125 0.42499924
+-10.0625 -0.03125 -0.39400101
+-10.015625 0 -0.54700089
+-10.046875 0 -0.50099945
+-11.171875 0.34375 0.36199951
+-10.046875 -0.03125 -0.45100021
+-10.015625 0 -0.60300064
+-10.90625 0.1875 0.33100128
+-10.046875 0 -0.55899811
+-10.046875 -0.03125 -0.50999832
+-10 0 -0.6609993
+-11.171875 0.3125 0.35700226
+-10.046875 -0.03125 -0.46299744
+-10.046875 0 -0.61800003
+-10.046875 0 -0.56900024
+-11.046875 0.25 0.33399963
+-10.046875 -0.03125 -0.51900101
+-10.015625 0 -0.67499924
+-11.171875 0.3125 0.35000229
+-10.0625 0 -0.63100052
+-10.046875 -0.03125 -0.58099747
+-10 0 -0.72999954
+-10.046875 -0.03125 -0.52999878
+-10.046875 0 -0.68799973
+-10.046875 0 -0.63899994
+-10 0 -0.78699875
+-10.046875 -0.03125 -0.5890007
+-10.015625 0 -0.74399948
+-10.046875 0 -0.69799805
+-9.9375 -0.03125 -0.83599854
+-10.046875 -0.03125 -0.64799881
+-10.015625 0 -0.80199814
+-10.046875 0 -0.75999832
+-10.046875 0 -0.78899765
+-10.046875 -0.03125 -0.73799896
+-10.015625 0.03125 -0.89299774
+-10.015625 -0.03125 -0.68600082
+-10.015625 0 -0.84499741
+-10.046875 0 -0.79899979
+-10 0.03125 -0.95199966
+-10.046875 -0.03125 -0.75
+-10.015625 0 -0.90599823
+-10.015625 0 -0.85799789
+-10 0.03125 -1.0109978
+-9.796875 0.4375 -2.6969986
+-10.015625 -0.03125 -0.80999756
+-10.015625 0 -0.96699905
+-9.796875 0.40625 -2.6520004
+-10.015625 0 -0.92099762
+-9.984375 0.03125 -1.072998
+-9.765625 0.4375 -2.7589989
+-10.015625 -0.03125 -0.8730011
+-10.015625 0 -1.0289993
+-9.796875 0.4375 -2.7159996
+-10.015625 0 -0.98099899
+-10 0.03125 -1.1349983
+-9.828125 0.40625 -2.6709976
+-10.015625 -0.03125 -0.93199921
+-10 0 -1.0890007
+-9.796875 0.4375 -2.7789993
+-10.015625 0 -1.0429993
+-9.984375 0.03125 -1.1940002
+-9.796875 0.40625 -2.7350006
+-10.015625 -0.03125 -0.99499893
+-10 0 -1.1499977
+-9.828125 0.40625 -2.6909981
+-10.046875 0 -1.105999
+-9.984375 0.03125 -1.2579994
+-9.84375 0.375 -2.6459999
+-9.828125 0.40625 -2.7989998
+-10.015625 -0.03125 -1.0569992
+-10 0 -1.2129974
+-9.828125 0.40625 -2.7550011
+-10.015625 0 -1.1669998
+-9.984375 0.03125 -1.3219986
+-9.8125 0.375 -2.7109985
+-10 -0.03125 -1.1170006
+-10 0 -1.276001
+-9.84375 0.34375 -2.6669998
+-10.015625 0 -1.2299995
+-10 0.03125 -1.3849983
+-9.8125 0.375 -2.776001
+-10 -0.03125 -1.1779976
+-10 0 -1.3390007
+-9.84375 0.34375 -2.7319984
+-10 0 -1.2910004
+-9.984375 0.03125 -1.4469986
+-9.859375 0.34375 -2.6879997
+-10 0 -1.401001
+-9.953125 0.03125 -1.5519981
+-9.859375 0.3125 -2.6419983
+-9.84375 0.34375 -2.7970009
+-10.015625 0 -1.3540001
+-9.984375 0.03125 -1.5099983
+-9.859375 0.34375 -2.7519989
+-10 0 -1.4650002
+-9.953125 0.03125 -1.6170006
+-9.859375 0.3125 -2.7080002
+-10 -0.03125 -1.4169998
+-9.984375 0.03125 -1.572998
+-9.875 0.28125 -2.6639977
+-9.84375 0.3125 -2.8169975
+-10 0 -1.5289993
+-9.984375 0.03125 -1.6839981
+-9.859375 0.28125 -2.7729988
+-10 -0.03125 -1.480999
+-10 0.03125 -1.6389999
+-9.875 0.28125 -2.7290001
+-10 0 -1.5919991
+-9.984375 0.03125 -1.7480011
+-9.875 0.25 -2.6839981
+-9.875 0.3125 -2.8400002
+-9.984375 -0.0625 -1.5410004
+-10 0 -1.7029991
+-9.953125 0.03125 -1.8579979
+-9.875 0.28125 -2.7949982
+-10 -0.03125 -1.6549988
+-9.984375 0.03125 -1.8120003
+-9.875 0.25 -2.75
+-9.984375 0 -1.7679977
+-9.96875 0.03125 -1.9249992
+-9.875 0.21875 -2.704998
+-9.984375 -0.03125 -1.718998
+-9.984375 0 -1.8789978
+-9.90625 0.21875 -2.6619987
+-9.875 0.25 -2.8159981
+-10 0 -1.8339996
+-9.96875 0.03125 -1.9889984
+-9.890625 0.21875 -2.7729988
+-9.984375 -0.03125 -1.7859993
+-9.984375 0 -1.9449997
+-9.953125 0.03125 -2.098999
+-9.90625 0.21875 -2.7280006
+-9.984375 0 -1.8979988
+-9.984375 0.03125 -2.0559998
+-9.9375 0.1875 -2.6829987
+-9.890625 0.21875 -2.8390007
+-9.984375 0 -2.0099983
+-9.953125 0.03125 -2.1650009
+-9.9375 0.15625 -2.6380005
+-9.90625 0.21875 -2.7949982
+-9.984375 -0.03125 -1.9630013
+-9.984375 0.03125 -2.1209984
+-9.921875 0.03125 -2.276001
+-9.9375 0.1875 -2.75
+-9.984375 0 -2.0760002
+-9.96875 0.03125 -2.2329979
+-9.90625 0.125 -2.7039986
+-9.984375 0 -2.1870003
+-9.953125 0.03125 -2.343998
+-9.953125 0.125 -2.6599998
+-9.90625 0.15625 -2.8159981
+-9.984375 -0.03125 -2.1409988
+-9.96875 0.03125 -2.2999992
+-9.953125 0.15625 -2.7729988
+-9.984375 0 -2.2539978
+-9.953125 0.03125 -2.4109993
+-9.953125 0.125 -2.7280006
+-9.984375 -0.03125 -2.2080002
+-9.984375 0.03125 -2.368
+-9.921875 0.03125 -2.5239983
+-9.96875 0.09375 -2.6839981
+-9.984375 0 -2.3219986
+-9.953125 0.03125 -2.4799995
+-9.984375 0.09375 -2.6399994
+-9.953125 0.125 -2.7970009
+-9.96875 0 -2.4360008
+-9.953125 0.03125 -2.5929985
+-9.96875 0.09375 -2.7529984
+-9.984375 -0.03125 -2.3899994
+-9.96875 0.03125 -2.5489998
+-9.984375 0.09375 -2.7089996
+-9.96875 0 -2.5039978
+-9.984375 0.0625 -2.6639977
+-9.953125 0.0625 -2.8209991
+-9.96875 -0.03125 -2.4580002
+-9.96875 0.03125 -2.618
+-9.96875 0.0625 -2.7770004
+-9.96875 -0.03125 -2.572998
+-9.984375 0.03125 -2.7340012
+-9.875 0.03125 -2.8889999
+-10 0.03125 -2.6899986
+-9.953125 0.03125 -2.8470001
+-10 0 -2.6459999
+-9.96875 0.03125 -2.8029976
+-9.921875 0.0625 -2.9630013
+-10.015625 0 -2.7609978
+-9.953125 0.03125 -2.9199982
+-9.90625 0.0625 -3.0779991
+-10.015625 0 -2.7169991
+-9.96875 0 -2.8759995
+-9.921875 0.03125 -3.0349998
+-10.046875 -0.03125 -2.6739998
+-9.96875 -0.03125 -2.829998
+-9.953125 0.03125 -2.9899979
+-9.90625 0.0625 -3.151001
+-10.015625 -0.03125 -2.7900009
+-9.96875 0 -2.947998
+-9.953125 0.03125 -3.1069984
+-10.046875 -0.03125 -2.7439995
+-9.96875 0.03125 -3.0629997
+-9.890625 0.03125 -3.2229996
+-10.0625 -0.0625 -2.7000008
+-9.9375 -0.03125 -3.0200005
+-9.953125 0.03125 -3.1790009
+-9.90625 0.0625 -3.3390007
+-10.0625 -0.09375 -2.6559982
+-10.015625 -0.0625 -2.8169975
+-9.953125 0 -3.1359978
+-9.921875 0.03125 -3.2959976
+-10.015625 -0.09375 -2.7709999
+-9.921875 -0.03125 -3.0909996
+-9.953125 0.03125 -3.2519989
+-9.90625 0.0625 -3.4119987
+-10.078125 -0.09375 -2.7299995
+-9.9375 -0.03125 -3.2080002
+-9.953125 0.03125 -3.3689995
+-9.875 0.0625 -3.5289993
+-10.078125 -0.125 -2.6839981
+-9.953125 0 -3.3250008
+-9.921875 0.03125 -3.4850006
+-10.09375 -0.15625 -2.6399994
+-10.0625 -0.125 -2.8009987
+-9.921875 -0.03125 -3.2819977
+-9.921875 0 -3.4419975
+-9.890625 0.03125 -3.6030006
+-10.03125 -0.15625 -2.7560005
+-9.953125 0 -3.3989983
+-9.921875 0.03125 -3.5599976
+-9.875 0.0625 -3.7210007
+-10.09375 -0.15625 -2.711998
+-9.953125 0 -3.5169983
+-9.90625 0.03125 -3.6779976
+-10.109375 -0.1875 -2.6709976
+-10.078125 -0.15625 -2.8310013
+-9.921875 -0.03125 -3.473999
+-9.921875 0.03125 -3.6349983
+-9.875 0.03125 -3.7970009
+-10.09375 -0.15625 -2.7869987
+-9.953125 0 -3.5919991
+-9.921875 0.03125 -3.7529984
+-9.859375 0.0625 -3.9160004
+-10.109375 -0.1875 -2.743
+-9.921875 0 -3.7099991
+-9.890625 0.03125 -3.8719978
+-10.125 -0.21875 -2.697998
+-9.921875 -0.03125 -3.6669998
+-9.921875 0.03125 -3.8279991
+-9.875 0.03125 -3.9910011
+-10.125 -0.25 -2.6539993
+-10.109375 -0.21875 -2.8159981
+-9.90625 0 -3.7859993
+-9.90625 0.03125 -3.9469986
+-9.859375 0.0625 -4.112999
+-10.125 -0.21875 -2.7719994
+-9.90625 0 -3.9039993
+-9.890625 0.03125 -4.0669975
+-10.15625 -0.25 -2.7280006
+-9.90625 -0.03125 -3.8619995
+-9.921875 0.03125 -4.0249977
+-9.875 0.0625 -4.1879997
+-10.15625 -0.28125 -2.6829987
+-9.90625 0 -3.9819984
+-9.90625 0.03125 -4.144001
+-9.859375 0.0625 -4.3089981
+-10.1875 -0.3125 -2.637001
+-10.171875 -0.28125 -2.8009987
+-9.90625 0 -4.1009979
+-9.890625 0.03125 -4.2630005
+-9.828125 0.0625 -4.4290009
+-10.171875 -0.3125 -2.7550011
+-9.890625 -0.03125 -4.0579987
+-9.890625 0 -4.2200012
+-9.84375 0.03125 -4.3839989
+-10.1875 -0.3125 -2.7099991
+-9.90625 0 -4.1759987
+-9.90625 0.03125 -4.3380013
+-9.859375 0.0625 -4.5039978
+-10.1875 -0.34375 -2.6650009
+-9.890625 0 -4.2959976
+-9.890625 0.03125 -4.4589996
+-9.8125 0.0625 -4.6259995
+-10.1875 -0.34375 -2.7819977
+-9.890625 -0.03125 -4.2529984
+-9.890625 0 -4.4150009
+-9.84375 0.03125 -4.579998
+-9.890625 -0.03125 -4.3719978
+-9.890625 0.03125 -4.5349998
+-9.859375 0.0625 -4.7010002
+-9.890625 0 -4.4920006
+-9.875 0.03125 -4.6569977
+-9.828125 0.0625 -4.8239975
+-9.875 -0.0625 -4.4500008
+-9.84375 0.03125 -4.7779999
+-9.875 -0.03125 -4.5699997
+-9.828125 0.0625 -4.8999977
+-9.921875 0.0625 -4.848999
+-9.828125 0.0625 -5.0219994
+-9.875 0.0625 -4.973999
+-9.796875 0.0625 -5.1459999
+-9.828125 0.0625 -5.0970001
+-9.8125 0.0625 -5.2210007
+-9.859375 0.0625 -5.2959976
+-9.828125 0.0625 -5.4209976
PCL_ADD_TEST (outofcore_test test_outofcore
FILES test_outofcore.cpp
LINK_WITH pcl_gtest pcl_common pcl_io pcl_filters pcl_outofcore
- #ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd
+ #ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd"
)
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
-using namespace pcl;
-
#include <pcl/outofcore/outofcore.h>
#include <pcl/outofcore/outofcore_impl.h>
const Eigen::Vector3d max (1024, 1024, 1024);
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
const Eigen::Vector3d min (-1,-1,-1);
const Eigen::Vector3d max (1,1,1);
- PointCloud<PointT>::Ptr cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT> ());
cloud->width = 8;
cloud->height =1;
cloud->reserve (8);
const Eigen::Vector3d max (1024,1024,1024);
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
- PointCloud<PointT>::Ptr second_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr second_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
const Eigen::Vector3d max (1024,1024,1024);
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
- PointCloud<PointT>::Ptr second_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr second_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
const boost::uint64_t depth = 2;
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
pcl::PCLPointCloud2::Ptr input_cloud (new pcl::PCLPointCloud2 ());
- toPCLPointCloud2<PointXYZ> (point_cloud, *input_cloud);
+ pcl::toPCLPointCloud2<pcl::PointXYZ> (point_cloud, *input_cloud);
ASSERT_EQ (point_cloud.width*point_cloud.height, input_cloud->width*input_cloud->height);
octree_disk octreeA (min, max, smallest_voxel_dim, filename_otreeA, "ECEF");
const Eigen::Vector3d max (100.1, 100.1, 100.1);
//create a point cloud
- PointCloud<PointT>::Ptr first_cloud (new PointCloud<PointT> ());
- PointCloud<PointT>::Ptr second_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr first_cloud (new pcl::PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr second_cloud (new pcl::PointCloud<PointT> ());
first_cloud->width = numPts;
first_cloud->height = 1;
pcl::PCLPointCloud2::Ptr first_cloud_ptr (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr second_cloud_ptr (new pcl::PCLPointCloud2 ());
- toPCLPointCloud2<PointT> (*first_cloud, *first_cloud_ptr);
- toPCLPointCloud2<PointT> (*second_cloud, *second_cloud_ptr);
+ pcl::toPCLPointCloud2<PointT> (*first_cloud, *first_cloud_ptr);
+ pcl::toPCLPointCloud2<PointT> (*second_cloud, *second_cloud_ptr);
//Create an outofcore tree which just concatenates the two clouds into a single PCD in the root node. Check that the number of points is correct.
octree_disk shallow_outofcore (0/*depth*/, min, max, filename_otreeB, "ECEF");
const boost::uint64_t depth = 2;
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
const boost::uint64_t depth = 2;
//create a point cloud
- PointCloud<PointT>::Ptr test_cloud (new PointCloud<PointT> ());
+ pcl::PointCloud<PointT>::Ptr test_cloud (new pcl::PointCloud<PointT> ());
test_cloud->width = numPts;
test_cloud->height = 1;
uint64_t total_octreeB_LOD_query = 0;
- for (int i=0; i <= octreeB.getDepth (); i++)
+ for (boost::uint64_t i=0; i <= octreeB.getDepth (); i++)
{
octreeB.queryBBIncludes (min, max, i, query_result_b);
total_octreeB_LOD_query += query_result_b->width*query_result_b->height;
PCL_ADD_TEST(a_registration_test test_registration
FILES test_registration.cpp
LINK_WITH pcl_gtest pcl_io pcl_registration pcl_features pcl_search pcl_kdtree pcl_kdtree
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd ${PCL_SOURCE_DIR}/test/bun4.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd" "${PCL_SOURCE_DIR}/test/bun4.pcd" "${PCL_SOURCE_DIR}/test/milk_color.pcd")
PCL_ADD_TEST(registration_api test_registration_api
FILES test_registration_api.cpp test_registration_api_data.h
LINK_WITH pcl_gtest pcl_io pcl_registration pcl_features pcl_kdtree
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd ${PCL_SOURCE_DIR}/test/bun4.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd" "${PCL_SOURCE_DIR}/test/bun4.pcd")
PCL_ADD_TEST(registration_warp_api test_warps
FILES test_warps.cpp
PCL_ADD_TEST(correspondence_rejectors test_correspondence_rejectors
FILES test_correspondence_rejectors.cpp
LINK_WITH pcl_gtest pcl_io pcl_registration pcl_features
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bunny.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bunny.pcd")
#include <pcl/features/fpfh.h>
#include <pcl/registration/registration.h>
#include <pcl/registration/icp.h>
+#include <pcl/registration/joint_icp.h>
#include <pcl/registration/icp_nl.h>
#include <pcl/registration/gicp.h>
+#include <pcl/registration/gicp6d.h>
#include <pcl/registration/transformation_estimation_point_to_plane.h>
#include <pcl/registration/transformation_validation_euclidean.h>
+#include <pcl/registration/correspondence_rejection_median_distance.h>
+#include <pcl/registration/correspondence_rejection_sample_consensus.h>
+#include <pcl/registration/correspondence_rejection_surface_normal.h>
+#include <pcl/registration/correspondence_estimation_normal_shooting.h>
#include <pcl/registration/ia_ransac.h>
#include <pcl/registration/pyramid_feature_matching.h>
#include <pcl/features/ppf.h>
using namespace std;
PointCloud<PointXYZ> cloud_source, cloud_target, cloud_reg;
+PointCloud<PointXYZRGBA> cloud_with_color;
template <typename PointSource, typename PointTarget>
class RegistrationWrapper : public Registration<PointSource, PointTarget>
// EXPECT_EQ (transformation (3, 3), 1);
}
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+sampleRandomTransform (Eigen::Affine3f &trans, float max_angle, float max_trans)
+{
+ // Sample random transform
+ Eigen::Vector3f axis((float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX);
+ axis.normalize();
+ float angle = (float)rand() / RAND_MAX * max_angle;
+ Eigen::Vector3f translation((float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX);
+ translation *= max_trans;
+ Eigen::Affine3f rotation(Eigen::AngleAxis<float>(angle, axis));
+ trans = Eigen::Translation3f(translation) * rotation;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, IterativeClosestPointWithRejectors)
+{
+ IterativeClosestPoint<PointXYZ, PointXYZ> reg;
+ reg.setMaximumIterations (50);
+ reg.setTransformationEpsilon (1e-8);
+ reg.setMaxCorrespondenceDistance (0.15);
+ // Add a median distance rejector
+ pcl::registration::CorrespondenceRejectorMedianDistance::Ptr rej_med (new pcl::registration::CorrespondenceRejectorMedianDistance);
+ rej_med->setMedianFactor (4.0);
+ reg.addCorrespondenceRejector (rej_med);
+ // Also add a SaC rejector
+ pcl::registration::CorrespondenceRejectorSampleConsensus<PointXYZ>::Ptr rej_samp (new pcl::registration::CorrespondenceRejectorSampleConsensus<PointXYZ>);
+ reg.addCorrespondenceRejector (rej_samp);
+
+ size_t ntransforms = 10;
+ for (size_t t = 0; t < ntransforms; t++)
+ {
+ // Sample a fixed offset between cloud pairs
+ Eigen::Affine3f delta_transform;
+ sampleRandomTransform (delta_transform, 0., 0.05);
+ // Sample random global transform for each pair, to make sure we aren't biased around the origin
+ Eigen::Affine3f net_transform;
+ sampleRandomTransform (net_transform, 2*M_PI, 10.);
+
+ PointCloud<PointXYZ>::ConstPtr source (cloud_source.makeShared ());
+ PointCloud<PointXYZ>::Ptr source_trans (new PointCloud<PointXYZ>);
+ PointCloud<PointXYZ>::Ptr target_trans (new PointCloud<PointXYZ>);
+
+ pcl::transformPointCloud (*source, *source_trans, delta_transform.inverse () * net_transform);
+ pcl::transformPointCloud (*source, *target_trans, net_transform);
+
+ reg.setInputSource (source_trans);
+ reg.setInputTarget (target_trans);
+
+ // Register
+ reg.align (cloud_reg);
+ Eigen::Matrix4f trans_final = reg.getFinalTransformation ();
+ // Translation should be within 1cm
+ for (int y = 0; y < 4; y++)
+ EXPECT_NEAR (trans_final (y, 3), delta_transform (y, 3), 1E-2);
+ // Rotation within .1
+ for (int y = 0; y < 4; y++)
+ for (int x = 0; x < 3; x++)
+ EXPECT_NEAR (trans_final (y, x), delta_transform (y, x), 1E-1);
+
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, JointIterativeClosestPoint)
+{
+ // Set up
+ JointIterativeClosestPoint<PointXYZ, PointXYZ> reg;
+ reg.setMaximumIterations (50);
+ reg.setTransformationEpsilon (1e-8);
+ reg.setMaxCorrespondenceDistance (0.25); // Making sure the correspondence distance > the max translation
+ // Add a median distance rejector
+ pcl::registration::CorrespondenceRejectorMedianDistance::Ptr rej_med (new pcl::registration::CorrespondenceRejectorMedianDistance);
+ rej_med->setMedianFactor (4.0);
+ reg.addCorrespondenceRejector (rej_med);
+ // Also add a SaC rejector
+ pcl::registration::CorrespondenceRejectorSampleConsensus<PointXYZ>::Ptr rej_samp (new pcl::registration::CorrespondenceRejectorSampleConsensus<PointXYZ>);
+ reg.addCorrespondenceRejector (rej_samp);
+
+ size_t ntransforms = 10;
+ for (size_t t = 0; t < ntransforms; t++)
+ {
+
+ // Sample a fixed offset between cloud pairs
+ Eigen::Affine3f delta_transform;
+ // No rotation, since at a random offset this could make it converge to a wrong (but still reasonable) result
+ sampleRandomTransform (delta_transform, 0., 0.10);
+ // Make a few transformed versions of the data, plus noise
+ size_t nclouds = 5;
+ for (size_t i = 0; i < nclouds; i++)
+ {
+ PointCloud<PointXYZ>::ConstPtr source (cloud_source.makeShared ());
+ // Sample random global transform for each pair
+ Eigen::Affine3f net_transform;
+ sampleRandomTransform (net_transform, 2*M_PI, 10.);
+ // And apply it to the source and target
+ PointCloud<PointXYZ>::Ptr source_trans (new PointCloud<PointXYZ>);
+ PointCloud<PointXYZ>::Ptr target_trans (new PointCloud<PointXYZ>);
+ pcl::transformPointCloud (*source, *source_trans, delta_transform.inverse () * net_transform);
+ pcl::transformPointCloud (*source, *target_trans, net_transform);
+ // Add these to the joint solver
+ reg.addInputSource (source_trans);
+ reg.addInputTarget (target_trans);
+
+ }
+
+ // Register
+ reg.align (cloud_reg);
+ Eigen::Matrix4f trans_final = reg.getFinalTransformation ();
+ for (int y = 0; y < 4; y++)
+ for (int x = 0; x < 4; x++)
+ EXPECT_NEAR (trans_final (y, x), delta_transform (y, x), 1E-2);
+
+ EXPECT_TRUE (cloud_reg.empty ()); // By definition, returns an empty cloud
+ // Clear
+ reg.clearInputSources ();
+ reg.clearInputTargets ();
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TEST (PCL, IterativeClosestPointNonLinear)
{
reg.setInputTarget (tgt);
reg.setMaximumIterations (50);
reg.setTransformationEpsilon (1e-8);
+ // Use a correspondence estimator which needs normals
+ registration::CorrespondenceEstimationNormalShooting<PointT, PointT, PointT>::Ptr ce (new registration::CorrespondenceEstimationNormalShooting<PointT, PointT, PointT>);
+ reg.setCorrespondenceEstimation (ce);
+ // Add rejector
+ registration::CorrespondenceRejectorSurfaceNormal::Ptr rej (new registration::CorrespondenceRejectorSurfaceNormal);
+ rej->setThreshold (0); //Could be a lot of rotation -- just make sure they're at least within 0 degrees
+ reg.addCorrespondenceRejector (rej);
// Register
reg.align (output);
EXPECT_EQ (int (output.points.size ()), int (cloud_source.points.size ()));
- EXPECT_LT (reg.getFitnessScore (), 0.001);
+ EXPECT_LT (reg.getFitnessScore (), 0.005);
// Check again, for all possible caching schemes
for (int iter = 0; iter < 4; iter++)
// Register
reg.align (output);
EXPECT_EQ (int (output.points.size ()), int (cloud_source.points.size ()));
- EXPECT_LT (reg.getFitnessScore (), 0.001);
+ EXPECT_LT (reg.getFitnessScore (), 0.005);
}
EXPECT_EQ (int (output.points.size ()), int (cloud_source.points.size ()));
EXPECT_LT (reg.getFitnessScore (), 0.001);
}
-
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (PCL, GeneralizedIterativeClosestPoint6D)
+{
+ typedef PointXYZRGBA PointT;
+ Eigen::Affine3f delta_transform;
+ PointCloud<PointT>::Ptr src_full (new PointCloud<PointT>);
+ copyPointCloud (cloud_with_color, *src_full);
+ PointCloud<PointT>::Ptr tgt_full (new PointCloud<PointT>);
+ sampleRandomTransform (delta_transform, M_PI/0.1, .03);
+ pcl::transformPointCloud (cloud_with_color, *tgt_full, delta_transform);
+ PointCloud<PointT> output;
+
+ // VoxelGrid filter
+ PointCloud<PointT>::Ptr src (new PointCloud<PointT>);
+ PointCloud<PointT>::Ptr tgt (new PointCloud<PointT>);
+ pcl::VoxelGrid<PointT> sor;
+ sor.setLeafSize (0.02f, 0.02f, 0.02f);
+ sor.setInputCloud (src_full);
+ sor.filter (*src);
+ sor.setInputCloud (tgt_full);
+ sor.filter (*tgt);
+
+ GeneralizedIterativeClosestPoint6D reg;
+ reg.setInputSource (src);
+ reg.setInputTarget (tgt);
+ reg.setMaximumIterations (50);
+ reg.setTransformationEpsilon (1e-8);
+
+ // Register
+ reg.align (output);
+ EXPECT_EQ (int (output.points.size ()), int (src->points.size ()));
+ EXPECT_LT (reg.getFitnessScore (), 0.003);
+
+ // Check again, for all possible caching schemes
+ for (int iter = 0; iter < 4; iter++)
+ {
+ bool force_cache = (bool) iter/2;
+ bool force_cache_reciprocal = (bool) iter%2;
+ pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
+ // Ensure that, when force_cache is not set, we are robust to the wrong input
+ if (force_cache)
+ tree->setInputCloud (tgt);
+ reg.setSearchMethodTarget (tree, force_cache);
+
+ pcl::search::KdTree<PointT>::Ptr tree_recip (new pcl::search::KdTree<PointT>);
+ if (force_cache_reciprocal)
+ tree_recip->setInputCloud (src);
+ reg.setSearchMethodSource (tree_recip, force_cache_reciprocal);
+
+ // Register
+ reg.align (output);
+ EXPECT_EQ (int (output.points.size ()), int (src->points.size ()));
+ EXPECT_LT (reg.getFitnessScore (), 0.003);
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int
main (int argc, char** argv)
{
- if (argc < 3)
+ if (argc < 4)
{
- std::cerr << "No test files given. Please download `bun0.pcd` and `bun4.pcd` and pass their path to the test." << std::endl;
+ std::cerr << "No test files given. Please download `bun0.pcd`, `bun4.pcd` and `milk_color.pcd` pass their path to the test." << std::endl;
return (-1);
}
std::cerr << "Failed to read test file. Please download `bun4.pcd` and pass its path to the test." << std::endl;
return (-1);
}
+ if (loadPCDFile (argv[3], cloud_with_color) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `milk_color.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
testing::InitGoogleTest (&argc, argv);
return (RUN_ALL_TESTS ());
// Check if the estimation with correspondences gives the same results
Eigen::Matrix4f T_SVD_2;
pcl::Correspondences corr; corr.reserve (source->size ());
- for (int i=0; i<source->size (); ++i) corr.push_back (pcl::Correspondence (i, i, 0.f));
+ for (size_t i=0; i<source->size (); ++i) corr.push_back (pcl::Correspondence (i, i, 0.f));
trans_est_svd.estimateRigidTransformation(*source, *target, corr, T_SVD_2);
const Eigen::Quaternionf R_SVD_2 (T_SVD_2.topLeftCorner <3, 3> ());
// Check if the estimation with correspondences gives the same results
Eigen::Matrix4f T_DQ_2;
pcl::Correspondences corr; corr.reserve (source->size ());
- for (int i=0; i<source->size (); ++i) corr.push_back (pcl::Correspondence (i, i, 0.f));
+ for (size_t i=0; i<source->size (); ++i) corr.push_back (pcl::Correspondence (i, i, 0.f));
trans_est_dual_quaternion.estimateRigidTransformation(*source, *target, corr, T_DQ_2);
const Eigen::Quaternionf R_DQ_2 (T_DQ_2.topLeftCorner <3, 3> ());
Eigen::Matrix4f T_LM_2_float;
pcl::Correspondences corr;
corr.reserve (source->size ());
- for (int i = 0; i < source->size (); ++i)
+ for (size_t i = 0; i < source->size (); ++i)
corr.push_back (pcl::Correspondence (i, i, 0.f));
trans_est_lm_float.estimateRigidTransformation (*source, *target, corr, T_LM_2_float);
Eigen::Matrix4d T_LM_2_double;
corr.clear ();
corr.reserve (source->size ());
- for (int i = 0; i < source->size (); ++i)
+ for (size_t i = 0; i < source->size (); ++i)
corr.push_back (pcl::Correspondence (i, i, 0.f));
trans_est_lm_double.estimateRigidTransformation (*source, *target, corr, T_LM_2_double);
--- /dev/null
+# .PCD v0.7 - Point Cloud Data file format
+VERSION 0.7
+FIELDS x y z
+SIZE 4 4 4
+TYPE F F F
+COUNT 1 1 1
+WIDTH 32087
+HEIGHT 1
+VIEWPOINT 0 0 0 1 0 0 0
+POINTS 32087
+DATA ascii
+0.13058 0.24871 -1.1732
+0.13169 0.24871 -1.1732
+0.12191 0.24796 -1.1749
+0.12285 0.24763 -1.1733
+0.1239 0.24752 -1.1728
+0.12489 0.24729 -1.1717
+0.12595 0.24721 -1.1713
+0.12702 0.24714 -1.171
+0.12809 0.24707 -1.1706
+0.1292 0.24707 -1.1706
+0.1303 0.24708 -1.1707
+0.13255 0.24716 -1.1711
+0.13374 0.24731 -1.1718
+0.13488 0.24738 -1.1721
+0.13826 0.24749 -1.1727
+0.11848 0.24663 -1.1738
+0.12052 0.24627 -1.1721
+0.12162 0.24627 -1.1721
+0.12253 0.24588 -1.1702
+0.12463 0.24566 -1.1692
+0.12672 0.24544 -1.1681
+0.12889 0.24539 -1.1679
+0.12996 0.24532 -1.1675
+0.13109 0.24539 -1.1678
+0.13335 0.24549 -1.1684
+0.13563 0.24563 -1.169
+0.13672 0.24562 -1.1689
+0.13794 0.24583 -1.17
+0.13905 0.24583 -1.17
+0.14015 0.24583 -1.17
+0.14253 0.24613 -1.1714
+0.1142 0.24584 -1.1754
+0.11517 0.24555 -1.174
+0.11615 0.24527 -1.1726
+0.11717 0.2451 -1.1718
+0.12127 0.24445 -1.1687
+0.12977 0.24387 -1.1658
+0.13643 0.24399 -1.1664
+0.1386 0.24394 -1.1662
+0.14319 0.24427 -1.1678
+0.14447 0.24457 -1.1692
+0.11191 0.24457 -1.1746
+0.1129 0.24431 -1.1733
+0.1139 0.24408 -1.1722
+0.11588 0.24361 -1.1699
+0.11791 0.24324 -1.1681
+0.11993 0.24287 -1.1663
+0.12205 0.24271 -1.1656
+0.12629 0.24241 -1.1641
+0.12841 0.24227 -1.1634
+0.13064 0.24235 -1.1638
+0.13512 0.24251 -1.1646
+0.13722 0.24234 -1.1637
+0.13938 0.24229 -1.1635
+0.14159 0.24231 -1.1636
+0.14403 0.24273 -1.1656
+0.14523 0.2429 -1.1664
+0.1464 0.24301 -1.167
+0.1049 0.24519 -1.183
+0.10586 0.24482 -1.1812
+0.10872 0.24375 -1.176
+0.10966 0.24337 -1.1742
+0.11065 0.24312 -1.1729
+0.11262 0.2426 -1.1704
+0.14486 0.24119 -1.1635
+0.14735 0.24167 -1.1658
+0.14863 0.24196 -1.1672
+0.14994 0.2423 -1.1689
+0.10465 0.24348 -1.1801
+0.10563 0.24319 -1.1787
+0.10655 0.24275 -1.1765
+0.10746 0.24229 -1.1743
+0.10941 0.24172 -1.1715
+0.11139 0.24123 -1.1691
+0.11339 0.2408 -1.167
+0.11542 0.24043 -1.1652
+0.11744 0.24008 -1.1634
+0.11956 0.23993 -1.1627
+0.12166 0.23974 -1.1618
+0.12376 0.23957 -1.1609
+0.12807 0.23945 -1.1603
+0.13684 0.23948 -1.1605
+0.14093 0.239 -1.1581
+0.14331 0.23933 -1.1598
+0.14582 0.23987 -1.1624
+0.14828 0.2403 -1.1645
+0.15093 0.24103 -1.1681
+0.1524 0.24161 -1.1709
+0.10237 0.24224 -1.1795
+0.10336 0.24196 -1.1781
+0.10436 0.24169 -1.1768
+0.10628 0.24102 -1.1735
+0.10819 0.24036 -1.1702
+0.15192 0.23975 -1.1672
+0.15332 0.24022 -1.1695
+0.15461 0.24051 -1.1709
+0.10018 0.24121 -1.1799
+0.10115 0.24087 -1.1782
+0.10313 0.24031 -1.1754
+0.10507 0.23967 -1.1723
+0.107 0.23906 -1.1693
+0.10898 0.23857 -1.1669
+0.11301 0.2378 -1.163
+0.1171 0.2372 -1.1601
+0.12134 0.23693 -1.1587
+0.12556 0.23664 -1.1573
+0.12992 0.23663 -1.1572
+0.13429 0.23666 -1.1574
+0.13861 0.23658 -1.1569
+0.14291 0.23647 -1.1564
+0.14527 0.23677 -1.1579
+0.14773 0.23721 -1.1601
+0.15023 0.23771 -1.1625
+0.1529 0.23846 -1.1662
+0.15566 0.23932 -1.1705
+0.1571 0.23983 -1.173
+0.099974 0.2396 -1.1774
+0.15664 0.23804 -1.1696
+0.15804 0.23848 -1.1718
+0.098782 0.23829 -1.1765
+0.10077 0.23776 -1.1738
+0.10272 0.23714 -1.1707
+0.10664 0.23606 -1.1653
+0.14494 0.23405 -1.1552
+0.14969 0.23468 -1.1584
+0.15496 0.23604 -1.1652
+0.15767 0.23681 -1.169
+0.15893 0.23705 -1.1702
+0.1586 0.23546 -1.1678
+0.15987 0.23572 -1.169
+0.096467 0.23583 -1.1753
+0.10047 0.23483 -1.1702
+0.10435 0.23365 -1.1643
+0.10837 0.23286 -1.1603
+0.11242 0.23219 -1.1569
+0.11652 0.23166 -1.1542
+0.12079 0.2315 -1.1534
+0.12506 0.23136 -1.1527
+0.12937 0.2313 -1.1524
+0.13371 0.23128 -1.1523
+0.13802 0.23122 -1.152
+0.14242 0.23131 -1.1524
+0.14692 0.23157 -1.1537
+0.15178 0.23234 -1.1576
+0.157 0.23362 -1.164
+0.1596 0.23421 -1.167
+0.16093 0.23455 -1.1687
+0.095352 0.23471 -1.1752
+0.16064 0.23302 -1.1666
+0.16205 0.23347 -1.1689
+0.16534 0.23502 -1.1767
+0.094246 0.2336 -1.1752
+0.096207 0.23299 -1.1721
+0.098213 0.23251 -1.1696
+0.15909 0.23126 -1.1632
+0.16152 0.23161 -1.165
+0.16314 0.23235 -1.1688
+0.16493 0.23332 -1.1737
+0.16648 0.23395 -1.1769
+0.16269 0.23062 -1.1655
+0.16611 0.23232 -1.1742
+0.16753 0.23276 -1.1765
+0.092149 0.23168 -1.1767
+0.094008 0.2308 -1.1722
+0.09602 0.23033 -1.1698
+0.099875 0.22906 -1.1632
+0.10388 0.22822 -1.1589
+0.10795 0.22758 -1.1556
+0.11198 0.22692 -1.1523
+0.11614 0.22657 -1.1504
+0.12047 0.22654 -1.1503
+0.12467 0.2263 -1.149
+0.12895 0.22621 -1.1486
+0.13323 0.22613 -1.1481
+0.13763 0.22624 -1.1487
+0.142 0.2263 -1.149
+0.14637 0.22636 -1.1493
+0.15105 0.22688 -1.152
+0.15607 0.22787 -1.1571
+0.16098 0.22864 -1.161
+0.16229 0.22895 -1.1626
+0.16393 0.22971 -1.1665
+0.16723 0.23124 -1.1744
+0.16863 0.23163 -1.1764
+0.091904 0.22996 -1.1736
+0.092922 0.22974 -1.1725
+0.094927 0.22925 -1.1699
+0.16199 0.22743 -1.1604
+0.16517 0.2288 -1.1675
+0.16832 0.2301 -1.1742
+0.16971 0.23048 -1.1762
+0.089969 0.22956 -1.1772
+0.090835 0.22895 -1.1741
+0.091826 0.22866 -1.1726
+0.093837 0.22817 -1.1701
+0.09581 0.22762 -1.1672
+0.097735 0.22698 -1.1639
+0.10978 0.22468 -1.1519
+0.11176 0.22432 -1.15
+0.11384 0.22414 -1.1491
+0.11597 0.22407 -1.1487
+0.11814 0.22407 -1.1487
+0.15823 0.22565 -1.1569
+0.1606 0.22592 -1.1583
+0.16315 0.22643 -1.1609
+0.16641 0.22789 -1.1685
+0.16802 0.22859 -1.1721
+0.16944 0.22901 -1.1743
+0.088923 0.22861 -1.1781
+0.08976 0.22792 -1.1745
+0.090758 0.22764 -1.1731
+0.11271 0.22296 -1.1486
+0.11375 0.22288 -1.1482
+0.11482 0.22285 -1.148
+0.16765 0.22698 -1.1695
+0.17044 0.22777 -1.1736
+0.087842 0.22758 -1.1785
+0.088665 0.22684 -1.1746
+0.089658 0.22655 -1.1731
+0.091719 0.22618 -1.1712
+0.095638 0.22502 -1.1651
+0.099566 0.22397 -1.1596
+0.10353 0.2231 -1.155
+0.10758 0.22247 -1.1517
+0.1116 0.22183 -1.1484
+0.1137 0.2217 -1.1477
+0.11589 0.22174 -1.1479
+0.12014 0.22161 -1.1472
+0.12433 0.22136 -1.1459
+0.12854 0.22118 -1.1449
+0.13282 0.2211 -1.1445
+0.13721 0.22123 -1.1452
+0.14161 0.22136 -1.1459
+0.14593 0.22135 -1.1458
+0.15061 0.22189 -1.1486
+0.15548 0.22266 -1.1527
+0.16029 0.22329 -1.156
+0.16273 0.22366 -1.1579
+0.16584 0.22492 -1.1645
+0.16883 0.22598 -1.17
+0.1715 0.22659 -1.1732
+0.086746 0.2265 -1.1787
+0.088584 0.22553 -1.1736
+0.090637 0.22513 -1.1715
+0.085661 0.22546 -1.1791
+0.087512 0.22451 -1.174
+0.089563 0.2241 -1.1719
+0.091593 0.22367 -1.1696
+0.093552 0.22308 -1.1665
+0.10542 0.22032 -1.1518
+0.11361 0.21936 -1.1468
+0.1624 0.22103 -1.1555
+0.16828 0.22304 -1.1662
+0.17102 0.22376 -1.1699
+0.0855 0.22393 -1.1768
+0.086441 0.22349 -1.1745
+0.17202 0.22252 -1.1692
+0.084404 0.22285 -1.177
+0.08539 0.22253 -1.1753
+0.087389 0.22198 -1.1724
+0.091446 0.22111 -1.1677
+0.095402 0.22008 -1.1622
+0.099274 0.21895 -1.1562
+0.10326 0.21817 -1.152
+0.10525 0.21778 -1.1499
+0.10721 0.21737 -1.1477
+0.11137 0.21704 -1.1459
+0.11567 0.217 -1.1457
+0.11986 0.21677 -1.1445
+0.12401 0.21648 -1.1429
+0.12826 0.21638 -1.1424
+0.13257 0.21639 -1.1424
+0.13687 0.21637 -1.1423
+0.14121 0.21642 -1.1426
+0.14551 0.2164 -1.1425
+0.15018 0.21692 -1.1452
+0.15507 0.21773 -1.1496
+0.15967 0.21809 -1.1515
+0.16209 0.21843 -1.1533
+0.16517 0.21964 -1.1597
+0.17054 0.22093 -1.1666
+0.17184 0.22119 -1.168
+0.083335 0.22185 -1.1776
+0.084324 0.22153 -1.1759
+0.086328 0.22099 -1.173
+0.10612 0.21628 -1.1476
+0.17166 0.21985 -1.1668
+0.17302 0.22018 -1.1685
+0.082267 0.22085 -1.1782
+0.08326 0.22054 -1.1765
+0.085269 0.22 -1.1736
+0.087341 0.21965 -1.1717
+0.089361 0.21919 -1.1692
+0.10112 0.21605 -1.1523
+0.10311 0.21567 -1.1502
+0.10505 0.21521 -1.1477
+0.10602 0.21499 -1.1466
+0.10703 0.21483 -1.1457
+0.10918 0.21482 -1.1456
+0.16188 0.21597 -1.1518
+0.16483 0.21699 -1.1573
+0.1675 0.21763 -1.1607
+0.17017 0.21825 -1.1641
+0.17283 0.21885 -1.1673
+0.18042 0.22278 -1.1885
+0.18156 0.2228 -1.1886
+0.080233 0.22025 -1.181
+0.081207 0.21987 -1.1789
+0.082198 0.21955 -1.1772
+0.10398 0.21416 -1.1479
+0.10496 0.21394 -1.1467
+0.10597 0.2138 -1.146
+0.17404 0.21788 -1.168
+0.17879 0.22102 -1.185
+0.18122 0.22126 -1.1863
+0.18231 0.22123 -1.1862
+0.18339 0.22119 -1.1859
+0.079118 0.21913 -1.181
+0.081142 0.21859 -1.178
+0.083173 0.21809 -1.1753
+0.087272 0.21727 -1.1708
+0.09126 0.21626 -1.1653
+0.095159 0.21514 -1.1592
+0.099029 0.21406 -1.1533
+0.10292 0.21311 -1.1481
+0.1049 0.21274 -1.1461
+0.10699 0.21259 -1.1453
+0.11132 0.21262 -1.1454
+0.11552 0.2124 -1.1442
+0.11963 0.21205 -1.1423
+0.12381 0.21182 -1.1411
+0.12809 0.21178 -1.1408
+0.13233 0.21168 -1.1403
+0.13663 0.21169 -1.1403
+0.14093 0.21168 -1.1403
+0.14519 0.21163 -1.14
+0.14995 0.21227 -1.1435
+0.15471 0.2129 -1.1469
+0.15919 0.21311 -1.148
+0.16172 0.21359 -1.1506
+0.16477 0.21474 -1.1569
+0.16986 0.21566 -1.1619
+0.17247 0.21618 -1.1648
+0.17388 0.21658 -1.1669
+0.17839 0.21942 -1.1824
+0.1798 0.21978 -1.1843
+0.18197 0.2197 -1.1839
+0.18424 0.21975 -1.1842
+0.078 0.218 -1.1809
+0.082183 0.21729 -1.177
+0.17368 0.21522 -1.1655
+0.17582 0.21651 -1.1725
+0.17817 0.21803 -1.1809
+0.18072 0.21843 -1.1831
+0.077976 0.21682 -1.1805
+0.079051 0.21672 -1.18
+0.081232 0.21661 -1.1793
+0.082249 0.21636 -1.178
+0.083247 0.21607 -1.1764
+0.085216 0.21544 -1.1729
+0.093125 0.2133 -1.1611
+0.10484 0.21047 -1.1455
+0.16161 0.21127 -1.1498
+0.17228 0.21376 -1.1635
+0.17351 0.21392 -1.1644
+0.17518 0.21462 -1.1683
+0.1775 0.21611 -1.1764
+0.17935 0.217 -1.1814
+0.18166 0.2171 -1.1819
+0.077989 0.21575 -1.1807
+0.08228 0.21533 -1.1784
+0.1735 0.2128 -1.1643
+0.17698 0.21436 -1.1729
+0.18042 0.21583 -1.1811
+0.078029 0.21474 -1.1813
+0.079123 0.21469 -1.1811
+0.081312 0.21459 -1.1805
+0.083222 0.21379 -1.176
+0.085097 0.21293 -1.1713
+0.087121 0.21248 -1.1688
+0.091057 0.21139 -1.1627
+0.093033 0.2109 -1.16
+0.094962 0.21033 -1.1568
+0.098645 0.2089 -1.1488
+0.1027 0.20833 -1.1456
+0.10702 0.20833 -1.1457
+0.11117 0.20802 -1.1439
+0.11531 0.2077 -1.1421
+0.11947 0.20745 -1.1407
+0.12365 0.20724 -1.1395
+0.12794 0.20724 -1.1395
+0.13219 0.20717 -1.1391
+0.13642 0.20706 -1.1385
+0.14064 0.20696 -1.1379
+0.14499 0.20704 -1.1384
+0.14975 0.20769 -1.142
+0.1544 0.20815 -1.1446
+0.15895 0.20846 -1.1463
+0.1644 0.20989 -1.1542
+0.16939 0.21069 -1.1587
+0.17208 0.21131 -1.1621
+0.17469 0.21183 -1.165
+0.17649 0.21266 -1.1696
+0.17864 0.21392 -1.1766
+0.078433 0.21474 -1.1875
+0.080339 0.21385 -1.1826
+0.082286 0.21312 -1.1785
+0.093946 0.20941 -1.1577
+0.17615 0.21116 -1.1674
+0.17824 0.21233 -1.1739
+0.077741 0.21479 -1.1942
+0.079571 0.21367 -1.1878
+0.081484 0.21282 -1.183
+0.083027 0.21107 -1.1732
+0.085047 0.2106 -1.1706
+0.087059 0.21013 -1.1679
+0.08903 0.20959 -1.1649
+0.090999 0.20907 -1.162
+0.092998 0.20864 -1.1595
+0.093898 0.20821 -1.1571
+0.094712 0.2076 -1.1537
+0.096506 0.20679 -1.1491
+0.15642 0.20581 -1.1436
+0.17188 0.20887 -1.1607
+0.17452 0.20942 -1.1638
+0.17601 0.20989 -1.1664
+0.17813 0.2111 -1.1732
+0.078721 0.21327 -1.192
+0.080596 0.2123 -1.1864
+0.081521 0.2118 -1.1836
+0.082265 0.21085 -1.1782
+0.091966 0.20768 -1.1603
+0.093694 0.20667 -1.1546
+0.17583 0.20857 -1.1652
+0.18022 0.21114 -1.1797
+0.077734 0.21252 -1.1941
+0.079622 0.21156 -1.1886
+0.080626 0.21126 -1.1869
+0.081444 0.21048 -1.1825
+0.082185 0.20953 -1.1771
+0.083061 0.20894 -1.1737
+0.086967 0.20771 -1.1667
+0.090947 0.20676 -1.1613
+0.091948 0.20655 -1.1601
+0.092717 0.20583 -1.156
+0.094321 0.20458 -1.1489
+0.096298 0.20418 -1.1466
+0.098444 0.20415 -1.1464
+0.10279 0.20419 -1.1467
+0.10692 0.20381 -1.1445
+0.11111 0.2036 -1.1433
+0.11521 0.20322 -1.1412
+0.11935 0.20295 -1.1396
+0.12358 0.20284 -1.139
+0.12788 0.20284 -1.139
+0.132 0.20258 -1.1375
+0.13623 0.20249 -1.1369
+0.14044 0.20238 -1.1363
+0.14492 0.20265 -1.1379
+0.14964 0.20323 -1.1411
+0.15407 0.2034 -1.1421
+0.15636 0.20357 -1.1431
+0.1589 0.20406 -1.1459
+0.16419 0.20528 -1.1527
+0.16904 0.20589 -1.1562
+0.1717 0.20647 -1.1595
+0.1744 0.20708 -1.163
+0.17573 0.20736 -1.1646
+0.17761 0.20827 -1.1698
+0.18005 0.20983 -1.1786
+0.1822 0.21104 -1.1855
+0.076789 0.21189 -1.1969
+0.078663 0.21087 -1.1911
+0.080532 0.20989 -1.1855
+0.082082 0.20816 -1.1756
+0.091798 0.20512 -1.1582
+0.093326 0.20369 -1.15
+0.15761 0.20272 -1.1444
+0.17025 0.20495 -1.1571
+0.17303 0.20565 -1.1611
+0.1756 0.2061 -1.1637
+0.17978 0.20841 -1.1768
+0.076737 0.21062 -1.1961
+0.077693 0.21016 -1.1934
+0.079575 0.2092 -1.1879
+0.081143 0.20748 -1.1781
+0.083018 0.20662 -1.1731
+0.084944 0.20593 -1.1692
+0.088923 0.20494 -1.1635
+0.090912 0.20449 -1.1608
+0.092406 0.20296 -1.1521
+0.094395 0.20257 -1.1498
+0.096443 0.20232 -1.1484
+0.15177 0.20105 -1.141
+0.15397 0.20111 -1.1413
+0.15636 0.20142 -1.1431
+0.15761 0.20164 -1.1444
+0.15889 0.20189 -1.1458
+0.16165 0.20264 -1.1501
+0.16645 0.20321 -1.1534
+0.16894 0.20359 -1.1555
+0.17013 0.20371 -1.1563
+0.1716 0.20416 -1.1588
+0.17425 0.20471 -1.162
+0.17546 0.20484 -1.1627
+0.17723 0.20562 -1.1672
+0.17974 0.20725 -1.1766
+0.18182 0.20836 -1.1829
+0.076742 0.20951 -1.1962
+0.078653 0.2086 -1.1909
+0.080327 0.20713 -1.1824
+0.082044 0.20585 -1.175
+0.15762 0.20057 -1.1444
+0.17014 0.20264 -1.1563
+0.17299 0.20342 -1.1609
+0.17545 0.20374 -1.1627
+0.17954 0.20591 -1.1752
+0.076747 0.2084 -1.1963
+0.07772 0.20798 -1.1939
+0.079529 0.20684 -1.1872
+0.080183 0.20564 -1.1803
+0.08105 0.20503 -1.1767
+0.082962 0.20427 -1.1723
+0.086865 0.20307 -1.1653
+0.090815 0.20208 -1.1596
+0.092537 0.20108 -1.1538
+0.094648 0.20094 -1.1529
+0.098727 0.20039 -1.1498
+0.10275 0.19979 -1.1463
+0.10696 0.19959 -1.1451
+0.11099 0.19906 -1.142
+0.11513 0.19878 -1.1404
+0.11935 0.19864 -1.1395
+0.1236 0.19857 -1.1392
+0.12784 0.19849 -1.1387
+0.13186 0.19807 -1.1362
+0.13607 0.19797 -1.1356
+0.1404 0.19803 -1.136
+0.1449 0.19833 -1.1377
+0.14949 0.19872 -1.14
+0.15396 0.19895 -1.1413
+0.15645 0.19937 -1.1437
+0.159 0.19987 -1.1467
+0.16404 0.20075 -1.1517
+0.16882 0.20126 -1.1547
+0.17151 0.20187 -1.1582
+0.17422 0.20249 -1.1618
+0.1768 0.20293 -1.1644
+0.18163 0.20593 -1.1817
+0.076751 0.20728 -1.1963
+0.078614 0.20625 -1.1903
+0.080101 0.20432 -1.1791
+0.081973 0.20346 -1.174
+0.091716 0.20057 -1.1571
+0.092573 0.20006 -1.1542
+0.093635 0.20001 -1.1539
+0.17005 0.20034 -1.1557
+0.17292 0.20115 -1.1604
+0.17889 0.20296 -1.1709
+0.18348 0.20563 -1.1865
+0.076777 0.20622 -1.1967
+0.077688 0.20565 -1.1934
+0.079314 0.20405 -1.184
+0.080115 0.20325 -1.1793
+0.081003 0.20269 -1.176
+0.08288 0.20186 -1.1712
+0.084852 0.2013 -1.1679
+0.088786 0.20025 -1.1617
+0.090771 0.1998 -1.159
+0.092717 0.19928 -1.156
+0.094699 0.19887 -1.1536
+0.09678 0.19868 -1.1525
+0.13813 0.19571 -1.1349
+0.14036 0.19582 -1.1356
+0.14258 0.19594 -1.1363
+0.14491 0.19619 -1.1377
+0.14728 0.19649 -1.1395
+0.15164 0.19658 -1.14
+0.15406 0.19692 -1.142
+0.15649 0.19727 -1.1441
+0.15919 0.19794 -1.148
+0.1616 0.19825 -1.1498
+0.16631 0.1987 -1.1524
+0.16878 0.19904 -1.1544
+0.16997 0.19916 -1.1551
+0.17147 0.19964 -1.158
+0.17423 0.20031 -1.1619
+0.17666 0.20057 -1.1634
+0.17875 0.2017 -1.17
+0.18143 0.20347 -1.1804
+0.18342 0.20444 -1.1861
+0.075817 0.20555 -1.1994
+0.076766 0.20506 -1.1966
+0.077656 0.20444 -1.1929
+0.078405 0.20347 -1.1872
+0.08006 0.202 -1.1785
+0.081927 0.20113 -1.1734
+0.14145 0.19479 -1.1359
+0.14257 0.19485 -1.1362
+0.14374 0.19499 -1.137
+0.15529 0.19604 -1.1432
+0.15653 0.19624 -1.1444
+0.15789 0.19659 -1.1464
+0.16998 0.19809 -1.1552
+0.17305 0.19911 -1.1613
+0.17863 0.20046 -1.1692
+0.18323 0.20311 -1.1849
+0.075843 0.20449 -1.1999
+0.077483 0.20286 -1.1902
+0.079095 0.20125 -1.1807
+0.080957 0.20036 -1.1754
+0.082878 0.19965 -1.1712
+0.086769 0.19845 -1.164
+0.090814 0.1977 -1.1596
+0.09474 0.19678 -1.1541
+0.098849 0.1963 -1.1512
+0.10283 0.19562 -1.1472
+0.10689 0.19514 -1.1443
+0.11096 0.19471 -1.1418
+0.11514 0.19449 -1.1405
+0.11938 0.19439 -1.1399
+0.12368 0.1944 -1.1399
+0.12765 0.1939 -1.1369
+0.13184 0.19375 -1.1361
+0.13601 0.19359 -1.1351
+0.14036 0.19368 -1.1356
+0.14259 0.19381 -1.1364
+0.14501 0.19418 -1.1386
+0.14939 0.19429 -1.1392
+0.15414 0.19487 -1.1426
+0.15659 0.19524 -1.1448
+0.15928 0.19588 -1.1487
+0.16394 0.19629 -1.151
+0.16871 0.19679 -1.154
+0.17153 0.19752 -1.1584
+0.17312 0.19809 -1.1617
+0.17428 0.19817 -1.1622
+0.17661 0.19833 -1.1631
+0.17828 0.19897 -1.1669
+0.1813 0.2011 -1.1796
+0.18313 0.20188 -1.1842
+0.0767 0.20263 -1.1956
+0.078009 0.20021 -1.1811
+0.17304 0.19691 -1.1612
+0.17813 0.1977 -1.1659
+0.18305 0.20068 -1.1837
+0.076121 0.20296 -1.2043
+0.076982 0.19932 -1.1824
+0.078877 0.19848 -1.1774
+0.080868 0.19792 -1.1741
+0.082813 0.19728 -1.1702
+0.084726 0.19661 -1.1661
+0.09278 0.19506 -1.1568
+0.14273 0.19186 -1.1375
+0.15185 0.19254 -1.1417
+0.15676 0.19329 -1.1461
+0.1663 0.19433 -1.1523
+0.17167 0.1955 -1.1594
+0.17311 0.19589 -1.1617
+0.17434 0.19604 -1.1626
+0.1767 0.19623 -1.1637
+0.17796 0.19642 -1.1648
+0.18043 0.19792 -1.1738
+0.183 0.19952 -1.1834
+0.077794 0.19744 -1.1778
+0.17317 0.19487 -1.1621
+0.17797 0.19533 -1.1649
+0.18017 0.19652 -1.1721
+0.18272 0.1981 -1.1816
+0.07671 0.19639 -1.1782
+0.077614 0.19587 -1.1751
+0.078666 0.19573 -1.1742
+0.08266 0.19472 -1.1681
+0.084672 0.19428 -1.1654
+0.086783 0.19409 -1.1642
+0.091076 0.19389 -1.163
+0.092819 0.19295 -1.1573
+0.094791 0.19253 -1.1547
+0.09894 0.19213 -1.1523
+0.10287 0.19137 -1.1477
+0.10692 0.19087 -1.1447
+0.11102 0.1905 -1.1424
+0.11519 0.19027 -1.141
+0.11951 0.1903 -1.1412
+0.12367 0.19009 -1.1399
+0.12759 0.18952 -1.1364
+0.13184 0.18947 -1.1361
+0.13605 0.18936 -1.1354
+0.14045 0.18952 -1.1364
+0.14291 0.18995 -1.139
+0.14506 0.18995 -1.139
+0.14969 0.19038 -1.1416
+0.15194 0.1905 -1.1423
+0.15421 0.19064 -1.1432
+0.15701 0.19143 -1.148
+0.15937 0.19167 -1.1494
+0.16391 0.1919 -1.1508
+0.16629 0.19215 -1.1523
+0.16883 0.19257 -1.1548
+0.17194 0.19361 -1.1612
+0.17444 0.19396 -1.1633
+0.17674 0.19408 -1.164
+0.17928 0.19446 -1.1663
+0.077546 0.19459 -1.174
+0.15308 0.1895 -1.1428
+0.15581 0.1902 -1.1471
+0.1583 0.1906 -1.1495
+0.16754 0.19124 -1.1534
+0.074963 0.19836 -1.204
+0.076464 0.19355 -1.1744
+0.078486 0.19308 -1.1715
+0.080537 0.1927 -1.1692
+0.082563 0.19229 -1.1667
+0.084713 0.19218 -1.166
+0.086869 0.19209 -1.1654
+0.089038 0.19203 -1.165
+0.092809 0.19075 -1.1572
+0.096962 0.19034 -1.1547
+0.10089 0.18954 -1.1497
+0.13393 0.18725 -1.1356
+0.13826 0.18731 -1.136
+0.1408 0.18785 -1.1393
+0.14296 0.18787 -1.1394
+0.14519 0.18796 -1.14
+0.14748 0.18814 -1.1411
+0.14974 0.18828 -1.1419
+0.15198 0.18839 -1.1426
+0.15313 0.18849 -1.1432
+0.15467 0.18904 -1.1466
+0.15616 0.18954 -1.1497
+0.15727 0.18957 -1.1499
+0.15944 0.18958 -1.1499
+0.16167 0.18965 -1.1503
+0.16394 0.18976 -1.151
+0.16634 0.19002 -1.1526
+0.16759 0.19022 -1.1538
+0.16892 0.19049 -1.1554
+0.1721 0.1916 -1.1623
+0.17452 0.19186 -1.1638
+0.17683 0.19198 -1.1646
+0.17937 0.19235 -1.1669
+0.074934 0.19715 -1.2035
+0.075659 0.19609 -1.1969
+0.076462 0.19244 -1.1744
+0.077463 0.19217 -1.1728
+0.079469 0.19168 -1.1697
+0.080481 0.19147 -1.1684
+0.081519 0.19132 -1.1675
+0.15089 0.1873 -1.1425
+0.15204 0.18739 -1.1431
+0.15354 0.18791 -1.1463
+0.15622 0.18853 -1.1501
+0.15841 0.18856 -1.1503
+0.16764 0.18919 -1.1542
+0.1708 0.19028 -1.1609
+0.17337 0.1907 -1.1635
+0.17807 0.19104 -1.1655
+0.17936 0.19124 -1.1668
+0.074749 0.19553 -1.2005
+0.075513 0.19459 -1.1946
+0.075916 0.19275 -1.1832
+0.076488 0.19139 -1.1748
+0.078482 0.19086 -1.1715
+0.080507 0.19043 -1.1688
+0.082632 0.19025 -1.1677
+0.086987 0.19015 -1.167
+0.091292 0.18995 -1.1658
+0.092853 0.18866 -1.1578
+0.094858 0.18831 -1.1556
+0.097031 0.18829 -1.1555
+0.099056 0.188 -1.1537
+0.10303 0.18731 -1.1494
+0.10701 0.18671 -1.1457
+0.11115 0.18641 -1.1438
+0.11543 0.18635 -1.1434
+0.11974 0.18635 -1.1434
+0.1236 0.18567 -1.1391
+0.12768 0.18535 -1.1372
+0.1319 0.18527 -1.1366
+0.13397 0.18516 -1.136
+0.1361 0.18514 -1.1359
+0.13864 0.18567 -1.1392
+0.1409 0.18582 -1.1401
+0.1454 0.18608 -1.1417
+0.14757 0.18611 -1.1419
+0.14977 0.18617 -1.1422
+0.15247 0.18683 -1.1463
+0.15393 0.1873 -1.1492
+0.15507 0.18737 -1.1496
+0.15737 0.18752 -1.1506
+0.15956 0.18755 -1.1507
+0.16407 0.18774 -1.1519
+0.16642 0.18795 -1.1532
+0.16913 0.18855 -1.1569
+0.17085 0.18924 -1.1613
+0.17228 0.18961 -1.1635
+0.17461 0.18976 -1.1644
+0.17694 0.1899 -1.1653
+0.17941 0.19019 -1.1671
+0.18073 0.19042 -1.1685
+0.074655 0.19416 -1.199
+0.076028 0.19192 -1.185
+0.077609 0.19032 -1.175
+0.079522 0.1896 -1.1705
+0.08165 0.18942 -1.1694
+0.13507 0.18413 -1.1363
+0.13621 0.18422 -1.1368
+0.13758 0.18463 -1.1393
+0.13989 0.18484 -1.1407
+0.1465 0.18504 -1.1419
+0.14759 0.18505 -1.142
+0.1487 0.1851 -1.1423
+0.15143 0.1858 -1.1466
+0.15287 0.18625 -1.1494
+0.154 0.1863 -1.1497
+0.17076 0.18805 -1.1606
+0.17354 0.18869 -1.1646
+0.18074 0.18933 -1.1686
+0.18206 0.18957 -1.1701
+0.072532 0.19339 -1.2012
+0.073549 0.19309 -1.1994
+0.07556 0.19245 -1.1954
+0.076545 0.1921 -1.1932
+0.077128 0.19076 -1.1847
+0.07785 0.1898 -1.1787
+0.078716 0.18921 -1.175
+0.080692 0.18865 -1.1715
+0.082818 0.18847 -1.1703
+0.084967 0.18834 -1.1695
+0.089312 0.18821 -1.1687
+0.092935 0.18664 -1.1588
+0.097113 0.18627 -1.1565
+0.099267 0.18622 -1.1562
+0.10129 0.18593 -1.1544
+0.10338 0.18578 -1.1534
+0.10532 0.18538 -1.1509
+0.10709 0.18468 -1.1465
+0.10915 0.18451 -1.1454
+0.11129 0.18447 -1.1452
+0.11349 0.18455 -1.1457
+0.12168 0.18387 -1.1413
+0.12568 0.18343 -1.1386
+0.12983 0.18322 -1.1373
+0.13189 0.1831 -1.1365
+0.13405 0.18313 -1.1367
+0.13518 0.18321 -1.1372
+0.13662 0.18371 -1.1403
+0.13891 0.18389 -1.1414
+0.14106 0.18388 -1.1414
+0.14327 0.18397 -1.1419
+0.14546 0.184 -1.1422
+0.14655 0.18403 -1.1423
+0.14797 0.18445 -1.145
+0.14918 0.18461 -1.146
+0.15059 0.18502 -1.1485
+0.15293 0.18523 -1.1498
+0.15517 0.18532 -1.1504
+0.15746 0.18546 -1.1513
+0.16651 0.18587 -1.1538
+0.16918 0.18641 -1.1572
+0.17245 0.1876 -1.1647
+0.17478 0.18775 -1.1656
+0.17712 0.1879 -1.1666
+0.17947 0.18805 -1.1675
+0.18198 0.18837 -1.1695
+0.18323 0.18852 -1.1705
+0.07148 0.19247 -1.2026
+0.072501 0.19217 -1.2007
+0.074496 0.19148 -1.1964
+0.076569 0.19103 -1.1935
+0.077522 0.19061 -1.1909
+0.078198 0.18953 -1.184
+0.1045 0.18475 -1.1538
+0.10626 0.18404 -1.1493
+0.10821 0.18366 -1.1469
+0.10923 0.18357 -1.1463
+0.11036 0.18365 -1.1468
+0.13093 0.18219 -1.1376
+0.13199 0.18217 -1.1374
+0.13306 0.18217 -1.1374
+0.13571 0.18285 -1.1417
+0.13797 0.18299 -1.1426
+0.13899 0.18292 -1.1421
+0.14007 0.18292 -1.1422
+0.14226 0.18297 -1.1424
+0.14335 0.18298 -1.1425
+0.14467 0.18329 -1.1445
+0.14719 0.18375 -1.1474
+0.14837 0.18387 -1.1481
+0.14956 0.184 -1.1489
+0.16793 0.18515 -1.1561
+0.17103 0.18615 -1.1625
+0.17376 0.18673 -1.1661
+0.18308 0.18727 -1.1695
+0.18423 0.18732 -1.1698
+0.070398 0.19147 -1.2035
+0.071465 0.19129 -1.2024
+0.073581 0.19091 -1.1999
+0.075501 0.19005 -1.1944
+0.077607 0.1897 -1.1922
+0.078643 0.18949 -1.1909
+0.079338 0.18847 -1.1844
+0.08105 0.18727 -1.1768
+0.083034 0.18675 -1.1734
+0.085182 0.18661 -1.1725
+0.087321 0.18646 -1.1716
+0.089438 0.18627 -1.1704
+0.091344 0.18566 -1.1665
+0.092936 0.18446 -1.1589
+0.095012 0.18424 -1.1575
+0.099349 0.1842 -1.1572
+0.10344 0.18372 -1.1541
+0.10545 0.18342 -1.1523
+0.10738 0.18301 -1.1497
+0.10947 0.18288 -1.1488
+0.11168 0.18296 -1.1493
+0.11591 0.1828 -1.1482
+0.12002 0.18246 -1.1461
+0.12179 0.18187 -1.1424
+0.12371 0.18154 -1.1403
+0.12574 0.18136 -1.1391
+0.12785 0.1813 -1.1387
+0.12993 0.18122 -1.1382
+0.13132 0.18165 -1.1409
+0.13248 0.18177 -1.1417
+0.13507 0.18236 -1.1454
+0.13709 0.18217 -1.1442
+0.13914 0.18204 -1.1434
+0.14141 0.18219 -1.1443
+0.14378 0.18245 -1.146
+0.14618 0.18275 -1.1479
+0.14848 0.18293 -1.149
+0.15073 0.18303 -1.1496
+0.1553 0.1833 -1.1513
+0.15994 0.18365 -1.1536
+0.16442 0.18378 -1.1544
+0.1668 0.18401 -1.1558
+0.16798 0.18412 -1.1565
+0.16968 0.18478 -1.1607
+0.17151 0.18557 -1.1658
+0.17281 0.18579 -1.1672
+0.17502 0.1858 -1.1672
+0.17732 0.18591 -1.1679
+0.17959 0.18598 -1.1683
+0.18182 0.18601 -1.1685
+0.18295 0.18603 -1.1687
+0.070379 0.19029 -1.2032
+0.074687 0.18971 -1.1995
+0.078693 0.18849 -1.1916
+0.079762 0.18836 -1.1908
+0.080573 0.18763 -1.1862
+0.081594 0.18741 -1.1848
+0.082348 0.18659 -1.1795
+0.083328 0.1863 -1.1776
+0.084291 0.18597 -1.1756
+0.086368 0.18568 -1.1737
+0.09221 0.18409 -1.1635
+0.092966 0.18342 -1.1592
+0.09402 0.18335 -1.1587
+0.10858 0.18212 -1.1509
+0.10966 0.18212 -1.1509
+0.11073 0.18209 -1.1507
+0.12277 0.18065 -1.1415
+0.12476 0.18043 -1.14
+0.12581 0.18038 -1.1397
+0.12688 0.18039 -1.1397
+0.12798 0.18042 -1.14
+0.1293 0.18077 -1.1422
+0.13181 0.18125 -1.1453
+0.13295 0.18134 -1.1458
+0.13406 0.18138 -1.1461
+0.1362 0.18134 -1.1458
+0.16821 0.18327 -1.1581
+0.1718 0.18478 -1.1677
+0.17415 0.18494 -1.1688
+0.17631 0.1849 -1.1685
+0.17743 0.18492 -1.1686
+0.17853 0.18491 -1.1686
+0.18065 0.18484 -1.1681
+0.18172 0.1848 -1.1679
+0.069266 0.18921 -1.2035
+0.071467 0.18903 -1.2024
+0.073633 0.18878 -1.2008
+0.074701 0.18862 -1.1997
+0.075666 0.18821 -1.1971
+0.077635 0.18752 -1.1926
+0.079788 0.1873 -1.1912
+0.081715 0.18657 -1.1866
+0.082709 0.18629 -1.1848
+0.083485 0.18554 -1.1799
+0.085396 0.18486 -1.1755
+0.087482 0.18459 -1.1738
+0.089519 0.18423 -1.1715
+0.091428 0.18363 -1.1676
+0.093175 0.18274 -1.1619
+0.094099 0.18241 -1.1597
+0.095192 0.18241 -1.1597
+0.09731 0.18228 -1.1589
+0.10558 0.18147 -1.1537
+0.10764 0.18127 -1.1524
+0.10976 0.1812 -1.1519
+0.11182 0.18102 -1.1508
+0.11392 0.18091 -1.15
+0.11808 0.18064 -1.1483
+0.12018 0.18054 -1.1477
+0.12198 0.18 -1.1442
+0.12279 0.17961 -1.1417
+0.12377 0.17948 -1.1408
+0.12613 0.17977 -1.1427
+0.12866 0.1803 -1.1461
+0.13086 0.18035 -1.1465
+0.13305 0.18039 -1.1467
+0.13522 0.1804 -1.1467
+0.13738 0.18039 -1.1467
+0.13959 0.18046 -1.1471
+0.14186 0.18059 -1.148
+0.1441 0.18069 -1.1486
+0.14859 0.18088 -1.1498
+0.16717 0.18223 -1.1585
+0.16834 0.18232 -1.159
+0.16992 0.18284 -1.1624
+0.17197 0.18387 -1.1689
+0.17325 0.18406 -1.1702
+0.17458 0.1843 -1.1717
+0.17557 0.18417 -1.1709
+0.17769 0.18409 -1.1704
+0.17968 0.18387 -1.1689
+0.18056 0.18364 -1.1675
+-0.09455 0.1988 -1.2729
+0.070369 0.18799 -1.203
+0.074668 0.18741 -1.1992
+0.076817 0.18714 -1.1975
+0.078722 0.18631 -1.1921
+0.082734 0.18523 -1.1851
+0.0943 0.1817 -1.1622
+0.12292 0.17872 -1.1429
+0.12391 0.1786 -1.1421
+0.12519 0.17889 -1.144
+0.12653 0.17926 -1.1464
+0.1277 0.17938 -1.1472
+0.16842 0.18132 -1.1596
+0.17003 0.18186 -1.1631
+0.1722 0.18301 -1.1706
+0.17482 0.18344 -1.1733
+0.17595 0.18347 -1.1735
+0.17707 0.18348 -1.1736
+0.17907 0.18327 -1.1722
+-0.095529 0.19714 -1.2699
+-0.094221 0.19691 -1.2684
+-0.09296 0.19677 -1.2675
+0.017831 0.19475 -1.2544
+0.019018 0.19481 -1.2548
+0.02636 0.1967 -1.2671
+0.027588 0.19695 -1.2688
+0.030052 0.19745 -1.272
+0.069262 0.18693 -1.2035
+0.071455 0.18674 -1.2022
+0.07356 0.18633 -1.1996
+0.075771 0.18621 -1.1988
+0.07685 0.18609 -1.198
+0.077819 0.18571 -1.1955
+0.078761 0.18527 -1.1927
+0.079829 0.18515 -1.1918
+0.081925 0.18481 -1.1896
+0.083586 0.18353 -1.1813
+0.085465 0.18279 -1.1765
+0.087579 0.18257 -1.1751
+0.091547 0.18166 -1.1691
+0.093462 0.1811 -1.1655
+0.095401 0.18062 -1.1623
+0.099476 0.18006 -1.1587
+0.10358 0.17959 -1.1557
+0.10774 0.17928 -1.1536
+0.11193 0.17902 -1.1519
+0.11612 0.17879 -1.1504
+0.12033 0.1786 -1.1492
+0.1223 0.17831 -1.1473
+0.12428 0.17805 -1.1455
+0.12561 0.1784 -1.1478
+0.1267 0.17842 -1.148
+0.12884 0.17838 -1.1477
+0.13316 0.17837 -1.1476
+0.13758 0.17849 -1.1484
+0.142 0.1786 -1.1491
+0.14648 0.17878 -1.1503
+0.15104 0.17905 -1.152
+0.15561 0.17931 -1.1537
+0.16035 0.17975 -1.1565
+0.16511 0.18018 -1.1593
+0.16731 0.1802 -1.1595
+0.1685 0.1803 -1.1601
+0.17055 0.18133 -1.1668
+0.17257 0.18229 -1.173
+0.17375 0.18237 -1.1736
+0.17602 0.18243 -1.174
+0.17824 0.18244 -1.174
+-0.10316 0.19914 -1.2908
+-0.097993 0.19609 -1.2709
+-0.096643 0.19578 -1.2688
+-0.095294 0.19547 -1.2668
+-0.092655 0.19493 -1.2633
+-0.091303 0.19458 -1.261
+-0.089924 0.19417 -1.2583
+-0.088587 0.19384 -1.2561
+-0.087311 0.19363 -1.2548
+-0.086103 0.19357 -1.2544
+-0.084917 0.19356 -1.2543
+0.016609 0.19309 -1.2513
+0.018978 0.19322 -1.2522
+0.02017 0.19334 -1.253
+0.021368 0.19351 -1.2541
+0.022586 0.19383 -1.2561
+0.023809 0.19416 -1.2583
+0.025061 0.19468 -1.2617
+0.026306 0.1951 -1.2645
+0.07039 0.18578 -1.2034
+0.076873 0.18502 -1.1984
+0.077901 0.18477 -1.1968
+0.078896 0.18447 -1.1948
+0.079852 0.18407 -1.1922
+0.080926 0.18396 -1.1915
+0.082853 0.18326 -1.1869
+0.084486 0.18196 -1.1783
+0.086536 0.1816 -1.176
+0.12566 0.17739 -1.1483
+0.12784 0.17741 -1.1484
+0.16625 0.17915 -1.1597
+0.16742 0.17922 -1.1602
+0.16889 0.17963 -1.1629
+0.17268 0.18131 -1.1739
+0.17491 0.18132 -1.1739
+-0.10434 0.19787 -1.2905
+-0.10283 0.19728 -1.2866
+-0.097818 0.19455 -1.2686
+-0.096384 0.19407 -1.2654
+-0.093738 0.19352 -1.2618
+-0.09101 0.19278 -1.2569
+-0.088339 0.19211 -1.2526
+-0.085879 0.19189 -1.2511
+-0.083518 0.19188 -1.251
+-0.082337 0.19187 -1.251
+-0.073451 0.19021 -1.2401
+-0.071126 0.19024 -1.2402
+0.009471 0.19052 -1.2422
+0.010638 0.19047 -1.2419
+0.012989 0.19066 -1.2431
+0.015385 0.19134 -1.2476
+0.017751 0.19153 -1.2488
+0.020112 0.19161 -1.2493
+0.022528 0.19215 -1.2529
+0.025 0.19302 -1.2587
+0.027478 0.19378 -1.2637
+0.029928 0.19425 -1.2667
+0.032421 0.1949 -1.271
+0.069291 0.18474 -1.204
+0.071495 0.18457 -1.2029
+0.073651 0.1843 -1.2011
+0.075899 0.18426 -1.2008
+0.078116 0.18415 -1.2001
+0.080045 0.18339 -1.1951
+0.080949 0.18289 -1.1918
+0.082032 0.1828 -1.1912
+0.083619 0.18138 -1.1818
+0.084491 0.18086 -1.1784
+0.085513 0.18067 -1.1772
+0.08765 0.18051 -1.1761
+0.08972 0.18021 -1.1741
+0.093565 0.1791 -1.1668
+0.12255 0.17651 -1.1497
+0.12468 0.17646 -1.1493
+0.12683 0.17643 -1.1491
+0.12898 0.17641 -1.149
+0.13114 0.1764 -1.1489
+0.16292 0.17799 -1.1593
+0.16521 0.1781 -1.1601
+0.16637 0.17818 -1.1606
+0.16785 0.17859 -1.1632
+0.17162 0.18025 -1.1742
+0.17385 0.18027 -1.1743
+0.17611 0.18031 -1.1746
+0.17838 0.18037 -1.175
+-0.10403 0.19606 -1.2866
+-0.10259 0.19561 -1.2836
+-0.099038 0.1934 -1.2689
+-0.097586 0.1929 -1.2656
+-0.089485 0.19086 -1.2521
+-0.08818 0.19059 -1.2503
+-0.086987 0.19056 -1.2501
+-0.08212 0.19019 -1.2476
+-0.080897 0.19007 -1.2469
+-0.079672 0.18995 -1.2461
+-0.078428 0.18978 -1.245
+-0.077097 0.18939 -1.2424
+-0.075802 0.18908 -1.2403
+-0.074553 0.18888 -1.239
+-0.072127 0.18863 -1.2374
+-0.06984 0.18875 -1.2381
+-0.068674 0.18875 -1.2381
+-0.016064 0.18707 -1.227
+-0.01031 0.18749 -1.2299
+-0.009151 0.18748 -1.2298
+-0.007992 0.18746 -1.2296
+-0.006837 0.18752 -1.23
+-0.00221 0.18811 -1.234
+-0.001048 0.18808 -1.2337
+0.000113 0.18806 -1.2336
+0.001276 0.18816 -1.2343
+0.00244 0.18831 -1.2353
+0.003607 0.18853 -1.2367
+0.004775 0.18864 -1.2375
+0.005942 0.18871 -1.2379
+0.00711 0.18878 -1.2384
+0.008281 0.18887 -1.239
+0.009449 0.18891 -1.2392
+0.01178 0.18887 -1.239
+0.014129 0.18907 -1.2403
+0.015334 0.18954 -1.2434
+0.01653 0.18983 -1.2454
+0.023714 0.19102 -1.2532
+0.024949 0.19145 -1.2561
+0.026198 0.19193 -1.2593
+0.033633 0.19379 -1.2716
+0.034905 0.1942 -1.2743
+0.070415 0.18357 -1.2038
+0.074889 0.18343 -1.2028
+0.07612 0.18366 -1.2044
+0.077351 0.18389 -1.2059
+0.078489 0.1839 -1.2059
+0.079459 0.18351 -1.2034
+0.081297 0.18255 -1.197
+0.082039 0.1817 -1.1913
+0.082938 0.18121 -1.1881
+0.084496 0.17976 -1.1785
+0.086593 0.1795 -1.1768
+0.16681 0.17756 -1.1637
+0.17026 0.17887 -1.1724
+0.17741 0.1794 -1.1759
+-0.098803 0.19175 -1.2659
+-0.096099 0.19111 -1.2616
+-0.090688 0.18973 -1.2524
+-0.088107 0.18926 -1.2493
+-0.085624 0.18897 -1.2474
+-0.08315 0.18868 -1.2455
+-0.08071 0.18846 -1.244
+-0.078192 0.18804 -1.2412
+-0.075665 0.18757 -1.2381
+-0.07323 0.18731 -1.2363
+-0.070864 0.18721 -1.2356
+-0.068556 0.18726 -1.236
+-0.067393 0.18726 -1.236
+-0.066229 0.18726 -1.236
+-0.061428 0.18682 -1.2331
+-0.056615 0.18627 -1.2294
+-0.054336 0.18639 -1.2302
+-0.047319 0.18613 -1.2285
+-0.042689 0.18612 -1.2284
+-0.038 0.18582 -1.2264
+-0.029859 0.18547 -1.2241
+-0.028695 0.18539 -1.2236
+-0.024127 0.18571 -1.2257
+-0.019522 0.18583 -1.2265
+-0.017191 0.1856 -1.225
+-0.014895 0.18574 -1.2259
+-0.012604 0.186 -1.2276
+-0.011451 0.18605 -1.228
+-0.010292 0.18601 -1.2277
+-0.007976 0.18593 -1.2272
+-0.005674 0.18621 -1.229
+-0.003364 0.18649 -1.2309
+-0.001046 0.18649 -1.2309
+0.001273 0.18659 -1.2316
+0.003597 0.18683 -1.2332
+0.005927 0.18706 -1.2347
+0.00826 0.18725 -1.236
+0.010598 0.18742 -1.2371
+0.012934 0.18751 -1.2377
+0.0153 0.18795 -1.2407
+0.017693 0.18856 -1.2447
+0.022473 0.18933 -1.2499
+0.024912 0.18998 -1.2542
+0.027399 0.19085 -1.26
+0.032326 0.19193 -1.2672
+0.03486 0.19275 -1.2727
+0.036117 0.19307 -1.2748
+0.069301 0.18249 -1.2042
+0.071515 0.18236 -1.2033
+0.07377 0.18233 -1.2031
+0.076161 0.18263 -1.2051
+0.078511 0.18281 -1.2063
+0.080724 0.18268 -1.2054
+0.081813 0.18257 -1.2047
+0.082509 0.18161 -1.1982
+0.083194 0.18064 -1.1918
+0.08369 0.1793 -1.1828
+0.08452 0.1787 -1.1788
+0.085529 0.17849 -1.1774
+0.087704 0.1784 -1.1768
+0.089792 0.17814 -1.1751
+0.091692 0.17753 -1.171
+0.095615 0.17663 -1.165
+0.099651 0.176 -1.1608
+0.1038 0.17562 -1.1582
+0.10799 0.17532 -1.1563
+0.11219 0.17508 -1.1546
+0.11642 0.17489 -1.1533
+0.12064 0.1747 -1.1521
+0.12485 0.17453 -1.1509
+0.12913 0.17444 -1.1503
+0.13348 0.17447 -1.1505
+0.13792 0.1746 -1.1513
+0.14237 0.17472 -1.1522
+0.14683 0.17486 -1.1531
+0.15134 0.17505 -1.1543
+0.15599 0.17539 -1.1566
+0.16074 0.17582 -1.1594
+0.16577 0.17651 -1.164
+0.16907 0.17768 -1.1718
+0.17054 0.17806 -1.1744
+0.17177 0.17819 -1.1752
+0.17396 0.17816 -1.175
+0.17627 0.17826 -1.1756
+0.17782 0.1787 -1.1786
+-0.097344 0.19004 -1.2624
+-0.067255 0.18572 -1.2335
+-0.05309 0.18493 -1.2282
+-0.051933 0.18493 -1.2282
+-0.050774 0.18492 -1.2281
+-0.049617 0.18492 -1.2281
+-0.048428 0.18479 -1.2273
+-0.036781 0.18434 -1.2243
+-0.035634 0.18437 -1.2245
+-0.034485 0.1844 -1.2246
+-0.033332 0.1844 -1.2246
+-0.032149 0.18422 -1.2235
+-0.030976 0.1841 -1.2227
+-0.02981 0.18401 -1.2221
+-0.022938 0.18428 -1.2239
+-0.02179 0.18432 -1.2241
+-0.020643 0.18437 -1.2244
+-0.011428 0.18453 -1.2256
+-0.004508 0.1847 -1.2267
+-0.003356 0.1849 -1.228
+-0.002201 0.18499 -1.2286
+0.000113 0.18505 -1.229
+0.001271 0.1851 -1.2294
+0.00243 0.1852 -1.23
+0.036094 0.19175 -1.274
+0.037352 0.19205 -1.276
+0.070418 0.18132 -1.2039
+0.081844 0.18151 -1.2052
+0.082953 0.18145 -1.2048
+0.083661 0.18053 -1.1986
+0.083958 0.17876 -1.1867
+0.084545 0.17764 -1.1792
+0.086632 0.17736 -1.1773
+0.17074 0.17716 -1.1757
+0.17517 0.17716 -1.1758
+0.17641 0.17729 -1.1766
+0.18368 0.18118 -1.2027
+-0.098569 0.18892 -1.2629
+-0.095913 0.18837 -1.2592
+-0.093228 0.18774 -1.2549
+-0.087941 0.18655 -1.2469
+-0.082965 0.18592 -1.2427
+-0.080458 0.18554 -1.2401
+-0.077973 0.18518 -1.2377
+-0.073108 0.18467 -1.2342
+-0.068363 0.18441 -1.2325
+-0.065983 0.18425 -1.2314
+-0.063551 0.18392 -1.2292
+-0.061184 0.18377 -1.2281
+-0.058797 0.18354 -1.2266
+-0.056428 0.18334 -1.2253
+-0.054123 0.18335 -1.2254
+-0.051825 0.18339 -1.2256
+-0.049513 0.18337 -1.2255
+-0.047168 0.18323 -1.2245
+-0.044825 0.18308 -1.2235
+-0.042504 0.18301 -1.2231
+-0.040149 0.18278 -1.2215
+-0.037836 0.18271 -1.2211
+-0.035555 0.18282 -1.2217
+-0.033244 0.18276 -1.2214
+-0.030918 0.18261 -1.2203
+-0.028597 0.18246 -1.2194
+-0.026315 0.18257 -1.2201
+-0.024029 0.18266 -1.2207
+-0.021742 0.18276 -1.2214
+-0.019444 0.18278 -1.2215
+-0.017129 0.18263 -1.2205
+-0.014855 0.18294 -1.2226
+-0.012567 0.18315 -1.224
+-0.010265 0.18322 -1.2245
+-0.007963 0.18332 -1.2252
+-0.005657 0.18337 -1.2255
+-0.003352 0.18349 -1.2263
+-0.001043 0.18367 -1.2275
+0.00127 0.18378 -1.2283
+0.003586 0.18396 -1.2295
+0.005911 0.18426 -1.2315
+0.010572 0.18464 -1.2341
+0.015268 0.18522 -1.238
+0.017642 0.18567 -1.2411
+0.02003 0.18614 -1.2442
+0.02244 0.1867 -1.248
+0.024861 0.18724 -1.2516
+0.029784 0.18856 -1.2606
+0.032241 0.18905 -1.2639
+0.034855 0.19033 -1.2725
+0.037348 0.19083 -1.2759
+0.038627 0.19121 -1.2785
+0.07041 0.18016 -1.2038
+0.071534 0.18013 -1.2036
+0.073788 0.1801 -1.2034
+0.078409 0.1803 -1.2047
+0.080717 0.18039 -1.2053
+0.082896 0.18019 -1.2039
+0.083907 0.17993 -1.2022
+0.084597 0.17664 -1.1799
+0.08557 0.17635 -1.178
+0.08773 0.17623 -1.1772
+0.089909 0.17616 -1.1767
+0.11445 0.17302 -1.1555
+0.16343 0.17417 -1.163
+0.1696 0.17601 -1.1755
+0.17189 0.1761 -1.1761
+0.17408 0.17607 -1.1759
+0.17523 0.17611 -1.1762
+0.17674 0.1765 -1.1788
+0.18242 0.17992 -1.2019
+0.18399 0.18035 -1.2048
+-0.048286 0.18194 -1.2236
+-0.047095 0.18179 -1.2226
+-0.045942 0.18179 -1.2226
+-0.043622 0.18172 -1.2221
+0.016459 0.18434 -1.2399
+0.033507 0.18829 -1.2668
+0.036113 0.18945 -1.2747
+0.038635 0.19004 -1.2787
+0.039918 0.19043 -1.2813
+0.070393 0.17898 -1.2035
+0.08393 0.17884 -1.2025
+0.084661 0.17566 -1.1808
+0.086649 0.17518 -1.1776
+0.1753 0.17507 -1.1766
+0.18298 0.17934 -1.2056
+0.18421 0.17942 -1.2062
+-0.10244 0.1871 -1.2667
+-0.10103 0.18669 -1.2639
+-0.098544 0.18649 -1.2626
+-0.095813 0.18581 -1.2579
+-0.093019 0.18496 -1.2521
+-0.090346 0.18432 -1.2477
+-0.085335 0.18364 -1.2431
+-0.080368 0.183 -1.2387
+-0.075452 0.18239 -1.2346
+-0.070662 0.18203 -1.2321
+-0.065878 0.18164 -1.2294
+-0.061076 0.18113 -1.2259
+-0.056338 0.18074 -1.2233
+-0.051712 0.18068 -1.2229
+-0.049417 0.18071 -1.2231
+-0.04709 0.18063 -1.2225
+-0.044756 0.1805 -1.2216
+-0.042425 0.18037 -1.2208
+-0.037773 0.18011 -1.219
+-0.035468 0.18007 -1.2187
+-0.03317 0.18006 -1.2186
+-0.028561 0.17994 -1.2178
+-0.023986 0.18004 -1.2185
+-0.021696 0.18007 -1.2188
+-0.019404 0.18011 -1.219
+-0.017116 0.18019 -1.2196
+-0.014848 0.18055 -1.222
+-0.010247 0.18058 -1.2222
+-0.005647 0.18073 -1.2233
+-0.001041 0.18099 -1.2251
+0.003579 0.18129 -1.2271
+0.008219 0.18166 -1.2297
+0.012876 0.18203 -1.2321
+0.01526 0.1828 -1.2374
+0.016472 0.18331 -1.2409
+0.017641 0.18332 -1.241
+0.019981 0.18335 -1.2412
+0.02239 0.18393 -1.2452
+0.024826 0.18461 -1.2498
+0.02726 0.18516 -1.2536
+0.029707 0.18571 -1.2573
+0.032147 0.18612 -1.2602
+0.033424 0.18663 -1.2636
+0.034869 0.18801 -1.2731
+0.037398 0.18868 -1.2776
+0.039912 0.18919 -1.2812
+0.041166 0.18941 -1.2827
+0.071503 0.17779 -1.2031
+0.07378 0.17782 -1.2032
+0.076056 0.17784 -1.2034
+0.080572 0.1778 -1.2031
+0.082819 0.17776 -1.2028
+0.083851 0.17754 -1.2013
+0.084482 0.1765 -1.1942
+0.084791 0.17481 -1.1827
+0.085598 0.17419 -1.1784
+0.087746 0.17404 -1.1774
+0.089926 0.17397 -1.1769
+0.091879 0.17347 -1.1735
+0.095783 0.17253 -1.1671
+0.099831 0.17193 -1.1629
+0.10401 0.17159 -1.1606
+0.10821 0.17132 -1.1587
+0.11258 0.17132 -1.1587
+0.11473 0.17126 -1.1583
+0.11679 0.17109 -1.1571
+0.12099 0.17086 -1.1555
+0.12525 0.17072 -1.1546
+0.12949 0.17057 -1.1536
+0.13385 0.17059 -1.1537
+0.13828 0.17069 -1.1543
+0.14274 0.17082 -1.1552
+0.14722 0.17097 -1.1562
+0.15174 0.17115 -1.1574
+0.1564 0.17147 -1.1597
+0.16118 0.17191 -1.1626
+0.16374 0.1723 -1.1653
+0.16675 0.17314 -1.1711
+0.16973 0.17394 -1.1765
+0.17195 0.17394 -1.1765
+0.17422 0.17399 -1.1768
+0.17572 0.17437 -1.1795
+0.18189 0.17824 -1.2059
+0.18312 0.17833 -1.2065
+0.18433 0.17841 -1.207
+-0.10239 0.18581 -1.2661
+-0.097237 0.18507 -1.261
+-0.094279 0.18394 -1.2532
+-0.091574 0.18325 -1.2484
+-0.020529 0.17876 -1.2176
+-0.018244 0.17884 -1.2182
+-0.017109 0.17897 -1.2191
+-0.015996 0.17936 -1.2218
+0.014041 0.18093 -1.2326
+0.015268 0.18172 -1.238
+0.016479 0.18222 -1.2415
+0.021161 0.18227 -1.2418
+0.022353 0.18246 -1.2431
+0.023576 0.18287 -1.2459
+0.026016 0.18353 -1.2505
+0.030894 0.18454 -1.2574
+0.032119 0.18478 -1.2591
+0.033366 0.18512 -1.2614
+0.034851 0.18671 -1.2724
+0.036194 0.18747 -1.2776
+0.037442 0.18769 -1.2791
+0.038666 0.18779 -1.2798
+0.039894 0.1879 -1.2805
+0.071481 0.1766 -1.2027
+0.072629 0.17664 -1.203
+0.074915 0.17668 -1.2033
+0.083726 0.17615 -1.1995
+0.085143 0.17442 -1.1876
+0.086677 0.17301 -1.178
+0.1139 0.17057 -1.1611
+0.115 0.17057 -1.1611
+0.11597 0.17039 -1.1598
+0.16861 0.17281 -1.1764
+0.17086 0.17285 -1.1766
+0.17312 0.17289 -1.1769
+0.17428 0.17294 -1.1772
+0.18196 0.17717 -1.2064
+0.18316 0.17724 -1.2068
+-0.10375 0.18491 -1.2681
+-0.10112 0.18447 -1.265
+-0.098612 0.18424 -1.2634
+-0.09726 0.18393 -1.2613
+-0.095681 0.18318 -1.2561
+-0.094188 0.18258 -1.252
+-0.092832 0.18223 -1.2496
+-0.090225 0.18172 -1.246
+-0.087679 0.18131 -1.2432
+-0.07793 0.18042 -1.237
+-0.075379 0.17989 -1.2334
+-0.073003 0.17976 -1.2325
+-0.058636 0.17842 -1.2232
+-0.056268 0.17822 -1.2218
+-0.053944 0.17814 -1.2213
+-0.051665 0.17822 -1.2218
+-0.04942 0.17842 -1.2232
+-0.047122 0.17844 -1.2233
+-0.044714 0.17803 -1.2205
+-0.042375 0.17786 -1.2193
+-0.040046 0.17771 -1.2183
+-0.035427 0.17757 -1.2173
+-0.021654 0.17744 -1.2164
+-0.020508 0.17744 -1.2164
+-0.019379 0.17758 -1.2174
+-0.01824 0.17766 -1.218
+-0.017146 0.17821 -1.2218
+-0.014867 0.17847 -1.2236
+-0.012557 0.17839 -1.223
+-0.010244 0.17822 -1.2219
+-0.007939 0.17815 -1.2214
+-0.005639 0.17816 -1.2215
+-0.003339 0.17822 -1.2218
+0.001265 0.17857 -1.2243
+0.010529 0.17926 -1.229
+0.012866 0.17957 -1.2312
+0.014045 0.17982 -1.2329
+0.015303 0.18097 -1.2409
+0.017661 0.18119 -1.2424
+0.019996 0.18115 -1.2421
+0.022351 0.18128 -1.243
+0.024755 0.18174 -1.2462
+0.027207 0.18245 -1.2511
+0.029625 0.18283 -1.2538
+0.032043 0.18316 -1.2561
+0.037421 0.18638 -1.2784
+0.038669 0.1866 -1.2799
+0.072617 0.17547 -1.2028
+0.073778 0.17554 -1.2032
+0.076039 0.17553 -1.2031
+0.078246 0.17539 -1.2022
+0.082618 0.17506 -1.1999
+0.084639 0.17457 -1.1964
+0.085441 0.17391 -1.1919
+0.085746 0.17226 -1.1805
+0.086688 0.17192 -1.1781
+0.087764 0.17186 -1.1777
+0.08995 0.1718 -1.1772
+0.1107 0.1696 -1.162
+0.11288 0.16958 -1.1618
+0.11503 0.16952 -1.1614
+0.11717 0.16946 -1.1609
+0.11912 0.16912 -1.1586
+0.12118 0.16895 -1.1574
+0.12331 0.16887 -1.1568
+0.14075 0.16886 -1.1568
+0.14298 0.16893 -1.1572
+0.14522 0.16899 -1.1576
+0.14749 0.16909 -1.1583
+0.14975 0.16919 -1.159
+0.15895 0.16967 -1.1623
+0.16136 0.16991 -1.1639
+0.16404 0.17041 -1.1674
+0.16721 0.17141 -1.1743
+0.16866 0.17175 -1.1767
+0.16977 0.17176 -1.1768
+0.17197 0.17174 -1.1766
+0.17314 0.1718 -1.177
+0.17466 0.17221 -1.1799
+0.18081 0.17603 -1.2063
+0.18317 0.17611 -1.2069
+-0.1052 0.18417 -1.2712
+-0.10244 0.1835 -1.2666
+-0.097273 0.18277 -1.2615
+-0.09409 0.18121 -1.2507
+-0.09142 0.18059 -1.2463
+-0.076577 0.17881 -1.234
+-0.055084 0.17696 -1.2211
+-0.053933 0.17696 -1.221
+-0.052803 0.17702 -1.2215
+-0.045955 0.17723 -1.223
+-0.043535 0.17676 -1.2196
+-0.020498 0.1762 -1.2158
+-0.018283 0.17693 -1.2209
+-0.01604 0.17755 -1.2252
+0.011689 0.17813 -1.2293
+0.012856 0.17827 -1.2302
+0.014093 0.17927 -1.2372
+0.016507 0.18019 -1.2436
+0.023551 0.18033 -1.2446
+0.024743 0.18048 -1.2457
+0.025959 0.18078 -1.2478
+0.03075 0.18132 -1.2515
+0.031943 0.1814 -1.2521
+0.072602 0.1743 -1.2025
+0.074921 0.17443 -1.2034
+0.085564 0.17303 -1.1936
+0.086725 0.17089 -1.1786
+0.16277 0.16914 -1.1662
+0.16576 0.16994 -1.1718
+0.16858 0.17057 -1.1762
+0.17088 0.17064 -1.1767
+0.172 0.17066 -1.1768
+0.17321 0.17076 -1.1775
+0.18091 0.17499 -1.207
+0.18212 0.17505 -1.2075
+0.18321 0.17501 -1.2072
+-0.10504 0.18269 -1.2693
+-0.10376 0.18254 -1.2682
+-0.10126 0.18235 -1.2669
+-0.098744 0.1821 -1.2652
+-0.097258 0.18155 -1.2613
+-0.095383 0.18025 -1.2522
+-0.093935 0.17974 -1.2486
+-0.092643 0.17951 -1.247
+-0.090072 0.17907 -1.2439
+-0.085156 0.17858 -1.2405
+-0.080443 0.17849 -1.2399
+-0.078023 0.1783 -1.2385
+-0.076596 0.17769 -1.2343
+-0.075327 0.17744 -1.2325
+-0.070536 0.17707 -1.2299
+-0.065733 0.17661 -1.2267
+-0.060957 0.17616 -1.2236
+-0.05624 0.17583 -1.2212
+-0.05394 0.17583 -1.2212
+-0.051705 0.17605 -1.2228
+-0.047229 0.17654 -1.2262
+-0.046025 0.17635 -1.2249
+-0.044711 0.17572 -1.2204
+-0.042337 0.1754 -1.2182
+-0.040008 0.17525 -1.2172
+-0.037699 0.17518 -1.2166
+-0.033093 0.17506 -1.2158
+-0.028506 0.17501 -1.2155
+-0.023915 0.17492 -1.2149
+-0.021624 0.1749 -1.2147
+-0.020499 0.17506 -1.2159
+-0.019373 0.17524 -1.2171
+-0.017222 0.17669 -1.2273
+-0.014914 0.17672 -1.2275
+-0.012591 0.17657 -1.2265
+-0.010262 0.17623 -1.2241
+-0.007937 0.17581 -1.2211
+-0.005634 0.17569 -1.2203
+-0.003335 0.17566 -1.2201
+-0.001038 0.17584 -1.2213
+0.001263 0.17593 -1.222
+0.003567 0.17606 -1.2229
+0.008191 0.17644 -1.2256
+0.010513 0.17667 -1.2272
+0.011676 0.17679 -1.228
+0.012889 0.17757 -1.2335
+0.014145 0.17876 -1.2418
+0.015354 0.17923 -1.2451
+0.017695 0.17919 -1.2449
+0.022384 0.1792 -1.2449
+0.024755 0.17939 -1.2463
+0.027143 0.17967 -1.2482
+0.029529 0.17988 -1.2497
+0.031935 0.18018 -1.2518
+0.073741 0.17319 -1.2026
+0.076024 0.17322 -1.2029
+0.080437 0.17297 -1.2011
+0.084677 0.17239 -1.197
+0.08566 0.1721 -1.195
+0.08622 0.17098 -1.1871
+0.086753 0.16983 -1.179
+0.087781 0.16967 -1.1779
+0.089966 0.16961 -1.1774
+0.091995 0.16926 -1.175
+0.095915 0.16836 -1.1687
+0.099994 0.16782 -1.1649
+0.10421 0.16754 -1.1629
+0.1086 0.16755 -1.163
+0.11292 0.16745 -1.1622
+0.11728 0.16743 -1.1621
+0.11938 0.1673 -1.1611
+0.12139 0.16705 -1.1594
+0.12559 0.16683 -1.1578
+0.12983 0.16667 -1.1567
+0.13425 0.16674 -1.1572
+0.13873 0.16688 -1.1582
+0.14104 0.16703 -1.1592
+0.14349 0.16734 -1.1614
+0.14586 0.16755 -1.1628
+0.14796 0.16744 -1.1621
+0.15226 0.16735 -1.1615
+0.15677 0.16749 -1.1624
+0.16158 0.16794 -1.1655
+0.16292 0.16819 -1.1673
+0.16442 0.16859 -1.1702
+0.16746 0.16944 -1.1761
+0.16973 0.1695 -1.1765
+0.17088 0.16953 -1.1767
+0.17975 0.17383 -1.2069
+0.18101 0.17395 -1.2077
+0.18217 0.17396 -1.2078
+-0.10369 0.18123 -1.2674
+-0.10244 0.18112 -1.2667
+-0.10003 0.18108 -1.2664
+-0.09875 0.18092 -1.2652
+-0.097199 0.18025 -1.2605
+-0.095363 0.17904 -1.2519
+-0.093886 0.17847 -1.2479
+-0.091256 0.17792 -1.2441
+-0.076751 0.17689 -1.2368
+-0.046134 0.17561 -1.2278
+-0.043513 0.17437 -1.2191
+-0.04115 0.17409 -1.217
+-0.038837 0.17399 -1.2164
+-0.022761 0.1737 -1.2144
+-0.021625 0.17376 -1.2148
+-0.019462 0.17489 -1.2227
+-0.018385 0.17559 -1.2277
+-0.01609 0.17578 -1.2291
+-0.009114 0.17518 -1.2248
+-0.007949 0.17492 -1.223
+-0.006791 0.17477 -1.2219
+-0.005635 0.17459 -1.2206
+-0.004485 0.17457 -1.2205
+-0.002187 0.17463 -1.2209
+0.000112 0.17463 -1.2209
+0.002413 0.17475 -1.2218
+0.011679 0.17568 -1.2283
+0.012964 0.17742 -1.2407
+0.014194 0.1782 -1.2462
+0.01654 0.1782 -1.2462
+0.030686 0.17859 -1.2489
+0.031865 0.17861 -1.249
+0.074841 0.17198 -1.2021
+0.085706 0.17106 -1.1956
+0.086327 0.17007 -1.1886
+0.086895 0.169 -1.181
+0.14268 0.16657 -1.1637
+0.14378 0.16658 -1.1638
+0.14489 0.16659 -1.1638
+0.14706 0.16656 -1.1636
+0.16297 0.16714 -1.1677
+0.16615 0.16813 -1.1747
+0.16861 0.16838 -1.1764
+0.16971 0.16836 -1.1763
+0.17992 0.17285 -1.208
+0.18212 0.17277 -1.2074
+-0.10111 0.17968 -1.2649
+-0.099916 0.17968 -1.2649
+-0.098469 0.17922 -1.2616
+-0.093703 0.17695 -1.2455
+-0.092483 0.17686 -1.2448
+-0.089906 0.1764 -1.2416
+-0.087463 0.17619 -1.2401
+-0.085088 0.17611 -1.2395
+-0.082813 0.17623 -1.2404
+-0.080633 0.17657 -1.2428
+-0.078352 0.17671 -1.2438
+-0.076956 0.17619 -1.2402
+-0.07529 0.17504 -1.2319
+-0.072844 0.17473 -1.2298
+-0.070469 0.17459 -1.2287
+-0.06808 0.1744 -1.2274
+-0.063287 0.17393 -1.2241
+-0.058547 0.17355 -1.2213
+-0.056238 0.17352 -1.2212
+-0.053979 0.17365 -1.2221
+-0.051834 0.17418 -1.2259
+-0.049642 0.17459 -1.2288
+-0.04737 0.17474 -1.2299
+-0.04504 0.17469 -1.2295
+-0.042376 0.17326 -1.2194
+-0.04114 0.1729 -1.2168
+-0.039986 0.17286 -1.2165
+-0.037655 0.17268 -1.2152
+-0.03536 0.17265 -1.215
+-0.030773 0.17259 -1.2146
+-0.026175 0.17244 -1.2135
+-0.02389 0.17246 -1.2136
+-0.022751 0.17248 -1.2138
+-0.020608 0.17369 -1.2224
+-0.019561 0.17461 -1.229
+-0.017266 0.17481 -1.2304
+-0.014944 0.17476 -1.23
+-0.012622 0.17468 -1.2295
+-0.010305 0.17465 -1.2293
+-0.007976 0.17436 -1.2272
+-0.005652 0.17396 -1.2244
+-0.00449 0.17362 -1.2219
+-0.003338 0.17355 -1.2214
+-0.001038 0.17354 -1.2213
+0.000112 0.17351 -1.2212
+0.001262 0.17351 -1.2212
+0.003565 0.17364 -1.2221
+0.00587 0.17374 -1.2228
+0.008181 0.17391 -1.224
+0.010499 0.17412 -1.2255
+0.011727 0.17523 -1.2333
+0.01299 0.17661 -1.2432
+0.014206 0.17719 -1.2473
+0.015379 0.17717 -1.2472
+0.0177 0.17689 -1.2452
+0.020038 0.17683 -1.2448
+0.02239 0.1769 -1.2452
+0.024747 0.17699 -1.2459
+0.027105 0.17706 -1.2464
+0.029452 0.17706 -1.2464
+0.030621 0.17704 -1.2462
+0.074789 0.17073 -1.2013
+0.075944 0.17078 -1.2016
+0.078222 0.17081 -1.2018
+0.080422 0.17067 -1.2009
+0.082587 0.17047 -1.1994
+0.08473 0.17024 -1.1978
+0.085812 0.17015 -1.1971
+0.086599 0.16948 -1.1924
+0.087019 0.16812 -1.1827
+0.087823 0.16753 -1.1785
+0.090003 0.16745 -1.1779
+0.09206 0.16716 -1.1758
+0.094004 0.16668 -1.1724
+0.11515 0.16531 -1.1626
+0.11952 0.1653 -1.1625
+0.13665 0.16482 -1.1591
+0.13909 0.16512 -1.1612
+0.14162 0.16552 -1.164
+0.14383 0.16553 -1.1641
+0.146 0.16551 -1.164
+0.14822 0.16554 -1.1642
+0.15041 0.16554 -1.1642
+0.15932 0.16567 -1.1651
+0.1618 0.16596 -1.1671
+0.16472 0.1667 -1.1724
+0.16635 0.16723 -1.1761
+0.1675 0.16726 -1.1763
+0.16972 0.16727 -1.1764
+0.17997 0.17176 -1.2083
+0.1811 0.17176 -1.2083
+-0.088502 0.17477 -1.2383
+-0.087311 0.17472 -1.2379
+-0.086111 0.17465 -1.2374
+-0.084946 0.17464 -1.2374
+-0.083781 0.17465 -1.2374
+-0.082716 0.17486 -1.239
+-0.081661 0.1751 -1.2407
+-0.080652 0.17544 -1.2432
+-0.079573 0.17565 -1.2446
+-0.07854 0.17596 -1.2468
+-0.077318 0.17585 -1.246
+-0.075696 0.17481 -1.2386
+-0.074031 0.17364 -1.2303
+-0.071616 0.1734 -1.2286
+-0.055124 0.17248 -1.222
+-0.054066 0.17278 -1.2241
+-0.053052 0.17323 -1.2273
+-0.041279 0.17233 -1.2209
+-0.038808 0.17157 -1.2155
+-0.02502 0.17122 -1.213
+-0.023886 0.17128 -1.2134
+-0.021752 0.17248 -1.222
+-0.020723 0.1735 -1.2293
+-0.019595 0.17377 -1.2312
+-0.018447 0.17387 -1.232
+-0.016123 0.17383 -1.2317
+-0.006835 0.17357 -1.2298
+-0.005669 0.17333 -1.2281
+-0.004505 0.17305 -1.2261
+-0.002191 0.1726 -1.2229
+-0.001038 0.17248 -1.222
+0.001263 0.17242 -1.2216
+0.002413 0.17242 -1.2216
+0.003564 0.17247 -1.2219
+0.004715 0.17247 -1.2219
+0.00702 0.17255 -1.2225
+0.075901 0.16955 -1.201
+0.07706 0.16961 -1.2014
+0.079307 0.16958 -1.2011
+0.085834 0.16906 -1.1974
+0.087174 0.1673 -1.1848
+0.087933 0.16663 -1.18
+0.088947 0.16644 -1.1787
+0.091068 0.16626 -1.1774
+0.16638 0.16614 -1.1763
+0.1686 0.16614 -1.1763
+0.17891 0.1707 -1.2089
+0.18001 0.17066 -1.2086
+0.18099 0.17051 -1.2076
+-0.074241 0.17297 -1.2338
+-0.072789 0.17228 -1.2288
+-0.070392 0.17208 -1.2274
+-0.068002 0.17188 -1.226
+-0.065611 0.17167 -1.2244
+-0.063231 0.17147 -1.223
+-0.060853 0.17126 -1.2215
+-0.058513 0.17114 -1.2206
+-0.056288 0.17137 -1.2223
+-0.055255 0.17174 -1.2249
+-0.054308 0.17239 -1.2296
+-0.052129 0.17284 -1.2329
+-0.049844 0.17297 -1.2338
+-0.047538 0.17304 -1.2343
+-0.042892 0.17305 -1.2344
+-0.041625 0.17262 -1.2313
+-0.040175 0.17138 -1.2223
+-0.037649 0.17036 -1.215
+-0.035336 0.17025 -1.2142
+-0.033044 0.17022 -1.214
+-0.030745 0.17015 -1.2135
+-0.028448 0.17008 -1.213
+-0.026159 0.17005 -1.2128
+-0.025022 0.17009 -1.2131
+-0.022903 0.17133 -1.222
+-0.021858 0.17216 -1.228
+-0.0196 0.17265 -1.2315
+-0.017294 0.17278 -1.2325
+-0.014984 0.1729 -1.2333
+-0.012672 0.17305 -1.2344
+-0.010356 0.17319 -1.2354
+-0.008035 0.17332 -1.2363
+-0.005707 0.17331 -1.2363
+-0.00454 0.17321 -1.2356
+0.004715 0.17133 -1.222
+0.005866 0.17133 -1.222
+0.008161 0.1712 -1.2211
+0.077016 0.16838 -1.2007
+0.07816 0.16841 -1.2009
+0.080378 0.16832 -1.2002
+0.084763 0.16805 -1.1983
+0.086788 0.1676 -1.195
+0.087581 0.16696 -1.1904
+0.088176 0.16597 -1.1833
+0.08898 0.16539 -1.1791
+0.090034 0.16529 -1.1784
+0.092033 0.16489 -1.1755
+0.096027 0.16415 -1.1701
+0.1001 0.16359 -1.1661
+0.10434 0.16335 -1.1643
+0.10879 0.16345 -1.165
+0.11308 0.1633 -1.164
+0.11525 0.16327 -1.1637
+0.11751 0.16335 -1.1643
+0.12162 0.16298 -1.1616
+0.12574 0.16265 -1.1592
+0.12997 0.16248 -1.158
+0.13444 0.1626 -1.1588
+0.13937 0.16325 -1.1636
+0.14178 0.16351 -1.1654
+0.14386 0.16337 -1.1644
+0.1483 0.16343 -1.1648
+0.15275 0.1635 -1.1653
+0.15715 0.16351 -1.1653
+0.16204 0.16401 -1.1689
+0.16496 0.16472 -1.1741
+0.16638 0.16503 -1.1763
+0.16754 0.16509 -1.1767
+0.16867 0.1651 -1.1768
+0.17892 0.16956 -1.2089
+0.17997 0.16948 -1.2084
+-0.07259 0.17066 -1.2254
+-0.071436 0.17066 -1.2254
+-0.069113 0.17062 -1.2252
+-0.06678 0.17056 -1.2247
+-0.061973 0.17003 -1.2209
+-0.060818 0.17001 -1.2208
+-0.059668 0.17001 -1.2208
+-0.058527 0.17003 -1.2209
+-0.057506 0.17042 -1.2237
+-0.056597 0.17115 -1.2291
+-0.055608 0.17167 -1.2328
+-0.053421 0.17211 -1.236
+-0.041766 0.17204 -1.2355
+-0.040517 0.17167 -1.2329
+-0.036492 0.16916 -1.2146
+-0.035341 0.16913 -1.2144
+-0.034172 0.169 -1.2135
+-0.029566 0.1688 -1.212
+-0.028425 0.1688 -1.212
+-0.027288 0.16883 -1.2122
+-0.026158 0.1689 -1.2128
+-0.024068 0.17028 -1.2228
+-0.02302 0.17105 -1.2283
+-0.020762 0.1715 -1.2317
+-0.013851 0.1721 -1.236
+-0.011548 0.17246 -1.2386
+-0.004571 0.17322 -1.2441
+-0.003402 0.17333 -1.2449
+0.078112 0.16718 -1.2002
+0.079263 0.16722 -1.2005
+0.087856 0.16636 -1.1942
+0.089221 0.16473 -1.1823
+0.090975 0.16387 -1.1761
+0.11643 0.16228 -1.1645
+0.16647 0.16402 -1.177
+0.16895 0.16426 -1.1788
+0.17983 0.16821 -1.2074
+-0.070144 0.16917 -1.223
+-0.068983 0.16915 -1.2229
+-0.067822 0.16912 -1.2227
+-0.06551 0.1691 -1.2225
+-0.063123 0.16888 -1.2209
+-0.061962 0.16884 -1.2206
+-0.055966 0.17161 -1.2409
+-0.054764 0.1715 -1.2401
+-0.052374 0.17132 -1.2388
+-0.050019 0.17125 -1.2382
+-0.047683 0.17123 -1.2381
+-0.045352 0.17123 -1.2381
+-0.043001 0.17116 -1.2376
+-0.040645 0.17105 -1.2368
+-0.039451 0.17092 -1.2359
+-0.034181 0.1679 -1.2138
+-0.033036 0.16789 -1.2137
+-0.03071 0.16767 -1.2121
+-0.029557 0.1676 -1.2116
+-0.024212 0.17014 -1.2302
+-0.023112 0.17057 -1.2333
+-0.021951 0.17057 -1.2333
+-0.019623 0.17053 -1.233
+-0.017326 0.17077 -1.2348
+-0.015018 0.17097 -1.2363
+-0.013868 0.17114 -1.2375
+-0.012717 0.17133 -1.2389
+-0.011579 0.17175 -1.2419
+-0.010419 0.1719 -1.2431
+-0.008089 0.17213 -1.2447
+-0.00576 0.17257 -1.2479
+-0.004592 0.17282 -1.2498
+0.078056 0.16592 -1.1993
+0.080336 0.16597 -1.1996
+0.082535 0.16585 -1.1987
+0.084744 0.16575 -1.198
+0.086942 0.16564 -1.1972
+0.088755 0.16482 -1.1912
+0.089405 0.16395 -1.1848
+0.089909 0.16284 -1.1767
+0.090804 0.16246 -1.1739
+0.091816 0.16229 -1.1727
+0.093948 0.16216 -1.1717
+0.096045 0.16197 -1.1703
+0.098082 0.16169 -1.1683
+0.10656 0.16119 -1.1646
+0.10884 0.16132 -1.1656
+0.11105 0.16134 -1.1657
+0.11317 0.16123 -1.1649
+0.11538 0.16126 -1.1651
+0.11648 0.16126 -1.1651
+0.11755 0.16122 -1.1648
+0.11959 0.16101 -1.1633
+0.13696 0.16081 -1.1617
+0.13964 0.16138 -1.1659
+0.14191 0.16146 -1.1665
+0.14403 0.16137 -1.1659
+0.14619 0.16133 -1.1655
+0.1652 0.16275 -1.1758
+0.16777 0.16309 -1.1783
+0.16928 0.16347 -1.1811
+0.17501 0.16682 -1.2055
+0.17633 0.16698 -1.2068
+0.17874 0.16712 -1.2077
+-0.067684 0.16763 -1.2202
+-0.06655 0.16767 -1.2205
+-0.065385 0.16763 -1.2202
+-0.064212 0.16757 -1.2197
+-0.063057 0.16755 -1.2196
+-0.061969 0.16771 -1.2208
+-0.058489 0.17098 -1.2449
+-0.057338 0.17105 -1.2453
+-0.056166 0.17105 -1.2453
+-0.053747 0.17081 -1.2436
+-0.051323 0.17054 -1.2416
+-0.050125 0.17044 -1.2409
+-0.048956 0.17044 -1.2409
+-0.046621 0.17044 -1.2409
+-0.045435 0.17038 -1.2404
+-0.044262 0.17036 -1.2403
+-0.043086 0.17033 -1.2401
+-0.041913 0.17031 -1.2399
+-0.040746 0.17031 -1.2399
+-0.039562 0.17024 -1.2394
+-0.024335 0.16984 -1.2365
+-0.023171 0.16984 -1.2365
+-0.020846 0.16987 -1.2367
+-0.018527 0.16996 -1.2374
+-0.017358 0.16992 -1.2371
+-0.016189 0.16988 -1.2368
+-0.015039 0.17004 -1.238
+0.079127 0.16467 -1.1984
+0.087986 0.16435 -1.196
+0.091552 0.16072 -1.1693
+0.092769 0.16092 -1.1708
+0.094966 0.16091 -1.1707
+0.11431 0.16019 -1.1653
+0.1154 0.16019 -1.1653
+0.11651 0.1602 -1.1654
+0.14085 0.1604 -1.1668
+0.14304 0.16039 -1.1667
+0.16666 0.16198 -1.1783
+0.16792 0.16212 -1.1794
+0.17505 0.16572 -1.2058
+0.17747 0.16585 -1.2068
+0.17852 0.16578 -1.2062
+-0.058686 0.17038 -1.2491
+-0.057484 0.17031 -1.2486
+-0.056294 0.17026 -1.2482
+-0.055112 0.17024 -1.2481
+-0.052714 0.17009 -1.2469
+-0.050332 0.16997 -1.2461
+-0.047943 0.16982 -1.245
+-0.045629 0.16993 -1.2458
+-0.043266 0.16986 -1.2453
+-0.040985 0.17013 -1.2473
+-0.038614 0.17003 -1.2466
+-0.037428 0.16997 -1.2461
+-0.025554 0.16904 -1.2392
+-0.024394 0.16908 -1.2395
+-0.022071 0.16916 -1.2401
+-0.020907 0.1692 -1.2404
+-0.019739 0.1692 -1.2404
+0.080189 0.16341 -1.1974
+0.082504 0.16353 -1.1983
+0.084764 0.16353 -1.1983
+0.087056 0.16359 -1.1988
+0.088076 0.16339 -1.1973
+0.091449 0.15944 -1.168
+0.093754 0.15962 -1.1693
+0.094925 0.15973 -1.1701
+0.095985 0.15967 -1.1696
+0.10011 0.15921 -1.1662
+0.10435 0.15898 -1.1645
+0.10873 0.15896 -1.1643
+0.11318 0.15906 -1.1651
+0.11536 0.15903 -1.1648
+0.11745 0.15888 -1.1638
+0.1216 0.15858 -1.1615
+0.12568 0.15821 -1.1587
+0.12983 0.15794 -1.1567
+0.13446 0.15825 -1.159
+0.13952 0.15905 -1.1649
+0.14088 0.15934 -1.167
+0.14198 0.15934 -1.167
+0.14416 0.15932 -1.1669
+0.14864 0.15941 -1.1676
+0.15299 0.15935 -1.1671
+0.15749 0.15945 -1.1679
+0.16247 0.16003 -1.1721
+0.16546 0.16078 -1.1777
+0.17345 0.16414 -1.2026
+0.17497 0.1645 -1.2052
+0.17617 0.16457 -1.2057
+0.17731 0.16457 -1.2057
+-0.055255 0.1695 -1.2514
+-0.054077 0.1695 -1.2514
+-0.052888 0.16947 -1.2511
+-0.051704 0.16945 -1.2509
+-0.050526 0.16945 -1.2509
+-0.049349 0.16945 -1.251
+-0.042351 0.16972 -1.253
+-0.0413 0.17025 -1.257
+-0.040117 0.17025 -1.257
+-0.038847 0.16988 -1.2542
+-0.037577 0.16947 -1.2511
+-0.036372 0.16935 -1.2502
+-0.024449 0.16829 -1.2423
+-0.023312 0.16853 -1.2441
+-0.022145 0.16856 -1.2444
+0.081271 0.16219 -1.1967
+0.082461 0.16231 -1.1976
+0.083653 0.16244 -1.1986
+0.084931 0.16272 -1.2007
+0.086223 0.16302 -1.2029
+0.087414 0.16313 -1.2037
+0.094853 0.15851 -1.1693
+0.11629 0.15771 -1.1632
+0.14082 0.15817 -1.1665
+0.1431 0.15826 -1.1672
+0.16397 0.1593 -1.1749
+0.16562 0.15983 -1.1789
+0.17225 0.16295 -1.2021
+0.17366 0.16321 -1.2041
+0.17496 0.16336 -1.2052
+0.17614 0.1634 -1.2055
+-0.049576 0.16905 -1.2568
+-0.048392 0.16904 -1.2568
+-0.046031 0.16906 -1.2569
+-0.043716 0.16926 -1.2584
+-0.041418 0.16955 -1.2606
+-0.039016 0.16943 -1.2597
+-0.013085 0.17148 -1.2751
+-0.01188 0.17142 -1.2746
+0.086454 0.16233 -1.2062
+0.087565 0.16228 -1.2058
+0.090955 0.15639 -1.1616
+0.093258 0.15658 -1.163
+0.095861 0.15726 -1.1681
+0.098043 0.15722 -1.1679
+0.10012 0.15702 -1.1663
+0.1022 0.15685 -1.1651
+0.11077 0.15655 -1.1627
+0.11298 0.15657 -1.1629
+0.11513 0.15652 -1.1625
+0.11623 0.15652 -1.1625
+0.11732 0.15652 -1.1625
+0.11947 0.15646 -1.162
+0.12765 0.15576 -1.1567
+0.13189 0.15562 -1.1557
+0.13445 0.15605 -1.159
+0.13692 0.15638 -1.1614
+0.13936 0.15666 -1.1635
+0.14195 0.1571 -1.1668
+0.14421 0.15717 -1.1673
+0.14646 0.15723 -1.1677
+0.14864 0.1572 -1.1675
+0.15077 0.15713 -1.167
+0.16 0.15756 -1.1702
+0.16258 0.15792 -1.1729
+0.16412 0.15834 -1.1761
+0.16608 0.15916 -1.1822
+0.17092 0.16162 -1.2007
+0.17364 0.16205 -1.2039
+0.17608 0.16221 -1.2051
+-0.047414 0.16859 -1.2623
+-0.046198 0.16849 -1.2615
+-0.045021 0.16853 -1.2618
+-0.040362 0.16891 -1.2648
+-0.03926 0.1693 -1.2676
+-0.015496 0.1704 -1.276
+-0.014295 0.1704 -1.276
+-0.013094 0.1704 -1.276
+0.086502 0.16128 -1.2069
+0.089761 0.15512 -1.1603
+0.094377 0.15552 -1.1633
+0.11621 0.1554 -1.1623
+0.13302 0.15457 -1.156
+0.16418 0.15729 -1.1765
+0.16887 0.15962 -1.1942
+0.17109 0.16065 -1.2019
+0.17236 0.16078 -1.2029
+0.17477 0.16092 -1.2039
+0.17591 0.16092 -1.2039
+-0.047643 0.16821 -1.2685
+-0.046449 0.16821 -1.2685
+-0.044056 0.16819 -1.2683
+-0.041657 0.16814 -1.268
+-0.039316 0.16834 -1.2695
+-0.017891 0.16913 -1.2755
+-0.016694 0.16917 -1.2758
+-0.015499 0.16923 -1.2763
+-0.013115 0.16947 -1.2781
+0.086647 0.16041 -1.2089
+0.087637 0.16014 -1.2069
+0.088679 0.15405 -1.1605
+0.090798 0.15393 -1.1596
+0.093014 0.15398 -1.16
+0.094137 0.15403 -1.1603
+0.095437 0.15437 -1.1629
+0.097974 0.15491 -1.167
+0.10008 0.15476 -1.1659
+0.10428 0.15448 -1.1637
+0.10862 0.15442 -1.1632
+0.11298 0.15438 -1.1629
+0.11513 0.15433 -1.1625
+0.11732 0.15432 -1.1625
+0.12154 0.15412 -1.1609
+0.12561 0.15374 -1.1581
+0.1276 0.15351 -1.1563
+0.12968 0.1534 -1.1554
+0.13189 0.15343 -1.1556
+0.13301 0.15347 -1.1559
+0.13439 0.15381 -1.1585
+0.13694 0.15422 -1.1616
+0.13927 0.15437 -1.1628
+0.14159 0.15451 -1.1638
+0.14395 0.15469 -1.1652
+0.14839 0.15474 -1.1656
+0.15295 0.15491 -1.1668
+0.15761 0.15516 -1.1687
+0.16275 0.15587 -1.1741
+0.16442 0.1564 -1.1782
+0.16949 0.15908 -1.1986
+0.17101 0.15945 -1.2014
+0.17351 0.15966 -1.203
+0.17465 0.15966 -1.203
+-0.046721 0.16799 -1.276
+-0.045477 0.16783 -1.2747
+-0.044259 0.16776 -1.2742
+-0.043043 0.1677 -1.2737
+-0.041792 0.16749 -1.2721
+-0.040584 0.16745 -1.2718
+-0.038197 0.16748 -1.272
+-0.037002 0.16749 -1.2721
+-0.03581 0.16751 -1.2723
+-0.034621 0.16756 -1.2726
+-0.033435 0.16761 -1.2731
+-0.03224 0.16763 -1.2732
+-0.031042 0.16764 -1.2733
+-0.029853 0.16769 -1.2737
+-0.028666 0.16775 -1.2742
+-0.027467 0.16775 -1.2742
+-0.026259 0.1677 -1.2738
+-0.02506 0.1677 -1.2738
+-0.023861 0.1677 -1.2738
+-0.02265 0.16761 -1.2731
+-0.021452 0.16761 -1.2731
+-0.020269 0.16774 -1.2741
+-0.019077 0.1678 -1.2745
+-0.01669 0.16793 -1.2755
+0.087149 0.16019 -1.216
+0.089668 0.15277 -1.1591
+0.094073 0.15283 -1.1595
+0.096542 0.15328 -1.163
+0.097886 0.15367 -1.166
+0.098985 0.15367 -1.166
+0.13073 0.15226 -1.1551
+0.13311 0.15249 -1.1568
+0.16479 0.15564 -1.1809
+0.16958 0.15803 -1.1992
+0.17451 0.1584 -1.202
+-0.046814 0.16712 -1.2785
+-0.04429 0.16668 -1.2751
+-0.041852 0.16653 -1.274
+-0.039407 0.16633 -1.2725
+-0.037009 0.16632 -1.2724
+-0.034614 0.16632 -1.2724
+-0.032217 0.16631 -1.2723
+-0.029831 0.16637 -1.2727
+-0.027437 0.16638 -1.2728
+-0.025043 0.16639 -1.2729
+-0.022649 0.16641 -1.273
+-0.020257 0.16644 -1.2733
+-0.01788 0.16663 -1.2747
+-0.015502 0.16686 -1.2766
+-0.013122 0.16715 -1.2788
+0.087961 0.15844 -1.2114
+0.088587 0.1517 -1.1593
+0.09072 0.15162 -1.1586
+0.092925 0.15165 -1.1588
+0.095188 0.15178 -1.1598
+0.097614 0.15215 -1.1627
+0.098884 0.15242 -1.1648
+0.099982 0.15242 -1.1648
+0.10212 0.15234 -1.1641
+0.11511 0.15211 -1.1624
+0.12768 0.15142 -1.157
+0.1296 0.15113 -1.1547
+0.13076 0.15121 -1.1553
+0.13205 0.15143 -1.1571
+0.13456 0.15181 -1.16
+0.13691 0.15199 -1.1614
+0.1393 0.15221 -1.163
+0.14164 0.15237 -1.1643
+0.16012 0.15326 -1.1711
+0.16297 0.15387 -1.1758
+0.16822 0.15669 -1.1976
+0.17102 0.15719 -1.2014
+0.1733 0.1572 -1.2015
+-0.045569 0.16577 -1.2774
+0.089607 0.15049 -1.1583
+0.098659 0.15098 -1.1621
+0.131 0.15039 -1.1574
+0.1334 0.15064 -1.1593
+0.16966 0.15585 -1.1998
+0.17217 0.15607 -1.2015
+-0.046846 0.16482 -1.2794
+-0.044345 0.16448 -1.2767
+-0.039456 0.16414 -1.2741
+-0.034604 0.16387 -1.272
+-0.029806 0.16383 -1.2716
+-0.025032 0.16392 -1.2723
+-0.022645 0.16397 -1.2728
+-0.020259 0.16406 -1.2734
+-0.01551 0.16454 -1.2772
+-0.013126 0.16479 -1.2792
+0.088529 0.14942 -1.1585
+0.09068 0.14937 -1.1581
+0.095079 0.14942 -1.1585
+0.097359 0.14957 -1.1596
+0.099714 0.14982 -1.1616
+0.1042 0.14998 -1.1629
+0.10851 0.14988 -1.162
+0.1129 0.14989 -1.1621
+0.11725 0.14985 -1.1618
+0.12149 0.14967 -1.1604
+0.12569 0.14947 -1.1588
+0.12785 0.14945 -1.1586
+0.13003 0.14944 -1.1585
+0.13229 0.14953 -1.1593
+0.13459 0.14965 -1.1602
+0.13926 0.14997 -1.1627
+0.14386 0.15021 -1.1645
+0.14833 0.15028 -1.1651
+0.15285 0.15041 -1.1661
+0.1576 0.15075 -1.1687
+0.16017 0.1511 -1.1714
+0.1631 0.15177 -1.1767
+0.16821 0.15442 -1.1975
+0.16969 0.15474 -1.2
+0.17082 0.15474 -1.2
+0.17186 0.15466 -1.1994
+-0.045603 0.16348 -1.2784
+-0.021452 0.16281 -1.2731
+0.089593 0.14828 -1.1581
+0.16156 0.15025 -1.1735
+0.166 0.1523 -1.1896
+0.16762 0.15276 -1.1933
+0.16938 0.15333 -1.1978
+-0.046884 0.16255 -1.2805
+-0.04439 0.16224 -1.2781
+-0.041895 0.16189 -1.2753
+-0.037017 0.16156 -1.2727
+-0.034596 0.16144 -1.2717
+-0.032194 0.1614 -1.2714
+-0.029795 0.16137 -1.2712
+-0.027402 0.16137 -1.2712
+-0.025021 0.16145 -1.2718
+-0.022642 0.16156 -1.2727
+-0.021454 0.16163 -1.2732
+-0.020266 0.16172 -1.2739
+-0.017892 0.16193 -1.2756
+-0.013133 0.16247 -1.2799
+0.088517 0.14721 -1.1584
+0.090682 0.14718 -1.1581
+0.092866 0.14719 -1.1581
+0.097244 0.14721 -1.1583
+0.1107 0.14768 -1.162
+0.11513 0.14775 -1.1626
+0.1173 0.14772 -1.1623
+0.11939 0.1476 -1.1613
+0.12358 0.14738 -1.1596
+0.12784 0.14725 -1.1585
+0.13231 0.14737 -1.1595
+0.13697 0.14768 -1.1619
+0.14158 0.14792 -1.1638
+0.15515 0.1483 -1.1668
+0.16018 0.1489 -1.1715
+0.16161 0.14919 -1.1739
+0.16334 0.14977 -1.1785
+-0.04564 0.1612 -1.2794
+-0.035804 0.16029 -1.2721
+-0.023835 0.16033 -1.2724
+-0.022649 0.16041 -1.2731
+-0.021459 0.16047 -1.2736
+0.089602 0.14611 -1.1583
+0.11636 0.14683 -1.1639
+0.16174 0.1482 -1.1748
+0.16344 0.14874 -1.1792
+-0.046954 0.16037 -1.2824
+-0.044418 0.15993 -1.2789
+-0.039466 0.15938 -1.2744
+-0.037046 0.15929 -1.2737
+-0.034632 0.15921 -1.2731
+-0.029825 0.15914 -1.2725
+-0.025044 0.1592 -1.273
+-0.02266 0.15929 -1.2737
+-0.020291 0.15951 -1.2755
+-0.015527 0.1599 -1.2787
+-0.013139 0.16013 -1.2805
+0.088484 0.14497 -1.1579
+0.090648 0.14494 -1.1577
+0.095022 0.14496 -1.1578
+0.099409 0.145 -1.1581
+0.1039 0.14517 -1.1595
+0.10851 0.14549 -1.162
+0.11077 0.14558 -1.1628
+0.11304 0.14569 -1.1636
+0.11547 0.14598 -1.166
+0.11666 0.1461 -1.1669
+0.11758 0.14588 -1.1651
+0.11946 0.14549 -1.162
+0.12149 0.1453 -1.1604
+0.12356 0.14516 -1.1593
+0.12569 0.1451 -1.1588
+0.12785 0.14507 -1.1586
+0.13007 0.14512 -1.159
+0.13464 0.14533 -1.1607
+0.13704 0.14556 -1.1625
+0.13938 0.14571 -1.1637
+0.14162 0.14576 -1.1641
+0.14378 0.14573 -1.1639
+0.14824 0.1458 -1.1644
+0.15281 0.14597 -1.1658
+0.15522 0.14617 -1.1674
+0.1577 0.14643 -1.1695
+0.16038 0.14687 -1.173
+0.16193 0.14727 -1.1762
+-0.046994 0.1593 -1.2835
+-0.045709 0.15903 -1.2814
+-0.014341 0.15889 -1.2802
+0.088481 0.14388 -1.1579
+0.089573 0.14388 -1.1579
+0.11674 0.1451 -1.1678
+0.11782 0.14507 -1.1675
+0.11874 0.14486 -1.1658
+0.12055 0.14439 -1.162
+0.12155 0.14428 -1.1611
+0.12253 0.14415 -1.16
+0.12361 0.14412 -1.1598
+0.12464 0.14406 -1.1592
+0.12571 0.14404 -1.1591
+0.12679 0.14402 -1.1589
+0.12898 0.14402 -1.1589
+0.15652 0.14525 -1.1689
+0.16199 0.14622 -1.1767
+-0.045727 0.15789 -1.2819
+-0.044471 0.15771 -1.2804
+-0.041981 0.15741 -1.278
+-0.039503 0.15713 -1.2756
+-0.037076 0.15701 -1.2747
+-0.022685 0.15706 -1.2751
+-0.017938 0.15753 -1.279
+-0.01554 0.15762 -1.2798
+-0.014347 0.15775 -1.2808
+0.087371 0.14275 -1.1576
+0.088464 0.14276 -1.1577
+0.090662 0.14279 -1.1579
+0.092859 0.14281 -1.1581
+0.10604 0.14292 -1.1589
+0.10842 0.14318 -1.1611
+0.11089 0.14355 -1.1641
+0.11332 0.14384 -1.1665
+0.11567 0.14404 -1.1681
+0.11784 0.144 -1.1677
+0.11995 0.14389 -1.1669
+0.1219 0.14359 -1.1644
+0.12399 0.14348 -1.1635
+0.12597 0.14323 -1.1614
+0.12795 0.143 -1.1595
+0.13018 0.14305 -1.16
+0.13239 0.14308 -1.1601
+0.13482 0.14333 -1.1622
+0.1374 0.14374 -1.1656
+0.13985 0.144 -1.1677
+0.14181 0.14376 -1.1657
+0.14387 0.14362 -1.1646
+0.14605 0.14361 -1.1644
+0.15055 0.14371 -1.1653
+0.15289 0.14385 -1.1664
+0.15531 0.14406 -1.1681
+0.15658 0.14421 -1.1694
+0.15791 0.14442 -1.1711
+0.16068 0.14493 -1.1752
+-0.049167 0.16003 -1.3095
+-0.045847 0.15709 -1.2853
+-0.044494 0.15659 -1.2811
+-0.043248 0.15644 -1.2799
+-0.042012 0.15632 -1.2789
+-0.040768 0.15617 -1.2777
+-0.014355 0.15663 -1.2815
+0.087346 0.14162 -1.1573
+0.089554 0.14167 -1.1577
+0.10967 0.14229 -1.1628
+0.11221 0.14273 -1.1664
+0.12108 0.14282 -1.1671
+0.12223 0.14288 -1.1676
+0.12336 0.14292 -1.1679
+0.12449 0.14295 -1.1681
+0.12559 0.14295 -1.1681
+0.12667 0.14293 -1.168
+0.12776 0.14291 -1.1679
+0.12886 0.14291 -1.1679
+0.12993 0.14289 -1.1676
+0.13099 0.14284 -1.1672
+0.13206 0.14281 -1.167
+0.13315 0.1428 -1.1669
+0.1342 0.14275 -1.1665
+0.13528 0.14272 -1.1663
+0.13658 0.14294 -1.168
+0.13778 0.14304 -1.1689
+0.1389 0.14306 -1.169
+0.15415 0.14289 -1.1676
+0.15541 0.14304 -1.1688
+0.15667 0.14319 -1.1701
+-0.050437 0.15891 -1.3105
+-0.049177 0.15882 -1.3098
+-0.040777 0.155 -1.278
+-0.039558 0.15494 -1.2774
+-0.037119 0.15479 -1.2762
+-0.034707 0.15475 -1.2759
+-0.029892 0.15469 -1.2754
+-0.025097 0.15473 -1.2757
+-0.020329 0.155 -1.2779
+-0.017955 0.15526 -1.2802
+-0.015562 0.15543 -1.2816
+0.087342 0.14053 -1.1573
+0.088432 0.14053 -1.1573
+0.090643 0.14057 -1.1576
+0.095 0.14056 -1.1575
+0.099334 0.14052 -1.1572
+0.10373 0.14056 -1.1575
+0.10592 0.14058 -1.1577
+0.10827 0.1408 -1.1595
+0.11113 0.14166 -1.1666
+0.11351 0.14189 -1.1685
+0.11778 0.14172 -1.1671
+0.11996 0.14169 -1.1669
+0.12225 0.14181 -1.1678
+0.12451 0.14187 -1.1684
+0.1267 0.14186 -1.1683
+0.12889 0.14184 -1.1681
+0.13109 0.14184 -1.1681
+0.13327 0.14183 -1.168
+0.13551 0.14186 -1.1683
+0.13782 0.14197 -1.1692
+0.14007 0.14202 -1.1696
+0.14209 0.14184 -1.168
+0.14408 0.14163 -1.1663
+0.14841 0.14157 -1.1658
+0.15303 0.14178 -1.1675
+0.15548 0.142 -1.1694
+0.15816 0.14243 -1.1729
+0.16097 0.14297 -1.1774
+-0.050471 0.15778 -1.3114
+-0.049198 0.15766 -1.3104
+-0.04796 0.15764 -1.3102
+-0.039577 0.15381 -1.2781
+-0.038362 0.15376 -1.2777
+-0.035932 0.15365 -1.2768
+-0.016771 0.15426 -1.2818
+0.087328 0.13941 -1.1571
+0.089529 0.13944 -1.1573
+0.10702 0.1395 -1.1578
+0.15969 0.14171 -1.1761
+-0.051729 0.15662 -1.312
+-0.050482 0.15658 -1.3117
+-0.048003 0.15655 -1.3114
+-0.038375 0.15261 -1.2781
+-0.037161 0.15256 -1.2777
+-0.034752 0.15255 -1.2776
+-0.032351 0.15256 -1.2777
+-0.029933 0.1525 -1.2772
+-0.027531 0.15251 -1.2773
+-0.02274 0.15262 -1.2782
+-0.020361 0.15283 -1.28
+-0.017982 0.15309 -1.2822
+-0.016786 0.15318 -1.283
+0.087324 0.13831 -1.157
+0.088426 0.13833 -1.1572
+0.090626 0.13836 -1.1574
+0.092825 0.13839 -1.1576
+0.10592 0.1384 -1.1577
+0.10704 0.13843 -1.158
+0.10832 0.13867 -1.16
+0.11124 0.1396 -1.1678
+0.11356 0.13975 -1.1691
+0.1157 0.13967 -1.1684
+0.11784 0.1396 -1.1678
+0.11994 0.13947 -1.1668
+0.12436 0.1395 -1.167
+0.12879 0.13954 -1.1673
+0.13323 0.13958 -1.1676
+0.13786 0.13981 -1.1696
+0.14232 0.13986 -1.17
+0.15576 0.14006 -1.1716
+0.15849 0.14051 -1.1754
+0.1599 0.14078 -1.1777
+-0.051736 0.15541 -1.3122
+-0.049243 0.15533 -1.3116
+-0.048009 0.15533 -1.3116
+-0.035974 0.15143 -1.2783
+-0.034775 0.15144 -1.2784
+-0.033573 0.15145 -1.2785
+-0.031156 0.15139 -1.278
+-0.019192 0.1519 -1.2824
+-0.017996 0.152 -1.2832
+0.088429 0.13725 -1.1572
+0.089523 0.13725 -1.1573
+0.10702 0.13732 -1.1578
+0.10975 0.13801 -1.1637
+0.1124 0.13857 -1.1684
+0.11352 0.13859 -1.1686
+0.11462 0.13859 -1.1686
+0.1157 0.13857 -1.1684
+0.1168 0.13857 -1.1684
+0.15734 0.13936 -1.1751
+0.15867 0.13957 -1.1768
+-0.051673 0.15398 -1.3106
+-0.050427 0.15394 -1.3103
+-0.048003 0.15408 -1.3114
+-0.046779 0.15411 -1.3117
+-0.045563 0.15417 -1.3122
+-0.033628 0.15049 -1.2806
+-0.032423 0.15049 -1.2806
+-0.029981 0.15033 -1.2792
+-0.025173 0.15038 -1.2797
+-0.022778 0.15047 -1.2804
+-0.0204 0.15071 -1.2825
+-0.01921 0.15084 -1.2836
+0.088436 0.13617 -1.1573
+0.090625 0.13618 -1.1574
+0.095012 0.13621 -1.1577
+0.099415 0.13627 -1.1582
+0.10375 0.13623 -1.1578
+0.10594 0.13624 -1.1579
+0.10814 0.13626 -1.158
+0.10932 0.13637 -1.159
+0.11076 0.1368 -1.1627
+0.11186 0.1368 -1.1627
+0.11672 0.13737 -1.1676
+0.11784 0.13739 -1.1678
+0.12006 0.13741 -1.1679
+0.12215 0.13728 -1.1668
+0.12654 0.13728 -1.1668
+0.13099 0.13733 -1.1672
+0.13566 0.13761 -1.1696
+0.14029 0.13783 -1.1714
+0.14463 0.13776 -1.1708
+0.14896 0.13768 -1.1701
+0.15361 0.13789 -1.172
+0.15623 0.13826 -1.1751
+0.159 0.13874 -1.1792
+-0.084402 0.15173 -1.3017
+-0.083131 0.15165 -1.301
+-0.081888 0.15161 -1.3007
+-0.080691 0.15166 -1.3011
+-0.079493 0.15171 -1.3016
+-0.078298 0.15177 -1.3021
+-0.077073 0.15177 -1.3021
+-0.075853 0.15178 -1.3022
+-0.074653 0.15183 -1.3026
+-0.051581 0.15248 -1.3083
+-0.046697 0.15261 -1.3094
+-0.032462 0.14946 -1.2822
+-0.031229 0.14934 -1.2811
+-0.021615 0.14955 -1.283
+0.089539 0.13509 -1.1575
+0.10927 0.13522 -1.1585
+0.11043 0.1353 -1.1592
+0.11152 0.1353 -1.1592
+0.11353 0.13509 -1.1574
+0.11616 0.13562 -1.162
+0.11762 0.13603 -1.1656
+0.11896 0.13632 -1.168
+0.12119 0.13634 -1.1682
+-0.088147 0.15062 -1.3028
+-0.086861 0.15052 -1.3018
+-0.085586 0.15043 -1.3011
+-0.084314 0.15035 -1.3003
+-0.081791 0.15021 -1.2991
+-0.079369 0.15025 -1.2995
+-0.076947 0.1503 -1.2999
+-0.074573 0.15045 -1.3012
+-0.073395 0.15054 -1.3021
+-0.052669 0.15084 -1.3047
+-0.050292 0.15107 -1.3067
+-0.047857 0.15115 -1.3074
+-0.045416 0.15121 -1.308
+-0.042986 0.15132 -1.3089
+-0.032513 0.14849 -1.2842
+-0.030048 0.14826 -1.2822
+-0.027627 0.14821 -1.2818
+-0.025221 0.14825 -1.2821
+-0.022833 0.14842 -1.2836
+-0.02165 0.14858 -1.285
+0.088426 0.13397 -1.1572
+0.090602 0.13396 -1.1571
+0.092807 0.134 -1.1574
+0.10595 0.13406 -1.158
+0.1082 0.13414 -1.1587
+0.1105 0.1343 -1.16
+0.11246 0.13403 -1.1576
+0.11356 0.13403 -1.1576
+0.11484 0.13425 -1.1596
+0.11717 0.13441 -1.161
+0.12011 0.13527 -1.1685
+0.1224 0.13536 -1.1693
+0.12452 0.13528 -1.1685
+0.1267 0.13525 -1.1683
+0.12893 0.13528 -1.1686
+0.13359 0.13554 -1.1708
+0.147 0.1357 -1.1722
+0.14923 0.13572 -1.1723
+0.1515 0.13577 -1.1728
+0.15406 0.13608 -1.1754
+0.15678 0.13652 -1.1793
+-0.090576 0.14936 -1.3024
+-0.089307 0.14929 -1.3018
+-0.088039 0.14921 -1.3012
+-0.085486 0.14903 -1.2996
+-0.073323 0.14917 -1.3008
+-0.072144 0.14926 -1.3016
+-0.070954 0.14933 -1.3022
+-0.069768 0.14942 -1.303
+-0.051492 0.14975 -1.306
+-0.041743 0.15005 -1.3086
+-0.031332 0.14741 -1.2854
+-0.021691 0.14765 -1.2875
+0.08951 0.13287 -1.1571
+0.11158 0.13318 -1.1598
+0.11266 0.13316 -1.1597
+0.11379 0.13321 -1.1601
+0.11604 0.13329 -1.1607
+0.11837 0.13345 -1.1622
+0.12011 0.13416 -1.1685
+0.12133 0.1343 -1.1696
+0.12358 0.13435 -1.1701
+0.12468 0.13434 -1.17
+0.12577 0.13433 -1.1699
+0.1505 0.13476 -1.1736
+0.1517 0.13484 -1.1743
+0.15303 0.13504 -1.1761
+-0.091783 0.1481 -1.3022
+-0.089191 0.14787 -1.3001
+-0.086703 0.1478 -1.2995
+-0.08423 0.14775 -1.2991
+-0.079315 0.14771 -1.2987
+-0.074477 0.1478 -1.2995
+-0.072065 0.14787 -1.3002
+-0.069725 0.1481 -1.3022
+-0.06853 0.14817 -1.3028
+-0.052729 0.14855 -1.3062
+-0.050273 0.14855 -1.3063
+-0.045352 0.14854 -1.3061
+-0.04288 0.14849 -1.3057
+-0.041666 0.14854 -1.3062
+-0.032592 0.14643 -1.2874
+-0.030157 0.14637 -1.2869
+-0.025312 0.14636 -1.2868
+-0.022924 0.14658 -1.2888
+0.088414 0.13177 -1.1571
+0.090605 0.13178 -1.1572
+0.095006 0.13184 -1.1577
+0.099369 0.13184 -1.1576
+0.10373 0.13184 -1.1576
+0.10818 0.13194 -1.1585
+0.11042 0.13201 -1.1591
+0.11267 0.13208 -1.1598
+0.1149 0.13213 -1.1602
+0.11716 0.13222 -1.161
+0.11986 0.13278 -1.166
+0.12123 0.13309 -1.1687
+0.12247 0.13323 -1.17
+0.1247 0.13326 -1.1702
+0.12685 0.13321 -1.1697
+0.12913 0.13328 -1.1704
+0.13137 0.13331 -1.1706
+0.13369 0.13343 -1.1717
+0.136 0.13353 -1.1725
+0.1406 0.13371 -1.1741
+0.14508 0.13375 -1.1745
+0.14733 0.13379 -1.1748
+0.14959 0.13383 -1.1752
+0.15201 0.13401 -1.1767
+0.15464 0.13437 -1.18
+-0.093015 0.14689 -1.3023
+-0.090416 0.14665 -1.3001
+-0.068508 0.14689 -1.3024
+-0.051528 0.1474 -1.3069
+-0.041603 0.14709 -1.3042
+-0.033904 0.14565 -1.2912
+-0.031404 0.14532 -1.2884
+0.089512 0.13069 -1.1572
+0.12098 0.13171 -1.1662
+0.12234 0.13199 -1.1687
+0.12346 0.13201 -1.1689
+0.12457 0.13203 -1.169
+0.12571 0.13206 -1.1694
+0.12683 0.13208 -1.1695
+0.12798 0.13212 -1.1699
+0.12908 0.13213 -1.1699
+0.1302 0.13215 -1.1701
+0.13131 0.13216 -1.1702
+0.13242 0.13216 -1.1702
+0.13361 0.13225 -1.171
+0.13486 0.1324 -1.1723
+0.14869 0.1329 -1.1768
+0.14988 0.13298 -1.1775
+0.15107 0.13305 -1.1781
+-0.092969 0.14559 -1.3016
+-0.091676 0.14548 -1.3006
+-0.089165 0.14538 -1.2997
+-0.086699 0.14535 -1.2994
+-0.08169 0.14514 -1.2976
+-0.072058 0.14541 -1.3
+-0.069668 0.14553 -1.3011
+-0.068519 0.14569 -1.3026
+-0.05285 0.14642 -1.3092
+-0.050284 0.14613 -1.3066
+-0.047814 0.14609 -1.3062
+-0.04532 0.14598 -1.3052
+-0.042794 0.14574 -1.3031
+-0.040359 0.1458 -1.3036
+-0.039168 0.14593 -1.3048
+-0.033929 0.14454 -1.2922
+-0.032675 0.14437 -1.2907
+-0.030208 0.14419 -1.2891
+-0.027785 0.1442 -1.2892
+-0.025375 0.1443 -1.2901
+-0.022985 0.14453 -1.2922
+0.089518 0.12961 -1.1572
+0.09061 0.12961 -1.1573
+0.092817 0.12964 -1.1576
+0.11034 0.12973 -1.1583
+0.11479 0.12983 -1.1592
+0.11932 0.13 -1.1607
+0.12185 0.13036 -1.164
+0.12298 0.1304 -1.1643
+0.12543 0.13067 -1.1667
+0.12637 0.1305 -1.1652
+0.1287 0.13064 -1.1665
+0.13092 0.13066 -1.1666
+0.13329 0.13083 -1.1682
+0.13454 0.13097 -1.1694
+0.13602 0.13134 -1.1728
+0.13846 0.13156 -1.1747
+0.14081 0.13168 -1.1758
+0.14309 0.13175 -1.1764
+0.14541 0.13184 -1.1773
+0.14772 0.13192 -1.1779
+-0.096959 0.14483 -1.3059
+-0.095591 0.14462 -1.304
+-0.094245 0.14444 -1.3023
+-0.09294 0.14432 -1.3012
+-0.090431 0.14422 -1.3003
+-0.068516 0.14446 -1.3025
+-0.067366 0.14462 -1.304
+-0.059844 0.14724 -1.3279
+-0.054231 0.14559 -1.3129
+-0.051549 0.145 -1.3075
+-0.039137 0.14459 -1.3038
+-0.037944 0.14472 -1.305
+-0.036737 0.1448 -1.3057
+-0.035481 0.14469 -1.3047
+-0.033944 0.14338 -1.2928
+-0.031465 0.14317 -1.2909
+-0.024194 0.14328 -1.2918
+-0.023007 0.14346 -1.2935
+0.089519 0.12852 -1.1573
+0.12044 0.12893 -1.1609
+0.12153 0.12893 -1.1609
+0.1226 0.1289 -1.1606
+0.12595 0.12898 -1.1613
+0.12718 0.12911 -1.1626
+0.12831 0.12915 -1.1629
+0.12944 0.12918 -1.1632
+0.13056 0.12921 -1.1634
+0.13172 0.12926 -1.1639
+0.13415 0.1295 -1.1661
+0.13717 0.13028 -1.1731
+0.13972 0.1306 -1.1761
+0.14101 0.13076 -1.1776
+0.14212 0.13077 -1.1776
+0.14446 0.13087 -1.1785
+-0.10058 0.14351 -1.305
+-0.099311 0.14345 -1.3045
+-0.098068 0.14343 -1.3043
+-0.096799 0.14337 -1.3037
+-0.094188 0.14313 -1.3015
+-0.091675 0.14303 -1.3006
+-0.089197 0.14298 -1.3002
+-0.08412 0.14267 -1.2974
+-0.081639 0.1426 -1.2967
+-0.0792 0.14261 -1.2968
+-0.074364 0.14269 -1.2976
+-0.069673 0.14309 -1.3012
+-0.067333 0.14332 -1.3034
+-0.066175 0.14347 -1.3047
+-0.064988 0.14356 -1.3056
+-0.060992 0.14575 -1.3257
+-0.059696 0.14563 -1.3246
+-0.054159 0.14416 -1.3111
+-0.052842 0.14394 -1.3091
+-0.050293 0.14369 -1.3068
+-0.045376 0.14369 -1.3068
+-0.040353 0.14333 -1.3035
+-0.037933 0.14345 -1.3046
+-0.035513 0.14359 -1.3059
+-0.033992 0.14236 -1.2946
+-0.032712 0.1421 -1.2922
+-0.030254 0.14198 -1.2911
+-0.025405 0.14203 -1.2916
+-0.023022 0.14233 -1.2943
+-0.021856 0.14267 -1.2974
+-0.020747 0.14344 -1.3046
+0.089507 0.12741 -1.1571
+0.090622 0.12744 -1.1574
+0.095014 0.12748 -1.1578
+0.099371 0.12748 -1.1577
+0.10376 0.1275 -1.1579
+0.10814 0.12753 -1.1582
+0.11256 0.12759 -1.1587
+0.11697 0.12764 -1.1591
+0.11926 0.12775 -1.1602
+0.1216 0.1279 -1.1616
+0.12262 0.12783 -1.1609
+0.12344 0.12755 -1.1583
+0.12463 0.12765 -1.1592
+0.12596 0.12789 -1.1614
+0.12834 0.12808 -1.1631
+0.13059 0.12814 -1.1637
+0.1328 0.12815 -1.1638
+0.13528 0.12842 -1.1663
+0.13858 0.12945 -1.1757
+0.13998 0.12972 -1.1782
+0.14233 0.12984 -1.1793
+0.14353 0.12992 -1.18
+-0.10559 0.14242 -1.3063
+-0.1043 0.14234 -1.3055
+-0.10301 0.14225 -1.3047
+-0.10174 0.14219 -1.3042
+-0.10039 0.14201 -1.3025
+-0.099141 0.14198 -1.3022
+-0.097919 0.14199 -1.3023
+-0.095443 0.14195 -1.302
+-0.080375 0.1413 -1.296
+-0.066112 0.14211 -1.3035
+-0.064954 0.14225 -1.3049
+-0.060783 0.14401 -1.3211
+-0.059538 0.144 -1.3211
+-0.058198 0.14376 -1.3189
+-0.056819 0.14342 -1.3157
+-0.055457 0.14309 -1.3127
+-0.054132 0.14286 -1.3105
+-0.051559 0.14256 -1.3078
+-0.036838 0.14273 -1.3094
+-0.035606 0.14273 -1.3094
+-0.034159 0.14184 -1.3011
+-0.031499 0.14089 -1.2923
+-0.021858 0.14146 -1.2976
+0.089503 0.12631 -1.157
+0.12267 0.12678 -1.1613
+0.12378 0.1268 -1.1615
+0.12489 0.12682 -1.1616
+0.13646 0.1274 -1.167
+0.14699 0.1309 -1.1994
+0.14838 0.13114 -1.2016
+0.14993 0.1315 -1.205
+0.15997 0.13324 -1.2211
+-0.10676 0.1411 -1.3055
+-0.10415 0.14089 -1.3035
+-0.10162 0.1408 -1.3027
+-0.099137 0.14075 -1.3022
+-0.096663 0.14071 -1.3019
+-0.09421 0.14071 -1.3018
+-0.091718 0.14065 -1.3013
+-0.086605 0.1403 -1.298
+-0.084048 0.14011 -1.2963
+-0.081526 0.13997 -1.2949
+-0.080261 0.13989 -1.2942
+-0.079123 0.14003 -1.2955
+-0.076732 0.14011 -1.2963
+-0.067293 0.14078 -1.3026
+-0.064893 0.14089 -1.3036
+-0.063733 0.14104 -1.305
+-0.062885 0.1419 -1.313
+-0.061923 0.14253 -1.3189
+-0.060686 0.14254 -1.319
+-0.059425 0.14249 -1.3186
+-0.058023 0.14209 -1.3149
+-0.055371 0.14164 -1.3106
+-0.052823 0.14142 -1.3086
+-0.050304 0.14126 -1.3071
+-0.047846 0.14127 -1.3071
+-0.045426 0.14139 -1.3083
+-0.042996 0.14149 -1.3093
+-0.040512 0.14142 -1.3086
+-0.038032 0.14136 -1.3081
+-0.036855 0.14157 -1.31
+-0.035623 0.14157 -1.31
+-0.034302 0.14121 -1.3066
+-0.032736 0.13977 -1.2932
+-0.030286 0.13969 -1.2925
+-0.027864 0.13974 -1.293
+-0.02303 0.13994 -1.2948
+0.089496 0.12521 -1.157
+0.090603 0.12523 -1.1572
+0.092813 0.12527 -1.1576
+0.095018 0.12531 -1.1578
+0.097201 0.12531 -1.1578
+0.11922 0.12551 -1.1597
+0.12148 0.12559 -1.1604
+0.12374 0.12567 -1.1612
+0.12598 0.12572 -1.1616
+0.1282 0.12575 -1.1619
+0.13042 0.12578 -1.1622
+0.13261 0.12578 -1.1621
+0.13497 0.12594 -1.1636
+0.14375 0.12991 -1.2007
+0.14498 0.13 -1.2015
+0.14745 0.13018 -1.2032
+0.14882 0.13038 -1.2051
+0.15162 0.13085 -1.2095
+0.15459 0.13143 -1.2149
+0.15729 0.13178 -1.2181
+0.15844 0.13178 -1.2181
+0.15961 0.13179 -1.2183
+0.16077 0.13181 -1.2184
+0.16197 0.13185 -1.2188
+-0.082705 0.13868 -1.2943
+-0.081416 0.13856 -1.2932
+-0.080271 0.13868 -1.2943
+-0.06374 0.13983 -1.3052
+-0.061702 0.14078 -1.3142
+-0.059236 0.1408 -1.3143
+-0.056531 0.14022 -1.3089
+-0.04664 0.14011 -1.3078
+-0.045431 0.14017 -1.3085
+-0.044233 0.14028 -1.3095
+-0.041771 0.14029 -1.3095
+-0.039296 0.14025 -1.3092
+-0.038067 0.14025 -1.3093
+-0.036835 0.14025 -1.3093
+-0.034336 0.14011 -1.3079
+-0.031519 0.13855 -1.2932
+0.090601 0.12414 -1.1572
+0.091721 0.12418 -1.1575
+0.093912 0.12419 -1.1577
+0.13367 0.12466 -1.1619
+0.14377 0.1288 -1.2009
+0.14501 0.12889 -1.2018
+0.14628 0.12901 -1.2029
+0.1475 0.12909 -1.2036
+0.14884 0.12927 -1.2053
+0.15027 0.12952 -1.2077
+0.15307 0.12997 -1.2119
+0.15806 0.13032 -1.2152
+0.16037 0.13034 -1.2154
+0.16291 0.13054 -1.2172
+0.1642 0.13065 -1.2183
+0.16555 0.13081 -1.2198
+0.16699 0.13104 -1.222
+0.16826 0.13113 -1.2228
+0.16949 0.13119 -1.2234
+0.17083 0.13134 -1.2248
+0.17209 0.13142 -1.2255
+0.17326 0.13143 -1.2256
+0.17453 0.13152 -1.2265
+-0.10925 0.13869 -1.3059
+-0.10411 0.13839 -1.3031
+-0.099098 0.13824 -1.3017
+-0.094239 0.1383 -1.3023
+-0.089191 0.13807 -1.3001
+-0.083997 0.13758 -1.2955
+-0.081425 0.13736 -1.2933
+-0.080354 0.13761 -1.2957
+-0.079157 0.13765 -1.2961
+-0.074292 0.13767 -1.2963
+-0.069637 0.13811 -1.3006
+-0.064945 0.13855 -1.3047
+-0.062717 0.13905 -1.3095
+-0.060435 0.13947 -1.3135
+-0.057761 0.13899 -1.3089
+-0.055218 0.13879 -1.307
+-0.05275 0.13876 -1.3068
+-0.050267 0.1387 -1.3061
+-0.047805 0.13868 -1.306
+-0.045369 0.13875 -1.3067
+-0.043006 0.13906 -1.3096
+-0.040532 0.13903 -1.3093
+-0.038015 0.13883 -1.3075
+-0.035571 0.1389 -1.3081
+-0.034317 0.13881 -1.3072
+-0.03279 0.13756 -1.2953
+-0.031515 0.13731 -1.293
+-0.030298 0.13731 -1.293
+-0.025445 0.13738 -1.2937
+-0.023031 0.13751 -1.2949
+0.090609 0.12306 -1.1573
+0.092824 0.12311 -1.1577
+0.095013 0.12311 -1.1578
+0.099373 0.12311 -1.1577
+0.10376 0.12314 -1.158
+0.10813 0.12315 -1.158
+0.11254 0.12319 -1.1584
+0.11698 0.12327 -1.1592
+0.12142 0.12334 -1.1599
+0.12587 0.12342 -1.1606
+0.13031 0.12349 -1.1612
+0.13254 0.12352 -1.1615
+0.13366 0.12354 -1.1617
+0.15156 0.12851 -1.2089
+0.15281 0.12861 -1.2098
+0.15424 0.12885 -1.2121
+0.15664 0.12894 -1.213
+0.15897 0.12898 -1.2134
+0.1613 0.12902 -1.2137
+0.16381 0.12919 -1.2154
+0.16648 0.12949 -1.2182
+0.16912 0.12976 -1.2207
+0.17153 0.12984 -1.2215
+0.17412 0.13005 -1.2235
+0.1754 0.13015 -1.2244
+0.1768 0.13033 -1.2262
+0.17957 0.13067 -1.2293
+-0.11049 0.13747 -1.306
+-0.082786 0.13638 -1.2956
+-0.081574 0.13639 -1.2957
+-0.080386 0.13644 -1.2962
+-0.056368 0.13736 -1.3051
+-0.048974 0.13729 -1.3044
+-0.047702 0.13716 -1.3032
+-0.046466 0.13713 -1.3029
+-0.04524 0.13713 -1.3029
+-0.044028 0.13717 -1.3033
+-0.042879 0.13742 -1.3057
+-0.041665 0.13747 -1.3062
+-0.040434 0.13746 -1.3061
+-0.039172 0.13735 -1.305
+-0.037944 0.13734 -1.305
+-0.036739 0.13743 -1.3058
+-0.034297 0.13749 -1.3064
+-0.03154 0.1362 -1.294
+0.090613 0.12198 -1.1573
+0.091705 0.12198 -1.1573
+0.093917 0.12202 -1.1577
+0.13362 0.12241 -1.1614
+0.1539 0.12743 -1.2095
+0.1551 0.12747 -1.2099
+0.15758 0.12764 -1.2114
+0.17494 0.12866 -1.2212
+0.1776 0.12891 -1.2236
+0.18037 0.12925 -1.2269
+0.18171 0.12938 -1.2281
+-0.11045 0.1362 -1.3056
+-0.10915 0.1361 -1.3047
+-0.10661 0.136 -1.3037
+-0.08662 0.13543 -1.2983
+-0.084068 0.13526 -1.2966
+-0.081599 0.13521 -1.2961
+-0.079178 0.13524 -1.2964
+-0.076723 0.13521 -1.2962
+-0.074316 0.13527 -1.2968
+-0.071974 0.13546 -1.2986
+-0.067394 0.13608 -1.3046
+-0.062645 0.13643 -1.308
+-0.060236 0.13655 -1.3092
+-0.057596 0.13613 -1.3051
+-0.055134 0.13612 -1.305
+-0.052683 0.13613 -1.3051
+-0.050186 0.13602 -1.304
+-0.047696 0.13591 -1.303
+-0.045241 0.13591 -1.303
+-0.042816 0.13599 -1.3038
+-0.041644 0.13617 -1.3055
+-0.040406 0.13614 -1.3052
+-0.037948 0.13613 -1.3051
+-0.036719 0.13613 -1.3051
+-0.03553 0.13628 -1.3066
+-0.034301 0.13628 -1.3066
+-0.03292 0.13565 -1.3005
+-0.031537 0.13497 -1.2939
+-0.030308 0.13492 -1.2934
+-0.027875 0.13493 -1.2935
+-0.025446 0.13495 -1.2938
+-0.023037 0.13511 -1.2952
+0.092813 0.12091 -1.1576
+0.095007 0.12092 -1.1577
+0.097179 0.12091 -1.1576
+0.13249 0.12128 -1.1611
+0.13358 0.12128 -1.1611
+0.15363 0.12607 -1.2073
+0.15611 0.12623 -1.2089
+0.15862 0.12641 -1.2107
+0.16091 0.12642 -1.2108
+0.16329 0.1265 -1.2115
+0.1658 0.12667 -1.2131
+0.16829 0.12682 -1.2146
+0.1708 0.12699 -1.2162
+0.1733 0.12715 -1.2177
+0.17585 0.12733 -1.2195
+0.17856 0.12763 -1.2224
+0.18128 0.12792 -1.2252
+0.18259 0.12803 -1.2262
+0.18395 0.12817 -1.2276
+-0.11175 0.13505 -1.3064
+-0.11046 0.13497 -1.3057
+-0.080382 0.13399 -1.2962
+-0.079056 0.13381 -1.2944
+-0.077951 0.13401 -1.2963
+-0.075573 0.13412 -1.2974
+-0.041649 0.13496 -1.3057
+-0.03674 0.13498 -1.3059
+-0.034314 0.1351 -1.3071
+-0.032977 0.13466 -1.3028
+-0.03156 0.13385 -1.2949
+-0.024232 0.13376 -1.294
+-0.023041 0.13391 -1.2954
+0.093907 0.11982 -1.1576
+0.13355 0.12016 -1.1608
+0.18219 0.1266 -1.2235
+0.18486 0.12685 -1.226
+0.18619 0.12697 -1.2272
+-0.11175 0.13381 -1.3064
+-0.10918 0.13369 -1.3051
+-0.104 0.13334 -1.3017
+-0.098964 0.13316 -1.2999
+-0.094056 0.13314 -1.2997
+-0.089228 0.13323 -1.3007
+-0.08421 0.13304 -1.2988
+-0.081665 0.13288 -1.2972
+-0.079064 0.13261 -1.2946
+-0.076811 0.13292 -1.2977
+-0.074438 0.13305 -1.2989
+-0.072036 0.13313 -1.2997
+-0.069733 0.1334 -1.3024
+-0.067394 0.13362 -1.3046
+-0.06503 0.13381 -1.3064
+-0.062571 0.13381 -1.3064
+-0.060072 0.13372 -1.3056
+-0.057574 0.13362 -1.3046
+-0.055143 0.13368 -1.3052
+-0.052689 0.13369 -1.3053
+-0.050221 0.13366 -1.305
+-0.045248 0.13347 -1.3032
+-0.042878 0.13373 -1.3057
+-0.041687 0.13385 -1.3069
+-0.040457 0.13385 -1.3069
+-0.037985 0.1338 -1.3064
+-0.035534 0.13383 -1.3067
+-0.034304 0.13383 -1.3067
+-0.03298 0.13345 -1.3029
+-0.031571 0.13268 -1.2954
+-0.030312 0.1325 -1.2936
+-0.025449 0.13253 -1.2939
+-0.023042 0.1327 -1.2955
+-0.021862 0.13293 -1.2978
+-0.020837 0.1342 -1.3103
+0.093876 0.11869 -1.1572
+0.094982 0.11871 -1.1574
+0.097186 0.11874 -1.1577
+0.099383 0.11876 -1.1579
+0.10374 0.11875 -1.1578
+0.10814 0.11878 -1.1581
+0.11254 0.11882 -1.1585
+0.11697 0.11889 -1.1591
+0.12138 0.11893 -1.1595
+0.12587 0.11904 -1.1606
+0.1303 0.1191 -1.1611
+0.13247 0.11908 -1.1609
+0.13454 0.11897 -1.1598
+0.15326 0.12349 -1.2044
+0.15586 0.12375 -1.2069
+0.15828 0.12387 -1.2081
+0.1629 0.12392 -1.2086
+0.16787 0.12423 -1.2116
+0.1728 0.12449 -1.2141
+0.17789 0.12485 -1.2177
+0.18061 0.12515 -1.2206
+0.18318 0.12533 -1.2225
+0.18589 0.12561 -1.2251
+0.18726 0.12575 -1.2265
+-0.11295 0.13256 -1.3061
+-0.11046 0.13252 -1.3057
+-0.063691 0.13235 -1.3042
+-0.062459 0.13234 -1.3041
+-0.061227 0.13233 -1.304
+-0.058784 0.13235 -1.3042
+-0.057561 0.13237 -1.3043
+-0.056347 0.1324 -1.3047
+-0.044066 0.13238 -1.3045
+-0.042921 0.13264 -1.307
+-0.041709 0.13269 -1.3076
+-0.034301 0.13259 -1.3066
+-0.031578 0.13148 -1.2956
+-0.021929 0.13211 -1.3019
+-0.019631 0.13315 -1.3122
+0.092146 0.12408 -1.2217
+0.094983 0.11762 -1.1574
+0.096089 0.11764 -1.1576
+0.098276 0.11765 -1.1577
+0.13357 0.11799 -1.161
+0.13451 0.11786 -1.1597
+0.13555 0.11781 -1.1592
+0.15314 0.12226 -1.2034
+0.15442 0.12237 -1.2046
+0.15693 0.12256 -1.2064
+0.18691 0.12436 -1.2242
+-0.1117 0.1313 -1.3058
+-0.10924 0.1313 -1.3058
+-0.10659 0.13106 -1.3034
+-0.10392 0.13079 -1.3008
+-0.10132 0.13059 -1.2987
+-0.09884 0.13055 -1.2983
+-0.09645 0.13062 -1.299
+-0.091594 0.13067 -1.2995
+-0.089203 0.13075 -1.3003
+-0.086681 0.13063 -1.2992
+-0.084216 0.1306 -1.2989
+-0.081821 0.13068 -1.2997
+-0.079381 0.13069 -1.2998
+-0.076934 0.13069 -1.2998
+-0.074495 0.1307 -1.2999
+-0.07209 0.13078 -1.3007
+-0.069723 0.13093 -1.3022
+-0.06726 0.13091 -1.302
+-0.064774 0.13083 -1.3013
+-0.062251 0.13068 -1.2997
+-0.061028 0.13068 -1.2997
+-0.059869 0.13082 -1.3011
+-0.057479 0.13095 -1.3025
+-0.056323 0.13111 -1.3041
+-0.055107 0.13114 -1.3044
+-0.052683 0.13121 -1.3051
+-0.050188 0.13111 -1.3041
+-0.047699 0.13101 -1.3031
+-0.045257 0.13105 -1.3034
+-0.042896 0.13133 -1.3063
+-0.040478 0.13146 -1.3076
+-0.038 0.1314 -1.307
+-0.035531 0.13136 -1.3066
+-0.034278 0.13127 -1.3057
+-0.032976 0.13098 -1.3028
+-0.030329 0.13014 -1.2944
+-0.027875 0.13005 -1.2935
+-0.025449 0.1301 -1.294
+-0.023061 0.13036 -1.2966
+-0.021934 0.13092 -1.3022
+-0.020831 0.13169 -1.3099
+-0.018395 0.1319 -1.312
+0.089805 0.12287 -1.2212
+0.090884 0.12278 -1.2202
+0.093027 0.12257 -1.2182
+0.094988 0.11653 -1.1575
+0.097203 0.11658 -1.1579
+0.099385 0.11657 -1.1579
+0.10157 0.11658 -1.1579
+0.13252 0.11693 -1.1614
+0.13469 0.11692 -1.1612
+0.13563 0.11678 -1.1598
+0.13969 0.11652 -1.1572
+0.14097 0.11668 -1.1588
+0.14239 0.11695 -1.1615
+0.15432 0.12116 -1.2038
+0.15558 0.12126 -1.2047
+0.15801 0.12138 -1.206
+0.16035 0.12143 -1.2065
+0.18012 0.12251 -1.2173
+0.18526 0.12288 -1.221
+0.18796 0.12314 -1.2236
+-0.11051 0.13012 -1.3063
+-0.10255 0.12938 -1.2988
+-0.10117 0.12918 -1.2968
+-0.099924 0.12915 -1.2965
+-0.070872 0.12956 -1.3008
+-0.069672 0.12961 -1.3013
+-0.068402 0.12952 -1.3004
+-0.065876 0.12937 -1.2988
+-0.064609 0.12928 -1.2979
+-0.063388 0.12928 -1.2979
+-0.06095 0.12929 -1.298
+-0.059732 0.1293 -1.2981
+-0.05852 0.12932 -1.2983
+-0.05616 0.12951 -1.3003
+-0.034277 0.13004 -1.3057
+-0.031599 0.12913 -1.2965
+-0.029098 0.12886 -1.2938
+-0.027867 0.1288 -1.2931
+-0.026657 0.12883 -1.2935
+-0.021932 0.12968 -1.3021
+0.087595 0.12185 -1.2225
+0.088607 0.12166 -1.2205
+0.089652 0.12151 -1.2191
+0.093947 0.12113 -1.2152
+0.13588 0.1159 -1.162
+0.1368 0.11576 -1.1606
+0.1379 0.11576 -1.1606
+0.13912 0.11587 -1.1616
+0.14022 0.11587 -1.1616
+0.14144 0.11597 -1.1627
+0.14253 0.11597 -1.1627
+0.15417 0.11991 -1.2026
+0.1567 0.12011 -1.2046
+-0.11185 0.12901 -1.3076
+-0.10932 0.12893 -1.3068
+-0.10663 0.12865 -1.3039
+-0.10388 0.12829 -1.3003
+-0.098728 0.12796 -1.2968
+-0.094009 0.12818 -1.2991
+-0.091582 0.1282 -1.2994
+-0.089023 0.12804 -1.2977
+-0.086447 0.12784 -1.2957
+-0.084031 0.12787 -1.296
+-0.081742 0.12811 -1.2985
+-0.079407 0.12829 -1.3003
+-0.076962 0.12829 -1.3003
+-0.074517 0.12829 -1.3003
+-0.072042 0.12824 -1.2998
+-0.069479 0.12803 -1.2976
+-0.067009 0.12797 -1.2971
+-0.065787 0.12797 -1.2971
+-0.064615 0.12807 -1.2981
+-0.062177 0.12808 -1.2982
+-0.059719 0.12804 -1.2978
+-0.057275 0.12804 -1.2978
+-0.054828 0.12803 -1.2977
+-0.052418 0.12811 -1.2985
+-0.05005 0.1283 -1.3005
+-0.047665 0.12847 -1.3022
+-0.045256 0.12859 -1.3034
+-0.04281 0.12861 -1.3036
+-0.040407 0.12877 -1.3053
+-0.037997 0.12893 -1.3069
+-0.03553 0.1289 -1.3066
+-0.03428 0.12882 -1.3058
+-0.032931 0.12835 -1.301
+-0.030318 0.12766 -1.2939
+-0.027879 0.12764 -1.2937
+-0.025459 0.12771 -1.2945
+-0.02307 0.12797 -1.2971
+-0.020795 0.129 -1.3077
+-0.018362 0.1292 -1.3097
+0.08636 0.12058 -1.2213
+0.088439 0.12028 -1.2182
+0.090549 0.12003 -1.2157
+0.092719 0.11988 -1.2141
+0.093827 0.11983 -1.2136
+0.094991 0.11436 -1.1575
+0.099377 0.11438 -1.1578
+0.10378 0.11442 -1.1582
+0.10816 0.11444 -1.1583
+0.11251 0.11442 -1.1582
+0.11696 0.11451 -1.159
+0.12136 0.11454 -1.1593
+0.12584 0.11464 -1.1604
+0.13033 0.11474 -1.1614
+0.1348 0.11482 -1.1622
+0.13702 0.11485 -1.1624
+0.13937 0.11498 -1.1637
+0.14167 0.11507 -1.1647
+0.14288 0.11515 -1.1656
+0.15528 0.11876 -1.2024
+0.15779 0.11894 -1.2043
+0.16236 0.11897 -1.2045
+0.16717 0.11916 -1.2065
+0.17211 0.11943 -1.2093
+0.17707 0.1197 -1.212
+0.18238 0.1202 -1.217
+0.18745 0.12051 -1.2202
+0.19027 0.12084 -1.2236
+-0.11194 0.12788 -1.3087
+-0.11062 0.12779 -1.3077
+-0.10804 0.12765 -1.3062
+-0.10534 0.12735 -1.3032
+-0.087678 0.12664 -1.2959
+-0.085214 0.1266 -1.2955
+-0.080529 0.1269 -1.2986
+-0.079388 0.12703 -1.2999
+-0.078164 0.12703 -1.2999
+-0.076929 0.12701 -1.2997
+-0.075676 0.12696 -1.2992
+-0.074454 0.12696 -1.2992
+-0.073131 0.12679 -1.2974
+-0.070579 0.12659 -1.2954
+-0.069262 0.12641 -1.2936
+-0.068045 0.12641 -1.2936
+-0.066859 0.12647 -1.2942
+-0.065659 0.1265 -1.2945
+-0.034275 0.12757 -1.3056
+-0.031592 0.12666 -1.2962
+-0.021905 0.12707 -1.3005
+-0.020771 0.12762 -1.3061
+-0.019566 0.12778 -1.3078
+0.08411 0.1195 -1.222
+0.085164 0.11936 -1.2206
+0.093687 0.11851 -1.2118
+0.14279 0.11399 -1.1648
+0.144 0.11407 -1.1657
+0.14516 0.11412 -1.1662
+0.15641 0.11763 -1.2024
+0.18865 0.11939 -1.2206
+0.19011 0.11959 -1.2226
+-0.11318 0.12666 -1.3088
+-0.11194 0.12666 -1.3087
+-0.1094 0.12657 -1.3078
+-0.10812 0.12651 -1.3072
+-0.10674 0.12633 -1.3054
+-0.10412 0.12613 -1.3033
+-0.096371 0.12562 -1.298
+-0.094047 0.12578 -1.2996
+-0.091556 0.12572 -1.299
+-0.088923 0.12545 -1.2962
+-0.087653 0.12538 -1.2955
+-0.08642 0.12536 -1.2953
+-0.085201 0.12536 -1.2953
+-0.083994 0.12538 -1.2955
+-0.081621 0.12548 -1.2965
+-0.079237 0.12557 -1.2975
+-0.076732 0.12546 -1.2964
+-0.074231 0.12536 -1.2953
+-0.071682 0.12517 -1.2933
+-0.069256 0.12518 -1.2934
+-0.066865 0.12526 -1.2943
+-0.064441 0.12529 -1.2945
+-0.06207 0.12542 -1.2959
+-0.057227 0.12549 -1.2967
+-0.052404 0.12563 -1.2982
+-0.047568 0.12576 -1.2996
+-0.045153 0.12585 -1.3004
+-0.042729 0.12591 -1.3011
+-0.040315 0.12602 -1.3023
+-0.037924 0.12622 -1.3044
+-0.035491 0.1263 -1.3052
+-0.034244 0.12623 -1.3044
+-0.032917 0.12585 -1.3005
+-0.031604 0.12549 -1.2967
+-0.030337 0.1253 -1.2947
+-0.027897 0.12528 -1.2946
+-0.023051 0.12543 -1.2961
+-0.021895 0.12579 -1.2998
+-0.020683 0.12586 -1.3006
+0.082968 0.11836 -1.2222
+0.083992 0.11818 -1.2203
+0.085013 0.118 -1.2185
+0.08607 0.11788 -1.2172
+0.088206 0.11767 -1.215
+0.09034 0.11747 -1.2129
+0.092485 0.11729 -1.211
+0.09354 0.11719 -1.2099
+0.094928 0.1121 -1.1568
+0.097206 0.11221 -1.1579
+0.099405 0.11223 -1.1581
+0.10157 0.11221 -1.1579
+0.137 0.11264 -1.1622
+0.14148 0.11272 -1.1631
+0.14377 0.1128 -1.1639
+0.14617 0.11295 -1.1655
+0.15624 0.11636 -1.201
+0.15754 0.11648 -1.2023
+0.15995 0.11659 -1.2034
+0.16215 0.11654 -1.2029
+0.16445 0.11657 -1.2032
+0.18466 0.1179 -1.217
+0.18716 0.11802 -1.2183
+0.18994 0.11833 -1.2215
+0.19141 0.11853 -1.2235
+-0.11313 0.12537 -1.3082
+-0.11067 0.12538 -1.3083
+-0.10817 0.12533 -1.3078
+-0.10552 0.12511 -1.3055
+-0.10424 0.12505 -1.3048
+-0.096443 0.12449 -1.299
+-0.095314 0.12462 -1.3003
+-0.087628 0.12413 -1.2951
+-0.086393 0.1241 -1.2949
+-0.085191 0.12413 -1.2951
+-0.077767 0.12395 -1.2933
+-0.076544 0.12394 -1.2932
+-0.075277 0.12386 -1.2923
+-0.074061 0.12386 -1.2923
+-0.072849 0.12386 -1.2924
+-0.070471 0.12396 -1.2934
+-0.046342 0.12453 -1.2995
+-0.045141 0.12459 -1.3001
+-0.043926 0.12461 -1.3004
+-0.041504 0.12469 -1.3012
+-0.034204 0.12485 -1.3029
+-0.03161 0.1243 -1.297
+-0.02187 0.12442 -1.2984
+0.081811 0.1172 -1.2221
+0.082838 0.11702 -1.2202
+0.083848 0.11683 -1.2182
+0.084898 0.1167 -1.2168
+0.09134 0.11615 -1.211
+0.092384 0.11603 -1.2097
+0.094909 0.11099 -1.1565
+0.096033 0.11102 -1.157
+0.098305 0.11113 -1.158
+0.14482 0.11166 -1.1634
+0.14597 0.1117 -1.1639
+0.14723 0.11182 -1.1652
+0.15868 0.11536 -1.2024
+0.16096 0.11537 -1.2025
+0.19121 0.11725 -1.2223
+-0.1119 0.12414 -1.3082
+-0.10949 0.1242 -1.3089
+-0.10692 0.12408 -1.3076
+-0.10432 0.12392 -1.3059
+-0.10311 0.12394 -1.3061
+-0.096746 0.12366 -1.3031
+-0.094212 0.12355 -1.302
+-0.091627 0.12337 -1.3
+-0.088867 0.12293 -1.2954
+-0.086398 0.12289 -1.295
+-0.083996 0.12294 -1.2955
+-0.081566 0.12295 -1.2957
+-0.07899 0.12274 -1.2934
+-0.076498 0.12265 -1.2924
+-0.074067 0.12265 -1.2924
+-0.071651 0.12268 -1.2927
+-0.069225 0.12269 -1.2929
+-0.064384 0.12274 -1.2934
+-0.059528 0.12276 -1.2937
+-0.054735 0.12293 -1.2955
+-0.049941 0.12314 -1.2977
+-0.047514 0.12318 -1.2981
+-0.045066 0.12316 -1.2979
+-0.042696 0.12337 -1.3002
+-0.040295 0.12351 -1.3016
+-0.035443 0.12367 -1.3034
+-0.034202 0.12362 -1.3028
+-0.032892 0.1233 -1.2995
+-0.030363 0.12296 -1.2959
+-0.025472 0.1229 -1.2952
+-0.023068 0.12308 -1.2971
+0.080678 0.11607 -1.2224
+0.081705 0.1159 -1.2205
+0.083749 0.11554 -1.2168
+0.085881 0.11533 -1.2145
+0.090194 0.115 -1.2109
+0.092284 0.11476 -1.2084
+0.096061 0.10997 -1.1573
+0.097182 0.11 -1.1577
+0.099348 0.10998 -1.1575
+0.10358 0.10985 -1.156
+0.10782 0.10973 -1.1547
+0.1121 0.10965 -1.1539
+0.1168 0.10998 -1.1574
+0.12144 0.11024 -1.1601
+0.1259 0.11032 -1.161
+0.13031 0.11034 -1.1612
+0.13472 0.11037 -1.1615
+0.13917 0.11043 -1.1621
+0.14367 0.11052 -1.163
+0.14593 0.11058 -1.1636
+0.14835 0.11074 -1.1654
+0.15851 0.1141 -1.2011
+0.1597 0.11415 -1.2016
+0.16195 0.11414 -1.2015
+0.16667 0.11427 -1.2028
+0.17159 0.11453 -1.2056
+0.17658 0.11482 -1.2087
+0.18171 0.11519 -1.2126
+0.18445 0.11547 -1.2156
+0.18692 0.11558 -1.2167
+0.18955 0.11579 -1.2189
+0.19107 0.11601 -1.2214
+-0.11073 0.12299 -1.309
+-0.1057 0.12286 -1.3077
+-0.1031 0.1227 -1.306
+-0.10194 0.12278 -1.3069
+-0.096795 0.12249 -1.3038
+-0.09555 0.12247 -1.3035
+-0.03418 0.12231 -1.302
+-0.031613 0.12186 -1.2971
+0.079557 0.11496 -1.2229
+0.080584 0.11479 -1.2209
+0.091155 0.11363 -1.2085
+0.096218 0.10905 -1.1592
+0.098216 0.10885 -1.157
+0.15959 0.11293 -1.2007
+0.16072 0.11293 -1.2007
+0.19093 0.11478 -1.2204
+0.19251 0.11503 -1.2232
+-0.1108 0.12182 -1.3098
+-0.10963 0.12189 -1.3105
+-0.10715 0.12187 -1.3104
+-0.10587 0.12182 -1.3098
+-0.10443 0.12158 -1.3072
+-0.10305 0.1214 -1.3052
+-0.10182 0.1214 -1.3052
+-0.1007 0.12154 -1.3067
+-0.099437 0.1215 -1.3063
+-0.098151 0.12142 -1.3055
+-0.096856 0.12134 -1.3046
+-0.094354 0.12128 -1.3039
+-0.091715 0.12104 -1.3013
+-0.088957 0.12062 -1.2968
+-0.086448 0.12052 -1.2957
+-0.083954 0.12044 -1.2949
+-0.081391 0.12026 -1.2928
+-0.076505 0.12022 -1.2925
+-0.071593 0.12015 -1.2917
+-0.047462 0.1206 -1.2967
+-0.042656 0.12081 -1.2989
+-0.037866 0.12112 -1.3023
+-0.035432 0.12118 -1.303
+-0.032888 0.12084 -1.2993
+-0.030365 0.12053 -1.296
+-0.027905 0.12044 -1.295
+-0.023074 0.12066 -1.2974
+0.078436 0.11386 -1.2233
+0.079465 0.11368 -1.2214
+0.081521 0.11334 -1.2177
+0.083615 0.11307 -1.2148
+0.085757 0.11288 -1.2127
+0.087932 0.11274 -1.2112
+0.090046 0.11253 -1.2089
+0.091085 0.11241 -1.2076
+0.096308 0.10806 -1.1603
+0.09714 0.10777 -1.1572
+0.099175 0.10761 -1.1554
+0.10131 0.10757 -1.155
+0.11425 0.10746 -1.1537
+0.11678 0.10778 -1.1572
+0.11922 0.10802 -1.1598
+0.12142 0.10803 -1.1599
+0.12364 0.10806 -1.1603
+0.14588 0.10834 -1.1632
+0.14817 0.10841 -1.164
+0.16063 0.11174 -1.2
+0.16176 0.11174 -1.2
+0.16392 0.11167 -1.1993
+0.1664 0.11182 -1.2009
+0.16889 0.11197 -1.2025
+0.17136 0.1121 -1.204
+0.17385 0.11224 -1.2055
+0.17889 0.11256 -1.2089
+0.1842 0.11302 -1.2139
+0.18676 0.11319 -1.2157
+0.18926 0.11332 -1.2171
+0.19227 0.11374 -1.2216
+-0.1108 0.12059 -1.3099
+-0.10598 0.12072 -1.3112
+-0.1032 0.12036 -1.3073
+-0.10067 0.12027 -1.3064
+-0.098145 0.12019 -1.3054
+-0.095607 0.12009 -1.3043
+-0.093085 0.12 -1.3034
+-0.091698 0.11979 -1.3011
+-0.090286 0.11954 -1.2983
+-0.034178 0.11986 -1.3019
+-0.031603 0.11938 -1.2967
+-0.021911 0.11976 -1.3009
+-0.020924 0.12113 -1.3159
+-0.019726 0.12138 -1.3186
+0.077317 0.11275 -1.2239
+0.078348 0.11258 -1.222
+0.080408 0.11224 -1.2182
+0.088957 0.11145 -1.2096
+0.089981 0.11131 -1.208
+0.095493 0.10728 -1.1638
+0.096337 0.107 -1.1607
+0.097092 0.10663 -1.1566
+0.098114 0.10655 -1.1558
+0.11544 0.10646 -1.1547
+0.11679 0.1067 -1.1574
+0.11802 0.10683 -1.1587
+0.12028 0.1069 -1.1595
+0.14932 0.10735 -1.1643
+0.16151 0.11044 -1.1982
+0.16267 0.11046 -1.1984
+0.165 0.11051 -1.1989
+0.1675 0.11067 -1.2007
+0.17 0.11082 -1.2024
+0.18794 0.11206 -1.2159
+0.19052 0.11223 -1.2178
+0.19184 0.11234 -1.2189
+-0.10966 0.11945 -1.3109
+-0.10726 0.11953 -1.3117
+-0.1048 0.11954 -1.3119
+-0.10212 0.1193 -1.3091
+-0.099457 0.11906 -1.3065
+-0.096888 0.11892 -1.305
+-0.094319 0.11878 -1.3035
+-0.091515 0.11833 -1.2984
+-0.088855 0.11804 -1.2953
+-0.083791 0.11777 -1.2923
+-0.078846 0.11765 -1.291
+-0.073927 0.11756 -1.29
+-0.069041 0.11751 -1.2894
+-0.064194 0.11752 -1.2896
+-0.059377 0.11759 -1.2904
+-0.054601 0.11777 -1.2923
+-0.049825 0.11797 -1.2946
+-0.045029 0.11818 -1.2969
+-0.040234 0.11843 -1.2997
+-0.037848 0.11861 -1.3017
+-0.035409 0.11865 -1.3021
+-0.032861 0.1183 -1.2982
+-0.031583 0.11809 -1.2959
+-0.03036 0.11807 -1.2957
+-0.025486 0.11809 -1.2959
+-0.023093 0.11832 -1.2985
+-0.020925 0.1199 -1.316
+-0.018493 0.12018 -1.3191
+0.076185 0.11163 -1.2242
+0.07723 0.11147 -1.2225
+0.079295 0.11114 -1.2188
+0.081426 0.11092 -1.2163
+0.083538 0.11068 -1.2137
+0.085665 0.11048 -1.2114
+0.087828 0.11033 -1.2097
+0.089913 0.11009 -1.2071
+0.094473 0.10627 -1.1647
+0.095448 0.10613 -1.1632
+0.097196 0.10565 -1.1579
+0.099124 0.10538 -1.1549
+0.1033 0.1052 -1.1528
+0.10754 0.1051 -1.1517
+0.11189 0.10511 -1.1518
+0.11416 0.1052 -1.1528
+0.11654 0.10539 -1.1549
+0.11791 0.10564 -1.1577
+0.1191 0.10573 -1.1586
+0.12134 0.10577 -1.1592
+0.12363 0.10587 -1.1602
+0.12589 0.10593 -1.1609
+0.13032 0.10597 -1.1613
+0.13472 0.10599 -1.1615
+0.13915 0.10603 -1.1619
+0.14364 0.10611 -1.1628
+0.14813 0.10619 -1.1636
+0.14926 0.10621 -1.1639
+0.16344 0.10909 -1.1957
+0.16596 0.10927 -1.1977
+0.16736 0.10945 -1.1997
+0.16862 0.10953 -1.2006
+0.16994 0.10965 -1.2019
+0.17109 0.10966 -1.2021
+0.1735 0.10975 -1.2031
+0.1761 0.10996 -1.2054
+0.17866 0.11014 -1.2073
+0.18118 0.11029 -1.209
+0.18389 0.11055 -1.2119
+0.18659 0.1108 -1.2146
+0.18777 0.11082 -1.2148
+0.18892 0.11082 -1.2148
+0.19019 0.1109 -1.2157
+-0.10995 0.11854 -1.3144
+-0.10853 0.11834 -1.3122
+-0.10729 0.11834 -1.3122
+-0.10612 0.1184 -1.313
+-0.10367 0.11843 -1.3133
+-0.10235 0.11834 -1.3122
+-0.10089 0.11807 -1.3092
+-0.098178 0.11777 -1.3059
+-0.096895 0.1177 -1.3051
+-0.095552 0.11756 -1.3036
+-0.092723 0.11709 -1.2983
+-0.091268 0.11679 -1.2949
+-0.089977 0.11669 -1.2939
+-0.031581 0.11686 -1.2958
+-0.024295 0.117 -1.2974
+-0.023098 0.11712 -1.2988
+-0.022027 0.11793 -1.3078
+-0.017253 0.11895 -1.3192
+-0.016029 0.11907 -1.3206
+-0.0148 0.11918 -1.3219
+0.075048 0.1105 -1.2245
+0.076103 0.11035 -1.2229
+0.084503 0.10931 -1.2111
+0.085545 0.10918 -1.2097
+0.086657 0.10915 -1.2093
+0.087768 0.10911 -1.2089
+0.088786 0.10896 -1.2072
+0.093421 0.10522 -1.1653
+0.094377 0.10506 -1.1635
+0.11765 0.10431 -1.155
+0.11874 0.10431 -1.155
+0.11992 0.1044 -1.156
+0.14926 0.10512 -1.1639
+0.15039 0.10514 -1.1642
+0.16697 0.10806 -1.1968
+0.16852 0.10833 -1.1998
+0.16975 0.1084 -1.2006
+0.17095 0.10844 -1.201
+0.17208 0.10844 -1.201
+0.17315 0.1084 -1.2006
+0.17434 0.10844 -1.201
+0.1756 0.10852 -1.2019
+0.17717 0.10878 -1.2049
+0.17847 0.10889 -1.206
+0.17962 0.10889 -1.2061
+0.18089 0.10897 -1.207
+0.18221 0.10908 -1.2082
+0.18506 0.10942 -1.212
+0.1863 0.10948 -1.2127
+-0.11748 0.11866 -1.3298
+-0.11614 0.11857 -1.3288
+-0.11355 0.11847 -1.3277
+-0.11202 0.11818 -1.3244
+-0.10901 0.11762 -1.3181
+-0.10759 0.11742 -1.3159
+-0.10621 0.11727 -1.3141
+-0.10495 0.11724 -1.3138
+-0.10238 0.11713 -1.3126
+-0.099541 0.1167 -1.3077
+-0.096681 0.11622 -1.3022
+-0.093821 0.11571 -1.2965
+-0.091227 0.11552 -1.2943
+-0.088765 0.11548 -1.2939
+-0.086271 0.1154 -1.2931
+-0.06175 0.11506 -1.2892
+-0.056958 0.11518 -1.2906
+-0.052193 0.11538 -1.2929
+-0.049814 0.11551 -1.2944
+-0.047479 0.11576 -1.2971
+-0.037831 0.11611 -1.3012
+-0.035385 0.11612 -1.3013
+-0.032843 0.11579 -1.2975
+-0.031585 0.11565 -1.296
+-0.030357 0.11562 -1.2956
+-0.027919 0.11562 -1.2956
+-0.025499 0.1157 -1.2966
+-0.024297 0.11579 -1.2975
+-0.023141 0.11611 -1.3012
+-0.022077 0.11696 -1.3108
+-0.020911 0.11734 -1.3151
+-0.018455 0.11745 -1.3164
+-0.015997 0.1176 -1.318
+-0.013536 0.11776 -1.3198
+0.073894 0.10934 -1.2245
+0.074961 0.10922 -1.223
+0.077048 0.10891 -1.2196
+0.079195 0.10871 -1.2172
+0.081325 0.10849 -1.2148
+0.083314 0.1081 -1.2104
+0.0843 0.1079 -1.2082
+0.087522 0.10767 -1.2055
+0.088657 0.10767 -1.2055
+0.092335 0.10414 -1.1655
+0.093288 0.10397 -1.1636
+0.095185 0.10365 -1.16
+0.097109 0.10337 -1.1568
+0.099082 0.10316 -1.1544
+0.10114 0.10303 -1.153
+0.11403 0.10291 -1.1515
+0.11634 0.10303 -1.1529
+0.11868 0.10317 -1.1544
+0.12103 0.10333 -1.1562
+0.12359 0.10365 -1.1598
+0.12588 0.10373 -1.1608
+0.12811 0.10376 -1.1611
+0.14583 0.10392 -1.1628
+0.14812 0.10399 -1.1636
+0.15038 0.10403 -1.1641
+0.16934 0.107 -1.1976
+0.18183 0.10772 -1.2057
+0.18323 0.10787 -1.2074
+0.18571 0.10799 -1.2088
+-0.11852 0.11719 -1.3274
+-0.11725 0.11718 -1.3272
+-0.112 0.11691 -1.3242
+-0.11055 0.1167 -1.3217
+-0.10923 0.11661 -1.3208
+-0.1064 0.11624 -1.3165
+-0.10373 0.11602 -1.314
+-0.10237 0.11589 -1.3125
+-0.10093 0.11565 -1.3098
+-0.097909 0.11499 -1.3023
+-0.096384 0.11464 -1.2982
+-0.095071 0.11453 -1.2969
+-0.031586 0.11444 -1.296
+-0.024306 0.11461 -1.298
+-0.022084 0.11576 -1.3112
+-0.012276 0.11634 -1.3179
+0.073789 0.10803 -1.2227
+0.075904 0.10777 -1.2197
+0.082279 0.1071 -1.212
+0.083181 0.10679 -1.2084
+0.091286 0.10309 -1.1661
+0.092223 0.10291 -1.164
+0.093146 0.10272 -1.1618
+0.094126 0.1026 -1.1604
+-0.11703 0.11571 -1.3247
+-0.11578 0.11571 -1.3247
+-0.113 0.11542 -1.3213
+-0.11048 0.11538 -1.3208
+-0.10787 0.11525 -1.3193
+-0.10658 0.1152 -1.3188
+-0.10517 0.115 -1.3165
+-0.10376 0.11482 -1.3145
+-0.1022 0.11446 -1.3102
+-0.099141 0.11378 -1.3024
+-0.097622 0.11343 -1.2984
+-0.09637 0.1134 -1.298
+-0.093844 0.1133 -1.2969
+-0.08874 0.11301 -1.2936
+-0.083711 0.1128 -1.2911
+-0.078716 0.11261 -1.2889
+-0.073796 0.1125 -1.2877
+-0.068931 0.11247 -1.2874
+-0.064127 0.11254 -1.2882
+-0.061713 0.11256 -1.2884
+-0.059311 0.11261 -1.2889
+-0.056923 0.11268 -1.2898
+-0.054541 0.11277 -1.2909
+-0.052189 0.11294 -1.2928
+-0.049951 0.11338 -1.2979
+-0.045055 0.11336 -1.2977
+-0.040208 0.11346 -1.2989
+-0.037816 0.11362 -1.3007
+-0.035359 0.11359 -1.3003
+-0.032807 0.11322 -1.2961
+-0.030363 0.1132 -1.2959
+-0.025505 0.11329 -1.2969
+-0.02431 0.11341 -1.2982
+-0.023161 0.11376 -1.3024
+-0.02209 0.11456 -1.3116
+-0.020896 0.11478 -1.3141
+-0.018434 0.11485 -1.3149
+-0.015969 0.11491 -1.3157
+-0.013492 0.1149 -1.3155
+0.073679 0.10672 -1.2209
+0.074746 0.10661 -1.2195
+0.076895 0.1064 -1.2171
+0.079006 0.10616 -1.2143
+0.081146 0.10597 -1.2121
+0.090264 0.10208 -1.1671
+0.09119 0.10189 -1.1649
+0.093077 0.10155 -1.161
+0.09507 0.10134 -1.1586
+0.099152 0.10105 -1.1552
+0.10329 0.10084 -1.1527
+0.10739 0.10061 -1.1501
+0.11175 0.10064 -1.1504
+0.11626 0.10078 -1.152
+0.121 0.10112 -1.1559
+0.12369 0.10154 -1.1607
+0.12592 0.10157 -1.1611
+0.13034 0.10161 -1.1615
+0.13476 0.10164 -1.1619
+0.1392 0.10168 -1.1623
+0.14359 0.10169 -1.1624
+0.14805 0.10175 -1.1631
+0.1526 0.10185 -1.1643
+-0.11565 0.11433 -1.3232
+-0.11426 0.11418 -1.3214
+-0.11162 0.11404 -1.3197
+-0.10659 0.11396 -1.3189
+-0.10527 0.11388 -1.3179
+-0.10371 0.11353 -1.3138
+-0.10204 0.11304 -1.3081
+-0.10055 0.11275 -1.3047
+-0.099078 0.11248 -1.3015
+-0.097634 0.11223 -1.2986
+-0.095154 0.11218 -1.2981
+-0.062907 0.11132 -1.2881
+-0.061707 0.11134 -1.2883
+-0.060495 0.11134 -1.2883
+-0.059296 0.11136 -1.2886
+-0.058102 0.1114 -1.289
+-0.056922 0.11146 -1.2898
+-0.055759 0.11157 -1.291
+-0.054565 0.11161 -1.2915
+-0.0534 0.11171 -1.2927
+-0.051165 0.11215 -1.2978
+-0.036591 0.11239 -1.3006
+-0.024312 0.11219 -1.2983
+-0.022086 0.11331 -1.3114
+-0.01718 0.1135 -1.3136
+-0.015943 0.11349 -1.3135
+-0.014706 0.11348 -1.3134
+0.072514 0.10555 -1.2206
+0.073578 0.10543 -1.2192
+0.075671 0.10515 -1.2159
+0.076709 0.105 -1.2142
+0.077741 0.10485 -1.2124
+0.078772 0.1047 -1.2107
+0.079874 0.10465 -1.2101
+0.089222 0.10104 -1.1679
+0.090126 0.10083 -1.1653
+0.12242 0.1003 -1.159
+0.12482 0.10048 -1.1611
+0.15373 0.10078 -1.1645
+0.15501 0.1009 -1.1659
+0.1565 0.10115 -1.1688
+0.20078 0.10126 -1.17
+0.20187 0.10126 -1.17
+0.20298 0.10126 -1.17
+0.20416 0.1013 -1.1704
+0.20527 0.1013 -1.1704
+0.20631 0.10127 -1.1701
+0.20728 0.10121 -1.1694
+0.20828 0.10116 -1.1688
+0.20932 0.10113 -1.1684
+0.21039 0.10112 -1.1682
+0.21149 0.10112 -1.1682
+0.2126 0.10112 -1.1683
+0.21371 0.10113 -1.1683
+0.21484 0.10114 -1.1685
+0.21598 0.10116 -1.1687
+0.21721 0.10121 -1.1694
+0.21832 0.10122 -1.1694
+0.21946 0.10124 -1.1696
+0.22059 0.10125 -1.1698
+0.22176 0.10128 -1.1701
+-0.1159 0.11333 -1.326
+-0.11419 0.11288 -1.3207
+-0.11287 0.1128 -1.3198
+-0.11033 0.11274 -1.319
+-0.1078 0.11269 -1.3185
+-0.10522 0.11258 -1.3172
+-0.10204 0.11181 -1.3082
+-0.099168 0.11135 -1.3027
+-0.096416 0.11101 -1.2986
+-0.093852 0.11087 -1.297
+-0.091218 0.11063 -1.2942
+-0.081161 0.1102 -1.2892
+-0.076206 0.11006 -1.2875
+-0.073773 0.11004 -1.2873
+-0.07134 0.11003 -1.2871
+-0.068914 0.11002 -1.287
+-0.06648 0.11 -1.2868
+-0.064087 0.11005 -1.2874
+-0.055936 0.1107 -1.2951
+-0.054814 0.11089 -1.2974
+-0.052391 0.11094 -1.2979
+-0.049947 0.11093 -1.2979
+-0.047494 0.11091 -1.2976
+-0.045032 0.11086 -1.297
+-0.042605 0.11089 -1.2974
+-0.040214 0.11103 -1.299
+-0.037817 0.11117 -1.3007
+-0.036592 0.11117 -1.3007
+-0.035339 0.11107 -1.2996
+-0.032814 0.1108 -1.2964
+-0.030365 0.11077 -1.296
+-0.027923 0.11076 -1.2958
+-0.025508 0.11086 -1.297
+-0.024307 0.11095 -1.2981
+-0.023163 0.11132 -1.3025
+-0.02208 0.11204 -1.311
+-0.020873 0.11218 -1.3127
+-0.018402 0.11218 -1.3126
+-0.017159 0.11212 -1.312
+0.072435 0.10429 -1.2193
+0.074521 0.10399 -1.2158
+0.075573 0.10387 -1.2143
+0.088286 0.10013 -1.1701
+0.089099 0.099806 -1.1663
+0.091022 0.099506 -1.1627
+0.092995 0.099274 -1.16
+0.10953 0.098418 -1.1498
+0.11165 0.098378 -1.1493
+0.11389 0.098446 -1.1501
+0.11872 0.098854 -1.1549
+0.12122 0.09912 -1.158
+0.12256 0.099324 -1.1604
+0.12372 0.099376 -1.161
+0.12594 0.099402 -1.1613
+0.12815 0.099414 -1.1615
+0.1503 0.099588 -1.1634
+0.15253 0.099613 -1.1637
+0.15484 0.099693 -1.1647
+0.15749 0.099981 -1.1681
+0.15987 0.10009 -1.1693
+0.16098 0.1001 -1.1694
+0.1974 0.10013 -1.1696
+0.19937 0.10001 -1.1682
+0.20139 0.099919 -1.1672
+0.20362 0.099934 -1.1673
+0.2058 0.099926 -1.1672
+0.20788 0.099868 -1.1665
+0.21004 0.099845 -1.1662
+0.21222 0.09984 -1.1662
+0.21435 0.099808 -1.1658
+0.2168 0.099921 -1.1671
+0.21905 0.099947 -1.1674
+0.22147 0.10005 -1.1686
+0.22269 0.1001 -1.1692
+-0.11624 0.11241 -1.3299
+-0.11441 0.11185 -1.3232
+-0.11159 0.11152 -1.3193
+-0.10652 0.11141 -1.318
+-0.074972 0.10881 -1.2871
+-0.072547 0.10881 -1.287
+-0.071327 0.10879 -1.2869
+-0.070124 0.10881 -1.287
+-0.068903 0.10879 -1.2868
+-0.067676 0.10876 -1.2865
+-0.057511 0.11016 -1.3033
+-0.056355 0.1103 -1.3049
+-0.055119 0.11028 -1.3047
+-0.053691 0.10987 -1.2998
+-0.051156 0.10968 -1.2975
+-0.04382 0.10965 -1.2972
+-0.042598 0.10965 -1.2972
+-0.041411 0.10974 -1.2983
+-0.036595 0.10995 -1.3008
+-0.029144 0.10955 -1.2959
+-0.027917 0.10951 -1.2956
+-0.026711 0.10957 -1.2962
+-0.024308 0.10973 -1.2981
+-0.023203 0.11028 -1.3047
+-0.022081 0.11081 -1.3111
+-0.019639 0.11095 -1.3128
+0.07132 0.10319 -1.2198
+0.073397 0.10288 -1.2162
+0.083848 0.10031 -1.1855
+0.084957 0.1003 -1.1853
+0.08606 0.10029 -1.1852
+0.087511 0.099398 -1.1745
+0.088175 0.098902 -1.1686
+0.089981 0.098469 -1.1634
+0.11051 0.097242 -1.1487
+0.12254 0.098212 -1.1602
+0.12484 0.098299 -1.1613
+0.1607 0.098823 -1.1674
+0.16182 0.098832 -1.1675
+0.16295 0.09885 -1.1677
+0.19501 0.098929 -1.1685
+0.19604 0.098894 -1.1681
+0.198 0.098774 -1.1666
+0.19897 0.098708 -1.1658
+0.20006 0.098705 -1.1658
+0.22242 0.098878 -1.1678
+0.22365 0.098933 -1.1684
+-0.11931 0.11169 -1.3364
+-0.11784 0.11149 -1.3339
+-0.11649 0.1114 -1.3329
+-0.11499 0.11116 -1.33
+-0.11317 0.1106 -1.3233
+-0.11042 0.11034 -1.3201
+-0.10783 0.11023 -1.3188
+-0.10654 0.11019 -1.3183
+-0.10492 0.10979 -1.3134
+-0.10188 0.10918 -1.3061
+-0.099124 0.10885 -1.3022
+-0.096378 0.10852 -1.2981
+-0.093759 0.10831 -1.2957
+-0.088625 0.108 -1.2919
+-0.083599 0.10779 -1.2894
+-0.081117 0.10772 -1.2885
+-0.078636 0.10764 -1.2876
+-0.076175 0.10759 -1.2869
+-0.074964 0.10759 -1.2869
+-0.073736 0.10756 -1.2867
+-0.072521 0.10756 -1.2866
+-0.056517 0.10939 -1.3087
+-0.05516 0.10914 -1.3057
+-0.052425 0.10856 -1.2988
+-0.049907 0.1084 -1.2968
+-0.045054 0.10847 -1.2976
+-0.042623 0.10849 -1.298
+-0.040224 0.10861 -1.2994
+-0.037807 0.10869 -1.3004
+-0.035322 0.10858 -1.299
+-0.032811 0.10836 -1.2963
+-0.030368 0.10834 -1.2961
+-0.027926 0.10833 -1.296
+-0.025514 0.10844 -1.2974
+-0.02431 0.10852 -1.2982
+-0.023215 0.10911 -1.3055
+-0.022095 0.10965 -1.312
+-0.020875 0.10972 -1.3129
+-0.019645 0.10975 -1.3132
+0.071281 0.10198 -1.2192
+0.072296 0.10179 -1.2169
+0.073325 0.10163 -1.215
+0.08261 0.099048 -1.1837
+0.083716 0.099037 -1.1836
+0.08587 0.09895 -1.1825
+0.086655 0.098576 -1.178
+0.087342 0.098102 -1.1723
+0.088077 0.097692 -1.1673
+0.088977 0.097474 -1.1647
+0.090955 0.097242 -1.1618
+0.095016 0.096918 -1.1579
+0.099134 0.096678 -1.155
+0.10324 0.096451 -1.1522
+0.10735 0.096241 -1.1497
+0.10946 0.096192 -1.1491
+0.11052 0.096171 -1.1488
+0.11176 0.096304 -1.1504
+0.11644 0.096593 -1.1539
+0.11875 0.096703 -1.1552
+0.12119 0.09691 -1.1577
+0.12365 0.09713 -1.1604
+0.12595 0.097217 -1.1614
+0.13037 0.097251 -1.1618
+0.13478 0.097271 -1.162
+0.13917 0.09728 -1.1621
+0.14357 0.097291 -1.1622
+0.14804 0.097352 -1.163
+0.15249 0.097392 -1.1634
+0.15703 0.097494 -1.1646
+0.15929 0.097531 -1.1651
+0.16146 0.097516 -1.1649
+0.16392 0.097674 -1.1668
+0.16958 0.097769 -1.1679
+0.17069 0.09777 -1.1679
+0.19068 0.097864 -1.169
+0.19271 0.097778 -1.1679
+0.19373 0.097735 -1.1674
+0.19474 0.097693 -1.1669
+0.19676 0.097604 -1.1658
+0.19889 0.09757 -1.1654
+0.20105 0.097551 -1.1651
+0.20548 0.097572 -1.1654
+0.20987 0.097569 -1.1653
+0.21429 0.097579 -1.1654
+0.21884 0.097648 -1.1663
+0.22106 0.097661 -1.1664
+0.22341 0.097728 -1.1672
+0.22462 0.097775 -1.1678
+-0.11775 0.11015 -1.333
+-0.11499 0.10991 -1.33
+-0.11175 0.10919 -1.3212
+-0.10655 0.10895 -1.3183
+-0.095009 0.10713 -1.2961
+-0.079873 0.10646 -1.288
+-0.078627 0.10642 -1.2874
+-0.077391 0.10638 -1.287
+-0.076154 0.10635 -1.2866
+-0.057921 0.10848 -1.3127
+-0.056559 0.10823 -1.3097
+-0.055204 0.10799 -1.3068
+-0.053769 0.10758 -1.3017
+-0.051115 0.10715 -1.2965
+-0.034033 0.10714 -1.2964
+-0.031587 0.10712 -1.2961
+-0.024319 0.10733 -1.2987
+-0.022096 0.10842 -1.312
+-0.019651 0.10855 -1.3136
+0.070226 0.10097 -1.2208
+0.071266 0.10081 -1.2189
+0.07224 0.10057 -1.216
+0.081365 0.097776 -1.1818
+0.082479 0.097776 -1.1818
+0.084675 0.097742 -1.1814
+0.086417 0.097198 -1.1747
+0.088021 0.09653 -1.1665
+0.089933 0.096224 -1.1628
+0.11072 0.095257 -1.1509
+0.16491 0.096507 -1.166
+0.16604 0.096527 -1.1662
+0.16714 0.09653 -1.1662
+0.16825 0.096534 -1.1663
+0.16933 0.096526 -1.1662
+0.17158 0.096552 -1.1665
+0.1727 0.096565 -1.1666
+0.17383 0.096579 -1.1668
+0.17494 0.096587 -1.1669
+0.17607 0.096601 -1.1671
+0.18715 0.096648 -1.1676
+0.18823 0.096634 -1.1674
+0.18931 0.096627 -1.1673
+0.19132 0.096528 -1.1661
+0.19344 0.096489 -1.1656
+0.19558 0.096465 -1.1653
+0.22442 0.096587 -1.1667
+0.22561 0.096627 -1.1672
+-0.12277 0.10889 -1.3329
+-0.12149 0.10887 -1.3326
+-0.11888 0.10879 -1.3316
+-0.11628 0.10869 -1.3304
+-0.11494 0.10861 -1.3294
+-0.11332 0.10825 -1.325
+-0.11051 0.10795 -1.3213
+-0.1079 0.10782 -1.3197
+-0.10471 0.1071 -1.3107
+-0.10173 0.10656 -1.3042
+-0.099005 0.10627 -1.3006
+-0.096319 0.10601 -1.2973
+-0.094991 0.10589 -1.2959
+-0.093687 0.10579 -1.2947
+-0.091127 0.10565 -1.2929
+-0.086066 0.10541 -1.29
+-0.083571 0.10533 -1.289
+-0.081106 0.10528 -1.2883
+-0.079847 0.10521 -1.2876
+-0.061807 0.10756 -1.3166
+-0.060469 0.10738 -1.3144
+-0.059158 0.10724 -1.3127
+-0.057794 0.10701 -1.3098
+-0.055113 0.10659 -1.3046
+-0.052335 0.10593 -1.2965
+-0.049886 0.10591 -1.2963
+-0.04748 0.10599 -1.2972
+-0.042656 0.10613 -1.299
+-0.037812 0.10626 -1.3006
+-0.035298 0.10606 -1.2981
+-0.034028 0.10591 -1.2962
+-0.032808 0.1059 -1.2962
+-0.030367 0.1059 -1.2961
+-0.027931 0.10591 -1.2962
+-0.025524 0.10604 -1.2979
+-0.024366 0.10631 -1.3013
+-0.023287 0.10698 -1.3096
+-0.022097 0.10719 -1.3121
+-0.02087 0.10722 -1.3125
+-0.018432 0.10741 -1.3148
+0.069114 0.099868 -1.2215
+0.070182 0.099753 -1.2201
+0.071222 0.0996 -1.2182
+0.072174 0.099331 -1.2148
+0.077326 0.097181 -1.1882
+0.079269 0.096821 -1.1838
+0.080251 0.096661 -1.1818
+0.081257 0.096533 -1.1802
+0.083463 0.096513 -1.18
+0.084518 0.096449 -1.1792
+0.085432 0.096228 -1.1764
+0.087115 0.095642 -1.1692
+0.088927 0.095223 -1.164
+0.090932 0.095027 -1.1616
+0.092969 0.094872 -1.1596
+0.10973 0.094252 -1.1519
+0.11194 0.094286 -1.1523
+0.11411 0.094289 -1.1523
+0.1186 0.094404 -1.1538
+0.12091 0.094514 -1.1551
+0.12359 0.094898 -1.1598
+0.12593 0.095012 -1.1612
+0.12815 0.09504 -1.1616
+0.15913 0.095236 -1.1639
+0.1636 0.095285 -1.1644
+0.16586 0.095325 -1.1649
+0.16804 0.095318 -1.1648
+0.17025 0.095325 -1.1649
+0.17253 0.095369 -1.1655
+0.17476 0.095387 -1.1657
+0.17708 0.095457 -1.1665
+0.18266 0.095497 -1.167
+0.18374 0.095486 -1.1669
+0.18589 0.095465 -1.1666
+0.18797 0.095405 -1.1658
+0.19011 0.095376 -1.1655
+0.19226 0.095351 -1.1652
+0.1944 0.095323 -1.1648
+0.19656 0.09531 -1.1646
+0.19875 0.095306 -1.1646
+0.2209 0.095392 -1.1656
+0.22311 0.095395 -1.1656
+0.22543 0.095448 -1.1662
+-0.12259 0.10748 -1.331
+-0.11474 0.10717 -1.3271
+-0.11188 0.10682 -1.3227
+-0.10922 0.10666 -1.3207
+-0.10619 0.10611 -1.3139
+-0.094986 0.10466 -1.2958
+-0.082323 0.10407 -1.2884
+-0.081099 0.10405 -1.2882
+-0.066604 0.10607 -1.3134
+-0.065368 0.10607 -1.3134
+-0.064149 0.10609 -1.3138
+-0.062915 0.1061 -1.3138
+-0.061679 0.1061 -1.3138
+-0.059055 0.10582 -1.3104
+-0.056343 0.10536 -1.3047
+-0.053645 0.10489 -1.2987
+-0.051106 0.10469 -1.2963
+-0.034038 0.10472 -1.2966
+-0.031593 0.1047 -1.2964
+-0.024411 0.10529 -1.3038
+-0.022097 0.10595 -1.3121
+0.067969 0.098725 -1.2216
+0.069039 0.098611 -1.2202
+0.070081 0.09846 -1.2183
+0.080093 0.095359 -1.1794
+0.082287 0.095327 -1.179
+0.084407 0.095212 -1.1776
+0.086185 0.094728 -1.1715
+0.17812 0.094322 -1.1661
+0.17924 0.094333 -1.1662
+0.18034 0.094336 -1.1663
+0.18144 0.094334 -1.1662
+0.18251 0.094323 -1.1661
+0.22638 0.094286 -1.1654
+-0.12368 0.10609 -1.3292
+-0.12113 0.10605 -1.3287
+-0.11871 0.10612 -1.3297
+-0.11606 0.10599 -1.3279
+-0.11323 0.10567 -1.324
+-0.1106 0.10555 -1.3224
+-0.10923 0.10542 -1.3208
+-0.10765 0.1051 -1.3167
+-0.10459 0.10451 -1.3092
+-0.10169 0.10407 -1.3037
+-0.098966 0.10378 -1.3001
+-0.096316 0.10356 -1.2973
+-0.093687 0.10336 -1.2947
+-0.088588 0.10309 -1.2914
+-0.08604 0.10295 -1.2896
+-0.083563 0.10289 -1.2888
+-0.081119 0.10287 -1.2886
+-0.071666 0.10501 -1.3156
+-0.070321 0.10484 -1.3136
+-0.067731 0.10466 -1.3113
+-0.065249 0.10464 -1.311
+-0.062798 0.10466 -1.3114
+-0.061564 0.10466 -1.3114
+-0.06029 0.10459 -1.3105
+-0.057575 0.10414 -1.3048
+-0.05489 0.10371 -1.2993
+-0.05356 0.1035 -1.2967
+-0.052321 0.10346 -1.2962
+-0.049889 0.10348 -1.2964
+-0.045067 0.10361 -1.298
+-0.04027 0.10384 -1.3009
+-0.037841 0.10389 -1.3016
+-0.035284 0.10357 -1.2976
+-0.032811 0.10347 -1.2963
+-0.030365 0.10345 -1.296
+-0.027938 0.10349 -1.2966
+-0.025526 0.10361 -1.298
+-0.023306 0.1046 -1.3106
+-0.020865 0.10473 -1.3122
+-0.018404 0.10477 -1.3128
+-0.015964 0.10497 -1.3153
+-0.014744 0.10509 -1.3168
+0.066809 0.097559 -1.2214
+0.067873 0.097437 -1.2199
+0.069994 0.097192 -1.2167
+0.074859 0.094652 -1.1846
+0.077021 0.094567 -1.1835
+0.07899 0.094256 -1.1796
+0.079987 0.094122 -1.1779
+0.081097 0.094122 -1.1779
+0.083307 0.094113 -1.1777
+0.084352 0.094041 -1.1768
+0.08525 0.093809 -1.1739
+0.087037 0.093354 -1.1681
+0.088922 0.093024 -1.1639
+0.09096 0.092866 -1.1619
+0.095042 0.092577 -1.1583
+0.099189 0.092374 -1.1557
+0.10335 0.092196 -1.1534
+0.10764 0.09215 -1.1528
+0.11185 0.092043 -1.1514
+0.11627 0.092103 -1.1522
+0.12094 0.092357 -1.1554
+0.1237 0.092793 -1.1609
+0.12596 0.092844 -1.1615
+0.13036 0.09286 -1.1617
+0.13476 0.092876 -1.1619
+0.13919 0.092908 -1.1623
+0.14358 0.092914 -1.1623
+0.14799 0.092935 -1.1626
+0.15241 0.092957 -1.1628
+0.15685 0.092993 -1.1633
+0.1613 0.093031 -1.1637
+0.16574 0.093058 -1.1641
+0.1702 0.093098 -1.1645
+0.17467 0.09314 -1.1651
+0.17689 0.093153 -1.1652
+0.1791 0.093165 -1.1654
+0.18129 0.093159 -1.1653
+0.18346 0.093143 -1.1651
+0.18781 0.093127 -1.1648
+0.19221 0.093128 -1.1648
+0.19656 0.093112 -1.1646
+0.20094 0.093107 -1.1645
+0.20536 0.09312 -1.1647
+0.20991 0.093191 -1.1656
+0.21438 0.093221 -1.1659
+0.21864 0.093164 -1.1652
+0.22306 0.093177 -1.1653
+0.22517 0.09314 -1.1649
+0.22622 0.093123 -1.1646
+-0.1235 0.10469 -1.3273
+-0.12225 0.10468 -1.3272
+-0.11737 0.10479 -1.3287
+-0.11449 0.10444 -1.3242
+-0.1119 0.10435 -1.323
+-0.10929 0.10424 -1.3215
+-0.106 0.10345 -1.3115
+-0.077929 0.10387 -1.3169
+-0.076686 0.10386 -1.3168
+-0.075441 0.10385 -1.3167
+-0.074134 0.10376 -1.3155
+-0.072798 0.10362 -1.3137
+-0.071454 0.10346 -1.3117
+-0.060103 0.10304 -1.3064
+-0.05878 0.10287 -1.3043
+-0.056087 0.10244 -1.2987
+-0.053501 0.10217 -1.2952
+-0.051103 0.10225 -1.2962
+-0.029145 0.10223 -1.296
+-0.026736 0.10234 -1.2974
+-0.02442 0.10287 -1.3042
+-0.023307 0.10337 -1.3107
+-0.022078 0.10339 -1.3109
+-0.017168 0.10353 -1.3127
+-0.014703 0.10357 -1.3132
+-0.013469 0.10358 -1.3133
+0.066683 0.096226 -1.2191
+0.073628 0.093389 -1.1827
+0.077937 0.093214 -1.1805
+0.078861 0.092992 -1.1776
+0.079955 0.092975 -1.1774
+0.080991 0.092891 -1.1763
+0.082157 0.092956 -1.1771
+0.084283 0.092856 -1.1759
+0.086084 0.092411 -1.1702
+0.22403 0.092025 -1.1647
+0.225 0.091974 -1.164
+-0.12457 0.10329 -1.3253
+-0.12332 0.10329 -1.3253
+-0.121 0.10344 -1.3273
+-0.11867 0.10358 -1.3291
+-0.11738 0.10355 -1.3288
+-0.11593 0.10337 -1.3265
+-0.11446 0.10317 -1.3239
+-0.11316 0.10312 -1.3232
+-0.11061 0.10306 -1.3225
+-0.10929 0.103 -1.3216
+-0.10762 0.10258 -1.3162
+-0.106 0.10222 -1.3115
+-0.10452 0.10198 -1.3084
+-0.1017 0.10162 -1.3038
+-0.096305 0.10111 -1.2972
+-0.091146 0.1008 -1.2932
+-0.088598 0.10067 -1.2915
+-0.081665 0.10265 -1.3172
+-0.080425 0.10265 -1.3172
+-0.079178 0.10264 -1.3171
+-0.077931 0.10263 -1.3169
+-0.076602 0.10251 -1.3154
+-0.075327 0.10246 -1.3147
+-0.072691 0.10223 -1.3118
+-0.071349 0.10208 -1.3098
+-0.069953 0.10184 -1.3067
+-0.067149 0.10132 -1.2999
+-0.064647 0.10123 -1.2988
+-0.062214 0.10125 -1.299
+-0.061101 0.10143 -1.3014
+-0.059822 0.10133 -1.3002
+-0.057262 0.10113 -1.2976
+-0.054668 0.10085 -1.294
+-0.052323 0.10103 -1.2962
+-0.049895 0.10105 -1.2965
+-0.047465 0.10107 -1.2968
+-0.042661 0.10125 -1.2992
+-0.040282 0.10142 -1.3013
+-0.037831 0.10141 -1.3012
+-0.035267 0.10108 -1.297
+-0.032815 0.10104 -1.2965
+-0.030359 0.10099 -1.2958
+-0.02914 0.10099 -1.2958
+-0.02794 0.10106 -1.2967
+-0.025546 0.10124 -1.299
+-0.023273 0.10199 -1.3088
+-0.022074 0.10214 -1.3107
+-0.020844 0.10215 -1.3109
+-0.018384 0.10219 -1.3113
+-0.017147 0.10217 -1.3111
+-0.015884 0.10198 -1.3086
+-0.014652 0.10197 -1.3085
+0.064443 0.095161 -1.2202
+0.065493 0.095017 -1.2183
+0.067644 0.094816 -1.2157
+0.073532 0.092155 -1.1812
+0.074632 0.092139 -1.181
+0.076845 0.092126 -1.1808
+0.078854 0.091874 -1.1775
+0.079888 0.091789 -1.1764
+0.080974 0.091763 -1.1761
+0.083205 0.09178 -1.1763
+0.085156 0.091495 -1.1726
+0.087027 0.091142 -1.168
+0.088945 0.090853 -1.1642
+0.10144 0.090262 -1.1565
+0.10359 0.090232 -1.1561
+0.10564 0.090126 -1.1548
+0.10971 0.08989 -1.1517
+0.11183 0.08985 -1.1512
+0.11401 0.089864 -1.1513
+0.11623 0.089898 -1.1518
+0.11866 0.090094 -1.1543
+0.12142 0.090537 -1.16
+0.12375 0.09064 -1.1614
+0.12598 0.09067 -1.1617
+0.12817 0.090672 -1.1617
+0.17679 0.090905 -1.1646
+0.18121 0.090922 -1.1648
+0.22083 0.090964 -1.1652
+0.2229 0.090916 -1.1645
+0.22482 0.090803 -1.1631
+-0.12457 0.10204 -1.3254
+-0.1221 0.10206 -1.3256
+-0.12092 0.10212 -1.3264
+-0.11985 0.10227 -1.3284
+-0.11749 0.10239 -1.33
+-0.11462 0.10207 -1.3257
+-0.11322 0.10192 -1.3238
+-0.11192 0.10187 -1.3232
+-0.1093 0.10176 -1.3217
+-0.10599 0.10098 -1.3114
+-0.089877 0.099526 -1.2925
+-0.083157 0.10172 -1.3213
+-0.081824 0.10161 -1.3198
+-0.079172 0.10139 -1.317
+-0.077807 0.10123 -1.3148
+-0.069626 0.10014 -1.3005
+-0.068278 0.099954 -1.2981
+-0.067031 0.099916 -1.2976
+-0.065761 0.09984 -1.2967
+-0.064544 0.099845 -1.2967
+-0.063308 0.09982 -1.2964
+-0.062088 0.09982 -1.2964
+-0.060868 0.099819 -1.2964
+-0.059667 0.09985 -1.2968
+-0.058411 0.099789 -1.296
+-0.055834 0.099544 -1.2928
+-0.039057 0.10019 -1.3013
+-0.036518 0.099941 -1.298
+-0.029144 0.099784 -1.296
+-0.026738 0.099905 -1.2976
+-0.024367 0.10019 -1.3013
+-0.023196 0.10043 -1.3044
+-0.022043 0.10076 -1.3088
+-0.020818 0.10079 -1.3092
+-0.019586 0.10079 -1.3092
+-0.018334 0.10068 -1.3078
+0.003747 0.099001 -1.2857
+0.004955 0.098953 -1.2851
+0.063227 0.093911 -1.2189
+0.064294 0.093793 -1.2173
+0.066454 0.093607 -1.2149
+0.067518 0.093497 -1.2134
+0.073483 0.090981 -1.1804
+0.079847 0.090633 -1.1758
+0.080922 0.090596 -1.1753
+0.082041 0.090609 -1.1755
+0.1129 0.088756 -1.151
+0.114 0.08877 -1.1512
+0.11512 0.088796 -1.1516
+0.22369 0.089691 -1.1629
+-0.12485 0.10102 -1.3284
+-0.12338 0.10085 -1.326
+-0.12214 0.10085 -1.326
+-0.1211 0.10102 -1.3284
+-0.11888 0.10126 -1.3315
+-0.11646 0.10134 -1.3326
+-0.11349 0.10093 -1.3271
+-0.11202 0.10072 -1.3244
+-0.11071 0.10066 -1.3237
+-0.10931 0.10052 -1.3218
+-0.10761 0.10009 -1.3161
+-0.10452 0.099517 -1.3085
+-0.098946 0.098865 -1.2998
+-0.09372 0.098513 -1.2952
+-0.091168 0.09839 -1.2935
+-0.089913 0.098348 -1.293
+-0.088696 0.098348 -1.293
+-0.083222 0.10055 -1.3223
+-0.080408 0.10015 -1.3169
+-0.077706 0.09986 -1.3131
+-0.07079 0.098827 -1.2994
+-0.069477 0.098699 -1.2977
+-0.066987 0.098629 -1.2968
+-0.064546 0.098628 -1.2968
+-0.06209 0.098603 -1.2964
+-0.05961 0.098535 -1.2955
+-0.056975 0.098196 -1.291
+-0.05462 0.09833 -1.2928
+-0.052318 0.098577 -1.2961
+-0.049887 0.098591 -1.2963
+-0.045071 0.098728 -1.2981
+-0.040289 0.098984 -1.3015
+-0.039058 0.098967 -1.3013
+-0.037782 0.098833 -1.2995
+-0.03526 0.098616 -1.2967
+-0.030358 0.098546 -1.2957
+-0.027938 0.098608 -1.2966
+-0.02555 0.09881 -1.2993
+-0.023143 0.09897 -1.3014
+-0.02197 0.099201 -1.3045
+-0.020748 0.099227 -1.3048
+-0.015764 0.098764 -1.2987
+-0.007162 0.098082 -1.2896
+-0.005945 0.098025 -1.2888
+-0.001092 0.097846 -1.2865
+0.001327 0.097749 -1.2852
+0.002535 0.097704 -1.2846
+0.003742 0.097651 -1.2839
+0.006152 0.097558 -1.2826
+0.062012 0.092662 -1.2175
+0.063111 0.092592 -1.2166
+0.06527 0.092406 -1.2141
+0.066337 0.0923 -1.2127
+0.07235 0.089842 -1.18
+0.07456 0.089826 -1.1798
+0.076744 0.089782 -1.1792
+0.078763 0.089551 -1.1762
+0.080881 0.089443 -1.1747
+0.083093 0.089442 -1.1747
+0.085166 0.089295 -1.1727
+0.08706 0.088974 -1.1685
+0.091019 0.088541 -1.1627
+0.095127 0.088288 -1.1593
+0.099327 0.088138 -1.1573
+0.10361 0.088071 -1.1564
+0.10767 0.087829 -1.1532
+0.11183 0.08768 -1.1512
+0.11291 0.08768 -1.1512
+0.11418 0.08782 -1.153
+0.11655 0.087973 -1.155
+0.12134 0.088291 -1.1593
+0.12604 0.08852 -1.1623
+0.13039 0.088503 -1.162
+0.1348 0.088523 -1.1623
+0.13921 0.08854 -1.1625
+0.14358 0.08853 -1.1623
+0.14794 0.088518 -1.1622
+0.15239 0.088563 -1.1627
+0.15681 0.088581 -1.163
+0.16124 0.088605 -1.1633
+0.16564 0.088616 -1.1634
+0.17011 0.088659 -1.1639
+0.17459 0.088707 -1.1646
+0.17898 0.088706 -1.1645
+0.18338 0.08871 -1.1646
+0.18775 0.088703 -1.1644
+0.19215 0.088709 -1.1645
+0.1965 0.088691 -1.1642
+0.20096 0.08872 -1.1646
+0.20539 0.08874 -1.1649
+0.20991 0.088795 -1.1656
+0.21434 0.088807 -1.1657
+0.2187 0.088793 -1.1655
+0.22075 0.088735 -1.1647
+0.22262 0.088605 -1.163
+0.22354 0.088535 -1.1621
+-0.12619 0.10084 -1.3428
+-0.12439 0.10041 -1.337
+-0.12285 0.10018 -1.3338
+-0.12026 0.10012 -1.333
+-0.11782 0.10017 -1.3337
+-0.11521 0.10008 -1.3326
+-0.11386 0.1 -1.3315
+-0.11238 0.099792 -1.3287
+-0.11081 0.099509 -1.3249
+-0.10934 0.099304 -1.3222
+-0.10598 0.098494 -1.3113
+-0.092504 0.097297 -1.2952
+-0.091268 0.097279 -1.295
+-0.087163 0.099548 -1.3255
+-0.085923 0.099557 -1.3256
+-0.084532 0.099387 -1.3234
+-0.083167 0.099244 -1.3214
+-0.081655 0.098918 -1.3171
+-0.078824 0.098478 -1.3111
+-0.070606 0.097351 -1.296
+-0.068206 0.097406 -1.2968
+-0.065805 0.097465 -1.2976
+-0.060886 0.097407 -1.2968
+-0.058192 0.096984 -1.2911
+-0.056868 0.096799 -1.2886
+-0.055762 0.096983 -1.2911
+-0.039042 0.097702 -1.3008
+-0.036501 0.097453 -1.2975
+-0.026742 0.097476 -1.2978
+-0.021894 0.097635 -1.2999
+-0.01942 0.097496 -1.2981
+-0.018182 0.097406 -1.2968
+-0.016949 0.097332 -1.2958
+-0.015718 0.097259 -1.2949
+-0.009586 0.096843 -1.2893
+-0.00837 0.096806 -1.2888
+-0.007154 0.096759 -1.2881
+0.002532 0.096388 -1.2832
+0.00494 0.096243 -1.2812
+0.006142 0.096186 -1.2804
+0.060801 0.091417 -1.2162
+0.061881 0.091321 -1.2149
+0.064052 0.091156 -1.2127
+0.065104 0.09103 -1.211
+0.071242 0.088734 -1.1801
+0.073412 0.08867 -1.1792
+0.11317 0.086795 -1.1539
+0.1155 0.086907 -1.1554
+0.22154 0.087514 -1.1631
+0.22244 0.087436 -1.162
+-0.12746 0.099585 -1.3429
+-0.12619 0.099578 -1.3428
+-0.12474 0.099433 -1.3408
+-0.12184 0.099118 -1.3365
+-0.11915 0.098977 -1.3346
+-0.11656 0.098911 -1.3337
+-0.11392 0.098797 -1.3322
+-0.11261 0.098749 -1.3316
+-0.11113 0.098542 -1.3287
+-0.10957 0.098263 -1.3249
+-0.10748 0.097502 -1.3146
+-0.10591 0.0972 -1.3105
+-0.10453 0.09706 -1.3086
+-0.10178 0.096787 -1.3049
+-0.096434 0.096351 -1.2989
+-0.093822 0.096179 -1.2966
+-0.090522 0.097888 -1.3199
+-0.088282 0.098158 -1.3236
+-0.085779 0.098144 -1.3234
+-0.082959 0.097754 -1.3181
+-0.080093 0.097286 -1.3117
+-0.07703 0.096541 -1.3016
+-0.074292 0.096167 -1.2965
+-0.071813 0.096114 -1.2958
+-0.069401 0.09615 -1.2963
+-0.068203 0.096181 -1.2967
+-0.067069 0.096305 -1.2984
+-0.064664 0.096361 -1.2992
+-0.062238 0.09639 -1.2996
+-0.060928 0.096252 -1.2977
+-0.059502 0.095922 -1.2932
+-0.058079 0.095583 -1.2886
+-0.056842 0.095541 -1.288
+-0.054742 0.096109 -1.2958
+-0.052306 0.096114 -1.2958
+-0.049882 0.096141 -1.2962
+-0.047488 0.096233 -1.2975
+-0.042753 0.096566 -1.302
+-0.040319 0.096605 -1.3025
+-0.037755 0.096316 -1.2986
+-0.035259 0.096172 -1.2966
+-0.032804 0.096129 -1.2961
+-0.02793 0.096139 -1.2962
+-0.026731 0.096215 -1.2972
+-0.021852 0.096227 -1.2974
+-0.020615 0.096149 -1.2963
+-0.018153 0.096029 -1.2947
+-0.015697 0.095911 -1.2931
+-0.01447 0.09584 -1.2921
+-0.013242 0.095752 -1.2909
+-0.010797 0.095607 -1.289
+-0.008361 0.095488 -1.2874
+-0.005933 0.095404 -1.2862
+-0.003511 0.095354 -1.2855
+0.001325 0.095201 -1.2834
+0.003734 0.095041 -1.2813
+0.00614 0.094957 -1.2801
+0.057276 0.090131 -1.2143
+0.058403 0.090105 -1.214
+0.059544 0.090102 -1.2139
+0.060653 0.090052 -1.2132
+0.062835 0.089906 -1.2112
+0.063844 0.08972 -1.2087
+0.071214 0.087587 -1.1796
+0.072296 0.087551 -1.1791
+0.074485 0.087514 -1.1786
+0.076678 0.087483 -1.1782
+0.078729 0.087296 -1.1756
+0.080818 0.08716 -1.1738
+0.083044 0.087177 -1.174
+0.085224 0.087143 -1.1735
+0.10571 0.085827 -1.1555
+0.10779 0.085751 -1.1545
+0.10998 0.085761 -1.1546
+0.11228 0.085858 -1.1559
+0.11443 0.085832 -1.1556
+0.11662 0.085841 -1.1557
+0.11885 0.085878 -1.1562
+0.12128 0.086059 -1.1586
+0.12378 0.08628 -1.1616
+0.21654 0.086609 -1.1657
+0.2186 0.086557 -1.165
+0.22042 0.086409 -1.163
+0.2213 0.086323 -1.1618
+-0.12727 0.098173 -1.3408
+-0.12601 0.098172 -1.3408
+-0.12333 0.09805 -1.3392
+-0.12198 0.097974 -1.3381
+-0.12051 0.097807 -1.3358
+-0.11782 0.09766 -1.3338
+-0.11265 0.097529 -1.332
+-0.11134 0.097476 -1.3313
+-0.10972 0.097149 -1.3268
+-0.10592 0.095968 -1.3105
+-0.090573 0.0967 -1.3207
+-0.089451 0.09683 -1.3225
+-0.088216 0.096839 -1.3226
+-0.086907 0.096768 -1.3216
+-0.078377 0.095464 -1.3036
+-0.076906 0.095161 -1.2995
+-0.075629 0.095093 -1.2985
+-0.074294 0.094949 -1.2965
+-0.073033 0.094895 -1.2958
+-0.071815 0.094897 -1.2958
+-0.070645 0.094963 -1.2967
+-0.069427 0.094966 -1.2968
+-0.068293 0.095085 -1.2984
+-0.065967 0.095254 -1.3008
+-0.060986 0.095121 -1.2989
+-0.059504 0.094708 -1.2932
+-0.058257 0.094658 -1.2926
+-0.05596 0.094888 -1.2957
+-0.026711 0.094921 -1.2962
+-0.021815 0.094846 -1.2952
+-0.014442 0.094439 -1.2896
+-0.012005 0.094357 -1.2885
+0.004936 0.093752 -1.2801
+0.054949 0.088921 -1.2134
+0.056061 0.088872 -1.2127
+0.05717 0.088822 -1.2121
+0.059379 0.088712 -1.2105
+0.061554 0.088562 -1.2085
+0.063632 0.088287 -1.2047
+0.064644 0.088121 -1.2024
+0.065623 0.087916 -1.1995
+0.070143 0.086524 -1.1803
+0.071197 0.086455 -1.1794
+0.073364 0.086391 -1.1785
+0.21931 0.085306 -1.1629
+0.22017 0.085216 -1.1617
+-0.12587 0.0968 -1.3393
+-0.1246 0.096799 -1.3393
+-0.12186 0.09662 -1.3368
+-0.11913 0.096451 -1.3344
+-0.11648 0.096335 -1.3328
+-0.11396 0.096321 -1.3327
+-0.11136 0.096242 -1.3316
+-0.10976 0.095942 -1.3274
+-0.10759 0.095119 -1.3159
+-0.10603 0.094833 -1.3119
+-0.10466 0.09471 -1.3102
+-0.1019 0.094441 -1.3064
+-0.099173 0.094185 -1.3029
+-0.096572 0.094039 -1.3008
+-0.092772 0.095163 -1.3165
+-0.091657 0.095292 -1.3183
+-0.090526 0.095407 -1.32
+-0.087956 0.095313 -1.3187
+-0.085304 0.095123 -1.316
+-0.082618 0.094881 -1.3126
+-0.079814 0.094485 -1.3071
+-0.077053 0.094118 -1.302
+-0.075674 0.093927 -1.2993
+-0.07443 0.093899 -1.2989
+-0.071971 0.09388 -1.2987
+-0.069667 0.094069 -1.3013
+-0.067272 0.094143 -1.3024
+-0.064828 0.094153 -1.3025
+-0.062357 0.094123 -1.3021
+-0.059597 0.093636 -1.2953
+-0.057176 0.093663 -1.2957
+-0.054743 0.09367 -1.2958
+-0.049894 0.093723 -1.2965
+-0.047534 0.09388 -1.2987
+-0.045184 0.094075 -1.3015
+-0.04279 0.094196 -1.3031
+-0.040328 0.094173 -1.3028
+-0.037676 0.093675 -1.2959
+-0.035243 0.093689 -1.2961
+-0.030334 0.093593 -1.2947
+-0.027911 0.093634 -1.2953
+-0.025459 0.093581 -1.2946
+-0.023011 0.093533 -1.2939
+-0.020563 0.093474 -1.2931
+-0.015656 0.093227 -1.2896
+-0.013215 0.093134 -1.2883
+-0.010783 0.093061 -1.2873
+-0.005931 0.092944 -1.2857
+-0.00109 0.092813 -1.2839
+0.003732 0.092561 -1.2803
+0.004935 0.092536 -1.28
+0.052689 0.08782 -1.214
+0.053776 0.087728 -1.2127
+0.055957 0.087568 -1.2105
+0.058162 0.087455 -1.2089
+0.06033 0.087299 -1.2067
+0.06243 0.087059 -1.2034
+0.064469 0.086753 -1.1991
+0.066475 0.086424 -1.1945
+0.068156 0.085709 -1.1845
+0.069098 0.085495 -1.1815
+0.070131 0.085398 -1.1801
+0.072257 0.085283 -1.1785
+0.074446 0.085248 -1.178
+0.076649 0.08523 -1.1778
+0.078718 0.085068 -1.1755
+0.080766 0.084893 -1.173
+0.082965 0.084883 -1.1729
+0.085206 0.084914 -1.1733
+0.087278 0.084779 -1.1714
+0.091174 0.0843 -1.1647
+0.09529 0.08406 -1.1613
+0.099483 0.083905 -1.1592
+0.10379 0.083857 -1.1585
+0.106 0.083878 -1.1588
+0.1082 0.083889 -1.1589
+0.11025 0.083786 -1.1575
+0.11232 0.08371 -1.1564
+0.11442 0.083645 -1.1555
+0.11657 0.083626 -1.1552
+0.11881 0.083675 -1.1559
+0.12158 0.084084 -1.1616
+0.126 0.084109 -1.1619
+0.13044 0.084147 -1.1624
+0.13482 0.084152 -1.1625
+0.13927 0.084189 -1.163
+0.14361 0.084168 -1.1627
+0.14803 0.084188 -1.1629
+0.1524 0.084182 -1.1628
+0.1568 0.084192 -1.1629
+0.16125 0.084225 -1.1634
+0.16568 0.084249 -1.1637
+0.17015 0.084288 -1.1642
+0.17459 0.084314 -1.1646
+0.17898 0.084316 -1.1646
+0.1834 0.084331 -1.1648
+0.1878 0.084335 -1.1648
+0.19218 0.08433 -1.1647
+0.19649 0.084293 -1.1642
+0.2007 0.084218 -1.1631
+0.20492 0.084151 -1.1622
+0.20955 0.084252 -1.1635
+0.21427 0.084382 -1.1653
+0.21644 0.084373 -1.1652
+0.21818 0.084199 -1.1628
+0.21903 0.084102 -1.1614
+-0.12574 0.095441 -1.3379
+-0.12318 0.095414 -1.3375
+-0.10989 0.094802 -1.3289
+-0.10611 0.093669 -1.3129
+-0.10062 0.093162 -1.3057
+-0.099253 0.093033 -1.3039
+-0.098026 0.093033 -1.3039
+-0.096801 0.093035 -1.3039
+-0.09499 0.093668 -1.3129
+-0.093805 0.093719 -1.3136
+-0.092764 0.093916 -1.3164
+-0.091525 0.093915 -1.3164
+-0.081109 0.09333 -1.3082
+-0.07583 0.092894 -1.302
+-0.063616 0.092946 -1.3028
+-0.060956 0.09263 -1.2983
+-0.046404 0.092841 -1.3013
+-0.041571 0.092986 -1.3034
+-0.040305 0.092894 -1.3021
+-0.038898 0.092461 -1.296
+-0.036441 0.092413 -1.2953
+0.004935 0.09133 -1.28
+0.051524 0.086639 -1.2135
+0.052608 0.086542 -1.2121
+0.06905 0.084323 -1.1807
+0.081816 0.083732 -1.1722
+0.10501 0.082866 -1.1599
+0.10614 0.082893 -1.1603
+0.10718 0.08285 -1.1597
+0.1155 0.08255 -1.1554
+0.11659 0.082555 -1.1554
+0.11773 0.082592 -1.156
+0.12051 0.083005 -1.1618
+0.21704 0.083082 -1.1625
+0.2179 0.082995 -1.1613
+-0.12437 0.094101 -1.3368
+-0.12177 0.094037 -1.3359
+-0.11914 0.093944 -1.3345
+-0.11661 0.093929 -1.3343
+-0.11408 0.093913 -1.3341
+-0.11147 0.09383 -1.3329
+-0.10989 0.093552 -1.3289
+-0.10766 0.092702 -1.3168
+-0.10489 0.092445 -1.3131
+-0.10223 0.092274 -1.3106
+-0.1009 0.092186 -1.3094
+-0.099664 0.092185 -1.3094
+-0.098489 0.092239 -1.3101
+-0.096128 0.092339 -1.3116
+-0.094971 0.092414 -1.3127
+-0.092476 0.092389 -1.3123
+-0.089919 0.092299 -1.311
+-0.087305 0.092143 -1.3088
+-0.084697 0.091986 -1.3066
+-0.0822 0.091943 -1.3059
+-0.079764 0.091967 -1.3063
+-0.077252 0.091903 -1.3054
+-0.074702 0.091787 -1.3037
+-0.072216 0.091745 -1.3031
+-0.067289 0.091714 -1.3027
+-0.064831 0.091704 -1.3026
+-0.063585 0.091676 -1.3022
+-0.062246 0.091508 -1.2998
+-0.059679 0.091323 -1.2971
+-0.057201 0.091263 -1.2963
+-0.054729 0.091208 -1.2955
+-0.052328 0.091272 -1.2964
+-0.0476 0.091563 -1.3006
+-0.046441 0.091689 -1.3024
+-0.045241 0.09174 -1.3031
+-0.042804 0.091772 -1.3036
+-0.041572 0.091761 -1.3034
+-0.040223 0.091482 -1.2994
+-0.038873 0.091183 -1.2951
+-0.03763 0.091122 -1.2943
+-0.035185 0.091099 -1.2939
+-0.032718 0.091009 -1.2927
+-0.027843 0.090973 -1.2921
+-0.022966 0.090917 -1.2913
+-0.013204 0.09063 -1.2872
+0.001323 0.09021 -1.2812
+0.003731 0.090131 -1.2801
+0.004934 0.090112 -1.2798
+0.050369 0.085474 -1.2132
+0.05145 0.085372 -1.2117
+0.052516 0.085251 -1.21
+0.053605 0.08517 -1.2088
+0.055783 0.085022 -1.2067
+0.060071 0.08466 -1.2015
+0.062159 0.084422 -1.1981
+0.064205 0.084147 -1.1941
+0.066174 0.083792 -1.189
+0.068017 0.083306 -1.182
+0.069028 0.083183 -1.1803
+0.070105 0.083142 -1.1797
+0.072251 0.083055 -1.1784
+0.076634 0.082993 -1.1775
+0.080777 0.082693 -1.1732
+0.081816 0.082626 -1.1722
+0.08289 0.082596 -1.1718
+0.085185 0.082681 -1.173
+0.08739 0.082677 -1.173
+0.089398 0.08249 -1.1703
+0.10174 0.081782 -1.1601
+0.10395 0.081797 -1.1603
+0.10617 0.081825 -1.1607
+0.10828 0.081764 -1.1598
+0.11026 0.081613 -1.1576
+0.11233 0.081532 -1.1564
+0.11446 0.081496 -1.1559
+0.11554 0.081495 -1.1559
+0.11684 0.081639 -1.1579
+0.11942 0.081909 -1.1618
+0.12162 0.081918 -1.1619
+0.12379 0.081904 -1.1617
+0.21172 0.082048 -1.1634
+0.21404 0.082096 -1.1641
+0.21585 0.08195 -1.162
+-0.12297 0.092739 -1.3353
+-0.11541 0.092713 -1.3349
+-0.11415 0.09271 -1.3349
+-0.11286 0.092688 -1.3346
+-0.10978 0.092204 -1.3275
+-0.10622 0.091295 -1.3143
+-0.10373 0.091281 -1.3141
+-0.1025 0.091281 -1.3141
+-0.10121 0.091237 -1.3135
+-0.099879 0.091149 -1.3122
+-0.098622 0.091128 -1.3119
+-0.097364 0.091106 -1.3116
+-0.096116 0.091093 -1.3114
+-0.093494 0.090942 -1.3092
+-0.092161 0.090843 -1.3078
+-0.090931 0.090843 -1.3078
+-0.08572 0.090537 -1.3034
+-0.084391 0.090428 -1.3018
+-0.083166 0.090427 -1.3018
+-0.080874 0.090604 -1.3044
+-0.079778 0.090752 -1.3065
+-0.07855 0.090754 -1.3066
+-0.076012 0.09066 -1.3052
+-0.06347 0.090286 -1.2998
+-0.060913 0.090121 -1.2974
+-0.046447 0.090475 -1.3026
+-0.041558 0.090504 -1.303
+-0.038847 0.089902 -1.2942
+-0.036369 0.089798 -1.2927
+0.004933 0.088887 -1.2795
+0.049234 0.084343 -1.2134
+0.050308 0.084229 -1.2117
+0.052453 0.08401 -1.2085
+0.069033 0.082077 -1.1804
+0.081822 0.081528 -1.1723
+0.10929 0.080609 -1.1589
+0.11029 0.080546 -1.158
+0.11132 0.080498 -1.1573
+0.11236 0.080466 -1.1568
+0.11343 0.080449 -1.1565
+0.11451 0.080443 -1.1564
+0.11576 0.080554 -1.158
+0.11828 0.080787 -1.1614
+0.12052 0.080821 -1.1619
+0.21268 0.080897 -1.1626
+0.21372 0.080879 -1.1624
+0.21467 0.080824 -1.1616
+-0.12158 0.091374 -1.3337
+-0.11919 0.091468 -1.3351
+-0.11674 0.091516 -1.3358
+-0.11415 0.091456 -1.3349
+-0.11288 0.091444 -1.3348
+-0.11142 0.091276 -1.3323
+-0.1077 0.090256 -1.3173
+-0.10499 0.090058 -1.3144
+-0.1025 0.090045 -1.3142
+-0.099901 0.089933 -1.3125
+-0.097342 0.08985 -1.3113
+-0.094701 0.089687 -1.3089
+-0.092078 0.089531 -1.3066
+-0.089504 0.089416 -1.3049
+-0.086936 0.0893 -1.3032
+-0.084296 0.089102 -1.3003
+-0.082997 0.08902 -1.2991
+-0.081818 0.089067 -1.2998
+-0.080635 0.089111 -1.3005
+-0.079584 0.089305 -1.3033
+-0.078551 0.089525 -1.3066
+-0.077371 0.089583 -1.3074
+-0.074758 0.0894 -1.3047
+-0.069746 0.089269 -1.3028
+-0.067256 0.089218 -1.3021
+-0.064693 0.089062 -1.2998
+-0.062108 0.088864 -1.2969
+-0.059653 0.088842 -1.2965
+-0.05475 0.088802 -1.296
+-0.050017 0.089059 -1.2998
+-0.047646 0.0892 -1.3018
+-0.045262 0.089329 -1.3038
+-0.042805 0.089321 -1.3036
+-0.041521 0.089197 -1.3018
+-0.04012 0.088807 -1.2961
+-0.038793 0.08856 -1.2924
+-0.03754 0.088474 -1.2912
+-0.03511 0.088471 -1.2911
+-0.030243 0.08845 -1.2908
+-0.025382 0.088438 -1.2907
+-0.020509 0.088369 -1.2896
+-0.015627 0.088211 -1.2873
+-0.010776 0.088159 -1.2865
+-0.005928 0.08807 -1.2852
+-0.001088 0.087839 -1.2818
+0.003727 0.08762 -1.2786
+0.004931 0.087643 -1.2789
+0.048108 0.083229 -1.2138
+0.04918 0.083109 -1.212
+0.051321 0.082881 -1.2087
+0.053493 0.08272 -1.2063
+0.057773 0.082345 -1.2008
+0.061985 0.081934 -1.1947
+0.064069 0.081723 -1.1916
+0.065957 0.081284 -1.1851
+0.067999 0.081057 -1.1817
+0.070122 0.080938 -1.18
+0.074412 0.08077 -1.1775
+0.078774 0.080694 -1.1764
+0.080844 0.080549 -1.1742
+0.082912 0.080409 -1.1721
+0.087408 0.080482 -1.1732
+0.089558 0.080428 -1.1724
+0.09158 0.080265 -1.17
+0.095558 0.079905 -1.1647
+0.099775 0.079768 -1.1626
+0.10406 0.079694 -1.1615
+0.1062 0.079657 -1.161
+0.10833 0.079616 -1.1603
+0.10936 0.079568 -1.1596
+0.11717 0.07968 -1.1613
+0.11829 0.079699 -1.1615
+0.11942 0.079719 -1.1618
+0.12161 0.079719 -1.1618
+0.12601 0.079738 -1.1621
+0.13042 0.079756 -1.1623
+0.13483 0.079771 -1.1625
+0.13926 0.0798 -1.1629
+0.14365 0.079805 -1.163
+0.14805 0.079812 -1.1631
+0.15244 0.079815 -1.1631
+0.15682 0.079816 -1.1631
+0.16125 0.079837 -1.1634
+0.16572 0.079876 -1.1639
+0.17019 0.079915 -1.1645
+0.17462 0.079934 -1.1648
+0.17902 0.079941 -1.1648
+0.18346 0.079959 -1.1651
+0.18788 0.079973 -1.1653
+0.19233 0.079996 -1.1656
+0.19658 0.079939 -1.1647
+0.20034 0.079688 -1.161
+0.20462 0.07965 -1.1604
+0.20908 0.079682 -1.1609
+0.21131 0.079699 -1.1611
+0.2125 0.079737 -1.1617
+-0.12023 0.090055 -1.3327
+-0.11906 0.090114 -1.3336
+-0.11796 0.090229 -1.3354
+-0.11548 0.090258 -1.3358
+-0.11279 0.090113 -1.3336
+-0.10962 0.089572 -1.3256
+-0.10774 0.089056 -1.3179
+-0.10631 0.088894 -1.3154
+-0.093327 0.088319 -1.3069
+-0.091985 0.088212 -1.3053
+-0.09061 0.088068 -1.3031
+-0.082933 0.087729 -1.2981
+-0.080426 0.087659 -1.2971
+-0.078426 0.088155 -1.3045
+-0.077346 0.088323 -1.307
+-0.076107 0.088312 -1.3068
+-0.065909 0.08783 -1.2997
+-0.044043 0.088115 -1.304
+-0.042789 0.08806 -1.3031
+-0.041468 0.087859 -1.3001
+-0.03873 0.087202 -1.2903
+-0.036298 0.087191 -1.2902
+0.004929 0.086404 -1.2784
+0.04699 0.082129 -1.2145
+0.048063 0.082008 -1.2127
+0.10518 0.078619 -1.1618
+0.10624 0.078589 -1.1614
+0.1073 0.078569 -1.1611
+0.1194 0.078613 -1.1617
+0.12052 0.078629 -1.1619
+0.21244 0.078619 -1.1614
+-0.11776 0.088825 -1.3331
+-0.11659 0.08889 -1.3341
+-0.1141 0.088904 -1.3343
+-0.11131 0.088681 -1.331
+-0.10803 0.088044 -1.3213
+-0.10645 0.087771 -1.3172
+-0.10503 0.087621 -1.3149
+-0.10237 0.087465 -1.3126
+-0.099878 0.087442 -1.3122
+-0.09734 0.08738 -1.3113
+-0.094711 0.087231 -1.309
+-0.092021 0.087017 -1.3058
+-0.089249 0.086711 -1.3012
+-0.086704 0.086614 -1.2997
+-0.084184 0.086538 -1.2986
+-0.08164 0.086432 -1.297
+-0.079199 0.086431 -1.297
+-0.077199 0.086927 -1.3045
+-0.07608 0.087051 -1.3064
+-0.074789 0.086979 -1.3053
+-0.072231 0.086856 -1.3034
+-0.067088 0.086549 -1.2988
+-0.065843 0.086519 -1.2983
+-0.064595 0.086483 -1.2978
+-0.062104 0.086416 -1.2968
+-0.059631 0.086368 -1.2961
+-0.057194 0.08637 -1.2961
+-0.047697 0.086841 -1.3033
+-0.04527 0.086889 -1.304
+-0.044042 0.086886 -1.304
+-0.042699 0.086651 -1.3004
+-0.039918 0.085932 -1.2895
+-0.03751 0.085972 -1.2901
+-0.035074 0.085953 -1.2898
+-0.032654 0.085971 -1.2901
+0.001321 0.085223 -1.2788
+0.003725 0.08517 -1.278
+0.004927 0.085169 -1.278
+0.046947 0.08091 -1.2133
+0.049092 0.08068 -1.2098
+0.05125 0.080491 -1.207
+0.063933 0.079308 -1.189
+0.068011 0.078843 -1.182
+0.08093 0.078418 -1.1755
+0.085098 0.078179 -1.1718
+0.087346 0.078215 -1.1724
+0.089642 0.078291 -1.1735
+0.091808 0.078253 -1.1729
+0.093801 0.078073 -1.1702
+0.095779 0.077889 -1.1674
+0.097855 0.077791 -1.1659
+0.099996 0.077747 -1.1652
+0.10212 0.07769 -1.1643
+0.10424 0.077637 -1.1635
+0.10529 0.077605 -1.1631
+0.12051 0.077526 -1.1618
+0.12163 0.077545 -1.1621
+0.12382 0.077541 -1.162
+0.12604 0.077561 -1.1623
+0.12822 0.077559 -1.1623
+0.19442 0.077755 -1.1649
+0.1966 0.077749 -1.1648
+0.19851 0.07764 -1.1632
+0.20025 0.077465 -1.1605
+0.20233 0.077422 -1.1599
+0.20454 0.077432 -1.16
+0.20677 0.07745 -1.1603
+0.21122 0.077474 -1.1606
+0.21244 0.07752 -1.1613
+-0.11651 0.087569 -1.3331
+-0.11532 0.087618 -1.3339
+-0.1127 0.087535 -1.3326
+-0.11003 0.087407 -1.3307
+-0.10846 0.087151 -1.3267
+-0.10678 0.0868 -1.3213
+-0.10508 0.086421 -1.3155
+-0.10371 0.086312 -1.3138
+-0.10114 0.086229 -1.3126
+-0.090771 0.085767 -1.3055
+-0.089328 0.085561 -1.3023
+-0.087939 0.085402 -1.2999
+-0.085402 0.085311 -1.2985
+-0.083028 0.085383 -1.2996
+-0.080408 0.085198 -1.2968
+-0.079188 0.085198 -1.2968
+-0.077987 0.085219 -1.2971
+-0.075927 0.085648 -1.3037
+-0.065823 0.085271 -1.2979
+-0.043992 0.085562 -1.3025
+-0.042581 0.08519 -1.2968
+-0.041172 0.0848 -1.2908
+-0.036261 0.084678 -1.2889
+0.004925 0.083925 -1.2773
+0.045828 0.079808 -1.214
+0.047987 0.079597 -1.2107
+0.096945 0.07684 -1.1682
+0.097938 0.076756 -1.1669
+0.099022 0.076744 -1.1667
+0.10112 0.076668 -1.1655
+0.10221 0.076665 -1.1655
+0.10328 0.076638 -1.1651
+0.10435 0.076619 -1.1648
+0.10541 0.076598 -1.1644
+0.21247 0.076438 -1.1615
+-0.1153 0.086352 -1.3337
+-0.11402 0.086334 -1.3335
+-0.11137 0.086219 -1.3317
+-0.10873 0.086118 -1.3301
+-0.10544 0.085479 -1.3201
+-0.10377 0.085123 -1.3146
+-0.10244 0.085044 -1.3134
+-0.099919 0.085006 -1.3128
+-0.094792 0.084839 -1.3102
+-0.092226 0.084746 -1.3087
+-0.089678 0.084665 -1.3075
+-0.086651 0.084115 -1.2989
+-0.084237 0.084146 -1.2994
+-0.083087 0.084219 -1.3006
+-0.081859 0.084215 -1.3005
+-0.079403 0.084205 -1.3003
+-0.077055 0.084314 -1.3021
+-0.075873 0.084361 -1.3028
+-0.074613 0.084322 -1.3022
+-0.069541 0.084115 -1.299
+-0.067053 0.08406 -1.2981
+-0.064566 0.084002 -1.2972
+-0.059646 0.083949 -1.2964
+-0.054896 0.084145 -1.2995
+-0.050172 0.084425 -1.3039
+-0.047785 0.084543 -1.3057
+-0.045279 0.084452 -1.3043
+-0.043866 0.084095 -1.2987
+-0.042391 0.083596 -1.2909
+-0.03992 0.083506 -1.2895
+-0.037478 0.083473 -1.289
+-0.035059 0.083489 -1.2893
+-0.030214 0.083508 -1.2896
+-0.025341 0.083441 -1.2885
+-0.020471 0.083357 -1.2872
+-0.015616 0.083304 -1.2864
+-0.010766 0.083234 -1.2853
+-0.005914 0.083033 -1.2822
+-0.001086 0.08283 -1.279
+0.001319 0.082734 -1.2775
+0.003721 0.082688 -1.2768
+0.045809 0.07863 -1.2135
+0.046888 0.078525 -1.2118
+0.049042 0.07832 -1.2086
+0.053322 0.077923 -1.2024
+0.057578 0.077556 -1.1967
+0.061817 0.077222 -1.1914
+0.06595 0.076807 -1.185
+0.07022 0.076596 -1.1817
+0.074478 0.076398 -1.1785
+0.078773 0.076257 -1.1763
+0.083113 0.076173 -1.175
+0.087273 0.075941 -1.1714
+0.091883 0.076104 -1.1739
+0.094115 0.076121 -1.1742
+0.096112 0.075951 -1.1715
+0.098129 0.075804 -1.1692
+0.10022 0.075719 -1.1679
+0.10126 0.075678 -1.1672
+0.11593 0.077392 -1.1939
+0.11705 0.077392 -1.1939
+0.12383 0.075355 -1.1621
+0.12607 0.07539 -1.1626
+0.13048 0.075404 -1.1628
+0.1349 0.075428 -1.1632
+0.13929 0.075431 -1.1632
+0.1437 0.075444 -1.1634
+0.14807 0.075436 -1.1632
+0.15248 0.075451 -1.1635
+0.15687 0.075452 -1.1635
+0.16131 0.075477 -1.1638
+0.16576 0.075508 -1.1643
+0.17022 0.075536 -1.1647
+0.17466 0.075561 -1.1651
+0.1791 0.075578 -1.1653
+0.18351 0.075588 -1.1655
+0.18794 0.075603 -1.1657
+0.1922 0.075551 -1.1648
+0.19627 0.075426 -1.1629
+0.19854 0.075455 -1.1633
+0.20048 0.075361 -1.1618
+0.20231 0.075226 -1.1597
+0.20448 0.07522 -1.1596
+0.20891 0.075243 -1.16
+0.21116 0.075267 -1.1603
+0.21372 0.075398 -1.1624
+-0.11534 0.085126 -1.3342
+-0.11268 0.085007 -1.3323
+-0.10745 0.084837 -1.3297
+-0.10564 0.084392 -1.3226
+-0.10387 0.083971 -1.316
+-0.10246 0.083824 -1.3136
+-0.10118 0.083789 -1.3131
+-0.088447 0.083434 -1.3075
+-0.087111 0.083333 -1.3059
+-0.085666 0.083123 -1.3026
+-0.083088 0.082995 -1.3006
+-0.081864 0.082995 -1.3006
+-0.08077 0.083128 -1.3027
+-0.079583 0.083169 -1.3033
+-0.078242 0.083047 -1.3014
+-0.075835 0.083093 -1.3021
+-0.046586 0.083366 -1.3065
+-0.043785 0.082719 -1.2963
+-0.04114 0.082306 -1.2898
+0.00252 0.081483 -1.2768
+0.044702 0.07755 -1.2145
+0.045795 0.077464 -1.2131
+0.047937 0.077235 -1.2095
+0.097298 0.07491 -1.1725
+0.098315 0.074844 -1.1714
+0.099275 0.074735 -1.1697
+0.10033 0.074704 -1.1692
+0.11368 0.076272 -1.194
+0.11472 0.076211 -1.193
+0.11688 0.076157 -1.1922
+0.11803 0.076172 -1.1924
+0.11919 0.076193 -1.1927
+0.12494 0.074271 -1.1623
+0.21236 0.074208 -1.1609
+0.21356 0.074245 -1.1615
+-0.11538 0.083899 -1.3347
+-0.11402 0.083823 -1.3335
+-0.11138 0.083722 -1.3318
+-0.10882 0.083679 -1.3312
+-0.10752 0.083639 -1.3305
+-0.10607 0.083484 -1.328
+-0.10411 0.082919 -1.319
+-0.10264 0.082732 -1.316
+-0.10122 0.082587 -1.3136
+-0.099954 0.082563 -1.3132
+-0.09745 0.082535 -1.3128
+-0.094846 0.082419 -1.311
+-0.092252 0.082305 -1.3091
+-0.089689 0.082213 -1.3077
+-0.087136 0.082126 -1.3063
+-0.084597 0.082047 -1.305
+-0.081996 0.081902 -1.3027
+-0.079591 0.08195 -1.3035
+-0.077061 0.081867 -1.3021
+-0.07456 0.081812 -1.3013
+-0.072039 0.081729 -1.2999
+-0.06704 0.0816 -1.2979
+-0.064557 0.081549 -1.2971
+-0.062118 0.08155 -1.2971
+-0.059742 0.081638 -1.2985
+-0.057392 0.081772 -1.3007
+-0.052657 0.08202 -1.3047
+-0.047854 0.082204 -1.3076
+-0.046593 0.082148 -1.3067
+-0.045236 0.081917 -1.303
+-0.043696 0.081332 -1.2936
+-0.042369 0.081122 -1.2903
+-0.039912 0.081062 -1.2893
+-0.037483 0.081055 -1.2892
+-0.01803 0.080851 -1.2859
+-0.015611 0.080855 -1.286
+-0.013184 0.080811 -1.2853
+-0.010751 0.080705 -1.2836
+-0.008327 0.080618 -1.2822
+-0.003494 0.080443 -1.2794
+-0.001085 0.08034 -1.2777
+0.001318 0.080283 -1.2768
+0.002519 0.080253 -1.2763
+0.044704 0.076409 -1.2145
+0.046856 0.076189 -1.211
+0.048979 0.075946 -1.2071
+0.051128 0.075762 -1.2041
+0.089563 0.073801 -1.1725
+0.091859 0.073872 -1.1736
+0.094202 0.073975 -1.1753
+0.096455 0.074005 -1.1757
+0.098655 0.073994 -1.1755
+0.10087 0.073992 -1.1755
+0.10206 0.074056 -1.1765
+0.11149 0.075183 -1.1946
+0.11258 0.07516 -1.1942
+0.1136 0.075091 -1.1931
+0.11572 0.075006 -1.1917
+0.11788 0.074956 -1.1909
+0.12019 0.074996 -1.1916
+0.12604 0.073181 -1.1624
+0.12829 0.073215 -1.1629
+0.13054 0.073247 -1.1634
+0.13274 0.073253 -1.1635
+0.19837 0.073198 -1.1623
+0.20259 0.07314 -1.1614
+0.21123 0.073102 -1.1607
+0.21356 0.073149 -1.1615
+0.21504 0.073279 -1.1636
+-0.1154 0.082656 -1.3349
+-0.11268 0.082506 -1.3324
+-0.10753 0.082401 -1.3308
+-0.1045 0.081984 -1.324
+-0.10142 0.081508 -1.3162
+-0.10001 0.081373 -1.314
+-0.098761 0.081361 -1.3138
+-0.096188 0.081276 -1.3124
+-0.063361 0.080357 -1.2976
+-0.062143 0.080361 -1.2976
+-0.060964 0.080416 -1.2985
+-0.046632 0.080986 -1.3078
+-0.043667 0.080061 -1.2928
+-0.04114 0.079878 -1.2898
+-0.016822 0.079646 -1.286
+-0.015611 0.079646 -1.286
+-0.014384 0.079546 -1.2844
+-0.011954 0.079463 -1.283
+0.000117 0.07907 -1.2766
+0.001318 0.07904 -1.2761
+0.097727 0.07302 -1.1777
+0.098976 0.073124 -1.1794
+0.10018 0.07319 -1.1805
+0.10144 0.073301 -1.1823
+0.11039 0.074073 -1.1949
+0.11258 0.074034 -1.1942
+0.11454 0.073846 -1.1912
+0.12115 0.073776 -1.19
+0.12227 0.073776 -1.19
+0.12336 0.073756 -1.1896
+0.12598 0.072051 -1.1618
+0.12716 0.072098 -1.1626
+0.1283 0.072124 -1.163
+0.12942 0.072133 -1.1631
+0.21513 0.072212 -1.1641
+-0.11678 0.081484 -1.3363
+-0.114 0.081293 -1.3331
+-0.11142 0.081246 -1.3324
+-0.10886 0.081206 -1.3317
+-0.10625 0.081125 -1.3304
+-0.10485 0.08101 -1.3285
+-0.10328 0.080755 -1.3243
+-0.10183 0.080595 -1.3216
+-0.10022 0.080302 -1.3168
+-0.09759 0.080178 -1.3147
+-0.094957 0.080044 -1.3125
+-0.092323 0.079902 -1.3102
+-0.089689 0.079752 -1.3077
+-0.08459 0.079584 -1.3049
+-0.082066 0.079517 -1.3038
+-0.079552 0.079457 -1.3028
+-0.074516 0.079315 -1.3005
+-0.069538 0.07922 -1.2989
+-0.064659 0.079231 -1.2991
+-0.062224 0.079243 -1.2993
+-0.059875 0.079369 -1.3014
+-0.057527 0.079508 -1.3037
+-0.055147 0.079614 -1.3055
+-0.052777 0.079744 -1.3077
+-0.05033 0.079766 -1.308
+-0.047879 0.079783 -1.3083
+-0.046632 0.079754 -1.3078
+-0.045192 0.079386 -1.3017
+-0.043638 0.078791 -1.2919
+-0.042355 0.078666 -1.2898
+-0.039908 0.078627 -1.2892
+-0.035047 0.078607 -1.2889
+-0.03018 0.078564 -1.2881
+-0.025317 0.078515 -1.2873
+-0.020455 0.078448 -1.2862
+-0.018032 0.078436 -1.286
+-0.015579 0.078271 -1.2833
+-0.013155 0.078218 -1.2824
+-0.010739 0.0782 -1.2821
+-0.005904 0.078069 -1.28
+-0.001084 0.077877 -1.2768
+0.001317 0.077791 -1.2754
+0.044702 0.074117 -1.2144
+0.048946 0.073621 -1.2062
+0.053229 0.073264 -1.2003
+0.057509 0.072958 -1.1952
+0.061757 0.07266 -1.1903
+0.066076 0.072479 -1.1873
+0.070355 0.07228 -1.184
+0.074581 0.072055 -1.1802
+0.078764 0.071815 -1.1762
+0.083202 0.07182 -1.1763
+0.087549 0.071751 -1.1751
+0.08965 0.071661 -1.1736
+0.09189 0.071683 -1.174
+0.094203 0.07176 -1.1753
+0.096611 0.071905 -1.1777
+0.099072 0.072081 -1.1806
+0.10163 0.07232 -1.1845
+0.10306 0.072541 -1.1882
+0.10442 0.072709 -1.1909
+0.10591 0.072965 -1.1952
+0.1071 0.073007 -1.1959
+0.10928 0.072955 -1.195
+0.11146 0.072911 -1.1943
+0.11342 0.072727 -1.1912
+0.1156 0.072687 -1.1905
+0.11768 0.072585 -1.1888
+0.11995 0.072604 -1.1892
+0.1222 0.072609 -1.1892
+0.12433 0.072543 -1.1881
+0.1294 0.071026 -1.163
+0.13052 0.07104 -1.1632
+0.13275 0.071061 -1.1635
+0.13494 0.071058 -1.1635
+0.13935 0.071074 -1.1637
+0.14374 0.071076 -1.1637
+0.14813 0.07108 -1.1638
+0.15249 0.071067 -1.1635
+0.15687 0.071064 -1.1635
+0.16134 0.071102 -1.1641
+0.16582 0.071139 -1.1647
+0.17025 0.071158 -1.165
+0.17469 0.071179 -1.1653
+0.17921 0.071227 -1.1661
+0.1836 0.071225 -1.166
+0.18803 0.071238 -1.1662
+0.19233 0.071204 -1.1656
+0.19614 0.070994 -1.1621
+0.20046 0.070972 -1.1617
+0.20473 0.070933 -1.1611
+0.20892 0.070871 -1.16
+0.21382 0.071044 -1.1629
+0.21674 0.071286 -1.1669
+-0.11955 0.080403 -1.3393
+-0.11813 0.080293 -1.3374
+-0.10498 0.079858 -1.3301
+-0.10362 0.079773 -1.3287
+-0.10228 0.079706 -1.3276
+-0.10085 0.079563 -1.3252
+-0.099301 0.079319 -1.3211
+-0.097663 0.079 -1.3157
+-0.096407 0.078985 -1.3155
+-0.093722 0.078807 -1.3125
+-0.092381 0.078718 -1.311
+-0.091119 0.078693 -1.3106
+-0.083349 0.078343 -1.3047
+-0.082066 0.078289 -1.3038
+-0.08081 0.078261 -1.3034
+-0.061128 0.078182 -1.3021
+-0.053988 0.078485 -1.3072
+-0.051578 0.078562 -1.3085
+-0.049136 0.078593 -1.309
+-0.047893 0.078574 -1.3087
+-0.045069 0.077947 -1.2982
+-0.043626 0.077555 -1.2916
+-0.041132 0.077434 -1.2895
+-0.019211 0.077102 -1.284
+-0.017987 0.077036 -1.2829
+-0.01677 0.076988 -1.282
+0.10034 0.07108 -1.1824
+0.10175 0.071284 -1.1859
+0.1033 0.071589 -1.191
+0.10484 0.071876 -1.1958
+0.10601 0.0719 -1.1962
+0.12318 0.071405 -1.1878
+0.12432 0.071422 -1.1881
+0.12937 0.069916 -1.1627
+0.13049 0.069931 -1.163
+0.13162 0.069945 -1.1632
+0.13386 0.069973 -1.1637
+0.21845 0.070381 -1.1702
+-0.12081 0.079142 -1.3392
+-0.11939 0.079032 -1.3374
+-0.11666 0.078888 -1.3349
+-0.11402 0.078802 -1.3335
+-0.10894 0.078752 -1.3326
+-0.10634 0.078685 -1.3315
+-0.10364 0.078536 -1.3289
+-0.10108 0.078491 -1.3282
+-0.09982 0.078484 -1.3281
+-0.098315 0.07828 -1.3246
+-0.095171 0.077748 -1.3155
+-0.092566 0.077639 -1.3137
+-0.089898 0.077469 -1.3108
+-0.087295 0.077348 -1.3087
+-0.084744 0.077267 -1.3073
+-0.082178 0.077167 -1.3056
+-0.079592 0.077042 -1.3035
+-0.077089 0.076992 -1.3027
+-0.074529 0.076879 -1.3007
+-0.072081 0.076879 -1.3007
+-0.069653 0.0769 -1.3011
+-0.067245 0.076946 -1.3019
+-0.064805 0.076958 -1.3021
+-0.062404 0.077018 -1.3031
+-0.061236 0.077092 -1.3044
+-0.060009 0.077092 -1.3044
+-0.057575 0.077118 -1.3049
+-0.055168 0.077186 -1.306
+-0.053959 0.077214 -1.3065
+-0.052766 0.077266 -1.3074
+-0.050378 0.077376 -1.3093
+-0.04914 0.077366 -1.3091
+-0.044964 0.076547 -1.2951
+-0.043618 0.076324 -1.2913
+-0.042344 0.076218 -1.2895
+-0.039915 0.076212 -1.2894
+-0.037483 0.076201 -1.2892
+-0.032615 0.076162 -1.2886
+-0.02773 0.076065 -1.2869
+-0.025291 0.076012 -1.286
+-0.022843 0.075921 -1.2844
+-0.020407 0.075848 -1.2832
+-0.019178 0.075765 -1.2818
+-0.017969 0.07575 -1.2815
+-0.015559 0.075758 -1.2817
+-0.013148 0.075764 -1.2818
+-0.003487 0.07548 -1.2769
+-0.001083 0.075407 -1.2757
+0.046821 0.071573 -1.2101
+0.085457 0.069635 -1.1768
+0.087678 0.069638 -1.1769
+0.089853 0.069606 -1.1763
+0.092065 0.069603 -1.1763
+0.094303 0.069619 -1.1765
+0.096685 0.069738 -1.1786
+0.099151 0.069912 -1.1815
+0.10053 0.070095 -1.1847
+0.10229 0.070542 -1.1923
+0.10378 0.070791 -1.1965
+0.10492 0.070799 -1.1967
+0.10713 0.070772 -1.1962
+0.1093 0.070718 -1.1953
+0.11144 0.070645 -1.194
+0.11349 0.070525 -1.192
+0.11561 0.070445 -1.1906
+0.1177 0.070354 -1.189
+0.12197 0.070235 -1.187
+0.12419 0.070225 -1.1868
+0.12531 0.070225 -1.1868
+0.1327 0.068843 -1.1631
+0.13494 0.068869 -1.1636
+0.13717 0.068887 -1.1639
+0.13939 0.068896 -1.164
+0.14156 0.068888 -1.1638
+0.14595 0.068888 -1.1638
+0.19831 0.068793 -1.162
+0.21136 0.068766 -1.1614
+0.21404 0.068921 -1.1641
+0.21698 0.069161 -1.1682
+0.21843 0.069272 -1.1701
+-0.1218 0.077709 -1.3363
+-0.12051 0.077685 -1.3359
+-0.11795 0.077656 -1.3353
+-0.099842 0.07725 -1.3284
+-0.098569 0.077232 -1.3281
+-0.097097 0.077055 -1.325
+-0.094025 0.076584 -1.3168
+-0.092676 0.076492 -1.3152
+-0.091362 0.076428 -1.3141
+-0.090068 0.076379 -1.3133
+-0.088694 0.07626 -1.3112
+-0.086183 0.076221 -1.3105
+-0.078421 0.075868 -1.3044
+-0.075929 0.075831 -1.3038
+-0.074628 0.075755 -1.3025
+-0.073374 0.075726 -1.302
+-0.070923 0.075724 -1.3019
+-0.063644 0.075808 -1.3034
+-0.06245 0.075847 -1.3041
+-0.061237 0.075865 -1.3044
+-0.060009 0.075863 -1.3044
+-0.058775 0.075854 -1.3042
+-0.057523 0.075822 -1.3037
+-0.056295 0.075819 -1.3036
+-0.054971 0.075685 -1.3013
+-0.046202 0.07536 -1.2957
+-0.043593 0.075066 -1.2906
+-0.041131 0.075003 -1.2895
+-0.019175 0.074544 -1.2815
+-0.01676 0.074531 -1.2813
+-0.002284 0.07421 -1.2757
+-0.001083 0.074175 -1.2751
+0.095652 0.068683 -1.1795
+0.096808 0.068715 -1.1801
+0.098043 0.068802 -1.1816
+0.099472 0.069021 -1.1854
+0.10138 0.069564 -1.1948
+0.1027 0.069699 -1.1972
+0.10383 0.069699 -1.1972
+0.10601 0.069648 -1.1963
+0.12522 0.069059 -1.186
+0.12634 0.069059 -1.186
+0.12743 0.069048 -1.1858
+0.12854 0.069046 -1.1857
+0.13048 0.068889 -1.183
+0.13385 0.067774 -1.1636
+0.13605 0.067776 -1.1636
+0.13828 0.067796 -1.164
+0.21268 0.067742 -1.1627
+0.21845 0.068172 -1.1701
+-0.11899 0.076257 -1.3328
+-0.11658 0.076326 -1.3341
+-0.11402 0.076289 -1.3334
+-0.11147 0.07626 -1.3329
+-0.10892 0.07623 -1.3324
+-0.10624 0.07611 -1.3303
+-0.10358 0.075994 -1.3282
+-0.10104 0.075964 -1.3277
+-0.098589 0.075997 -1.3283
+-0.095996 0.075923 -1.327
+-0.092995 0.075513 -1.3198
+-0.091644 0.075423 -1.3182
+-0.087531 0.075086 -1.3123
+-0.086296 0.075086 -1.3123
+-0.085062 0.075086 -1.3123
+-0.082492 0.074994 -1.3107
+-0.079888 0.074865 -1.3084
+-0.077359 0.0748 -1.3073
+-0.074831 0.074732 -1.3061
+-0.07226 0.074615 -1.304
+-0.069827 0.074636 -1.3044
+-0.067316 0.074574 -1.3033
+-0.064864 0.074574 -1.3033
+-0.062417 0.07458 -1.3034
+-0.059774 0.074343 -1.2992
+-0.058518 0.0743 -1.2985
+-0.054703 0.074097 -1.2949
+-0.046141 0.074042 -1.294
+-0.044828 0.073885 -1.2912
+-0.042351 0.073802 -1.2897
+-0.039912 0.07378 -1.2893
+-0.035044 0.073747 -1.2888
+-0.032599 0.073701 -1.2879
+-0.030131 0.073591 -1.286
+-0.025223 0.073395 -1.2826
+-0.020377 0.073325 -1.2813
+-0.017958 0.073291 -1.2807
+-0.015546 0.073283 -1.2806
+-0.010712 0.073185 -1.2789
+-0.005891 0.073085 -1.2771
+-0.003484 0.073012 -1.2758
+-0.002283 0.072973 -1.2751
+0.04474 0.069599 -1.2155
+0.046823 0.069295 -1.2101
+0.048901 0.069012 -1.2051
+0.053204 0.068708 -1.1998
+0.057514 0.068459 -1.1954
+0.061837 0.068261 -1.1918
+0.066192 0.068123 -1.1894
+0.070505 0.067962 -1.1865
+0.074731 0.067741 -1.1826
+0.07882 0.067428 -1.1771
+0.08316 0.067351 -1.1757
+0.087752 0.067477 -1.1779
+0.090074 0.067554 -1.1793
+0.092378 0.067614 -1.1803
+0.094707 0.06769 -1.1817
+0.097153 0.067843 -1.1844
+0.098607 0.068077 -1.1885
+0.10026 0.06844 -1.1949
+0.10278 0.068618 -1.198
+0.10492 0.068545 -1.1967
+0.10706 0.068475 -1.1955
+0.10934 0.06849 -1.1957
+0.1115 0.068435 -1.1948
+0.11568 0.068246 -1.1914
+0.11986 0.068069 -1.1883
+0.1241 0.067938 -1.1859
+0.12626 0.067901 -1.1852
+0.12849 0.0679 -1.1852
+0.12961 0.067898 -1.1852
+0.13065 0.06786 -1.1845
+0.1328 0.066698 -1.164
+0.13386 0.066681 -1.1637
+0.13492 0.066664 -1.1634
+0.13605 0.066679 -1.1636
+0.13715 0.06668 -1.1636
+0.13939 0.066702 -1.164
+0.14157 0.066699 -1.164
+0.14377 0.066703 -1.164
+0.14598 0.066707 -1.1641
+0.14821 0.066723 -1.1643
+0.1526 0.066726 -1.1644
+0.15701 0.066735 -1.1645
+0.16145 0.066756 -1.1649
+0.16586 0.066763 -1.165
+0.17029 0.066778 -1.1652
+0.17478 0.066815 -1.1658
+0.17919 0.066824 -1.166
+0.18361 0.066832 -1.1661
+0.18805 0.066849 -1.1664
+0.19216 0.066747 -1.1646
+0.19641 0.066702 -1.1637
+0.19834 0.066611 -1.1621
+0.20046 0.066589 -1.1617
+0.20491 0.066612 -1.1621
+0.20937 0.066637 -1.1625
+0.21156 0.066637 -1.1625
+0.2127 0.06665 -1.1628
+0.21403 0.066723 -1.1641
+0.21708 0.066988 -1.1687
+0.21827 0.067014 -1.1692
+-0.11756 0.074892 -1.3309
+-0.11633 0.074908 -1.3312
+-0.1151 0.074918 -1.3313
+-0.11391 0.07496 -1.3321
+-0.11265 0.07496 -1.3321
+-0.1114 0.07496 -1.3321
+-0.11004 0.074889 -1.3308
+-0.10875 0.074861 -1.3303
+-0.10745 0.074827 -1.3297
+-0.10616 0.074797 -1.3292
+-0.10487 0.07477 -1.3287
+-0.10226 0.074694 -1.3274
+-0.094821 0.074732 -1.3281
+-0.092184 0.07462 -1.3261
+-0.090901 0.07459 -1.3255
+-0.089516 0.074475 -1.3235
+-0.085256 0.074019 -1.3153
+-0.083942 0.073952 -1.3141
+-0.082556 0.073818 -1.3117
+-0.081322 0.073818 -1.3117
+-0.071197 0.073556 -1.307
+-0.069903 0.073489 -1.3058
+-0.068599 0.073407 -1.3044
+-0.067318 0.073349 -1.3033
+-0.065991 0.073238 -1.3013
+-0.064766 0.073236 -1.3013
+-0.063471 0.073154 -1.2998
+-0.060809 0.072896 -1.2952
+-0.059479 0.07276 -1.2928
+-0.058263 0.072759 -1.2928
+-0.057046 0.072758 -1.2928
+-0.055765 0.072674 -1.2913
+-0.054547 0.07267 -1.2912
+-0.053335 0.072674 -1.2913
+-0.046043 0.072669 -1.2912
+-0.004685 0.071822 -1.276
+-0.003483 0.071775 -1.2752
+0.045811 0.068345 -1.2136
+0.047847 0.067992 -1.2072
+0.098948 0.067189 -1.1926
+0.1016 0.067457 -1.1974
+0.12954 0.066746 -1.1846
+0.13175 0.066735 -1.1844
+0.1328 0.066705 -1.1838
+0.13381 0.066652 -1.1829
+0.13509 0.065647 -1.1648
+0.14048 0.065602 -1.164
+0.14157 0.065602 -1.164
+0.14266 0.065598 -1.1639
+0.14488 0.065611 -1.1641
+0.1471 0.065623 -1.1643
+0.2129 0.065614 -1.1639
+0.21552 0.065745 -1.1662
+0.21685 0.065816 -1.1675
+-0.11489 0.07353 -1.3289
+-0.11363 0.07353 -1.3289
+-0.11115 0.073541 -1.3291
+-0.10483 0.073492 -1.3282
+-0.10359 0.073496 -1.3283
+-0.10102 0.073444 -1.3274
+-0.098528 0.073451 -1.3275
+-0.096093 0.073499 -1.3284
+-0.093808 0.073667 -1.3315
+-0.091309 0.073672 -1.3316
+-0.088793 0.073663 -1.3314
+-0.087248 0.073416 -1.3269
+-0.085801 0.073246 -1.3238
+-0.083139 0.073096 -1.3211
+-0.080172 0.072659 -1.3131
+-0.077678 0.072637 -1.3127
+-0.075214 0.072643 -1.3128
+-0.072587 0.072486 -1.31
+-0.071212 0.07234 -1.3073
+-0.067056 0.071841 -1.2982
+-0.065643 0.071632 -1.2944
+-0.064321 0.071517 -1.2923
+-0.061886 0.071512 -1.2922
+-0.05943 0.071484 -1.2917
+-0.056972 0.071449 -1.2911
+-0.05452 0.071418 -1.2905
+-0.052107 0.07144 -1.2909
+-0.050892 0.07144 -1.2909
+-0.049606 0.071337 -1.2891
+-0.04723 0.071412 -1.2904
+-0.044812 0.071428 -1.2907
+-0.042351 0.071374 -1.2897
+-0.037473 0.071327 -1.2889
+-0.035025 0.07128 -1.288
+-0.032532 0.071129 -1.2853
+-0.030066 0.071018 -1.2832
+-0.027629 0.07096 -1.2822
+-0.017934 0.070785 -1.279
+-0.00829 0.070647 -1.2765
+-0.005885 0.07061 -1.2758
+-0.00348 0.070529 -1.2744
+0.045812 0.067203 -1.2136
+0.046831 0.067027 -1.2104
+0.048918 0.066764 -1.2056
+0.051057 0.066593 -1.2024
+0.080953 0.065141 -1.1758
+0.083171 0.065144 -1.1759
+0.085471 0.065209 -1.1771
+0.08784 0.065321 -1.1791
+0.090241 0.065452 -1.1815
+0.092633 0.06557 -1.1836
+0.095104 0.065737 -1.1867
+0.097795 0.066045 -1.1923
+0.1004 0.066282 -1.1966
+0.10273 0.06633 -1.1975
+0.10484 0.066239 -1.1958
+0.107 0.066183 -1.1948
+0.10938 0.066258 -1.1961
+0.1116 0.066242 -1.1958
+0.11366 0.066127 -1.1937
+0.12626 0.065666 -1.1852
+0.12842 0.065631 -1.1846
+0.1306 0.065601 -1.184
+0.1328 0.065586 -1.1838
+0.13388 0.065572 -1.1835
+0.14264 0.064492 -1.1637
+0.14375 0.064497 -1.1638
+0.14488 0.064514 -1.1641
+0.14599 0.064519 -1.1642
+0.14821 0.064531 -1.1644
+0.15043 0.064541 -1.1646
+0.15265 0.06455 -1.1647
+0.15485 0.064553 -1.1648
+0.15926 0.064562 -1.1649
+0.16365 0.064563 -1.1649
+0.17256 0.064611 -1.1658
+0.17697 0.064617 -1.1659
+0.17917 0.064615 -1.1658
+0.18143 0.064638 -1.1662
+0.18368 0.064657 -1.1666
+0.18592 0.064672 -1.1668
+0.18809 0.064663 -1.1667
+0.19022 0.064639 -1.1662
+0.19213 0.064541 -1.1644
+0.19418 0.064493 -1.1635
+0.19871 0.064541 -1.1644
+0.20062 0.064448 -1.1627
+0.20266 0.064401 -1.1618
+0.20492 0.064423 -1.1622
+0.20737 0.064504 -1.1636
+0.20983 0.064584 -1.1651
+0.21198 0.064572 -1.1649
+0.21424 0.06459 -1.1652
+0.21677 0.06469 -1.167
+-0.10482 0.072235 -1.3281
+-0.10231 0.072229 -1.328
+-0.099727 0.072166 -1.3268
+-0.097287 0.072207 -1.3276
+-0.090049 0.072412 -1.3315
+-0.088791 0.072407 -1.3314
+-0.087538 0.072407 -1.3314
+-0.086335 0.072448 -1.3321
+-0.08518 0.072532 -1.3337
+-0.083691 0.072329 -1.3299
+-0.082353 0.072253 -1.3285
+-0.080733 0.071923 -1.3224
+-0.079263 0.071718 -1.3186
+-0.076665 0.071609 -1.3166
+-0.073986 0.071413 -1.313
+-0.072673 0.071337 -1.3115
+-0.071268 0.071167 -1.3084
+-0.066762 0.07031 -1.2925
+-0.065512 0.070273 -1.2918
+-0.050892 0.070224 -1.2909
+-0.049606 0.070123 -1.289
+-0.048311 0.070004 -1.2868
+-0.04723 0.070196 -1.2904
+-0.046042 0.070237 -1.2912
+0.045813 0.066062 -1.2136
+0.047858 0.065732 -1.2075
+0.08435 0.06409 -1.1769
+0.085483 0.064108 -1.1772
+0.086667 0.064164 -1.1783
+0.1082 0.065099 -1.1955
+0.10939 0.06514 -1.1963
+0.11052 0.065141 -1.1963
+0.13388 0.064457 -1.1835
+0.13499 0.064453 -1.1834
+0.1361 0.064451 -1.1834
+0.13719 0.064439 -1.1832
+0.14595 0.063403 -1.1639
+0.14705 0.063403 -1.1639
+0.14817 0.063416 -1.1641
+0.1493 0.06343 -1.1644
+0.15151 0.063436 -1.1645
+0.18036 0.063549 -1.1664
+0.18258 0.063556 -1.1665
+0.18912 0.063537 -1.1662
+0.19022 0.063538 -1.1662
+0.19118 0.063492 -1.1653
+0.21327 0.063531 -1.1659
+0.21553 0.063548 -1.1663
+-0.10481 0.070977 -1.328
+-0.10359 0.070999 -1.3284
+-0.10107 0.070984 -1.3281
+-0.098524 0.070949 -1.3275
+-0.096082 0.07099 -1.3282
+-0.093865 0.071204 -1.3323
+-0.091285 0.071146 -1.3312
+-0.088667 0.071055 -1.3295
+-0.087431 0.071067 -1.3297
+-0.086357 0.071212 -1.3325
+-0.085177 0.071274 -1.3337
+-0.083859 0.07122 -1.3326
+-0.081101 0.071 -1.3285
+-0.079487 0.070676 -1.3224
+-0.078059 0.07051 -1.3192
+-0.07542 0.070363 -1.3165
+-0.067918 0.069031 -1.2913
+-0.066762 0.069092 -1.2925
+-0.064342 0.069105 -1.2927
+-0.059414 0.069033 -1.2914
+-0.056952 0.068993 -1.2906
+-0.05449 0.06895 -1.2898
+-0.052072 0.068963 -1.2901
+-0.049677 0.069008 -1.2909
+-0.048526 0.069098 -1.2926
+-0.047285 0.069062 -1.2919
+-0.044825 0.069017 -1.2911
+-0.039912 0.068924 -1.2893
+-0.034917 0.068643 -1.284
+-0.030025 0.068508 -1.2815
+-0.025156 0.06838 -1.2791
+-0.020324 0.06832 -1.278
+-0.015499 0.068253 -1.2767
+-0.010687 0.068208 -1.2758
+-0.00828 0.068156 -1.2749
+-0.005876 0.068103 -1.2739
+0.045796 0.064894 -1.2132
+0.046817 0.064727 -1.21
+0.048931 0.064509 -1.2059
+0.053252 0.064243 -1.2009
+0.057576 0.064023 -1.1967
+0.061939 0.063874 -1.1939
+0.066305 0.063749 -1.1915
+0.070625 0.063597 -1.1886
+0.074902 0.063428 -1.1854
+0.07907 0.06319 -1.1809
+0.083268 0.063001 -1.1773
+0.085556 0.063052 -1.1782
+0.087929 0.063163 -1.1803
+0.092714 0.063394 -1.1847
+0.095259 0.063603 -1.1886
+0.097858 0.063839 -1.1931
+0.1005 0.064092 -1.1978
+0.1027 0.064055 -1.1971
+0.10477 0.063945 -1.195
+0.10699 0.063926 -1.1947
+0.10937 0.063999 -1.1961
+0.11159 0.063983 -1.1957
+0.11577 0.063802 -1.1923
+0.11996 0.063643 -1.1893
+0.12417 0.063504 -1.1866
+0.12842 0.063396 -1.1846
+0.13272 0.063317 -1.183
+0.13494 0.063315 -1.183
+0.1372 0.063326 -1.1832
+0.13831 0.063328 -1.1832
+0.13943 0.063328 -1.1832
+0.14928 0.062322 -1.1642
+0.15039 0.062328 -1.1643
+0.15259 0.062331 -1.1643
+0.15484 0.062353 -1.1647
+0.15704 0.062357 -1.1648
+0.15925 0.062361 -1.1649
+0.16149 0.06238 -1.1652
+0.16372 0.062392 -1.1654
+0.16593 0.062396 -1.1655
+0.1704 0.062424 -1.166
+0.17259 0.062423 -1.166
+0.17482 0.062435 -1.1662
+0.17702 0.062435 -1.1662
+0.17926 0.062448 -1.1664
+0.18035 0.062448 -1.1664
+0.18147 0.062452 -1.1665
+0.18368 0.062457 -1.1666
+0.18805 0.062448 -1.1664
+0.1902 0.062432 -1.1661
+0.19121 0.062405 -1.1655
+0.19207 0.062325 -1.164
+0.19417 0.062297 -1.1635
+0.1964 0.062309 -1.1637
+0.19878 0.062366 -1.1648
+0.20115 0.062421 -1.1658
+0.20289 0.062281 -1.1632
+0.20498 0.062251 -1.1626
+0.20749 0.062344 -1.1643
+0.21015 0.062483 -1.1669
+0.21246 0.062515 -1.1675
+0.21346 0.062486 -1.167
+0.21447 0.062461 -1.1665
+0.21554 0.062451 -1.1663
+-0.10481 0.069726 -1.328
+-0.10233 0.06974 -1.3282
+-0.097226 0.069664 -1.3268
+-0.0851 0.069956 -1.3324
+-0.083847 0.069955 -1.3324
+-0.082467 0.069848 -1.3304
+-0.06924 0.067921 -1.2933
+-0.068023 0.067921 -1.2933
+-0.066834 0.067948 -1.2939
+-0.065604 0.067936 -1.2936
+-0.055694 0.067725 -1.2896
+-0.053228 0.067675 -1.2886
+-0.050873 0.067768 -1.2904
+-0.048527 0.067883 -1.2927
+-0.046069 0.067845 -1.2919
+-0.009475 0.066924 -1.2743
+-0.008274 0.066909 -1.274
+-0.007075 0.066903 -1.2739
+0.045781 0.063729 -1.2127
+0.047859 0.063457 -1.2075
+0.084512 0.06199 -1.1792
+0.085624 0.061991 -1.1792
+0.08682 0.062052 -1.1804
+0.096555 0.062598 -1.1908
+0.097861 0.062716 -1.1931
+0.099301 0.062917 -1.197
+0.10167 0.062986 -1.1983
+0.10369 0.062845 -1.1956
+0.10585 0.062789 -1.1945
+0.1383 0.062204 -1.1831
+0.13943 0.062215 -1.1833
+0.1493 0.061233 -1.1643
+0.1504 0.061234 -1.1643
+0.15146 0.061219 -1.164
+0.1526 0.061236 -1.1644
+0.15366 0.061223 -1.1641
+0.15481 0.061241 -1.1645
+0.15592 0.061246 -1.1646
+0.15813 0.061253 -1.1647
+0.16034 0.061261 -1.1648
+0.16259 0.061279 -1.1652
+0.1648 0.061286 -1.1653
+0.17369 0.061322 -1.1659
+0.17481 0.06133 -1.1661
+0.17592 0.061335 -1.1662
+0.177 0.061329 -1.1661
+0.1781 0.06133 -1.1661
+0.17922 0.061336 -1.1662
+0.18959 0.061493 -1.1691
+0.1907 0.061493 -1.1691
+0.19158 0.061422 -1.1678
+0.19232 0.061309 -1.1656
+0.19317 0.061231 -1.1641
+0.19531 0.061212 -1.1637
+0.20257 0.06142 -1.1677
+0.20408 0.061211 -1.1637
+0.21138 0.061422 -1.1677
+0.21251 0.061428 -1.1678
+-0.10356 0.068476 -1.328
+-0.10107 0.068485 -1.3281
+-0.098456 0.068403 -1.3265
+-0.097144 0.068357 -1.3257
+-0.069248 0.066711 -1.2935
+-0.066823 0.06672 -1.2937
+-0.064339 0.066669 -1.2927
+-0.061869 0.066627 -1.2919
+-0.05693 0.066537 -1.2901
+-0.055692 0.066508 -1.2896
+-0.054479 0.066508 -1.2896
+-0.053228 0.066461 -1.2886
+-0.052055 0.066513 -1.2896
+-0.049695 0.066601 -1.2914
+-0.047301 0.066653 -1.2924
+-0.044819 0.066577 -1.2909
+-0.042346 0.066508 -1.2896
+-0.013076 0.065746 -1.2747
+-0.01067 0.0657 -1.2738
+0.045773 0.062577 -1.2126
+0.046806 0.062431 -1.2097
+0.048941 0.06225 -1.2061
+0.0511 0.062113 -1.2035
+0.081405 0.061048 -1.1825
+0.083631 0.061047 -1.1825
+0.085845 0.061037 -1.1823
+0.088069 0.061035 -1.1822
+0.090419 0.061118 -1.1839
+0.09278 0.061205 -1.1855
+0.095381 0.061442 -1.1902
+0.098183 0.061794 -1.1971
+0.099583 0.061964 -1.2004
+0.10065 0.061927 -1.1997
+0.10271 0.061803 -1.1972
+0.10364 0.061686 -1.1949
+0.10473 0.06167 -1.1946
+0.10699 0.061673 -1.1947
+0.10931 0.061712 -1.1954
+0.13494 0.061081 -1.1829
+0.13715 0.061075 -1.1828
+0.13939 0.06108 -1.1829
+0.14052 0.061086 -1.183
+0.1417 0.061114 -1.1835
+0.14283 0.061123 -1.1837
+0.15071 0.060261 -1.1668
+0.15167 0.060205 -1.1657
+0.15701 0.060148 -1.1645
+0.15811 0.060147 -1.1645
+0.15921 0.060147 -1.1645
+0.16032 0.060155 -1.1647
+0.16142 0.060155 -1.1647
+0.16255 0.060168 -1.1649
+0.16363 0.060159 -1.1647
+0.16583 0.060164 -1.1648
+0.16813 0.060198 -1.1655
+0.17029 0.060185 -1.1652
+0.17253 0.060202 -1.1655
+0.18978 0.060801 -1.1772
+0.19202 0.060811 -1.1774
+0.19288 0.060384 -1.169
+0.19341 0.060205 -1.1655
+0.19432 0.060148 -1.1644
+0.19533 0.060123 -1.1639
+0.19649 0.060141 -1.1642
+0.19884 0.060187 -1.1651
+0.20148 0.060321 -1.1677
+0.20369 0.060322 -1.1677
+0.20546 0.060196 -1.1653
+0.20781 0.060242 -1.1662
+0.21029 0.060323 -1.1677
+-0.10351 0.067192 -1.3273
+-0.10226 0.067192 -1.3273
+-0.099691 0.067145 -1.3264
+-0.098377 0.0671 -1.3255
+-0.07168 0.065491 -1.2934
+-0.070463 0.065491 -1.2934
+-0.055736 0.065346 -1.2906
+-0.053273 0.065303 -1.2897
+-0.050884 0.065352 -1.2907
+-0.011871 0.064514 -1.274
+-0.010672 0.064514 -1.274
+0.045784 0.061449 -1.2128
+0.04788 0.061208 -1.208
+0.089306 0.060004 -1.1839
+0.091629 0.060065 -1.1851
+0.092813 0.060109 -1.186
+0.094263 0.060322 -1.1902
+0.097143 0.060721 -1.1982
+0.098589 0.060917 -1.2021
+0.099602 0.060845 -1.2006
+0.10169 0.060744 -1.1986
+0.10365 0.060567 -1.1951
+0.10585 0.060538 -1.1945
+0.14046 0.059946 -1.1825
+0.14275 0.05997 -1.183
+0.14388 0.059978 -1.1831
+0.14509 0.060019 -1.1839
+0.14627 0.060046 -1.1845
+0.15082 0.060079 -1.1851
+0.15191 0.060071 -1.185
+0.1526 0.059904 -1.1816
+0.15704 0.059061 -1.1648
+0.16143 0.05906 -1.1647
+0.1911 0.060108 -1.1855
+0.19187 0.060001 -1.1834
+0.19314 0.059703 -1.1774
+0.19433 0.059389 -1.1711
+0.19463 0.059145 -1.1663
+0.19551 0.059079 -1.1649
+0.20281 0.059287 -1.1691
+0.20394 0.059295 -1.1692
+0.20477 0.059216 -1.1676
+0.20672 0.059145 -1.1662
+0.20797 0.059188 -1.1671
+0.20914 0.059208 -1.1675
+-0.10214 0.065869 -1.3258
+-0.10088 0.065856 -1.3255
+-0.071688 0.064281 -1.2936
+-0.06923 0.064258 -1.2932
+-0.064299 0.064194 -1.2919
+-0.061861 0.064187 -1.2917
+-0.059423 0.064179 -1.2916
+-0.056984 0.064169 -1.2914
+-0.054525 0.064135 -1.2907
+-0.052088 0.064125 -1.2905
+-0.049682 0.064153 -1.2911
+-0.044747 0.064044 -1.2888
+-0.04224 0.06392 -1.2863
+-0.039743 0.063797 -1.2838
+-0.034845 0.063675 -1.2814
+-0.029944 0.063508 -1.278
+-0.025098 0.063417 -1.2761
+-0.020269 0.063337 -1.2745
+-0.015471 0.063332 -1.2744
+-0.013069 0.063314 -1.274
+-0.010729 0.063653 -1.2809
+0.044754 0.060457 -1.2159
+0.046829 0.060182 -1.2103
+0.048979 0.060024 -1.2071
+0.053303 0.059775 -1.202
+0.057696 0.059636 -1.1992
+0.06208 0.059509 -1.1966
+0.066432 0.059371 -1.1938
+0.070773 0.059241 -1.1911
+0.075102 0.059117 -1.1886
+0.07957 0.05911 -1.1884
+0.084068 0.059125 -1.1887
+0.086248 0.059085 -1.1879
+0.088392 0.059022 -1.1866
+0.089442 0.058978 -1.1857
+0.090522 0.058954 -1.1852
+0.091699 0.058993 -1.186
+0.094815 0.059547 -1.1973
+0.097563 0.05985 -1.2034
+0.098679 0.059839 -1.2032
+0.1007 0.059695 -1.2002
+0.10269 0.059537 -1.197
+0.10478 0.059443 -1.1951
+0.10704 0.059448 -1.1952
+0.1093 0.059452 -1.1953
+0.11135 0.059346 -1.1931
+0.11553 0.059186 -1.1898
+0.11987 0.059113 -1.1883
+0.1241 0.059 -1.186
+0.12837 0.058907 -1.1841
+0.13269 0.058843 -1.1828
+0.13708 0.058815 -1.1822
+0.13931 0.058815 -1.1822
+0.14154 0.058817 -1.1822
+0.14381 0.058836 -1.1826
+0.14616 0.058885 -1.1836
+0.1473 0.058893 -1.1838
+0.14852 0.058935 -1.1846
+0.14971 0.058964 -1.1852
+0.15082 0.058964 -1.1852
+0.15311 0.058986 -1.1856
+0.19176 0.059194 -1.1897
+0.19304 0.0589 -1.1837
+0.19448 0.058662 -1.1788
+0.19517 0.058206 -1.1695
+0.19686 0.058054 -1.1664
+0.19909 0.058064 -1.1666
+0.20156 0.058142 -1.1682
+0.20397 0.058199 -1.1694
+0.20593 0.058131 -1.168
+0.20695 0.058109 -1.1675
+-0.0606 0.062923 -1.2907
+-0.059419 0.062959 -1.2915
+-0.058204 0.062959 -1.2915
+-0.055758 0.06294 -1.2911
+-0.043467 0.062733 -1.2868
+-0.042201 0.062651 -1.2851
+-0.040933 0.06256 -1.2833
+-0.01427 0.06212 -1.2742
+-0.011934 0.062446 -1.2809
+0.087452 0.058022 -1.1891
+0.08851 0.057982 -1.1882
+0.094239 0.058763 -1.2044
+0.096619 0.058831 -1.2058
+0.097632 0.058757 -1.2043
+0.14712 0.057708 -1.1823
+0.14951 0.05777 -1.1836
+0.15192 0.05784 -1.185
+0.15312 0.05787 -1.1856
+0.16475 0.058034 -1.189
+0.18945 0.058748 -1.2037
+0.19059 0.058748 -1.2037
+0.19157 0.058702 -1.2027
+0.19224 0.05856 -1.1998
+0.19317 0.058159 -1.1914
+0.19345 0.057906 -1.1862
+0.19416 0.057787 -1.1837
+0.19583 0.057621 -1.1803
+0.19628 0.057105 -1.1696
+0.19717 0.057044 -1.1683
+0.19822 0.05703 -1.168
+0.19927 0.057016 -1.1677
+0.20043 0.057032 -1.168
+0.20286 0.057097 -1.1694
+0.20408 0.057128 -1.17
+0.20518 0.057128 -1.17
+0.20618 0.0571 -1.1694
+-0.074246 0.061948 -1.2958
+-0.071676 0.061834 -1.2934
+-0.069151 0.061753 -1.2917
+-0.066674 0.06171 -1.2908
+-0.061749 0.061643 -1.2894
+-0.059272 0.06159 -1.2883
+-0.056919 0.061666 -1.2899
+-0.054529 0.061709 -1.2908
+-0.052096 0.061703 -1.2907
+-0.047146 0.061583 -1.2881
+-0.044698 0.061549 -1.2874
+-0.0422 0.061439 -1.2851
+-0.040931 0.06135 -1.2832
+-0.039719 0.061342 -1.283
+-0.037269 0.061283 -1.2818
+-0.02266 0.060915 -1.274
+-0.020256 0.060897 -1.2737
+-0.017863 0.060909 -1.2739
+-0.015472 0.060934 -1.2745
+-0.013192 0.061488 -1.2862
+-0.010795 0.061619 -1.2889
+-0.008394 0.061796 -1.2927
+-0.007186 0.061867 -1.2942
+0.044769 0.058185 -1.2163
+0.046877 0.05796 -1.2116
+0.049012 0.057788 -1.2079
+0.051188 0.057678 -1.2056
+0.064323 0.057245 -1.1964
+0.077574 0.057048 -1.1922
+0.079843 0.057065 -1.1926
+0.082062 0.057047 -1.1922
+0.0843 0.057041 -1.192
+0.086508 0.057017 -1.1915
+0.088789 0.057041 -1.192
+0.094523 0.057801 -1.2081
+0.095526 0.05772 -1.2063
+0.09664 0.057707 -1.2061
+0.097704 0.057665 -1.2052
+0.098658 0.057559 -1.2029
+0.10066 0.057406 -1.1997
+0.1048 0.057203 -1.1954
+0.10933 0.057217 -1.1957
+0.13913 0.056515 -1.1807
+0.14355 0.056505 -1.1805
+0.14585 0.056532 -1.181
+0.14814 0.056558 -1.1816
+0.15049 0.056604 -1.1825
+0.15291 0.056674 -1.184
+0.15405 0.056685 -1.1842
+0.15527 0.056722 -1.185
+0.15768 0.056787 -1.1864
+0.15891 0.056828 -1.1872
+0.16391 0.057009 -1.191
+0.16517 0.057056 -1.192
+0.18254 0.057579 -1.203
+0.18492 0.057612 -1.2037
+0.18703 0.057566 -1.2027
+0.18812 0.057552 -1.2024
+0.18933 0.057576 -1.2029
+0.19168 0.057601 -1.2034
+0.19353 0.057476 -1.2007
+0.19464 0.05714 -1.1936
+0.19577 0.057139 -1.1936
+0.19612 0.056915 -1.1889
+0.19678 0.056782 -1.1861
+0.19695 0.05651 -1.1803
+0.19704 0.056219 -1.1742
+0.20177 0.055996 -1.1694
+-0.074217 0.060704 -1.2953
+-0.072905 0.060627 -1.2936
+-0.070373 0.060543 -1.2918
+-0.058059 0.060376 -1.2882
+-0.05686 0.06039 -1.2885
+-0.055707 0.060454 -1.2899
+-0.040961 0.060185 -1.2842
+-0.019054 0.059687 -1.2734
+-0.017863 0.059709 -1.2739
+-0.016669 0.059726 -1.2743
+-0.00718 0.060598 -1.2931
+0.044788 0.057064 -1.2169
+0.045842 0.05695 -1.2144
+0.047953 0.056742 -1.2099
+0.081091 0.056028 -1.1944
+0.082223 0.056033 -1.1945
+0.083338 0.056026 -1.1944
+0.094617 0.056719 -1.2093
+0.095629 0.056644 -1.2077
+0.097606 0.056473 -1.204
+0.14458 0.055359 -1.1797
+0.14569 0.055359 -1.1797
+0.14679 0.055356 -1.1797
+0.1491 0.055387 -1.1803
+0.15392 0.05552 -1.1832
+0.1588 0.055671 -1.1864
+0.16011 0.055737 -1.1878
+0.16136 0.055782 -1.1888
+0.16263 0.055832 -1.1899
+0.16391 0.055887 -1.191
+0.16644 0.055984 -1.1931
+0.16764 0.056009 -1.1936
+0.16886 0.056042 -1.1944
+0.17019 0.056107 -1.1958
+0.17167 0.056225 -1.1983
+0.17317 0.056346 -1.2009
+0.1745 0.056409 -1.2022
+0.17563 0.056409 -1.2022
+0.17671 0.056391 -1.2018
+0.17773 0.056355 -1.2011
+0.17876 0.056325 -1.2004
+0.1799 0.056326 -1.2004
+0.18106 0.056335 -1.2006
+0.1836 0.056423 -1.2025
+0.18806 0.056401 -1.202
+0.19275 0.056446 -1.203
+0.19386 0.056441 -1.2028
+0.19491 0.056417 -1.2023
+0.19558 0.056284 -1.1994
+0.1963 0.056168 -1.1969
+0.19701 0.056048 -1.1944
+0.19762 0.055901 -1.1912
+-0.075508 0.059542 -1.2965
+-0.074188 0.059462 -1.2948
+-0.071614 0.059348 -1.2923
+-0.069112 0.059287 -1.2909
+-0.064172 0.059212 -1.2893
+-0.059286 0.059178 -1.2886
+-0.056871 0.059188 -1.2888
+-0.05452 0.059269 -1.2906
+-0.049633 0.059232 -1.2898
+-0.044704 0.059133 -1.2876
+-0.042229 0.05906 -1.286
+-0.039731 0.058944 -1.2835
+-0.037259 0.058854 -1.2815
+-0.034801 0.058776 -1.2798
+-0.0299 0.05861 -1.2761
+-0.025057 0.058515 -1.274
+-0.022647 0.058483 -1.2733
+-0.020251 0.058483 -1.2733
+-0.019127 0.058711 -1.2784
+-0.017947 0.058784 -1.28
+-0.016806 0.059009 -1.2849
+-0.015604 0.059033 -1.2854
+-0.010785 0.059137 -1.2877
+-0.00838 0.059261 -1.2905
+-0.007175 0.05934 -1.2922
+0.045859 0.055827 -1.2149
+0.04692 0.055729 -1.2127
+0.049063 0.05557 -1.2092
+0.053454 0.055401 -1.2055
+0.057862 0.055275 -1.2027
+0.062222 0.055125 -1.1994
+0.064392 0.055049 -1.1977
+0.066574 0.054989 -1.1964
+0.070998 0.054925 -1.195
+0.075518 0.054939 -1.1953
+0.080121 0.055009 -1.1968
+0.081255 0.055013 -1.1969
+0.082538 0.055118 -1.1992
+0.083688 0.055131 -1.1995
+0.084818 0.055131 -1.1995
+0.091406 0.055705 -1.2121
+0.092507 0.05568 -1.2115
+0.09354 0.055617 -1.2101
+0.094561 0.055547 -1.2086
+0.096566 0.055392 -1.2051
+0.098586 0.055252 -1.2021
+0.10267 0.055015 -1.1968
+0.10709 0.054967 -1.1958
+0.11139 0.054871 -1.1936
+0.11551 0.05469 -1.1896
+0.11974 0.054575 -1.1871
+0.12398 0.054471 -1.1848
+0.12823 0.054382 -1.1828
+0.1325 0.054306 -1.1811
+0.13674 0.054223 -1.1793
+0.13885 0.054179 -1.1783
+0.14098 0.054146 -1.1775
+0.14305 0.054089 -1.1763
+0.1453 0.0541 -1.1765
+0.14762 0.054139 -1.1774
+0.15 0.054199 -1.1787
+0.15246 0.054283 -1.1805
+0.15502 0.0544 -1.1831
+0.1575 0.054487 -1.185
+0.16002 0.054585 -1.1871
+0.16253 0.054677 -1.1891
+0.165 0.054754 -1.1908
+0.16745 0.05482 -1.1923
+0.1699 0.054888 -1.1937
+0.17281 0.055097 -1.1983
+0.17445 0.055259 -1.2019
+0.17569 0.055296 -1.2027
+0.17784 0.055259 -1.2019
+0.1799 0.055195 -1.2004
+0.18216 0.055196 -1.2004
+0.18479 0.055304 -1.2028
+0.1871 0.055319 -1.2031
+0.18914 0.055253 -1.2017
+0.19147 0.055272 -1.2021
+0.19386 0.055308 -1.2029
+0.19605 0.055284 -1.2023
+0.19821 0.055257 -1.2017
+0.1989 0.055134 -1.199
+0.2136 0.055139 -1.199
+0.2167 0.055353 -1.2037
+0.21785 0.055357 -1.2038
+-0.076817 0.058389 -1.298
+-0.07547 0.058292 -1.2959
+-0.038504 0.057706 -1.2828
+-0.037258 0.057647 -1.2815
+-0.036027 0.057606 -1.2806
+-0.023839 0.057269 -1.273
+-0.022646 0.057283 -1.2733
+-0.021454 0.057297 -1.2736
+-0.020398 0.057699 -1.2827
+-0.019221 0.057791 -1.2847
+-0.018017 0.057804 -1.285
+-0.016806 0.057798 -1.2849
+-0.007171 0.058088 -1.2914
+0.045908 0.054741 -1.2162
+0.048017 0.054536 -1.2116
+0.065528 0.053927 -1.1979
+0.081567 0.054092 -1.2015
+0.082773 0.054141 -1.2026
+0.091407 0.054564 -1.2121
+0.093505 0.054456 -1.2096
+0.13979 0.053004 -1.1768
+0.14169 0.052885 -1.1742
+0.14379 0.052843 -1.1732
+0.14489 0.052843 -1.1732
+0.14602 0.052853 -1.1734
+0.14719 0.052873 -1.1738
+0.14838 0.052903 -1.1745
+0.17416 0.054038 -1.1999
+0.18109 0.054083 -1.2009
+0.18198 0.054009 -1.1992
+0.1833 0.054066 -1.2005
+0.18602 0.054198 -1.2034
+0.18758 0.054325 -1.2063
+0.18843 0.05424 -1.2044
+0.18928 0.054161 -1.2026
+0.19028 0.054121 -1.2017
+0.1925 0.05411 -1.2014
+0.19924 0.054095 -1.2011
+0.20028 0.054071 -1.2005
+0.20138 0.054064 -1.2003
+0.20758 0.053911 -1.1969
+0.21249 0.054014 -1.1992
+0.21557 0.054218 -1.2038
+0.21791 0.054237 -1.2042
+-0.076729 0.057102 -1.2966
+-0.07412 0.056972 -1.2936
+-0.071576 0.056884 -1.2916
+-0.066629 0.056811 -1.2899
+-0.064162 0.056775 -1.2891
+-0.061712 0.056753 -1.2886
+-0.059291 0.056756 -1.2887
+-0.056908 0.056799 -1.2896
+-0.054561 0.056881 -1.2916
+-0.052148 0.0569 -1.292
+-0.049703 0.056884 -1.2916
+-0.047275 0.056887 -1.2917
+-0.044783 0.056809 -1.2899
+-0.042245 0.05666 -1.2865
+-0.039746 0.056548 -1.2839
+-0.034791 0.05635 -1.2794
+-0.032338 0.056269 -1.2776
+-0.029892 0.056192 -1.2758
+-0.027472 0.056152 -1.2749
+-0.025055 0.056111 -1.2739
+-0.023838 0.05607 -1.273
+-0.022681 0.056169 -1.2753
+-0.021605 0.056493 -1.2827
+-0.020417 0.056544 -1.2839
+-0.018012 0.05658 -1.2847
+-0.015591 0.056568 -1.2844
+-0.013182 0.056599 -1.2851
+-0.008371 0.056768 -1.289
+-0.007168 0.056848 -1.2908
+0.045909 0.053596 -1.2162
+0.046984 0.053517 -1.2144
+0.049153 0.05339 -1.2115
+0.05134 0.053292 -1.2092
+0.064492 0.052874 -1.1996
+0.06558 0.052841 -1.1988
+0.066676 0.052815 -1.1982
+0.068917 0.052803 -1.1979
+0.071205 0.052827 -1.1985
+0.073518 0.052867 -1.1994
+0.075819 0.052897 -1.2001
+0.078173 0.05296 -1.2015
+0.080566 0.053046 -1.2035
+0.081785 0.053102 -1.2048
+0.091396 0.053415 -1.2119
+0.092475 0.053379 -1.2111
+0.094485 0.053227 -1.2076
+0.096515 0.053093 -1.2045
+0.13868 0.051896 -1.1769
+0.13969 0.051859 -1.176
+0.1405 0.051748 -1.1735
+0.14169 0.05178 -1.1742
+0.14263 0.051717 -1.1728
+0.14472 0.051677 -1.1718
+0.14713 0.051747 -1.1734
+0.14952 0.05181 -1.1748
+0.15213 0.051943 -1.1779
+0.15482 0.052102 -1.1815
+0.15744 0.052235 -1.1846
+0.15993 0.05232 -1.1865
+0.16237 0.052386 -1.188
+0.16471 0.052416 -1.1887
+0.16707 0.052454 -1.1895
+0.1695 0.052514 -1.1909
+0.17221 0.052656 -1.1941
+0.17567 0.053022 -1.2025
+0.17824 0.053111 -1.2046
+0.18033 0.053059 -1.2034
+0.18224 0.052955 -1.201
+0.18463 0.05299 -1.2018
+0.18645 0.053188 -1.2063
+0.18772 0.053227 -1.2072
+0.18901 0.053268 -1.2081
+0.18978 0.053165 -1.2057
+0.19137 0.052978 -1.2014
+0.19353 0.05295 -1.2008
+0.19588 0.052973 -1.2013
+0.19811 0.052963 -1.2011
+0.20028 0.05294 -1.2005
+0.2025 0.052928 -1.2003
+0.20791 0.052867 -1.1988
+0.20905 0.05287 -1.1989
+0.21021 0.052877 -1.199
+0.21183 0.052999 -1.2018
+0.21457 0.053118 -1.2045
+0.21683 0.053115 -1.2045
+0.21913 0.053123 -1.2046
+-0.077957 0.055887 -1.2967
+-0.075398 0.055799 -1.2946
+-0.048543 0.055731 -1.2931
+-0.04736 0.055771 -1.294
+-0.04615 0.055779 -1.2942
+-0.044912 0.055755 -1.2937
+-0.043624 0.055664 -1.2915
+-0.041082 0.055513 -1.288
+-0.039772 0.055376 -1.2848
+-0.031132 0.055061 -1.2774
+-0.029901 0.055006 -1.2761
+-0.028686 0.054979 -1.2755
+-0.027485 0.054978 -1.2755
+-0.026419 0.055258 -1.2821
+-0.025285 0.055416 -1.2858
+-0.024107 0.05549 -1.2875
+-0.022867 0.05542 -1.2859
+-0.021627 0.055343 -1.284
+-0.007164 0.055605 -1.2902
+-0.00596 0.05569 -1.2922
+0.047006 0.052397 -1.215
+0.048117 0.052362 -1.2141
+0.065647 0.051764 -1.2001
+0.067882 0.051745 -1.1996
+0.069019 0.05175 -1.1997
+0.070201 0.05179 -1.2007
+0.077205 0.051938 -1.2041
+0.078408 0.051984 -1.2052
+0.079558 0.051994 -1.2054
+0.080693 0.051994 -1.2054
+0.09138 0.052264 -1.2117
+0.093454 0.052148 -1.209
+0.13962 0.050725 -1.1754
+0.14161 0.050644 -1.1735
+0.14377 0.050624 -1.173
+0.15074 0.050739 -1.1757
+0.15345 0.050903 -1.1795
+0.15868 0.051159 -1.1855
+0.16106 0.051203 -1.1865
+0.16237 0.051266 -1.188
+0.16343 0.051247 -1.1875
+0.18632 0.052015 -1.2054
+0.18915 0.052169 -1.2091
+0.19031 0.052176 -1.2092
+0.19129 0.052133 -1.2082
+0.19271 0.0519 -1.2027
+0.19366 0.051852 -1.2016
+0.19475 0.05184 -1.2013
+0.19587 0.051838 -1.2012
+0.19698 0.051831 -1.2011
+0.20349 0.051762 -1.1994
+0.2046 0.051756 -1.1993
+0.20576 0.051765 -1.1995
+0.20689 0.051764 -1.1995
+0.20822 0.051815 -1.2006
+0.21096 0.05193 -1.2033
+0.21233 0.051989 -1.2047
+0.21346 0.051989 -1.2047
+0.21572 0.051985 -1.2046
+0.21793 0.051971 -1.2043
+-0.076658 0.05461 -1.2953
+-0.074075 0.054502 -1.2928
+-0.069073 0.054395 -1.2902
+-0.064246 0.054419 -1.2908
+-0.05937 0.054402 -1.2904
+-0.056937 0.054397 -1.2903
+-0.054553 0.054441 -1.2914
+-0.049781 0.054538 -1.2937
+-0.047358 0.05455 -1.294
+-0.044931 0.054559 -1.2942
+-0.042501 0.054565 -1.2944
+-0.041272 0.054551 -1.294
+-0.028769 0.053933 -1.2792
+-0.027639 0.054077 -1.2827
+-0.026521 0.05426 -1.2871
+-0.025318 0.054276 -1.2875
+-0.024107 0.054276 -1.2875
+-0.022867 0.054208 -1.2858
+-0.020409 0.054105 -1.2834
+-0.015575 0.054094 -1.2831
+-0.010769 0.054207 -1.2858
+-0.008369 0.054332 -1.2888
+-0.007163 0.054382 -1.29
+-0.005956 0.054439 -1.2914
+0.048172 0.051276 -1.2155
+0.049267 0.051226 -1.2143
+0.051473 0.051146 -1.2124
+0.053665 0.051059 -1.2103
+0.058049 0.050907 -1.2066
+0.062427 0.050772 -1.2034
+0.064615 0.05071 -1.2019
+0.066868 0.050703 -1.2017
+0.069191 0.050746 -1.2028
+0.071535 0.050802 -1.2041
+0.073897 0.050867 -1.2057
+0.076249 0.050922 -1.207
+0.077385 0.050922 -1.207
+0.078472 0.05089 -1.2062
+0.091376 0.05112 -1.2117
+0.092413 0.051063 -1.2103
+0.09443 0.050922 -1.2069
+0.098496 0.050675 -1.201
+0.10266 0.050498 -1.1967
+0.10707 0.05045 -1.1955
+0.11125 0.050307 -1.1921
+0.11544 0.050175 -1.1889
+0.11964 0.050059 -1.1861
+0.12383 0.049944 -1.1833
+0.12804 0.049851 -1.1811
+0.13222 0.049749 -1.1786
+0.1364 0.049654 -1.1763
+0.13854 0.049627 -1.1757
+0.14059 0.049566 -1.1742
+0.14273 0.049541 -1.1736
+0.14496 0.049548 -1.1737
+0.1495 0.049589 -1.1747
+0.15067 0.049609 -1.1752
+0.15202 0.049687 -1.177
+0.15465 0.04982 -1.1802
+0.15729 0.049952 -1.1834
+0.15966 0.049996 -1.1844
+0.16205 0.050047 -1.1856
+0.16438 0.050075 -1.1863
+0.16669 0.050099 -1.1868
+0.16937 0.050228 -1.1899
+0.17537 0.050667 -1.2004
+0.1784 0.050886 -1.2056
+0.1809 0.05095 -1.2072
+0.18276 0.050835 -1.2044
+0.1848 0.050773 -1.2029
+0.1861 0.050818 -1.204
+0.18791 0.051002 -1.2084
+0.19051 0.05109 -1.2105
+0.19266 0.051054 -1.2096
+0.19463 0.050973 -1.2077
+0.19638 0.050837 -1.2044
+0.19798 0.050665 -1.2003
+0.20235 0.050629 -1.1994
+0.20465 0.050637 -1.1996
+0.20621 0.050745 -1.2021
+0.20744 0.050769 -1.2027
+0.209 0.050871 -1.2052
+0.21022 0.050892 -1.2056
+0.2124 0.050869 -1.2051
+0.2146 0.050853 -1.2047
+0.2168 0.050836 -1.2043
+0.21789 0.050828 -1.2041
+-0.075364 0.053337 -1.294
+-0.041384 0.053477 -1.2976
+-0.040236 0.053575 -1.3
+-0.039109 0.053705 -1.3032
+-0.037885 0.053709 -1.3033
+-0.027719 0.053024 -1.2865
+-0.026509 0.053024 -1.2865
+-0.024061 0.052963 -1.285
+-0.021607 0.052876 -1.2829
+-0.009569 0.05305 -1.2871
+-0.008369 0.053117 -1.2888
+0.04932 0.050135 -1.2156
+0.050442 0.050113 -1.2151
+0.052636 0.050024 -1.2129
+0.072885 0.049816 -1.2077
+0.07403 0.049821 -1.2079
+0.075167 0.049821 -1.2079
+0.076276 0.049803 -1.2074
+0.090359 0.050047 -1.2134
+0.091379 0.04998 -1.2117
+0.09342 0.049852 -1.2086
+0.15068 0.048503 -1.1752
+0.15325 0.048617 -1.178
+0.16787 0.048997 -1.1873
+0.17666 0.04958 -1.2015
+0.17829 0.049719 -1.2049
+0.17963 0.049777 -1.2063
+0.18599 0.049655 -1.2033
+0.1894 0.049955 -1.2106
+0.1959 0.049869 -1.2085
+0.19699 0.049856 -1.2082
+0.19803 0.049832 -1.2076
+0.20421 0.049674 -1.2037
+0.20547 0.049705 -1.2044
+0.20683 0.04976 -1.2058
+0.20797 0.04976 -1.2058
+0.2091 0.049759 -1.2057
+0.21136 0.049756 -1.2056
+0.21566 0.0497 -1.2043
+0.21671 0.049681 -1.2038
+-0.07664 0.052158 -1.295
+-0.074064 0.052061 -1.2926
+-0.071531 0.051988 -1.2908
+-0.066624 0.051949 -1.2898
+-0.064179 0.051934 -1.2895
+-0.061802 0.051975 -1.2905
+-0.05943 0.052025 -1.2917
+-0.057087 0.052105 -1.2937
+-0.054656 0.052108 -1.2938
+-0.052204 0.052091 -1.2934
+-0.047359 0.052115 -1.294
+-0.044963 0.05216 -1.2952
+-0.042601 0.052252 -1.2975
+-0.040333 0.052477 -1.3031
+-0.037884 0.05248 -1.3032
+-0.030204 0.051923 -1.2892
+-0.028977 0.051898 -1.2886
+-0.027718 0.051811 -1.2864
+-0.025252 0.051717 -1.2841
+-0.0228 0.051637 -1.2821
+-0.020379 0.051615 -1.2815
+-0.017972 0.051626 -1.2818
+-0.013166 0.051696 -1.2835
+-0.010767 0.051772 -1.2855
+-0.009569 0.051839 -1.2871
+0.050462 0.048987 -1.2156
+0.051586 0.048968 -1.2151
+0.05378 0.048883 -1.2129
+0.055966 0.048798 -1.2108
+0.058146 0.048715 -1.2087
+0.060351 0.048657 -1.2072
+0.062597 0.048636 -1.2067
+0.064892 0.048653 -1.2071
+0.067207 0.048684 -1.2079
+0.069575 0.048749 -1.2095
+0.071834 0.048737 -1.2092
+0.074031 0.048684 -1.2079
+0.09036 0.048904 -1.2134
+0.092397 0.048774 -1.2101
+0.094393 0.048628 -1.2064
+0.096435 0.048512 -1.2035
+0.13839 0.047357 -1.1743
+0.14264 0.0473 -1.1729
+0.14716 0.047331 -1.1736
+0.14951 0.047376 -1.1747
+0.15195 0.047445 -1.1765
+0.15432 0.047494 -1.1777
+0.15691 0.047606 -1.1805
+0.16153 0.047657 -1.1818
+0.16398 0.047721 -1.1833
+0.16661 0.047837 -1.1862
+0.16934 0.047977 -1.1897
+0.17226 0.048168 -1.1945
+0.17498 0.048296 -1.1977
+0.17784 0.048461 -1.2018
+0.17942 0.048583 -1.2049
+0.18075 0.048635 -1.2062
+0.18284 0.048586 -1.205
+0.18484 0.048516 -1.2032
+0.18599 0.048521 -1.2033
+0.18772 0.048675 -1.2072
+0.19071 0.048858 -1.2117
+0.1928 0.048809 -1.2105
+0.19494 0.048775 -1.2096
+0.19704 0.04873 -1.2085
+0.19917 0.048694 -1.2076
+0.20129 0.048657 -1.2066
+0.20356 0.048655 -1.2066
+0.20585 0.048661 -1.2067
+0.20807 0.048647 -1.2064
+0.21029 0.048635 -1.206
+0.21245 0.04861 -1.2054
+0.21453 0.048565 -1.2043
+0.21555 0.048541 -1.2037
+0.2166 0.048521 -1.2032
+-0.07537 0.050904 -1.2942
+-0.062964 0.050719 -1.2894
+-0.061771 0.050736 -1.2899
+-0.060585 0.050758 -1.2904
+-0.058253 0.050842 -1.2926
+-0.057097 0.050895 -1.294
+-0.055873 0.050889 -1.2938
+-0.043805 0.05101 -1.297
+-0.042657 0.051097 -1.2992
+-0.04156 0.051252 -1.3032
+-0.03663 0.051215 -1.3022
+-0.035405 0.051215 -1.3022
+-0.030188 0.050683 -1.2886
+-0.028912 0.050571 -1.2857
+-0.02644 0.05047 -1.2831
+-0.009569 0.050625 -1.2871
+0.051583 0.047821 -1.215
+0.052722 0.047816 -1.2149
+0.054907 0.047727 -1.2126
+0.057102 0.047654 -1.2107
+0.061619 0.047621 -1.2099
+0.062778 0.047636 -1.2102
+0.063926 0.047643 -1.2104
+0.065081 0.047654 -1.2107
+0.066201 0.04764 -1.2103
+0.067328 0.047631 -1.2101
+0.068436 0.047609 -1.2095
+0.069575 0.04761 -1.2095
+0.070714 0.04761 -1.2095
+0.089351 0.047833 -1.2152
+0.16261 0.046533 -1.1815
+0.17899 0.047333 -1.202
+0.18606 0.047404 -1.2038
+0.18765 0.047521 -1.2067
+0.18957 0.047716 -1.2117
+0.19231 0.047831 -1.2147
+0.1942 0.047732 -1.2121
+0.19511 0.047675 -1.2107
+0.19607 0.047633 -1.2096
+0.19706 0.047597 -1.2087
+0.19815 0.047584 -1.2083
+0.19917 0.047556 -1.2076
+0.20028 0.04755 -1.2074
+0.20138 0.04754 -1.2072
+0.20248 0.047532 -1.207
+0.20359 0.047526 -1.2068
+0.20473 0.047525 -1.2068
+0.20586 0.047526 -1.2068
+0.20699 0.047523 -1.2067
+0.2081 0.047518 -1.2066
+0.20921 0.047511 -1.2064
+0.21038 0.047519 -1.2066
+0.21149 0.047512 -1.2064
+0.21251 0.047487 -1.2058
+0.21349 0.047453 -1.2049
+0.21442 0.047406 -1.2037
+-0.076737 0.049783 -1.2967
+-0.07407 0.049631 -1.2927
+-0.071551 0.049571 -1.2911
+-0.069079 0.04954 -1.2903
+-0.064211 0.049531 -1.2901
+-0.061769 0.049519 -1.2898
+-0.059403 0.04957 -1.2912
+-0.057055 0.049641 -1.293
+-0.054642 0.04966 -1.2935
+-0.049791 0.049676 -1.2939
+-0.047369 0.049688 -1.2943
+-0.045011 0.049775 -1.2966
+-0.042784 0.050023 -1.3031
+-0.041603 0.050077 -1.3045
+-0.040354 0.05005 -1.3038
+-0.037843 0.049973 -1.3018
+-0.035369 0.049938 -1.3009
+-0.034141 0.049932 -1.3007
+-0.032912 0.049923 -1.3005
+-0.031561 0.049723 -1.2952
+-0.030121 0.049359 -1.2856
+-0.027647 0.049261 -1.2831
+-0.025193 0.049183 -1.281
+-0.020364 0.049165 -1.2805
+-0.015556 0.049201 -1.2815
+-0.013161 0.049259 -1.283
+-0.010766 0.049348 -1.2854
+-0.009566 0.049399 -1.2867
+0.052687 0.046641 -1.2141
+0.053804 0.046619 -1.2135
+0.054908 0.046586 -1.2126
+0.056018 0.04656 -1.2119
+0.058261 0.046529 -1.2111
+0.060601 0.046574 -1.2123
+0.061742 0.046575 -1.2123
+0.062851 0.04655 -1.2117
+0.065091 0.04652 -1.2109
+0.067328 0.046491 -1.2101
+0.089201 0.04661 -1.2131
+0.09029 0.046582 -1.2124
+0.094387 0.046352 -1.2063
+0.098474 0.046138 -1.2007
+0.10266 0.045985 -1.1967
+0.10708 0.045947 -1.1956
+0.11124 0.045806 -1.1919
+0.11537 0.045664 -1.1882
+0.11954 0.04555 -1.1851
+0.1237 0.045436 -1.1821
+0.12786 0.045334 -1.1794
+0.132 0.045228 -1.1766
+0.13617 0.045141 -1.1743
+0.13824 0.045096 -1.1731
+0.14041 0.045081 -1.1727
+0.14266 0.045094 -1.173
+0.145 0.045135 -1.1741
+0.14721 0.045135 -1.1741
+0.14941 0.045132 -1.174
+0.15179 0.045181 -1.1753
+0.15424 0.04525 -1.1771
+0.15906 0.045359 -1.1799
+0.1615 0.045419 -1.1815
+0.16396 0.045485 -1.1832
+0.16647 0.045561 -1.1852
+0.16924 0.045708 -1.1891
+0.17218 0.045894 -1.194
+0.17461 0.045941 -1.1952
+0.17701 0.045979 -1.1962
+0.18037 0.046263 -1.2036
+0.18283 0.046312 -1.2049
+0.18493 0.046269 -1.2038
+0.18725 0.046283 -1.2041
+0.18941 0.046535 -1.2107
+0.19114 0.04668 -1.2145
+0.19426 0.046881 -1.2198
+0.19572 0.046955 -1.2218
+0.19683 0.046946 -1.2215
+0.19794 0.046935 -1.2212
+0.19866 0.046834 -1.2186
+0.19988 0.046584 -1.212
+0.20189 0.04652 -1.2103
+0.20742 0.046483 -1.2093
+0.20994 0.046536 -1.2107
+0.21108 0.046536 -1.2107
+-0.076741 0.048564 -1.2968
+-0.075406 0.048491 -1.2948
+-0.043935 0.048713 -1.3009
+-0.041601 0.048847 -1.3045
+-0.034128 0.048688 -1.3002
+-0.032838 0.048589 -1.2975
+-0.031398 0.048252 -1.2884
+-0.011962 0.048087 -1.284
+-0.010761 0.048118 -1.2849
+-0.00488 0.049782 -1.3297
+-0.003638 0.049891 -1.3327
+0.055991 0.045396 -1.2113
+0.057117 0.045385 -1.211
+0.058261 0.045388 -1.2111
+0.059424 0.045405 -1.2116
+0.060601 0.045432 -1.2123
+0.08841 0.045648 -1.218
+0.089142 0.045437 -1.2123
+0.1372 0.044008 -1.1736
+0.13825 0.043991 -1.1731
+0.13935 0.043991 -1.1731
+0.14066 0.044056 -1.1749
+0.14183 0.044073 -1.1753
+0.14456 0.044231 -1.1796
+0.14567 0.044231 -1.1796
+0.1466 0.044176 -1.1781
+0.14738 0.044077 -1.1754
+0.14848 0.044076 -1.1754
+0.14949 0.044048 -1.1746
+0.15062 0.044054 -1.1748
+0.15293 0.044082 -1.1755
+0.17813 0.044852 -1.1962
+0.18153 0.045136 -1.2038
+0.1838 0.045137 -1.2038
+0.18899 0.045294 -1.208
+0.19113 0.045531 -1.2144
+0.19292 0.045684 -1.2185
+0.19457 0.045803 -1.2217
+0.19578 0.045818 -1.2222
+0.19911 0.046054 -1.2285
+0.2005 0.046107 -1.2299
+0.20126 0.046016 -1.2275
+-0.078615 0.047741 -1.3078
+-0.07686 0.047417 -1.2988
+-0.075454 0.047302 -1.2956
+-0.074182 0.047268 -1.2947
+-0.071648 0.047204 -1.2929
+-0.069173 0.047174 -1.2921
+-0.066671 0.047125 -1.2907
+-0.064212 0.047103 -1.2901
+-0.06179 0.047106 -1.2902
+-0.059405 0.047141 -1.2912
+-0.057013 0.047172 -1.2921
+-0.054626 0.04721 -1.2931
+-0.052215 0.04723 -1.2937
+-0.049776 0.047225 -1.2936
+-0.047375 0.047258 -1.2945
+-0.045104 0.047431 -1.2993
+-0.044039 0.0476 -1.304
+-0.04282 0.047609 -1.3042
+-0.040327 0.047563 -1.3029
+-0.037832 0.047509 -1.3014
+-0.035349 0.047462 -1.3001
+-0.034066 0.047379 -1.2978
+-0.03133 0.046937 -1.2856
+-0.030061 0.046846 -1.2831
+-0.027616 0.046794 -1.2817
+-0.01795 0.046743 -1.2803
+-0.01316 0.046842 -1.283
+-0.011963 0.04688 -1.2841
+-0.004873 0.048457 -1.3277
+-0.003633 0.048578 -1.331
+-0.002386 0.048661 -1.3333
+0.088304 0.044447 -1.2166
+0.089129 0.044288 -1.2122
+0.090271 0.044288 -1.2122
+0.092331 0.044181 -1.2092
+0.094346 0.044059 -1.2058
+0.096334 0.04393 -1.2022
+0.1005 0.043772 -1.1978
+0.12987 0.043039 -1.1774
+0.13198 0.043002 -1.1764
+0.13404 0.042953 -1.175
+0.13617 0.042927 -1.1743
+0.13883 0.043068 -1.1782
+0.14157 0.043225 -1.1825
+0.14387 0.043247 -1.1831
+0.14603 0.043228 -1.1826
+0.14826 0.043228 -1.1826
+0.14924 0.043189 -1.1815
+0.15009 0.043114 -1.1794
+0.15113 0.043092 -1.1788
+0.15185 0.042981 -1.1757
+0.15413 0.043001 -1.1763
+0.15648 0.043037 -1.1773
+0.15899 0.043117 -1.1794
+0.16142 0.043171 -1.1809
+0.16391 0.043241 -1.1829
+0.1662 0.043258 -1.1833
+0.16864 0.043312 -1.1848
+0.17173 0.043528 -1.1908
+0.17431 0.043613 -1.1931
+0.17667 0.043642 -1.1939
+0.1778 0.043642 -1.1939
+0.17958 0.043802 -1.1983
+0.1814 0.043969 -1.2029
+0.18265 0.043998 -1.2037
+0.18493 0.044001 -1.2038
+0.18716 0.043992 -1.2035
+0.18848 0.044035 -1.2047
+0.19053 0.044249 -1.2106
+0.19257 0.044457 -1.2164
+0.19449 0.044634 -1.2213
+0.19625 0.044772 -1.2251
+0.19786 0.044877 -1.228
+0.20055 0.04496 -1.2303
+0.20185 0.044991 -1.2311
+0.20341 0.045081 -1.2336
+0.20477 0.045124 -1.2348
+0.21063 0.045134 -1.235
+-0.078762 0.046597 -1.3102
+-0.075484 0.046101 -1.2961
+-0.068035 0.04601 -1.2936
+-0.065474 0.045921 -1.2911
+-0.060573 0.045889 -1.2902
+-0.05935 0.045883 -1.29
+-0.058151 0.045894 -1.2903
+-0.056979 0.045928 -1.2913
+-0.05577 0.045932 -1.2914
+-0.054615 0.045983 -1.2929
+-0.053407 0.04599 -1.2931
+-0.052201 0.045999 -1.2933
+-0.05097 0.045987 -1.293
+-0.044034 0.046369 -1.3038
+-0.04156 0.046345 -1.3032
+-0.036599 0.046272 -1.3011
+-0.035308 0.046185 -1.2986
+-0.032542 0.045731 -1.2857
+-0.031282 0.045657 -1.2837
+-0.011964 0.045674 -1.2841
+-0.006107 0.047096 -1.3245
+-0.004869 0.047166 -1.3265
+-0.002382 0.047333 -1.3313
+0.087522 0.043481 -1.2217
+0.088166 0.043233 -1.2146
+0.089055 0.04311 -1.2111
+0.091304 0.043095 -1.2107
+0.092314 0.043034 -1.209
+0.0933 0.042964 -1.207
+0.13308 0.041892 -1.1764
+0.13411 0.041866 -1.1756
+0.13531 0.041898 -1.1765
+0.13806 0.042061 -1.1811
+0.13947 0.042148 -1.1836
+0.14064 0.042166 -1.1841
+0.14944 0.042132 -1.1831
+0.15054 0.042128 -1.183
+0.15165 0.042125 -1.1829
+0.15251 0.042056 -1.1809
+0.15354 0.042033 -1.1803
+0.15537 0.041928 -1.1773
+0.15648 0.041928 -1.1773
+0.15778 0.041977 -1.1787
+0.15889 0.041978 -1.1787
+0.16011 0.042006 -1.1795
+0.16253 0.042058 -1.1809
+0.16728 0.042132 -1.183
+0.16839 0.042133 -1.183
+0.16976 0.042196 -1.1848
+0.17305 0.042455 -1.1922
+0.17779 0.042515 -1.1938
+0.17911 0.042561 -1.1951
+0.18118 0.042785 -1.2015
+0.18379 0.042864 -1.2037
+0.18832 0.042863 -1.2037
+0.18982 0.042947 -1.2061
+0.19756 0.043652 -1.226
+0.1991 0.043737 -1.2285
+0.20224 0.043917 -1.2336
+0.20367 0.043975 -1.2352
+0.20574 0.04417 -1.2407
+0.20713 0.044217 -1.2421
+0.20837 0.044231 -1.2425
+0.20954 0.044232 -1.2425
+0.21061 0.044211 -1.2419
+0.21144 0.044141 -1.2399
+-0.080167 0.045461 -1.3131
+-0.078763 0.045364 -1.3103
+-0.07721 0.045177 -1.3048
+-0.074261 0.044878 -1.2961
+-0.069296 0.044821 -1.2944
+-0.0668 0.044781 -1.2933
+-0.064173 0.044646 -1.2893
+-0.061682 0.044599 -1.288
+-0.060455 0.044588 -1.2877
+-0.059087 0.04447 -1.2842
+-0.056717 0.044506 -1.2853
+-0.055634 0.044608 -1.2882
+-0.054458 0.044637 -1.2891
+-0.05212 0.044712 -1.2913
+-0.049718 0.044738 -1.2921
+-0.047384 0.044829 -1.2947
+-0.045159 0.045039 -1.3009
+-0.042782 0.045114 -1.3031
+-0.040296 0.045075 -1.3019
+-0.037826 0.04505 -1.3012
+-0.036594 0.045041 -1.3009
+-0.033777 0.044554 -1.2867
+-0.032493 0.044454 -1.2838
+-0.030031 0.044385 -1.2818
+-0.025169 0.044318 -1.2798
+-0.02035 0.044311 -1.2797
+-0.017949 0.044329 -1.2802
+-0.015553 0.044366 -1.2813
+-0.013159 0.044421 -1.2829
+-0.011972 0.044496 -1.285
+-0.007337 0.045748 -1.3216
+-0.006103 0.045816 -1.3236
+-0.003622 0.045929 -1.3269
+-0.001131 0.046134 -1.3328
+0.087519 0.042329 -1.2217
+0.088165 0.042088 -1.2146
+0.089024 0.041954 -1.2107
+0.090195 0.041968 -1.2111
+0.09227 0.041875 -1.2084
+0.094234 0.041737 -1.2044
+0.098343 0.041557 -1.1991
+0.10046 0.041497 -1.1973
+0.10275 0.041512 -1.1978
+0.10702 0.041421 -1.1951
+0.11121 0.041305 -1.1917
+0.11538 0.04119 -1.1883
+0.11947 0.041058 -1.1844
+0.12363 0.040956 -1.1814
+0.12773 0.040844 -1.1782
+0.12983 0.040806 -1.177
+0.13202 0.040797 -1.1768
+0.13481 0.040973 -1.1819
+0.1373 0.041052 -1.1842
+0.13953 0.04105 -1.1841
+0.14176 0.041051 -1.1841
+0.14616 0.041033 -1.1836
+0.14841 0.041038 -1.1837
+0.15057 0.041019 -1.1832
+0.15292 0.041053 -1.1841
+0.15517 0.041057 -1.1842
+0.15701 0.040955 -1.1813
+0.15906 0.04091 -1.1799
+0.1613 0.040915 -1.1801
+0.16373 0.040966 -1.1815
+0.16618 0.041022 -1.1832
+0.16845 0.041031 -1.1834
+0.16957 0.041032 -1.1834
+0.17115 0.041143 -1.1867
+0.17296 0.04131 -1.1915
+0.17417 0.041331 -1.1922
+0.17642 0.041331 -1.1921
+0.17825 0.041235 -1.1893
+0.18049 0.041493 -1.1968
+0.18238 0.041666 -1.2019
+0.18492 0.041729 -1.2037
+0.18725 0.041743 -1.2041
+0.18945 0.041729 -1.2037
+0.20048 0.042626 -1.2298
+0.20233 0.042773 -1.2341
+0.20439 0.042963 -1.2396
+0.20752 0.043127 -1.2444
+0.20892 0.043175 -1.2458
+0.20998 0.043152 -1.2451
+-0.081525 0.044292 -1.3151
+-0.07876 0.044129 -1.3102
+-0.075878 0.043888 -1.303
+-0.068078 0.043602 -1.2944
+-0.066797 0.043561 -1.2932
+-0.065378 0.043427 -1.2892
+-0.06267 0.043232 -1.2833
+-0.061409 0.043194 -1.2822
+-0.060154 0.04316 -1.2812
+-0.058945 0.043157 -1.2811
+-0.057569 0.043029 -1.2773
+-0.056546 0.043166 -1.2814
+-0.055421 0.043228 -1.2833
+-0.048486 0.043506 -1.2916
+-0.047376 0.043603 -1.2945
+-0.04625 0.04369 -1.2971
+-0.045151 0.043807 -1.3006
+-0.043983 0.043863 -1.3023
+-0.042758 0.043863 -1.3023
+-0.041508 0.043836 -1.3015
+-0.033737 0.043291 -1.2852
+-0.031248 0.043193 -1.2822
+-0.01675 0.043139 -1.2806
+-0.011973 0.043291 -1.2852
+-0.008572 0.044462 -1.3203
+-0.007334 0.044485 -1.321
+0.000122 0.044903 -1.3336
+0.086672 0.041322 -1.226
+0.08752 0.041178 -1.2217
+0.089033 0.040818 -1.2108
+0.093164 0.04063 -1.2052
+0.12876 0.039711 -1.1775
+0.12984 0.039699 -1.1771
+0.13098 0.039711 -1.1775
+0.13386 0.039908 -1.1834
+0.13511 0.039948 -1.1846
+0.13623 0.039948 -1.1846
+0.15637 0.039961 -1.1849
+0.15748 0.039962 -1.1849
+0.15856 0.039952 -1.1846
+0.15967 0.03995 -1.1845
+0.16062 0.039908 -1.1832
+0.16287 0.039914 -1.1834
+0.16387 0.039885 -1.1825
+0.16498 0.039885 -1.1825
+0.16622 0.039915 -1.1834
+0.16736 0.039922 -1.1836
+0.16972 0.039952 -1.1845
+0.17292 0.040176 -1.1912
+0.17767 0.040236 -1.193
+0.17838 0.040142 -1.1902
+0.17992 0.040238 -1.193
+0.18354 0.040541 -1.2021
+0.18847 0.040627 -1.2047
+0.18941 0.040585 -1.2034
+0.20427 0.041769 -1.2389
+0.206 0.041884 -1.2423
+0.20774 0.042 -1.2458
+0.20899 0.042015 -1.2462
+0.21046 0.042074 -1.248
+-0.082921 0.043137 -1.3176
+-0.080129 0.042969 -1.3125
+-0.077396 0.042823 -1.308
+-0.074611 0.042638 -1.3023
+-0.071893 0.042479 -1.2974
+-0.069388 0.04244 -1.2962
+-0.068086 0.042389 -1.2946
+-0.066649 0.04225 -1.2903
+-0.065204 0.042101 -1.2857
+-0.063908 0.042044 -1.284
+-0.061367 0.041958 -1.2813
+-0.058894 0.041915 -1.28
+-0.057566 0.041825 -1.2772
+-0.056543 0.041957 -1.2813
+-0.055313 0.041938 -1.2807
+-0.054211 0.042018 -1.2832
+-0.051868 0.042076 -1.285
+-0.049525 0.04214 -1.287
+-0.047265 0.042285 -1.2915
+-0.046175 0.042399 -1.295
+-0.045027 0.042466 -1.297
+-0.043876 0.042533 -1.2991
+-0.042621 0.0425 -1.2981
+-0.041369 0.042469 -1.2971
+-0.033698 0.042033 -1.2837
+-0.032453 0.041983 -1.2822
+-0.030006 0.041935 -1.2807
+-0.027576 0.041906 -1.2798
+-0.017945 0.041908 -1.2798
+-0.016744 0.041917 -1.2801
+-0.015559 0.041969 -1.2817
+-0.013171 0.042044 -1.284
+-0.009796 0.043143 -1.318
+-0.008566 0.043189 -1.3194
+-0.006091 0.043244 -1.3211
+-0.003616 0.04336 -1.3247
+-0.001128 0.043492 -1.3287
+0.000122 0.043579 -1.3314
+0.08667 0.040167 -1.226
+0.088273 0.039848 -1.2161
+0.089119 0.039715 -1.212
+0.090172 0.039676 -1.2108
+0.092028 0.039494 -1.2052
+0.092963 0.03941 -1.2026
+0.094096 0.03941 -1.2026
+0.096181 0.039337 -1.2003
+0.10046 0.03924 -1.1973
+0.105 0.039252 -1.1977
+0.12155 0.038775 -1.1829
+0.12569 0.038678 -1.1799
+0.1278 0.038645 -1.1788
+0.12891 0.038645 -1.1789
+0.13027 0.038719 -1.1811
+0.13288 0.038832 -1.1846
+0.13512 0.038832 -1.1846
+0.13725 0.038806 -1.1838
+0.13938 0.038777 -1.1829
+0.14155 0.03876 -1.1823
+0.14374 0.038749 -1.182
+0.14824 0.038763 -1.1824
+0.15281 0.038793 -1.1833
+0.15517 0.038826 -1.1843
+0.15749 0.038846 -1.1849
+0.15979 0.038863 -1.1854
+0.16222 0.038909 -1.1868
+0.16447 0.038914 -1.187
+0.16537 0.038862 -1.1854
+0.16645 0.038854 -1.1851
+0.16869 0.038854 -1.1851
+0.17105 0.038885 -1.186
+0.17292 0.039053 -1.1912
+0.17415 0.039079 -1.192
+0.17653 0.039108 -1.1929
+0.17879 0.039111 -1.193
+0.18149 0.039209 -1.196
+0.18327 0.039348 -1.2003
+0.18492 0.039459 -1.2037
+0.18744 0.039514 -1.2054
+0.18861 0.03952 -1.2056
+0.18941 0.03945 -1.2034
+0.19013 0.039365 -1.2007
+0.20727 0.040732 -1.2429
+0.20891 0.040825 -1.2457
+0.21061 0.040927 -1.2489
+-0.068007 0.041122 -1.2931
+-0.065156 0.04086 -1.2848
+-0.057687 0.040707 -1.2799
+-0.0553 0.040723 -1.2804
+-0.052926 0.040751 -1.2813
+-0.051733 0.040761 -1.2816
+-0.050564 0.04079 -1.2826
+-0.048266 0.040888 -1.2857
+-0.047137 0.040958 -1.2879
+-0.033675 0.040796 -1.2828
+-0.031208 0.040727 -1.2806
+-0.016743 0.04071 -1.2801
+-0.014369 0.040806 -1.2831
+-0.011002 0.041776 -1.314
+-0.009795 0.041898 -1.3178
+-0.007325 0.041949 -1.3194
+0.000122 0.042267 -1.3296
+0.001374 0.042331 -1.3316
+0.085808 0.039145 -1.2302
+0.089171 0.038596 -1.2127
+0.092932 0.038264 -1.2022
+0.1268 0.037566 -1.1799
+0.12934 0.037657 -1.1827
+0.13073 0.037739 -1.1854
+0.13187 0.037745 -1.1855
+0.16577 0.037837 -1.1883
+0.16801 0.037836 -1.1882
+0.17286 0.037918 -1.1908
+0.17531 0.037962 -1.1922
+0.17653 0.037983 -1.1929
+0.17773 0.038 -1.1934
+0.18317 0.038197 -1.1996
+0.1863 0.038377 -1.2054
+0.18871 0.038405 -1.2062
+0.18985 0.038405 -1.2062
+0.19011 0.03823 -1.2007
+0.21015 0.039664 -1.2461
+-0.08558 0.040742 -1.3204
+-0.082812 0.040603 -1.3159
+-0.080138 0.040502 -1.3126
+-0.077439 0.040382 -1.3087
+-0.074873 0.040327 -1.3069
+-0.072247 0.040234 -1.3038
+-0.069515 0.040073 -1.2986
+-0.068052 0.039931 -1.294
+-0.066467 0.039712 -1.2868
+-0.063907 0.039625 -1.2839
+-0.05889 0.039502 -1.2799
+-0.05645 0.039479 -1.2792
+-0.054047 0.039483 -1.2793
+-0.051668 0.039504 -1.28
+-0.04932 0.039553 -1.2816
+-0.046961 0.039597 -1.2831
+-0.041059 0.039726 -1.2873
+-0.03975 0.039629 -1.2841
+-0.034878 0.039584 -1.2826
+-0.03241 0.039517 -1.2805
+-0.029979 0.039489 -1.2795
+-0.025152 0.039471 -1.279
+-0.020341 0.039475 -1.2791
+-0.017947 0.039502 -1.28
+-0.015569 0.039581 -1.2826
+-0.014403 0.039693 -1.2862
+-0.011014 0.040583 -1.3154
+-0.008555 0.040657 -1.3178
+-0.006085 0.040713 -1.3196
+-0.001125 0.040899 -1.3257
+0.001373 0.041035 -1.3302
+0.085788 0.037977 -1.2299
+0.086644 0.037845 -1.2256
+0.08837 0.037598 -1.2175
+0.090008 0.037327 -1.2086
+0.092053 0.037233 -1.2055
+0.094058 0.037128 -1.2021
+0.098223 0.036992 -1.1976
+0.1028 0.037015 -1.1984
+0.10698 0.0369 -1.1946
+0.1111 0.036776 -1.1905
+0.11532 0.03669 -1.1876
+0.11945 0.036585 -1.1842
+0.12151 0.036532 -1.1825
+0.12363 0.036503 -1.1815
+0.12587 0.036507 -1.1816
+0.12732 0.036603 -1.1848
+0.12854 0.036632 -1.1857
+0.13076 0.036628 -1.1856
+0.13288 0.036597 -1.1845
+0.13714 0.036542 -1.1827
+0.14157 0.036537 -1.1825
+0.14599 0.036529 -1.1822
+0.15049 0.03654 -1.1826
+0.15507 0.036568 -1.1835
+0.15976 0.036622 -1.1852
+0.16459 0.036701 -1.1878
+0.16702 0.036744 -1.1892
+0.16952 0.036801 -1.191
+0.17179 0.036807 -1.1912
+0.1743 0.036862 -1.193
+0.1766 0.036875 -1.1934
+0.17774 0.036878 -1.1935
+0.1791 0.036927 -1.1951
+0.18163 0.036982 -1.1969
+0.18285 0.037001 -1.1975
+0.18468 0.037142 -1.2021
+0.18637 0.037253 -1.2058
+0.18761 0.037274 -1.2064
+0.18989 0.037275 -1.2065
+0.19102 0.037275 -1.2065
+0.19112 0.037074 -1.1999
+-0.085556 0.039488 -1.3201
+-0.084152 0.039412 -1.3175
+-0.081451 0.039305 -1.3139
+-0.071159 0.039082 -1.3064
+-0.06817 0.03878 -1.2962
+-0.065196 0.038465 -1.2856
+-0.0481 0.038335 -1.2812
+-0.04692 0.038355 -1.2819
+-0.040939 0.038402 -1.2835
+-0.016769 0.038359 -1.2821
+-0.015586 0.038415 -1.284
+-0.012239 0.039306 -1.3141
+0.002626 0.03982 -1.3314
+0.084842 0.036911 -1.233
+0.085744 0.0368 -1.2293
+0.12052 0.035457 -1.1838
+0.12151 0.035418 -1.1825
+0.12258 0.035405 -1.182
+0.12369 0.035405 -1.182
+0.12503 0.035469 -1.1842
+0.12637 0.035533 -1.1863
+0.12749 0.035533 -1.1863
+0.17851 0.035907 -1.1987
+0.17964 0.035908 -1.1987
+0.18072 0.035898 -1.1984
+0.18172 0.035871 -1.1975
+0.18298 0.035899 -1.1984
+0.18647 0.036136 -1.2064
+0.18889 0.036165 -1.2074
+0.19136 0.036202 -1.2086
+0.19137 0.035991 -1.2015
+0.19216 0.035925 -1.1993
+-0.086988 0.038329 -1.323
+-0.085549 0.038242 -1.32
+-0.08278 0.038111 -1.3154
+-0.080188 0.038055 -1.3134
+-0.077552 0.037974 -1.3106
+-0.072544 0.037934 -1.3093
+-0.071297 0.037926 -1.309
+-0.069925 0.03785 -1.3063
+-0.068397 0.037685 -1.3006
+-0.06646 0.037285 -1.2866
+-0.063833 0.037165 -1.2825
+-0.061303 0.037094 -1.28
+-0.056365 0.037015 -1.2773
+-0.051591 0.037039 -1.2781
+-0.04923 0.037071 -1.2792
+-0.046876 0.037114 -1.2807
+-0.045683 0.037124 -1.2811
+-0.044474 0.037121 -1.281
+-0.042053 0.037111 -1.2806
+-0.039665 0.037132 -1.2814
+-0.0373 0.037177 -1.2829
+-0.034836 0.037124 -1.2811
+-0.032385 0.037077 -1.2795
+-0.022743 0.037058 -1.2788
+-0.020346 0.037075 -1.2794
+-0.017974 0.037148 -1.282
+-0.016786 0.037189 -1.2834
+-0.013455 0.038013 -1.3121
+-0.011005 0.038076 -1.3143
+-0.008545 0.03813 -1.3162
+0.00137 0.038443 -1.3271
+0.002624 0.03854 -1.3305
+0.084839 0.035748 -1.233
+0.086641 0.035535 -1.2256
+0.088374 0.035306 -1.2176
+0.090128 0.035096 -1.2102
+0.092035 0.034955 -1.2053
+0.094045 0.034858 -1.2019
+0.096089 0.034779 -1.1992
+0.10049 0.034739 -1.1977
+0.10272 0.034729 -1.1974
+0.10486 0.034693 -1.1961
+0.10699 0.034651 -1.1946
+0.10905 0.034591 -1.1925
+0.1132 0.034488 -1.1889
+0.11529 0.034442 -1.1873
+0.11744 0.034416 -1.1864
+0.11951 0.03437 -1.1848
+0.12183 0.034396 -1.1857
+0.12422 0.034438 -1.1871
+0.12639 0.034421 -1.1866
+0.12853 0.034394 -1.1856
+0.13064 0.034362 -1.1845
+0.16701 0.034501 -1.1891
+0.16949 0.03455 -1.1908
+0.17204 0.034611 -1.193
+0.17475 0.034703 -1.1961
+0.17737 0.034776 -1.1987
+0.17991 0.03483 -1.2006
+0.18207 0.034811 -1.1999
+0.18467 0.034873 -1.202
+0.18662 0.035028 -1.2074
+0.18795 0.035063 -1.2087
+0.19023 0.035064 -1.2087
+0.19138 0.035067 -1.2088
+0.19481 0.034865 -1.2017
+-0.086981 0.037081 -1.3229
+-0.071384 0.036738 -1.3106
+-0.068684 0.036613 -1.3061
+-0.066648 0.036175 -1.2903
+-0.06515 0.036019 -1.2847
+-0.045661 0.0359 -1.2804
+-0.019159 0.035903 -1.2806
+-0.017983 0.03596 -1.2826
+-0.01466 0.036704 -1.3095
+-0.012228 0.036799 -1.3129
+0.002622 0.037256 -1.3293
+0.003884 0.037367 -1.3333
+0.11428 0.033354 -1.1885
+0.11533 0.033334 -1.1877
+0.1164 0.033323 -1.1873
+0.1176 0.033343 -1.1881
+0.11871 0.033341 -1.188
+0.12105 0.03337 -1.189
+0.12217 0.03337 -1.189
+0.12317 0.033337 -1.1878
+0.18355 0.033743 -1.2021
+0.18683 0.033927 -1.2088
+0.18943 0.033987 -1.2109
+0.19158 0.033963 -1.21
+0.19264 0.033949 -1.2095
+0.19481 0.033929 -1.2088
+0.19512 0.033786 -1.2037
+0.19613 0.033765 -1.2029
+0.19708 0.033733 -1.2017
+-0.088469 0.035935 -1.3266
+-0.085533 0.03575 -1.3197
+-0.080241 0.035605 -1.3143
+-0.07515 0.035536 -1.3118
+-0.072678 0.035535 -1.3117
+-0.070222 0.035541 -1.3119
+-0.068917 0.035504 -1.3106
+-0.065132 0.034799 -1.2843
+-0.063804 0.034734 -1.2819
+-0.058756 0.034602 -1.277
+-0.05393 0.034589 -1.2765
+-0.04917 0.03462 -1.2777
+-0.046817 0.034659 -1.2791
+-0.04443 0.034674 -1.2797
+-0.039566 0.034632 -1.2781
+-0.03718 0.03465 -1.2788
+-0.034791 0.034667 -1.2794
+-0.029957 0.034645 -1.2786
+-0.025145 0.034645 -1.2786
+-0.02036 0.034689 -1.2803
+-0.019176 0.034727 -1.2817
+-0.018022 0.034828 -1.2855
+-0.01589 0.035467 -1.3093
+-0.013451 0.035532 -1.3117
+-0.010995 0.035567 -1.313
+-0.006069 0.035651 -1.3161
+-0.001122 0.035803 -1.3218
+0.001367 0.035883 -1.3248
+0.003879 0.036066 -1.3316
+0.005137 0.036109 -1.3332
+0.082797 0.033538 -1.2372
+0.086621 0.033219 -1.2253
+0.090107 0.032808 -1.21
+0.094035 0.03259 -1.2018
+0.096064 0.032511 -1.1988
+0.098242 0.032484 -1.1979
+0.10056 0.032504 -1.1986
+0.10273 0.032477 -1.1976
+0.10485 0.032434 -1.1959
+0.10701 0.032406 -1.1949
+0.11118 0.03231 -1.1913
+0.11339 0.032301 -1.191
+0.11557 0.032284 -1.1903
+0.11791 0.03231 -1.1913
+0.11999 0.032266 -1.1896
+0.12217 0.032249 -1.189
+0.12425 0.032208 -1.1875
+0.12848 0.032148 -1.1852
+0.13284 0.032123 -1.1842
+0.13719 0.032095 -1.1832
+0.14158 0.03208 -1.1826
+0.14599 0.03207 -1.1822
+0.15052 0.032086 -1.1828
+0.1551 0.032113 -1.1838
+0.1598 0.032161 -1.1855
+0.16458 0.032222 -1.1878
+0.16949 0.032305 -1.1908
+0.17462 0.032424 -1.1953
+0.18016 0.032611 -1.2022
+0.18269 0.032658 -1.204
+0.18382 0.032658 -1.204
+0.18523 0.032707 -1.2058
+0.18839 0.032862 -1.2115
+0.1899 0.032926 -1.2139
+0.19104 0.032926 -1.2139
+0.19295 0.032861 -1.2115
+0.19406 0.032857 -1.2113
+0.1952 0.032857 -1.2113
+0.19635 0.032857 -1.2113
+0.19656 0.032703 -1.2056
+0.19714 0.032612 -1.2021
+0.19802 0.032569 -1.2005
+-0.086928 0.034569 -1.3221
+-0.068986 0.034305 -1.3119
+-0.065094 0.033571 -1.2835
+-0.01919 0.033545 -1.2827
+-0.017066 0.034123 -1.305
+0.005132 0.034815 -1.3317
+0.08176 0.032424 -1.2392
+0.097163 0.031371 -1.1985
+0.10179 0.031406 -1.1998
+0.10278 0.031365 -1.1982
+0.1039 0.031362 -1.1981
+0.10604 0.031326 -1.1967
+0.11251 0.031244 -1.1935
+0.11363 0.031244 -1.1935
+0.1147 0.031229 -1.1929
+0.18409 0.03157 -1.2057
+0.18699 0.031676 -1.2098
+0.18876 0.031782 -1.2139
+0.18998 0.031795 -1.2144
+0.19423 0.031743 -1.2124
+0.19662 0.031759 -1.213
+0.19776 0.031759 -1.213
+0.19801 0.031616 -1.2075
+0.19844 0.031504 -1.2031
+0.19941 0.031478 -1.2021
+-0.088313 0.033378 -1.3242
+-0.085555 0.033275 -1.3201
+-0.082931 0.033218 -1.3178
+-0.072815 0.033128 -1.3142
+-0.070308 0.033111 -1.3136
+-0.068981 0.033067 -1.3118
+-0.065042 0.032336 -1.2825
+-0.063761 0.032298 -1.281
+-0.061224 0.032232 -1.2783
+-0.046756 0.032208 -1.2774
+-0.041959 0.032216 -1.2778
+-0.039504 0.032175 -1.2761
+-0.037115 0.032185 -1.2765
+-0.034766 0.032234 -1.2785
+-0.032361 0.032235 -1.2785
+-0.022762 0.03227 -1.2799
+-0.020393 0.032332 -1.2824
+-0.017115 0.03299 -1.3088
+-0.01589 0.033002 -1.3093
+-0.01344 0.033036 -1.3106
+0.001365 0.033335 -1.3226
+0.003869 0.033471 -1.3281
+0.006387 0.033579 -1.3324
+0.080607 0.031261 -1.2394
+0.082589 0.031129 -1.2341
+0.084539 0.030992 -1.2286
+0.088257 0.030677 -1.2159
+0.096055 0.030248 -1.1987
+0.097166 0.030243 -1.1985
+0.098402 0.030276 -1.1998
+0.1009 0.030349 -1.2028
+0.10301 0.030303 -1.2009
+0.10515 0.030268 -1.1995
+0.10734 0.030248 -1.1987
+0.10953 0.030228 -1.1979
+0.11162 0.030185 -1.1961
+0.11369 0.030137 -1.1942
+0.11579 0.030097 -1.1926
+0.11789 0.030058 -1.191
+0.11999 0.030024 -1.1896
+0.1221 0.029992 -1.1884
+0.18301 0.030442 -1.2061
+0.1855 0.030478 -1.2075
+0.18882 0.030647 -1.2143
+0.19142 0.030697 -1.2163
+0.19365 0.030688 -1.2159
+0.19558 0.030632 -1.2136
+0.19783 0.030626 -1.2134
+0.19893 0.030619 -1.2131
+0.19975 0.030571 -1.2112
+-0.086944 0.032086 -1.3223
+-0.071634 0.031915 -1.3152
+-0.070334 0.031887 -1.3141
+-0.065014 0.031115 -1.2819
+-0.040719 0.030984 -1.2765
+-0.039468 0.030945 -1.2749
+-0.038265 0.030942 -1.2748
+-0.035928 0.030995 -1.277
+-0.018328 0.031726 -1.3075
+-0.017114 0.031756 -1.3087
+0.097244 0.029137 -1.1995
+0.099842 0.029236 -1.2036
+0.10206 0.029222 -1.203
+0.19271 0.029573 -1.2172
+0.19387 0.029577 -1.2173
+0.1949 0.029559 -1.2166
+0.19896 0.029481 -1.2134
+-0.088414 0.030921 -1.3257
+-0.085626 0.030815 -1.3212
+-0.08044 0.030733 -1.3176
+-0.075414 0.030705 -1.3164
+-0.072941 0.030707 -1.3165
+-0.071703 0.030706 -1.3165
+-0.070402 0.030679 -1.3153
+-0.066349 0.029966 -1.2845
+-0.063756 0.029884 -1.2809
+-0.058735 0.029782 -1.2765
+-0.053882 0.029755 -1.2753
+-0.049095 0.029763 -1.2757
+-0.044351 0.029802 -1.2774
+-0.041958 0.029809 -1.2777
+-0.039493 0.029763 -1.2757
+-0.037081 0.029754 -1.2753
+-0.034749 0.029812 -1.2779
+-0.029964 0.029836 -1.2789
+-0.025166 0.029855 -1.2797
+-0.02279 0.029895 -1.2815
+-0.019554 0.030491 -1.3073
+-0.01833 0.0305 -1.3077
+-0.015881 0.030521 -1.3086
+-0.010976 0.030572 -1.3108
+-0.006054 0.030623 -1.313
+-0.001119 0.030738 -1.318
+0.001363 0.030802 -1.3207
+0.003861 0.030908 -1.3253
+0.006374 0.031004 -1.3295
+0.078262 0.028922 -1.2392
+0.082347 0.02872 -1.2304
+0.084349 0.028613 -1.2258
+0.086256 0.028481 -1.2201
+0.090027 0.028223 -1.2089
+0.093989 0.028046 -1.2012
+0.096142 0.028015 -1.1998
+0.097272 0.028015 -1.1998
+0.098782 0.028123 -1.2045
+0.10004 0.028159 -1.2061
+0.10114 0.028148 -1.2056
+0.10313 0.028072 -1.2023
+0.10514 0.028004 -1.1993
+0.10726 0.027968 -1.1978
+0.11163 0.027932 -1.1962
+0.11583 0.027859 -1.193
+0.12005 0.027795 -1.1902
+0.12429 0.027742 -1.1879
+0.12858 0.027702 -1.1861
+0.13291 0.027671 -1.1848
+0.13721 0.027639 -1.1834
+0.14161 0.027628 -1.1829
+0.14602 0.027619 -1.1825
+0.15053 0.027629 -1.1829
+0.15514 0.027657 -1.1841
+0.15987 0.027702 -1.186
+0.1647 0.027764 -1.1887
+0.16968 0.027846 -1.1922
+0.17488 0.027959 -1.1971
+0.18023 0.02809 -1.2027
+0.18267 0.028117 -1.2039
+0.18551 0.028204 -1.2076
+0.1885 0.02831 -1.2122
+0.19147 0.028413 -1.2167
+0.19397 0.028443 -1.2179
+0.19519 0.028453 -1.2184
+0.19621 0.028435 -1.2176
+0.19817 0.028388 -1.2155
+0.2003 0.028365 -1.2145
+-0.08705 0.029633 -1.324
+-0.071764 0.029493 -1.3177
+-0.065027 0.028707 -1.2822
+-0.0359 0.028568 -1.276
+-0.024004 0.028699 -1.282
+-0.020778 0.029251 -1.3069
+-0.019553 0.029258 -1.3072
+-0.017108 0.029282 -1.3083
+0.007627 0.029763 -1.33
+0.077069 0.027746 -1.2388
+0.085216 0.027366 -1.2217
+0.097364 0.02691 -1.201
+0.10004 0.027022 -1.206
+0.10225 0.027004 -1.2052
+0.18386 0.02699 -1.2042
+0.19524 0.027313 -1.2187
+0.19961 0.027283 -1.2174
+0.20065 0.027268 -1.2167
+0.20173 0.027259 -1.2163
+0.20287 0.027259 -1.2163
+0.20408 0.027267 -1.2166
+0.20557 0.027312 -1.2187
+0.21222 0.027431 -1.224
+0.21504 0.027497 -1.2269
+-0.088427 0.028429 -1.3259
+-0.085761 0.028372 -1.3233
+-0.083097 0.028313 -1.3205
+-0.080546 0.02829 -1.3194
+-0.078049 0.028284 -1.3191
+-0.073062 0.028275 -1.3187
+-0.070539 0.028258 -1.3179
+-0.066322 0.027536 -1.2839
+-0.0638 0.027491 -1.2818
+-0.061213 0.027412 -1.2781
+-0.041948 0.027397 -1.2774
+-0.03706 0.027337 -1.2746
+-0.03587 0.027344 -1.2749
+-0.034721 0.027384 -1.2768
+-0.03236 0.027419 -1.2785
+-0.029967 0.027431 -1.279
+-0.027588 0.027459 -1.2804
+-0.025226 0.02751 -1.2828
+-0.024084 0.027584 -1.2863
+-0.021999 0.028011 -1.3064
+-0.020779 0.028024 -1.307
+-0.018327 0.028034 -1.3075
+-0.015877 0.028049 -1.3082
+-0.01342 0.028059 -1.3087
+0.001362 0.028286 -1.3194
+0.006363 0.028454 -1.3273
+0.007621 0.028492 -1.3291
+0.078002 0.0265 -1.2351
+0.080089 0.026421 -1.2314
+0.082137 0.026334 -1.2273
+0.084119 0.026232 -1.2224
+0.085115 0.026184 -1.2202
+0.086053 0.02612 -1.2172
+0.087964 0.026008 -1.2119
+0.089894 0.025906 -1.2071
+0.091883 0.025827 -1.2033
+0.093959 0.025775 -1.2008
+0.096184 0.025765 -1.2004
+0.098927 0.025891 -1.2063
+0.10116 0.025881 -1.2058
+0.10222 0.025861 -1.2049
+0.10324 0.025834 -1.2036
+0.10523 0.025766 -1.2004
+0.10718 0.025691 -1.1969
+0.10931 0.025662 -1.1955
+0.11154 0.025657 -1.1952
+0.11374 0.025645 -1.1947
+0.17233 0.025658 -1.195
+0.17506 0.025728 -1.1983
+0.17772 0.025787 -1.201
+0.18008 0.0258 -1.2017
+0.18263 0.025842 -1.2036
+0.18571 0.025955 -1.2089
+0.18836 0.026007 -1.2114
+0.19108 0.026067 -1.2142
+0.19388 0.026136 -1.2174
+0.19661 0.026194 -1.2201
+0.19915 0.026225 -1.2216
+0.2013 0.026205 -1.2206
+0.20332 0.02617 -1.219
+0.20559 0.026167 -1.2188
+0.20678 0.026172 -1.219
+0.20796 0.026176 -1.2192
+0.21047 0.026203 -1.2205
+0.21337 0.026276 -1.2239
+0.21457 0.026282 -1.2242
+-0.087176 0.02718 -1.3259
+-0.084506 0.027124 -1.3231
+-0.083148 0.027087 -1.3213
+-0.081851 0.027069 -1.3204
+-0.071951 0.027082 -1.3211
+-0.065084 0.026315 -1.2833
+-0.035854 0.026132 -1.2744
+-0.028791 0.026252 -1.2803
+-0.027612 0.026276 -1.2815
+-0.026431 0.026301 -1.2827
+-0.023206 0.026757 -1.3052
+-0.021997 0.026779 -1.3063
+0.007617 0.027226 -1.3283
+0.008879 0.027266 -1.3303
+0.078926 0.02526 -1.2313
+0.079974 0.025225 -1.2296
+0.081001 0.025184 -1.2276
+0.084949 0.024986 -1.2178
+0.088755 0.024768 -1.207
+0.095059 0.024635 -1.2004
+0.096322 0.024669 -1.2021
+0.097888 0.024779 -1.2075
+0.10015 0.024777 -1.2074
+0.10222 0.024728 -1.205
+0.1738 0.024581 -1.1974
+0.18128 0.024678 -1.2022
+0.18432 0.024781 -1.2072
+0.19248 0.024955 -1.2158
+0.19375 0.024971 -1.2165
+0.19522 0.025013 -1.2186
+0.19669 0.025054 -1.2206
+0.19796 0.02507 -1.2214
+0.20071 0.025126 -1.2242
+0.2022 0.025167 -1.2262
+0.20294 0.025116 -1.2237
+0.20386 0.025087 -1.2222
+0.20478 0.02506 -1.2209
+0.20566 0.025026 -1.2192
+0.20679 0.025024 -1.2191
+0.2079 0.025019 -1.2189
+0.20911 0.025026 -1.2192
+0.21033 0.025036 -1.2197
+0.21161 0.025051 -1.2204
+0.2129 0.025068 -1.2212
+0.21406 0.025068 -1.2212
+-0.087289 0.025966 -1.3276
+-0.085987 0.02595 -1.3268
+-0.083303 0.025891 -1.3238
+-0.080737 0.025867 -1.3225
+-0.075703 0.025847 -1.3215
+-0.073243 0.025856 -1.322
+-0.072055 0.025876 -1.323
+-0.070717 0.025842 -1.3213
+-0.06378 0.025069 -1.2814
+-0.061185 0.024994 -1.2775
+-0.058729 0.024972 -1.2764
+-0.053886 0.024954 -1.2755
+-0.049081 0.024951 -1.2753
+-0.044311 0.024968 -1.2762
+-0.039542 0.024989 -1.2773
+-0.037053 0.024932 -1.2744
+-0.034716 0.024976 -1.2766
+-0.032367 0.025017 -1.2788
+-0.029992 0.025043 -1.2801
+-0.028814 0.025066 -1.2813
+-0.023209 0.025531 -1.3053
+-0.02077 0.025552 -1.3064
+-0.015867 0.025572 -1.3074
+-0.010964 0.025609 -1.3094
+-0.006045 0.025638 -1.3108
+-0.001116 0.025719 -1.315
+0.00385 0.025846 -1.3216
+0.006354 0.02592 -1.3254
+0.008877 0.026008 -1.33
+0.077721 0.024086 -1.2306
+0.078812 0.024065 -1.2295
+0.079812 0.024018 -1.2271
+0.081775 0.023917 -1.2218
+0.083785 0.023834 -1.2175
+0.085772 0.023749 -1.2132
+0.087748 0.023666 -1.2089
+0.089757 0.023596 -1.2052
+0.093967 0.023514 -1.2009
+0.095098 0.023514 -1.2009
+0.096733 0.023637 -1.2073
+0.099055 0.023648 -1.2079
+0.10123 0.023625 -1.2067
+0.10323 0.023563 -1.2035
+0.10736 0.023475 -1.1989
+0.10935 0.023416 -1.1959
+0.11149 0.023395 -1.1947
+0.11592 0.02338 -1.1939
+0.12018 0.023334 -1.1916
+0.12446 0.023295 -1.1895
+0.12872 0.023255 -1.1875
+0.13301 0.023223 -1.1858
+0.13735 0.023201 -1.1846
+0.14174 0.023189 -1.184
+0.14618 0.023185 -1.1837
+0.15069 0.023194 -1.1842
+0.15532 0.023218 -1.1854
+0.16004 0.023255 -1.1873
+0.16491 0.023312 -1.1902
+0.16994 0.023387 -1.194
+0.17259 0.023441 -1.1969
+0.174 0.02348 -1.1988
+0.17519 0.023487 -1.1992
+0.18005 0.023532 -1.2015
+0.18128 0.023544 -1.2021
+0.18286 0.023602 -1.2051
+0.18581 0.023689 -1.2096
+0.18869 0.023765 -1.2135
+0.19126 0.0238 -1.2153
+0.19375 0.023825 -1.2166
+0.19647 0.023877 -1.2192
+0.19936 0.023948 -1.2229
+0.20103 0.024009 -1.2261
+0.20219 0.024011 -1.2262
+0.20334 0.02401 -1.2261
+0.20662 0.023855 -1.2181
+-0.087298 0.024719 -1.3278
+-0.08473 0.024698 -1.3267
+-0.08212 0.024664 -1.3248
+-0.072108 0.024649 -1.324
+-0.070862 0.024649 -1.324
+-0.062444 0.023813 -1.2787
+-0.059971 0.023787 -1.2773
+-0.03835 0.023793 -1.2777
+-0.037123 0.023777 -1.2768
+-0.035921 0.023777 -1.2768
+-0.031187 0.023831 -1.2797
+-0.030008 0.023851 -1.2808
+-0.025646 0.024285 -1.3044
+-0.024435 0.0243 -1.3052
+-0.021989 0.02431 -1.3058
+0.007605 0.024686 -1.3262
+0.010149 0.024807 -1.3327
+0.078646 0.022859 -1.2269
+0.080621 0.022764 -1.2218
+0.095339 0.022439 -1.204
+0.098074 0.022546 -1.2098
+0.17394 0.022342 -1.1984
+0.18143 0.02243 -1.2032
+0.18439 0.022514 -1.2077
+0.1875 0.022615 -1.2132
+0.19021 0.022666 -1.2159
+0.19765 0.022732 -1.2194
+0.19912 0.022768 -1.2214
+0.20061 0.022807 -1.2235
+0.20218 0.022854 -1.2261
+-0.08602 0.023461 -1.3273
+-0.084763 0.023459 -1.3272
+-0.083514 0.023459 -1.3272
+-0.080936 0.023435 -1.3258
+-0.078414 0.023427 -1.3254
+-0.075914 0.023424 -1.3253
+-0.073478 0.023442 -1.3263
+-0.071122 0.023488 -1.3289
+-0.062436 0.022606 -1.2785
+-0.061186 0.022589 -1.2775
+-0.058763 0.022581 -1.2771
+-0.056336 0.022572 -1.2766
+-0.051472 0.022546 -1.2751
+-0.041929 0.022576 -1.2768
+-0.039565 0.022597 -1.2781
+-0.038371 0.022603 -1.2784
+-0.037158 0.022596 -1.278
+-0.034733 0.022583 -1.2773
+-0.032355 0.022601 -1.2783
+-0.031205 0.022639 -1.2805
+-0.026879 0.023062 -1.3047
+-0.025657 0.023067 -1.3049
+-0.02321 0.023075 -1.3054
+-0.020759 0.02308 -1.3057
+-0.01831 0.02309 -1.3062
+0.001359 0.023266 -1.3163
+0.006346 0.023394 -1.3236
+0.0076 0.023423 -1.3253
+0.008865 0.023472 -1.3281
+0.010146 0.023547 -1.3324
+0.077374 0.02167 -1.225
+0.079436 0.021604 -1.2212
+0.081461 0.021531 -1.2171
+0.083484 0.021462 -1.2131
+0.087603 0.021353 -1.2068
+0.091816 0.021276 -1.2024
+0.094175 0.021297 -1.2036
+0.095686 0.021382 -1.2085
+0.097037 0.021429 -1.2111
+0.09922 0.021408 -1.2099
+0.10134 0.021374 -1.208
+0.10955 0.021201 -1.1981
+0.15777 0.021012 -1.1871
+0.16754 0.021116 -1.193
+0.17017 0.021164 -1.1957
+0.17265 0.021192 -1.1973
+0.17507 0.021212 -1.1984
+0.17748 0.021231 -1.1994
+0.1801 0.021273 -1.2019
+0.18304 0.021351 -1.2063
+0.18625 0.021459 -1.2125
+0.1878 0.021506 -1.2151
+0.18901 0.021514 -1.2156
+0.19135 0.021519 -1.2159
+0.19375 0.021531 -1.2165
+0.19621 0.02155 -1.2176
+0.19747 0.021563 -1.2183
+-0.083549 0.022219 -1.3277
+-0.082268 0.02221 -1.3272
+-0.079757 0.022206 -1.327
+-0.077251 0.022203 -1.3268
+-0.061191 0.021388 -1.2777
+-0.059981 0.021385 -1.2775
+-0.038376 0.021402 -1.2785
+-0.037155 0.021391 -1.2779
+-0.035931 0.021379 -1.2772
+-0.031266 0.021475 -1.283
+-0.029266 0.021784 -1.3016
+-0.028106 0.021834 -1.3047
+-0.026882 0.021837 -1.3048
+0.007596 0.022163 -1.3245
+0.010143 0.022286 -1.332
+0.01143 0.022353 -1.336
+0.093016 0.020158 -1.2033
+0.095892 0.020287 -1.2111
+0.098186 0.02029 -1.2112
+0.18489 0.020293 -1.2111
+0.18657 0.020352 -1.2146
+0.18781 0.020362 -1.2152
+0.19011 0.020363 -1.2153
+0.19495 0.020391 -1.2169
+0.19612 0.020393 -1.217
+-0.081023 0.020961 -1.3273
+-0.079777 0.020962 -1.3273
+-0.07855 0.020968 -1.3277
+-0.076109 0.020983 -1.3287
+-0.073713 0.021013 -1.3306
+-0.071318 0.021045 -1.3326
+-0.061223 0.020195 -1.2783
+-0.058801 0.02019 -1.278
+-0.056405 0.020193 -1.2782
+-0.053939 0.02017 -1.2767
+-0.05152 0.020163 -1.2763
+-0.049099 0.020156 -1.2758
+-0.044322 0.020167 -1.2765
+-0.041943 0.020178 -1.2773
+-0.039572 0.020195 -1.2783
+-0.037151 0.020186 -1.2778
+-0.034699 0.020159 -1.276
+-0.032351 0.020191 -1.2781
+-0.031378 0.02034 -1.2877
+-0.029325 0.0206 -1.3043
+-0.028105 0.020605 -1.3046
+-0.025656 0.02061 -1.3049
+-0.020753 0.020616 -1.3053
+-0.015853 0.02063 -1.3062
+-0.010957 0.020666 -1.3085
+-0.006038 0.02068 -1.3094
+-0.001115 0.020736 -1.313
+0.001357 0.020767 -1.315
+0.003841 0.020824 -1.3186
+0.006339 0.020881 -1.3223
+0.008862 0.020966 -1.3277
+0.011423 0.021083 -1.3352
+0.077091 0.019292 -1.2205
+0.079113 0.019224 -1.2162
+0.081185 0.019173 -1.2129
+0.085426 0.0191 -1.2082
+0.089663 0.019034 -1.2039
+0.091879 0.019023 -1.2033
+0.09313 0.019047 -1.2048
+0.094578 0.01911 -1.2088
+0.097084 0.019156 -1.2117
+0.098178 0.019147 -1.2111
+0.099268 0.019137 -1.2105
+0.10137 0.019103 -1.2083
+0.10343 0.019064 -1.2058
+0.10754 0.018987 -1.2009
+0.11177 0.018938 -1.1978
+0.11586 0.01887 -1.1934
+0.12022 0.018847 -1.1919
+0.12461 0.018833 -1.191
+0.1289 0.018805 -1.1891
+0.13322 0.018782 -1.1877
+0.1376 0.018768 -1.1868
+0.14198 0.018757 -1.186
+0.14642 0.018754 -1.1858
+0.15096 0.018762 -1.1863
+0.1556 0.018782 -1.1876
+0.15798 0.018799 -1.1886
+0.16039 0.01882 -1.19
+0.1653 0.018868 -1.193
+0.17014 0.018907 -1.1954
+0.1725 0.018918 -1.1962
+0.17497 0.018942 -1.1977
+0.1802 0.019018 -1.2025
+0.18352 0.019127 -1.2095
+0.18521 0.019184 -1.2132
+0.18643 0.019193 -1.2137
+0.18881 0.019202 -1.2142
+0.19116 0.019208 -1.2147
+0.19364 0.019228 -1.2159
+0.19492 0.019241 -1.2167
+0.1959 0.019224 -1.2156
+-0.078571 0.019723 -1.328
+-0.077365 0.019734 -1.3288
+-0.076169 0.019748 -1.3298
+-0.074957 0.019759 -1.3305
+-0.073732 0.019766 -1.3309
+-0.072524 0.019777 -1.3317
+-0.070018 0.019777 -1.3317
+-0.060028 0.018994 -1.2785
+-0.058825 0.018994 -1.2785
+-0.057651 0.019004 -1.2791
+-0.056503 0.019022 -1.2804
+-0.055259 0.019009 -1.2795
+-0.052747 0.018971 -1.277
+-0.050342 0.01897 -1.2769
+-0.040772 0.01899 -1.2782
+-0.03838 0.018996 -1.2787
+-0.035946 0.018981 -1.2777
+-0.034698 0.018957 -1.276
+-0.033536 0.018978 -1.2774
+-0.031384 0.019132 -1.2879
+-0.030476 0.019324 -1.301
+-0.029326 0.019373 -1.3043
+-0.02688 0.019378 -1.3047
+0.077964 0.018078 -1.2161
+0.079987 0.018018 -1.212
+0.090752 0.01789 -1.2033
+0.091898 0.017893 -1.2035
+0.093092 0.017905 -1.2043
+0.099198 0.017984 -1.2097
+0.10023 0.017964 -1.2083
+0.10241 0.017948 -1.2072
+0.15932 0.017703 -1.1903
+0.17123 0.017776 -1.1952
+0.17372 0.0178 -1.1968
+0.18207 0.017957 -1.2074
+0.18511 0.018031 -1.2125
+0.18634 0.01804 -1.2131
+0.18747 0.018039 -1.213
+-0.07122 0.018511 -1.3308
+-0.069956 0.018507 -1.3305
+-0.061266 0.017801 -1.2792
+-0.060062 0.017801 -1.2792
+-0.058998 0.017843 -1.2823
+-0.057885 0.017872 -1.2844
+-0.056677 0.017872 -1.2844
+-0.055423 0.017857 -1.2833
+-0.054014 0.017791 -1.2785
+-0.052778 0.01778 -1.2777
+-0.051576 0.017779 -1.2777
+-0.049182 0.017783 -1.278
+-0.046773 0.017782 -1.2779
+-0.044373 0.017784 -1.278
+-0.041985 0.017791 -1.2786
+-0.040792 0.017795 -1.2789
+-0.039592 0.017797 -1.279
+-0.038429 0.017815 -1.2803
+-0.037225 0.017815 -1.2803
+-0.034792 0.017803 -1.2795
+-0.032417 0.017821 -1.2808
+-0.031382 0.017918 -1.2878
+-0.030477 0.0181 -1.301
+-0.029323 0.018144 -1.3042
+-0.028102 0.018147 -1.3045
+-0.025655 0.018152 -1.3048
+-0.023201 0.018152 -1.3049
+0.001356 0.018279 -1.314
+0.003837 0.018322 -1.3172
+0.006333 0.018374 -1.3209
+0.011409 0.018548 -1.3336
+0.07789 0.016916 -1.215
+0.078842 0.016875 -1.212
+0.079802 0.016837 -1.2092
+0.080921 0.016833 -1.2089
+0.083112 0.016815 -1.2076
+0.085308 0.0168 -1.2065
+0.087451 0.016775 -1.2047
+0.089619 0.016757 -1.2033
+0.090748 0.016756 -1.2033
+0.10132 0.016818 -1.2077
+0.10355 0.01681 -1.2072
+0.10563 0.01678 -1.205
+0.1077 0.016749 -1.2027
+0.10975 0.016717 -1.2004
+0.15821 0.016583 -1.1904
+0.15943 0.016594 -1.1912
+0.16059 0.016597 -1.1914
+0.16301 0.016615 -1.1927
+0.16535 0.016625 -1.1934
+0.16769 0.016634 -1.1941
+0.17006 0.016645 -1.1949
+0.17122 0.016648 -1.1951
+0.17255 0.016669 -1.1966
+0.17524 0.016709 -1.1995
+0.17774 0.016733 -1.2012
+0.18069 0.016796 -1.2058
+0.18249 0.016857 -1.2102
+0.18375 0.016869 -1.2111
+-0.061448 0.016645 -1.2831
+-0.060241 0.016645 -1.2831
+-0.058149 0.016738 -1.2903
+-0.056935 0.016738 -1.2903
+-0.055693 0.01673 -1.2897
+-0.054211 0.016647 -1.2832
+-0.047984 0.016582 -1.2781
+-0.046775 0.016579 -1.2779
+-0.045576 0.01658 -1.278
+-0.044392 0.016587 -1.2786
+-0.043195 0.01659 -1.2788
+-0.041992 0.01659 -1.2788
+-0.039631 0.016609 -1.2803
+-0.037446 0.016708 -1.288
+-0.036234 0.016708 -1.288
+-0.034812 0.016608 -1.2802
+-0.033619 0.016614 -1.2807
+-0.032522 0.016669 -1.285
+-0.031384 0.016707 -1.2879
+-0.029326 0.016917 -1.3043
+-0.026876 0.01692 -1.3045
+0.076276 0.016156 -1.245
+0.077344 0.016135 -1.2433
+0.07866 0.015697 -1.2092
+0.079749 0.015687 -1.2084
+0.086313 0.01564 -1.2047
+0.087398 0.015631 -1.204
+0.088482 0.015622 -1.2033
+0.090611 0.015599 -1.2015
+0.10242 0.015674 -1.2073
+0.10354 0.015671 -1.2071
+0.10459 0.015659 -1.2061
+0.10674 0.015641 -1.2047
+0.15946 0.015473 -1.1914
+0.1665 0.015502 -1.1936
+0.16767 0.015506 -1.1939
+0.16887 0.015513 -1.1944
+0.17142 0.01554 -1.1965
+0.17403 0.015572 -1.199
+0.17931 0.015639 -1.2042
+0.18088 0.015676 -1.2071
+-0.059468 0.015551 -1.2926
+-0.057039 0.015552 -1.2927
+-0.055841 0.015557 -1.2931
+-0.053183 0.015492 -1.2876
+-0.045704 0.01542 -1.2817
+-0.044498 0.01542 -1.2817
+-0.04335 0.015441 -1.2834
+-0.030543 0.015685 -1.3039
+-0.028098 0.015689 -1.3043
+-0.025646 0.01569 -1.3044
+-0.020747 0.015697 -1.3049
+-0.015849 0.015708 -1.3059
+-0.010946 0.015723 -1.3071
+-0.006035 0.015742 -1.3087
+-0.001113 0.015773 -1.3114
+0.003835 0.015835 -1.3166
+0.00633 0.01588 -1.3203
+0.008848 0.015942 -1.3255
+0.011396 0.016019 -1.332
+0.075099 0.014983 -1.2449
+0.076217 0.014972 -1.244
+0.077243 0.014944 -1.2416
+0.078637 0.014553 -1.2088
+0.079608 0.014523 -1.2062
+0.080757 0.014525 -1.2064
+0.082996 0.01452 -1.2059
+0.085154 0.0145 -1.2043
+0.087272 0.014476 -1.2022
+0.088344 0.014466 -1.2014
+0.089312 0.014439 -1.1992
+0.10461 0.014525 -1.2063
+0.10572 0.014521 -1.206
+0.10787 0.014505 -1.2047
+0.10999 0.014485 -1.203
+0.11197 0.014449 -1.1999
+0.11617 0.014409 -1.1965
+0.12036 0.014371 -1.1933
+0.12461 0.014344 -1.191
+0.12909 0.014343 -1.1909
+0.13351 0.014335 -1.1902
+0.1379 0.014325 -1.1894
+0.14232 0.01432 -1.1889
+0.14681 0.01432 -1.1889
+0.15134 0.014325 -1.1893
+0.15599 0.01434 -1.1906
+0.15831 0.014348 -1.1912
+0.16062 0.014353 -1.1916
+0.16295 0.014362 -1.1923
+0.16535 0.014374 -1.1934
+0.16773 0.014386 -1.1944
+0.1703 0.014413 -1.1966
+0.17288 0.01444 -1.1989
+0.17542 0.014463 -1.2008
+0.17814 0.014501 -1.2039
+0.17939 0.01451 -1.2047
+-0.061973 0.014351 -1.2942
+-0.060717 0.014342 -1.2933
+-0.05586 0.014344 -1.2936
+-0.054669 0.014351 -1.2942
+-0.05354 0.014375 -1.2964
+-0.052554 0.014439 -1.3022
+-0.042741 0.014435 -1.3018
+-0.041561 0.01445 -1.3032
+-0.039158 0.014468 -1.3049
+-0.037928 0.014467 -1.3048
+-0.036699 0.014467 -1.3048
+-0.031776 0.01446 -1.3041
+0.00758 0.014654 -1.3219
+0.012684 0.014807 -1.3358
+0.075041 0.0138 -1.2439
+0.07719 0.013765 -1.2408
+0.078061 0.013713 -1.236
+0.078468 0.013386 -1.2062
+0.079527 0.013373 -1.205
+0.083905 0.013347 -1.2027
+0.087989 0.01328 -1.1965
+0.10571 0.013384 -1.2059
+0.10682 0.01338 -1.2056
+0.10905 0.013375 -1.2051
+0.11116 0.013356 -1.2034
+0.16178 0.013233 -1.1919
+0.16295 0.013237 -1.1923
+0.16422 0.013249 -1.1933
+0.17692 0.013359 -1.2033
+0.17813 0.013365 -1.2039
+-0.063203 0.013135 -1.2944
+-0.061946 0.013127 -1.2936
+-0.059491 0.013122 -1.2931
+-0.057058 0.013122 -1.2931
+-0.054754 0.013153 -1.2962
+-0.053773 0.013212 -1.3021
+-0.052697 0.013249 -1.3058
+-0.051616 0.013287 -1.3096
+-0.044135 0.01326 -1.3069
+-0.0429 0.013258 -1.3067
+-0.040424 0.013253 -1.3061
+-0.037932 0.01324 -1.3049
+-0.035474 0.013239 -1.3048
+-0.033008 0.013235 -1.3044
+-0.030549 0.013233 -1.3042
+-0.028098 0.013234 -1.3043
+0.006327 0.013389 -1.3197
+0.007579 0.013407 -1.3216
+0.008843 0.01344 -1.3249
+0.011384 0.013497 -1.3306
+0.012665 0.013529 -1.3337
+0.076026 0.012597 -1.2408
+0.079482 0.012231 -1.2043
+0.08046 0.012207 -1.2019
+0.082681 0.012201 -1.2013
+0.083649 0.012177 -1.199
+0.084701 0.012166 -1.1978
+0.086798 0.012144 -1.1956
+0.088654 0.01209 -1.1903
+0.090561 0.012045 -1.1858
+0.10795 0.012244 -1.2055
+0.10906 0.012241 -1.2053
+0.11018 0.012239 -1.2051
+0.11125 0.012233 -1.2044
+0.11224 0.012217 -1.2028
+0.11422 0.012186 -1.1998
+0.12695 0.012107 -1.1919
+0.12908 0.012097 -1.1908
+0.13128 0.012093 -1.1904
+0.14918 0.01209 -1.19
+0.15368 0.012091 -1.1901
+0.15595 0.012093 -1.1903
+0.15827 0.012099 -1.1909
+0.16061 0.012106 -1.1916
+0.16177 0.012109 -1.1919
+0.16312 0.012126 -1.1936
+0.16562 0.012144 -1.1953
+0.16816 0.012165 -1.1974
+0.17309 0.012195 -1.2003
+0.17563 0.012215 -1.2023
+0.18514 0.011951 -1.176
+0.18897 0.012054 -1.1862
+0.19161 0.01208 -1.1888
+0.19322 0.01211 -1.1918
+0.19435 0.01211 -1.1918
+0.19653 0.012107 -1.1915
+0.19891 0.012115 -1.1922
+0.20116 0.012115 -1.1923
+-0.06319 0.011914 -1.2941
+-0.060717 0.011907 -1.2933
+-0.055867 0.01191 -1.2937
+-0.053833 0.012 -1.3035
+-0.052838 0.012052 -1.3093
+-0.051616 0.012055 -1.3096
+-0.050393 0.012057 -1.3098
+-0.049138 0.012051 -1.3092
+-0.047892 0.012047 -1.3088
+-0.046645 0.012043 -1.3083
+-0.045412 0.012043 -1.3083
+-0.044168 0.012039 -1.3079
+-0.041667 0.012027 -1.3066
+0.007577 0.01216 -1.3212
+0.012658 0.012268 -1.333
+0.081284 0.011033 -1.1974
+0.082329 0.011022 -1.1961
+0.083374 0.011011 -1.195
+0.085581 0.011005 -1.1943
+0.086614 0.010994 -1.1931
+0.087529 0.010968 -1.1902
+0.0913 0.010883 -1.1809
+0.092274 0.010866 -1.1791
+0.11017 0.011104 -1.205
+0.1113 0.011103 -1.205
+0.15713 0.010976 -1.1908
+0.15828 0.010977 -1.1909
+0.15948 0.010983 -1.1916
+0.16207 0.011006 -1.1941
+0.16457 0.011023 -1.1959
+0.18137 0.010949 -1.1877
+0.18221 0.010932 -1.1859
+0.18305 0.010916 -1.1841
+0.18417 0.010916 -1.1841
+0.18473 0.010883 -1.1805
+0.1871 0.010892 -1.1814
+0.19027 0.010946 -1.1874
+0.19275 0.01096 -1.1888
+0.19494 0.010957 -1.1885
+0.20185 0.010967 -1.1897
+0.20299 0.010969 -1.1898
+0.20423 0.010975 -1.1905
+0.20541 0.010978 -1.1908
+0.2066 0.010982 -1.1912
+-0.063194 0.010697 -1.2942
+-0.061952 0.010692 -1.2937
+-0.0595 0.010689 -1.2933
+-0.057076 0.010691 -1.2935
+-0.055887 0.010696 -1.2942
+-0.054786 0.010719 -1.297
+-0.053861 0.010778 -1.3042
+-0.052832 0.010819 -1.3092
+-0.050396 0.010824 -1.3099
+-0.047897 0.010817 -1.3089
+-0.045421 0.010813 -1.3085
+-0.042923 0.010804 -1.3074
+-0.040432 0.010796 -1.3064
+-0.035478 0.010784 -1.305
+-0.030551 0.010778 -1.3043
+-0.025647 0.010779 -1.3044
+-0.020744 0.010782 -1.3047
+-0.015834 0.010781 -1.3046
+-0.010943 0.010799 -1.3068
+-0.006033 0.010811 -1.3083
+-0.001113 0.010831 -1.3108
+0.003832 0.010868 -1.3153
+0.006323 0.010897 -1.3188
+0.008839 0.010941 -1.3241
+0.011378 0.010987 -1.3298
+0.012651 0.011007 -1.3323
+0.080979 0.009867 -1.1928
+0.082109 0.009868 -1.1929
+0.08433 0.009865 -1.1925
+0.085413 0.009861 -1.192
+0.086285 0.009832 -1.1885
+0.087405 0.009832 -1.1885
+0.088317 0.009809 -1.1857
+0.090328 0.009785 -1.1827
+0.092192 0.009747 -1.178
+0.1113 0.009967 -1.2049
+0.11238 0.009963 -1.2043
+0.11445 0.009945 -1.2022
+0.11646 0.009924 -1.1996
+0.12063 0.009895 -1.1961
+0.12494 0.009879 -1.1941
+0.12934 0.009872 -1.1932
+0.13361 0.009856 -1.1912
+0.13793 0.009844 -1.1897
+0.14244 0.009845 -1.1899
+0.14693 0.009846 -1.19
+0.14917 0.009846 -1.1899
+0.15141 0.009846 -1.1899
+0.15366 0.009846 -1.19
+0.156 0.009853 -1.1907
+0.15852 0.00987 -1.1928
+0.16102 0.009885 -1.1947
+0.16351 0.0099 -1.1964
+0.16586 0.009906 -1.1971
+0.16831 0.009917 -1.1985
+0.1708 0.00993 -1.2001
+0.17322 0.009939 -1.2012
+0.18026 0.00983 -1.1878
+0.1822 0.009814 -1.1858
+0.18449 0.009817 -1.1862
+0.18657 0.009809 -1.1852
+0.18884 0.009811 -1.1854
+0.19124 0.009819 -1.1865
+0.19352 0.009821 -1.1867
+0.19574 0.009821 -1.1866
+0.20028 0.009824 -1.187
+0.20253 0.009825 -1.187
+0.20489 0.009831 -1.1878
+0.20733 0.00984 -1.1889
+0.20976 0.009849 -1.19
+0.2109 0.00985 -1.1901
+-0.063207 0.00948 -1.2945
+-0.060732 0.009474 -1.2937
+-0.055907 0.009481 -1.2947
+-0.053822 0.009544 -1.3033
+-0.051615 0.009589 -1.3095
+0.01265 0.009752 -1.3321
+0.080931 0.008738 -1.1921
+0.083103 0.00873 -1.191
+0.085209 0.008716 -1.1891
+0.08736 0.008708 -1.1879
+0.089295 0.008678 -1.1838
+0.090165 0.008655 -1.1806
+0.091185 0.008646 -1.1794
+0.091909 0.00861 -1.1744
+0.092764 0.008587 -1.1711
+0.093692 0.008571 -1.1689
+0.094793 0.008571 -1.1689
+0.095894 0.008571 -1.1689
+0.09885 0.008636 -1.178
+0.10008 0.008647 -1.1795
+0.11237 0.008827 -1.2043
+0.1135 0.008827 -1.2042
+0.11557 0.008811 -1.2021
+0.15029 0.008724 -1.1899
+0.15141 0.008724 -1.1899
+0.15255 0.008725 -1.19
+0.15505 0.00874 -1.192
+0.16967 0.008799 -1.2002
+0.17094 0.008806 -1.2011
+0.17207 0.008806 -1.2011
+0.17981 0.008688 -1.1848
+0.18097 0.008691 -1.1851
+0.21045 0.008709 -1.1875
+0.21165 0.008713 -1.188
+0.21288 0.008717 -1.1886
+0.21403 0.008719 -1.1888
+-0.13654 0.008352 -1.3086
+-0.13411 0.008354 -1.3089
+-0.13171 0.008358 -1.3096
+-0.063218 0.008263 -1.2947
+-0.061974 0.008259 -1.2942
+-0.059514 0.008256 -1.2936
+-0.057097 0.008258 -1.294
+-0.054772 0.008275 -1.2967
+-0.052775 0.008345 -1.3077
+-0.050392 0.008358 -1.3098
+-0.047913 0.008355 -1.3094
+-0.04294 0.008346 -1.3079
+-0.003575 0.008355 -1.3094
+0.006324 0.008417 -1.3192
+0.008832 0.008442 -1.3232
+0.011374 0.008481 -1.3294
+0.012656 0.008503 -1.3328
+0.078813 0.007627 -1.1941
+0.079855 0.007619 -1.1928
+0.081912 0.007602 -1.19
+0.084023 0.00759 -1.1881
+0.086144 0.00758 -1.1865
+0.087239 0.007578 -1.1862
+0.088182 0.007563 -1.1838
+0.090302 0.007554 -1.1824
+0.09229 0.007534 -1.1793
+0.092837 0.007489 -1.1721
+0.093667 0.007467 -1.1686
+0.094703 0.007462 -1.1678
+0.096018 0.007478 -1.1705
+0.097331 0.007495 -1.173
+0.098854 0.007526 -1.1781
+0.10023 0.007546 -1.1812
+0.10139 0.00755 -1.1818
+0.11349 0.007691 -1.2041
+0.11458 0.007689 -1.2036
+0.1157 0.007687 -1.2034
+0.11668 0.007678 -1.2019
+0.11873 0.007664 -1.1997
+0.12081 0.007652 -1.1979
+0.12293 0.007644 -1.1965
+0.14484 0.007611 -1.1912
+0.14934 0.007611 -1.1913
+0.15166 0.007615 -1.1918
+0.15403 0.007621 -1.1928
+0.15649 0.007632 -1.1945
+0.1589 0.007639 -1.1957
+0.16366 0.007652 -1.1976
+0.16605 0.007657 -1.1985
+0.16856 0.007669 -1.2003
+0.16985 0.007676 -1.2015
+0.17716 0.007554 -1.182
+0.17842 0.00756 -1.183
+0.17971 0.007567 -1.1841
+0.18194 0.007567 -1.1841
+0.18422 0.007569 -1.1844
+0.18637 0.007566 -1.1839
+0.18839 0.007558 -1.1826
+0.19281 0.007556 -1.1823
+0.20175 0.007557 -1.1824
+0.20641 0.007564 -1.1836
+0.20876 0.007569 -1.1842
+0.21115 0.007575 -1.1852
+0.21362 0.007583 -1.1865
+0.21486 0.007587 -1.1872
+0.21615 0.007593 -1.1881
+-0.14482 0.007164 -1.3168
+-0.14344 0.007157 -1.3154
+-0.14174 0.007134 -1.3111
+-0.14024 0.00712 -1.3086
+-0.13882 0.007111 -1.3068
+-0.13753 0.007108 -1.3063
+-0.13499 0.007104 -1.3055
+-0.13026 0.007114 -1.3074
+-0.061967 0.00704 -1.294
+-0.060736 0.007039 -1.2937
+-0.053737 0.007079 -1.3012
+-0.051614 0.007124 -1.3095
+0.012659 0.00725 -1.3331
+0.077841 0.006515 -1.1964
+0.07878 0.006499 -1.1936
+0.087062 0.006447 -1.1838
+0.093091 0.006401 -1.1753
+0.093937 0.006384 -1.172
+0.095042 0.006384 -1.172
+0.096221 0.006389 -1.173
+0.097327 0.006389 -1.173
+0.098645 0.006403 -1.1755
+0.10058 0.006456 -1.1854
+0.1017 0.006456 -1.1854
+0.10258 0.006441 -1.1827
+0.1037 0.006441 -1.1827
+0.11458 0.006554 -1.2036
+0.11569 0.006553 -1.2034
+0.11683 0.006553 -1.2034
+0.1178 0.006544 -1.2017
+0.11988 0.006534 -1.1999
+0.16488 0.006526 -1.1982
+0.16753 0.006542 -1.2011
+0.16878 0.006546 -1.2019
+0.17556 0.006422 -1.1787
+0.17824 0.006438 -1.1818
+0.18039 0.006435 -1.1812
+0.21436 0.006453 -1.1844
+0.21693 0.006463 -1.1862
+0.21819 0.006467 -1.187
+0.21952 0.006473 -1.1881
+-0.14604 0.005924 -1.3166
+-0.14466 0.005918 -1.3153
+-0.14145 0.005888 -1.3084
+-0.13985 0.005872 -1.3049
+-0.13855 0.005869 -1.3042
+-0.13601 0.005866 -1.3035
+-0.13356 0.005866 -1.3035
+-0.13119 0.005869 -1.3043
+-0.12995 0.005869 -1.3042
+-0.061932 0.005819 -1.2933
+-0.059516 0.00582 -1.2937
+-0.057111 0.005823 -1.2944
+-0.054708 0.005827 -1.2951
+-0.053673 0.005847 -1.2996
+-0.052708 0.005876 -1.3061
+-0.051609 0.00589 -1.3094
+-0.050399 0.005893 -1.31
+-0.047935 0.005893 -1.31
+-0.045444 0.005889 -1.3092
+-0.040457 0.005881 -1.3072
+-0.035487 0.005872 -1.3053
+-0.030548 0.005867 -1.3041
+-0.025639 0.005866 -1.304
+-0.02074 0.005868 -1.3045
+-0.015834 0.005869 -1.3047
+-0.010942 0.005878 -1.3067
+-0.006034 0.005886 -1.3085
+-0.003574 0.005888 -1.309
+-0.001113 0.005897 -1.311
+0.003834 0.00592 -1.3161
+0.006323 0.005932 -1.3188
+0.008825 0.005946 -1.322
+0.011371 0.005977 -1.329
+0.012658 0.005995 -1.333
+0.076717 0.005388 -1.1965
+0.077664 0.005375 -1.1937
+0.079577 0.005353 -1.1886
+0.081596 0.005338 -1.1854
+0.083672 0.005328 -1.1831
+0.085822 0.005323 -1.182
+0.088008 0.005321 -1.1815
+0.092395 0.005317 -1.1806
+0.094602 0.005316 -1.1804
+0.096874 0.005319 -1.181
+0.099402 0.005335 -1.1847
+0.10176 0.005342 -1.1862
+0.10373 0.005328 -1.183
+0.10483 0.005328 -1.1829
+0.10597 0.005329 -1.1832
+0.11446 0.005414 -1.2024
+0.11677 0.005417 -1.2028
+0.11892 0.005411 -1.2016
+0.12102 0.005404 -1.2
+0.12526 0.005392 -1.1972
+0.12971 0.005389 -1.1967
+0.13414 0.005386 -1.1959
+0.13847 0.00538 -1.1944
+0.14282 0.005374 -1.1931
+0.14502 0.005372 -1.1927
+0.14722 0.00537 -1.1923
+0.14958 0.005374 -1.1932
+0.15197 0.005379 -1.1943
+0.15438 0.005385 -1.1955
+0.15674 0.005389 -1.1964
+0.16143 0.005395 -1.1977
+0.16379 0.005398 -1.1985
+0.16639 0.005409 -1.201
+0.16754 0.00541 -1.2011
+0.17249 0.005318 -1.1805
+0.17439 0.005308 -1.1783
+0.1755 0.005308 -1.1783
+0.1769 0.005317 -1.1803
+0.17926 0.005321 -1.1812
+0.18151 0.005322 -1.1813
+0.18566 0.005313 -1.1794
+0.18995 0.005309 -1.1783
+0.19424 0.005305 -1.1774
+0.19874 0.005307 -1.1777
+0.20326 0.005309 -1.1782
+0.20787 0.005313 -1.1792
+0.21268 0.005322 -1.1812
+0.21517 0.005329 -1.1827
+0.21772 0.005337 -1.1844
+0.22033 0.005346 -1.1865
+0.2217 0.005352 -1.1878
+-0.14735 0.004687 -1.3172
+-0.14592 0.004681 -1.3154
+-0.14279 0.004659 -1.3094
+-0.14106 0.004643 -1.3048
+-0.13966 0.004637 -1.3032
+-0.1322 0.004633 -1.3021
+-0.1296 0.004628 -1.3007
+-0.060661 0.004597 -1.2921
+-0.059462 0.004598 -1.2925
+-0.058271 0.0046 -1.293
+-0.055875 0.004603 -1.2939
+-0.053607 0.004618 -1.298
+-0.051551 0.004653 -1.3079
+-0.049181 0.004661 -1.3103
+-0.046674 0.004657 -1.3092
+0.007569 0.004695 -1.3199
+0.012651 0.004738 -1.3323
+0.07559 0.00426 -1.1965
+0.076559 0.004251 -1.194
+0.078438 0.004232 -1.1883
+0.080407 0.004217 -1.1843
+0.081399 0.004211 -1.1825
+0.082476 0.004209 -1.182
+0.10051 0.004219 -1.1846
+0.10176 0.004224 -1.1861
+0.10287 0.004224 -1.1861
+0.10484 0.004213 -1.183
+0.10597 0.004214 -1.1832
+0.10719 0.004218 -1.1844
+0.10852 0.004226 -1.1867
+0.11544 0.004276 -1.2007
+0.11673 0.004281 -1.2024
+0.11786 0.004281 -1.2024
+0.12005 0.004279 -1.2016
+0.14626 0.004251 -1.1937
+0.14738 0.004251 -1.1937
+0.14866 0.004256 -1.1949
+0.15101 0.004258 -1.1956
+0.16521 0.004276 -1.2006
+0.16639 0.004277 -1.201
+0.172 0.004194 -1.1772
+0.17307 0.004193 -1.1769
+0.17558 0.0042 -1.1788
+0.22116 0.004222 -1.1849
+0.22244 0.004225 -1.1858
+-0.14715 0.003442 -1.3154
+-0.14435 0.003434 -1.3124
+-0.14092 0.003411 -1.3035
+-0.13834 0.003408 -1.3023
+-0.13582 0.003406 -1.3016
+-0.13316 0.003401 -1.2996
+-0.13184 0.003398 -1.2986
+-0.13054 0.003396 -1.2979
+-0.058215 0.00338 -1.2918
+-0.057035 0.003382 -1.2926
+-0.054696 0.003388 -1.2948
+-0.052534 0.003405 -1.3017
+-0.051465 0.003416 -1.3057
+-0.050313 0.003421 -1.3077
+-0.047855 0.003421 -1.3078
+-0.045394 0.003421 -1.3077
+-0.042949 0.003422 -1.3082
+-0.040482 0.003422 -1.308
+-0.038003 0.00342 -1.3074
+-0.003575 0.003425 -1.3094
+-0.001114 0.003433 -1.3124
+0.001356 0.003438 -1.3142
+0.006323 0.00345 -1.3189
+0.007568 0.003452 -1.3198
+0.008823 0.003457 -1.3218
+0.011364 0.003474 -1.3282
+0.012649 0.003484 -1.3321
+0.075441 0.003127 -1.1941
+0.077328 0.003112 -1.1885
+0.079258 0.0031 -1.1838
+0.080258 0.003096 -1.1821
+0.081289 0.003093 -1.1809
+0.082336 0.00309 -1.1799
+0.083401 0.003088 -1.1793
+0.085564 0.003086 -1.1784
+0.094481 0.003088 -1.1789
+0.09681 0.003091 -1.1802
+0.099169 0.003095 -1.1818
+0.10158 0.003101 -1.1841
+0.10385 0.003102 -1.1845
+0.10496 0.003102 -1.1844
+0.10633 0.003109 -1.1873
+0.1086 0.00311 -1.1876
+0.10976 0.003111 -1.1881
+0.1109 0.003112 -1.1883
+0.11212 0.003115 -1.1894
+0.11491 0.00313 -1.1952
+0.11641 0.00314 -1.1991
+0.11891 0.003146 -1.2015
+0.12116 0.003146 -1.2014
+0.12334 0.003144 -1.2005
+0.12544 0.00314 -1.1989
+0.1276 0.003137 -1.198
+0.13212 0.003137 -1.198
+0.14098 0.003134 -1.1966
+0.14321 0.003133 -1.1964
+0.14546 0.003133 -1.1964
+0.14779 0.003135 -1.197
+0.15008 0.003136 -1.1972
+0.15239 0.003137 -1.1976
+0.15468 0.003137 -1.198
+0.15699 0.003138 -1.1983
+0.15927 0.003139 -1.1985
+0.16166 0.003141 -1.1995
+0.1642 0.003147 -1.2015
+0.17001 0.003088 -1.1788
+0.17075 0.003081 -1.1762
+0.17186 0.003081 -1.1762
+0.1742 0.003083 -1.177
+0.17675 0.003089 -1.1792
+0.17895 0.003089 -1.1791
+0.1872 0.003078 -1.175
+0.1893 0.003077 -1.1743
+0.19145 0.003076 -1.1739
+0.19366 0.003075 -1.1738
+0.19587 0.003076 -1.1739
+0.19811 0.003076 -1.174
+0.20034 0.003076 -1.174
+0.20262 0.003077 -1.1744
+0.2049 0.003078 -1.1748
+0.2072 0.00308 -1.1753
+0.20954 0.003081 -1.176
+0.21191 0.003084 -1.1769
+0.21436 0.003087 -1.1781
+0.21679 0.00309 -1.1793
+0.21935 0.003095 -1.1811
+0.22199 0.0031 -1.1833
+0.22329 0.003103 -1.1843
+0.22461 0.003106 -1.1854
+-0.14837 0.002203 -1.3153
+-0.14558 0.002198 -1.3124
+-0.13699 0.00218 -1.301
+-0.13575 0.002179 -1.3009
+-0.13437 0.002177 -1.2994
+-0.13284 0.002172 -1.2964
+-0.053492 0.002169 -1.2952
+-0.052425 0.002176 -1.299
+-0.051358 0.002182 -1.3029
+-0.049012 0.002187 -1.3058
+-0.046573 0.002188 -1.3063
+-0.044168 0.00219 -1.3079
+-0.042938 0.00219 -1.3079
+-0.041743 0.002192 -1.309
+0.007573 0.002211 -1.3205
+0.012648 0.00223 -1.3319
+0.074414 0.002004 -1.1957
+0.080127 0.001978 -1.1801
+0.081158 0.001976 -1.1789
+0.082213 0.001975 -1.1781
+0.097847 0.001977 -1.1793
+0.10634 0.001991 -1.1874
+0.10752 0.001992 -1.1881
+0.10871 0.001993 -1.1889
+0.10989 0.001994 -1.1895
+0.11099 0.001994 -1.1893
+0.11211 0.001994 -1.1893
+0.11331 0.001995 -1.1901
+0.11451 0.001997 -1.1909
+0.11583 0.002 -1.193
+0.11726 0.002005 -1.1962
+0.12004 0.002014 -1.2015
+0.14458 0.002009 -1.1985
+0.14575 0.00201 -1.1988
+0.14688 0.00201 -1.1988
+0.16052 0.002011 -1.1994
+0.16308 0.002015 -1.2016
+0.16889 0.001977 -1.1787
+0.16971 0.001973 -1.1767
+0.17074 0.001972 -1.1761
+0.1729 0.001972 -1.1757
+0.17445 0.001977 -1.1787
+0.17558 0.001977 -1.1789
+0.21284 0.001972 -1.1759
+0.21395 0.001972 -1.1759
+0.21515 0.001973 -1.1764
+0.22284 0.001982 -1.1819
+0.22549 0.001986 -1.1842
+0.22681 0.001988 -1.1852
+-0.1468 0.000963 -1.3122
+-0.14373 0.000959 -1.3067
+-0.14082 0.000956 -1.3025
+-0.1382 0.000955 -1.3009
+-0.13695 0.000954 -1.3007
+-0.13536 0.000952 -1.2971
+-0.13388 0.00095 -1.2947
+-0.051298 0.000955 -1.3014
+-0.050156 0.000956 -1.3036
+-0.048997 0.000957 -1.3054
+-0.047786 0.000958 -1.3059
+-0.04535 0.000958 -1.3065
+-0.043014 0.000961 -1.3102
+-0.040517 0.00096 -1.3092
+-0.03553 0.000958 -1.3069
+-0.030562 0.000957 -1.3047
+-0.025636 0.000956 -1.3039
+-0.020744 0.000957 -1.3047
+-0.015846 0.000958 -1.3057
+-0.010947 0.000959 -1.3073
+-0.006037 0.00096 -1.3091
+-0.001115 0.000963 -1.3129
+0.003837 0.000966 -1.3172
+0.006328 0.000968 -1.3199
+0.008832 0.00097 -1.3231
+0.011364 0.000974 -1.3283
+0.012648 0.000977 -1.332
+0.074286 0.000876 -1.1936
+0.075193 0.000874 -1.1901
+0.077017 0.000869 -1.1836
+0.078992 0.000866 -1.1798
+0.081049 0.000864 -1.1773
+0.083173 0.000863 -1.176
+0.087513 0.000862 -1.1748
+0.091986 0.000863 -1.1754
+0.096535 0.000864 -1.1768
+0.097644 0.000864 -1.1768
+0.11835 0.000878 -1.1958
+0.12115 0.000882 -1.2013
+0.12356 0.000883 -1.2028
+0.12582 0.000883 -1.2026
+0.12787 0.000881 -1.2006
+0.12999 0.00088 -1.1993
+0.13218 0.00088 -1.1986
+0.13444 0.00088 -1.1986
+0.13898 0.00088 -1.1988
+0.14355 0.00088 -1.1993
+0.14587 0.000881 -1.1998
+0.14809 0.00088 -1.1994
+0.15256 0.00088 -1.199
+0.15717 0.000881 -1.1997
+0.15959 0.000881 -1.2009
+0.16215 0.000883 -1.2031
+0.16676 0.000866 -1.1793
+0.16777 0.000865 -1.1786
+0.16854 0.000864 -1.1762
+0.1697 0.000864 -1.1766
+0.17158 0.000862 -1.1742
+0.17419 0.000864 -1.177
+0.17651 0.000865 -1.1776
+0.18053 0.000863 -1.1749
+0.18467 0.000861 -1.173
+0.18897 0.000861 -1.1722
+0.19338 0.000861 -1.1721
+0.19782 0.000861 -1.1723
+0.20231 0.000861 -1.1726
+0.20693 0.000862 -1.1738
+0.21154 0.000863 -1.1748
+0.21386 0.000863 -1.1754
+0.21625 0.000864 -1.1763
+0.22114 0.000866 -1.1788
+0.22374 0.000867 -1.1808
+0.22642 0.000869 -1.1831
+0.22777 0.00087 -1.1844
+-0.13932 -0.00027 -1.2999
+-0.13795 -0.00027 -1.2985
+-0.13656 -0.00027 -1.2969
+-0.047763 -0.000271 -1.3052
+-0.04658 -0.000272 -1.3065
+-0.044259 -0.000272 -1.3106
+-0.041776 -0.000272 -1.3101
+0.012653 -0.000277 -1.3325
+0.07331 -0.000249 -1.196
+0.074164 -0.000248 -1.1916
+0.097418 -0.000245 -1.1741
+0.11947 -0.000249 -1.1958
+0.16567 -0.000246 -1.1795
+0.16674 -0.000246 -1.1792
+0.16749 -0.000245 -1.1767
+0.16853 -0.000245 -1.1762
+0.17075 -0.000245 -1.1762
+0.22213 -0.000246 -1.1781
+0.2233 -0.000246 -1.1784
+0.22465 -0.000246 -1.1797
+0.22736 -0.000247 -1.1823
+0.22871 -0.000247 -1.1835
+-0.14044 -0.001493 -1.299
+-0.1391 -0.001492 -1.2978
+-0.046557 -0.001501 -1.3059
+-0.045409 -0.001503 -1.3082
+-0.043011 -0.001506 -1.3101
+-0.040526 -0.001505 -1.3095
+-0.038035 -0.001504 -1.3085
+0.006329 -0.001517 -1.3201
+0.008837 -0.001521 -1.324
+0.01137 -0.001527 -1.329
+0.012656 -0.001531 -1.3328
+0.073158 -0.001373 -1.1935
+0.074907 -0.001364 -1.1856
+0.076739 -0.001357 -1.1793
+0.080871 -0.001352 -1.1747
+0.094063 -0.001351 -1.1736
+0.096307 -0.001351 -1.174
+0.097389 -0.001351 -1.1737
+0.12067 -0.001377 -1.1965
+0.12353 -0.001384 -1.2025
+0.12598 -0.001386 -1.2042
+0.1282 -0.001385 -1.2037
+0.13033 -0.001384 -1.2024
+0.13235 -0.001381 -1.2002
+0.13451 -0.00138 -1.1993
+0.13674 -0.00138 -1.199
+0.14131 -0.00138 -1.1995
+0.14358 -0.00138 -1.1995
+0.14586 -0.001381 -1.1997
+0.14813 -0.001381 -1.1998
+0.15045 -0.001381 -1.2002
+0.15282 -0.001382 -1.2011
+0.15513 -0.001383 -1.2015
+0.15756 -0.001384 -1.2028
+0.16 -0.001386 -1.204
+0.16455 -0.001358 -1.1794
+0.16556 -0.001357 -1.1787
+0.16748 -0.001355 -1.1766
+0.16968 -0.001354 -1.1764
+0.17188 -0.001354 -1.1763
+0.1741 -0.001354 -1.1763
+0.1953 -0.001348 -1.1704
+0.1975 -0.001348 -1.1703
+0.19975 -0.001348 -1.1706
+0.202 -0.001348 -1.1709
+0.20436 -0.001349 -1.1717
+0.21352 -0.001351 -1.1735
+0.21835 -0.001354 -1.1757
+0.22073 -0.001355 -1.1766
+0.22315 -0.001356 -1.1777
+0.22563 -0.001358 -1.179
+0.22835 -0.001361 -1.1816
+0.2297 -0.001362 -1.1828
+-0.045324 -0.00273 -1.3057
+-0.044201 -0.002736 -1.3089
+-0.042985 -0.002737 -1.3093
+-0.041754 -0.002737 -1.3093
+0.010104 -0.002773 -1.3268
+0.012681 -0.002791 -1.3354
+0.073904 -0.002485 -1.1874
+0.097353 -0.002456 -1.1733
+0.098469 -0.002456 -1.1734
+0.099564 -0.002456 -1.1733
+0.099793 -0.002435 -1.163
+0.1219 -0.002506 -1.1974
+0.12466 -0.002517 -1.2024
+0.12714 -0.002521 -1.2044
+0.12945 -0.002522 -1.2049
+0.14475 -0.002512 -1.1998
+0.14588 -0.002512 -1.1998
+0.14702 -0.002512 -1.1999
+0.14935 -0.002513 -1.2005
+0.15051 -0.002514 -1.2007
+0.15182 -0.002517 -1.2022
+0.15659 -0.00252 -1.204
+0.1578 -0.002522 -1.2046
+0.1589 -0.002521 -1.2043
+0.16345 -0.00247 -1.1796
+0.16449 -0.002469 -1.179
+0.16667 -0.002468 -1.1787
+0.22939 -0.002474 -1.1812
+0.23074 -0.002477 -1.1824
+-0.045187 -0.003947 -1.3017
+-0.044063 -0.003956 -1.3047
+-0.042894 -0.003961 -1.3065
+-0.040513 -0.003969 -1.309
+-0.035545 -0.003964 -1.3075
+-0.030577 -0.003958 -1.3054
+-0.025662 -0.003957 -1.3052
+-0.020755 -0.003958 -1.3054
+-0.015854 -0.00396 -1.3063
+-0.01095 -0.003964 -1.3077
+-0.006041 -0.003972 -1.3101
+-0.001115 -0.003982 -1.3134
+0.00384 -0.003995 -1.318
+0.008844 -0.004016 -1.3249
+0.010109 -0.004024 -1.3274
+0.011395 -0.004037 -1.3319
+0.012689 -0.00405 -1.3363
+0.072897 -0.00361 -1.1892
+0.074631 -0.003585 -1.1811
+0.076549 -0.003571 -1.1763
+0.078616 -0.003564 -1.1741
+0.082888 -0.003558 -1.1719
+0.087241 -0.003555 -1.1711
+0.091664 -0.003556 -1.1712
+0.096165 -0.003559 -1.1723
+0.098453 -0.003562 -1.1732
+0.10061 -0.00356 -1.1725
+0.10622 -0.003526 -1.1613
+0.12188 -0.003634 -1.1972
+0.12312 -0.003638 -1.1984
+0.12581 -0.00365 -1.2026
+0.12718 -0.003657 -1.2049
+0.12833 -0.003657 -1.205
+0.13071 -0.003661 -1.206
+0.13285 -0.003657 -1.2048
+0.13465 -0.003644 -1.2006
+0.13911 -0.003643 -1.2
+0.14137 -0.003643 -1.2
+0.14367 -0.003644 -1.2003
+0.14601 -0.003646 -1.2009
+0.14839 -0.003649 -1.2019
+0.15085 -0.003653 -1.2034
+0.15323 -0.003656 -1.2043
+0.15563 -0.003659 -1.2054
+0.1578 -0.003657 -1.2046
+0.15892 -0.003657 -1.2045
+0.16239 -0.003583 -1.1799
+0.16337 -0.00358 -1.1789
+0.16555 -0.003579 -1.1786
+0.16775 -0.003579 -1.1785
+0.17186 -0.003572 -1.1761
+0.17584 -0.003563 -1.1731
+0.17991 -0.003556 -1.1707
+0.18421 -0.003554 -1.17
+0.18854 -0.003552 -1.1695
+0.19289 -0.003551 -1.1691
+0.19753 -0.003555 -1.1705
+0.20204 -0.003557 -1.1711
+0.20432 -0.003558 -1.1714
+0.20655 -0.003559 -1.1716
+0.21106 -0.00356 -1.1721
+0.21564 -0.003563 -1.173
+0.22039 -0.003568 -1.1747
+0.22528 -0.003576 -1.1771
+0.22778 -0.00358 -1.1786
+0.23046 -0.003587 -1.181
+0.23182 -0.003591 -1.1823
+-0.04283 -0.005183 -1.3046
+-0.041667 -0.005191 -1.3066
+0.010107 -0.005272 -1.3272
+0.012688 -0.005307 -1.3362
+0.07367 -0.004708 -1.1836
+0.075466 -0.004681 -1.1767
+0.076464 -0.004674 -1.175
+0.077505 -0.00467 -1.174
+0.099438 -0.004662 -1.1718
+0.10059 -0.004664 -1.1724
+0.1061 -0.004664 -1.1723
+0.10724 -0.004665 -1.1726
+0.11177 -0.004624 -1.1621
+0.11296 -0.004628 -1.1631
+0.12183 -0.004761 -1.1968
+0.12433 -0.00477 -1.1991
+0.12699 -0.004785 -1.203
+0.12835 -0.004794 -1.2052
+0.12957 -0.004797 -1.2059
+0.14264 -0.004778 -1.2011
+0.14498 -0.004781 -1.2018
+0.14611 -0.004781 -1.2018
+0.14741 -0.004786 -1.2031
+0.1568 -0.004796 -1.2056
+0.15779 -0.004792 -1.2045
+0.16231 -0.004693 -1.1794
+0.20319 -0.004662 -1.1713
+0.2043 -0.004663 -1.1714
+0.20544 -0.004663 -1.1715
+0.23156 -0.004701 -1.1809
+0.23292 -0.004706 -1.1822
+-0.041619 -0.006414 -1.3051
+-0.040478 -0.006427 -1.3079
+-0.038034 -0.00643 -1.3085
+-0.035548 -0.006426 -1.3076
+-0.03307 -0.006422 -1.3069
+0.006339 -0.006497 -1.3223
+0.008852 -0.006516 -1.3261
+0.010121 -0.00653 -1.3291
+0.011413 -0.006554 -1.334
+0.012684 -0.006563 -1.3358
+0.072697 -0.005835 -1.1859
+0.073518 -0.005811 -1.1811
+0.074429 -0.005796 -1.1779
+0.075409 -0.005786 -1.1759
+0.076424 -0.005779 -1.1744
+0.077446 -0.005772 -1.1731
+0.078488 -0.005768 -1.1722
+0.08063 -0.005763 -1.1712
+0.098251 -0.005762 -1.1708
+0.10051 -0.005765 -1.1715
+0.10164 -0.005766 -1.1718
+0.10276 -0.005767 -1.1719
+0.10499 -0.005768 -1.1722
+0.10724 -0.00577 -1.1726
+0.11169 -0.005772 -1.1729
+0.1139 -0.005772 -1.1729
+0.11503 -0.005774 -1.1732
+0.11633 -0.005783 -1.1752
+0.11789 -0.005806 -1.1797
+0.11996 -0.005852 -1.1894
+0.12161 -0.005878 -1.1946
+0.12305 -0.005893 -1.1977
+0.12556 -0.005905 -1.2002
+0.12817 -0.005921 -1.2034
+0.1307 -0.005933 -1.206
+0.1331 -0.005939 -1.207
+0.13514 -0.005929 -1.2049
+0.13715 -0.005917 -1.2026
+0.13934 -0.005914 -1.202
+0.14164 -0.005916 -1.2023
+0.14282 -0.005918 -1.2026
+0.14403 -0.005921 -1.2034
+0.14647 -0.005928 -1.2048
+0.14901 -0.005939 -1.207
+0.1513 -0.005939 -1.2071
+0.15363 -0.005941 -1.2075
+0.15577 -0.005936 -1.2064
+0.15676 -0.005931 -1.2053
+0.16125 -0.005807 -1.1797
+0.16325 -0.005799 -1.1781
+0.16548 -0.005799 -1.1782
+0.18189 -0.005756 -1.1693
+0.1841 -0.005757 -1.1693
+0.18629 -0.005756 -1.1692
+0.19097 -0.005764 -1.1709
+0.19315 -0.005764 -1.1707
+0.19543 -0.005766 -1.1711
+0.19772 -0.005768 -1.1716
+0.19987 -0.005766 -1.1713
+0.20201 -0.005765 -1.1709
+0.20418 -0.005764 -1.1707
+0.20641 -0.005764 -1.1708
+0.20869 -0.005766 -1.1712
+0.21102 -0.00577 -1.1719
+0.21335 -0.005773 -1.1725
+0.21563 -0.005775 -1.1729
+0.21789 -0.005776 -1.1732
+0.22742 -0.005794 -1.1767
+0.23005 -0.005804 -1.1788
+0.23269 -0.005814 -1.181
+0.23403 -0.00582 -1.1821
+-0.041552 -0.00763 -1.3029
+0.010124 -0.007784 -1.3295
+0.011412 -0.007809 -1.334
+0.071767 -0.00697 -1.1891
+0.073501 -0.006923 -1.1808
+0.075326 -0.006886 -1.1745
+0.076356 -0.006879 -1.1733
+0.077403 -0.006874 -1.1725
+0.10157 -0.006866 -1.1709
+0.1038 -0.006868 -1.1712
+0.10829 -0.006872 -1.1719
+0.1094 -0.006872 -1.172
+0.11056 -0.006876 -1.1726
+0.11283 -0.00688 -1.1733
+0.11525 -0.006892 -1.1754
+0.11635 -0.006892 -1.1754
+0.11775 -0.006909 -1.1783
+0.11933 -0.006937 -1.1831
+0.12153 -0.006999 -1.1938
+0.12303 -0.007021 -1.1975
+0.1243 -0.007029 -1.1989
+0.14069 -0.007058 -1.2039
+0.14186 -0.007059 -1.2041
+0.14308 -0.007064 -1.2049
+0.15032 -0.007085 -1.2084
+0.15146 -0.007085 -1.2084
+0.15254 -0.007082 -1.2079
+0.15663 -0.007061 -1.2043
+0.21202 -0.006871 -1.1713
+0.21449 -0.00688 -1.1727
+0.23382 -0.006929 -1.1811
+-0.040373 -0.008867 -1.3045
+-0.038012 -0.008888 -1.3077
+-0.035556 -0.008889 -1.3079
+-0.030613 -0.008883 -1.3069
+-0.025686 -0.00888 -1.3064
+-0.02077 -0.008879 -1.3064
+-0.015871 -0.008888 -1.3077
+-0.010958 -0.008894 -1.3086
+-0.006051 -0.008918 -1.3122
+-0.001117 -0.008939 -1.3152
+0.003844 -0.008967 -1.3194
+0.006346 -0.008997 -1.3238
+0.00886 -0.00902 -1.3273
+0.01141 -0.009063 -1.3337
+0.071732 -0.008087 -1.1885
+0.072576 -0.008056 -1.1839
+0.074329 -0.008005 -1.1763
+0.076322 -0.007982 -1.1728
+0.07841 -0.007969 -1.171
+0.082723 -0.00796 -1.1696
+0.087089 -0.007956 -1.169
+0.09147 -0.007954 -1.1687
+0.095914 -0.007958 -1.1692
+0.10039 -0.007963 -1.17
+0.10262 -0.007965 -1.1703
+0.10486 -0.007968 -1.1707
+0.10711 -0.007972 -1.1712
+0.10936 -0.007974 -1.1716
+0.11162 -0.007979 -1.1722
+0.11393 -0.007985 -1.1732
+0.11654 -0.008013 -1.1773
+0.11788 -0.008029 -1.1796
+0.11933 -0.008051 -1.183
+0.12131 -0.008109 -1.1916
+0.12274 -0.00813 -1.1946
+0.12552 -0.008164 -1.1998
+0.13062 -0.008201 -1.2051
+0.13318 -0.008219 -1.2078
+0.13547 -0.008219 -1.2079
+0.13977 -0.008205 -1.2058
+0.14211 -0.008209 -1.2063
+0.14456 -0.008219 -1.2078
+0.14696 -0.008226 -1.2088
+0.14924 -0.008226 -1.2089
+0.15148 -0.008224 -1.2085
+0.15363 -0.008217 -1.2075
+0.1556 -0.008201 -1.2051
+0.15926 -0.008042 -1.1815
+0.16123 -0.008029 -1.1795
+0.1633 -0.008022 -1.1784
+0.16746 -0.008009 -1.1764
+0.17137 -0.007985 -1.1728
+0.17538 -0.007966 -1.17
+0.17971 -0.007962 -1.1694
+0.18431 -0.007971 -1.1706
+0.18876 -0.007972 -1.1708
+0.19297 -0.007964 -1.1696
+0.19725 -0.007959 -1.1688
+0.20156 -0.007955 -1.1683
+0.20592 -0.007953 -1.168
+0.21052 -0.007961 -1.1691
+0.21162 -0.007961 -1.1691
+0.21303 -0.007972 -1.1707
+0.21567 -0.007988 -1.1731
+0.22033 -0.007997 -1.1744
+0.22485 -0.008 -1.1749
+0.22965 -0.008013 -1.1768
+0.23229 -0.008028 -1.1789
+0.23508 -0.008047 -1.1818
+0.007605 -0.010261 -1.3262
+0.008864 -0.010274 -1.3279
+0.010143 -0.010305 -1.332
+0.070845 -0.009237 -1.1924
+0.071692 -0.009202 -1.1878
+0.073375 -0.009133 -1.1788
+0.11272 -0.009083 -1.1721
+0.11507 -0.009094 -1.1736
+0.11797 -0.009148 -1.1806
+0.12094 -0.009205 -1.188
+0.12404 -0.009269 -1.1964
+0.15818 -0.009158 -1.1817
+0.16019 -0.009146 -1.1801
+0.16227 -0.009138 -1.1791
+0.2116 -0.009062 -1.1689
+0.21412 -0.009076 -1.1707
+-0.037969 -0.011337 -1.3062
+-0.035557 -0.011352 -1.3079
+-0.033094 -0.011351 -1.3078
+-0.003588 -0.011408 -1.3144
+0.001362 -0.011449 -1.3193
+0.003851 -0.011472 -1.3219
+0.006354 -0.011503 -1.3255
+0.007611 -0.011518 -1.3273
+0.008887 -0.011554 -1.3314
+0.01146 -0.011624 -1.3396
+0.07084 -0.01036 -1.1923
+0.072448 -0.010269 -1.1818
+0.074292 -0.010217 -1.1757
+0.076262 -0.010184 -1.1719
+0.10256 -0.010166 -1.1696
+0.10706 -0.010174 -1.1706
+0.10928 -0.010176 -1.1708
+0.11152 -0.010179 -1.1712
+0.11266 -0.010182 -1.1715
+0.11384 -0.010189 -1.1723
+0.11506 -0.010199 -1.1734
+0.11652 -0.01023 -1.1771
+0.11949 -0.010295 -1.1846
+0.12219 -0.010335 -1.1893
+0.12392 -0.010386 -1.1951
+0.12546 -0.01042 -1.1992
+0.128 -0.010443 -1.2018
+0.13057 -0.010468 -1.2047
+0.13318 -0.010495 -1.2078
+0.14249 -0.010511 -1.2096
+0.14711 -0.010515 -1.2101
+0.15148 -0.010502 -1.2086
+0.15358 -0.01049 -1.2071
+0.15822 -0.010275 -1.182
+0.15921 -0.010266 -1.1811
+0.16005 -0.010249 -1.179
+0.16122 -0.010253 -1.1795
+0.16325 -0.010241 -1.1781
+0.16526 -0.010228 -1.1765
+0.17765 -0.010176 -1.1704
+0.17995 -0.010181 -1.171
+0.18211 -0.010179 -1.1707
+0.2082 -0.01016 -1.1684
+0.21048 -0.010164 -1.1688
+0.21267 -0.010163 -1.1687
+0.21384 -0.010166 -1.1691
+0.21542 -0.010189 -1.1718
+0.21824 -0.010218 -1.1751
+0.23204 -0.01024 -1.1777
+0.23461 -0.010256 -1.1794
+0.23744 -0.010282 -1.1825
+-0.036772 -0.012578 -1.3074
+0.005099 -0.01273 -1.3233
+0.007624 -0.012788 -1.3295
+0.008906 -0.012835 -1.3344
+0.010203 -0.012888 -1.34
+0.011518 -0.012949 -1.3464
+0.070081 -0.011543 -1.1986
+0.11039 -0.01128 -1.1708
+0.11152 -0.011283 -1.1711
+0.11266 -0.011287 -1.1715
+0.11505 -0.011304 -1.1734
+0.11656 -0.011343 -1.1775
+0.1181 -0.011385 -1.1818
+0.12092 -0.011441 -1.1877
+0.12218 -0.011455 -1.1892
+0.12379 -0.0115 -1.1939
+0.12677 -0.011567 -1.2009
+0.12933 -0.011593 -1.2036
+0.15261 -0.01164 -1.2085
+0.15364 -0.011632 -1.2076
+0.15698 -0.01138 -1.181
+0.15815 -0.011384 -1.1815
+0.16009 -0.011364 -1.1794
+0.16227 -0.011361 -1.1791
+0.21383 -0.011268 -1.1691
+0.23572 -0.011368 -1.1794
+0.2372 -0.011386 -1.1813
+-0.036773 -0.013809 -1.3074
+-0.035576 -0.013821 -1.3086
+-0.030649 -0.01382 -1.3085
+-0.02571 -0.013812 -1.3077
+-0.020802 -0.013819 -1.3084
+-0.015891 -0.01383 -1.3094
+-0.01098 -0.013849 -1.3112
+-0.00606 -0.01388 -1.3143
+-0.003591 -0.013892 -1.3154
+-0.001119 -0.013918 -1.3179
+0.001363 -0.013951 -1.3211
+0.003853 -0.013969 -1.3228
+0.005106 -0.013992 -1.325
+0.006371 -0.014034 -1.3289
+0.008942 -0.014147 -1.3398
+0.010242 -0.014203 -1.3452
+0.011527 -0.014228 -1.3475
+0.012803 -0.014238 -1.3484
+0.070095 -0.012675 -1.1989
+0.070878 -0.012614 -1.193
+0.072432 -0.012494 -1.1815
+0.074297 -0.012434 -1.1758
+0.078313 -0.012368 -1.1695
+0.082608 -0.012352 -1.1679
+0.086978 -0.012348 -1.1675
+0.091371 -0.012347 -1.1674
+0.095826 -0.012354 -1.1681
+0.1003 -0.012364 -1.169
+0.10477 -0.012371 -1.1697
+0.10927 -0.012382 -1.1707
+0.11155 -0.01239 -1.1714
+0.11391 -0.012406 -1.173
+0.11514 -0.01242 -1.1743
+0.11669 -0.012467 -1.1788
+0.11966 -0.012546 -1.1863
+0.12234 -0.012592 -1.1907
+0.12522 -0.012657 -1.1969
+0.12676 -0.012698 -1.2008
+0.12807 -0.012716 -1.2025
+0.13068 -0.012749 -1.2057
+0.13576 -0.0128 -1.2105
+0.14045 -0.012812 -1.2116
+0.14494 -0.012806 -1.211
+0.14939 -0.012796 -1.2101
+0.15156 -0.012787 -1.2092
+0.15265 -0.012783 -1.2088
+0.1558 -0.012487 -1.1805
+0.15691 -0.012487 -1.1805
+0.15914 -0.012488 -1.1806
+0.16115 -0.012471 -1.179
+0.16312 -0.012452 -1.1771
+0.16711 -0.012419 -1.174
+0.17118 -0.012393 -1.1715
+0.17558 -0.012393 -1.1714
+0.17989 -0.012385 -1.1706
+0.18412 -0.012373 -1.1695
+0.18841 -0.012365 -1.1687
+0.19273 -0.01236 -1.1681
+0.19701 -0.012352 -1.1674
+0.20136 -0.012349 -1.1671
+0.20578 -0.012351 -1.1672
+0.21032 -0.012359 -1.1679
+0.21271 -0.01237 -1.169
+0.21521 -0.012387 -1.1706
+0.21834 -0.01244 -1.1756
+0.2209 -0.012459 -1.1775
+0.22548 -0.012467 -1.1782
+0.22988 -0.012464 -1.178
+0.23448 -0.012473 -1.1788
+0.23705 -0.012492 -1.1805
+0.23843 -0.012505 -1.1818
+-0.036777 -0.015041 -1.3075
+-0.002356 -0.015144 -1.3166
+0.002609 -0.015212 -1.3226
+0.003854 -0.015215 -1.3229
+0.005117 -0.015272 -1.3279
+0.007676 -0.015395 -1.3387
+0.008975 -0.015465 -1.3448
+0.010249 -0.01548 -1.3461
+0.012792 -0.015494 -1.3473
+0.014065 -0.0155 -1.3479
+0.069385 -0.013889 -1.2062
+0.07019 -0.013823 -1.2005
+0.11513 -0.013526 -1.1742
+0.11842 -0.01365 -1.1851
+0.12661 -0.013813 -1.1994
+0.12944 -0.013874 -1.2047
+0.15053 -0.013936 -1.2101
+0.15159 -0.013929 -1.2095
+0.15566 -0.013589 -1.1795
+0.15807 -0.013604 -1.1809
+0.2165 -0.013502 -1.1716
+0.2197 -0.013564 -1.177
+0.2382 -0.013607 -1.1807
+0.23971 -0.013629 -1.1827
+-0.035581 -0.016287 -1.3088
+-0.033149 -0.016302 -1.31
+-0.030681 -0.0163 -1.3098
+-0.02821 -0.016296 -1.3095
+-0.025736 -0.016289 -1.309
+-0.023267 -0.016285 -1.3086
+-0.020815 -0.016292 -1.3092
+-0.018361 -0.0163 -1.3099
+-0.008531 -0.016351 -1.314
+-0.006067 -0.016372 -1.3157
+-0.003594 -0.016381 -1.3164
+-0.002358 -0.016396 -1.3176
+-0.001121 -0.016428 -1.3203
+0.001365 -0.016459 -1.3228
+0.002609 -0.016459 -1.3228
+0.003862 -0.016497 -1.3259
+0.006413 -0.016644 -1.3378
+0.007697 -0.016702 -1.3425
+0.008973 -0.016728 -1.3446
+0.011513 -0.016744 -1.3459
+0.014054 -0.016755 -1.3468
+0.070276 -0.014973 -1.202
+0.070974 -0.014882 -1.1946
+0.072421 -0.014719 -1.1814
+0.074337 -0.014658 -1.1764
+0.076293 -0.014608 -1.1724
+0.11163 -0.014608 -1.1722
+0.11402 -0.014631 -1.1741
+0.11528 -0.014651 -1.1757
+0.11684 -0.014709 -1.1804
+0.11853 -0.014781 -1.1862
+0.11988 -0.01481 -1.1886
+0.12236 -0.014839 -1.1909
+0.12509 -0.014896 -1.1956
+0.12655 -0.014936 -1.1988
+0.12803 -0.014977 -1.2021
+0.13083 -0.015039 -1.2071
+0.13343 -0.015076 -1.2101
+0.13833 -0.015113 -1.2131
+0.14284 -0.015107 -1.2126
+0.14735 -0.015101 -1.2121
+0.1495 -0.015088 -1.211
+0.15054 -0.015078 -1.2102
+0.15466 -0.014711 -1.1803
+0.15697 -0.014719 -1.181
+0.15905 -0.014706 -1.1799
+0.16104 -0.014684 -1.1782
+0.1691 -0.014613 -1.1724
+0.17134 -0.014616 -1.1726
+0.17357 -0.014617 -1.1727
+0.17565 -0.014607 -1.1718
+0.17771 -0.014595 -1.1708
+0.21257 -0.014565 -1.1682
+0.2151 -0.014587 -1.17
+0.21813 -0.014642 -1.1745
+0.22108 -0.014691 -1.1784
+0.22353 -0.014706 -1.1796
+0.23696 -0.014712 -1.1801
+0.2396 -0.014738 -1.1821
+0.24098 -0.014754 -1.1834
+-0.035588 -0.017522 -1.309
+-0.034384 -0.017536 -1.3101
+-0.031945 -0.01755 -1.3112
+-0.024501 -0.017519 -1.3088
+-0.023269 -0.017518 -1.3088
+-0.022056 -0.017532 -1.3098
+-0.004833 -0.017623 -1.3166
+-0.003597 -0.017633 -1.3174
+-0.002362 -0.017669 -1.3201
+0.000121 -0.01771 -1.3232
+0.001366 -0.01771 -1.3232
+0.002615 -0.017743 -1.3257
+0.005147 -0.017876 -1.3357
+0.006427 -0.017943 -1.3408
+0.007696 -0.017963 -1.3423
+0.012773 -0.018001 -1.3452
+0.014047 -0.018014 -1.3461
+0.070352 -0.016123 -1.2033
+0.11534 -0.015768 -1.1764
+0.11852 -0.015897 -1.1861
+0.11987 -0.015929 -1.1885
+0.12105 -0.015937 -1.1891
+0.12802 -0.016109 -1.202
+0.12956 -0.01616 -1.2059
+0.1507 -0.016235 -1.2114
+0.15388 -0.015858 -1.183
+0.15499 -0.015857 -1.1829
+0.1561 -0.015857 -1.1829
+0.15811 -0.015834 -1.1812
+0.21647 -0.01571 -1.1714
+0.21988 -0.015796 -1.178
+0.24087 -0.015862 -1.1829
+-0.034383 -0.018769 -1.3101
+-0.033195 -0.018794 -1.3118
+-0.030734 -0.018798 -1.3121
+-0.025771 -0.018779 -1.3108
+-0.023303 -0.018777 -1.3107
+-0.020845 -0.018784 -1.3111
+-0.015917 -0.01879 -1.3115
+-0.011007 -0.018831 -1.3145
+-0.006076 -0.018876 -1.3176
+-0.003604 -0.018912 -1.3202
+-0.001124 -0.018966 -1.324
+0.001369 -0.018999 -1.3263
+0.003887 -0.019116 -1.3345
+0.006423 -0.019192 -1.3399
+0.008959 -0.019227 -1.3424
+0.011495 -0.019246 -1.3437
+0.014042 -0.019273 -1.3456
+0.015319 -0.019287 -1.3466
+0.07103 -0.017147 -1.1956
+0.072425 -0.016946 -1.1814
+0.074371 -0.016883 -1.177
+0.078288 -0.016772 -1.1691
+0.082526 -0.016739 -1.1667
+0.086899 -0.016734 -1.1664
+0.091286 -0.016733 -1.1663
+0.095752 -0.016745 -1.1672
+0.10026 -0.016764 -1.1685
+0.10479 -0.016784 -1.1698
+0.10934 -0.016806 -1.1714
+0.11408 -0.016854 -1.1747
+0.11673 -0.016918 -1.1793
+0.11803 -0.016945 -1.1812
+0.13099 -0.017335 -1.2086
+0.13366 -0.017386 -1.2122
+0.13621 -0.01742 -1.2146
+0.13848 -0.017418 -1.2144
+0.14071 -0.017411 -1.2139
+0.14292 -0.017402 -1.2133
+0.14517 -0.017398 -1.2129
+0.14742 -0.017394 -1.2127
+0.14964 -0.017387 -1.2121
+0.15276 -0.016972 -1.1829
+0.15498 -0.016971 -1.1828
+0.15714 -0.016963 -1.1823
+0.15898 -0.016922 -1.1793
+0.16293 -0.016871 -1.1757
+0.16703 -0.016838 -1.1734
+0.16934 -0.016848 -1.1741
+0.17162 -0.016855 -1.1745
+0.17356 -0.016828 -1.1726
+0.17557 -0.016809 -1.1712
+0.17976 -0.016788 -1.1698
+0.18395 -0.016768 -1.1683
+0.18818 -0.016752 -1.1672
+0.19232 -0.01673 -1.1656
+0.19658 -0.016719 -1.1648
+0.20093 -0.016716 -1.1646
+0.20543 -0.016725 -1.1652
+0.21002 -0.01674 -1.1662
+0.21503 -0.016788 -1.1696
+0.21645 -0.016813 -1.1713
+0.21807 -0.016853 -1.1742
+0.22142 -0.01694 -1.1803
+0.22398 -0.016965 -1.1821
+0.22615 -0.016961 -1.1817
+0.23065 -0.016964 -1.182
+0.23496 -0.016954 -1.1812
+0.23951 -0.016961 -1.1817
+0.24215 -0.016989 -1.1837
+-0.034363 -0.019991 -1.3093
+-0.033203 -0.020034 -1.3122
+-0.031974 -0.020037 -1.3124
+-0.002371 -0.020232 -1.3253
+0.000121 -0.020246 -1.3262
+0.001371 -0.020276 -1.3282
+0.002623 -0.020301 -1.3299
+0.005143 -0.020376 -1.3348
+0.006416 -0.02043 -1.3384
+0.007682 -0.02045 -1.3397
+0.015324 -0.020561 -1.3471
+0.071488 -0.018104 -1.1844
+0.073414 -0.018029 -1.1794
+0.11788 -0.018035 -1.1796
+0.1375 -0.018585 -1.2159
+0.13863 -0.018582 -1.2157
+0.1397 -0.018573 -1.2151
+0.14863 -0.018545 -1.2132
+0.14969 -0.018534 -1.2125
+0.15274 -0.018085 -1.1828
+0.15385 -0.018084 -1.1827
+0.17062 -0.017973 -1.1752
+0.21643 -0.017916 -1.1713
+0.21986 -0.018016 -1.1778
+0.22306 -0.018096 -1.1831
+0.22531 -0.018097 -1.1832
+0.24341 -0.018117 -1.1844
+-0.033127 -0.02122 -1.3091
+-0.031965 -0.021266 -1.312
+-0.030746 -0.021277 -1.3127
+-0.028277 -0.021277 -1.3127
+-0.025792 -0.021264 -1.3119
+-0.023342 -0.02128 -1.3129
+-0.020871 -0.021279 -1.3128
+-0.018416 -0.021296 -1.3139
+-0.01596 -0.021316 -1.3151
+-0.013498 -0.021335 -1.3163
+-0.011036 -0.021362 -1.318
+-0.008565 -0.021384 -1.3193
+-0.006089 -0.021402 -1.3205
+-0.003614 -0.021455 -1.3238
+-0.001125 -0.02148 -1.3253
+0.00137 -0.021512 -1.3273
+0.003875 -0.021557 -1.3301
+0.006397 -0.021628 -1.3346
+0.008927 -0.021676 -1.3375
+0.011477 -0.021742 -1.3416
+0.014037 -0.021797 -1.3451
+0.015314 -0.021815 -1.3462
+0.071483 -0.019219 -1.1843
+0.072453 -0.019181 -1.1819
+0.074408 -0.019111 -1.1775
+0.076375 -0.019048 -1.1736
+0.080356 -0.018944 -1.1672
+0.11168 -0.019038 -1.1728
+0.11406 -0.019066 -1.1746
+0.11653 -0.019107 -1.1772
+0.11771 -0.01912 -1.1779
+0.13105 -0.019622 -1.2092
+0.13406 -0.01973 -1.2159
+0.13658 -0.019763 -1.2179
+0.13891 -0.019768 -1.2182
+0.1409 -0.019725 -1.2156
+0.14316 -0.019722 -1.2153
+0.14539 -0.019714 -1.2148
+0.14769 -0.019715 -1.2149
+0.14888 -0.019722 -1.2153
+0.15151 -0.019185 -1.1818
+0.15272 -0.019197 -1.1826
+0.1549 -0.019191 -1.1822
+0.15692 -0.019166 -1.1806
+0.16954 -0.019084 -1.1754
+0.17063 -0.019082 -1.1753
+0.1715 -0.019055 -1.1736
+0.17341 -0.019023 -1.1716
+0.17758 -0.018996 -1.1699
+0.17964 -0.018981 -1.169
+0.18176 -0.018972 -1.1684
+0.18381 -0.018957 -1.1675
+0.18587 -0.018943 -1.1666
+0.21239 -0.018955 -1.1672
+0.21503 -0.018994 -1.1696
+0.21793 -0.019055 -1.1734
+0.22193 -0.019209 -1.183
+0.22327 -0.019229 -1.1842
+0.22439 -0.01923 -1.1842
+0.22658 -0.019226 -1.184
+0.2288 -0.019225 -1.1839
+0.24197 -0.019208 -1.1828
+0.24335 -0.019229 -1.1841
+-0.029496 -0.0225 -1.3119
+-0.028254 -0.022494 -1.3116
+-0.02702 -0.022494 -1.3116
+-0.019671 -0.022554 -1.3151
+-0.018459 -0.022585 -1.3169
+-0.017225 -0.022591 -1.3173
+-0.015987 -0.022592 -1.3174
+-0.014748 -0.022592 -1.3174
+-0.013512 -0.022597 -1.3177
+-0.012274 -0.0226 -1.3178
+-0.009798 -0.022606 -1.3182
+-0.008564 -0.022622 -1.3191
+-0.007327 -0.022633 -1.3198
+-0.006088 -0.022641 -1.3203
+-0.004849 -0.022653 -1.321
+-0.003611 -0.022685 -1.3229
+-0.002369 -0.0227 -1.3237
+-0.001124 -0.022704 -1.324
+0.000121 -0.022718 -1.3248
+0.002617 -0.022748 -1.3266
+0.010162 -0.022883 -1.3345
+0.012733 -0.022993 -1.341
+0.015306 -0.02307 -1.3455
+0.071478 -0.020334 -1.1842
+0.073445 -0.020261 -1.1799
+0.11758 -0.020208 -1.1766
+0.13299 -0.020887 -1.2166
+0.13569 -0.02095 -1.2203
+0.14695 -0.020918 -1.2183
+0.14921 -0.020913 -1.218
+0.15058 -0.020324 -1.1833
+0.15169 -0.020323 -1.1832
+0.15391 -0.020322 -1.1831
+0.1704 -0.020163 -1.1737
+0.18058 -0.020065 -1.1679
+0.18163 -0.02006 -1.1676
+0.18264 -0.02005 -1.167
+0.21637 -0.020119 -1.1709
+0.21997 -0.020247 -1.1784
+0.22349 -0.020366 -1.1854
+0.22577 -0.02037 -1.1856
+0.24329 -0.02034 -1.1838
+0.24462 -0.020359 -1.1849
+-0.081725 -0.02071 -1.1429
+-0.080616 -0.020701 -1.1424
+-0.079536 -0.0207 -1.1424
+-0.072711 -0.020596 -1.1366
+-0.07164 -0.020596 -1.1366
+-0.029376 -0.023639 -1.3066
+-0.028145 -0.023637 -1.3065
+-0.025711 -0.023659 -1.3077
+-0.023336 -0.023746 -1.3125
+-0.020905 -0.023788 -1.3149
+-0.018465 -0.023833 -1.3174
+-0.015985 -0.023829 -1.3172
+-0.01351 -0.023834 -1.3175
+-0.011032 -0.023834 -1.3175
+-0.008541 -0.023801 -1.3156
+-0.006067 -0.023802 -1.3157
+-0.001121 -0.023886 -1.3204
+0.001366 -0.023949 -1.3239
+0.003865 -0.023999 -1.3267
+0.006378 -0.024066 -1.3304
+0.008894 -0.024102 -1.3325
+0.010156 -0.024125 -1.3337
+0.011414 -0.024132 -1.3341
+0.012698 -0.024189 -1.3373
+0.014018 -0.024297 -1.3433
+0.071486 -0.021452 -1.1843
+0.072465 -0.021412 -1.1821
+0.074433 -0.021337 -1.1779
+0.078373 -0.021203 -1.1704
+0.080361 -0.021146 -1.1672
+0.082452 -0.021118 -1.1657
+0.086809 -0.02111 -1.1652
+0.091191 -0.021108 -1.1651
+0.095648 -0.021123 -1.1659
+0.10015 -0.021146 -1.1671
+0.10468 -0.021174 -1.1687
+0.10929 -0.021213 -1.1708
+0.11398 -0.021265 -1.1737
+0.11634 -0.021293 -1.1753
+0.1184 -0.021264 -1.1736
+0.11989 -0.021138 -1.1666
+0.13337 -0.022096 -1.2201
+0.13473 -0.022131 -1.222
+0.13729 -0.022173 -1.2243
+0.14209 -0.022202 -1.226
+0.14447 -0.022213 -1.2265
+0.14661 -0.022188 -1.2251
+0.14773 -0.022182 -1.2248
+0.14846 -0.022119 -1.2213
+0.14956 -0.022113 -1.2209
+0.15057 -0.021438 -1.1832
+0.15281 -0.021439 -1.1833
+0.15393 -0.021439 -1.1833
+0.15486 -0.021414 -1.1819
+0.15876 -0.02134 -1.1777
+0.16286 -0.021296 -1.1752
+0.16736 -0.021305 -1.1757
+0.16928 -0.021267 -1.1736
+0.17117 -0.021229 -1.1714
+0.17323 -0.02121 -1.1704
+0.17534 -0.021198 -1.1697
+0.17738 -0.021179 -1.1686
+0.17942 -0.02116 -1.1675
+0.18136 -0.02113 -1.1659
+0.18338 -0.021109 -1.1647
+0.18544 -0.021094 -1.1638
+0.1875 -0.021079 -1.163
+0.19186 -0.021076 -1.1628
+0.19625 -0.021077 -1.1628
+0.20072 -0.021086 -1.1633
+0.20522 -0.021098 -1.1639
+0.20981 -0.021118 -1.1651
+0.21509 -0.021206 -1.17
+0.21635 -0.021221 -1.1708
+0.21794 -0.021269 -1.1734
+0.22235 -0.021482 -1.1853
+0.22382 -0.021516 -1.1872
+0.22494 -0.021516 -1.1872
+0.2271 -0.021508 -1.1868
+0.23136 -0.021489 -1.1857
+0.23559 -0.021467 -1.1844
+0.23986 -0.021449 -1.1834
+0.24207 -0.021448 -1.1833
+0.2446 -0.021473 -1.1848
+-0.083785 -0.021763 -1.1416
+-0.082654 -0.021748 -1.1408
+-0.081531 -0.021736 -1.1401
+-0.079297 -0.021712 -1.1389
+-0.075827 -0.02164 -1.1351
+-0.07469 -0.021621 -1.1341
+-0.073592 -0.021612 -1.1336
+-0.07251 -0.021608 -1.1334
+-0.070344 -0.021599 -1.1329
+-0.064961 -0.021583 -1.1321
+-0.063955 -0.021604 -1.1332
+-0.062964 -0.02163 -1.1346
+-0.062 -0.021667 -1.1366
+-0.061055 -0.021712 -1.1389
+-0.028113 -0.024839 -1.305
+-0.026901 -0.024853 -1.3057
+-0.022115 -0.024997 -1.3134
+-0.02091 -0.025032 -1.3153
+-0.019687 -0.025051 -1.3162
+-0.017221 -0.025065 -1.317
+-0.015979 -0.02506 -1.3167
+-0.014734 -0.025049 -1.3162
+-0.012243 -0.025017 -1.3145
+-0.009755 -0.024979 -1.3124
+-0.008507 -0.024939 -1.3103
+-0.007272 -0.02493 -1.3099
+-0.006037 -0.024916 -1.3091
+-0.001117 -0.025042 -1.3158
+0.000121 -0.025125 -1.3202
+0.002614 -0.025216 -1.325
+0.007625 -0.025306 -1.3298
+0.008879 -0.025316 -1.3303
+0.070548 -0.022625 -1.1874
+0.071504 -0.022574 -1.1846
+0.073479 -0.022495 -1.1805
+0.081361 -0.022219 -1.1658
+0.11734 -0.022379 -1.1741
+0.11789 -0.022275 -1.1686
+0.119 -0.022275 -1.1686
+0.12098 -0.022236 -1.1665
+0.12213 -0.022244 -1.1669
+0.13357 -0.02328 -1.2219
+0.13612 -0.023324 -1.2242
+0.14791 -0.023365 -1.2263
+0.14887 -0.023334 -1.2247
+0.14951 -0.022562 -1.1837
+0.15383 -0.022541 -1.1825
+0.17406 -0.022279 -1.1685
+0.17512 -0.022274 -1.1683
+0.17621 -0.022271 -1.1681
+0.17721 -0.022259 -1.1675
+0.17805 -0.022227 -1.1658
+0.18194 -0.022165 -1.1625
+0.18304 -0.022165 -1.1625
+0.1842 -0.022174 -1.1629
+0.18637 -0.022172 -1.1628
+0.21645 -0.022336 -1.1714
+0.22026 -0.0225 -1.18
+0.22404 -0.022657 -1.1884
+0.22631 -0.022659 -1.1885
+0.2459 -0.022608 -1.1857
+-0.087141 -0.022873 -1.1433
+-0.084768 -0.022814 -1.1403
+-0.082464 -0.022771 -1.1382
+-0.080213 -0.022741 -1.1366
+-0.077907 -0.022693 -1.1342
+-0.076757 -0.02267 -1.133
+-0.075615 -0.022647 -1.1319
+-0.073412 -0.022626 -1.1308
+-0.071226 -0.022608 -1.1299
+-0.06904 -0.022589 -1.129
+-0.066883 -0.022579 -1.1285
+-0.065849 -0.02259 -1.129
+-0.064836 -0.022607 -1.1299
+-0.062832 -0.022652 -1.1322
+-0.060925 -0.022737 -1.1365
+-0.059978 -0.022784 -1.1389
+-0.059005 -0.022823 -1.1408
+-0.028109 -0.026064 -1.3048
+-0.025701 -0.026111 -1.3072
+-0.023283 -0.026157 -1.3095
+-0.020877 -0.026229 -1.3132
+-0.01967 -0.026266 -1.315
+-0.018433 -0.026266 -1.315
+-0.015942 -0.026239 -1.3137
+-0.013462 -0.026222 -1.3128
+-0.010978 -0.026187 -1.3111
+-0.008506 -0.026169 -1.3101
+-0.006036 -0.026144 -1.3089
+-0.004803 -0.026136 -1.3085
+-0.003574 -0.026144 -1.3089
+-0.002344 -0.026156 -1.3095
+-0.001117 -0.026277 -1.3156
+0.001363 -0.026373 -1.3204
+0.003862 -0.026478 -1.3258
+0.006364 -0.026511 -1.3274
+0.007614 -0.026517 -1.3277
+0.070545 -0.023742 -1.1873
+0.072522 -0.023658 -1.183
+0.074511 -0.023582 -1.1792
+0.076499 -0.023511 -1.1756
+0.080369 -0.023349 -1.1673
+0.081333 -0.02331 -1.1654
+0.082415 -0.023305 -1.1652
+0.084589 -0.023299 -1.1648
+0.11149 -0.023418 -1.1707
+0.11379 -0.023438 -1.1717
+0.116 -0.023439 -1.1718
+0.11673 -0.023364 -1.168
+0.11773 -0.023344 -1.167
+0.12007 -0.023373 -1.1684
+0.12145 -0.023425 -1.1711
+0.12258 -0.02343 -1.1713
+0.1337 -0.024456 -1.2232
+0.13489 -0.024464 -1.2235
+0.1375 -0.024517 -1.2262
+0.13991 -0.024535 -1.2271
+0.14223 -0.024537 -1.2272
+0.14453 -0.024536 -1.2271
+0.14677 -0.024523 -1.2265
+0.14791 -0.02452 -1.2263
+0.1498 -0.023722 -1.1859
+0.15083 -0.023709 -1.1852
+0.15283 -0.023673 -1.1834
+0.15478 -0.02363 -1.1812
+0.15671 -0.023586 -1.179
+0.15871 -0.023553 -1.1773
+0.16085 -0.023542 -1.1767
+0.16511 -0.023517 -1.1755
+0.16689 -0.023456 -1.1724
+0.16847 -0.023368 -1.1679
+0.1704 -0.023331 -1.166
+0.17253 -0.023322 -1.1656
+0.17449 -0.02329 -1.164
+0.1751 -0.023226 -1.1607
+0.17619 -0.023225 -1.1607
+0.17853 -0.023245 -1.1617
+0.18079 -0.023254 -1.1621
+0.18298 -0.023254 -1.1621
+0.18519 -0.023258 -1.1622
+0.18734 -0.023252 -1.162
+0.18944 -0.023241 -1.1614
+0.21239 -0.023358 -1.1672
+0.2152 -0.023424 -1.1705
+0.21801 -0.023489 -1.1738
+0.223 -0.023786 -1.1888
+0.22548 -0.023811 -1.1901
+0.22763 -0.023802 -1.1896
+0.22972 -0.023786 -1.1888
+0.24235 -0.023706 -1.1847
+0.24468 -0.023716 -1.1852
+0.24594 -0.02373 -1.1859
+-0.07656 -0.023677 -1.1301
+-0.074335 -0.023647 -1.1286
+-0.067772 -0.023583 -1.1256
+-0.066716 -0.023584 -1.1256
+-0.065688 -0.023596 -1.1262
+-0.05985 -0.023807 -1.1364
+-0.058901 -0.023856 -1.1388
+-0.057926 -0.023896 -1.1407
+-0.026905 -0.027315 -1.3059
+-0.024479 -0.02735 -1.3076
+-0.022046 -0.027383 -1.3092
+-0.019601 -0.027407 -1.3104
+-0.017131 -0.027399 -1.31
+-0.015891 -0.027388 -1.3094
+-0.01466 -0.027388 -1.3094
+-0.012215 -0.027429 -1.3114
+-0.010977 -0.027417 -1.3109
+-0.009743 -0.027414 -1.3107
+-0.00851 -0.027414 -1.3107
+-0.007277 -0.027414 -1.3107
+-0.006045 -0.027416 -1.3108
+-0.004823 -0.027478 -1.3138
+-0.003587 -0.027478 -1.3138
+-0.002354 -0.027514 -1.3155
+0.005106 -0.027712 -1.3251
+0.006355 -0.027722 -1.3256
+0.007602 -0.027722 -1.3256
+0.069548 -0.024905 -1.1894
+0.081348 -0.024413 -1.1656
+0.11686 -0.024493 -1.1693
+0.11772 -0.024442 -1.1669
+0.11907 -0.024494 -1.1694
+0.12028 -0.024516 -1.1704
+0.12144 -0.024527 -1.171
+0.12381 -0.02456 -1.1725
+0.13489 -0.025615 -1.2235
+0.13627 -0.025659 -1.2256
+0.13876 -0.025693 -1.2272
+0.14101 -0.025681 -1.2266
+0.14785 -0.025665 -1.2258
+0.14889 -0.024876 -1.1877
+0.14986 -0.02485 -1.1864
+0.15573 -0.024717 -1.18
+0.15668 -0.024692 -1.1788
+0.15768 -0.024676 -1.178
+0.16577 -0.024559 -1.1723
+0.16653 -0.024508 -1.1698
+0.16753 -0.024493 -1.1691
+0.16932 -0.024433 -1.1662
+0.17508 -0.024319 -1.1606
+0.17617 -0.024318 -1.1606
+0.17741 -0.024337 -1.1615
+0.22048 -0.024749 -1.1812
+0.22319 -0.024928 -1.1898
+0.22457 -0.024957 -1.1912
+0.22684 -0.024959 -1.1913
+0.24598 -0.024852 -1.1861
+0.24722 -0.024865 -1.1867
+-0.10806 -0.024885 -1.1365
+-0.1035 -0.02482 -1.1336
+-0.10242 -0.024816 -1.1334
+-0.086667 -0.024893 -1.137
+-0.082141 -0.02482 -1.1337
+-0.077568 -0.024724 -1.1292
+-0.0753 -0.024678 -1.1271
+-0.073094 -0.024651 -1.1258
+-0.070835 -0.024603 -1.1237
+-0.068713 -0.024601 -1.1236
+-0.066646 -0.02462 -1.1245
+-0.064611 -0.024652 -1.1259
+-0.060697 -0.024787 -1.1322
+-0.059694 -0.024813 -1.1334
+-0.026904 -0.028543 -1.3059
+-0.025706 -0.028577 -1.3074
+-0.024499 -0.028603 -1.3086
+-0.023265 -0.0286 -1.3085
+-0.020795 -0.028588 -1.308
+-0.018294 -0.028525 -1.3051
+-0.017066 -0.028525 -1.3051
+-0.01587 -0.028581 -1.3076
+-0.013451 -0.028669 -1.3117
+-0.012246 -0.028736 -1.3148
+-0.011009 -0.028736 -1.3148
+-0.009762 -0.028703 -1.3133
+-0.008536 -0.028734 -1.3147
+-0.006062 -0.028734 -1.3147
+-0.00359 -0.02874 -1.315
+-0.001117 -0.028762 -1.316
+0.001359 -0.028785 -1.317
+0.003845 -0.028843 -1.3197
+0.005092 -0.02888 -1.3214
+0.069581 -0.026038 -1.19
+0.070578 -0.025992 -1.1879
+0.074603 -0.025837 -1.1807
+0.078508 -0.025659 -1.1725
+0.080426 -0.025567 -1.1682
+0.082412 -0.025501 -1.1651
+0.086698 -0.02547 -1.1637
+0.091094 -0.025473 -1.1638
+0.095538 -0.025489 -1.1645
+0.099993 -0.025507 -1.1653
+0.1045 -0.025535 -1.1666
+0.10904 -0.025568 -1.1681
+0.11357 -0.025599 -1.1695
+0.11579 -0.025601 -1.1696
+0.11796 -0.025594 -1.1693
+0.12024 -0.02561 -1.17
+0.12257 -0.025636 -1.1712
+0.12375 -0.025654 -1.172
+0.13741 -0.026811 -1.2254
+0.13863 -0.026823 -1.226
+0.13975 -0.026816 -1.2257
+0.14199 -0.026803 -1.225
+0.14655 -0.026794 -1.2246
+0.14899 -0.026011 -1.1884
+0.15096 -0.025966 -1.1863
+0.15477 -0.025855 -1.1812
+0.15668 -0.025804 -1.1788
+0.15878 -0.025783 -1.1778
+0.16316 -0.025775 -1.1774
+0.16491 -0.025702 -1.174
+0.16652 -0.025609 -1.1697
+0.16842 -0.025563 -1.1676
+0.1704 -0.02553 -1.166
+0.17237 -0.025497 -1.1645
+0.17438 -0.025469 -1.1632
+0.17641 -0.025446 -1.1622
+0.17851 -0.025434 -1.1615
+0.1828 -0.025421 -1.1609
+0.18708 -0.025408 -1.1603
+0.19156 -0.025422 -1.1609
+0.19606 -0.025438 -1.1617
+0.20047 -0.025443 -1.1619
+0.20499 -0.025459 -1.1626
+0.20977 -0.025508 -1.1648
+0.21522 -0.025634 -1.1706
+0.21819 -0.025725 -1.1748
+0.2204 -0.025854 -1.1808
+0.22299 -0.026026 -1.1887
+0.22455 -0.026078 -1.1911
+0.22569 -0.02608 -1.1912
+0.22794 -0.02608 -1.1912
+0.23018 -0.02608 -1.1912
+0.23233 -0.026068 -1.1906
+0.23641 -0.026024 -1.1886
+0.24069 -0.026002 -1.1875
+0.24492 -0.025976 -1.1863
+0.24726 -0.025987 -1.1868
+-0.11356 -0.025989 -1.138
+-0.11235 -0.025959 -1.1367
+-0.11121 -0.025943 -1.1359
+-0.11007 -0.025925 -1.1351
+-0.10894 -0.025912 -1.1346
+-0.10216 -0.02582 -1.1305
+-0.1011 -0.02582 -1.1305
+-0.10003 -0.025819 -1.1305
+-0.098923 -0.025809 -1.13
+-0.097858 -0.025808 -1.13
+-0.069641 -0.025613 -1.1215
+-0.059526 -0.025809 -1.1302
+-0.024533 -0.029877 -1.3105
+-0.023316 -0.029897 -1.3114
+-0.022031 -0.029827 -1.3083
+-0.020776 -0.029792 -1.3068
+-0.019493 -0.029711 -1.3031
+-0.018266 -0.029707 -1.303
+-0.017058 -0.02974 -1.3044
+-0.015847 -0.02977 -1.3058
+-0.014679 -0.029891 -1.3111
+-0.013479 -0.029965 -1.3144
+-0.01225 -0.029983 -1.3152
+-0.009773 -0.029975 -1.3149
+-0.007298 -0.029967 -1.3145
+0.005082 -0.03006 -1.3186
+0.069597 -0.027165 -1.1902
+0.12131 -0.026708 -1.1698
+0.12374 -0.026756 -1.1719
+0.13957 -0.027935 -1.2241
+0.14069 -0.027929 -1.2238
+0.14815 -0.027184 -1.1907
+0.14998 -0.027109 -1.1874
+0.16575 -0.026765 -1.1721
+0.22024 -0.026948 -1.1799
+0.22212 -0.027041 -1.184
+0.22409 -0.027145 -1.1886
+0.22556 -0.027187 -1.1905
+0.22676 -0.027196 -1.1909
+0.24614 -0.027107 -1.1868
+0.24735 -0.027116 -1.1873
+-0.11566 -0.027053 -1.1376
+-0.11449 -0.027029 -1.1366
+-0.11211 -0.026971 -1.1341
+-0.10982 -0.026936 -1.1326
+-0.10759 -0.026911 -1.1316
+-0.10531 -0.026875 -1.13
+-0.10311 -0.026854 -1.1291
+-0.10092 -0.026838 -1.1285
+-0.09871 -0.026816 -1.1276
+-0.096555 -0.026808 -1.1272
+-0.084008 -0.026872 -1.13
+-0.081892 -0.026876 -1.1302
+-0.079617 -0.026827 -1.1281
+-0.077324 -0.026769 -1.1256
+-0.075067 -0.026721 -1.1236
+-0.072842 -0.026681 -1.1219
+-0.070645 -0.02665 -1.1206
+-0.069566 -0.026641 -1.1202
+-0.068524 -0.026647 -1.1205
+-0.066476 -0.026672 -1.1215
+-0.062401 -0.026737 -1.1243
+-0.060368 -0.026775 -1.126
+-0.059355 -0.026797 -1.1269
+-0.024545 -0.031126 -1.3112
+-0.023317 -0.031133 -1.3115
+-0.022079 -0.031127 -1.3112
+-0.020716 -0.030933 -1.3029
+-0.018262 -0.030928 -1.3028
+-0.015892 -0.031085 -1.3094
+-0.013476 -0.031197 -1.3142
+-0.012251 -0.031223 -1.3153
+-0.011014 -0.031223 -1.3153
+-0.008534 -0.031204 -1.3145
+-0.00606 -0.031198 -1.3142
+-0.00359 -0.031211 -1.3148
+0.001357 -0.031212 -1.3148
+0.003831 -0.031218 -1.3151
+0.06968 -0.02832 -1.1917
+0.070654 -0.028261 -1.1892
+0.072686 -0.028181 -1.1857
+0.080511 -0.027798 -1.1694
+0.082469 -0.027716 -1.1659
+0.084507 -0.027664 -1.1637
+0.086654 -0.02765 -1.1631
+0.08885 -0.027651 -1.1631
+0.1156 -0.02776 -1.1676
+0.12005 -0.027773 -1.1682
+0.1212 -0.027785 -1.1687
+0.1225 -0.02783 -1.1706
+0.12394 -0.027904 -1.1737
+0.14055 -0.029053 -1.2226
+0.14167 -0.029047 -1.2223
+0.14389 -0.02903 -1.2216
+0.14611 -0.029015 -1.2209
+0.1482 -0.028315 -1.1911
+0.14906 -0.028266 -1.189
+0.15088 -0.028188 -1.1857
+0.15279 -0.028127 -1.1831
+0.15678 -0.028045 -1.1796
+0.1613 -0.028057 -1.1801
+0.16354 -0.028059 -1.1801
+0.16511 -0.02795 -1.1755
+0.16573 -0.027868 -1.172
+0.16667 -0.02784 -1.1708
+0.16853 -0.027783 -1.1684
+0.17043 -0.027735 -1.1663
+0.17229 -0.02768 -1.164
+0.17423 -0.02764 -1.1622
+0.17626 -0.027615 -1.1612
+0.2182 -0.027941 -1.1748
+0.22009 -0.02804 -1.1791
+0.22773 -0.0283 -1.1901
+0.23026 -0.028336 -1.1916
+0.23259 -0.028345 -1.192
+0.23471 -0.028331 -1.1914
+0.23678 -0.028309 -1.1904
+0.23886 -0.02829 -1.1896
+0.24308 -0.02826 -1.1883
+0.24516 -0.028241 -1.1875
+0.24746 -0.028249 -1.1878
+0.24864 -0.028256 -1.1881
+-0.11786 -0.028139 -1.1381
+-0.11667 -0.028111 -1.1369
+-0.11548 -0.028081 -1.1357
+-0.11309 -0.02802 -1.1333
+-0.097368 -0.0278 -1.1243
+-0.096217 -0.027773 -1.1232
+-0.08376 -0.027855 -1.1266
+-0.08278 -0.027882 -1.1277
+-0.071633 -0.027681 -1.1195
+-0.070556 -0.027672 -1.1192
+-0.06949 -0.027668 -1.119
+-0.0592 -0.027787 -1.1239
+-0.058168 -0.0278 -1.1244
+-0.057135 -0.027813 -1.125
+-0.056114 -0.027832 -1.1258
+-0.024532 -0.032342 -1.3104
+-0.022057 -0.032329 -1.3099
+-0.020808 -0.032302 -1.3088
+-0.019487 -0.032154 -1.3027
+-0.017117 -0.032307 -1.309
+-0.012243 -0.032441 -1.3145
+0.068676 -0.029494 -1.1938
+0.069732 -0.029465 -1.1926
+0.08346 -0.028778 -1.1644
+0.085574 -0.028752 -1.1633
+0.12115 -0.028875 -1.1682
+0.12402 -0.02903 -1.1745
+0.14155 -0.030172 -1.2212
+0.14264 -0.03016 -1.2207
+0.14489 -0.030151 -1.2203
+0.146 -0.030141 -1.2199
+0.14818 -0.029435 -1.191
+0.14995 -0.029342 -1.1872
+0.16268 -0.029217 -1.182
+0.16378 -0.029216 -1.1819
+0.16476 -0.029192 -1.181
+0.16611 -0.029039 -1.1747
+0.17119 -0.028777 -1.1639
+0.17215 -0.028754 -1.163
+0.17312 -0.028733 -1.1621
+0.22003 -0.029145 -1.1788
+0.24875 -0.029388 -1.1886
+-0.12007 -0.029229 -1.1388
+-0.11888 -0.0292 -1.1376
+-0.11647 -0.029133 -1.135
+-0.11416 -0.029089 -1.1332
+-0.11189 -0.029054 -1.1319
+-0.10714 -0.028924 -1.1268
+-0.10266 -0.028858 -1.1242
+-0.098202 -0.028794 -1.1217
+-0.095949 -0.028752 -1.1201
+-0.094826 -0.028732 -1.1193
+-0.093786 -0.028736 -1.1194
+-0.082574 -0.028873 -1.1249
+-0.081526 -0.028878 -1.1251
+-0.079352 -0.028858 -1.1243
+-0.077102 -0.028809 -1.1224
+-0.072655 -0.028723 -1.119
+-0.070469 -0.028692 -1.1178
+-0.068371 -0.028696 -1.1179
+-0.064243 -0.028734 -1.1194
+-0.060084 -0.028763 -1.1206
+-0.058019 -0.028786 -1.1215
+-0.055974 -0.028822 -1.1229
+-0.054983 -0.028857 -1.1243
+-0.05397 -0.028882 -1.1253
+-0.051959 -0.028942 -1.1277
+-0.049946 -0.029007 -1.1303
+-0.023281 -0.03355 -1.3094
+-0.020805 -0.033529 -1.3086
+-0.018342 -0.033526 -1.3085
+-0.015891 -0.033549 -1.3094
+-0.013452 -0.033609 -1.3117
+-0.011005 -0.033673 -1.3143
+-0.006059 -0.033664 -1.3139
+-0.003587 -0.033664 -1.3139
+-0.001115 -0.033643 -1.3131
+0.001352 -0.033574 -1.3104
+0.069776 -0.030609 -1.1933
+0.070775 -0.030555 -1.1912
+0.07281 -0.030468 -1.1878
+0.074852 -0.030388 -1.1846
+0.078651 -0.030134 -1.1746
+0.080582 -0.03003 -1.1705
+0.082551 -0.029944 -1.1671
+0.084545 -0.029872 -1.1642
+0.086648 -0.029841 -1.163
+0.091001 -0.029831 -1.1626
+0.095444 -0.029851 -1.1634
+0.099866 -0.029862 -1.1638
+0.10431 -0.02988 -1.1645
+0.10879 -0.029905 -1.1654
+0.11325 -0.029923 -1.1661
+0.11771 -0.029939 -1.1668
+0.11996 -0.029951 -1.1672
+0.12254 -0.030045 -1.1709
+0.12414 -0.030167 -1.1757
+0.12552 -0.030231 -1.1782
+0.14259 -0.0313 -1.2203
+0.1437 -0.031291 -1.2199
+0.14483 -0.031287 -1.2198
+0.14743 -0.030633 -1.194
+0.14907 -0.030509 -1.1891
+0.15082 -0.03041 -1.1851
+0.15474 -0.030304 -1.1809
+0.15924 -0.030313 -1.1813
+0.16168 -0.030353 -1.1828
+0.16378 -0.030329 -1.1819
+0.16567 -0.030268 -1.1795
+0.16701 -0.030109 -1.1732
+0.16857 -0.029994 -1.1687
+0.17044 -0.029934 -1.1663
+0.17214 -0.029848 -1.1629
+0.17406 -0.029803 -1.1611
+0.17817 -0.029758 -1.1593
+0.18242 -0.029738 -1.1585
+0.18682 -0.029744 -1.1587
+0.19134 -0.029768 -1.1596
+0.19574 -0.029772 -1.1598
+0.20011 -0.029772 -1.1598
+0.2046 -0.029789 -1.1604
+0.20989 -0.029919 -1.1655
+0.2157 -0.030117 -1.1733
+0.21851 -0.030199 -1.1765
+0.2201 -0.030266 -1.1791
+0.23002 -0.030551 -1.1903
+0.2327 -0.030608 -1.1926
+0.23501 -0.030616 -1.1929
+0.23719 -0.030607 -1.1925
+0.24142 -0.030574 -1.1912
+0.24556 -0.030531 -1.1895
+0.24774 -0.030523 -1.1892
+0.24885 -0.030522 -1.1891
+-0.12111 -0.030295 -1.1384
+-0.11991 -0.03026 -1.1371
+-0.11753 -0.0302 -1.1348
+-0.09464 -0.029729 -1.117
+-0.092422 -0.029692 -1.1157
+-0.091325 -0.029678 -1.1151
+-0.090225 -0.029662 -1.1145
+-0.085083 -0.0297 -1.116
+-0.081293 -0.029853 -1.1218
+-0.080276 -0.029868 -1.1224
+-0.078127 -0.029855 -1.1219
+-0.054867 -0.029854 -1.1219
+-0.052852 -0.02991 -1.1241
+-0.048842 -0.030049 -1.1294
+-0.047844 -0.03009 -1.1309
+-0.046827 -0.030122 -1.1321
+-0.022031 -0.034752 -1.3083
+-0.004813 -0.034829 -1.3112
+-0.002343 -0.034777 -1.3092
+0.069806 -0.031747 -1.1939
+0.07187 -0.031665 -1.1908
+0.073908 -0.031578 -1.1874
+0.079626 -0.03119 -1.1727
+0.081616 -0.031107 -1.1695
+0.12118 -0.031083 -1.1684
+0.12439 -0.031339 -1.1781
+0.12568 -0.031384 -1.1798
+0.12772 -0.031339 -1.1781
+0.14367 -0.032435 -1.2197
+0.14474 -0.032417 -1.219
+0.14637 -0.031774 -1.1946
+0.1681 -0.031213 -1.1731
+0.16911 -0.031194 -1.1724
+0.17003 -0.031161 -1.1711
+0.22028 -0.031404 -1.1801
+0.23129 -0.031693 -1.1911
+0.23397 -0.031752 -1.1933
+0.23627 -0.031759 -1.1936
+0.24897 -0.031658 -1.1897
+-0.12216 -0.031361 -1.1382
+-0.12096 -0.031327 -1.1369
+-0.11852 -0.031249 -1.1341
+-0.11618 -0.031196 -1.1321
+-0.11368 -0.031096 -1.1285
+-0.1113 -0.031023 -1.1258
+-0.10889 -0.030942 -1.1228
+-0.095549 -0.030736 -1.1153
+-0.093279 -0.030681 -1.1133
+-0.091076 -0.030646 -1.112
+-0.088963 -0.03064 -1.1118
+-0.086878 -0.030644 -1.112
+-0.085875 -0.03066 -1.1126
+-0.084891 -0.030683 -1.1134
+-0.083868 -0.030692 -1.1138
+-0.082924 -0.030732 -1.1152
+-0.081974 -0.03077 -1.1166
+-0.081058 -0.030821 -1.1185
+-0.079115 -0.030886 -1.1209
+-0.076927 -0.030856 -1.1198
+-0.074711 -0.030812 -1.1182
+-0.070346 -0.030746 -1.1158
+-0.057825 -0.030798 -1.1177
+-0.055769 -0.030826 -1.1188
+-0.053753 -0.030879 -1.1207
+-0.051731 -0.030933 -1.1227
+-0.049741 -0.031011 -1.1256
+-0.047773 -0.03111 -1.1292
+-0.045757 -0.031187 -1.132
+-0.023245 -0.035959 -1.3074
+-0.020782 -0.035953 -1.3072
+-0.018324 -0.035954 -1.3072
+-0.013431 -0.036023 -1.3097
+-0.010989 -0.036095 -1.3124
+-0.008514 -0.036068 -1.3114
+-0.006036 -0.036001 -1.3089
+-0.004802 -0.035978 -1.3081
+-0.003568 -0.035945 -1.3069
+0.069801 -0.032869 -1.1938
+0.070925 -0.032869 -1.1938
+0.071958 -0.032828 -1.1922
+0.072984 -0.032784 -1.1906
+0.075031 -0.032699 -1.1875
+0.077046 -0.032606 -1.1841
+0.078753 -0.03239 -1.1761
+0.079646 -0.032303 -1.1729
+0.080654 -0.032265 -1.1715
+0.082656 -0.032185 -1.1686
+0.08464 -0.032103 -1.1656
+0.11544 -0.032118 -1.166
+0.11999 -0.032162 -1.1676
+0.12123 -0.032199 -1.169
+0.12288 -0.032344 -1.1743
+0.12453 -0.032485 -1.1794
+0.12589 -0.032548 -1.1817
+0.12706 -0.032564 -1.1823
+0.12827 -0.032589 -1.1832
+0.12936 -0.032582 -1.183
+0.14475 -0.033568 -1.2191
+0.14636 -0.032896 -1.1944
+0.14744 -0.032887 -1.1941
+0.14911 -0.03276 -1.1894
+0.1508 -0.03264 -1.185
+0.15281 -0.032594 -1.1833
+0.1572 -0.032578 -1.1827
+0.16178 -0.032604 -1.1836
+0.16355 -0.032513 -1.1803
+0.16527 -0.032413 -1.1766
+0.16711 -0.03234 -1.1739
+0.16909 -0.032296 -1.1723
+0.17111 -0.03226 -1.171
+0.17294 -0.032191 -1.1684
+0.1741 -0.031999 -1.1613
+0.17602 -0.031951 -1.1596
+0.1781 -0.031932 -1.1589
+0.18018 -0.031913 -1.1581
+0.20209 -0.031927 -1.1585
+0.21309 -0.03227 -1.1711
+0.21596 -0.032369 -1.1747
+0.21887 -0.032473 -1.1785
+0.2205 -0.032548 -1.1813
+0.23253 -0.032833 -1.1917
+0.23394 -0.032873 -1.1932
+0.2352 -0.032893 -1.1939
+0.23749 -0.032898 -1.1941
+0.23969 -0.03289 -1.1938
+0.24798 -0.032798 -1.1903
+0.2491 -0.032796 -1.1903
+-0.12713 -0.032335 -1.1346
+-0.1261 -0.032346 -1.135
+-0.12512 -0.032368 -1.1358
+-0.12417 -0.032399 -1.1369
+-0.1231 -0.032399 -1.1369
+-0.12192 -0.03237 -1.1359
+-0.11955 -0.032309 -1.1337
+-0.11703 -0.032203 -1.13
+-0.091917 -0.031623 -1.1095
+-0.090839 -0.031612 -1.1091
+-0.089787 -0.03161 -1.109
+-0.085687 -0.031639 -1.1101
+-0.0837 -0.031679 -1.1115
+-0.081747 -0.031734 -1.1135
+-0.077919 -0.031886 -1.1189
+-0.044687 -0.032252 -1.132
+-0.043681 -0.032297 -1.1336
+-0.022 -0.037164 -1.3064
+-0.007258 -0.037184 -1.3072
+-0.006021 -0.037139 -1.3055
+0.073076 -0.033949 -1.1921
+0.074098 -0.033903 -1.1905
+0.078062 -0.033679 -1.1825
+0.079677 -0.033422 -1.1734
+0.081679 -0.033337 -1.1704
+0.12142 -0.033353 -1.1708
+0.12449 -0.033585 -1.179
+0.12701 -0.033666 -1.1819
+0.12943 -0.033714 -1.1836
+0.13054 -0.033715 -1.1836
+0.13166 -0.033715 -1.1836
+0.14641 -0.034035 -1.1949
+0.14978 -0.03378 -1.1858
+0.16402 -0.033493 -1.1756
+0.16585 -0.033417 -1.1728
+0.17519 -0.033093 -1.1613
+0.17603 -0.033046 -1.1596
+0.17705 -0.033032 -1.1591
+0.21747 -0.033539 -1.1769
+0.219 -0.033604 -1.1792
+0.23502 -0.033992 -1.193
+0.23631 -0.034015 -1.1938
+0.24924 -0.033938 -1.191
+-0.12801 -0.033354 -1.1329
+-0.12693 -0.033353 -1.1328
+-0.12487 -0.033371 -1.1335
+-0.12286 -0.033405 -1.1346
+-0.12042 -0.033322 -1.1318
+-0.11794 -0.033226 -1.1285
+-0.1155 -0.033136 -1.1254
+-0.11083 -0.033009 -1.1211
+-0.1064 -0.032946 -1.1189
+-0.10192 -0.03286 -1.116
+-0.097407 -0.032758 -1.1125
+-0.092878 -0.03264 -1.1085
+-0.090738 -0.032622 -1.1078
+-0.088647 -0.03262 -1.1078
+-0.086608 -0.032639 -1.1085
+-0.084567 -0.032658 -1.1091
+-0.082587 -0.032701 -1.1106
+-0.080628 -0.032756 -1.1125
+-0.078741 -0.032844 -1.1155
+-0.077835 -0.032905 -1.1176
+-0.076782 -0.032905 -1.1176
+-0.074578 -0.032862 -1.1162
+-0.072391 -0.032825 -1.1149
+-0.068126 -0.032794 -1.1139
+-0.063902 -0.032781 -1.1134
+-0.059715 -0.032787 -1.1136
+-0.055546 -0.032804 -1.1142
+-0.051473 -0.032885 -1.117
+-0.049472 -0.032954 -1.1194
+-0.047546 -0.033082 -1.1238
+-0.045631 -0.033229 -1.1289
+-0.043623 -0.033321 -1.132
+-0.042619 -0.033369 -1.1337
+-0.041606 -0.033414 -1.1352
+-0.023212 -0.038365 -1.3055
+-0.020755 -0.038364 -1.3054
+-0.018301 -0.038368 -1.3056
+-0.015851 -0.038381 -1.306
+-0.010955 -0.038447 -1.3083
+-0.008486 -0.038408 -1.3069
+-0.00725 -0.038373 -1.3057
+0.074219 -0.035082 -1.1925
+0.075271 -0.035049 -1.1913
+0.077294 -0.034949 -1.1879
+0.078235 -0.03487 -1.1852
+0.079011 -0.034721 -1.18
+0.079763 -0.034565 -1.1747
+0.080676 -0.034482 -1.1718
+0.082729 -0.034418 -1.1696
+0.086754 -0.034267 -1.1644
+0.090984 -0.034208 -1.1624
+0.095379 -0.034214 -1.1626
+0.099809 -0.034231 -1.1631
+0.10425 -0.034251 -1.1638
+0.10867 -0.03426 -1.1641
+0.11316 -0.034292 -1.1652
+0.11541 -0.034309 -1.1657
+0.11771 -0.034339 -1.1668
+0.12027 -0.034444 -1.1704
+0.12312 -0.034625 -1.1766
+0.12568 -0.034718 -1.1798
+0.12823 -0.034809 -1.1829
+0.12959 -0.034875 -1.1851
+0.13073 -0.034881 -1.1853
+0.13299 -0.034888 -1.1856
+0.1454 -0.035189 -1.1958
+0.14748 -0.035147 -1.1944
+0.14904 -0.034986 -1.1889
+0.14977 -0.034894 -1.1857
+0.15079 -0.034872 -1.1849
+0.15518 -0.034856 -1.1844
+0.15756 -0.034889 -1.1855
+0.15984 -0.0349 -1.1858
+0.16176 -0.034831 -1.1835
+0.16307 -0.034637 -1.1768
+0.16473 -0.034519 -1.1727
+0.16676 -0.034482 -1.1715
+0.1709 -0.034427 -1.1695
+0.17499 -0.034364 -1.1674
+0.1758 -0.034308 -1.1654
+0.17631 -0.034193 -1.1615
+0.17813 -0.034123 -1.159
+0.1801 -0.034083 -1.1577
+0.18222 -0.034071 -1.1572
+0.18656 -0.034067 -1.1571
+0.19093 -0.034068 -1.1571
+0.19519 -0.034051 -1.1565
+0.19961 -0.034061 -1.1568
+0.2018 -0.034063 -1.1569
+0.20424 -0.034106 -1.1583
+0.21029 -0.034381 -1.1678
+0.21626 -0.034632 -1.1764
+0.21911 -0.034733 -1.1798
+0.23617 -0.035121 -1.1931
+0.23751 -0.035152 -1.1942
+0.24005 -0.035195 -1.1956
+0.24231 -0.035196 -1.1957
+0.24634 -0.035128 -1.1933
+0.2484 -0.035101 -1.1923
+0.24939 -0.035083 -1.1917
+-0.12892 -0.034381 -1.1315
+-0.12781 -0.03437 -1.1311
+-0.12572 -0.034382 -1.1315
+-0.12374 -0.034425 -1.133
+-0.12268 -0.034425 -1.133
+-0.12134 -0.034349 -1.1304
+-0.07762 -0.033865 -1.1145
+-0.042566 -0.034396 -1.1323
+-0.040533 -0.034481 -1.1351
+-0.021973 -0.039574 -1.3048
+-0.017061 -0.039569 -1.3046
+-0.00971 -0.039619 -1.3063
+-0.008475 -0.039589 -1.3053
+0.075378 -0.036223 -1.1931
+0.076386 -0.036169 -1.1912
+0.078381 -0.036054 -1.1874
+0.079861 -0.035716 -1.1761
+0.081725 -0.035563 -1.171
+0.11655 -0.03542 -1.1661
+0.11773 -0.035446 -1.167
+0.11916 -0.035543 -1.1702
+0.12187 -0.035691 -1.1752
+0.1296 -0.035994 -1.1852
+0.13214 -0.036077 -1.1879
+0.14651 -0.036312 -1.1957
+0.14818 -0.036168 -1.1909
+0.14882 -0.036053 -1.1871
+0.14983 -0.036026 -1.1862
+0.15882 -0.036039 -1.1866
+0.15989 -0.036029 -1.1862
+0.16082 -0.035985 -1.1848
+0.16161 -0.035913 -1.1824
+0.16223 -0.035805 -1.1787
+0.17596 -0.035439 -1.1665
+0.17689 -0.035404 -1.1653
+0.17755 -0.035318 -1.1624
+0.20289 -0.035154 -1.1568
+0.21769 -0.035795 -1.1781
+0.21909 -0.035842 -1.1797
+0.23741 -0.036263 -1.1936
+0.2388 -0.036303 -1.195
+0.24125 -0.036334 -1.196
+0.24955 -0.036229 -1.1925
+-0.12984 -0.035409 -1.1302
+-0.12873 -0.035397 -1.1298
+-0.12657 -0.035389 -1.1296
+-0.12449 -0.035402 -1.13
+-0.12225 -0.035369 -1.1289
+-0.11971 -0.035247 -1.125
+-0.11731 -0.035164 -1.1224
+-0.11502 -0.035112 -1.1207
+-0.1128 -0.035078 -1.1196
+-0.090596 -0.034657 -1.1061
+-0.086434 -0.03466 -1.1062
+-0.082329 -0.034688 -1.1071
+-0.08031 -0.034717 -1.1081
+-0.078352 -0.034775 -1.11
+-0.076523 -0.034895 -1.1138
+-0.074474 -0.034919 -1.1146
+-0.072308 -0.034887 -1.1136
+-0.070164 -0.034865 -1.1129
+-0.057455 -0.03479 -1.1105
+-0.053355 -0.034846 -1.1123
+-0.051311 -0.034882 -1.1135
+-0.049263 -0.034917 -1.1146
+-0.047287 -0.03501 -1.1176
+-0.045391 -0.035172 -1.1229
+-0.043529 -0.035379 -1.1295
+-0.041514 -0.035476 -1.1327
+-0.039473 -0.03556 -1.1354
+-0.038446 -0.035599 -1.1367
+-0.023182 -0.04077 -1.3037
+-0.020732 -0.040775 -1.3039
+-0.018272 -0.04076 -1.3034
+-0.017036 -0.040737 -1.3027
+-0.015829 -0.040784 -1.3042
+-0.013391 -0.040831 -1.3057
+-0.010931 -0.040818 -1.3053
+-0.009697 -0.040794 -1.3045
+0.076572 -0.037382 -1.1942
+0.077542 -0.037307 -1.1918
+0.078512 -0.037235 -1.1894
+0.079308 -0.037083 -1.1845
+0.080753 -0.036726 -1.173
+0.082771 -0.036641 -1.1702
+0.084809 -0.03657 -1.1679
+0.11088 -0.036461 -1.1643
+0.11314 -0.036484 -1.165
+0.11542 -0.036509 -1.1658
+0.11662 -0.036543 -1.1669
+0.11802 -0.036634 -1.1698
+0.12065 -0.036764 -1.174
+0.1231 -0.036835 -1.1763
+0.12554 -0.036902 -1.1785
+0.12817 -0.037019 -1.1822
+0.13087 -0.037156 -1.1866
+0.1334 -0.037238 -1.1893
+0.13463 -0.037267 -1.1902
+0.14553 -0.037475 -1.1969
+0.14659 -0.037458 -1.1963
+0.1473 -0.037352 -1.1929
+0.14793 -0.037229 -1.1889
+0.14885 -0.037181 -1.1873
+0.15093 -0.03714 -1.186
+0.15316 -0.03714 -1.186
+0.15558 -0.037183 -1.1874
+0.15774 -0.037166 -1.1868
+0.15968 -0.037098 -1.1846
+0.16114 -0.036921 -1.1789
+0.16292 -0.03682 -1.1756
+0.16489 -0.036767 -1.1739
+0.16684 -0.036708 -1.172
+0.16872 -0.036636 -1.1697
+0.17273 -0.036552 -1.1669
+0.17487 -0.03654 -1.1665
+0.17689 -0.036503 -1.1653
+0.17877 -0.036438 -1.1632
+0.18041 -0.036327 -1.1596
+0.18232 -0.036274 -1.1579
+0.1844 -0.036254 -1.1572
+0.20158 -0.036205 -1.1556
+0.20279 -0.036226 -1.1563
+0.20419 -0.036283 -1.1581
+0.20722 -0.036431 -1.1628
+0.21379 -0.036808 -1.175
+0.21645 -0.036883 -1.1774
+0.2177 -0.036907 -1.1782
+0.23877 -0.037425 -1.1948
+0.24011 -0.037458 -1.1959
+0.24245 -0.037472 -1.1963
+0.24456 -0.03745 -1.1956
+0.24865 -0.037387 -1.1936
+0.24968 -0.037374 -1.1931
+-0.12966 -0.036425 -1.1286
+-0.073323 -0.03592 -1.113
+-0.044329 -0.036228 -1.1228
+-0.043453 -0.03638 -1.1276
+-0.042494 -0.036469 -1.1303
+-0.040471 -0.036565 -1.1334
+-0.038416 -0.036643 -1.1358
+-0.037383 -0.036678 -1.1369
+-0.021944 -0.041974 -1.303
+-0.012149 -0.042012 -1.3042
+-0.010916 -0.04199 -1.3035
+0.079525 -0.038304 -1.1878
+0.080135 -0.038063 -1.1802
+0.080747 -0.037829 -1.1729
+0.081782 -0.037797 -1.1719
+0.11429 -0.037599 -1.1655
+0.11554 -0.037648 -1.1671
+0.11689 -0.03773 -1.1696
+0.1183 -0.037826 -1.1726
+0.11942 -0.037832 -1.1728
+0.12182 -0.037892 -1.1747
+0.13451 -0.038355 -1.1892
+0.14653 -0.038571 -1.1959
+0.14791 -0.038345 -1.1888
+0.14996 -0.038296 -1.1872
+0.15668 -0.038299 -1.1873
+0.15768 -0.038269 -1.1864
+0.15845 -0.038186 -1.1837
+0.15991 -0.038002 -1.178
+0.16057 -0.037897 -1.1747
+0.16157 -0.037871 -1.1738
+0.20266 -0.037292 -1.1555
+0.21773 -0.038023 -1.1783
+0.23992 -0.038556 -1.195
+0.24143 -0.038617 -1.1969
+0.2498 -0.038517 -1.1937
+-0.12954 -0.037453 -1.1275
+-0.12844 -0.037442 -1.1272
+-0.12404 -0.037397 -1.1259
+-0.11934 -0.037254 -1.1215
+-0.11483 -0.037164 -1.1188
+-0.11037 -0.037083 -1.1163
+-0.10589 -0.036989 -1.1135
+-0.10133 -0.036856 -1.1095
+-0.09682 -0.036732 -1.1057
+-0.092554 -0.036693 -1.1045
+-0.088348 -0.036676 -1.104
+-0.084186 -0.036676 -1.1041
+-0.080037 -0.036682 -1.1043
+-0.078027 -0.036716 -1.1053
+-0.076067 -0.036775 -1.1071
+-0.074189 -0.036879 -1.1103
+-0.073296 -0.036956 -1.1126
+-0.072241 -0.036953 -1.1125
+-0.067908 -0.036877 -1.1102
+-0.063669 -0.036847 -1.1093
+-0.059457 -0.036828 -1.1088
+-0.055342 -0.036871 -1.1101
+-0.051263 -0.036947 -1.1124
+-0.047182 -0.037035 -1.1151
+-0.045174 -0.037112 -1.1174
+-0.043277 -0.037291 -1.1229
+-0.041478 -0.037579 -1.1317
+-0.039428 -0.037658 -1.1341
+-0.037361 -0.037728 -1.1363
+-0.023157 -0.043179 -1.3024
+-0.020697 -0.043157 -1.3017
+-0.013364 -0.043203 -1.3031
+-0.012134 -0.043187 -1.3026
+0.081774 -0.038897 -1.1717
+0.082767 -0.038846 -1.1702
+0.086878 -0.038713 -1.1661
+0.091076 -0.03863 -1.1636
+0.095396 -0.038604 -1.1628
+0.099765 -0.0386 -1.1626
+0.10418 -0.038612 -1.163
+0.10863 -0.038637 -1.1637
+0.11091 -0.038665 -1.1646
+0.11318 -0.038694 -1.1654
+0.11588 -0.038862 -1.1705
+0.11828 -0.038927 -1.1725
+0.12058 -0.038957 -1.1734
+0.12298 -0.039015 -1.1752
+0.12808 -0.039221 -1.1814
+0.13318 -0.039414 -1.1873
+0.13449 -0.039469 -1.189
+0.14557 -0.039743 -1.1972
+0.14701 -0.039524 -1.1906
+0.149 -0.039458 -1.1885
+0.15111 -0.039423 -1.1875
+0.15342 -0.039443 -1.1881
+0.15557 -0.039421 -1.1874
+0.15719 -0.039266 -1.1826
+0.15857 -0.039057 -1.1763
+0.16029 -0.038936 -1.1726
+0.16255 -0.038948 -1.1729
+0.16686 -0.038922 -1.1721
+0.17065 -0.03878 -1.1678
+0.17463 -0.038686 -1.1649
+0.17884 -0.038648 -1.1637
+0.18095 -0.03863 -1.1632
+0.18268 -0.038532 -1.1601
+0.1845 -0.038457 -1.1578
+0.18651 -0.03842 -1.1567
+0.19057 -0.038361 -1.1549
+0.19484 -0.038344 -1.1543
+0.19918 -0.038341 -1.1543
+0.20142 -0.038354 -1.1546
+0.20264 -0.038378 -1.1554
+0.20419 -0.038467 -1.158
+0.20739 -0.038655 -1.1638
+0.21081 -0.038882 -1.1707
+0.21401 -0.039063 -1.1762
+0.21659 -0.039129 -1.1782
+0.24102 -0.039679 -1.1948
+0.24243 -0.039724 -1.1962
+0.24472 -0.039731 -1.1964
+0.24686 -0.039712 -1.1958
+0.24887 -0.039673 -1.1946
+-0.12947 -0.038496 -1.1269
+-0.073096 -0.037902 -1.1096
+-0.044129 -0.038172 -1.1177
+-0.043153 -0.038241 -1.1197
+-0.042262 -0.038389 -1.1241
+-0.040456 -0.038688 -1.1329
+-0.036318 -0.038829 -1.1371
+-0.035286 -0.038872 -1.1384
+-0.021909 -0.044358 -1.301
+0.081783 -0.040006 -1.1719
+0.10978 -0.039754 -1.1643
+0.11094 -0.039774 -1.1649
+0.11211 -0.039801 -1.1657
+0.12173 -0.040078 -1.1738
+0.13435 -0.040547 -1.1877
+0.13568 -0.04061 -1.1896
+0.14628 -0.040755 -1.1938
+0.15453 -0.040558 -1.1879
+0.15539 -0.040492 -1.1859
+0.15595 -0.040347 -1.1817
+0.15718 -0.040095 -1.1742
+0.15827 -0.04009 -1.174
+0.15904 -0.040005 -1.1715
+0.16012 -0.040001 -1.1714
+0.16138 -0.040038 -1.1725
+0.18192 -0.0397 -1.1623
+0.18294 -0.039684 -1.1619
+0.18385 -0.039643 -1.1607
+0.18571 -0.039574 -1.1586
+0.20262 -0.039464 -1.1553
+0.2058 -0.039657 -1.161
+0.20921 -0.039892 -1.1679
+0.21534 -0.040213 -1.1774
+0.2166 -0.040243 -1.1783
+0.2421 -0.040797 -1.1946
+0.24342 -0.040829 -1.1955
+0.24591 -0.040869 -1.1967
+0.24796 -0.040835 -1.1957
+0.24889 -0.040803 -1.1947
+-0.12943 -0.039547 -1.1266
+-0.12836 -0.039543 -1.1265
+-0.12612 -0.039506 -1.1254
+-0.1238 -0.039443 -1.1236
+-0.1215 -0.039385 -1.122
+-0.081918 -0.03867 -1.1015
+-0.077861 -0.038718 -1.1029
+-0.073915 -0.03883 -1.1061
+-0.072026 -0.038935 -1.1092
+-0.069976 -0.038958 -1.1098
+-0.067819 -0.038921 -1.1088
+-0.065682 -0.038893 -1.108
+-0.057355 -0.038911 -1.1085
+-0.055309 -0.038941 -1.1094
+-0.053292 -0.038995 -1.111
+-0.051297 -0.03907 -1.1131
+-0.049252 -0.039113 -1.1144
+-0.047191 -0.039145 -1.1153
+-0.04513 -0.039181 -1.1163
+-0.04311 -0.039257 -1.1185
+-0.042135 -0.039331 -1.1207
+-0.041352 -0.039592 -1.1282
+-0.040436 -0.039737 -1.1324
+-0.039415 -0.039783 -1.1337
+-0.037341 -0.03985 -1.1356
+-0.035272 -0.03993 -1.138
+-0.023117 -0.04555 -1.3
+0.076434 -0.044416 -1.2672
+0.082763 -0.041049 -1.1701
+0.08481 -0.040973 -1.1679
+0.10198 -0.040802 -1.1629
+0.10643 -0.040826 -1.1636
+0.10868 -0.040847 -1.1642
+0.11117 -0.040957 -1.1673
+0.11372 -0.041086 -1.171
+0.11596 -0.041096 -1.1713
+0.11821 -0.041111 -1.1717
+0.12052 -0.041147 -1.1728
+0.1217 -0.041174 -1.1735
+0.12295 -0.04122 -1.1749
+0.12551 -0.041336 -1.1782
+0.13039 -0.041476 -1.1822
+0.13298 -0.041589 -1.1854
+0.13566 -0.041725 -1.1894
+0.13695 -0.041779 -1.1909
+0.14533 -0.041931 -1.1953
+0.14705 -0.04178 -1.1909
+0.14914 -0.041736 -1.1896
+0.15128 -0.041708 -1.1888
+0.15339 -0.041673 -1.1878
+0.15484 -0.041462 -1.1817
+0.15607 -0.041199 -1.1741
+0.15825 -0.04119 -1.1738
+0.15922 -0.041157 -1.1729
+0.16033 -0.041157 -1.1729
+0.16256 -0.041163 -1.173
+0.16465 -0.041132 -1.1721
+0.18081 -0.040792 -1.1622
+0.18293 -0.040775 -1.1617
+0.18494 -0.040738 -1.1606
+0.18679 -0.040663 -1.1585
+0.18858 -0.040579 -1.156
+0.19262 -0.040513 -1.1541
+0.20132 -0.040512 -1.1541
+0.20262 -0.040554 -1.1553
+0.20419 -0.040651 -1.1581
+0.2058 -0.040752 -1.161
+0.20757 -0.040886 -1.1648
+0.21107 -0.04114 -1.1721
+0.21413 -0.041305 -1.1769
+0.21544 -0.041343 -1.178
+0.24321 -0.04192 -1.1945
+0.24452 -0.041952 -1.1954
+0.24687 -0.041969 -1.1959
+0.2478 -0.041935 -1.1949
+-0.12835 -0.040602 -1.1264
+-0.12725 -0.040591 -1.1261
+-0.12488 -0.040512 -1.1239
+-0.054217 -0.039953 -1.1084
+-0.053246 -0.040009 -1.11
+-0.052266 -0.040059 -1.1114
+-0.051293 -0.040117 -1.1131
+-0.050288 -0.040152 -1.114
+-0.048234 -0.04019 -1.1151
+-0.042071 -0.040326 -1.119
+-0.041191 -0.040498 -1.1238
+-0.040405 -0.040772 -1.1315
+0.07626 -0.045506 -1.2643
+0.077195 -0.045356 -1.2601
+0.078128 -0.04521 -1.256
+0.10759 -0.041947 -1.1642
+0.1101 -0.042069 -1.1677
+0.11141 -0.042148 -1.1699
+0.11259 -0.042179 -1.1707
+0.12169 -0.042275 -1.1734
+0.13686 -0.042872 -1.1901
+0.13825 -0.042957 -1.1925
+0.14449 -0.043141 -1.1976
+0.14617 -0.042973 -1.1929
+0.15236 -0.042818 -1.1885
+0.15379 -0.042594 -1.1822
+0.15434 -0.042438 -1.1778
+0.15517 -0.042362 -1.1757
+0.15606 -0.042303 -1.174
+0.15715 -0.0423 -1.1739
+0.15934 -0.042293 -1.1737
+0.16148 -0.042274 -1.1732
+0.20268 -0.041657 -1.1556
+0.20578 -0.041843 -1.1608
+0.20949 -0.042149 -1.1694
+0.21268 -0.042347 -1.175
+0.21415 -0.042419 -1.177
+0.24544 -0.043044 -1.1944
+0.24653 -0.043038 -1.1942
+-0.12831 -0.041651 -1.126
+-0.12593 -0.041569 -1.1238
+-0.12354 -0.041478 -1.1213
+-0.11889 -0.041331 -1.1173
+-0.11442 -0.041238 -1.1148
+-0.10998 -0.041148 -1.1123
+-0.10535 -0.040979 -1.1077
+-0.10086 -0.04085 -1.1042
+-0.09656 -0.040793 -1.1027
+-0.092311 -0.040753 -1.1016
+-0.088083 -0.040718 -1.1007
+-0.083927 -0.040716 -1.1006
+-0.079805 -0.04073 -1.101
+-0.075708 -0.040759 -1.1018
+-0.071813 -0.040906 -1.1059
+-0.069878 -0.040994 -1.1083
+-0.067751 -0.040971 -1.1076
+-0.0635 -0.040922 -1.1063
+-0.059279 -0.040888 -1.1054
+-0.055148 -0.040914 -1.1061
+-0.053082 -0.040929 -1.1065
+-0.05118 -0.041077 -1.1106
+-0.049274 -0.041232 -1.1149
+-0.047211 -0.041266 -1.1158
+-0.043074 -0.041332 -1.1176
+-0.042056 -0.041366 -1.1185
+-0.041103 -0.041468 -1.1213
+-0.039398 -0.041903 -1.1332
+-0.037335 -0.041984 -1.1354
+-0.035251 -0.042049 -1.1372
+-0.033187 -0.04215 -1.14
+0.076139 -0.046622 -1.2623
+0.07709 -0.046479 -1.2583
+0.079047 -0.046238 -1.2518
+0.081107 -0.04607 -1.2472
+0.082812 -0.04328 -1.1708
+0.08688 -0.04311 -1.1661
+0.091117 -0.043036 -1.1641
+0.095458 -0.043016 -1.1635
+0.099816 -0.043005 -1.1632
+0.102 -0.043002 -1.1631
+0.10421 -0.04301 -1.1633
+0.10658 -0.043082 -1.1653
+0.10911 -0.043215 -1.1689
+0.11036 -0.043273 -1.1705
+0.11146 -0.043273 -1.1705
+0.11368 -0.043278 -1.1706
+0.11816 -0.043302 -1.1712
+0.12048 -0.043344 -1.1724
+0.12303 -0.043464 -1.1756
+0.12783 -0.043591 -1.1791
+0.13282 -0.04377 -1.184
+0.13542 -0.043889 -1.1872
+0.13812 -0.044037 -1.1913
+0.13959 -0.044148 -1.1943
+0.14088 -0.044201 -1.1957
+0.14328 -0.044246 -1.197
+0.14437 -0.044236 -1.1967
+0.14527 -0.044164 -1.1947
+0.14713 -0.044049 -1.1915
+0.15127 -0.043948 -1.1888
+0.15232 -0.043928 -1.1882
+0.15278 -0.043737 -1.183
+0.15327 -0.043562 -1.1782
+0.15422 -0.043515 -1.1769
+0.15621 -0.043453 -1.1752
+0.15834 -0.043429 -1.1745
+0.16042 -0.043395 -1.1736
+0.16247 -0.043351 -1.1724
+0.16649 -0.043246 -1.1695
+0.17056 -0.043161 -1.1671
+0.17456 -0.043063 -1.1644
+0.17858 -0.042975 -1.162
+0.18284 -0.042946 -1.1612
+0.18709 -0.042918 -1.1604
+0.18882 -0.042815 -1.1576
+0.19056 -0.042714 -1.1548
+0.19266 -0.042698 -1.1544
+0.19476 -0.042682 -1.1539
+0.19907 -0.042672 -1.1536
+0.20142 -0.042709 -1.1546
+0.20442 -0.042883 -1.1594
+0.20761 -0.04309 -1.165
+0.21133 -0.043404 -1.1736
+0.21413 -0.043524 -1.1768
+-0.12806 -0.042631 -1.1238
+-0.12688 -0.042591 -1.1228
+-0.12445 -0.042482 -1.1199
+-0.054041 -0.041907 -1.1048
+-0.053009 -0.041914 -1.105
+-0.052035 -0.041969 -1.1065
+-0.050136 -0.042126 -1.1106
+-0.049238 -0.042253 -1.114
+-0.048241 -0.0423 -1.1153
+-0.042052 -0.042417 -1.1184
+-0.040217 -0.042707 -1.1262
+-0.03837 -0.043015 -1.1344
+-0.036294 -0.043088 -1.1363
+-0.034214 -0.043165 -1.1384
+-0.033192 -0.04323 -1.1401
+0.074097 -0.048027 -1.268
+0.075055 -0.047877 -1.264
+0.07603 -0.047742 -1.2604
+0.077962 -0.047474 -1.2533
+0.082152 -0.047171 -1.2452
+0.10311 -0.044102 -1.1632
+0.11035 -0.044372 -1.1704
+0.11255 -0.044371 -1.1703
+0.13938 -0.045207 -1.1925
+0.14199 -0.045323 -1.1956
+0.14426 -0.045329 -1.1957
+0.14616 -0.045217 -1.1928
+0.1519 -0.044924 -1.1849
+0.15227 -0.044704 -1.179
+0.15313 -0.044632 -1.1771
+0.19005 -0.043937 -1.1584
+0.19075 -0.043848 -1.156
+0.19169 -0.043813 -1.1551
+0.19376 -0.04379 -1.1544
+0.2128 -0.044586 -1.1756
+-0.13146 -0.043764 -1.1257
+-0.13024 -0.043711 -1.1243
+-0.12905 -0.043668 -1.1232
+-0.12786 -0.043623 -1.1221
+-0.12549 -0.043535 -1.1198
+-0.12319 -0.043468 -1.1181
+-0.12092 -0.04341 -1.1166
+-0.11207 -0.043242 -1.1122
+-0.090078 -0.042757 -1.0997
+-0.088006 -0.042757 -1.0997
+-0.085945 -0.042763 -1.0999
+-0.083875 -0.042765 -1.0999
+-0.081719 -0.042722 -1.0988
+-0.079547 -0.042668 -1.0974
+-0.077416 -0.042634 -1.0965
+-0.075391 -0.042658 -1.0971
+-0.0734 -0.042702 -1.0983
+-0.071388 -0.042738 -1.0992
+-0.069539 -0.042875 -1.1028
+-0.067658 -0.043001 -1.1061
+-0.065535 -0.042976 -1.1055
+-0.063388 -0.042933 -1.1044
+-0.061275 -0.042911 -1.1038
+-0.057092 -0.042895 -1.1034
+-0.055023 -0.042903 -1.1036
+-0.052981 -0.042934 -1.1044
+-0.050969 -0.042993 -1.1059
+-0.050002 -0.043057 -1.1076
+-0.049111 -0.043192 -1.1111
+-0.048203 -0.043317 -1.1144
+-0.047223 -0.043381 -1.1161
+-0.045174 -0.043433 -1.1174
+-0.043096 -0.043462 -1.1182
+-0.041063 -0.04354 -1.1202
+-0.04013 -0.043673 -1.1237
+-0.039291 -0.043919 -1.1301
+-0.038336 -0.044046 -1.1334
+-0.037329 -0.044117 -1.1352
+-0.035257 -0.044202 -1.1374
+-0.033201 -0.044318 -1.1405
+-0.032185 -0.044398 -1.1425
+0.071515 -0.049918 -1.2862
+0.074007 -0.049161 -1.2665
+0.074955 -0.049002 -1.2623
+0.076926 -0.048745 -1.2556
+0.078932 -0.048526 -1.2499
+0.081043 -0.048381 -1.2461
+0.082123 -0.048327 -1.2447
+0.08294 -0.045558 -1.1726
+0.084854 -0.0454 -1.1685
+0.086882 -0.04531 -1.1662
+0.088972 -0.045255 -1.1647
+0.09329 -0.045221 -1.1638
+0.097654 -0.045212 -1.1636
+0.099839 -0.045208 -1.1635
+0.10209 -0.045234 -1.1641
+0.10323 -0.045255 -1.1647
+0.10451 -0.045334 -1.1667
+0.10703 -0.04547 -1.1702
+0.10925 -0.045475 -1.1703
+0.11142 -0.045462 -1.17
+0.11364 -0.045468 -1.1702
+0.11587 -0.045476 -1.1704
+0.11815 -0.045507 -1.1712
+0.12057 -0.045588 -1.1733
+0.13524 -0.046066 -1.1856
+0.13793 -0.04622 -1.1896
+0.1406 -0.046363 -1.1933
+0.1431 -0.046444 -1.1955
+0.14518 -0.046389 -1.194
+0.14719 -0.046315 -1.1921
+0.1493 -0.046272 -1.1909
+0.1512 -0.046166 -1.1881
+0.1515 -0.045919 -1.1817
+0.15213 -0.045773 -1.1779
+0.15423 -0.045737 -1.177
+0.15619 -0.045663 -1.175
+0.16021 -0.045547 -1.172
+0.18954 -0.04517 -1.162
+0.19064 -0.04517 -1.162
+0.19126 -0.045058 -1.1591
+0.19283 -0.044915 -1.1554
+0.19488 -0.044885 -1.1546
+0.19696 -0.044864 -1.154
+0.19913 -0.044862 -1.154
+0.2017 -0.044951 -1.1563
+0.20467 -0.045124 -1.1608
+0.20756 -0.045277 -1.1647
+0.2113 -0.045612 -1.1734
+0.21277 -0.045689 -1.1754
+-0.1347 -0.044847 -1.1262
+-0.1335 -0.044801 -1.1251
+-0.13234 -0.044766 -1.1242
+-0.13118 -0.044732 -1.1233
+-0.12882 -0.044649 -1.1212
+-0.086929 -0.043775 -1.0992
+-0.085895 -0.043775 -1.0992
+-0.084846 -0.043769 -1.099
+-0.080473 -0.043645 -1.0959
+-0.079329 -0.043583 -1.0943
+-0.078289 -0.043579 -1.0942
+-0.076282 -0.043611 -1.0951
+-0.070307 -0.043747 -1.0985
+-0.069326 -0.043781 -1.0994
+-0.068444 -0.04388 -1.1019
+-0.066515 -0.043978 -1.1044
+-0.064407 -0.04396 -1.104
+-0.04995 -0.044056 -1.1064
+-0.048117 -0.044289 -1.1124
+-0.040109 -0.04471 -1.1231
+-0.03825 -0.045013 -1.1308
+-0.037283 -0.045132 -1.1338
+-0.036275 -0.045207 -1.1357
+-0.032214 -0.045516 -1.1436
+0.072253 -0.050797 -1.2777
+0.072889 -0.050405 -1.2678
+0.0739 -0.050281 -1.2646
+0.075865 -0.050007 -1.2577
+0.076822 -0.049861 -1.2539
+0.077879 -0.049782 -1.2519
+0.082095 -0.049482 -1.2443
+0.082949 -0.046668 -1.1727
+0.08391 -0.046588 -1.1707
+0.085894 -0.046469 -1.1677
+0.098749 -0.046308 -1.1635
+0.099846 -0.046308 -1.1635
+0.10101 -0.04634 -1.1643
+0.10349 -0.046466 -1.1675
+0.11474 -0.04657 -1.1701
+0.11586 -0.046576 -1.1703
+0.11699 -0.046587 -1.1706
+0.15125 -0.046956 -1.1798
+0.15316 -0.046859 -1.1773
+0.19064 -0.046265 -1.162
+0.19173 -0.046264 -1.162
+0.19267 -0.046228 -1.1611
+0.19405 -0.046036 -1.1562
+0.19496 -0.045994 -1.1551
+0.19599 -0.04598 -1.1547
+0.19816 -0.045978 -1.1547
+0.21274 -0.046792 -1.1753
+-0.13702 -0.045975 -1.1279
+-0.13575 -0.045905 -1.1261
+-0.13455 -0.045858 -1.125
+-0.13206 -0.04573 -1.1218
+-0.12976 -0.045666 -1.1202
+-0.12752 -0.045617 -1.119
+-0.12298 -0.0455 -1.1161
+-0.11859 -0.045428 -1.1144
+-0.11415 -0.045334 -1.112
+-0.11182 -0.045241 -1.1098
+-0.10939 -0.0451 -1.1063
+-0.10487 -0.044952 -1.1026
+-0.10061 -0.044905 -1.1014
+-0.096357 -0.044859 -1.1003
+-0.092079 -0.044796 -1.0988
+-0.087919 -0.044788 -1.0986
+-0.085827 -0.044777 -1.0983
+-0.083648 -0.044719 -1.0969
+-0.081447 -0.044646 -1.0951
+-0.079287 -0.044592 -1.0938
+-0.077213 -0.044585 -1.0936
+-0.075193 -0.04461 -1.0942
+-0.071169 -0.044674 -1.0958
+-0.069229 -0.044755 -1.0978
+-0.067378 -0.044901 -1.1015
+-0.066458 -0.04498 -1.1034
+-0.06542 -0.044982 -1.1035
+-0.063308 -0.044959 -1.1029
+-0.059087 -0.044912 -1.1018
+-0.054951 -0.044926 -1.1021
+-0.050899 -0.045016 -1.1044
+-0.048911 -0.045103 -1.1065
+-0.048013 -0.045239 -1.1099
+-0.047215 -0.045479 -1.1159
+-0.045222 -0.045589 -1.1186
+-0.043125 -0.045601 -1.1189
+-0.041062 -0.045652 -1.1202
+-0.039146 -0.04588 -1.1259
+-0.037205 -0.046104 -1.1314
+-0.035207 -0.046281 -1.1358
+-0.033196 -0.046461 -1.1403
+-0.031245 -0.046756 -1.1476
+0.010219 -0.048586 -1.1931
+0.011343 -0.048586 -1.1931
+0.071326 -0.052202 -1.2827
+0.072799 -0.051536 -1.2662
+0.074805 -0.051276 -1.2598
+0.076811 -0.051034 -1.2537
+0.078876 -0.050844 -1.249
+0.080973 -0.050685 -1.2451
+0.082036 -0.050618 -1.2434
+0.083099 -0.04786 -1.1749
+0.084967 -0.047667 -1.1701
+0.086912 -0.047525 -1.1666
+0.091085 -0.047409 -1.1637
+0.093257 -0.047399 -1.1634
+0.095454 -0.047401 -1.1635
+0.097666 -0.047411 -1.1637
+0.10002 -0.047487 -1.1656
+0.10247 -0.047604 -1.1685
+0.10373 -0.047681 -1.1704
+0.10486 -0.04769 -1.1706
+0.10919 -0.047654 -1.1697
+0.11141 -0.047661 -1.1699
+0.11363 -0.047671 -1.1701
+0.11586 -0.047682 -1.1703
+0.11824 -0.047752 -1.1721
+0.12299 -0.047879 -1.1752
+0.12772 -0.047995 -1.1781
+0.13258 -0.048146 -1.1818
+0.13774 -0.048398 -1.188
+0.14298 -0.048655 -1.1944
+0.14515 -0.04863 -1.1937
+0.14724 -0.048578 -1.1925
+0.14924 -0.048498 -1.1905
+0.15056 -0.048201 -1.1831
+0.15214 -0.047996 -1.178
+0.15405 -0.0479 -1.1756
+0.15798 -0.047751 -1.1719
+0.16201 -0.047635 -1.169
+0.1661 -0.047546 -1.1667
+0.17024 -0.047473 -1.1649
+0.17441 -0.047414 -1.1634
+0.17867 -0.047381 -1.1626
+0.18279 -0.047312 -1.1608
+0.18714 -0.047308 -1.1607
+0.18948 -0.047345 -1.1616
+0.19183 -0.047385 -1.1626
+0.19395 -0.047367 -1.1622
+0.1956 -0.047236 -1.1589
+0.19625 -0.047131 -1.1563
+0.19725 -0.04711 -1.1557
+0.19951 -0.047129 -1.1562
+0.20231 -0.047273 -1.1598
+0.20498 -0.047385 -1.1625
+0.20763 -0.04749 -1.1651
+0.21104 -0.047764 -1.1719
+0.2127 -0.04789 -1.175
+-0.1395 -0.047158 -1.1307
+-0.13823 -0.047089 -1.1291
+-0.13564 -0.04693 -1.1252
+-0.13443 -0.046875 -1.1239
+-0.1332 -0.046816 -1.1225
+-0.066339 -0.045939 -1.1015
+-0.064333 -0.045989 -1.1027
+-0.047943 -0.046219 -1.1083
+-0.046259 -0.046627 -1.1182
+-0.044188 -0.046665 -1.1191
+-0.032185 -0.04763 -1.1426
+-0.030275 -0.048014 -1.1519
+-0.029306 -0.048205 -1.1565
+0.00797 -0.049696 -1.1927
+0.009082 -0.049635 -1.1913
+0.010209 -0.049659 -1.1918
+0.050571 -0.049623 -1.1909
+0.051725 -0.049655 -1.1917
+0.052895 -0.049699 -1.1927
+0.054065 -0.049742 -1.1938
+0.071909 -0.05295 -1.2716
+0.073726 -0.052539 -1.2616
+0.082011 -0.051773 -1.243
+0.092154 -0.048492 -1.1633
+0.093252 -0.048493 -1.1633
+0.094348 -0.048493 -1.1633
+0.095447 -0.048495 -1.1634
+0.096572 -0.048509 -1.1637
+0.097773 -0.048561 -1.165
+0.098971 -0.04861 -1.1662
+0.10154 -0.048791 -1.1705
+0.10271 -0.048821 -1.1713
+0.10381 -0.048821 -1.1713
+0.11252 -0.04877 -1.17
+0.14408 -0.049775 -1.1942
+0.14623 -0.049739 -1.1934
+0.14826 -0.049666 -1.1916
+0.1496 -0.049368 -1.1843
+0.197 -0.048405 -1.1607
+0.19769 -0.048308 -1.1584
+0.19878 -0.048308 -1.1584
+0.20136 -0.048401 -1.1606
+0.20385 -0.048474 -1.1624
+0.21263 -0.048982 -1.1747
+-0.14069 -0.048269 -1.1318
+-0.13946 -0.048212 -1.1305
+-0.13701 -0.048097 -1.1277
+-0.13457 -0.047986 -1.1251
+-0.13205 -0.047841 -1.1217
+-0.12973 -0.047767 -1.1199
+-0.1274 -0.047683 -1.1179
+-0.12516 -0.047635 -1.1168
+-0.12078 -0.047566 -1.1152
+-0.11629 -0.04745 -1.1125
+-0.11396 -0.047354 -1.1102
+-0.11142 -0.047166 -1.1057
+-0.10903 -0.047033 -1.1026
+-0.10687 -0.046996 -1.1017
+-0.089926 -0.046827 -1.0978
+-0.087816 -0.046806 -1.0973
+-0.085616 -0.046734 -1.0956
+-0.083393 -0.046645 -1.0935
+-0.081249 -0.046598 -1.0924
+-0.07707 -0.046562 -1.0915
+-0.073015 -0.046601 -1.0925
+-0.071066 -0.046673 -1.0942
+-0.069115 -0.046749 -1.096
+-0.067184 -0.046843 -1.0982
+-0.065318 -0.04699 -1.1017
+-0.063262 -0.047006 -1.1021
+-0.061158 -0.046986 -1.1017
+-0.059066 -0.046973 -1.1014
+-0.056987 -0.04697 -1.1013
+-0.054923 -0.046981 -1.1016
+-0.052895 -0.047023 -1.1026
+-0.05088 -0.047082 -1.104
+-0.048875 -0.047156 -1.1057
+-0.04789 -0.047212 -1.1071
+-0.047086 -0.047453 -1.1128
+-0.046254 -0.047676 -1.1181
+-0.045238 -0.047716 -1.119
+-0.043161 -0.047751 -1.1199
+-0.041088 -0.047795 -1.1209
+-0.039103 -0.047951 -1.1246
+-0.037113 -0.048119 -1.1286
+-0.035107 -0.048284 -1.1325
+-0.033097 -0.048467 -1.1369
+-0.032103 -0.048583 -1.1396
+-0.031201 -0.048851 -1.146
+-0.029261 -0.049219 -1.1547
+-0.028236 -0.04933 -1.1574
+0.006846 -0.050806 -1.1924
+0.007955 -0.050724 -1.1905
+0.010208 -0.050776 -1.1917
+0.043835 -0.050736 -1.1907
+0.046025 -0.050679 -1.1893
+0.048241 -0.050654 -1.1887
+0.049373 -0.050667 -1.189
+0.050493 -0.050667 -1.189
+0.052809 -0.050741 -1.1908
+0.055167 -0.050847 -1.1933
+0.056345 -0.050896 -1.1945
+0.07176 -0.054035 -1.2689
+0.072677 -0.053829 -1.264
+0.074695 -0.053571 -1.2579
+0.076728 -0.053338 -1.2524
+0.080949 -0.053014 -1.2447
+0.081962 -0.052912 -1.2422
+0.085132 -0.049969 -1.1724
+0.087103 -0.049833 -1.1691
+0.089076 -0.049705 -1.1661
+0.091219 -0.049676 -1.1654
+0.09341 -0.049673 -1.1653
+0.095609 -0.049675 -1.1654
+0.098118 -0.049834 -1.1691
+0.10057 -0.049957 -1.172
+0.10273 -0.049936 -1.1715
+0.10487 -0.049903 -1.1707
+0.10701 -0.049873 -1.17
+0.11142 -0.049871 -1.1699
+0.11253 -0.049875 -1.17
+0.11365 -0.049883 -1.1702
+0.11599 -0.049942 -1.1716
+0.14013 -0.050691 -1.1893
+0.14279 -0.05084 -1.1928
+0.14404 -0.050883 -1.1938
+0.14517 -0.050886 -1.1939
+0.14629 -0.050884 -1.1938
+0.1473 -0.050846 -1.1929
+0.14815 -0.050751 -1.1907
+0.1487 -0.050557 -1.1861
+0.15004 -0.05026 -1.179
+0.15193 -0.050147 -1.1763
+0.15378 -0.050031 -1.1735
+0.15574 -0.049948 -1.1716
+0.18938 -0.04951 -1.161
+0.19425 -0.049636 -1.164
+0.19662 -0.04968 -1.165
+0.19877 -0.04967 -1.1648
+0.20079 -0.049626 -1.1637
+0.20282 -0.049587 -1.1628
+0.20519 -0.04963 -1.1638
+0.20772 -0.049711 -1.1657
+0.21096 -0.049956 -1.1715
+0.2126 -0.050084 -1.1745
+-0.18931 -0.051841 -1.1897
+-0.18811 -0.051821 -1.1893
+-0.18699 -0.051819 -1.1892
+-0.18592 -0.051835 -1.1896
+-0.14067 -0.049327 -1.1316
+-0.13829 -0.04924 -1.1296
+-0.13102 -0.04891 -1.1219
+-0.1298 -0.04885 -1.1206
+-0.12867 -0.048822 -1.1199
+-0.070045 -0.047712 -1.0944
+-0.069078 -0.047757 -1.0954
+-0.068119 -0.047809 -1.0966
+-0.062219 -0.048042 -1.102
+-0.061161 -0.048026 -1.1017
+-0.060117 -0.048022 -1.1016
+-0.059139 -0.048071 -1.1027
+-0.058196 -0.04815 -1.1046
+-0.056049 -0.048095 -1.1033
+-0.054972 -0.048062 -1.1025
+-0.053933 -0.048062 -1.1025
+-0.052907 -0.048075 -1.1028
+-0.051905 -0.048109 -1.1036
+-0.047886 -0.048252 -1.107
+-0.046249 -0.048725 -1.1179
+-0.044217 -0.048808 -1.1199
+-0.032023 -0.049533 -1.1367
+-0.028218 -0.050388 -1.1566
+-0.027191 -0.050504 -1.1593
+0.002361 -0.052071 -1.1957
+0.003483 -0.05202 -1.1945
+0.004602 -0.051946 -1.1928
+0.005714 -0.05185 -1.1906
+0.006834 -0.051839 -1.1903
+0.009084 -0.051887 -1.1914
+0.010208 -0.051901 -1.1917
+0.032594 -0.051812 -1.1896
+0.03371 -0.051806 -1.1895
+0.034819 -0.051788 -1.1891
+0.035938 -0.051789 -1.1891
+0.037048 -0.051775 -1.1888
+0.038162 -0.051767 -1.1886
+0.039273 -0.051756 -1.1883
+0.040394 -0.051759 -1.1884
+0.041512 -0.051758 -1.1884
+0.042639 -0.051768 -1.1886
+0.049345 -0.051758 -1.1884
+0.051625 -0.0518 -1.1893
+0.053934 -0.051867 -1.1909
+0.055105 -0.051913 -1.192
+0.056307 -0.051986 -1.1936
+0.057489 -0.052039 -1.1949
+0.071643 -0.05514 -1.2668
+0.073646 -0.054856 -1.2602
+0.08195 -0.054074 -1.2421
+0.088197 -0.050931 -1.169
+0.089201 -0.050876 -1.1678
+0.090291 -0.05087 -1.1676
+0.095058 -0.051068 -1.1722
+0.096181 -0.051078 -1.1724
+0.097377 -0.051126 -1.1735
+0.098492 -0.051131 -1.1736
+0.099524 -0.051093 -1.1728
+0.11256 -0.050994 -1.1704
+0.14396 -0.051982 -1.1932
+0.14624 -0.051992 -1.1934
+0.14796 -0.051809 -1.1892
+0.14829 -0.051533 -1.1828
+0.14912 -0.051435 -1.1805
+0.21251 -0.051168 -1.174
+-0.19036 -0.052944 -1.1893
+-0.18917 -0.052924 -1.1888
+-0.18657 -0.052823 -1.1866
+-0.1846 -0.052897 -1.1883
+-0.1825 -0.052939 -1.1892
+-0.14184 -0.050431 -1.1324
+-0.13953 -0.050367 -1.131
+-0.13724 -0.05031 -1.1297
+-0.13494 -0.050246 -1.1282
+-0.13256 -0.05015 -1.1261
+-0.1301 -0.050022 -1.1232
+-0.12766 -0.049896 -1.1203
+-0.12304 -0.049734 -1.1167
+-0.12075 -0.049659 -1.115
+-0.1184 -0.049556 -1.1126
+-0.11605 -0.049448 -1.1102
+-0.11336 -0.049186 -1.1042
+-0.10888 -0.049043 -1.101
+-0.10462 -0.048995 -1.0999
+-0.10032 -0.04892 -1.0982
+-0.096014 -0.048837 -1.0964
+-0.091882 -0.048838 -1.0964
+-0.087632 -0.048773 -1.0949
+-0.083247 -0.048623 -1.0916
+-0.078986 -0.048534 -1.0896
+-0.076913 -0.048522 -1.0893
+-0.074909 -0.048554 -1.09
+-0.072982 -0.04864 -1.092
+-0.071071 -0.048741 -1.0943
+-0.069147 -0.048839 -1.0965
+-0.067158 -0.048896 -1.0978
+-0.0653 -0.049055 -1.1014
+-0.063292 -0.049108 -1.1026
+-0.0613 -0.049177 -1.1042
+-0.059415 -0.04934 -1.1079
+-0.0574 -0.049404 -1.1094
+-0.05633 -0.049382 -1.1089
+-0.055147 -0.049259 -1.1061
+-0.052971 -0.049174 -1.1042
+-0.050909 -0.049193 -1.1046
+-0.048871 -0.049237 -1.1056
+-0.047882 -0.049292 -1.1069
+-0.046981 -0.049441 -1.1103
+-0.046244 -0.049775 -1.1178
+-0.045268 -0.049859 -1.1198
+-0.043181 -0.049887 -1.1204
+-0.041123 -0.049951 -1.1219
+-0.039083 -0.050046 -1.124
+-0.037066 -0.050183 -1.1272
+-0.035041 -0.050325 -1.1304
+-0.032985 -0.050438 -1.1329
+-0.031959 -0.050504 -1.1344
+-0.027165 -0.051547 -1.1582
+-0.026118 -0.051633 -1.1601
+-0.001017 -0.053253 -1.1969
+0.001234 -0.053135 -1.1943
+0.003475 -0.053015 -1.1915
+0.005708 -0.052915 -1.1893
+0.007958 -0.052986 -1.1909
+0.009085 -0.053017 -1.1916
+0.024794 -0.053021 -1.1917
+0.025897 -0.052981 -1.1908
+0.028103 -0.052914 -1.1892
+0.030334 -0.052898 -1.1888
+0.031453 -0.052898 -1.1888
+0.032539 -0.052843 -1.1876
+0.034752 -0.052808 -1.1868
+0.036987 -0.052807 -1.1868
+0.039197 -0.052774 -1.186
+0.041452 -0.052801 -1.1866
+0.043698 -0.052815 -1.1869
+0.045939 -0.052821 -1.1871
+0.048191 -0.052839 -1.1875
+0.050464 -0.052877 -1.1883
+0.052804 -0.05298 -1.1907
+0.055098 -0.05303 -1.1918
+0.05746 -0.053138 -1.1943
+0.071605 -0.056303 -1.2661
+0.072616 -0.056163 -1.263
+0.074587 -0.055859 -1.2561
+0.078765 -0.055472 -1.2472
+0.080883 -0.055314 -1.2436
+0.081978 -0.055264 -1.2425
+0.0834 -0.052479 -1.1792
+0.085336 -0.052304 -1.1752
+0.087305 -0.052158 -1.1719
+0.089427 -0.052108 -1.1707
+0.091674 -0.052131 -1.1713
+0.094105 -0.052256 -1.1741
+0.096398 -0.052301 -1.1751
+0.098505 -0.052244 -1.1738
+0.10061 -0.05219 -1.1726
+0.10272 -0.052137 -1.1713
+0.10486 -0.052105 -1.1706
+0.10702 -0.052085 -1.1701
+0.10921 -0.052078 -1.17
+0.11145 -0.052091 -1.1703
+0.11382 -0.052168 -1.172
+0.11841 -0.052246 -1.1738
+0.12303 -0.052329 -1.1756
+0.12769 -0.052425 -1.1778
+0.1326 -0.052612 -1.182
+0.13764 -0.052839 -1.1871
+0.14258 -0.053009 -1.191
+0.14507 -0.0531 -1.193
+0.14714 -0.053037 -1.1916
+0.14811 -0.052583 -1.1813
+0.14978 -0.052389 -1.1769
+0.1536 -0.05218 -1.1721
+0.1576 -0.052044 -1.169
+0.16163 -0.051924 -1.1662
+0.16581 -0.051856 -1.1647
+0.16996 -0.051782 -1.163
+0.17416 -0.051729 -1.1617
+0.1785 -0.051717 -1.1614
+0.18291 -0.051726 -1.1616
+0.18723 -0.051711 -1.1613
+0.19173 -0.051745 -1.162
+0.19658 -0.051866 -1.1648
+0.19908 -0.051947 -1.1666
+0.20122 -0.051931 -1.1662
+0.20549 -0.051899 -1.1655
+0.20802 -0.051982 -1.1673
+0.21093 -0.052159 -1.1713
+0.21242 -0.052255 -1.1735
+-0.19156 -0.054087 -1.1898
+-0.19027 -0.054038 -1.1887
+-0.18889 -0.053965 -1.1871
+-0.18767 -0.053935 -1.1864
+-0.18542 -0.053932 -1.1864
+-0.18429 -0.053928 -1.1863
+-0.18317 -0.053928 -1.1863
+-0.18207 -0.053933 -1.1864
+-0.18121 -0.054009 -1.1881
+-0.18018 -0.054035 -1.1887
+-0.17916 -0.054066 -1.1894
+-0.14185 -0.051504 -1.1325
+-0.1407 -0.051474 -1.1318
+-0.13849 -0.051444 -1.1312
+-0.134 -0.051359 -1.1293
+-0.075888 -0.049551 -1.0893
+-0.0749 -0.049577 -1.0899
+-0.074006 -0.049666 -1.0919
+-0.073128 -0.049769 -1.0942
+-0.072269 -0.049888 -1.0968
+-0.062371 -0.050243 -1.1048
+-0.061421 -0.050318 -1.1064
+-0.060454 -0.050381 -1.1078
+-0.056397 -0.050488 -1.1102
+-0.05533 -0.050469 -1.1098
+-0.054152 -0.050346 -1.1071
+-0.051985 -0.050268 -1.1054
+-0.047891 -0.050344 -1.1071
+-0.04622 -0.050801 -1.1172
+-0.044213 -0.050915 -1.1198
+-0.031916 -0.051504 -1.1329
+-0.026102 -0.052695 -1.1594
+-0.025047 -0.052773 -1.1611
+-0.00327 -0.054364 -1.1966
+-0.002142 -0.05432 -1.1956
+0.006827 -0.054029 -1.1891
+0.009088 -0.054156 -1.1919
+0.020308 -0.054151 -1.1918
+0.021415 -0.054112 -1.191
+0.022521 -0.054073 -1.1901
+0.023632 -0.054052 -1.1896
+0.024741 -0.054029 -1.1891
+0.029157 -0.053913 -1.1865
+0.030253 -0.053875 -1.1857
+0.03135 -0.05384 -1.1849
+0.032461 -0.053833 -1.1847
+0.033585 -0.053847 -1.185
+0.044816 -0.053933 -1.1869
+0.045943 -0.053945 -1.1872
+0.047066 -0.053951 -1.1873
+0.056291 -0.054221 -1.1933
+0.071582 -0.057477 -1.2657
+0.073564 -0.057166 -1.2588
+0.081973 -0.05643 -1.2424
+0.083459 -0.053628 -1.18
+0.084474 -0.053567 -1.1787
+0.086433 -0.053405 -1.1751
+0.087455 -0.053354 -1.1739
+0.088517 -0.053327 -1.1733
+0.089622 -0.053328 -1.1733
+0.090745 -0.053338 -1.1735
+0.091903 -0.053368 -1.1742
+0.093138 -0.053443 -1.1759
+0.095436 -0.053489 -1.1769
+0.10168 -0.053274 -1.1721
+0.10272 -0.053244 -1.1714
+0.1038 -0.053231 -1.1711
+0.10811 -0.053182 -1.17
+0.1092 -0.053176 -1.1699
+0.11046 -0.053251 -1.1715
+0.11281 -0.053319 -1.173
+0.14601 -0.054155 -1.1915
+0.14735 -0.053828 -1.1842
+0.14873 -0.053521 -1.1774
+0.21237 -0.053347 -1.1732
+0.21382 -0.053433 -1.1751
+-0.19157 -0.055213 -1.1899
+-0.18896 -0.055105 -1.1875
+-0.18656 -0.055056 -1.1865
+-0.18427 -0.05504 -1.1861
+-0.18201 -0.055033 -1.186
+-0.17981 -0.055044 -1.1862
+-0.17788 -0.055139 -1.1883
+-0.17583 -0.055197 -1.1896
+-0.17387 -0.055286 -1.1915
+-0.14298 -0.052594 -1.133
+-0.14186 -0.052573 -1.1325
+-0.13967 -0.052554 -1.1321
+-0.1375 -0.052539 -1.1318
+-0.13531 -0.052519 -1.1314
+-0.13424 -0.052516 -1.1313
+-0.13303 -0.052459 -1.1301
+-0.13061 -0.052344 -1.1276
+-0.12807 -0.052176 -1.1239
+-0.12554 -0.052007 -1.1203
+-0.12309 -0.051862 -1.1171
+-0.12058 -0.051687 -1.1133
+-0.11809 -0.051517 -1.1096
+-0.11543 -0.051265 -1.1041
+-0.11302 -0.051115 -1.1009
+-0.11088 -0.051087 -1.1003
+-0.080939 -0.050527 -1.0882
+-0.078849 -0.050502 -1.0876
+-0.076856 -0.05054 -1.0885
+-0.075066 -0.050717 -1.0923
+-0.07358 -0.051115 -1.101
+-0.071572 -0.051164 -1.1021
+-0.069528 -0.051188 -1.1026
+-0.067392 -0.051144 -1.1017
+-0.0654 -0.051211 -1.1031
+-0.063407 -0.051281 -1.1047
+-0.061442 -0.051379 -1.1068
+-0.059441 -0.051452 -1.1084
+-0.057434 -0.051527 -1.11
+-0.055378 -0.05156 -1.1108
+-0.053132 -0.051413 -1.1076
+-0.050999 -0.051367 -1.1066
+-0.04893 -0.051384 -1.107
+-0.047917 -0.051417 -1.1077
+-0.047042 -0.051602 -1.1117
+-0.046174 -0.051804 -1.1161
+-0.045163 -0.05185 -1.1171
+-0.043146 -0.051957 -1.1195
+-0.041134 -0.05208 -1.1222
+-0.039089 -0.052174 -1.1242
+-0.037059 -0.052298 -1.1269
+-0.032915 -0.052462 -1.1305
+-0.030857 -0.052587 -1.1332
+-0.027158 -0.053717 -1.1579
+-0.025032 -0.053836 -1.1605
+-0.023966 -0.053896 -1.1618
+-0.004395 -0.055467 -1.196
+-0.003265 -0.055404 -1.1947
+-0.001013 -0.055278 -1.1919
+0.00123 -0.055195 -1.1901
+0.003467 -0.05513 -1.1887
+0.005704 -0.055118 -1.1884
+0.007958 -0.055227 -1.1908
+0.009086 -0.055269 -1.1917
+0.015815 -0.055257 -1.1914
+0.016932 -0.055241 -1.1911
+0.019157 -0.055191 -1.19
+0.021369 -0.055115 -1.1883
+0.023584 -0.055061 -1.1872
+0.025801 -0.055021 -1.1863
+0.028022 -0.054996 -1.1858
+0.030222 -0.054935 -1.1844
+0.032453 -0.054936 -1.1844
+0.034713 -0.054982 -1.1854
+0.036962 -0.055007 -1.186
+0.039227 -0.055051 -1.1869
+0.041473 -0.055066 -1.1872
+0.043738 -0.055103 -1.188
+0.045989 -0.055119 -1.1884
+0.048262 -0.055158 -1.1892
+0.050551 -0.055213 -1.1904
+0.052837 -0.055259 -1.1914
+0.055158 -0.055336 -1.1931
+0.05631 -0.055364 -1.1937
+0.071508 -0.058608 -1.2644
+0.072602 -0.05853 -1.2627
+0.074539 -0.058187 -1.2552
+0.076651 -0.057998 -1.2511
+0.08086 -0.05764 -1.2433
+0.08196 -0.057591 -1.2422
+0.08456 -0.054733 -1.1799
+0.085574 -0.054671 -1.1785
+0.086606 -0.054622 -1.1774
+0.093361 -0.054681 -1.1787
+0.094459 -0.054675 -1.1786
+0.096555 -0.054604 -1.177
+0.098605 -0.054512 -1.175
+0.10067 -0.05443 -1.1732
+0.10276 -0.054369 -1.1719
+0.1049 -0.054335 -1.1711
+0.10705 -0.054305 -1.1704
+0.10942 -0.054387 -1.1722
+0.11175 -0.054445 -1.1735
+0.11397 -0.05445 -1.1736
+0.11619 -0.054454 -1.1737
+0.14481 -0.055251 -1.1909
+0.1458 -0.0552 -1.1898
+0.1465 -0.055044 -1.1864
+0.14705 -0.054831 -1.1817
+0.14783 -0.054707 -1.179
+0.14957 -0.054531 -1.1752
+0.15148 -0.054424 -1.1728
+0.19934 -0.054217 -1.1681
+0.20165 -0.054246 -1.1687
+0.20362 -0.054184 -1.1674
+0.20823 -0.05424 -1.1685
+0.21095 -0.054372 -1.1714
+0.21377 -0.054529 -1.1748
+-0.19283 -0.056375 -1.1907
+-0.19035 -0.056304 -1.1892
+-0.17869 -0.056162 -1.1862
+-0.17761 -0.056173 -1.1865
+-0.17658 -0.056199 -1.187
+-0.17548 -0.056206 -1.1872
+-0.1745 -0.056252 -1.1882
+-0.1725 -0.056329 -1.1898
+-0.17145 -0.056351 -1.1903
+-0.17042 -0.056381 -1.191
+-0.16939 -0.056411 -1.1916
+-0.14296 -0.053655 -1.1328
+-0.13649 -0.053631 -1.1323
+-0.13542 -0.053631 -1.1323
+-0.13427 -0.053596 -1.1316
+-0.12935 -0.053325 -1.1258
+-0.12805 -0.053228 -1.1238
+-0.12678 -0.053137 -1.1218
+-0.12549 -0.053038 -1.1197
+-0.12413 -0.052911 -1.117
+-0.11916 -0.052574 -1.1098
+-0.077817 -0.051524 -1.0875
+-0.076908 -0.051602 -1.0892
+-0.076197 -0.051816 -1.0938
+-0.075475 -0.052029 -1.0984
+-0.074622 -0.052157 -1.1011
+-0.072587 -0.052186 -1.1017
+-0.047965 -0.052514 -1.1088
+-0.046146 -0.052824 -1.1154
+-0.044104 -0.052896 -1.117
+-0.031891 -0.053598 -1.132
+-0.030854 -0.05365 -1.1331
+-0.023956 -0.054968 -1.1613
+-0.005518 -0.056566 -1.1954
+-0.004387 -0.056499 -1.194
+-0.003259 -0.056423 -1.1924
+-0.002134 -0.056377 -1.1914
+0.009078 -0.056342 -1.1906
+0.010194 -0.056315 -1.1901
+0.011312 -0.0563 -1.1897
+0.012431 -0.056294 -1.1896
+0.013551 -0.056295 -1.1896
+0.014672 -0.056299 -1.1897
+0.01579 -0.056292 -1.1896
+0.02244 -0.056114 -1.1858
+0.023544 -0.056086 -1.1852
+0.02466 -0.056085 -1.1851
+0.05402 -0.056445 -1.1928
+0.055198 -0.056501 -1.194
+0.072505 -0.05964 -1.261
+0.073521 -0.059501 -1.258
+0.081948 -0.058752 -1.242
+0.094581 -0.055857 -1.1801
+0.095597 -0.055801 -1.1789
+0.10386 -0.055471 -1.1718
+0.10495 -0.055465 -1.1717
+0.10606 -0.055466 -1.1717
+0.10841 -0.055541 -1.1733
+0.1457 -0.056283 -1.189
+0.14699 -0.055921 -1.1812
+0.14854 -0.05567 -1.1758
+0.21238 -0.055563 -1.1733
+-0.19285 -0.057502 -1.1908
+-0.19172 -0.0575 -1.1908
+-0.18921 -0.057419 -1.1891
+-0.18435 -0.057301 -1.1866
+-0.1798 -0.057277 -1.1862
+-0.17759 -0.057284 -1.1863
+-0.17543 -0.05731 -1.1869
+-0.17321 -0.057313 -1.1869
+-0.17117 -0.05738 -1.1884
+-0.16914 -0.057451 -1.1899
+-0.16812 -0.057486 -1.1906
+-0.16709 -0.057518 -1.1913
+-0.16309 -0.057689 -1.1949
+-0.14291 -0.054706 -1.1325
+-0.14184 -0.054702 -1.1324
+-0.13969 -0.054698 -1.1323
+-0.1376 -0.054715 -1.1327
+-0.13545 -0.054711 -1.1326
+-0.13319 -0.054657 -1.1315
+-0.13041 -0.054386 -1.1258
+-0.12782 -0.05419 -1.1217
+-0.12517 -0.053958 -1.1169
+-0.12263 -0.053767 -1.1129
+-0.12019 -0.053616 -1.1097
+-0.119 -0.053549 -1.1083
+-0.11756 -0.053373 -1.1046
+-0.11502 -0.05316 -1.1002
+-0.11289 -0.053132 -1.0996
+-0.10869 -0.053109 -1.0991
+-0.10432 -0.052991 -1.0967
+-0.099961 -0.052874 -1.0943
+-0.095754 -0.05283 -1.0933
+-0.091669 -0.052852 -1.0938
+-0.087261 -0.05268 -1.0902
+-0.082937 -0.052546 -1.0874
+-0.080832 -0.05251 -1.0867
+-0.078792 -0.052516 -1.0868
+-0.077855 -0.052575 -1.0881
+-0.077172 -0.052809 -1.093
+-0.076504 -0.053061 -1.0983
+-0.075654 -0.053191 -1.101
+-0.073609 -0.053214 -1.1015
+-0.071547 -0.053224 -1.1017
+-0.067471 -0.053285 -1.103
+-0.063444 -0.053396 -1.1053
+-0.059394 -0.053501 -1.1075
+-0.055385 -0.053662 -1.1109
+-0.053287 -0.053658 -1.1108
+-0.051079 -0.053538 -1.1083
+-0.048993 -0.053541 -1.1084
+-0.047971 -0.053566 -1.1089
+-0.047062 -0.053721 -1.1122
+-0.04509 -0.05387 -1.1153
+-0.043063 -0.053964 -1.1173
+-0.041123 -0.054182 -1.1218
+-0.039133 -0.054354 -1.1255
+-0.037067 -0.054435 -1.1272
+-0.034997 -0.054519 -1.1289
+-0.032954 -0.05466 -1.1319
+-0.030876 -0.054756 -1.1339
+-0.02982 -0.054778 -1.1344
+-0.028807 -0.054886 -1.1366
+-0.027151 -0.055885 -1.1575
+-0.025019 -0.055993 -1.1598
+-0.022875 -0.056093 -1.1619
+-0.006641 -0.057671 -1.195
+-0.00551 -0.057604 -1.1936
+-0.003255 -0.057472 -1.1908
+-0.001011 -0.057393 -1.1892
+0.003464 -0.057319 -1.1876
+0.007945 -0.057377 -1.1888
+0.010178 -0.057344 -1.1881
+0.012401 -0.057281 -1.1868
+0.014644 -0.057311 -1.1874
+0.016878 -0.057302 -1.1872
+0.021314 -0.057205 -1.1852
+0.023541 -0.057194 -1.185
+0.025765 -0.057178 -1.1846
+0.027993 -0.057171 -1.1845
+0.030254 -0.057228 -1.1857
+0.034809 -0.057375 -1.1888
+0.037096 -0.05745 -1.1903
+0.039335 -0.057446 -1.1902
+0.043839 -0.057474 -1.1908
+0.046114 -0.057514 -1.1916
+0.048351 -0.057506 -1.1915
+0.052914 -0.057587 -1.1932
+0.055256 -0.057687 -1.1952
+0.073462 -0.060638 -1.257
+0.074519 -0.060535 -1.2549
+0.076629 -0.060337 -1.2507
+0.0787 -0.06012 -1.2462
+0.080851 -0.059976 -1.2431
+0.081924 -0.059905 -1.2416
+0.094675 -0.057026 -1.1813
+0.096682 -0.056898 -1.1786
+0.098715 -0.05679 -1.1763
+0.10076 -0.056695 -1.1743
+0.10285 -0.056628 -1.1729
+0.10517 -0.056687 -1.1741
+0.10747 -0.05673 -1.175
+0.10967 -0.056728 -1.175
+0.11407 -0.056711 -1.1746
+0.11857 -0.056748 -1.1754
+0.12315 -0.05682 -1.1768
+0.12782 -0.056925 -1.179
+0.13267 -0.057097 -1.1826
+0.13755 -0.057277 -1.1864
+0.14235 -0.057408 -1.1891
+0.14464 -0.057427 -1.1895
+0.14615 -0.057142 -1.1835
+0.14756 -0.056827 -1.1769
+0.1494 -0.056683 -1.1738
+0.15325 -0.056471 -1.1694
+0.15728 -0.056338 -1.1666
+0.16139 -0.056236 -1.1644
+0.16553 -0.056154 -1.1627
+0.16974 -0.056097 -1.1615
+0.17402 -0.056065 -1.1608
+0.17836 -0.056055 -1.1605
+0.1828 -0.056075 -1.161
+0.18746 -0.056159 -1.1627
+0.19201 -0.056209 -1.1637
+0.19692 -0.056359 -1.1668
+0.19979 -0.056549 -1.1708
+0.20243 -0.056669 -1.1733
+0.20404 -0.056504 -1.1698
+0.2061 -0.056463 -1.169
+0.20848 -0.056511 -1.17
+0.21099 -0.056592 -1.1716
+0.21229 -0.056645 -1.1728
+-0.19284 -0.058624 -1.1908
+-0.19059 -0.05862 -1.1907
+-0.16992 -0.058455 -1.1874
+-0.1688 -0.058455 -1.1874
+-0.16783 -0.058506 -1.1885
+-0.16173 -0.058732 -1.1932
+-0.1607 -0.058765 -1.1938
+-0.15969 -0.058808 -1.1947
+-0.15872 -0.058864 -1.1959
+-0.14181 -0.055759 -1.1321
+-0.14075 -0.055761 -1.1322
+-0.13864 -0.055773 -1.1325
+-0.13437 -0.055772 -1.1325
+-0.12358 -0.054773 -1.112
+-0.12132 -0.0547 -1.1105
+-0.12005 -0.0546 -1.1084
+-0.1186 -0.05441 -1.1045
+-0.079782 -0.053518 -1.0864
+-0.078029 -0.053721 -1.0905
+-0.076643 -0.054195 -1.1003
+-0.052218 -0.054682 -1.1103
+-0.050052 -0.054602 -1.1087
+-0.048 -0.054646 -1.1096
+-0.044035 -0.054917 -1.1152
+-0.043072 -0.055028 -1.1175
+-0.042034 -0.055048 -1.1179
+-0.041119 -0.055234 -1.1217
+-0.040187 -0.055408 -1.1253
+-0.039174 -0.055474 -1.1267
+-0.038174 -0.055563 -1.1285
+-0.037147 -0.055618 -1.1296
+-0.036157 -0.055733 -1.132
+-0.034062 -0.055794 -1.1332
+-0.031955 -0.055843 -1.1343
+-0.029858 -0.05592 -1.1358
+-0.028811 -0.055964 -1.1367
+-0.027157 -0.056988 -1.1578
+-0.026103 -0.057068 -1.1594
+-0.023939 -0.057117 -1.1604
+-0.02286 -0.05715 -1.1611
+-0.015609 -0.058671 -1.1924
+-0.014475 -0.058627 -1.1915
+-0.008904 -0.05888 -1.1967
+-0.007765 -0.058785 -1.1947
+-0.006632 -0.058714 -1.1933
+0.022423 -0.058304 -1.1848
+0.023543 -0.058315 -1.1851
+0.02466 -0.058317 -1.1851
+0.025777 -0.058321 -1.1852
+0.026906 -0.05835 -1.1858
+0.028049 -0.058403 -1.1869
+0.029208 -0.058488 -1.1886
+0.047308 -0.058726 -1.1935
+0.054218 -0.058908 -1.1972
+0.074464 -0.061672 -1.254
+0.075555 -0.061599 -1.2524
+0.077672 -0.061409 -1.2485
+0.081897 -0.061055 -1.2412
+0.082985 -0.060996 -1.24
+0.095775 -0.058132 -1.1811
+0.09675 -0.058049 -1.1794
+0.097742 -0.057979 -1.178
+0.098782 -0.057938 -1.1771
+0.099811 -0.057892 -1.1762
+0.20139 -0.057796 -1.1737
+0.20359 -0.057791 -1.1736
+0.20515 -0.057609 -1.1699
+0.20973 -0.057654 -1.1708
+0.21096 -0.057689 -1.1715
+-0.19183 -0.059779 -1.1915
+-0.18949 -0.05975 -1.1909
+-0.18698 -0.059666 -1.1892
+-0.18459 -0.059616 -1.1882
+-0.18228 -0.059594 -1.1878
+-0.1777 -0.059557 -1.187
+-0.17326 -0.059569 -1.1873
+-0.17101 -0.059566 -1.1873
+-0.16878 -0.059566 -1.1873
+-0.16661 -0.059592 -1.1878
+-0.16453 -0.059648 -1.1889
+-0.1624 -0.05969 -1.1898
+-0.16039 -0.059774 -1.1915
+-0.15842 -0.05988 -1.1936
+-0.15743 -0.059931 -1.1947
+-0.1565 -0.060006 -1.1962
+-0.15548 -0.060044 -1.197
+-0.14179 -0.056819 -1.132
+-0.13966 -0.056823 -1.1321
+-0.13758 -0.056843 -1.1325
+-0.13542 -0.056835 -1.1323
+-0.13422 -0.056775 -1.1311
+-0.13278 -0.056615 -1.1279
+-0.13002 -0.056341 -1.1224
+-0.12749 -0.05616 -1.1188
+-0.12478 -0.055891 -1.1134
+-0.12357 -0.055816 -1.1119
+-0.12237 -0.055751 -1.1105
+-0.1211 -0.055648 -1.1085
+-0.11964 -0.055452 -1.1045
+-0.11821 -0.05527 -1.1009
+-0.117 -0.055189 -1.0992
+-0.11489 -0.055172 -1.0989
+-0.11283 -0.055177 -1.099
+-0.11074 -0.05517 -1.0989
+-0.080769 -0.054518 -1.0858
+-0.079754 -0.054524 -1.086
+-0.078891 -0.054635 -1.0882
+-0.077599 -0.055176 -1.0991
+-0.075645 -0.055261 -1.1009
+-0.073583 -0.055272 -1.1011
+-0.053345 -0.055813 -1.112
+-0.052297 -0.055813 -1.112
+-0.051183 -0.055742 -1.1106
+-0.050087 -0.055687 -1.1095
+-0.049042 -0.055687 -1.1095
+-0.048035 -0.055732 -1.1104
+-0.047053 -0.055809 -1.112
+-0.045025 -0.055893 -1.1137
+-0.042167 -0.05628 -1.1215
+-0.041247 -0.056468 -1.1253
+-0.040478 -0.056876 -1.1335
+-0.039445 -0.056927 -1.1345
+-0.03738 -0.057038 -1.1368
+-0.035239 -0.05704 -1.1368
+-0.033074 -0.057 -1.136
+-0.030925 -0.056985 -1.1357
+-0.028816 -0.057045 -1.1369
+-0.027942 -0.057451 -1.1451
+-0.02715 -0.058065 -1.1575
+-0.026103 -0.058161 -1.1594
+-0.025017 -0.058175 -1.1597
+-0.022854 -0.058229 -1.1608
+-0.02179 -0.058309 -1.1624
+-0.015581 -0.059686 -1.1902
+-0.01446 -0.059686 -1.1902
+-0.010024 -0.059969 -1.1959
+-0.007752 -0.059813 -1.1928
+-0.005496 -0.059698 -1.1904
+-0.003249 -0.059606 -1.1886
+0.010162 -0.059494 -1.1863
+0.012388 -0.059455 -1.1855
+0.01462 -0.059452 -1.1855
+0.016857 -0.059464 -1.1857
+0.019085 -0.05945 -1.1854
+0.021326 -0.059473 -1.1859
+0.023581 -0.059528 -1.187
+0.025857 -0.059623 -1.1889
+0.028171 -0.059781 -1.1921
+0.030491 -0.059929 -1.1951
+0.032758 -0.059958 -1.1957
+0.035035 -0.060002 -1.1965
+0.037281 -0.059991 -1.1963
+0.039547 -0.06001 -1.1967
+0.041799 -0.060008 -1.1967
+0.044026 -0.059972 -1.1959
+0.046269 -0.059961 -1.1957
+0.047389 -0.059953 -1.1955
+0.048504 -0.05994 -1.1953
+0.050772 -0.05996 -1.1957
+0.053155 -0.060109 -1.1987
+0.054369 -0.060203 -1.2006
+0.074384 -0.062785 -1.2526
+0.076604 -0.062673 -1.2503
+0.078724 -0.062487 -1.2466
+0.080823 -0.062296 -1.2427
+0.082972 -0.062154 -1.2398
+0.084093 -0.06212 -1.2391
+0.099949 -0.059082 -1.1778
+0.10104 -0.059069 -1.1775
+0.10326 -0.059073 -1.1776
+0.10547 -0.059068 -1.1775
+0.10763 -0.059036 -1.1768
+0.10978 -0.058999 -1.1761
+0.11196 -0.058982 -1.1757
+0.13985 -0.059538 -1.1868
+0.14222 -0.059597 -1.188
+0.14441 -0.059575 -1.1876
+0.14579 -0.059227 -1.1805
+0.14739 -0.058977 -1.1755
+0.14921 -0.058822 -1.1723
+0.15114 -0.058713 -1.1701
+0.18993 -0.058438 -1.1644
+0.19232 -0.058496 -1.1656
+0.19459 -0.058521 -1.1661
+0.19717 -0.058632 -1.1683
+0.20026 -0.058894 -1.1736
+0.20171 -0.058995 -1.1756
+0.20283 -0.058997 -1.1756
+0.20393 -0.058996 -1.1756
+0.20479 -0.058926 -1.1742
+0.20652 -0.058788 -1.1714
+0.20858 -0.058747 -1.1705
+0.21087 -0.058768 -1.171
+-0.19112 -0.061034 -1.1941
+-0.18971 -0.060941 -1.1922
+-0.18843 -0.060891 -1.1912
+-0.18593 -0.060809 -1.1896
+-0.1571 -0.060927 -1.1921
+-0.15505 -0.061007 -1.1937
+-0.14178 -0.057882 -1.1319
+-0.14072 -0.057884 -1.132
+-0.13861 -0.057894 -1.1322
+-0.13398 -0.057738 -1.1291
+-0.13251 -0.057563 -1.1256
+-0.13128 -0.057488 -1.1241
+-0.12874 -0.057301 -1.1205
+-0.12613 -0.057078 -1.116
+-0.12461 -0.056864 -1.1118
+-0.12065 -0.056482 -1.1043
+-0.11923 -0.056304 -1.1008
+-0.11802 -0.056221 -1.0991
+-0.07977 -0.05556 -1.0862
+-0.05231 -0.056876 -1.1123
+-0.05016 -0.056816 -1.1111
+-0.04809 -0.056845 -1.1117
+-0.046057 -0.056921 -1.1132
+-0.044231 -0.057274 -1.1202
+-0.04327 -0.057399 -1.1227
+-0.041551 -0.057953 -1.1337
+-0.040591 -0.058107 -1.1367
+-0.027949 -0.058545 -1.1454
+-0.026097 -0.05924 -1.1592
+-0.023927 -0.059274 -1.1598
+-0.02285 -0.059314 -1.1606
+-0.017855 -0.06092 -1.1924
+-0.016712 -0.060847 -1.191
+-0.01557 -0.060767 -1.1894
+-0.013355 -0.06088 -1.1916
+-0.012253 -0.06098 -1.1936
+-0.011148 -0.061085 -1.1957
+0.013502 -0.060561 -1.1853
+0.014618 -0.060561 -1.1853
+0.015742 -0.060588 -1.1858
+0.016858 -0.060588 -1.1858
+0.017978 -0.060599 -1.1861
+0.019106 -0.060633 -1.1867
+0.020229 -0.06065 -1.1871
+0.021363 -0.060695 -1.188
+0.022505 -0.060759 -1.1892
+0.024814 -0.06093 -1.1926
+0.025983 -0.061039 -1.1948
+0.027158 -0.061152 -1.197
+0.028291 -0.061163 -1.1972
+0.029433 -0.061193 -1.1978
+0.030565 -0.061203 -1.198
+0.031693 -0.061203 -1.198
+0.03395 -0.061204 -1.198
+0.04744 -0.061146 -1.1968
+0.049681 -0.06113 -1.1965
+0.050821 -0.061146 -1.1968
+0.052037 -0.061251 -1.1989
+0.054652 -0.061654 -1.2069
+0.08408 -0.063277 -1.2389
+0.085177 -0.063226 -1.2379
+0.092827 -0.062882 -1.2311
+0.093932 -0.062847 -1.2304
+0.10133 -0.060351 -1.1809
+0.10239 -0.060323 -1.1804
+0.10446 -0.060233 -1.1786
+0.14327 -0.060686 -1.1874
+0.14492 -0.060443 -1.1826
+0.19362 -0.059657 -1.1668
+0.19472 -0.059657 -1.1668
+0.19604 -0.059726 -1.1681
+0.1987 -0.059863 -1.1708
+0.20028 -0.060005 -1.1736
+0.20172 -0.060106 -1.1756
+0.20392 -0.060101 -1.1755
+0.20588 -0.060026 -1.174
+0.20765 -0.059899 -1.1715
+0.20966 -0.059844 -1.1704
+-0.19207 -0.06247 -1.2001
+-0.1903 -0.062261 -1.196
+-0.18736 -0.062034 -1.1916
+-0.18491 -0.061963 -1.1903
+-0.18025 -0.061903 -1.1891
+-0.17573 -0.06189 -1.1889
+-0.17132 -0.061916 -1.1894
+-0.16672 -0.061873 -1.1886
+-0.16449 -0.061875 -1.1887
+-0.16234 -0.061909 -1.1893
+-0.16006 -0.061896 -1.1891
+-0.15794 -0.061941 -1.19
+-0.15587 -0.06201 -1.1913
+-0.15485 -0.062052 -1.1922
+-0.14072 -0.058953 -1.132
+-0.13965 -0.058952 -1.132
+-0.13753 -0.058957 -1.1321
+-0.13521 -0.058879 -1.1306
+-0.13249 -0.058615 -1.1254
+-0.12999 -0.058445 -1.1221
+-0.12744 -0.058249 -1.1183
+-0.12618 -0.058155 -1.1165
+-0.12026 -0.057338 -1.1007
+-0.11907 -0.057265 -1.0993
+-0.1169 -0.057215 -1.0983
+-0.1128 -0.057239 -1.0988
+-0.10849 -0.057148 -1.097
+-0.10405 -0.05698 -1.0938
+-0.099733 -0.056873 -1.0917
+-0.095766 -0.056963 -1.0935
+-0.091561 -0.056912 -1.0925
+-0.087082 -0.056678 -1.088
+-0.082772 -0.056536 -1.0852
+-0.080718 -0.056531 -1.0851
+-0.079842 -0.056635 -1.0872
+-0.079145 -0.056871 -1.0918
+-0.077628 -0.05727 -1.0995
+-0.075618 -0.057318 -1.1004
+-0.071534 -0.05737 -1.1015
+-0.067462 -0.057439 -1.1028
+-0.063412 -0.057536 -1.1047
+-0.059372 -0.057658 -1.1071
+-0.055355 -0.057821 -1.1103
+-0.053351 -0.057918 -1.1122
+-0.051264 -0.057928 -1.1124
+-0.049153 -0.057911 -1.1121
+-0.047075 -0.057933 -1.1125
+-0.046088 -0.058011 -1.114
+-0.045291 -0.058336 -1.1203
+-0.043593 -0.058895 -1.1312
+-0.042701 -0.059134 -1.1358
+-0.041705 -0.059241 -1.1379
+-0.039549 -0.059222 -1.1376
+-0.035259 -0.059217 -1.1375
+-0.030962 -0.059197 -1.1371
+-0.028837 -0.059233 -1.1378
+-0.02797 -0.059671 -1.1463
+-0.027154 -0.060255 -1.1576
+-0.025006 -0.060334 -1.1592
+-0.022845 -0.060395 -1.1604
+-0.018986 -0.062071 -1.193
+-0.016693 -0.061898 -1.1896
+-0.014434 -0.061818 -1.188
+-0.012233 -0.062 -1.1916
+-0.011124 -0.062072 -1.193
+-0.009991 -0.062013 -1.1918
+-0.005486 -0.061837 -1.1884
+-0.001009 -0.061761 -1.1869
+0.003458 -0.061701 -1.1858
+0.007927 -0.061723 -1.1862
+0.012392 -0.061709 -1.1859
+0.01464 -0.061769 -1.1871
+0.016888 -0.061816 -1.188
+0.019177 -0.061983 -1.1912
+0.021476 -0.062144 -1.1944
+0.023788 -0.062306 -1.1975
+0.026052 -0.06233 -1.198
+0.028315 -0.062345 -1.1983
+0.030583 -0.062368 -1.1987
+0.032854 -0.062395 -1.1992
+0.035117 -0.062404 -1.1994
+0.039635 -0.062404 -1.1994
+0.044111 -0.062346 -1.1983
+0.046358 -0.062333 -1.198
+0.048606 -0.062323 -1.1978
+0.050987 -0.062476 -1.2008
+0.053618 -0.06291 -1.2092
+0.054756 -0.062911 -1.2092
+0.076473 -0.064917 -1.2481
+0.078693 -0.06481 -1.2461
+0.08299 -0.064504 -1.2401
+0.085149 -0.064371 -1.2375
+0.086242 -0.064317 -1.2364
+0.087348 -0.064275 -1.2356
+0.091735 -0.064089 -1.232
+0.093921 -0.063998 -1.2302
+0.095057 -0.063983 -1.2299
+0.10154 -0.061594 -1.1835
+0.10349 -0.061427 -1.1802
+0.1056 -0.061361 -1.1789
+0.10996 -0.061315 -1.178
+0.11433 -0.061279 -1.1773
+0.11875 -0.061273 -1.1772
+0.12333 -0.061345 -1.1785
+0.12797 -0.061442 -1.1804
+0.13273 -0.061584 -1.1831
+0.13742 -0.061688 -1.1851
+0.14209 -0.061777 -1.1869
+0.14316 -0.061757 -1.1864
+0.14399 -0.061636 -1.1841
+0.14556 -0.061357 -1.1787
+0.14718 -0.061106 -1.1738
+0.14902 -0.060955 -1.1708
+0.15298 -0.060775 -1.1673
+0.15702 -0.060636 -1.1646
+0.1612 -0.060558 -1.1631
+0.16536 -0.060477 -1.1615
+0.1696 -0.060427 -1.1605
+0.17389 -0.060396 -1.1599
+0.17826 -0.060399 -1.1599
+0.18277 -0.060444 -1.1607
+0.18751 -0.060562 -1.163
+0.1926 -0.060784 -1.1673
+0.19498 -0.060839 -1.1684
+0.19746 -0.060925 -1.17
+0.19886 -0.061017 -1.1718
+0.20061 -0.061213 -1.1756
+0.20203 -0.061308 -1.1774
+0.20314 -0.061308 -1.1774
+0.205 -0.061201 -1.1754
+0.20699 -0.061136 -1.1741
+0.20784 -0.061059 -1.1726
+0.20866 -0.060978 -1.171
+-0.19358 -0.063726 -1.2025
+-0.1923 -0.063677 -1.2015
+-0.19092 -0.063592 -1.1999
+-0.18924 -0.063409 -1.1964
+-0.18633 -0.063187 -1.1922
+-0.16126 -0.063048 -1.1897
+-0.16004 -0.063008 -1.1889
+-0.15898 -0.06303 -1.1893
+-0.15677 -0.063043 -1.1896
+-0.15567 -0.063053 -1.1898
+-0.15466 -0.063096 -1.1906
+-0.15366 -0.063147 -1.1916
+-0.14071 -0.060015 -1.1319
+-0.13858 -0.060017 -1.1319
+-0.12617 -0.059202 -1.1164
+-0.12245 -0.05843 -1.1017
+-0.12129 -0.058371 -1.1006
+-0.12012 -0.058307 -1.0993
+-0.11793 -0.058251 -1.0983
+-0.079946 -0.057736 -1.0886
+-0.046317 -0.059354 -1.1196
+-0.045507 -0.059676 -1.1257
+-0.044654 -0.059955 -1.1311
+-0.043739 -0.060162 -1.135
+-0.042757 -0.060285 -1.1374
+-0.040651 -0.06034 -1.1384
+-0.029906 -0.060299 -1.1377
+-0.028837 -0.060305 -1.1378
+-0.028067 -0.060961 -1.1503
+-0.018964 -0.06312 -1.1915
+-0.017816 -0.063029 -1.1898
+-0.015543 -0.0629 -1.1873
+-0.011103 -0.063081 -1.1908
+0.015803 -0.063067 -1.1905
+0.018111 -0.063297 -1.1949
+0.019264 -0.06339 -1.1967
+0.020415 -0.063466 -1.1981
+0.021543 -0.063466 -1.1981
+0.022673 -0.063471 -1.1982
+0.024946 -0.063513 -1.199
+0.04527 -0.063518 -1.1991
+0.046398 -0.063517 -1.1991
+0.047527 -0.063517 -1.1991
+0.048699 -0.063573 -1.2001
+0.049894 -0.063656 -1.2017
+0.051266 -0.063956 -1.2074
+0.052491 -0.064064 -1.2095
+0.053655 -0.064094 -1.21
+0.077541 -0.066001 -1.2464
+0.086235 -0.065476 -1.2363
+0.095065 -0.065147 -1.23
+0.096199 -0.065131 -1.2297
+0.14313 -0.062865 -1.1862
+0.14461 -0.062535 -1.18
+0.14798 -0.062084 -1.1713
+0.19633 -0.06202 -1.1699
+0.19943 -0.062299 -1.1752
+0.20268 -0.062621 -1.1813
+0.20652 -0.062436 -1.1778
+0.20732 -0.062341 -1.176
+-0.19473 -0.064866 -1.2026
+-0.19356 -0.06485 -1.2023
+-0.19114 -0.0648 -1.2014
+-0.18813 -0.064543 -1.1966
+-0.18538 -0.064373 -1.1934
+-0.18299 -0.064322 -1.1924
+-0.1648 -0.064237 -1.1909
+-0.16251 -0.06422 -1.1906
+-0.1602 -0.064193 -1.1901
+-0.15788 -0.064162 -1.1895
+-0.15565 -0.064166 -1.1896
+-0.15345 -0.064181 -1.1899
+-0.14069 -0.061074 -1.1317
+-0.13962 -0.061074 -1.1317
+-0.13745 -0.061059 -1.1314
+-0.13504 -0.060932 -1.1291
+-0.13228 -0.060641 -1.1236
+-0.12985 -0.060498 -1.121
+-0.12733 -0.060306 -1.1174
+-0.12352 -0.059483 -1.1019
+-0.12112 -0.059329 -1.099
+-0.11897 -0.059288 -1.0983
+-0.11687 -0.05927 -1.098
+-0.11484 -0.059291 -1.0984
+-0.084839 -0.058598 -1.0855
+-0.080725 -0.058583 -1.0852
+-0.079301 -0.059047 -1.0939
+-0.077614 -0.059334 -1.0993
+-0.075605 -0.059383 -1.1002
+-0.073574 -0.059418 -1.1009
+-0.053337 -0.059999 -1.1119
+-0.051341 -0.060117 -1.1141
+-0.04936 -0.060261 -1.1168
+-0.047367 -0.060404 -1.1195
+-0.045506 -0.060735 -1.1257
+-0.043734 -0.061225 -1.1349
+-0.041728 -0.06142 -1.1385
+-0.03958 -0.061415 -1.1385
+-0.037423 -0.061396 -1.1381
+-0.033126 -0.06138 -1.1378
+-0.030978 -0.061373 -1.1377
+-0.029909 -0.061379 -1.1378
+-0.028943 -0.061604 -1.142
+-0.028149 -0.062228 -1.1537
+-0.027129 -0.062379 -1.1566
+-0.024988 -0.062476 -1.1584
+-0.022832 -0.062545 -1.1597
+-0.020062 -0.064166 -1.1901
+-0.018941 -0.064166 -1.1901
+-0.016669 -0.064048 -1.1879
+-0.014421 -0.063998 -1.1869
+-0.012213 -0.064145 -1.1897
+-0.00997 -0.064124 -1.1893
+-0.007721 -0.064051 -1.1879
+0.01016 -0.063947 -1.186
+0.012402 -0.063994 -1.1869
+0.014678 -0.064174 -1.1902
+0.015824 -0.064274 -1.1921
+0.017005 -0.064498 -1.1963
+0.019289 -0.064601 -1.1982
+0.021568 -0.064671 -1.1995
+0.023835 -0.064692 -1.1999
+0.02611 -0.06473 -1.2006
+0.028393 -0.064782 -1.2016
+0.032933 -0.06481 -1.2021
+0.03745 -0.064791 -1.2018
+0.039699 -0.064769 -1.2013
+0.041946 -0.064746 -1.2009
+0.044202 -0.064737 -1.2007
+0.046489 -0.064774 -1.2014
+0.048876 -0.064939 -1.2045
+0.050155 -0.065127 -1.2081
+0.051354 -0.065206 -1.2095
+0.05366 -0.06524 -1.2102
+0.078702 -0.067165 -1.2462
+0.080859 -0.067008 -1.2432
+0.082981 -0.066833 -1.2399
+0.085154 -0.066706 -1.2376
+0.087336 -0.066593 -1.2354
+0.089527 -0.066493 -1.2336
+0.09394 -0.06633 -1.2305
+0.096196 -0.066287 -1.2297
+0.097325 -0.066268 -1.2293
+0.10376 -0.063821 -1.1834
+0.10582 -0.06372 -1.1815
+0.10795 -0.063663 -1.1804
+0.13969 -0.06394 -1.1854
+0.142 -0.063976 -1.1861
+0.14303 -0.063938 -1.1854
+0.14375 -0.06376 -1.1821
+0.14532 -0.063472 -1.1767
+0.14698 -0.063234 -1.1722
+0.14791 -0.063159 -1.1708
+0.14886 -0.063094 -1.1695
+0.15084 -0.063003 -1.1678
+0.19538 -0.063172 -1.1708
+0.19654 -0.06319 -1.1711
+0.19812 -0.063344 -1.174
+0.20251 -0.064031 -1.1869
+0.20463 -0.063995 -1.1862
+0.20646 -0.063872 -1.1839
+0.20703 -0.063703 -1.1807
+-0.1947 -0.065987 -1.2023
+-0.19238 -0.065968 -1.202
+-0.15911 -0.065326 -1.1903
+-0.15682 -0.065308 -1.19
+-0.1557 -0.065306 -1.19
+-0.15457 -0.065304 -1.1899
+-0.14066 -0.062131 -1.1315
+-0.13851 -0.062121 -1.1313
+-0.1284 -0.061365 -1.1174
+-0.12708 -0.061238 -1.1151
+-0.12347 -0.060498 -1.1015
+-0.12217 -0.060371 -1.0991
+-0.07856 -0.060301 -1.098
+-0.076616 -0.0604 -1.0999
+-0.048416 -0.061452 -1.1193
+-0.04744 -0.061554 -1.1212
+-0.046449 -0.06164 -1.1228
+-0.044594 -0.062004 -1.1295
+-0.029913 -0.06246 -1.1379
+-0.028105 -0.063216 -1.1519
+-0.026036 -0.063462 -1.1564
+-0.024978 -0.06354 -1.1579
+-0.023904 -0.063586 -1.1587
+-0.021119 -0.065094 -1.1865
+-0.020047 -0.065241 -1.1892
+0.015868 -0.065581 -1.1955
+0.017015 -0.065663 -1.197
+0.018184 -0.065814 -1.1998
+0.020456 -0.065854 -1.2005
+0.038596 -0.065949 -1.2022
+0.039728 -0.065949 -1.2022
+0.040863 -0.065953 -1.2023
+0.041995 -0.065954 -1.2023
+0.043127 -0.065954 -1.2023
+0.044266 -0.065965 -1.2025
+0.045413 -0.065986 -1.2029
+0.047818 -0.066179 -1.2065
+0.04902 -0.066268 -1.2081
+0.050212 -0.066341 -1.2094
+0.05254 -0.066404 -1.2106
+0.053677 -0.066401 -1.2105
+0.079991 -0.068437 -1.248
+0.080915 -0.068227 -1.2441
+0.081906 -0.068077 -1.2413
+0.09731 -0.067416 -1.2291
+0.098436 -0.067395 -1.2287
+0.099566 -0.067376 -1.2284
+0.10071 -0.06737 -1.2283
+0.10499 -0.065008 -1.1847
+0.14293 -0.065009 -1.1845
+0.14441 -0.06467 -1.1783
+0.14786 -0.06424 -1.1704
+0.19699 -0.064442 -1.1738
+0.20163 -0.065228 -1.1883
+0.20288 -0.065271 -1.1891
+0.20393 -0.065248 -1.1887
+0.20579 -0.065128 -1.1864
+0.2066 -0.06503 -1.1846
+-0.19466 -0.067108 -1.2021
+-0.19354 -0.067113 -1.2022
+-0.19124 -0.067098 -1.202
+-0.18882 -0.067043 -1.201
+-0.18595 -0.066826 -1.1971
+-0.18116 -0.066724 -1.1952
+-0.17666 -0.066726 -1.1953
+-0.17221 -0.066746 -1.1957
+-0.16767 -0.06673 -1.1954
+-0.16294 -0.066639 -1.1938
+-0.16062 -0.066611 -1.1933
+-0.15822 -0.066544 -1.1921
+-0.15586 -0.066498 -1.1912
+-0.15356 -0.066471 -1.1908
+-0.14064 -0.063188 -1.1313
+-0.13956 -0.063181 -1.1312
+-0.13729 -0.063117 -1.13
+-0.13443 -0.062776 -1.1239
+-0.13194 -0.0626 -1.1207
+-0.12948 -0.062432 -1.1177
+-0.12826 -0.062354 -1.1163
+-0.12654 -0.062025 -1.1103
+-0.12459 -0.061579 -1.1022
+-0.12322 -0.061412 -1.0992
+-0.12106 -0.061369 -1.0984
+-0.11688 -0.06135 -1.0981
+-0.11276 -0.06136 -1.0983
+-0.10831 -0.061189 -1.0952
+-0.10389 -0.061017 -1.0921
+-0.099805 -0.061037 -1.0925
+-0.095859 -0.061148 -1.0945
+-0.09156 -0.061034 -1.0925
+-0.087089 -0.060788 -1.088
+-0.084836 -0.060644 -1.0855
+-0.082732 -0.060602 -1.0847
+-0.08078 -0.060672 -1.086
+-0.079348 -0.061147 -1.0946
+-0.078556 -0.061334 -1.098
+-0.077627 -0.061418 -1.0995
+-0.075593 -0.06145 -1.1001
+-0.071514 -0.061508 -1.1012
+-0.067422 -0.061563 -1.1022
+-0.063369 -0.061662 -1.104
+-0.05933 -0.06179 -1.1063
+-0.055329 -0.061981 -1.1098
+-0.05137 -0.062253 -1.1147
+-0.04941 -0.062431 -1.1179
+-0.047435 -0.062604 -1.1211
+-0.045472 -0.062812 -1.1248
+-0.043634 -0.06322 -1.1322
+-0.041735 -0.063576 -1.1387
+-0.039601 -0.063595 -1.1391
+-0.035295 -0.063571 -1.1386
+-0.030988 -0.063538 -1.138
+-0.029928 -0.063564 -1.1385
+-0.028973 -0.063823 -1.1432
+-0.028053 -0.064182 -1.1497
+-0.027017 -0.064294 -1.1517
+-0.024939 -0.064531 -1.156
+-0.023898 -0.06466 -1.1584
+-0.022813 -0.064678 -1.1587
+-0.021127 -0.066235 -1.1869
+-0.018912 -0.066306 -1.1882
+-0.016644 -0.066186 -1.186
+-0.014414 -0.066206 -1.1864
+-0.009954 -0.066261 -1.1874
+-0.005478 -0.066214 -1.1865
+-0.001008 -0.066154 -1.1855
+0.003456 -0.066134 -1.1851
+0.007916 -0.066099 -1.1845
+0.010157 -0.066166 -1.1857
+0.012396 -0.066198 -1.1863
+0.014667 -0.066367 -1.1893
+0.017052 -0.066934 -1.1996
+0.018214 -0.067055 -1.2018
+0.019346 -0.067057 -1.2018
+0.021618 -0.067086 -1.2023
+0.026173 -0.067154 -1.2036
+0.028449 -0.067177 -1.204
+0.030722 -0.06719 -1.2042
+0.035241 -0.06716 -1.2037
+0.037514 -0.067171 -1.2038
+0.03865 -0.067176 -1.2039
+0.039853 -0.067292 -1.206
+0.042131 -0.067304 -1.2063
+0.044412 -0.067318 -1.2065
+0.046741 -0.0674 -1.208
+0.049087 -0.067498 -1.2098
+0.051399 -0.067544 -1.2106
+0.052532 -0.067536 -1.2104
+0.080155 -0.069756 -1.2506
+0.081152 -0.069602 -1.2478
+0.082028 -0.06935 -1.2432
+0.083022 -0.069203 -1.2406
+0.085136 -0.069023 -1.2373
+0.087306 -0.068897 -1.235
+0.091727 -0.068725 -1.2319
+0.096179 -0.068592 -1.2294
+0.098435 -0.068551 -1.2287
+0.10071 -0.068527 -1.2283
+0.10187 -0.068524 -1.2282
+0.10612 -0.06613 -1.1848
+0.10816 -0.066015 -1.1827
+0.11029 -0.065955 -1.1816
+0.11473 -0.065951 -1.1815
+0.11911 -0.065911 -1.1808
+0.12355 -0.065905 -1.1806
+0.12819 -0.066003 -1.1824
+0.13278 -0.066073 -1.1836
+0.13727 -0.066087 -1.1839
+0.13966 -0.066161 -1.1852
+0.14198 -0.066202 -1.1859
+0.14289 -0.066104 -1.1842
+0.14354 -0.065892 -1.1803
+0.14512 -0.065602 -1.175
+0.14682 -0.065372 -1.1709
+0.14876 -0.065258 -1.1688
+0.15275 -0.06508 -1.1655
+0.15687 -0.064965 -1.1634
+0.16106 -0.064888 -1.162
+0.16528 -0.064824 -1.1608
+0.16953 -0.064776 -1.16
+0.17387 -0.064766 -1.1598
+0.17831 -0.064789 -1.1602
+0.18288 -0.064861 -1.1614
+0.18776 -0.065035 -1.1646
+0.19307 -0.065347 -1.1702
+0.19603 -0.0656 -1.1748
+0.19776 -0.065805 -1.1785
+0.20048 -0.066338 -1.1881
+0.2019 -0.066436 -1.1899
+0.20295 -0.066413 -1.1895
+0.20499 -0.066348 -1.1883
+0.20595 -0.066299 -1.1874
+-0.19466 -0.06824 -1.2021
+-0.1924 -0.068244 -1.2022
+-0.14063 -0.064248 -1.1312
+-0.13834 -0.064176 -1.1299
+-0.13547 -0.063829 -1.1237
+-0.13412 -0.063692 -1.1213
+-0.13297 -0.063647 -1.1205
+-0.12805 -0.063301 -1.1144
+-0.12458 -0.062613 -1.1021
+-0.12213 -0.062423 -1.0987
+-0.078609 -0.062412 -1.0987
+-0.076611 -0.062472 -1.0998
+-0.044508 -0.064009 -1.1273
+-0.029945 -0.064673 -1.1391
+-0.028021 -0.065192 -1.1484
+-0.025929 -0.065371 -1.1516
+-0.023862 -0.065654 -1.1566
+-0.022822 -0.065796 -1.1591
+-0.020023 -0.067402 -1.1878
+0.009039 -0.067274 -1.1855
+0.010157 -0.067284 -1.1857
+0.011277 -0.067307 -1.1861
+0.01588 -0.067884 -1.1964
+0.018228 -0.068239 -1.2027
+0.020497 -0.068256 -1.203
+0.027352 -0.068402 -1.2056
+0.028488 -0.068404 -1.2056
+0.029629 -0.068418 -1.2059
+0.038826 -0.068621 -1.2095
+0.039985 -0.068655 -1.2101
+0.041124 -0.068655 -1.2101
+0.042258 -0.068647 -1.2099
+0.043397 -0.068647 -1.2099
+0.044548 -0.068664 -1.2102
+0.045687 -0.068665 -1.2102
+0.047963 -0.06866 -1.2101
+0.052499 -0.068632 -1.2096
+0.081319 -0.070922 -1.2504
+0.082285 -0.070741 -1.2471
+0.083185 -0.070509 -1.243
+0.084176 -0.07036 -1.2403
+0.086285 -0.070176 -1.2371
+0.10187 -0.069684 -1.2282
+0.10302 -0.06968 -1.2282
+0.10727 -0.067272 -1.1852
+0.10934 -0.067171 -1.1834
+0.14083 -0.067303 -1.1856
+0.14262 -0.067095 -1.1819
+0.14417 -0.066781 -1.1763
+0.19491 -0.066702 -1.1747
+0.1988 -0.067269 -1.1848
+0.20102 -0.067642 -1.1914
+0.20215 -0.067642 -1.1914
+0.204 -0.067511 -1.1891
+0.20582 -0.067375 -1.1866
+-0.19462 -0.069361 -1.2019
+-0.19353 -0.069376 -1.2022
+-0.19129 -0.069382 -1.2023
+-0.18904 -0.069391 -1.2024
+-0.18679 -0.069397 -1.2025
+-0.18409 -0.06923 -1.1996
+-0.18153 -0.069119 -1.1977
+-0.17924 -0.069104 -1.1974
+-0.1748 -0.069134 -1.198
+-0.16112 -0.069075 -1.197
+-0.15622 -0.068902 -1.194
+-0.14058 -0.065292 -1.1308
+-0.13936 -0.065224 -1.1296
+-0.13664 -0.064942 -1.1247
+-0.13525 -0.064783 -1.1219
+-0.13403 -0.064702 -1.1205
+-0.13161 -0.064554 -1.1179
+-0.12914 -0.064372 -1.1147
+-0.12799 -0.064323 -1.1139
+-0.12646 -0.064082 -1.1096
+-0.12469 -0.06371 -1.1031
+-0.12328 -0.06352 -1.0998
+-0.12111 -0.063468 -1.0989
+-0.119 -0.06345 -1.0986
+-0.11053 -0.063345 -1.0968
+-0.10828 -0.063236 -1.0949
+-0.10603 -0.063125 -1.0929
+-0.1039 -0.063083 -1.0922
+-0.10185 -0.06309 -1.0924
+-0.084851 -0.062704 -1.0856
+-0.080765 -0.06271 -1.0858
+-0.079429 -0.063277 -1.0957
+-0.078602 -0.063442 -1.0986
+-0.077619 -0.063485 -1.0994
+-0.075585 -0.063518 -1.1
+-0.073553 -0.063554 -1.1006
+-0.049376 -0.064495 -1.1172
+-0.045432 -0.064875 -1.1238
+-0.044457 -0.064999 -1.126
+-0.043587 -0.065284 -1.131
+-0.041752 -0.065751 -1.1392
+-0.033158 -0.065736 -1.1389
+-0.031022 -0.065755 -1.1393
+-0.02907 -0.066199 -1.1471
+-0.026946 -0.06629 -1.1487
+-0.025885 -0.066345 -1.1496
+-0.024858 -0.066494 -1.1522
+-0.023811 -0.066602 -1.1541
+-0.021121 -0.068453 -1.1866
+-0.018883 -0.068441 -1.1864
+-0.016639 -0.068401 -1.1857
+0.001224 -0.068367 -1.1851
+0.003456 -0.068353 -1.1848
+0.005689 -0.068381 -1.1853
+0.007926 -0.06842 -1.186
+0.010167 -0.068469 -1.1869
+0.012421 -0.068574 -1.1887
+0.014695 -0.068739 -1.1916
+0.015901 -0.069102 -1.198
+0.017093 -0.069362 -1.2025
+0.01938 -0.069445 -1.204
+0.021662 -0.069493 -1.2048
+0.023964 -0.069589 -1.2065
+0.026291 -0.069736 -1.2091
+0.028613 -0.069845 -1.211
+0.030923 -0.069915 -1.2122
+0.033204 -0.069911 -1.2121
+0.03547 -0.069878 -1.2115
+0.037764 -0.069903 -1.212
+0.040053 -0.069915 -1.2122
+0.042318 -0.069885 -1.2117
+0.044582 -0.069858 -1.2112
+0.046854 -0.069845 -1.2109
+0.049127 -0.069836 -1.2108
+0.051359 -0.06977 -1.2096
+0.08143 -0.072199 -1.2521
+0.083545 -0.07199 -1.2484
+0.085393 -0.071569 -1.2411
+0.087423 -0.071319 -1.2367
+0.089506 -0.071125 -1.2333
+0.091705 -0.071029 -1.2316
+0.093952 -0.070975 -1.2306
+0.096189 -0.070916 -1.2296
+0.098461 -0.070885 -1.229
+0.10072 -0.070849 -1.2284
+0.10303 -0.070845 -1.2283
+0.10418 -0.070838 -1.2282
+0.10749 -0.068525 -1.1876
+0.10851 -0.068463 -1.1865
+0.11053 -0.068333 -1.1842
+0.11269 -0.068292 -1.1835
+0.13059 -0.068323 -1.184
+0.13283 -0.068326 -1.184
+0.13499 -0.068295 -1.1834
+0.13727 -0.06832 -1.1839
+0.13968 -0.068407 -1.1854
+0.14081 -0.068411 -1.1855
+0.14172 -0.068314 -1.1838
+0.14319 -0.067951 -1.1774
+0.14488 -0.067703 -1.173
+0.14667 -0.067512 -1.1697
+0.19044 -0.067401 -1.1675
+0.19343 -0.067677 -1.1724
+0.19713 -0.068193 -1.1814
+0.19915 -0.068507 -1.1869
+0.20071 -0.068659 -1.1895
+0.20211 -0.068752 -1.1912
+0.20309 -0.068704 -1.1903
+0.20477 -0.068516 -1.187
+-0.19351 -0.070502 -1.202
+-0.19245 -0.070528 -1.2025
+-0.18575 -0.070562 -1.2031
+-0.18459 -0.070553 -1.2029
+-0.18315 -0.070436 -1.2009
+-0.14049 -0.066318 -1.1301
+-0.13783 -0.066064 -1.1257
+-0.13507 -0.065755 -1.1204
+-0.13272 -0.065637 -1.1184
+-0.12783 -0.065293 -1.1125
+-0.12477 -0.064793 -1.1039
+-0.1222 -0.064535 -1.0994
+-0.10714 -0.064202 -1.0937
+-0.10602 -0.064154 -1.0929
+-0.10495 -0.064128 -1.0925
+-0.080105 -0.064025 -1.0908
+-0.078617 -0.064492 -1.0988
+-0.076603 -0.06454 -1.0997
+-0.044452 -0.066053 -1.1259
+-0.025878 -0.067411 -1.1493
+-0.024818 -0.067471 -1.1503
+-0.023776 -0.067589 -1.1524
+-0.020005 -0.069576 -1.1867
+0.009053 -0.069613 -1.1873
+0.010177 -0.069655 -1.188
+0.011309 -0.069738 -1.1895
+0.013571 -0.069852 -1.1914
+0.015941 -0.070408 -1.201
+0.018258 -0.070622 -1.2047
+0.019405 -0.070671 -1.2055
+0.020589 -0.070838 -1.2084
+0.02523 -0.071092 -1.2128
+0.026381 -0.071118 -1.2132
+0.027537 -0.071152 -1.2138
+0.028685 -0.071164 -1.214
+0.029831 -0.071173 -1.2142
+0.048003 -0.071 -1.2112
+0.049122 -0.07097 -1.2107
+0.050247 -0.070949 -1.2103
+0.082864 -0.073605 -1.256
+0.083932 -0.073505 -1.2543
+0.085013 -0.073419 -1.2528
+0.086658 -0.07282 -1.2425
+0.087597 -0.072628 -1.2392
+0.088573 -0.072473 -1.2365
+0.089574 -0.072341 -1.2342
+0.090653 -0.072275 -1.233
+0.10416 -0.071986 -1.228
+0.10859 -0.069635 -1.1874
+0.10962 -0.069578 -1.1864
+0.13391 -0.069424 -1.1837
+0.135 -0.069413 -1.1835
+0.13612 -0.069414 -1.1835
+0.14078 -0.069515 -1.1852
+0.14233 -0.069181 -1.1795
+0.14298 -0.068961 -1.1757
+0.14389 -0.068867 -1.174
+0.19203 -0.06868 -1.1706
+0.19357 -0.068834 -1.1732
+0.19529 -0.06905 -1.177
+0.1971 -0.069297 -1.1812
+0.19904 -0.069587 -1.1862
+0.20054 -0.069718 -1.1885
+0.20174 -0.069747 -1.189
+0.20283 -0.069739 -1.1888
+0.20365 -0.069633 -1.187
+-0.19353 -0.07164 -1.2021
+-0.19144 -0.071705 -1.2032
+-0.18699 -0.071739 -1.2038
+-0.18477 -0.071756 -1.2041
+-0.18225 -0.071658 -1.2025
+-0.17974 -0.071559 -1.2008
+-0.17729 -0.071487 -1.1996
+-0.17503 -0.071486 -1.1996
+-0.17279 -0.071495 -1.1997
+-0.16835 -0.071528 -1.2003
+-0.16392 -0.071568 -1.201
+-0.15923 -0.071495 -1.1998
+-0.15691 -0.071468 -1.1994
+-0.15431 -0.071311 -1.1967
+-0.14043 -0.067357 -1.1296
+-0.13913 -0.067239 -1.1276
+-0.13628 -0.066887 -1.1217
+-0.13375 -0.066681 -1.1182
+-0.13141 -0.066562 -1.1162
+-0.12902 -0.066413 -1.1137
+-0.1264 -0.066143 -1.1091
+-0.12341 -0.065661 -1.1009
+-0.12116 -0.06557 -1.0994
+-0.11703 -0.06558 -1.0996
+-0.11275 -0.065499 -1.0982
+-0.10828 -0.0653 -1.0948
+-0.10603 -0.06519 -1.093
+-0.10395 -0.065173 -1.0927
+-0.10004 -0.065316 -1.0952
+-0.095933 -0.065329 -1.0954
+-0.091554 -0.065152 -1.0924
+-0.087151 -0.06494 -1.0888
+-0.082743 -0.064704 -1.0848
+-0.080752 -0.064748 -1.0856
+-0.080024 -0.064988 -1.0897
+-0.079431 -0.065345 -1.0957
+-0.078612 -0.065524 -1.0988
+-0.07762 -0.06556 -1.0994
+-0.075585 -0.065593 -1.0999
+-0.071489 -0.06564 -1.1007
+-0.067397 -0.065697 -1.1017
+-0.063343 -0.065801 -1.1035
+-0.059317 -0.065949 -1.106
+-0.055317 -0.066152 -1.1095
+-0.051354 -0.066437 -1.1143
+-0.047369 -0.066741 -1.1195
+-0.045384 -0.066924 -1.1226
+-0.04351 -0.067298 -1.129
+-0.041735 -0.067871 -1.1387
+-0.039646 -0.067968 -1.1404
+-0.03531 -0.067893 -1.1391
+-0.033178 -0.067923 -1.1396
+-0.031158 -0.068201 -1.1443
+-0.029041 -0.068293 -1.1459
+-0.026919 -0.068389 -1.1475
+-0.024815 -0.068547 -1.1502
+-0.023762 -0.068635 -1.1517
+-0.021107 -0.070643 -1.1858
+-0.01887 -0.070629 -1.1856
+-0.014411 -0.07066 -1.1861
+-0.009945 -0.070672 -1.1863
+-0.005474 -0.070638 -1.1857
+-0.001008 -0.07065 -1.1859
+0.001225 -0.070654 -1.186
+0.00346 -0.070679 -1.1864
+0.0057 -0.07075 -1.1876
+0.007945 -0.070826 -1.1889
+0.010197 -0.070916 -1.1904
+0.012464 -0.071054 -1.1928
+0.013604 -0.071143 -1.1943
+0.014771 -0.071348 -1.1978
+0.017107 -0.071687 -1.2035
+0.018268 -0.071796 -1.2054
+0.019464 -0.072025 -1.2092
+0.02068 -0.072296 -1.2138
+0.021852 -0.072392 -1.2155
+0.024142 -0.072394 -1.2155
+0.026427 -0.072387 -1.2154
+0.028706 -0.072362 -1.2149
+0.030976 -0.072321 -1.2143
+0.035547 -0.072318 -1.2142
+0.040082 -0.07225 -1.213
+0.044612 -0.072189 -1.212
+0.046895 -0.072191 -1.212
+0.0492 -0.072225 -1.2126
+0.05035 -0.072236 -1.2128
+0.081903 -0.07499 -1.2595
+0.084077 -0.074816 -1.2565
+0.08625 -0.074649 -1.2536
+0.088005 -0.074139 -1.245
+0.08994 -0.073804 -1.2393
+0.091905 -0.073509 -1.2343
+0.093989 -0.073323 -1.2311
+0.096229 -0.073264 -1.2301
+0.098475 -0.073211 -1.2292
+0.10075 -0.07318 -1.2286
+0.10305 -0.073171 -1.2285
+0.10532 -0.073145 -1.228
+0.10981 -0.070822 -1.1886
+0.1108 -0.070734 -1.1871
+0.11505 -0.070602 -1.1848
+0.11945 -0.070565 -1.1842
+0.12393 -0.070575 -1.1843
+0.12843 -0.070597 -1.1847
+0.13292 -0.070607 -1.1848
+0.13506 -0.070557 -1.184
+0.13735 -0.070593 -1.1846
+0.13967 -0.070633 -1.1852
+0.14066 -0.07057 -1.1842
+0.14142 -0.070393 -1.1812
+0.14296 -0.07006 -1.1755
+0.14468 -0.069822 -1.1715
+0.14859 -0.069585 -1.1674
+0.15262 -0.069415 -1.1645
+0.15671 -0.069283 -1.1623
+0.16092 -0.069212 -1.161
+0.16519 -0.069166 -1.1602
+0.16952 -0.069148 -1.1599
+0.17388 -0.069144 -1.1598
+0.1784 -0.069201 -1.1608
+0.18301 -0.069292 -1.1623
+0.18798 -0.069508 -1.1659
+0.19068 -0.069691 -1.169
+0.19207 -0.069797 -1.1708
+-0.19261 -0.072855 -1.2035
+-0.18387 -0.072984 -1.2057
+-0.18273 -0.072983 -1.2057
+-0.18144 -0.072921 -1.2046
+-0.17895 -0.072834 -1.2032
+-0.17752 -0.07271 -1.2011
+-0.17634 -0.07269 -1.2008
+-0.17519 -0.072684 -1.2007
+-0.17405 -0.072681 -1.2007
+-0.15584 -0.072627 -1.1998
+-0.14042 -0.068414 -1.1295
+-0.13754 -0.068045 -1.1233
+-0.079956 -0.065959 -1.0887
+-0.078605 -0.066554 -1.0986
+-0.076609 -0.066619 -1.0998
+-0.040726 -0.069054 -1.1405
+-0.027958 -0.069365 -1.1457
+-0.026949 -0.069546 -1.1488
+-0.025889 -0.069606 -1.1498
+-0.02378 -0.069775 -1.1526
+-0.021092 -0.071709 -1.1849
+-0.019984 -0.071736 -1.1854
+0.002344 -0.071814 -1.1867
+0.003462 -0.071838 -1.1871
+0.004586 -0.071936 -1.1887
+0.006833 -0.072021 -1.1901
+0.013641 -0.07247 -1.1976
+0.015952 -0.072722 -1.2019
+0.018301 -0.073065 -1.2076
+0.019535 -0.073428 -1.2136
+0.020705 -0.073525 -1.2153
+0.050554 -0.073676 -1.2177
+0.081895 -0.076169 -1.2593
+0.082988 -0.076085 -1.2579
+0.085211 -0.075956 -1.2558
+0.086373 -0.075938 -1.2554
+0.087429 -0.075829 -1.2536
+0.089289 -0.075407 -1.2466
+0.091256 -0.075094 -1.2413
+0.092273 -0.074971 -1.2393
+0.093276 -0.07484 -1.2371
+0.095288 -0.074592 -1.2329
+0.096276 -0.074458 -1.2307
+0.097372 -0.074411 -1.2299
+0.098496 -0.074385 -1.2294
+0.099616 -0.074357 -1.229
+0.10987 -0.071979 -1.1892
+0.14049 -0.0716 -1.1827
+0.19207 -0.070901 -1.1708
+-0.19273 -0.074034 -1.2042
+-0.1917 -0.074077 -1.2049
+-0.18949 -0.0741 -1.2053
+-0.18725 -0.074113 -1.2055
+-0.18505 -0.07414 -1.206
+-0.18291 -0.074195 -1.2069
+-0.1807 -0.074218 -1.2073
+-0.17956 -0.074218 -1.2073
+-0.17807 -0.074073 -1.2049
+-0.1756 -0.073986 -1.2035
+-0.17323 -0.073944 -1.2028
+-0.1709 -0.073914 -1.2023
+-0.16865 -0.073922 -1.2025
+-0.16641 -0.073933 -1.2027
+-0.15732 -0.073923 -1.2025
+-0.15617 -0.07391 -1.2023
+-0.1404 -0.069471 -1.1293
+-0.13879 -0.0692 -1.1249
+-0.13607 -0.068895 -1.1199
+-0.13354 -0.068682 -1.1164
+-0.12883 -0.068412 -1.112
+-0.12648 -0.068277 -1.1098
+-0.12385 -0.067984 -1.105
+-0.12145 -0.067806 -1.102
+-0.11923 -0.067722 -1.1007
+-0.11057 -0.067505 -1.0971
+-0.10829 -0.067375 -1.095
+-0.10608 -0.067282 -1.0935
+-0.10405 -0.0673 -1.0938
+-0.10206 -0.067352 -1.0946
+-0.10003 -0.067373 -1.095
+-0.098001 -0.067397 -1.0954
+-0.095908 -0.067378 -1.0951
+-0.093779 -0.067332 -1.0943
+-0.091564 -0.06722 -1.0925
+-0.089356 -0.067109 -1.0907
+-0.080737 -0.066784 -1.0854
+-0.079888 -0.06693 -1.0878
+-0.079406 -0.067391 -1.0954
+-0.078597 -0.067583 -1.0985
+-0.077613 -0.067629 -1.0993
+-0.075583 -0.067666 -1.0999
+-0.073526 -0.067682 -1.1002
+-0.045346 -0.068984 -1.1217
+-0.043449 -0.069329 -1.1274
+-0.041692 -0.069947 -1.1375
+-0.040722 -0.070122 -1.1404
+-0.039651 -0.070128 -1.1405
+-0.037497 -0.070118 -1.1404
+-0.033223 -0.070167 -1.1412
+-0.031149 -0.07034 -1.144
+-0.02901 -0.07038 -1.1447
+-0.027995 -0.07054 -1.1473
+-0.027028 -0.070836 -1.1522
+-0.024863 -0.070852 -1.1524
+-0.02382 -0.070979 -1.1545
+-0.019972 -0.07281 -1.1847
+-0.018856 -0.07281 -1.1847
+-0.016637 -0.072862 -1.1855
+-0.007707 -0.072869 -1.1856
+-0.005474 -0.072877 -1.1858
+-0.003243 -0.072915 -1.1864
+-0.001009 -0.072926 -1.1866
+0.001228 -0.073016 -1.1881
+0.00347 -0.073113 -1.1897
+0.005718 -0.07321 -1.1913
+0.007966 -0.073255 -1.192
+0.01023 -0.073395 -1.1943
+0.012522 -0.073644 -1.1984
+0.014818 -0.073839 -1.2016
+0.017108 -0.073959 -1.2036
+0.019554 -0.074647 -1.2149
+0.021873 -0.074752 -1.2166
+0.024153 -0.074721 -1.2161
+0.02873 -0.074713 -1.216
+0.037861 -0.074661 -1.2151
+0.040109 -0.074587 -1.2139
+0.042372 -0.074547 -1.2132
+0.044656 -0.074547 -1.2132
+0.04702 -0.074674 -1.2153
+0.0494 -0.074812 -1.2176
+0.050581 -0.074863 -1.2184
+0.080689 -0.077335 -1.259
+0.08179 -0.077256 -1.2577
+0.084015 -0.077125 -1.2555
+0.086341 -0.077092 -1.255
+0.088594 -0.076997 -1.2534
+0.089659 -0.076899 -1.2518
+0.090647 -0.076738 -1.2491
+0.091587 -0.07654 -1.2459
+0.092426 -0.076265 -1.2414
+0.093563 -0.07624 -1.2409
+0.094604 -0.076137 -1.2392
+0.096663 -0.075922 -1.2357
+0.098687 -0.07569 -1.2319
+0.10077 -0.075513 -1.2289
+0.10302 -0.075469 -1.2282
+0.10531 -0.075447 -1.2278
+0.1076 -0.075435 -1.2276
+0.11007 -0.073235 -1.1914
+0.11108 -0.073158 -1.1901
+0.11317 -0.07306 -1.1885
+0.11747 -0.072947 -1.1867
+0.13515 -0.072839 -1.1848
+0.13739 -0.072846 -1.1849
+0.1395 -0.072783 -1.1838
+0.14103 -0.07242 -1.1779
+0.14272 -0.072153 -1.1735
+0.14455 -0.071965 -1.1704
+0.14649 -0.071836 -1.1682
+0.14849 -0.071737 -1.1666
+0.15054 -0.071665 -1.1654
+0.1808 -0.071473 -1.1621
+0.18311 -0.071523 -1.1629
+0.18553 -0.071608 -1.1643
+0.18816 -0.071774 -1.167
+0.19094 -0.071995 -1.1706
+-0.19181 -0.075253 -1.2056
+-0.19077 -0.075293 -1.2062
+-0.18849 -0.075288 -1.2062
+-0.17967 -0.075401 -1.208
+-0.17853 -0.075401 -1.208
+-0.17732 -0.075371 -1.2075
+-0.17492 -0.075318 -1.2067
+-0.1563 -0.075109 -1.2034
+-0.14021 -0.070439 -1.1278
+-0.13725 -0.070013 -1.1209
+-0.12523 -0.069209 -1.1079
+-0.12403 -0.069126 -1.1066
+-0.12278 -0.069011 -1.1047
+-0.1072 -0.068367 -1.0943
+-0.10612 -0.068337 -1.0939
+-0.10509 -0.068343 -1.0939
+-0.10104 -0.068393 -1.0948
+-0.10001 -0.068392 -1.0948
+-0.098978 -0.068392 -1.0948
+-0.09691 -0.068389 -1.0947
+-0.079872 -0.067942 -1.0875
+-0.078637 -0.068654 -1.0991
+-0.076611 -0.068696 -1.0998
+-0.04072 -0.071194 -1.1403
+-0.030084 -0.071448 -1.1445
+-0.02811 -0.071914 -1.152
+-0.023835 -0.072112 -1.1553
+-0.019959 -0.073877 -1.1839
+-0.004362 -0.074065 -1.1869
+-0.003244 -0.074065 -1.1869
+-0.002127 -0.07408 -1.1872
+0.00685 -0.074448 -1.1931
+0.007981 -0.074517 -1.1942
+0.009115 -0.0746 -1.1956
+0.011406 -0.074856 -1.1997
+0.013694 -0.075016 -1.2023
+0.014827 -0.075019 -1.2024
+0.015972 -0.075081 -1.2034
+0.018323 -0.07543 -1.209
+0.02073 -0.075906 -1.2167
+0.041269 -0.075762 -1.2144
+0.042386 -0.075715 -1.2136
+0.043528 -0.075715 -1.2136
+0.045897 -0.075852 -1.2158
+0.047084 -0.075921 -1.2169
+0.04824 -0.075937 -1.2172
+0.050573 -0.075999 -1.2182
+0.079481 -0.078498 -1.2586
+0.080581 -0.078415 -1.2573
+0.082795 -0.078271 -1.2549
+0.08975 -0.078157 -1.2531
+0.090909 -0.078139 -1.2528
+0.091956 -0.078027 -1.251
+0.092989 -0.077906 -1.249
+0.093878 -0.077669 -1.2451
+0.094721 -0.0774 -1.2408
+0.095879 -0.077392 -1.2406
+0.098004 -0.077226 -1.2379
+0.10011 -0.077054 -1.2351
+0.10217 -0.076853 -1.2319
+0.10314 -0.076709 -1.2296
+0.10418 -0.076625 -1.2282
+0.11046 -0.074616 -1.1956
+0.13844 -0.073928 -1.1843
+0.13927 -0.073774 -1.1818
+0.13999 -0.07357 -1.1785
+0.14349 -0.073089 -1.1707
+0.18437 -0.072682 -1.1639
+0.18561 -0.07274 -1.1648
+0.18694 -0.072828 -1.1663
+0.18961 -0.073011 -1.1692
+0.19097 -0.073108 -1.1708
+-0.1918 -0.076388 -1.2055
+-0.18975 -0.076474 -1.2069
+-0.1875 -0.076486 -1.2071
+-0.18311 -0.076553 -1.2082
+-0.18088 -0.076571 -1.2085
+-0.17865 -0.07659 -1.2088
+-0.17652 -0.076655 -1.2099
+-0.17411 -0.076598 -1.209
+-0.17142 -0.076415 -1.2061
+-0.16908 -0.076382 -1.2055
+-0.16672 -0.076344 -1.205
+-0.16437 -0.076307 -1.2044
+-0.15991 -0.07634 -1.2049
+-0.15755 -0.0763 -1.2043
+-0.15642 -0.076299 -1.2043
+-0.14007 -0.071435 -1.1267
+-0.13852 -0.071181 -1.1226
+-0.13582 -0.070879 -1.1178
+-0.13101 -0.070559 -1.1127
+-0.12637 -0.070313 -1.1088
+-0.12402 -0.070163 -1.1064
+-0.12165 -0.069997 -1.1038
+-0.11706 -0.069745 -1.0998
+-0.11284 -0.0697 -1.0991
+-0.10834 -0.069474 -1.0955
+-0.10618 -0.069408 -1.0945
+-0.10412 -0.06941 -1.0945
+-0.10204 -0.069401 -1.0944
+-0.099782 -0.069266 -1.0922
+-0.097693 -0.069246 -1.0919
+-0.095733 -0.069317 -1.0931
+-0.093718 -0.069351 -1.0936
+-0.091585 -0.069298 -1.0928
+-0.087187 -0.069078 -1.0893
+-0.082803 -0.068848 -1.0856
+-0.080748 -0.068841 -1.0855
+-0.07986 -0.068958 -1.0874
+-0.079402 -0.069454 -1.0953
+-0.078634 -0.069689 -1.0991
+-0.07764 -0.069727 -1.0997
+-0.075592 -0.069749 -1.1
+-0.071491 -0.069795 -1.1008
+-0.067395 -0.069851 -1.1017
+-0.063349 -0.069971 -1.1036
+-0.059317 -0.070122 -1.106
+-0.055327 -0.070351 -1.1097
+-0.051326 -0.070602 -1.1137
+-0.047312 -0.070877 -1.1181
+-0.0453 -0.071027 -1.1205
+-0.043348 -0.071289 -1.1247
+-0.04161 -0.07195 -1.1353
+-0.039682 -0.072335 -1.1414
+-0.037539 -0.07235 -1.1416
+-0.035355 -0.072282 -1.1406
+-0.03324 -0.072355 -1.1417
+-0.031146 -0.072488 -1.1439
+-0.030083 -0.072524 -1.1444
+-0.029128 -0.072831 -1.1493
+-0.028142 -0.073083 -1.1534
+-0.027061 -0.073099 -1.1536
+-0.024908 -0.073157 -1.1545
+-0.023837 -0.073209 -1.1554
+-0.019937 -0.074912 -1.1826
+-0.018849 -0.075012 -1.1842
+-0.016648 -0.075145 -1.1863
+-0.014419 -0.075173 -1.1867
+-0.009945 -0.075147 -1.1863
+-0.005483 -0.075228 -1.1876
+-0.003251 -0.07533 -1.1892
+-0.001012 -0.075408 -1.1905
+0.001232 -0.075499 -1.192
+0.003479 -0.075562 -1.193
+0.005732 -0.075639 -1.1942
+0.008009 -0.075914 -1.1986
+0.010304 -0.076191 -1.203
+0.012578 -0.076244 -1.2038
+0.014854 -0.076291 -1.2046
+0.01715 -0.076412 -1.2065
+0.019585 -0.077057 -1.2168
+0.021883 -0.07708 -1.2172
+0.026472 -0.077097 -1.2175
+0.031052 -0.077085 -1.2172
+0.035611 -0.077033 -1.2164
+0.040157 -0.076966 -1.2153
+0.042449 -0.076973 -1.2154
+0.044797 -0.077075 -1.2171
+0.047093 -0.077082 -1.2172
+0.049394 -0.077097 -1.2174
+0.05056 -0.077128 -1.2179
+0.078257 -0.079644 -1.258
+0.079359 -0.079562 -1.2567
+0.081585 -0.079425 -1.2545
+0.083831 -0.079316 -1.2527
+0.08615 -0.07928 -1.2522
+0.08854 -0.07931 -1.2526
+0.090893 -0.079305 -1.2525
+0.093186 -0.07925 -1.2517
+0.095246 -0.079004 -1.2477
+0.097214 -0.078696 -1.2428
+0.098207 -0.078555 -1.2405
+0.099342 -0.078528 -1.2401
+0.10154 -0.078423 -1.2384
+0.10362 -0.078229 -1.2353
+0.10541 -0.077836 -1.229
+0.1076 -0.07775 -1.2276
+0.10986 -0.077713 -1.227
+0.11091 -0.077639 -1.2259
+0.11157 -0.075732 -1.1954
+0.11347 -0.075501 -1.1917
+0.11558 -0.075415 -1.1903
+0.11772 -0.075345 -1.1892
+0.11991 -0.075314 -1.1887
+0.12428 -0.075253 -1.1877
+0.12867 -0.075201 -1.1869
+0.13298 -0.07511 -1.1854
+0.13516 -0.07508 -1.1849
+0.13734 -0.075051 -1.1844
+0.14313 -0.074009 -1.1678
+0.14421 -0.073997 -1.1676
+0.14627 -0.073927 -1.1664
+0.14836 -0.073874 -1.1656
+0.15252 -0.073759 -1.1637
+0.15669 -0.073659 -1.1621
+0.1609 -0.07358 -1.1608
+0.16522 -0.073554 -1.1604
+0.16957 -0.073546 -1.1603
+0.17402 -0.073577 -1.1607
+0.17859 -0.073658 -1.162
+0.18326 -0.073776 -1.1639
+0.18576 -0.073897 -1.1658
+0.18846 -0.074094 -1.1689
+0.18983 -0.074201 -1.1706
+-0.19088 -0.077612 -1.2069
+-0.18878 -0.077683 -1.2081
+-0.17026 -0.077539 -1.2059
+-0.16906 -0.077512 -1.2055
+-0.16791 -0.077505 -1.2053
+-0.16676 -0.077498 -1.2052
+-0.16564 -0.077503 -1.2053
+-0.15651 -0.077477 -1.205
+-0.14185 -0.072866 -1.1325
+-0.13997 -0.072442 -1.1258
+-0.1371 -0.072053 -1.1197
+-0.10061 -0.070155 -1.09
+-0.099574 -0.070151 -1.0899
+-0.09853 -0.070139 -1.0898
+-0.097472 -0.070117 -1.0894
+-0.09651 -0.070164 -1.0902
+-0.079835 -0.069962 -1.087
+-0.078644 -0.070734 -1.0992
+-0.076621 -0.07078 -1.0999
+-0.03649 -0.073478 -1.1425
+-0.035379 -0.073406 -1.1413
+-0.034311 -0.073423 -1.1416
+-0.033272 -0.073503 -1.1428
+-0.032219 -0.073558 -1.1437
+-0.031157 -0.073594 -1.1443
+-0.030197 -0.073881 -1.1488
+-0.029225 -0.074161 -1.1532
+-0.028146 -0.074182 -1.1535
+-0.023834 -0.074288 -1.1552
+-0.01996 -0.076114 -1.1839
+0.002357 -0.076727 -1.1936
+0.003484 -0.076797 -1.1947
+0.004612 -0.076847 -1.1955
+0.006891 -0.077156 -1.2003
+0.00804 -0.077341 -1.2033
+0.009185 -0.07744 -1.2048
+0.011459 -0.077476 -1.2054
+0.01373 -0.077481 -1.2054
+0.014865 -0.077481 -1.2054
+0.016011 -0.077537 -1.2063
+0.018438 -0.078196 -1.2167
+0.020745 -0.078259 -1.2177
+0.050544 -0.07825 -1.2175
+0.075933 -0.080876 -1.2587
+0.077034 -0.080787 -1.2573
+0.078137 -0.080705 -1.256
+0.084887 -0.08038 -1.2509
+0.085991 -0.080311 -1.2498
+0.087217 -0.080357 -1.2505
+0.094338 -0.080407 -1.2513
+0.095506 -0.080399 -1.2512
+0.09664 -0.080362 -1.2506
+0.097648 -0.080223 -1.2484
+0.09841 -0.079888 -1.2431
+0.10065 -0.07981 -1.2419
+0.10295 -0.079779 -1.2414
+0.10412 -0.079779 -1.2414
+0.10513 -0.079662 -1.2395
+0.1068 -0.079165 -1.2317
+0.10772 -0.078992 -1.229
+0.1088 -0.078933 -1.2281
+0.10994 -0.078921 -1.2279
+0.11094 -0.07881 -1.2261
+0.1118 -0.077016 -1.1979
+0.1127 -0.076865 -1.1955
+0.11367 -0.076761 -1.1939
+0.1147 -0.076695 -1.1928
+0.11889 -0.076502 -1.1898
+0.14272 -0.074894 -1.1644
+0.14386 -0.074915 -1.1647
+0.14499 -0.074933 -1.165
+0.14722 -0.074949 -1.1652
+0.18985 -0.07531 -1.1707
+-0.19096 -0.078781 -1.2074
+-0.19005 -0.078874 -1.2089
+-0.18775 -0.078867 -1.2087
+-0.18541 -0.078839 -1.2083
+-0.18321 -0.078874 -1.2089
+-0.18102 -0.078911 -1.2095
+-0.17669 -0.07901 -1.211
+-0.17441 -0.079015 -1.2111
+-0.17199 -0.078947 -1.2101
+-0.16959 -0.078891 -1.2092
+-0.16708 -0.078782 -1.2075
+-0.16478 -0.07877 -1.2074
+-0.1625 -0.078767 -1.2073
+-0.1602 -0.078758 -1.2072
+-0.15787 -0.078726 -1.2067
+-0.15673 -0.078726 -1.2067
+-0.14186 -0.07394 -1.1326
+-0.13988 -0.073459 -1.1251
+-0.13842 -0.073246 -1.1218
+-0.13574 -0.072943 -1.1171
+-0.13312 -0.072665 -1.1128
+-0.12395 -0.072209 -1.1058
+-0.11936 -0.071958 -1.1019
+-0.10627 -0.071534 -1.0954
+-0.10412 -0.071479 -1.0946
+-0.10162 -0.071176 -1.0899
+-0.099564 -0.071172 -1.0898
+-0.097451 -0.07113 -1.0892
+-0.095472 -0.071185 -1.09
+-0.09355 -0.071287 -1.0916
+-0.080755 -0.070895 -1.0856
+-0.079827 -0.070981 -1.0869
+-0.079385 -0.071506 -1.0951
+-0.078649 -0.071776 -1.0993
+-0.077653 -0.071813 -1.0998
+-0.075608 -0.07184 -1.1003
+-0.073556 -0.071861 -1.1006
+-0.045281 -0.073109 -1.12
+-0.043283 -0.073301 -1.123
+-0.041504 -0.073902 -1.1323
+-0.039673 -0.07447 -1.1411
+-0.037625 -0.074671 -1.1443
+-0.035488 -0.074711 -1.1449
+-0.033351 -0.074758 -1.1456
+-0.031272 -0.074949 -1.1486
+-0.030305 -0.075234 -1.153
+-0.029237 -0.07528 -1.1537
+-0.027072 -0.075302 -1.1541
+-0.024906 -0.075328 -1.1545
+-0.022765 -0.075441 -1.1562
+-0.018909 -0.077491 -1.188
+-0.016659 -0.077431 -1.1871
+-0.014423 -0.077432 -1.1871
+-0.01219 -0.077448 -1.1873
+-0.007727 -0.077545 -1.1888
+-0.005499 -0.077688 -1.1911
+-0.003262 -0.077837 -1.1934
+-0.001015 -0.077887 -1.1941
+0.001235 -0.077972 -1.1955
+0.003498 -0.078223 -1.1993
+0.005778 -0.078516 -1.2039
+0.008057 -0.078638 -1.2058
+0.010332 -0.078672 -1.2063
+0.012609 -0.078703 -1.2068
+0.014902 -0.078816 -1.2085
+0.01729 -0.079329 -1.2165
+0.018464 -0.079453 -1.2184
+0.019611 -0.079453 -1.2184
+0.021904 -0.079449 -1.2183
+0.024204 -0.079472 -1.2187
+0.033368 -0.079438 -1.2182
+0.035658 -0.079428 -1.218
+0.037941 -0.079408 -1.2177
+0.042553 -0.079457 -1.2184
+0.047103 -0.079392 -1.2174
+0.04939 -0.079383 -1.2173
+0.050528 -0.079372 -1.2171
+0.071456 -0.082362 -1.2634
+0.072569 -0.082276 -1.2621
+0.074725 -0.082035 -1.2583
+0.076907 -0.081837 -1.2552
+0.079143 -0.081705 -1.2532
+0.081435 -0.081638 -1.2522
+0.083694 -0.081543 -1.2507
+0.084799 -0.081473 -1.2496
+0.085975 -0.081473 -1.2496
+0.088312 -0.081459 -1.2494
+0.090688 -0.081481 -1.2497
+0.093113 -0.081544 -1.2507
+0.095498 -0.08157 -1.2511
+0.097854 -0.081571 -1.2511
+0.098998 -0.081543 -1.2506
+0.099842 -0.081272 -1.2464
+0.102 -0.081124 -1.2441
+0.10427 -0.081062 -1.2431
+0.10655 -0.081021 -1.2425
+0.10833 -0.080604 -1.236
+0.1093 -0.08046 -1.2338
+0.11483 -0.077907 -1.1942
+0.11588 -0.077857 -1.1934
+0.1179 -0.077708 -1.1911
+0.11896 -0.07767 -1.1905
+0.12 -0.077612 -1.1896
+0.12215 -0.077558 -1.1887
+0.12435 -0.077531 -1.1883
+0.12658 -0.077526 -1.1882
+0.12871 -0.077464 -1.1873
+0.13087 -0.077416 -1.1865
+0.13279 -0.077233 -1.1837
+0.14117 -0.075749 -1.1606
+0.1427 -0.075982 -1.1642
+0.14387 -0.076021 -1.1648
+0.14604 -0.076005 -1.1646
+0.14816 -0.07597 -1.164
+0.15036 -0.075971 -1.164
+0.17639 -0.075846 -1.1619
+0.18614 -0.076253 -1.1682
+0.18879 -0.076435 -1.171
+-0.19174 -0.080246 -1.2124
+-0.19054 -0.080223 -1.212
+-0.18919 -0.080133 -1.2107
+-0.18783 -0.080041 -1.2093
+-0.18669 -0.08004 -1.2093
+-0.18444 -0.080051 -1.2094
+-0.17341 -0.08022 -1.2121
+-0.17231 -0.080241 -1.2124
+-0.17122 -0.080264 -1.2128
+-0.17008 -0.080264 -1.2128
+-0.16888 -0.080239 -1.2124
+-0.1677 -0.080218 -1.2121
+-0.1664 -0.08014 -1.2109
+-0.16155 -0.08 -1.2088
+-0.1603 -0.079944 -1.2079
+-0.15916 -0.079944 -1.2079
+-0.15807 -0.079966 -1.2083
+-0.15692 -0.079959 -1.2082
+-0.14208 -0.075121 -1.1343
+-0.13986 -0.07451 -1.125
+-0.13705 -0.074137 -1.1193
+-0.10527 -0.072592 -1.0958
+-0.079819 -0.071999 -1.0868
+-0.078681 -0.072843 -1.0997
+-0.076643 -0.072876 -1.1002
+-0.042317 -0.074522 -1.1255
+-0.040604 -0.075277 -1.137
+-0.036654 -0.075973 -1.1477
+-0.035585 -0.075999 -1.1481
+-0.034524 -0.076045 -1.1488
+-0.03345 -0.076062 -1.149
+-0.03237 -0.076069 -1.1491
+-0.031341 -0.076199 -1.1511
+-0.030314 -0.076342 -1.1533
+-0.028158 -0.076389 -1.154
+-0.017774 -0.078541 -1.1869
+-0.01554 -0.078545 -1.187
+-0.002141 -0.079053 -1.1948
+-0.001016 -0.079089 -1.1953
+0.00011 -0.079163 -1.1964
+0.002374 -0.079548 -1.2023
+0.003512 -0.079688 -1.2045
+0.004649 -0.079741 -1.2053
+0.006925 -0.079809 -1.2063
+0.018474 -0.080644 -1.2191
+0.020769 -0.080643 -1.219
+0.050513 -0.080494 -1.2167
+0.066829 -0.083714 -1.2659
+0.067934 -0.083607 -1.2643
+0.069042 -0.083508 -1.2627
+0.070176 -0.083443 -1.2617
+0.071297 -0.083366 -1.2606
+0.07349 -0.083163 -1.2575
+0.084784 -0.082636 -1.2494
+0.087081 -0.082583 -1.2486
+0.099034 -0.082751 -1.2511
+0.10018 -0.082723 -1.2506
+0.10126 -0.082643 -1.2494
+0.10337 -0.082454 -1.2465
+0.10455 -0.082454 -1.2465
+0.10576 -0.082486 -1.247
+0.10785 -0.082291 -1.244
+0.10888 -0.082187 -1.2424
+0.10993 -0.082096 -1.241
+0.111 -0.082018 -1.2398
+0.11586 -0.07897 -1.1932
+0.11693 -0.078934 -1.1927
+0.11786 -0.078807 -1.1907
+0.14056 -0.077109 -1.1647
+0.14159 -0.077072 -1.1641
+0.14269 -0.077072 -1.1641
+0.18771 -0.077548 -1.1712
+-0.19272 -0.081804 -1.2187
+-0.19135 -0.081712 -1.2173
+-0.18829 -0.081377 -1.2122
+-0.18572 -0.081253 -1.2104
+-0.18344 -0.081253 -1.2104
+-0.17898 -0.081297 -1.2111
+-0.17457 -0.081371 -1.2122
+-0.17238 -0.081415 -1.2129
+-0.17017 -0.081449 -1.2134
+-0.16794 -0.081475 -1.2138
+-0.16576 -0.081531 -1.2147
+-0.16343 -0.081508 -1.2143
+-0.16226 -0.081494 -1.2141
+-0.1609 -0.081385 -1.2125
+-0.15851 -0.081329 -1.2116
+-0.15709 -0.081188 -1.2095
+-0.13985 -0.075563 -1.1248
+-0.1384 -0.075354 -1.1217
+-0.13569 -0.075022 -1.1167
+-0.13307 -0.074734 -1.1124
+-0.1307 -0.074581 -1.1101
+-0.12616 -0.074369 -1.1069
+-0.1216 -0.074134 -1.1034
+-0.11937 -0.074039 -1.102
+-0.11725 -0.074013 -1.1016
+-0.11296 -0.073926 -1.1003
+-0.10843 -0.073669 -1.0964
+-0.10636 -0.073662 -1.0963
+-0.10531 -0.07365 -1.0961
+-0.10401 -0.073463 -1.0933
+-0.10158 -0.0732 -1.0894
+-0.099471 -0.07316 -1.0888
+-0.095314 -0.073121 -1.0882
+-0.09138 -0.073257 -1.0903
+-0.087167 -0.073172 -1.089
+-0.082855 -0.072991 -1.0863
+-0.080801 -0.072986 -1.0862
+-0.07989 -0.073089 -1.0878
+-0.07949 -0.073668 -1.0965
+-0.078695 -0.073893 -1.0999
+-0.077684 -0.073917 -1.1003
+-0.075619 -0.073926 -1.1004
+-0.071505 -0.073962 -1.101
+-0.067421 -0.074036 -1.1021
+-0.063355 -0.074141 -1.1037
+-0.059326 -0.074305 -1.1062
+-0.055339 -0.074552 -1.1099
+-0.051334 -0.074814 -1.1139
+-0.047291 -0.075062 -1.1176
+-0.04325 -0.075361 -1.1221
+-0.042263 -0.075487 -1.124
+-0.041448 -0.075933 -1.1307
+-0.04059 -0.076323 -1.1366
+-0.039621 -0.07652 -1.1396
+-0.037711 -0.077005 -1.1469
+-0.035622 -0.077162 -1.1493
+-0.033461 -0.07717 -1.1494
+-0.031337 -0.077274 -1.151
+-0.029233 -0.077443 -1.1535
+-0.027074 -0.077486 -1.1542
+-0.02491 -0.077517 -1.1546
+-0.022759 -0.0776 -1.1559
+-0.017771 -0.079644 -1.1867
+-0.016654 -0.079647 -1.1867
+-0.014424 -0.079671 -1.1871
+-0.009962 -0.079753 -1.1883
+-0.007732 -0.079828 -1.1895
+-0.005504 -0.080015 -1.1923
+-0.003268 -0.080249 -1.1958
+-0.00102 -0.080526 -1.2
+0.00011 -0.08062 -1.2014
+0.001245 -0.080839 -1.2047
+0.00352 -0.080989 -1.207
+0.005793 -0.080996 -1.2071
+0.008069 -0.081026 -1.2075
+0.010351 -0.081095 -1.2086
+0.012645 -0.081212 -1.2103
+0.015027 -0.081772 -1.2188
+0.017336 -0.081838 -1.2197
+0.01963 -0.08183 -1.2196
+0.021926 -0.081828 -1.2196
+0.024225 -0.081836 -1.2197
+0.026521 -0.081835 -1.2197
+0.031135 -0.081892 -1.2206
+0.033489 -0.082028 -1.2226
+0.03576 -0.081958 -1.2215
+0.040317 -0.081872 -1.2202
+0.044842 -0.081744 -1.2183
+0.047105 -0.08169 -1.2175
+0.049371 -0.081646 -1.2168
+0.065561 -0.084806 -1.2644
+0.067779 -0.084605 -1.2613
+0.070009 -0.08443 -1.2587
+0.07227 -0.084304 -1.2568
+0.074486 -0.084135 -1.2542
+0.079007 -0.083922 -1.251
+0.083599 -0.083804 -1.2492
+0.085933 -0.083786 -1.249
+0.08823 -0.083735 -1.2482
+0.092889 -0.083698 -1.2476
+0.097809 -0.083889 -1.2505
+0.1002 -0.083921 -1.2509
+0.10255 -0.083912 -1.2508
+0.10388 -0.084037 -1.2527
+0.10506 -0.084038 -1.2527
+0.10727 -0.08392 -1.2509
+0.10918 -0.083582 -1.2458
+0.11147 -0.083544 -1.2452
+0.11584 -0.080078 -1.193
+0.11751 -0.079692 -1.1871
+0.13171 -0.078818 -1.1739
+0.14063 -0.078244 -1.1652
+0.14164 -0.078197 -1.1645
+0.14366 -0.078103 -1.1631
+0.14793 -0.078041 -1.1621
+0.15241 -0.07809 -1.1629
+0.15661 -0.078001 -1.1615
+0.16093 -0.077972 -1.161
+0.16526 -0.07795 -1.1607
+0.16969 -0.077977 -1.1611
+0.17423 -0.07805 -1.1621
+0.17651 -0.07809 -1.1627
+0.17888 -0.078169 -1.1639
+0.18386 -0.078422 -1.1677
+0.18662 -0.078658 -1.1713
+0.18769 -0.078642 -1.171
+-0.19281 -0.082992 -1.2192
+-0.19018 -0.082845 -1.2171
+-0.16251 -0.082769 -1.2161
+-0.16137 -0.082771 -1.2161
+-0.16023 -0.082775 -1.2161
+-0.15909 -0.082775 -1.2162
+-0.15773 -0.08266 -1.2145
+-0.13986 -0.07663 -1.1249
+-0.13723 -0.076347 -1.1207
+-0.13454 -0.076023 -1.1159
+-0.13313 -0.075818 -1.1129
+-0.1319 -0.075712 -1.1113
+-0.10532 -0.074691 -1.0962
+-0.079904 -0.074128 -1.088
+-0.078716 -0.07495 -1.1002
+-0.07665 -0.074958 -1.1003
+-0.042247 -0.076517 -1.1236
+-0.040568 -0.077355 -1.136
+-0.0367 -0.078234 -1.1491
+-0.023832 -0.078637 -1.1551
+-0.022759 -0.07869 -1.1559
+-0.017765 -0.080736 -1.1863
+-0.015538 -0.080771 -1.1868
+-0.00439 -0.081286 -1.1945
+-0.003272 -0.081476 -1.1973
+-0.002155 -0.081857 -1.203
+-0.001025 -0.082041 -1.2057
+0.00011 -0.082077 -1.2062
+0.002383 -0.082128 -1.207
+0.009217 -0.082265 -1.209
+0.010361 -0.082311 -1.2097
+0.01152 -0.082458 -1.2119
+0.025402 -0.083082 -1.2211
+0.04824 -0.082817 -1.2172
+0.049355 -0.082765 -1.2164
+0.06429 -0.085889 -1.2628
+0.10136 -0.085084 -1.2507
+0.10268 -0.085204 -1.2525
+0.10391 -0.085243 -1.2531
+0.10632 -0.085284 -1.2537
+0.11059 -0.084938 -1.2485
+0.11192 -0.085056 -1.2503
+0.13248 -0.079724 -1.1709
+0.13948 -0.079313 -1.1648
+0.14052 -0.079283 -1.1643
+0.14253 -0.079178 -1.1628
+0.17544 -0.079197 -1.1629
+0.17658 -0.079219 -1.1632
+0.17778 -0.079264 -1.1639
+0.18562 -0.079805 -1.1719
+0.18681 -0.07984 -1.1724
+-0.19401 -0.084165 -1.2196
+-0.19154 -0.084089 -1.2185
+-0.18892 -0.083943 -1.2163
+-0.18612 -0.083714 -1.213
+-0.18358 -0.083599 -1.2113
+-0.18132 -0.083608 -1.2115
+-0.17904 -0.083612 -1.2115
+-0.17677 -0.083617 -1.2116
+-0.1724 -0.083708 -1.213
+-0.16808 -0.083836 -1.2149
+-0.16371 -0.083942 -1.2164
+-0.16149 -0.083978 -1.217
+-0.15928 -0.084022 -1.2176
+-0.15811 -0.084009 -1.2175
+-0.13994 -0.077739 -1.1256
+-0.13864 -0.077603 -1.1236
+-0.13616 -0.077395 -1.1206
+-0.13347 -0.077066 -1.1158
+-0.13081 -0.076735 -1.1109
+-0.12832 -0.076502 -1.1075
+-0.12603 -0.076377 -1.1057
+-0.12382 -0.076305 -1.1047
+-0.12163 -0.076236 -1.1037
+-0.11948 -0.076188 -1.103
+-0.11744 -0.076214 -1.1034
+-0.11527 -0.076154 -1.1025
+-0.11074 -0.075899 -1.0988
+-0.10641 -0.075766 -1.0968
+-0.1053 -0.075717 -1.0961
+-0.10387 -0.075426 -1.0919
+-0.10165 -0.075308 -1.0901
+-0.099522 -0.075253 -1.0893
+-0.097292 -0.075117 -1.0874
+-0.095233 -0.07511 -1.0873
+-0.093207 -0.07513 -1.0876
+-0.089216 -0.075223 -1.0889
+-0.084987 -0.075114 -1.0874
+-0.082847 -0.075034 -1.0862
+-0.080782 -0.075017 -1.086
+-0.079714 -0.075951 -1.0997
+-0.077709 -0.076018 -1.1006
+-0.075641 -0.076024 -1.1007
+-0.073575 -0.076034 -1.1009
+-0.045275 -0.077324 -1.1199
+-0.043243 -0.077464 -1.1219
+-0.042251 -0.077584 -1.1237
+-0.041325 -0.077835 -1.1274
+-0.04055 -0.078391 -1.1355
+-0.039591 -0.078609 -1.1387
+-0.037694 -0.079133 -1.1464
+-0.036687 -0.07929 -1.1487
+-0.035616 -0.079314 -1.149
+-0.033459 -0.079333 -1.1493
+-0.029198 -0.079524 -1.1521
+-0.024908 -0.079689 -1.1546
+-0.02277 -0.079817 -1.1564
+-0.021688 -0.079847 -1.1569
+-0.01777 -0.081875 -1.1866
+-0.016662 -0.08192 -1.1873
+-0.014425 -0.081919 -1.1872
+-0.012198 -0.081976 -1.1881
+-0.009963 -0.081999 -1.1884
+-0.007731 -0.082069 -1.1894
+-0.005499 -0.082182 -1.1911
+-0.003287 -0.082978 -1.2028
+-0.002161 -0.083236 -1.2066
+-0.001026 -0.0833 -1.2075
+0.001248 -0.083311 -1.2077
+0.003523 -0.083346 -1.2082
+0.005802 -0.083407 -1.2091
+0.008092 -0.08354 -1.211
+0.010412 -0.083859 -1.2157
+0.012728 -0.084043 -1.2184
+0.015052 -0.084209 -1.2208
+0.017366 -0.084282 -1.2219
+0.019678 -0.084331 -1.2226
+0.021987 -0.084359 -1.223
+0.024293 -0.084373 -1.2232
+0.025445 -0.084373 -1.2232
+0.026593 -0.084361 -1.223
+0.028916 -0.084422 -1.2239
+0.031219 -0.084418 -1.2238
+0.033492 -0.08434 -1.2227
+0.035772 -0.084288 -1.2219
+0.03805 -0.084237 -1.2212
+0.042597 -0.084136 -1.2197
+0.04712 -0.084011 -1.2179
+0.048219 -0.083928 -1.2166
+0.064182 -0.086932 -1.2606
+0.065296 -0.086836 -1.2592
+0.067532 -0.086663 -1.2567
+0.072093 -0.086459 -1.2537
+0.085823 -0.086028 -1.2473
+0.090397 -0.085912 -1.2456
+0.092709 -0.085882 -1.2452
+0.095078 -0.085904 -1.2455
+0.09754 -0.086008 -1.247
+0.10008 -0.086172 -1.2494
+0.10266 -0.086368 -1.2523
+0.10516 -0.086484 -1.2539
+0.10751 -0.086475 -1.2538
+0.10961 -0.086266 -1.2507
+0.11076 -0.086244 -1.2504
+0.11211 -0.086382 -1.2524
+0.11334 -0.086423 -1.253
+0.13143 -0.080862 -1.1714
+0.13246 -0.080816 -1.1707
+0.13312 -0.080544 -1.1668
+0.13403 -0.080434 -1.1651
+0.13456 -0.080097 -1.1602
+0.13938 -0.080356 -1.164
+0.1414 -0.080253 -1.1625
+0.14347 -0.08019 -1.1615
+0.14558 -0.080147 -1.1609
+0.17208 -0.08026 -1.1624
+0.17436 -0.080302 -1.163
+0.17552 -0.080333 -1.1635
+0.1768 -0.080412 -1.1646
+0.17944 -0.080616 -1.1676
+0.18189 -0.080725 -1.1692
+0.18464 -0.080966 -1.1727
+0.18575 -0.080967 -1.1727
+-0.1851 -0.084913 -1.2138
+-0.18365 -0.084774 -1.2118
+-0.1825 -0.08477 -1.2117
+-0.18023 -0.084774 -1.2118
+-0.15816 -0.085185 -1.2179
+-0.14024 -0.078965 -1.128
+-0.13756 -0.078653 -1.1235
+-0.13535 -0.078599 -1.1227
+-0.13408 -0.078471 -1.1209
+-0.13302 -0.07847 -1.1209
+-0.13173 -0.078335 -1.1189
+-0.13022 -0.078059 -1.1149
+-0.12842 -0.077607 -1.1084
+-0.12726 -0.077538 -1.1074
+-0.12612 -0.077476 -1.1065
+-0.12493 -0.077387 -1.1052
+-0.12275 -0.077325 -1.1043
+-0.10531 -0.076753 -1.0962
+-0.096261 -0.076138 -1.0873
+-0.081816 -0.076051 -1.0861
+-0.080928 -0.07618 -1.0879
+-0.080531 -0.076778 -1.0966
+-0.042246 -0.078634 -1.1235
+-0.040545 -0.079451 -1.1354
+-0.038567 -0.079784 -1.1402
+-0.036682 -0.080362 -1.1485
+-0.023853 -0.080886 -1.1561
+-0.017794 -0.083107 -1.1882
+-0.015558 -0.083116 -1.1884
+-0.006619 -0.083285 -1.1908
+-0.0055 -0.083319 -1.1913
+-0.004398 -0.083704 -1.1969
+-0.003297 -0.08436 -1.2064
+-0.002163 -0.084424 -1.2073
+0.009266 -0.084997 -1.2156
+0.010426 -0.085125 -1.2174
+0.011577 -0.085159 -1.2179
+0.016248 -0.085605 -1.2244
+0.023174 -0.085645 -1.2249
+0.024332 -0.08566 -1.2251
+0.025483 -0.085653 -1.225
+0.048189 -0.08502 -1.2159
+0.062962 -0.088072 -1.26
+0.064087 -0.087989 -1.2588
+0.093854 -0.08703 -1.2448
+0.096236 -0.087064 -1.2453
+0.10639 -0.087707 -1.2545
+0.10757 -0.087707 -1.2545
+0.10867 -0.08764 -1.2536
+0.10978 -0.087582 -1.2527
+0.11096 -0.087582 -1.2527
+0.11332 -0.087587 -1.2528
+0.13331 -0.081763 -1.1685
+0.13411 -0.081581 -1.1658
+0.13511 -0.081521 -1.165
+0.1392 -0.081349 -1.1625
+0.14024 -0.081314 -1.1619
+0.14235 -0.08127 -1.1613
+0.17327 -0.081403 -1.1631
+0.17444 -0.081435 -1.1635
+0.17579 -0.081552 -1.1652
+0.17832 -0.081705 -1.1674
+0.18084 -0.08185 -1.1695
+0.18215 -0.081946 -1.1709
+0.18352 -0.082063 -1.1726
+0.18572 -0.082061 -1.1725
+-0.19385 -0.086392 -1.2185
+-0.18912 -0.086327 -1.2176
+-0.18678 -0.086306 -1.2173
+-0.18413 -0.086141 -1.215
+-0.18145 -0.085956 -1.2124
+-0.17911 -0.085927 -1.212
+-0.17688 -0.085955 -1.2124
+-0.17469 -0.086001 -1.213
+-0.17033 -0.086106 -1.2146
+-0.16595 -0.086206 -1.216
+-0.1615 -0.086278 -1.2171
+-0.15931 -0.086333 -1.2178
+-0.15819 -0.086345 -1.218
+-0.13908 -0.079975 -1.1272
+-0.13777 -0.079835 -1.1252
+-0.13671 -0.079835 -1.1252
+-0.13451 -0.079787 -1.1246
+-0.13222 -0.079682 -1.1231
+-0.12974 -0.079462 -1.1199
+-0.1283 -0.079225 -1.1166
+-0.12646 -0.078735 -1.1096
+-0.12398 -0.078485 -1.106
+-0.12185 -0.078458 -1.1056
+-0.11759 -0.0784 -1.1048
+-0.11538 -0.078313 -1.1036
+-0.11309 -0.078168 -1.1016
+-0.11072 -0.077959 -1.0986
+-0.10853 -0.077876 -1.0974
+-0.10645 -0.077871 -1.0973
+-0.10527 -0.077759 -1.0957
+-0.10385 -0.077469 -1.0916
+-0.099767 -0.077499 -1.0921
+-0.097606 -0.077418 -1.0909
+-0.096495 -0.077352 -1.09
+-0.095221 -0.077152 -1.0871
+-0.093137 -0.077124 -1.0867
+-0.091135 -0.077164 -1.0873
+-0.089123 -0.077197 -1.0878
+-0.087063 -0.077189 -1.0877
+-0.084952 -0.077134 -1.0869
+-0.082862 -0.077096 -1.0864
+-0.081856 -0.077114 -1.0866
+-0.081353 -0.077612 -1.0937
+-0.08078 -0.078054 -1.1
+-0.079822 -0.078131 -1.1011
+-0.075674 -0.078135 -1.1012
+-0.071543 -0.078158 -1.1016
+-0.067436 -0.078211 -1.1023
+-0.063373 -0.078327 -1.104
+-0.059362 -0.078527 -1.1069
+-0.055407 -0.078836 -1.1113
+-0.051437 -0.079174 -1.1161
+-0.047378 -0.079423 -1.1197
+-0.043288 -0.079664 -1.1231
+-0.041318 -0.079946 -1.1271
+-0.040519 -0.08047 -1.1346
+-0.039509 -0.08059 -1.1363
+-0.038534 -0.08079 -1.1392
+-0.037627 -0.081148 -1.1443
+-0.036677 -0.081433 -1.1484
+-0.035618 -0.081486 -1.1491
+-0.031303 -0.081525 -1.1497
+-0.029169 -0.081615 -1.151
+-0.02706 -0.081794 -1.1535
+-0.024915 -0.081888 -1.1549
+-0.023852 -0.081972 -1.1561
+-0.018914 -0.08423 -1.1883
+-0.016687 -0.084288 -1.1891
+-0.014464 -0.084383 -1.1905
+-0.009986 -0.084434 -1.1912
+-0.007744 -0.084444 -1.1913
+-0.006623 -0.084455 -1.1915
+-0.00552 -0.084753 -1.1958
+-0.004409 -0.085033 -1.1997
+-0.003297 -0.085498 -1.2064
+-0.001027 -0.085599 -1.2078
+0.003527 -0.085727 -1.2096
+0.005812 -0.085833 -1.2112
+0.008121 -0.086128 -1.2154
+0.00928 -0.086265 -1.2173
+0.010427 -0.086281 -1.2175
+0.012735 -0.086384 -1.219
+0.015093 -0.086743 -1.2241
+0.017423 -0.086869 -1.2259
+0.022031 -0.086839 -1.2255
+0.024334 -0.086823 -1.2253
+0.026631 -0.086792 -1.2248
+0.031213 -0.086706 -1.2236
+0.035775 -0.086596 -1.222
+0.040327 -0.086491 -1.2205
+0.042591 -0.086422 -1.2195
+0.044856 -0.086362 -1.2187
+0.047082 -0.086236 -1.2169
+0.061798 -0.08929 -1.2604
+0.0629 -0.089171 -1.2587
+0.06513 -0.08898 -1.256
+0.069699 -0.088777 -1.2531
+0.074207 -0.088527 -1.2495
+0.078754 -0.088351 -1.247
+0.083392 -0.088291 -1.2461
+0.088062 -0.088269 -1.2458
+0.092708 -0.088227 -1.2451
+0.093802 -0.088153 -1.2441
+0.095012 -0.08819 -1.2446
+0.097406 -0.088235 -1.2452
+0.10245 -0.088543 -1.2496
+0.10499 -0.088699 -1.2518
+0.10745 -0.08879 -1.2531
+0.1098 -0.088782 -1.253
+0.11212 -0.08875 -1.2525
+0.13409 -0.082668 -1.1657
+0.1351 -0.082614 -1.1649
+0.13605 -0.082522 -1.1636
+0.13709 -0.082487 -1.1631
+0.13806 -0.082415 -1.162
+0.13908 -0.082371 -1.1614
+0.14116 -0.082308 -1.1605
+0.14331 -0.082285 -1.1602
+0.14761 -0.082245 -1.1596
+0.15209 -0.082305 -1.1604
+0.15666 -0.082409 -1.1619
+0.16101 -0.082391 -1.1616
+0.16545 -0.082424 -1.162
+0.16996 -0.082488 -1.1629
+0.17229 -0.082554 -1.1639
+0.1748 -0.082705 -1.166
+0.1773 -0.082844 -1.168
+0.17973 -0.082949 -1.1695
+0.18224 -0.083089 -1.1715
+0.1846 -0.083157 -1.1724
+0.18554 -0.083084 -1.1714
+-0.18568 -0.087474 -1.2176
+-0.18453 -0.087473 -1.2176
+-0.18334 -0.087452 -1.2173
+-0.1804 -0.087143 -1.213
+-0.17915 -0.087087 -1.2122
+-0.178 -0.087087 -1.2122
+-0.17591 -0.087179 -1.2135
+-0.15819 -0.087496 -1.2181
+-0.1571 -0.087525 -1.2185
+-0.138 -0.081027 -1.1271
+-0.13122 -0.080779 -1.1236
+-0.13008 -0.080727 -1.1229
+-0.12879 -0.080586 -1.1209
+-0.12734 -0.080334 -1.1173
+-0.12576 -0.080001 -1.1127
+-0.12322 -0.079711 -1.1086
+-0.10522 -0.078754 -1.0952
+-0.098851 -0.078619 -1.0933
+-0.097808 -0.078609 -1.0932
+-0.096696 -0.078544 -1.0923
+-0.09547 -0.078382 -1.09
+-0.094194 -0.078176 -1.0871
+-0.09213 -0.078164 -1.0869
+-0.090081 -0.078165 -1.087
+-0.088073 -0.078201 -1.0875
+-0.083896 -0.078131 -1.0865
+-0.082872 -0.078131 -1.0865
+-0.082165 -0.078434 -1.0908
+-0.081771 -0.079047 -1.0994
+-0.080884 -0.079193 -1.1015
+-0.040512 -0.081526 -1.1344
+-0.038476 -0.08174 -1.1374
+-0.037486 -0.081919 -1.14
+-0.036639 -0.082431 -1.1472
+-0.028102 -0.082751 -1.1517
+-0.025976 -0.08289 -1.1536
+-0.024914 -0.082971 -1.1548
+-0.020028 -0.085329 -1.188
+-0.008878 -0.085688 -1.193
+-0.007763 -0.085785 -1.1944
+-0.00665 -0.085936 -1.1965
+-0.004427 -0.086529 -1.2049
+-0.002163 -0.086691 -1.2072
+0.006983 -0.087353 -1.2165
+0.008134 -0.087422 -1.2175
+0.009281 -0.087429 -1.2176
+0.011582 -0.087493 -1.2185
+0.04373 -0.087552 -1.2192
+0.061792 -0.090468 -1.2603
+0.063938 -0.09015 -1.2558
+0.093861 -0.089382 -1.2449
+0.096176 -0.089355 -1.2445
+0.10611 -0.089829 -1.2511
+0.10742 -0.089939 -1.2527
+0.1086 -0.089946 -1.2528
+0.10978 -0.089942 -1.2527
+0.11096 -0.08994 -1.2527
+0.13397 -0.083693 -1.1646
+0.1359 -0.083529 -1.1623
+0.13793 -0.083432 -1.1609
+0.1712 -0.083654 -1.1639
+0.1738 -0.083852 -1.1667
+0.18097 -0.084116 -1.1704
+0.18219 -0.084172 -1.1711
+0.18325 -0.08415 -1.1708
+0.18507 -0.083978 -1.1684
+0.18588 -0.083847 -1.1665
+0.18685 -0.083789 -1.1657
+0.18932 -0.083908 -1.1674
+-0.19151 -0.088668 -1.2183
+-0.18682 -0.088622 -1.2176
+-0.18456 -0.088638 -1.2179
+-0.18217 -0.088589 -1.2172
+-0.17951 -0.088407 -1.2147
+-0.1771 -0.088346 -1.2138
+-0.17486 -0.08837 -1.2142
+-0.1726 -0.088386 -1.2144
+-0.15932 -0.088631 -1.2179
+-0.15711 -0.088679 -1.2186
+-0.13958 -0.0824 -1.1314
+-0.13703 -0.08215 -1.1279
+-0.13481 -0.082093 -1.1271
+-0.13249 -0.081969 -1.1254
+-0.1302 -0.081866 -1.124
+-0.12772 -0.081633 -1.1208
+-0.12473 -0.081063 -1.1128
+-0.12225 -0.080811 -1.1093
+-0.11998 -0.080688 -1.1076
+-0.11773 -0.080579 -1.1061
+-0.11538 -0.080396 -1.1036
+-0.11307 -0.080231 -1.1013
+-0.11071 -0.080028 -1.0985
+-0.10855 -0.079959 -1.0976
+-0.10646 -0.079949 -1.0974
+-0.10393 -0.079596 -1.0925
+-0.10184 -0.079568 -1.0922
+-0.099871 -0.079642 -1.0932
+-0.098222 -0.079978 -1.0979
+-0.096 -0.079851 -1.0961
+-0.09468 -0.079611 -1.0928
+-0.093209 -0.079236 -1.0876
+-0.091095 -0.07918 -1.0868
+-0.090072 -0.079182 -1.0868
+-0.089045 -0.07918 -1.0868
+-0.08701 -0.079193 -1.087
+-0.08496 -0.079193 -1.087
+-0.083986 -0.079241 -1.0877
+-0.081943 -0.080252 -1.1017
+-0.079869 -0.080256 -1.1018
+-0.077793 -0.080257 -1.1018
+-0.06139 -0.080538 -1.1058
+-0.059401 -0.080667 -1.1076
+-0.057473 -0.080893 -1.1107
+-0.055617 -0.08124 -1.1155
+-0.053682 -0.081494 -1.1191
+-0.051579 -0.081505 -1.1192
+-0.049526 -0.081597 -1.1205
+-0.045405 -0.081781 -1.1231
+-0.0434 -0.081993 -1.126
+-0.041474 -0.082383 -1.1315
+-0.039442 -0.082591 -1.1344
+-0.038402 -0.082655 -1.1352
+-0.037426 -0.082862 -1.1381
+-0.036574 -0.083364 -1.1451
+-0.035638 -0.083699 -1.1498
+-0.033487 -0.083736 -1.1503
+-0.031311 -0.083714 -1.15
+-0.029156 -0.083747 -1.1504
+-0.02809 -0.083801 -1.1512
+-0.027032 -0.083882 -1.1523
+-0.024908 -0.084042 -1.1545
+-0.021142 -0.086429 -1.1877
+-0.018918 -0.086489 -1.1885
+-0.016698 -0.086582 -1.1898
+-0.012251 -0.086828 -1.1933
+-0.010024 -0.087007 -1.1958
+-0.007794 -0.087247 -1.1991
+-0.006687 -0.087548 -1.2033
+-0.005561 -0.08765 -1.2047
+-0.003296 -0.087736 -1.2059
+-0.001027 -0.087906 -1.2082
+0.001251 -0.088098 -1.2109
+0.00354 -0.088316 -1.2139
+0.005844 -0.0886 -1.2179
+0.008136 -0.088587 -1.2177
+0.010433 -0.088626 -1.2182
+0.012745 -0.08875 -1.22
+0.015119 -0.089204 -1.2263
+0.017426 -0.089193 -1.2261
+0.019731 -0.089178 -1.2259
+0.024328 -0.089107 -1.2249
+0.033504 -0.088979 -1.2231
+0.035776 -0.088901 -1.222
+0.038042 -0.088821 -1.2209
+0.040329 -0.088795 -1.2206
+0.042599 -0.088736 -1.2197
+0.043738 -0.088717 -1.2195
+0.044854 -0.088654 -1.2186
+0.060794 -0.09194 -1.2642
+0.062775 -0.09136 -1.2562
+0.065041 -0.091222 -1.2542
+0.067346 -0.091146 -1.2532
+0.090315 -0.090524 -1.2445
+0.092666 -0.090531 -1.2446
+0.095029 -0.090551 -1.2448
+0.097402 -0.090578 -1.2452
+0.099817 -0.090642 -1.2461
+0.10475 -0.090848 -1.2489
+0.10719 -0.090924 -1.25
+0.10954 -0.090925 -1.25
+0.11071 -0.090921 -1.2499
+0.13378 -0.084672 -1.163
+0.13472 -0.084571 -1.1616
+0.13674 -0.084466 -1.1601
+0.13886 -0.084424 -1.1595
+0.14093 -0.08436 -1.1586
+0.16795 -0.084773 -1.1642
+0.17038 -0.084892 -1.1659
+0.1728 -0.085 -1.1673
+0.17528 -0.085136 -1.1692
+0.1775 -0.085145 -1.1693
+0.17967 -0.085129 -1.1691
+0.18172 -0.085056 -1.1681
+0.18369 -0.084947 -1.1666
+0.18573 -0.084874 -1.1655
+0.18793 -0.084876 -1.1656
+0.19027 -0.084944 -1.1665
+0.19139 -0.084951 -1.1666
+0.19313 -0.085234 -1.1705
+-0.18343 -0.089793 -1.218
+-0.18232 -0.089812 -1.2182
+-0.18103 -0.089741 -1.2173
+-0.13824 -0.083298 -1.129
+-0.11186 -0.081145 -1.0996
+-0.11064 -0.081015 -1.0978
+-0.10959 -0.081004 -1.0977
+-0.10089 -0.080665 -1.0931
+-0.10009 -0.080853 -1.0957
+-0.099618 -0.081308 -1.1019
+-0.093986 -0.080931 -1.0967
+-0.092603 -0.080627 -1.0926
+-0.091256 -0.080348 -1.0888
+-0.089071 -0.080229 -1.0871
+-0.088046 -0.080229 -1.0871
+-0.087001 -0.08021 -1.0869
+-0.085996 -0.080228 -1.0871
+-0.085174 -0.080421 -1.0898
+-0.084422 -0.080683 -1.0934
+-0.056774 -0.082445 -1.1176
+-0.055799 -0.08256 -1.1192
+-0.054766 -0.082594 -1.1197
+-0.052667 -0.082612 -1.1199
+-0.044447 -0.083029 -1.1257
+-0.043477 -0.083203 -1.1281
+-0.042469 -0.083311 -1.1295
+-0.040448 -0.083533 -1.1326
+-0.038369 -0.083653 -1.1343
+-0.037407 -0.083892 -1.1375
+-0.036487 -0.084243 -1.1423
+-0.035619 -0.084738 -1.1491
+-0.034585 -0.084858 -1.1508
+-0.032412 -0.084845 -1.1506
+-0.028092 -0.084891 -1.1512
+-0.02597 -0.085045 -1.1534
+-0.024919 -0.085165 -1.155
+-0.02114 -0.087539 -1.1876
+-0.020034 -0.087595 -1.1883
+-0.011166 -0.088264 -1.1975
+-0.008941 -0.088559 -1.2016
+-0.007821 -0.088693 -1.2034
+-0.006694 -0.088772 -1.2045
+0.002398 -0.089493 -1.2144
+0.003548 -0.089677 -1.2169
+0.004697 -0.089725 -1.2176
+0.00699 -0.089741 -1.2178
+0.01159 -0.089847 -1.2193
+0.013959 -0.090319 -1.2257
+0.016271 -0.090344 -1.2261
+0.036918 -0.090033 -1.2218
+0.038042 -0.08997 -1.2209
+0.039178 -0.089939 -1.2205
+0.041475 -0.089937 -1.2204
+0.042608 -0.089904 -1.22
+0.056044 -0.093145 -1.2644
+0.057234 -0.093146 -1.2644
+0.05843 -0.093156 -1.2646
+0.05962 -0.093156 -1.2646
+0.06177 -0.09281 -1.2598
+0.063865 -0.09241 -1.2543
+0.10581 -0.091925 -1.2475
+0.10701 -0.091952 -1.2479
+0.10819 -0.091952 -1.2479
+0.10935 -0.091943 -1.2478
+0.13343 -0.085541 -1.1598
+0.17638 -0.086235 -1.1692
+0.17748 -0.086235 -1.1692
+0.17854 -0.086216 -1.1689
+0.18227 -0.085897 -1.1645
+0.18335 -0.085891 -1.1644
+0.18458 -0.08595 -1.1652
+0.18689 -0.086004 -1.166
+0.1914 -0.086055 -1.1666
+0.1942 -0.086325 -1.1703
+0.19547 -0.086396 -1.1713
+-0.19357 -0.090853 -1.2167
+-0.19145 -0.090937 -1.2179
+-0.18909 -0.090903 -1.2174
+-0.18456 -0.090933 -1.2179
+-0.1823 -0.090949 -1.2181
+-0.17997 -0.090929 -1.2178
+-0.17502 -0.090746 -1.2154
+-0.17271 -0.090734 -1.2152
+-0.17043 -0.09074 -1.2153
+-0.16593 -0.090781 -1.2159
+-0.16157 -0.090903 -1.2175
+-0.15718 -0.091015 -1.2191
+-0.14036 -0.085005 -1.1377
+-0.13853 -0.084538 -1.1314
+-0.13716 -0.084352 -1.1289
+-0.13265 -0.084195 -1.1268
+-0.12804 -0.083958 -1.1236
+-0.12485 -0.083241 -1.1139
+-0.12236 -0.082974 -1.1103
+-0.1177 -0.082643 -1.1058
+-0.11305 -0.082294 -1.1011
+-0.11066 -0.082059 -1.0979
+-0.10855 -0.082029 -1.0976
+-0.10637 -0.081947 -1.0964
+-0.10401 -0.081714 -1.0933
+-0.10192 -0.081697 -1.0931
+-0.101 -0.081788 -1.0943
+-0.10065 -0.082338 -1.1018
+-0.099995 -0.082659 -1.1061
+-0.098953 -0.08266 -1.1061
+-0.096829 -0.082627 -1.1057
+-0.095751 -0.082596 -1.1053
+-0.093484 -0.082434 -1.1031
+-0.089763 -0.081886 -1.0957
+-0.087591 -0.081786 -1.0943
+-0.086614 -0.081838 -1.095
+-0.086013 -0.082251 -1.1006
+-0.084079 -0.082389 -1.1025
+-0.079925 -0.082392 -1.1026
+-0.07576 -0.082383 -1.1025
+-0.071605 -0.082386 -1.1025
+-0.067497 -0.082445 -1.1033
+-0.063448 -0.08259 -1.1053
+-0.061434 -0.082683 -1.1066
+-0.059535 -0.082943 -1.1101
+-0.057919 -0.083633 -1.1194
+-0.055856 -0.083703 -1.1204
+-0.053737 -0.08369 -1.1202
+-0.05166 -0.083747 -1.121
+-0.047517 -0.083893 -1.123
+-0.045465 -0.084011 -1.1246
+-0.043472 -0.084256 -1.1279
+-0.041456 -0.08448 -1.131
+-0.039391 -0.084623 -1.1329
+-0.037309 -0.084742 -1.1345
+-0.036392 -0.085097 -1.1393
+-0.035526 -0.085598 -1.1461
+-0.03458 -0.085931 -1.1506
+-0.033516 -0.085982 -1.1513
+-0.031346 -0.085978 -1.1513
+-0.029173 -0.085967 -1.1511
+-0.027042 -0.086088 -1.1528
+-0.025966 -0.08612 -1.1532
+-0.024935 -0.08631 -1.1558
+-0.023896 -0.086492 -1.1582
+-0.022225 -0.088527 -1.1858
+-0.021143 -0.088671 -1.1878
+-0.01893 -0.088786 -1.1893
+-0.016695 -0.088813 -1.1897
+-0.014486 -0.089005 -1.1923
+-0.012306 -0.089479 -1.1987
+-0.011206 -0.089708 -1.2018
+-0.010085 -0.089802 -1.2031
+-0.007827 -0.089896 -1.2044
+-0.00556 -0.089911 -1.2046
+-0.003294 -0.089963 -1.2053
+-0.001028 -0.090281 -1.2096
+0.001255 -0.090689 -1.2151
+0.003548 -0.09082 -1.2169
+0.005843 -0.090876 -1.2176
+0.008138 -0.090897 -1.2179
+0.010435 -0.090933 -1.2184
+0.011596 -0.091041 -1.2199
+0.012779 -0.091288 -1.2232
+0.013959 -0.09148 -1.2258
+0.015115 -0.091489 -1.2259
+0.017425 -0.0915 -1.2261
+0.022025 -0.09143 -1.2251
+0.026617 -0.091359 -1.2241
+0.031202 -0.091285 -1.2231
+0.035789 -0.091237 -1.2225
+0.038075 -0.0912 -1.222
+0.040364 -0.091172 -1.2216
+0.042682 -0.091211 -1.2221
+0.052382 -0.09417 -1.2622
+0.053529 -0.094099 -1.2612
+0.054716 -0.094099 -1.2612
+0.055911 -0.094113 -1.2614
+0.058313 -0.094157 -1.262
+0.05955 -0.094236 -1.2631
+0.060704 -0.094181 -1.2623
+0.061844 -0.094109 -1.2613
+0.062777 -0.093729 -1.2562
+0.064986 -0.093506 -1.2532
+0.069525 -0.093265 -1.2499
+0.074012 -0.092991 -1.2462
+0.078549 -0.092807 -1.2437
+0.083186 -0.092756 -1.243
+0.087875 -0.092765 -1.2431
+0.092584 -0.092795 -1.2434
+0.0974 -0.092922 -1.2452
+0.10223 -0.093046 -1.2468
+0.10451 -0.092993 -1.2461
+0.10662 -0.092786 -1.2433
+0.13206 -0.086456 -1.1574
+0.13323 -0.086508 -1.1581
+0.13433 -0.086508 -1.1581
+0.13649 -0.086496 -1.158
+0.1386 -0.086454 -1.1574
+0.14288 -0.086402 -1.1566
+0.14725 -0.086407 -1.1567
+0.15182 -0.08653 -1.1583
+0.15671 -0.086817 -1.1622
+0.16134 -0.086951 -1.164
+0.166 -0.087098 -1.166
+0.17092 -0.087363 -1.1695
+0.17524 -0.087322 -1.169
+0.17715 -0.087177 -1.167
+0.17913 -0.087071 -1.1655
+0.18107 -0.086945 -1.1638
+0.18334 -0.086983 -1.1643
+0.18567 -0.087048 -1.1652
+0.18807 -0.087143 -1.1665
+0.19027 -0.087141 -1.1665
+0.1926 -0.087201 -1.1673
+0.19517 -0.087365 -1.1695
+0.19644 -0.087444 -1.1705
+-0.19243 -0.092006 -1.2168
+-0.19027 -0.09207 -1.2177
+-0.17165 -0.091922 -1.2158
+-0.15606 -0.092182 -1.2193
+-0.14059 -0.086218 -1.1396
+-0.13884 -0.085801 -1.134
+-0.10961 -0.083085 -1.0978
+-0.10301 -0.082775 -1.0937
+-0.10203 -0.082811 -1.0942
+-0.1013 -0.083064 -1.0976
+-0.10103 -0.083693 -1.106
+-0.10002 -0.083723 -1.1064
+-0.09792 -0.083712 -1.1062
+-0.095781 -0.083665 -1.1056
+-0.094733 -0.08366 -1.1056
+-0.093681 -0.083651 -1.1055
+-0.092577 -0.083595 -1.1047
+-0.089338 -0.083487 -1.1033
+-0.08828 -0.08347 -1.103
+-0.08732 -0.083547 -1.1041
+-0.086213 -0.083483 -1.1032
+-0.085187 -0.083496 -1.1034
+-0.060495 -0.083871 -1.1085
+-0.036306 -0.085967 -1.1366
+-0.034555 -0.086952 -1.1498
+-0.033523 -0.087083 -1.1515
+-0.032468 -0.087164 -1.1526
+-0.028124 -0.087162 -1.1526
+-0.027052 -0.087205 -1.1532
+-0.02602 -0.087387 -1.1556
+-0.023912 -0.087641 -1.159
+-0.021168 -0.089896 -1.1892
+-0.020063 -0.089964 -1.1901
+-0.015606 -0.090114 -1.1921
+-0.01451 -0.090275 -1.1942
+-0.013446 -0.090684 -1.1997
+-0.012353 -0.090953 -1.2033
+-0.011222 -0.090975 -1.2036
+-0.002162 -0.091206 -1.2067
+0.000111 -0.091819 -1.2149
+0.001257 -0.091959 -1.2168
+0.002403 -0.09197 -1.2169
+0.011618 -0.092367 -1.2222
+0.013957 -0.092622 -1.2256
+0.016268 -0.092638 -1.2258
+0.039225 -0.092349 -1.222
+0.04039 -0.092383 -1.2224
+0.041635 -0.092593 -1.2252
+0.048836 -0.095395 -1.2627
+0.049983 -0.095315 -1.2616
+0.051127 -0.095234 -1.2605
+0.052275 -0.095165 -1.2596
+0.05337 -0.095004 -1.2574
+0.054563 -0.09502 -1.2576
+0.059478 -0.095309 -1.2615
+0.061832 -0.095279 -1.2611
+0.06385 -0.09475 -1.254
+0.10329 -0.094121 -1.2455
+0.10534 -0.093854 -1.2419
+0.10611 -0.093509 -1.2373
+0.10727 -0.093506 -1.2372
+0.11458 -0.086694 -1.1461
+0.13422 -0.087529 -1.1572
+0.13531 -0.087529 -1.1572
+0.13746 -0.087509 -1.1569
+0.19615 -0.088417 -1.1688
+0.19747 -0.088511 -1.17
+-0.19235 -0.093113 -1.2163
+-0.1914 -0.093209 -1.2176
+-0.18911 -0.093208 -1.2176
+-0.18677 -0.093184 -1.2173
+-0.18229 -0.093242 -1.218
+-0.17797 -0.093382 -1.2199
+-0.17571 -0.0934 -1.2202
+-0.17303 -0.093198 -1.2175
+-0.1717 -0.093098 -1.2162
+-0.17056 -0.093098 -1.2162
+-0.16834 -0.093137 -1.2167
+-0.15949 -0.093326 -1.2192
+-0.15724 -0.093351 -1.2196
+-0.15612 -0.093367 -1.2198
+-0.13914 -0.08706 -1.1365
+-0.13737 -0.086615 -1.1307
+-0.13507 -0.086507 -1.1292
+-0.13066 -0.086407 -1.1279
+-0.12815 -0.086152 -1.1246
+-0.12474 -0.08527 -1.1129
+-0.12229 -0.085026 -1.1097
+-0.12004 -0.084909 -1.1082
+-0.11536 -0.084543 -1.1034
+-0.11305 -0.08437 -1.1011
+-0.11073 -0.084188 -1.0987
+-0.10963 -0.084142 -1.0981
+-0.10857 -0.08412 -1.0978
+-0.10642 -0.084052 -1.0969
+-0.10417 -0.083912 -1.0951
+-0.10311 -0.083885 -1.0947
+-0.10233 -0.08409 -1.0974
+-0.10198 -0.084659 -1.1049
+-0.10116 -0.084847 -1.1074
+-0.099053 -0.084832 -1.1073
+-0.096888 -0.084765 -1.1064
+-0.09477 -0.084736 -1.106
+-0.092638 -0.084692 -1.1054
+-0.091583 -0.08468 -1.1053
+-0.090533 -0.084673 -1.1052
+-0.088418 -0.084643 -1.1048
+-0.086289 -0.084598 -1.1042
+-0.084203 -0.084593 -1.1042
+-0.082087 -0.084558 -1.1037
+-0.061532 -0.084906 -1.1083
+-0.060616 -0.085087 -1.1107
+-0.059989 -0.085686 -1.1187
+-0.058016 -0.085886 -1.1213
+-0.055875 -0.085845 -1.1208
+-0.053773 -0.08586 -1.121
+-0.045456 -0.086114 -1.1244
+-0.041382 -0.086458 -1.1289
+-0.037253 -0.086751 -1.1328
+-0.036207 -0.086801 -1.1334
+-0.032486 -0.088298 -1.1532
+-0.03144 -0.088412 -1.1547
+-0.029277 -0.088452 -1.1553
+-0.027118 -0.088509 -1.156
+-0.025 -0.088721 -1.1588
+-0.023956 -0.088898 -1.1612
+-0.022944 -0.089215 -1.1653
+-0.02118 -0.091071 -1.1899
+-0.020097 -0.09124 -1.1921
+-0.018975 -0.091241 -1.1921
+-0.016742 -0.09131 -1.193
+-0.015632 -0.091386 -1.194
+-0.014573 -0.091799 -1.1995
+-0.0135 -0.092185 -1.2046
+-0.012372 -0.092228 -1.2052
+-0.0101 -0.092206 -1.2049
+-0.00783 -0.092192 -1.2047
+-0.003297 -0.09232 -1.2064
+-0.002163 -0.092376 -1.2071
+-0.00103 -0.092718 -1.2116
+0.000111 -0.093029 -1.2157
+0.001257 -0.0931 -1.2167
+0.003551 -0.093174 -1.2177
+0.005845 -0.093196 -1.218
+0.008137 -0.09319 -1.2179
+0.010462 -0.093472 -1.2216
+0.012804 -0.093775 -1.2256
+0.015115 -0.093799 -1.2259
+0.017422 -0.093795 -1.2259
+0.01973 -0.093794 -1.2259
+0.028916 -0.093646 -1.2239
+0.031214 -0.093626 -1.2236
+0.0335 -0.093577 -1.223
+0.035794 -0.093553 -1.2226
+0.038104 -0.093574 -1.2229
+0.039277 -0.093626 -1.2236
+0.040534 -0.093868 -1.2268
+0.043005 -0.094221 -1.2315
+0.048738 -0.096389 -1.2601
+0.051014 -0.096208 -1.2577
+0.053332 -0.09612 -1.2565
+0.055736 -0.096186 -1.2574
+0.058196 -0.096341 -1.2594
+0.060646 -0.096467 -1.2611
+0.062952 -0.096363 -1.2597
+0.064983 -0.095861 -1.2531
+0.067244 -0.095722 -1.2512
+0.069465 -0.095538 -1.2488
+0.071682 -0.095359 -1.2464
+0.099768 -0.095291 -1.2454
+0.1021 -0.095273 -1.2452
+0.10324 -0.095246 -1.2448
+0.10415 -0.095007 -1.2417
+0.10493 -0.094658 -1.2371
+0.10609 -0.094659 -1.2371
+0.10711 -0.094523 -1.2353
+0.11329 -0.087614 -1.144
+0.11525 -0.087469 -1.142
+0.11626 -0.087416 -1.1413
+0.11922 -0.087224 -1.1388
+0.11989 -0.086929 -1.1349
+0.12086 -0.086854 -1.1339
+0.13517 -0.088528 -1.1559
+0.13631 -0.088566 -1.1564
+0.13848 -0.088556 -1.1563
+0.14059 -0.088515 -1.1558
+0.14274 -0.088497 -1.1555
+0.14489 -0.088477 -1.1552
+0.14715 -0.088529 -1.1559
+0.14951 -0.088637 -1.1573
+0.15923 -0.089196 -1.1647
+0.1616 -0.089294 -1.1659
+0.16402 -0.089415 -1.1675
+0.1665 -0.089563 -1.1695
+0.16873 -0.089577 -1.1696
+0.17086 -0.089541 -1.1692
+0.17277 -0.089385 -1.1671
+0.17653 -0.089066 -1.1629
+0.17875 -0.08908 -1.163
+0.18103 -0.089124 -1.1636
+0.18324 -0.089128 -1.1637
+0.18552 -0.089171 -1.1642
+0.18991 -0.089172 -1.1642
+0.19459 -0.089309 -1.166
+0.1972 -0.089492 -1.1684
+0.19852 -0.089592 -1.1697
+-0.19226 -0.094214 -1.2157
+-0.19024 -0.094351 -1.2175
+-0.1721 -0.094463 -1.219
+-0.15613 -0.094526 -1.2199
+-0.13916 -0.088143 -1.1367
+-0.12959 -0.087468 -1.1279
+-0.12633 -0.086687 -1.1177
+-0.12349 -0.086175 -1.1111
+-0.10967 -0.085208 -1.0985
+-0.10347 -0.085217 -1.0986
+-0.10224 -0.085922 -1.1078
+-0.091584 -0.085725 -1.1053
+-0.089491 -0.085716 -1.1052
+-0.060776 -0.086362 -1.1137
+-0.059072 -0.086944 -1.1213
+-0.056958 -0.086943 -1.1213
+-0.036183 -0.087812 -1.1327
+-0.031449 -0.089527 -1.1551
+-0.03043 -0.089732 -1.1578
+-0.028266 -0.089785 -1.1584
+-0.023974 -0.090058 -1.162
+-0.02294 -0.090299 -1.1652
+-0.020109 -0.092417 -1.1928
+-0.017891 -0.092564 -1.1947
+-0.016788 -0.092685 -1.1963
+-0.015726 -0.093067 -1.2013
+-0.014636 -0.09333 -1.2047
+-0.013509 -0.093384 -1.2054
+-0.011242 -0.093406 -1.2057
+-0.002165 -0.093626 -1.2086
+0.000111 -0.094252 -1.2168
+0.002404 -0.09432 -1.2177
+0.032361 -0.094763 -1.2234
+0.033507 -0.094749 -1.2232
+0.034664 -0.094764 -1.2234
+0.035821 -0.094778 -1.2236
+0.036999 -0.094844 -1.2245
+0.039447 -0.095189 -1.229
+0.040646 -0.095287 -1.2302
+0.041838 -0.095364 -1.2312
+0.04431 -0.095696 -1.2356
+0.04603 -0.096868 -1.2509
+0.047427 -0.097319 -1.2567
+0.048627 -0.097354 -1.2572
+0.049797 -0.097327 -1.2568
+0.064034 -0.097391 -1.2577
+0.10317 -0.096359 -1.2441
+0.10503 -0.095919 -1.2383
+0.10584 -0.095594 -1.2341
+0.10664 -0.095275 -1.2299
+0.11113 -0.088687 -1.1439
+0.11203 -0.08855 -1.1421
+0.11398 -0.08839 -1.14
+0.11591 -0.088228 -1.1379
+0.11674 -0.088045 -1.1355
+0.11774 -0.087988 -1.1347
+0.11881 -0.087988 -1.1347
+0.11969 -0.087854 -1.133
+0.12191 -0.087912 -1.1337
+0.13736 -0.089625 -1.156
+0.14374 -0.089529 -1.1547
+0.1448 -0.089515 -1.1546
+0.14595 -0.089552 -1.155
+0.19827 -0.09058 -1.1682
+-0.19113 -0.095369 -1.2158
+-0.1891 -0.0955 -1.2175
+-0.18684 -0.095518 -1.2178
+-0.18454 -0.095515 -1.2177
+-0.18017 -0.095627 -1.2192
+-0.17582 -0.095761 -1.2209
+-0.17364 -0.095824 -1.2218
+-0.17117 -0.095734 -1.2206
+-0.16873 -0.095655 -1.2196
+-0.1664 -0.095633 -1.2193
+-0.16187 -0.095673 -1.2199
+-0.15736 -0.095723 -1.2205
+-0.15626 -0.095755 -1.2209
+-0.13762 -0.088909 -1.1327
+-0.13514 -0.088687 -1.1299
+-0.13291 -0.08862 -1.129
+-0.13073 -0.08858 -1.1285
+-0.12958 -0.088524 -1.1278
+-0.12823 -0.088323 -1.1252
+-0.12631 -0.08773 -1.1176
+-0.12474 -0.087367 -1.1129
+-0.12231 -0.087128 -1.1098
+-0.11772 -0.08683 -1.106
+-0.11305 -0.086451 -1.1011
+-0.11081 -0.086325 -1.0995
+-0.10871 -0.086302 -1.0992
+-0.10466 -0.086377 -1.1002
+-0.10384 -0.086564 -1.1026
+-0.10326 -0.08695 -1.1076
+-0.10133 -0.087087 -1.1094
+-0.096952 -0.086909 -1.1071
+-0.092673 -0.086811 -1.1059
+-0.090547 -0.086772 -1.1054
+-0.088441 -0.08675 -1.1051
+-0.084225 -0.086699 -1.1044
+-0.080075 -0.086715 -1.1047
+-0.075923 -0.086729 -1.1048
+-0.071776 -0.086752 -1.1052
+-0.067683 -0.086846 -1.1064
+-0.063616 -0.086989 -1.1082
+-0.061665 -0.087184 -1.1108
+-0.060025 -0.087849 -1.1193
+-0.059072 -0.088 -1.1213
+-0.058023 -0.088013 -1.1215
+-0.055935 -0.088053 -1.122
+-0.051693 -0.08803 -1.1217
+-0.047522 -0.088136 -1.1231
+-0.043376 -0.088314 -1.1254
+-0.039254 -0.088586 -1.1289
+-0.037182 -0.088718 -1.1306
+-0.036128 -0.088745 -1.1309
+-0.031516 -0.09081 -1.1576
+-0.030495 -0.091016 -1.1602
+-0.029418 -0.091066 -1.1609
+-0.027254 -0.091142 -1.1619
+-0.025085 -0.091214 -1.1628
+-0.02298 -0.091557 -1.1672
+-0.021228 -0.093525 -1.1926
+-0.019056 -0.093887 -1.1973
+-0.017963 -0.094068 -1.1996
+-0.016891 -0.094391 -1.2038
+-0.014654 -0.094584 -1.2062
+-0.012387 -0.094614 -1.2066
+-0.010112 -0.09459 -1.2063
+-0.005572 -0.094649 -1.2071
+-0.003303 -0.094748 -1.2084
+-0.001034 -0.095342 -1.216
+0.001258 -0.095466 -1.2176
+0.003552 -0.095519 -1.2183
+0.008161 -0.095756 -1.2214
+0.010492 -0.096048 -1.2251
+0.012814 -0.09616 -1.2266
+0.015122 -0.096154 -1.2265
+0.017429 -0.096142 -1.2263
+0.022039 -0.096108 -1.2259
+0.026641 -0.096057 -1.2252
+0.028929 -0.095995 -1.2244
+0.031215 -0.095934 -1.2236
+0.033555 -0.096039 -1.225
+0.035915 -0.096181 -1.2268
+0.038325 -0.096434 -1.2301
+0.040666 -0.096492 -1.2308
+0.043019 -0.096574 -1.2319
+0.044314 -0.096869 -1.2357
+0.045984 -0.097949 -1.2496
+0.047399 -0.098446 -1.256
+0.048599 -0.098481 -1.2565
+0.050909 -0.098375 -1.2551
+0.053238 -0.098314 -1.2543
+0.055673 -0.098444 -1.256
+0.060592 -0.098754 -1.26
+0.062995 -0.098804 -1.2606
+0.06417 -0.098786 -1.2604
+0.065185 -0.098527 -1.257
+0.06723 -0.098059 -1.251
+0.06943 -0.09784 -1.2481
+0.073857 -0.097481 -1.2435
+0.078418 -0.09733 -1.2415
+0.083052 -0.097282 -1.2409
+0.087727 -0.097285 -1.2409
+0.092437 -0.097325 -1.2414
+0.097249 -0.097462 -1.2432
+0.102 -0.097528 -1.244
+0.10308 -0.09744 -1.2429
+0.10401 -0.09722 -1.24
+0.10586 -0.096775 -1.2343
+0.10795 -0.096569 -1.2316
+0.10811 -0.09568 -1.2202
+0.10906 -0.095509 -1.218
+0.11076 -0.089469 -1.1401
+0.11274 -0.089333 -1.1383
+0.11469 -0.08918 -1.1363
+0.11663 -0.089028 -1.1343
+0.11861 -0.08891 -1.1328
+0.12072 -0.088894 -1.1326
+0.12295 -0.088959 -1.1334
+0.12735 -0.089049 -1.1346
+0.13839 -0.090681 -1.1556
+0.14049 -0.090628 -1.1549
+0.14261 -0.090591 -1.1544
+0.14478 -0.090587 -1.1543
+0.14712 -0.090692 -1.1557
+0.15177 -0.090867 -1.1579
+0.15656 -0.091113 -1.1611
+0.15947 -0.09153 -1.1664
+0.16215 -0.0918 -1.1699
+0.16654 -0.091789 -1.1697
+0.16863 -0.091729 -1.169
+0.17041 -0.091499 -1.166
+0.17428 -0.091228 -1.1625
+0.17872 -0.091255 -1.1628
+0.18308 -0.091247 -1.1627
+0.18742 -0.091227 -1.1624
+0.19187 -0.091256 -1.1628
+0.19669 -0.09146 -1.1654
+0.19936 -0.091677 -1.1682
+-0.18997 -0.096506 -1.2157
+-0.15629 -0.096921 -1.2211
+-0.12964 -0.089632 -1.1284
+-0.12633 -0.088796 -1.1177
+-0.12344 -0.088235 -1.1106
+-0.10409 -0.087814 -1.1053
+-0.10248 -0.088222 -1.1105
+-0.060826 -0.088535 -1.1146
+-0.060017 -0.088893 -1.1192
+-0.059039 -0.089008 -1.1207
+-0.056985 -0.0891 -1.1218
+-0.03611 -0.089767 -1.1304
+-0.035057 -0.089799 -1.1308
+-0.030507 -0.092147 -1.1607
+-0.028377 -0.09233 -1.163
+-0.024057 -0.092568 -1.1661
+-0.020197 -0.095081 -1.1981
+-0.018039 -0.095602 -1.2047
+-0.016922 -0.0957 -1.206
+-0.015788 -0.095706 -1.2061
+-0.002176 -0.096387 -1.2147
+0.027792 -0.097204 -1.2251
+0.028943 -0.097194 -1.225
+0.030098 -0.0972 -1.2251
+0.034824 -0.097517 -1.2291
+0.035998 -0.097564 -1.2297
+0.037169 -0.097598 -1.2301
+0.039495 -0.097621 -1.2304
+0.044316 -0.098037 -1.2357
+0.04739 -0.099609 -1.2558
+0.049739 -0.099579 -1.2554
+0.064233 -0.10007 -1.2616
+0.10298 -0.09852 -1.2417
+0.10373 -0.098127 -1.2367
+0.1049 -0.098127 -1.2367
+0.10707 -0.097982 -1.2349
+0.10816 -0.097921 -1.2341
+0.10842 -0.097111 -1.2237
+0.10945 -0.090348 -1.1376
+0.11045 -0.09029 -1.1368
+0.11152 -0.090291 -1.1368
+0.11349 -0.090149 -1.135
+0.12381 -0.08988 -1.1315
+0.12489 -0.089887 -1.1316
+0.12599 -0.089912 -1.1319
+0.12709 -0.089935 -1.1322
+0.13811 -0.091584 -1.1532
+0.1393 -0.091649 -1.154
+0.14147 -0.091648 -1.154
+0.15789 -0.092348 -1.1628
+0.15958 -0.092691 -1.1672
+0.16102 -0.092888 -1.1697
+-0.18978 -0.097556 -1.2145
+-0.18883 -0.097653 -1.2157
+-0.18681 -0.097793 -1.2175
+-0.18455 -0.097813 -1.2177
+-0.18231 -0.097841 -1.2181
+-0.17359 -0.098103 -1.2215
+-0.17143 -0.098181 -1.2224
+-0.16923 -0.098241 -1.2232
+-0.16683 -0.098184 -1.2225
+-0.16446 -0.098146 -1.222
+-0.15979 -0.098107 -1.2216
+-0.15746 -0.098089 -1.2213
+-0.15516 -0.098089 -1.2214
+-0.13799 -0.091292 -1.1358
+-0.13519 -0.090852 -1.1303
+-0.13297 -0.090785 -1.1295
+-0.13075 -0.090725 -1.1287
+-0.12828 -0.090486 -1.1257
+-0.12635 -0.089863 -1.1179
+-0.1248 -0.089507 -1.1134
+-0.12224 -0.089174 -1.1092
+-0.11992 -0.089008 -1.1071
+-0.1109 -0.088469 -1.1004
+-0.10681 -0.088516 -1.101
+-0.10489 -0.088646 -1.1026
+-0.10365 -0.089372 -1.1118
+-0.10146 -0.089294 -1.1108
+-0.099242 -0.08918 -1.1094
+-0.090589 -0.088899 -1.1059
+-0.082221 -0.088868 -1.1055
+-0.080163 -0.088896 -1.1059
+-0.078098 -0.088919 -1.1062
+-0.076096 -0.089016 -1.1074
+-0.074066 -0.089086 -1.1083
+-0.071985 -0.089096 -1.1084
+-0.069919 -0.089126 -1.1088
+-0.065747 -0.089137 -1.1089
+-0.061705 -0.089339 -1.1115
+-0.059914 -0.089794 -1.1172
+-0.059011 -0.090022 -1.1201
+-0.057999 -0.090091 -1.121
+-0.055946 -0.090186 -1.1222
+-0.053831 -0.090187 -1.1222
+-0.037103 -0.090658 -1.1282
+-0.035043 -0.090828 -1.1303
+-0.029468 -0.093412 -1.1628
+-0.027315 -0.093543 -1.1645
+-0.025151 -0.093653 -1.1659
+-0.024062 -0.09369 -1.1664
+-0.021337 -0.096261 -1.1987
+-0.020284 -0.096624 -1.2033
+-0.01918 -0.096769 -1.2051
+-0.016928 -0.09687 -1.2064
+-0.014656 -0.096872 -1.2064
+-0.012387 -0.096888 -1.2066
+-0.010117 -0.096914 -1.207
+-0.007848 -0.096955 -1.2075
+-0.005586 -0.097167 -1.2102
+-0.003324 -0.097651 -1.2162
+-0.001035 -0.09779 -1.218
+0.001259 -0.097866 -1.219
+0.005866 -0.098149 -1.2225
+0.008175 -0.098228 -1.2235
+0.01049 -0.098339 -1.2249
+0.012819 -0.098514 -1.2271
+0.015136 -0.098555 -1.2276
+0.017442 -0.098524 -1.2272
+0.019746 -0.098493 -1.2268
+0.022051 -0.098469 -1.2265
+0.024354 -0.098445 -1.2262
+0.026651 -0.098402 -1.2257
+0.028973 -0.098452 -1.2263
+0.031311 -0.098543 -1.2274
+0.033677 -0.098704 -1.2295
+0.036004 -0.098738 -1.2299
+0.038329 -0.098762 -1.2302
+0.040655 -0.098786 -1.2305
+0.043014 -0.098882 -1.2317
+0.044322 -0.099215 -1.2359
+0.045996 -0.10033 -1.2499
+0.047381 -0.10077 -1.2555
+0.048563 -0.10077 -1.2555
+0.050882 -0.10069 -1.2544
+0.053258 -0.10071 -1.2547
+0.063023 -0.10122 -1.2611
+0.065397 -0.10122 -1.2611
+0.067509 -0.10083 -1.2562
+0.069507 -0.1003 -1.2495
+0.071586 -0.099921 -1.2447
+0.073813 -0.099764 -1.2427
+0.076095 -0.099688 -1.2418
+0.078388 -0.099632 -1.2411
+0.080678 -0.099574 -1.2403
+0.099587 -0.099802 -1.2431
+0.10196 -0.09983 -1.2435
+0.10371 -0.099269 -1.2364
+0.1059 -0.099139 -1.2348
+0.10814 -0.099065 -1.2338
+0.1092 -0.098969 -1.2326
+0.10971 -0.098385 -1.2253
+0.10934 -0.091329 -1.1364
+0.11032 -0.091256 -1.1355
+0.11232 -0.091141 -1.134
+0.11425 -0.09098 -1.132
+0.11625 -0.090869 -1.1306
+0.1204 -0.090784 -1.1295
+0.12251 -0.090776 -1.1294
+0.12468 -0.090806 -1.1298
+0.12691 -0.090874 -1.1306
+0.12801 -0.090899 -1.1309
+0.13918 -0.092658 -1.153
+0.14035 -0.092717 -1.1538
+0.14255 -0.092729 -1.1539
+0.14476 -0.092754 -1.1542
+0.15416 -0.093176 -1.1595
+0.15657 -0.093313 -1.1612
+0.15787 -0.09343 -1.1627
+0.15947 -0.093727 -1.1664
+0.16106 -0.094016 -1.17
+0.16227 -0.094077 -1.1708
+0.16442 -0.094046 -1.1704
+0.16631 -0.09387 -1.1682
+0.1681 -0.093637 -1.1652
+0.1989 -0.093665 -1.1654
+0.20167 -0.093932 -1.1688
+-0.18865 -0.098708 -1.2146
+-0.18773 -0.098824 -1.216
+-0.1857 -0.098964 -1.2178
+-0.15642 -0.099308 -1.2222
+-0.15527 -0.099307 -1.2222
+-0.13664 -0.092172 -1.1334
+-0.13523 -0.091947 -1.1306
+-0.1341 -0.091901 -1.1301
+-0.12641 -0.090962 -1.1184
+-0.12346 -0.090347 -1.1108
+-0.10587 -0.089644 -1.1021
+-0.10511 -0.089875 -1.105
+-0.10474 -0.090461 -1.1123
+-0.10267 -0.09048 -1.1125
+-0.081245 -0.089983 -1.1064
+-0.080209 -0.089991 -1.1065
+-0.079246 -0.090082 -1.1076
+-0.078202 -0.090082 -1.1076
+-0.077283 -0.090228 -1.1095
+-0.060732 -0.090497 -1.1129
+-0.058854 -0.090836 -1.1171
+-0.057947 -0.091066 -1.12
+-0.056958 -0.091171 -1.1213
+-0.033994 -0.091938 -1.1309
+-0.029485 -0.094564 -1.1635
+-0.028416 -0.094653 -1.1646
+-0.026252 -0.09476 -1.166
+-0.025157 -0.094774 -1.1662
+-0.021413 -0.097741 -1.2031
+-0.020311 -0.097887 -1.2049
+-0.008987 -0.098119 -1.2078
+-0.00673 -0.098376 -1.211
+0.02323 -0.09973 -1.2278
+0.025541 -0.099727 -1.2278
+0.04184 -0.10001 -1.2313
+0.04304 -0.1001 -1.2325
+0.046154 -0.10186 -1.2543
+0.047379 -0.10195 -1.2554
+0.049713 -0.10189 -1.2547
+0.066564 -0.10238 -1.2608
+0.06861 -0.1019 -1.2547
+0.070642 -0.10142 -1.2488
+0.072733 -0.10106 -1.2443
+0.07383 -0.10096 -1.243
+0.074955 -0.1009 -1.2423
+0.077224 -0.10081 -1.2411
+0.10297 -0.10085 -1.2416
+0.10367 -0.10039 -1.2359
+0.10472 -0.10028 -1.2345
+0.10915 -0.10008 -1.232
+0.10923 -0.092312 -1.1353
+0.12785 -0.091851 -1.1295
+0.12896 -0.091885 -1.1299
+0.1403 -0.093766 -1.1533
+0.14142 -0.093791 -1.1536
+0.15794 -0.09457 -1.1632
+0.16114 -0.095165 -1.1706
+0.16337 -0.095181 -1.1708
+0.16525 -0.09499 -1.1684
+0.20006 -0.094791 -1.1658
+0.20148 -0.094943 -1.1677
+-0.18757 -0.099886 -1.215
+-0.18663 -0.099996 -1.2163
+-0.18465 -0.10016 -1.2184
+-0.18233 -0.10015 -1.2183
+-0.18006 -0.10016 -1.2184
+-0.17578 -0.10034 -1.2207
+-0.1714 -0.10047 -1.2223
+-0.167 -0.10059 -1.2237
+-0.16252 -0.10067 -1.2248
+-0.1603 -0.10073 -1.2255
+-0.15783 -0.10062 -1.2242
+-0.15538 -0.10053 -1.223
+-0.15423 -0.10053 -1.223
+-0.13792 -0.093386 -1.1352
+-0.13542 -0.093137 -1.1322
+-0.13298 -0.092929 -1.1296
+-0.12853 -0.092789 -1.1279
+-0.12483 -0.091636 -1.1137
+-0.12342 -0.091364 -1.1104
+-0.12223 -0.091261 -1.1091
+-0.11762 -0.090931 -1.1051
+-0.11315 -0.090687 -1.1021
+-0.11102 -0.090641 -1.1016
+-0.10892 -0.090627 -1.1014
+-0.1069 -0.090673 -1.102
+-0.10597 -0.090763 -1.1031
+-0.10559 -0.091332 -1.1101
+-0.10498 -0.091721 -1.1149
+-0.10393 -0.09172 -1.1149
+-0.10163 -0.09154 -1.1126
+-0.097148 -0.091271 -1.1094
+-0.092751 -0.091061 -1.1068
+-0.088509 -0.090989 -1.1059
+-0.084361 -0.091013 -1.1062
+-0.082288 -0.091027 -1.1064
+-0.080386 -0.091235 -1.109
+-0.078517 -0.091493 -1.1122
+-0.076541 -0.091638 -1.1139
+-0.074524 -0.09174 -1.1152
+-0.072493 -0.09183 -1.1163
+-0.067931 -0.091355 -1.1105
+-0.065817 -0.091326 -1.1101
+-0.063731 -0.091336 -1.1103
+-0.061688 -0.09141 -1.1112
+-0.059695 -0.091565 -1.1131
+-0.058646 -0.091565 -1.1131
+-0.057756 -0.091818 -1.1162
+-0.055872 -0.09218 -1.1207
+-0.053806 -0.09226 -1.1217
+-0.051693 -0.092262 -1.1217
+-0.047463 -0.092259 -1.1217
+-0.04327 -0.092335 -1.1226
+-0.039104 -0.09249 -1.1245
+-0.034974 -0.092775 -1.128
+-0.033953 -0.092891 -1.1295
+-0.02843 -0.095797 -1.1652
+-0.027348 -0.095852 -1.1659
+-0.025163 -0.095895 -1.1664
+-0.021447 -0.099029 -1.205
+-0.019198 -0.099134 -1.2063
+-0.014668 -0.099223 -1.2074
+-0.012398 -0.099251 -1.2077
+-0.010136 -0.099377 -1.2093
+-0.00787 -0.099515 -1.211
+-0.005614 -0.099949 -1.2163
+-0.003333 -0.10023 -1.2198
+-0.001037 -0.10027 -1.2202
+0.003565 -0.10046 -1.2226
+0.008174 -0.10052 -1.2233
+0.010489 -0.10064 -1.2248
+0.012848 -0.10106 -1.2299
+0.015167 -0.10107 -1.2301
+0.017498 -0.10116 -1.2313
+0.019794 -0.10105 -1.2298
+0.02212 -0.1011 -1.2304
+0.02326 -0.10102 -1.2294
+0.024426 -0.10106 -1.2299
+0.026746 -0.10107 -1.2301
+0.031375 -0.10106 -1.23
+0.036009 -0.10107 -1.2301
+0.040669 -0.10114 -1.2309
+0.041838 -0.10116 -1.2312
+0.043125 -0.10147 -1.2349
+0.046209 -0.10316 -1.2558
+0.048548 -0.10311 -1.2551
+0.050873 -0.10303 -1.2542
+0.055625 -0.10309 -1.2548
+0.06041 -0.10319 -1.2561
+0.06542 -0.10364 -1.2616
+0.066616 -0.10365 -1.2617
+0.067713 -0.10351 -1.26
+0.069726 -0.10298 -1.2535
+0.070709 -0.10269 -1.25
+0.071804 -0.10258 -1.2486
+0.073979 -0.10234 -1.2456
+0.07611 -0.10205 -1.242
+0.078392 -0.10198 -1.2411
+0.082984 -0.10187 -1.2399
+0.08763 -0.10185 -1.2395
+0.092316 -0.10187 -1.2398
+0.097081 -0.10197 -1.241
+0.10197 -0.10219 -1.2436
+0.10315 -0.1022 -1.2438
+0.10396 -0.10184 -1.2394
+0.10466 -0.10139 -1.2338
+0.10578 -0.10135 -1.2333
+0.10797 -0.10122 -1.2318
+0.11026 -0.1012 -1.2315
+0.10916 -0.093318 -1.1345
+0.11009 -0.093201 -1.133
+0.11398 -0.092895 -1.1293
+0.11803 -0.092727 -1.1272
+0.12223 -0.092691 -1.1267
+0.12658 -0.092763 -1.1276
+0.12883 -0.092859 -1.1288
+0.1299 -0.092862 -1.1288
+0.14021 -0.094793 -1.1525
+0.14258 -0.094924 -1.1541
+0.14708 -0.095023 -1.1553
+0.15192 -0.09533 -1.1591
+0.15665 -0.095552 -1.1618
+0.15953 -0.095966 -1.1669
+0.16114 -0.096268 -1.1706
+0.16228 -0.096294 -1.1709
+0.16337 -0.096282 -1.1707
+0.1642 -0.096123 -1.1688
+0.16587 -0.095816 -1.165
+0.16978 -0.095547 -1.1617
+0.17418 -0.095556 -1.1618
+0.17834 -0.095439 -1.1603
+0.18257 -0.095364 -1.1594
+0.18695 -0.095371 -1.1594
+0.19137 -0.095397 -1.1597
+0.19607 -0.095556 -1.1617
+0.19858 -0.095709 -1.1635
+0.20129 -0.095954 -1.1666
+0.20269 -0.096098 -1.1683
+-0.18645 -0.10104 -1.2151
+-0.18553 -0.10117 -1.2167
+-0.15427 -0.10171 -1.2234
+-0.13671 -0.094359 -1.134
+-0.1342 -0.094103 -1.1309
+-0.12689 -0.093427 -1.1227
+-0.1234 -0.092399 -1.1102
+-0.11004 -0.091731 -1.1022
+-0.10797 -0.091741 -1.1023
+-0.10699 -0.091792 -1.1029
+-0.10649 -0.092252 -1.1085
+-0.10517 -0.092937 -1.1169
+-0.10287 -0.092767 -1.1148
+-0.075618 -0.092844 -1.1158
+-0.074605 -0.092892 -1.1164
+-0.073562 -0.092904 -1.1166
+-0.058581 -0.092512 -1.1118
+-0.057573 -0.092577 -1.1126
+-0.056677 -0.092826 -1.1157
+-0.033909 -0.093833 -1.128
+-0.02844 -0.09693 -1.1656
+-0.026265 -0.097007 -1.1666
+-0.025176 -0.097046 -1.167
+-0.02033 -0.10025 -1.2061
+-0.013554 -0.10053 -1.2094
+-0.011283 -0.10058 -1.2101
+0.009329 -0.10172 -1.2239
+0.010488 -0.10178 -1.2246
+0.011688 -0.10219 -1.2297
+0.014023 -0.10234 -1.2314
+0.01518 -0.10233 -1.2313
+0.016341 -0.10234 -1.2314
+0.023276 -0.10225 -1.2303
+0.025583 -0.10221 -1.2299
+0.041841 -0.10233 -1.2313
+0.044887 -0.10402 -1.2518
+0.066602 -0.10482 -1.2615
+0.068879 -0.10467 -1.2597
+0.070777 -0.10397 -1.2512
+0.072984 -0.10376 -1.2486
+0.10314 -0.10336 -1.2436
+0.1043 -0.10335 -1.2435
+0.10504 -0.10293 -1.2384
+0.1057 -0.10243 -1.2324
+0.10679 -0.10237 -1.2316
+0.10901 -0.10227 -1.2304
+0.10814 -0.094431 -1.135
+0.10905 -0.094299 -1.1334
+0.12982 -0.093865 -1.128
+0.1309 -0.093879 -1.1282
+0.13195 -0.093872 -1.1281
+0.1413 -0.095885 -1.1526
+0.15814 -0.096886 -1.1647
+0.16111 -0.097356 -1.1704
+0.16315 -0.097254 -1.1691
+0.16475 -0.096899 -1.1648
+0.20253 -0.09712 -1.1673
+0.20401 -0.097304 -1.1696
+-0.18536 -0.10222 -1.2155
+-0.18446 -0.10235 -1.2171
+-0.18238 -0.10248 -1.2186
+-0.18011 -0.10249 -1.2188
+-0.17808 -0.10264 -1.2206
+-0.16034 -0.10306 -1.2257
+-0.15809 -0.1031 -1.2262
+-0.15578 -0.1031 -1.2262
+-0.15461 -0.10309 -1.2261
+-0.13664 -0.095383 -1.1335
+-0.13548 -0.095315 -1.1327
+-0.13303 -0.095094 -1.13
+-0.13084 -0.095053 -1.1295
+-0.12863 -0.094988 -1.1288
+-0.12717 -0.094697 -1.1253
+-0.12519 -0.094008 -1.117
+-0.12343 -0.093472 -1.1105
+-0.1222 -0.09333 -1.1088
+-0.11988 -0.093147 -1.1067
+-0.11767 -0.093056 -1.1056
+-0.11547 -0.092963 -1.1045
+-0.11331 -0.092895 -1.1036
+-0.11119 -0.092864 -1.1033
+-0.11021 -0.092914 -1.1039
+-0.10917 -0.092915 -1.1039
+-0.10822 -0.092991 -1.1048
+-0.10672 -0.094433 -1.1222
+-0.10567 -0.094433 -1.1222
+-0.10444 -0.09428 -1.1203
+-0.10307 -0.093998 -1.117
+-0.10185 -0.093837 -1.115
+-0.099524 -0.093631 -1.1126
+-0.090675 -0.093159 -1.1069
+-0.082571 -0.093435 -1.1103
+-0.07861 -0.093703 -1.1135
+-0.076635 -0.093855 -1.1153
+-0.074595 -0.093932 -1.1163
+-0.072541 -0.093997 -1.1171
+-0.070398 -0.093947 -1.1165
+-0.068049 -0.093612 -1.1124
+-0.065837 -0.093449 -1.1105
+-0.063727 -0.093424 -1.1102
+-0.061643 -0.093438 -1.1103
+-0.0596 -0.093515 -1.1113
+-0.057566 -0.093614 -1.1125
+-0.056517 -0.093614 -1.1125
+-0.055618 -0.093866 -1.1155
+-0.053667 -0.094131 -1.1187
+-0.051609 -0.094224 -1.1198
+-0.049511 -0.094249 -1.1201
+-0.036969 -0.09457 -1.124
+-0.034906 -0.094721 -1.1258
+-0.032869 -0.094965 -1.1288
+-0.02845 -0.098065 -1.1661
+-0.027359 -0.098091 -1.1664
+-0.026269 -0.098122 -1.1667
+-0.021458 -0.10135 -1.2056
+-0.019254 -0.10171 -1.2098
+-0.016996 -0.10183 -1.2113
+-0.014724 -0.10188 -1.212
+-0.013583 -0.10188 -1.212
+-0.012434 -0.10182 -1.2113
+-0.010161 -0.10191 -1.2123
+-0.007882 -0.10195 -1.2128
+-0.005625 -0.10243 -1.2186
+-0.003338 -0.10267 -1.2214
+-0.001039 -0.10272 -1.2221
+0.001263 -0.10276 -1.2225
+0.005869 -0.1028 -1.2231
+0.008175 -0.10284 -1.2235
+0.00933 -0.10288 -1.224
+0.010513 -0.10318 -1.2276
+0.011698 -0.10344 -1.2307
+0.012862 -0.10349 -1.2313
+0.015181 -0.10349 -1.2313
+0.017497 -0.10348 -1.2311
+0.01981 -0.10345 -1.2309
+0.022122 -0.10342 -1.2305
+0.024425 -0.10337 -1.2298
+0.026737 -0.10335 -1.2296
+0.029058 -0.10337 -1.2299
+0.033689 -0.10337 -1.2299
+0.036001 -0.10336 -1.2298
+0.038325 -0.10339 -1.23
+0.040668 -0.10346 -1.2309
+0.045051 -0.10558 -1.2564
+0.046207 -0.10552 -1.2557
+0.048545 -0.10546 -1.255
+0.05795 -0.10538 -1.254
+0.060321 -0.1054 -1.2542
+0.062759 -0.10553 -1.2558
+0.065292 -0.1058 -1.2591
+0.067798 -0.10602 -1.2616
+0.068987 -0.10602 -1.2617
+0.07005 -0.10583 -1.2594
+0.07194 -0.10513 -1.2509
+0.074167 -0.10495 -1.2488
+0.07635 -0.10472 -1.246
+0.078497 -0.10445 -1.2428
+0.080714 -0.1043 -1.2409
+0.082988 -0.10422 -1.2399
+0.08529 -0.10418 -1.2395
+0.087613 -0.10416 -1.2393
+0.089964 -0.10419 -1.2395
+0.099463 -0.10436 -1.2416
+0.1019 -0.10446 -1.2428
+0.10433 -0.10455 -1.2439
+0.10544 -0.10449 -1.2431
+0.10615 -0.10404 -1.2377
+0.10683 -0.10356 -1.232
+0.10788 -0.10346 -1.2308
+0.10797 -0.095354 -1.1332
+0.10987 -0.095146 -1.1307
+0.11182 -0.094991 -1.1289
+0.12855 -0.094777 -1.1262
+0.13083 -0.094889 -1.1276
+0.1319 -0.0949 -1.1277
+0.14118 -0.096892 -1.1516
+0.14258 -0.097101 -1.1541
+0.14477 -0.097115 -1.1543
+0.14704 -0.097174 -1.155
+0.14957 -0.097407 -1.1578
+0.1544 -0.097701 -1.1613
+0.15689 -0.09789 -1.1635
+0.15817 -0.098001 -1.1649
+0.15973 -0.098288 -1.1683
+0.16111 -0.098457 -1.1704
+0.16219 -0.098444 -1.1702
+0.16372 -0.098043 -1.1654
+0.16572 -0.097923 -1.1639
+0.16773 -0.09782 -1.1627
+0.1983 -0.097763 -1.1618
+0.20092 -0.097975 -1.1644
+0.20382 -0.098314 -1.1685
+-0.18442 -0.10348 -1.2169
+-0.1835 -0.10361 -1.2184
+-0.1824 -0.10364 -1.2188
+-0.18143 -0.10374 -1.2199
+-0.1547 -0.10431 -1.2268
+-0.13659 -0.096415 -1.133
+-0.13426 -0.09628 -1.1314
+-0.12743 -0.09595 -1.1275
+-0.12348 -0.094555 -1.111
+-0.11878 -0.094148 -1.1061
+-0.11452 -0.094076 -1.1053
+-0.11339 -0.094006 -1.1045
+-0.11231 -0.093973 -1.1041
+-0.11124 -0.093946 -1.1038
+-0.1094 -0.094151 -1.1062
+-0.10875 -0.095416 -1.1213
+-0.10694 -0.095682 -1.1244
+-0.1057 -0.095525 -1.1226
+-0.10332 -0.09528 -1.1197
+-0.056535 -0.094692 -1.1128
+-0.054636 -0.095039 -1.117
+-0.052602 -0.095168 -1.1185
+-0.033841 -0.095769 -1.1257
+-0.032835 -0.095929 -1.1276
+-0.028446 -0.099149 -1.1659
+-0.026282 -0.099273 -1.1674
+-0.020408 -0.10292 -1.2107
+-0.019281 -0.10299 -1.2116
+-0.018141 -0.10299 -1.2116
+-0.015864 -0.10302 -1.2119
+-0.013582 -0.10302 -1.2119
+-0.012442 -0.10303 -1.212
+-0.011302 -0.10304 -1.2122
+-0.00675 -0.10324 -1.2145
+-0.005624 -0.10356 -1.2184
+-0.004487 -0.1038 -1.2212
+-0.002189 -0.10386 -1.2219
+0.007022 -0.10398 -1.2234
+0.008177 -0.10402 -1.2238
+0.009352 -0.10428 -1.2269
+0.011702 -0.10463 -1.2311
+0.037163 -0.10453 -1.2299
+0.04506 -0.10679 -1.2567
+0.066507 -0.10704 -1.2597
+0.067786 -0.10719 -1.2614
+0.068992 -0.10722 -1.2617
+0.07018 -0.10722 -1.2617
+0.071293 -0.1071 -1.2604
+0.073234 -0.10648 -1.2529
+0.074253 -0.10625 -1.2502
+0.07538 -0.10618 -1.2494
+0.076451 -0.10603 -1.2476
+0.077564 -0.10595 -1.2466
+0.10549 -0.10571 -1.2438
+0.10652 -0.10557 -1.2421
+0.10727 -0.10516 -1.2371
+0.10797 -0.1047 -1.2318
+0.10879 -0.096203 -1.1306
+0.13186 -0.095929 -1.1273
+0.13298 -0.095973 -1.1278
+0.14253 -0.098158 -1.1537
+0.14364 -0.098176 -1.154
+0.14586 -0.098203 -1.1543
+0.15577 -0.098971 -1.1634
+0.157 -0.099056 -1.1644
+0.15851 -0.099315 -1.1674
+0.16006 -0.099597 -1.1708
+0.16117 -0.099597 -1.1708
+-0.18037 -0.10494 -1.2205
+-0.17575 -0.10492 -1.2204
+-0.17138 -0.10507 -1.2221
+-0.16691 -0.10515 -1.2231
+-0.16252 -0.10529 -1.2248
+-0.15808 -0.1054 -1.2261
+-0.15582 -0.10544 -1.2266
+-0.15468 -0.10545 -1.2267
+-0.13652 -0.097437 -1.1325
+-0.13545 -0.097435 -1.1325
+-0.13311 -0.097283 -1.1307
+-0.12867 -0.097149 -1.1291
+-0.12753 -0.09709 -1.1284
+-0.12602 -0.096752 -1.1245
+-0.124 -0.096008 -1.1157
+-0.12239 -0.095569 -1.1106
+-0.12012 -0.095428 -1.1089
+-0.1179 -0.095328 -1.1077
+-0.11568 -0.095213 -1.1064
+-0.11092 -0.095613 -1.1111
+-0.11055 -0.096198 -1.118
+-0.10906 -0.096747 -1.1245
+-0.10807 -0.096809 -1.1252
+-0.10695 -0.096755 -1.1246
+-0.10463 -0.09657 -1.1224
+-0.10214 -0.096216 -1.1183
+-0.097422 -0.095725 -1.1125
+-0.092907 -0.095396 -1.1086
+-0.090757 -0.095333 -1.1079
+-0.088665 -0.09533 -1.1079
+-0.084697 -0.095566 -1.1107
+-0.080702 -0.095794 -1.1134
+-0.076655 -0.095983 -1.1156
+-0.072549 -0.096115 -1.1172
+-0.070409 -0.096069 -1.1166
+-0.068093 -0.095772 -1.1131
+-0.065831 -0.095534 -1.1104
+-0.06369 -0.095462 -1.1095
+-0.059516 -0.095477 -1.1097
+-0.057382 -0.095407 -1.1089
+-0.056337 -0.095407 -1.1089
+-0.055478 -0.095729 -1.1127
+-0.054593 -0.096017 -1.1161
+-0.05359 -0.096103 -1.1171
+-0.051542 -0.096211 -1.1183
+-0.047367 -0.096294 -1.1193
+-0.043164 -0.09633 -1.1198
+-0.038978 -0.096417 -1.1208
+-0.034847 -0.096679 -1.1239
+-0.032806 -0.096908 -1.1266
+-0.031785 -0.09703 -1.128
+-0.027368 -0.10032 -1.1668
+-0.021544 -0.10404 -1.2105
+-0.019278 -0.10411 -1.2113
+-0.017002 -0.10414 -1.2117
+-0.014721 -0.10415 -1.2117
+-0.012441 -0.10417 -1.212
+-0.010162 -0.1042 -1.2123
+-0.007882 -0.10424 -1.2128
+-0.005632 -0.10486 -1.2202
+-0.003339 -0.10499 -1.2217
+-0.001039 -0.10502 -1.222
+0.003566 -0.10509 -1.2229
+0.005872 -0.10516 -1.2236
+0.008194 -0.1054 -1.2265
+0.010541 -0.10577 -1.2309
+0.012859 -0.10578 -1.231
+0.01749 -0.10575 -1.2306
+0.022116 -0.10571 -1.2302
+0.026732 -0.10565 -1.2294
+0.031357 -0.10564 -1.2292
+0.036004 -0.10569 -1.2299
+0.037162 -0.10569 -1.2299
+0.043902 -0.10803 -1.2574
+0.046224 -0.10792 -1.2562
+0.050852 -0.10771 -1.2536
+0.055555 -0.10768 -1.2532
+0.060314 -0.10775 -1.2541
+0.062635 -0.10768 -1.2533
+0.065133 -0.10791 -1.256
+0.067679 -0.1082 -1.2594
+0.068971 -0.10837 -1.2614
+0.07018 -0.1084 -1.2617
+0.072587 -0.10845 -1.2623
+0.07483 -0.10826 -1.26
+0.077073 -0.10808 -1.2579
+0.077997 -0.10772 -1.2537
+0.078743 -0.10713 -1.2467
+0.080854 -0.10682 -1.243
+0.083111 -0.10671 -1.2418
+0.08532 -0.10655 -1.2399
+0.087608 -0.10649 -1.2392
+0.089931 -0.10648 -1.2391
+0.092233 -0.10645 -1.2386
+0.096975 -0.10653 -1.2396
+0.10179 -0.10669 -1.2414
+0.10424 -0.1068 -1.2427
+0.10655 -0.10677 -1.2424
+0.10762 -0.10667 -1.2412
+0.10771 -0.097255 -1.1305
+0.10967 -0.097108 -1.1287
+0.11363 -0.096856 -1.1257
+0.1177 -0.096709 -1.124
+0.12186 -0.096651 -1.1233
+0.12615 -0.096694 -1.1238
+0.13061 -0.096857 -1.1257
+0.13292 -0.096997 -1.1273
+0.13411 -0.097088 -1.1284
+0.14362 -0.099247 -1.1537
+0.14471 -0.099247 -1.1537
+0.14709 -0.09939 -1.1554
+0.1521 -0.099819 -1.1604
+0.15465 -0.10005 -1.1632
+0.15588 -0.10014 -1.1642
+0.15743 -0.10043 -1.1676
+0.15894 -0.10069 -1.1706
+0.16014 -0.10075 -1.1713
+0.16208 -0.10058 -1.1694
+0.16383 -0.1003 -1.1661
+0.16567 -0.10009 -1.1636
+0.1697 -0.09988 -1.1611
+0.17382 -0.099734 -1.1593
+0.17793 -0.099585 -1.1576
+0.18221 -0.099542 -1.1571
+0.18657 -0.099539 -1.157
+0.19102 -0.099588 -1.1576
+0.19568 -0.099737 -1.1593
+0.20065 -0.10004 -1.1628
+0.2035 -0.10036 -1.1666
+-0.15466 -0.10659 -1.2265
+-0.13653 -0.098512 -1.1326
+-0.13433 -0.098461 -1.132
+-0.12754 -0.098161 -1.1285
+-0.12438 -0.097352 -1.1191
+-0.117 -0.096488 -1.1091
+-0.11596 -0.096489 -1.1091
+-0.11518 -0.096715 -1.1117
+-0.11438 -0.096927 -1.1142
+-0.1127 -0.097291 -1.1185
+-0.11178 -0.097406 -1.1198
+-0.11085 -0.097521 -1.1211
+-0.10993 -0.097639 -1.1225
+-0.10809 -0.097888 -1.1254
+-0.089752 -0.096421 -1.1084
+-0.056286 -0.096367 -1.1079
+-0.054542 -0.096978 -1.115
+-0.052533 -0.09715 -1.117
+-0.031753 -0.097994 -1.1269
+-0.02268 -0.10516 -1.2103
+-0.020415 -0.10524 -1.2111
+-0.009022 -0.10536 -1.2126
+-0.007887 -0.10545 -1.2136
+-0.006766 -0.10577 -1.2174
+0.037161 -0.10685 -1.2298
+0.068872 -0.1094 -1.2595
+0.073863 -0.10977 -1.2638
+0.075034 -0.10975 -1.2635
+0.076203 -0.10972 -1.2632
+0.077338 -0.10964 -1.2623
+0.078358 -0.1094 -1.2595
+0.10751 -0.10773 -1.2399
+0.13401 -0.098074 -1.1275
+0.13522 -0.098184 -1.1287
+0.14352 -0.10026 -1.1529
+0.14584 -0.10037 -1.1541
+0.15346 -0.10109 -1.1625
+0.15495 -0.10135 -1.1655
+0.1563 -0.10151 -1.1674
+0.15926 -0.10199 -1.173
+0.16122 -0.10184 -1.1711
+0.20493 -0.10163 -1.1685
+-0.17809 -0.10725 -1.2207
+-0.17591 -0.10732 -1.2215
+-0.17362 -0.10733 -1.2216
+-0.1558 -0.10774 -1.2264
+-0.15356 -0.10779 -1.227
+-0.13653 -0.099579 -1.1325
+-0.13546 -0.099579 -1.1325
+-0.1332 -0.099482 -1.1314
+-0.13089 -0.099351 -1.1299
+-0.12871 -0.099312 -1.1295
+-0.12638 -0.099155 -1.1277
+-0.12482 -0.098756 -1.1231
+-0.12279 -0.097983 -1.1142
+-0.12042 -0.097767 -1.1118
+-0.11835 -0.09779 -1.112
+-0.11665 -0.09812 -1.1158
+-0.11584 -0.098324 -1.1182
+-0.11484 -0.09837 -1.1187
+-0.11382 -0.098402 -1.1191
+-0.11281 -0.098444 -1.1196
+-0.11079 -0.098524 -1.1205
+-0.10986 -0.098632 -1.1217
+-0.10912 -0.098923 -1.1251
+-0.10705 -0.09897 -1.1256
+-0.10471 -0.098766 -1.1233
+-0.10234 -0.09852 -1.1205
+-0.099943 -0.09824 -1.1173
+-0.09524 -0.097737 -1.1115
+-0.093001 -0.097586 -1.1098
+-0.090855 -0.097528 -1.1091
+-0.089808 -0.097528 -1.1091
+-0.088809 -0.097579 -1.1097
+-0.086836 -0.097712 -1.1112
+-0.070294 -0.098014 -1.1148
+-0.068049 -0.097809 -1.1124
+-0.06582 -0.097612 -1.1102
+-0.057323 -0.097399 -1.1077
+-0.055268 -0.097457 -1.1084
+-0.053518 -0.098078 -1.1156
+-0.051473 -0.09819 -1.1168
+-0.049393 -0.098239 -1.1174
+-0.032751 -0.098864 -1.1246
+-0.031737 -0.099009 -1.1263
+-0.02269 -0.10635 -1.2108
+-0.021552 -0.10636 -1.2109
+-0.019279 -0.1064 -1.2114
+-0.016999 -0.10641 -1.2115
+-0.012441 -0.10645 -1.2119
+-0.010165 -0.10651 -1.2127
+-0.009028 -0.10657 -1.2134
+-0.007907 -0.10686 -1.2167
+-0.005634 -0.10719 -1.2205
+-0.003337 -0.10726 -1.2212
+0.001263 -0.10736 -1.2224
+0.003566 -0.10742 -1.2231
+0.00588 -0.10761 -1.2254
+0.00822 -0.10805 -1.2304
+0.010539 -0.10807 -1.2307
+0.012856 -0.10807 -1.2306
+0.015171 -0.10806 -1.2305
+0.033677 -0.10797 -1.2294
+0.035993 -0.10797 -1.2295
+0.037176 -0.10805 -1.2303
+0.04161 -0.1106 -1.2597
+0.043937 -0.11049 -1.2584
+0.046237 -0.11032 -1.2565
+0.048521 -0.11014 -1.2544
+0.062613 -0.11001 -1.2528
+0.065016 -0.11008 -1.2537
+0.067496 -0.11028 -1.2559
+0.070094 -0.11065 -1.2602
+0.07265 -0.11093 -1.2634
+0.075061 -0.11098 -1.264
+0.077433 -0.11096 -1.2638
+0.079619 -0.1107 -1.2607
+0.081087 -0.10947 -1.2467
+0.083249 -0.10923 -1.2438
+0.085459 -0.10906 -1.2419
+0.087636 -0.10886 -1.2396
+0.089811 -0.10867 -1.2374
+0.092032 -0.10854 -1.2359
+0.094328 -0.10851 -1.2355
+0.10404 -0.10893 -1.2404
+0.10632 -0.10888 -1.2397
+0.10732 -0.10871 -1.2377
+0.10539 -0.099206 -1.1284
+0.10744 -0.099139 -1.1276
+0.10949 -0.099069 -1.1268
+0.1115 -0.098971 -1.1256
+0.13271 -0.098965 -1.1255
+0.13509 -0.099154 -1.1277
+0.14339 -0.10126 -1.1519
+0.14465 -0.10138 -1.1533
+0.14583 -0.10145 -1.154
+0.14714 -0.1016 -1.1558
+0.14969 -0.10185 -1.1587
+0.15232 -0.10215 -1.1621
+0.15553 -0.10283 -1.1699
+0.15714 -0.10316 -1.1737
+0.15842 -0.10327 -1.175
+0.16034 -0.10308 -1.1728
+0.16198 -0.10273 -1.1687
+0.16368 -0.10241 -1.165
+0.16553 -0.1022 -1.1626
+0.16753 -0.10208 -1.1613
+0.20341 -0.10252 -1.1661
+0.20485 -0.10269 -1.1681
+-0.17703 -0.10846 -1.2213
+-0.13653 -0.10065 -1.1325
+-0.13438 -0.10064 -1.1324
+-0.12524 -0.10015 -1.1269
+-0.12329 -0.099436 -1.1188
+-0.12172 -0.099021 -1.1141
+-0.11953 -0.098941 -1.1132
+-0.11781 -0.099264 -1.1169
+-0.11692 -0.0994 -1.1184
+-0.11593 -0.099456 -1.1191
+-0.11384 -0.099473 -1.1193
+-0.11175 -0.099491 -1.1195
+-0.10972 -0.099567 -1.1203
+-0.1081 -0.10002 -1.1255
+-0.10595 -0.099995 -1.1252
+-0.10357 -0.099744 -1.1224
+-0.091957 -0.098636 -1.1098
+-0.090895 -0.098619 -1.1096
+-0.089849 -0.098618 -1.1096
+-0.054335 -0.098706 -1.1107
+-0.052459 -0.099117 -1.1154
+-0.031705 -0.099969 -1.1251
+-0.022687 -0.10748 -1.2107
+-0.020417 -0.10753 -1.2113
+-0.011309 -0.10767 -1.2129
+-0.010176 -0.10777 -1.214
+-0.009054 -0.10802 -1.2168
+-0.006784 -0.10836 -1.2207
+0.004723 -0.10869 -1.2245
+0.00706 -0.10918 -1.23
+0.040458 -0.11188 -1.2607
+0.078577 -0.11209 -1.2631
+0.079738 -0.11205 -1.2626
+0.080748 -0.1118 -1.2598
+0.082255 -0.11064 -1.2466
+0.083328 -0.11051 -1.245
+0.084435 -0.11042 -1.2441
+0.086602 -0.1102 -1.2415
+0.088652 -0.10984 -1.2375
+0.09085 -0.10968 -1.2356
+0.10508 -0.10997 -1.2388
+0.10613 -0.10985 -1.2375
+0.10695 -0.10949 -1.2334
+0.10431 -0.10026 -1.1282
+0.14303 -0.10209 -1.1489
+0.14587 -0.10257 -1.1544
+0.15094 -0.10305 -1.1599
+0.15272 -0.10352 -1.1652
+0.15469 -0.10411 -1.1719
+0.15637 -0.10449 -1.1763
+0.15746 -0.10448 -1.1761
+0.1627 -0.10359 -1.1659
+0.16352 -0.10341 -1.1639
+0.16448 -0.10332 -1.1629
+0.20482 -0.10377 -1.1679
+-0.17601 -0.10969 -1.2223
+-0.17371 -0.10969 -1.2222
+-0.17143 -0.1097 -1.2224
+-0.16691 -0.10976 -1.2231
+-0.16252 -0.10991 -1.2247
+-0.15805 -0.11 -1.2259
+-0.15354 -0.11009 -1.2268
+-0.1355 -0.10175 -1.1329
+-0.1344 -0.10172 -1.1326
+-0.13328 -0.10168 -1.1321
+-0.13095 -0.10153 -1.1304
+-0.12876 -0.10148 -1.1299
+-0.12655 -0.10142 -1.1292
+-0.12543 -0.10137 -1.1287
+-0.1241 -0.10115 -1.1262
+-0.12222 -0.10048 -1.1186
+-0.12082 -0.1002 -1.1155
+-0.11885 -0.1003 -1.1167
+-0.11697 -0.1005 -1.1189
+-0.11488 -0.10051 -1.1191
+-0.11274 -0.10049 -1.1188
+-0.11072 -0.10057 -1.1197
+-0.1087 -0.10065 -1.1207
+-0.10702 -0.10107 -1.1254
+-0.10596 -0.10107 -1.1254
+-0.1048 -0.10097 -1.1242
+-0.10245 -0.10074 -1.1217
+-0.097756 -0.10027 -1.1163
+-0.09315 -0.09984 -1.1116
+-0.091 -0.099781 -1.1109
+-0.088978 -0.099862 -1.1118
+-0.084884 -0.099977 -1.1131
+-0.080736 -0.10004 -1.1138
+-0.076597 -0.10012 -1.1147
+-0.072411 -0.10014 -1.115
+-0.068028 -0.099875 -1.112
+-0.063612 -0.099526 -1.1081
+-0.059305 -0.099311 -1.1057
+-0.055167 -0.099366 -1.1063
+-0.054181 -0.099471 -1.1075
+-0.053309 -0.099792 -1.1111
+-0.052417 -0.10009 -1.1145
+-0.051415 -0.10018 -1.1156
+-0.047264 -0.1003 -1.1169
+-0.043076 -0.10035 -1.1175
+-0.0389 -0.10045 -1.1185
+-0.034761 -0.10067 -1.121
+-0.03271 -0.10086 -1.1232
+-0.03068 -0.10115 -1.1265
+-0.023812 -0.10855 -1.2099
+-0.021558 -0.10867 -1.2113
+-0.019284 -0.10871 -1.2117
+-0.014728 -0.10877 -1.2123
+-0.01246 -0.1089 -1.2138
+-0.010205 -0.10923 -1.2175
+-0.007932 -0.1095 -1.2205
+-0.005637 -0.10957 -1.2214
+-0.001039 -0.10965 -1.2222
+0.00357 -0.10983 -1.2243
+0.004729 -0.10998 -1.226
+0.0059 -0.1103 -1.2296
+0.00822 -0.11037 -1.2304
+0.012855 -0.11038 -1.2305
+0.017483 -0.11034 -1.2301
+0.022102 -0.11028 -1.2294
+0.026724 -0.11025 -1.229
+0.031363 -0.11029 -1.2295
+0.033666 -0.11025 -1.229
+0.04045 -0.11304 -1.2605
+0.041625 -0.11301 -1.2601
+0.046233 -0.11268 -1.2564
+0.050795 -0.11231 -1.2522
+0.055487 -0.11226 -1.2517
+0.060216 -0.11229 -1.252
+0.064918 -0.11227 -1.2518
+0.067286 -0.11229 -1.252
+0.069842 -0.11261 -1.2556
+0.074985 -0.11324 -1.2626
+0.077366 -0.11325 -1.2627
+0.078554 -0.11325 -1.2627
+0.079667 -0.11314 -1.2615
+0.082 -0.11308 -1.2608
+0.082953 -0.11276 -1.2572
+0.083575 -0.11201 -1.2488
+0.085657 -0.11166 -1.2448
+0.087638 -0.1112 -1.2396
+0.088574 -0.11091 -1.2364
+0.089696 -0.11086 -1.2358
+0.09197 -0.1108 -1.235
+0.096612 -0.11079 -1.2349
+0.10155 -0.1111 -1.2384
+0.10388 -0.1111 -1.2384
+0.10493 -0.11098 -1.237
+0.10577 -0.11063 -1.2332
+0.10678 -0.11048 -1.2314
+0.10424 -0.10126 -1.1275
+0.10526 -0.10122 -1.127
+0.10727 -0.10111 -1.1258
+0.10935 -0.10106 -1.1253
+0.11342 -0.10091 -1.1235
+0.1175 -0.10078 -1.122
+0.12165 -0.10071 -1.1213
+0.12588 -0.10072 -1.1213
+0.13028 -0.10085 -1.1228
+0.13487 -0.10112 -1.1258
+0.13738 -0.1014 -1.129
+0.13864 -0.10155 -1.1306
+0.14287 -0.10306 -1.1476
+0.14441 -0.10339 -1.1513
+0.14739 -0.10396 -1.1578
+0.1498 -0.10412 -1.1596
+0.15128 -0.10439 -1.1626
+0.15356 -0.1052 -1.1717
+0.15548 -0.10575 -1.178
+0.15654 -0.10572 -1.1775
+0.15851 -0.10555 -1.1757
+0.16176 -0.10479 -1.1671
+0.16349 -0.10449 -1.1637
+0.16535 -0.10428 -1.1613
+0.16942 -0.10409 -1.1591
+0.17349 -0.10391 -1.1571
+0.17767 -0.1038 -1.1559
+0.18189 -0.10373 -1.155
+0.18632 -0.10377 -1.1554
+0.19083 -0.10385 -1.1563
+0.19553 -0.10403 -1.1584
+0.20062 -0.10441 -1.1626
+0.20327 -0.10464 -1.1653
+0.20628 -0.10506 -1.1699
+-0.17611 -0.1109 -1.2229
+-0.1749 -0.11087 -1.2225
+-0.17263 -0.11089 -1.2228
+-0.13332 -0.10278 -1.1325
+-0.13211 -0.10267 -1.1312
+-0.12988 -0.10259 -1.1304
+-0.12547 -0.10247 -1.1291
+-0.12302 -0.1022 -1.1261
+-0.12121 -0.10157 -1.1191
+-0.11993 -0.10139 -1.117
+-0.10784 -0.1019 -1.1228
+-0.10595 -0.10212 -1.1252
+-0.10368 -0.10197 -1.1236
+-0.054143 -0.10045 -1.1067
+-0.052297 -0.10091 -1.1119
+-0.024921 -0.10956 -1.2084
+-0.011371 -0.11057 -1.2197
+0.004732 -0.1112 -1.2267
+0.007062 -0.11153 -1.2304
+0.032537 -0.1115 -1.2301
+0.040429 -0.11417 -1.2598
+0.078459 -0.1143 -1.2612
+0.083166 -0.11424 -1.2605
+0.084195 -0.11403 -1.2581
+0.085014 -0.11354 -1.2527
+0.086847 -0.11286 -1.2451
+0.088556 -0.11205 -1.2361
+0.090799 -0.11195 -1.2349
+0.10269 -0.11224 -1.2381
+0.10476 -0.11196 -1.235
+0.10665 -0.11151 -1.23
+0.10518 -0.1022 -1.1261
+0.10619 -0.10215 -1.1256
+0.10823 -0.10207 -1.1247
+0.13848 -0.10249 -1.1293
+0.14252 -0.10388 -1.1448
+0.14609 -0.1049 -1.1561
+0.15175 -0.10581 -1.1662
+0.15435 -0.10685 -1.1778
+0.15558 -0.10693 -1.1787
+0.15669 -0.10693 -1.1787
+0.15757 -0.10677 -1.1769
+-0.17652 -0.11232 -1.2258
+-0.17406 -0.11222 -1.2247
+-0.17265 -0.11205 -1.2229
+-0.1715 -0.11205 -1.2229
+-0.16915 -0.11203 -1.2226
+-0.16691 -0.11207 -1.2231
+-0.16472 -0.11214 -1.2239
+-0.1558 -0.11236 -1.2263
+-0.15354 -0.1124 -1.2268
+-0.13222 -0.10382 -1.1322
+-0.13102 -0.10372 -1.1311
+-0.12882 -0.10366 -1.1305
+-0.12664 -0.10362 -1.13
+-0.12449 -0.1036 -1.1298
+-0.12194 -0.10325 -1.1259
+-0.12021 -0.10268 -1.1196
+-0.11904 -0.10258 -1.1185
+-0.11694 -0.10259 -1.1186
+-0.11495 -0.10269 -1.1198
+-0.1129 -0.10275 -1.1204
+-0.10877 -0.10284 -1.1215
+-0.10781 -0.10293 -1.1224
+-0.10689 -0.10307 -1.124
+-0.10602 -0.10325 -1.126
+-0.10496 -0.10325 -1.126
+-0.10256 -0.10297 -1.1229
+-0.10022 -0.10274 -1.1204
+-0.095669 -0.10239 -1.1166
+-0.093453 -0.10227 -1.1152
+-0.091377 -0.1023 -1.1155
+-0.061365 -0.10136 -1.1052
+-0.05714 -0.10125 -1.1041
+-0.055099 -0.10133 -1.1049
+-0.053136 -0.10156 -1.1075
+-0.051309 -0.10208 -1.1132
+-0.049315 -0.10229 -1.1156
+-0.032689 -0.10291 -1.1225
+-0.026036 -0.1106 -1.2073
+-0.023814 -0.11084 -1.21
+-0.021577 -0.11105 -1.2123
+-0.017041 -0.11125 -1.2145
+-0.01477 -0.11137 -1.2158
+-0.012519 -0.11171 -1.2196
+-0.011391 -0.11191 -1.2218
+-0.010243 -0.11193 -1.222
+-0.007945 -0.11197 -1.2225
+-0.005643 -0.11198 -1.2226
+-0.003344 -0.11207 -1.2235
+-0.00104 -0.1121 -1.2239
+0.001265 -0.11214 -1.2243
+0.003575 -0.11228 -1.2259
+0.005897 -0.11255 -1.2289
+0.008223 -0.11273 -1.2308
+0.01054 -0.11272 -1.2307
+0.019797 -0.11265 -1.23
+0.022102 -0.1126 -1.2294
+0.024405 -0.11254 -1.2288
+0.02672 -0.11255 -1.2289
+0.029037 -0.11256 -1.229
+0.031394 -0.11272 -1.2307
+0.032566 -0.11276 -1.2312
+0.041602 -0.11532 -1.2594
+0.043943 -0.11524 -1.2586
+0.067199 -0.1145 -1.2503
+0.069626 -0.11462 -1.2516
+0.072229 -0.11502 -1.256
+0.074779 -0.1153 -1.2591
+0.077214 -0.1154 -1.2602
+0.079596 -0.11541 -1.2603
+0.081962 -0.1154 -1.2602
+0.084318 -0.11538 -1.26
+0.085459 -0.11532 -1.2593
+0.086342 -0.11492 -1.2549
+0.087153 -0.11443 -1.2495
+0.08758 -0.11346 -1.2388
+0.088524 -0.11318 -1.2356
+0.089655 -0.11314 -1.2352
+0.091896 -0.11303 -1.234
+0.094185 -0.11299 -1.2336
+0.098898 -0.11307 -1.2344
+0.1013 -0.11315 -1.2353
+0.10261 -0.11331 -1.2371
+0.10377 -0.11331 -1.2371
+0.10562 -0.1128 -1.2314
+0.10761 -0.11246 -1.2276
+0.10511 -0.10319 -1.1254
+0.10715 -0.10311 -1.1245
+0.1092 -0.10305 -1.1237
+0.11127 -0.10301 -1.1233
+0.13708 -0.1033 -1.1265
+0.13836 -0.10347 -1.1283
+0.14008 -0.10395 -1.1336
+0.14404 -0.10529 -1.1484
+0.14606 -0.10597 -1.1559
+0.14759 -0.10629 -1.1594
+0.15026 -0.10663 -1.1631
+0.15452 -0.10808 -1.1791
+0.15666 -0.10802 -1.1785
+0.15835 -0.10766 -1.1745
+0.16 -0.10728 -1.1703
+0.16343 -0.10664 -1.1632
+0.1653 -0.10643 -1.1609
+0.16732 -0.10633 -1.1598
+0.20309 -0.10675 -1.1642
+0.20605 -0.10714 -1.1686
+-0.17685 -0.11368 -1.2281
+-0.17566 -0.11366 -1.2279
+-0.17303 -0.11346 -1.2256
+-0.17041 -0.11325 -1.2234
+-0.16919 -0.1132 -1.2229
+-0.16803 -0.1132 -1.2229
+-0.15472 -0.11357 -1.2269
+-0.15357 -0.11357 -1.227
+-0.13111 -0.10485 -1.1318
+-0.12997 -0.10479 -1.1312
+-0.12076 -0.1042 -1.1248
+-0.11915 -0.10373 -1.1195
+-0.11803 -0.10368 -1.119
+-0.11597 -0.10371 -1.1194
+-0.10781 -0.10399 -1.1225
+-0.106 -0.10429 -1.1258
+-0.10387 -0.10428 -1.1256
+-0.054051 -0.10236 -1.1048
+-0.052217 -0.10285 -1.1102
+-0.027163 -0.1117 -1.2069
+-0.024921 -0.11183 -1.2084
+-0.013665 -0.11284 -1.2194
+-0.0114 -0.11315 -1.2228
+-0.0045 -0.11334 -1.2248
+-0.003348 -0.11337 -1.2252
+-0.002195 -0.11339 -1.2254
+0.004731 -0.1135 -1.2266
+0.00706 -0.11382 -1.2301
+0.032611 -0.11408 -1.2329
+0.07079 -0.11578 -1.2514
+0.073415 -0.1162 -1.256
+0.085479 -0.11653 -1.2596
+0.086627 -0.11648 -1.259
+0.08744 -0.11599 -1.2537
+0.088542 -0.11436 -1.2359
+0.090714 -0.11417 -1.2338
+0.10238 -0.11422 -1.2343
+0.10467 -0.11419 -1.234
+0.1056 -0.11394 -1.2312
+0.10654 -0.1137 -1.2286
+0.10504 -0.10418 -1.1246
+0.10607 -0.10416 -1.1243
+0.10813 -0.10409 -1.1236
+0.13822 -0.10443 -1.1271
+0.13967 -0.10472 -1.1303
+0.144 -0.10634 -1.148
+0.14592 -0.10696 -1.1547
+0.14903 -0.10763 -1.1621
+0.15076 -0.10809 -1.1671
+0.15309 -0.10896 -1.1766
+0.15567 -0.10922 -1.1794
+0.15747 -0.10892 -1.1762
+0.20738 -0.10837 -1.1699
+-0.17689 -0.11487 -1.2284
+-0.17452 -0.11483 -1.228
+-0.17214 -0.11479 -1.2276
+-0.16957 -0.11461 -1.2257
+-0.16716 -0.11454 -1.2249
+-0.16259 -0.11457 -1.2253
+-0.15811 -0.11467 -1.2264
+-0.15589 -0.11474 -1.2271
+-0.15356 -0.11472 -1.227
+-0.1524 -0.11472 -1.2269
+-0.13 -0.10589 -1.1314
+-0.1289 -0.10586 -1.1312
+-0.12459 -0.10582 -1.1307
+-0.12243 -0.10579 -1.1305
+-0.12126 -0.1057 -1.1295
+-0.11985 -0.1054 -1.1263
+-0.11705 -0.1048 -1.1197
+-0.11494 -0.1048 -1.1197
+-0.11291 -0.10487 -1.1206
+-0.11089 -0.10495 -1.1214
+-0.10889 -0.10507 -1.1227
+-0.10693 -0.10522 -1.1243
+-0.10498 -0.10539 -1.1262
+-0.10271 -0.10524 -1.1246
+-0.097998 -0.10474 -1.1191
+-0.093604 -0.10454 -1.117
+-0.089313 -0.10445 -1.116
+-0.08495 -0.10426 -1.114
+-0.080709 -0.1042 -1.1134
+-0.076531 -0.10423 -1.1137
+-0.072306 -0.10419 -1.1133
+-0.06802 -0.10406 -1.1119
+-0.063629 -0.10373 -1.1084
+-0.06133 -0.10338 -1.1046
+-0.059186 -0.10328 -1.1034
+-0.055035 -0.10329 -1.1036
+-0.054043 -0.10339 -1.1046
+-0.053133 -0.10364 -1.1074
+-0.051295 -0.10415 -1.1129
+-0.049288 -0.10434 -1.115
+-0.047196 -0.10436 -1.1152
+-0.04303 -0.10446 -1.1162
+-0.03886 -0.10456 -1.1173
+-0.034718 -0.10477 -1.1196
+-0.030625 -0.10521 -1.1244
+-0.02716 -0.11282 -1.2067
+-0.026031 -0.11285 -1.2071
+-0.023828 -0.11318 -1.2107
+-0.019312 -0.11344 -1.2135
+-0.017047 -0.11357 -1.2149
+-0.014793 -0.11384 -1.2178
+-0.013687 -0.11418 -1.2214
+-0.012549 -0.11428 -1.2225
+-0.010255 -0.11437 -1.2235
+-0.005652 -0.11447 -1.2246
+-0.003348 -0.11453 -1.2252
+-0.001042 -0.11456 -1.2255
+0.003574 -0.11459 -1.2259
+0.004732 -0.11467 -1.2267
+0.005902 -0.11496 -1.2299
+0.00823 -0.11513 -1.2317
+0.01286 -0.11507 -1.231
+0.017487 -0.11501 -1.2304
+0.019808 -0.11503 -1.2306
+0.022139 -0.11511 -1.2314
+0.026819 -0.11529 -1.2334
+0.031485 -0.11537 -1.2343
+0.032647 -0.11537 -1.2343
+0.04159 -0.11766 -1.259
+0.043947 -0.11762 -1.2586
+0.046235 -0.11742 -1.2564
+0.050788 -0.11701 -1.252
+0.055412 -0.11682 -1.2499
+0.060114 -0.11681 -1.2498
+0.064838 -0.11685 -1.2502
+0.069518 -0.1168 -1.2497
+0.070723 -0.11685 -1.2502
+0.072045 -0.11708 -1.2527
+0.074628 -0.11744 -1.2566
+0.077165 -0.1177 -1.2594
+0.079531 -0.11769 -1.2593
+0.084274 -0.11769 -1.2593
+0.086608 -0.11764 -1.2588
+0.08733 -0.11702 -1.252
+0.087525 -0.11572 -1.238
+0.089586 -0.11537 -1.2342
+0.091804 -0.11524 -1.2328
+0.096433 -0.11522 -1.2326
+0.10119 -0.11536 -1.234
+0.10357 -0.11542 -1.2346
+0.10442 -0.11508 -1.231
+0.10543 -0.11491 -1.2291
+0.10749 -0.11464 -1.2262
+0.10602 -0.10516 -1.1237
+0.10706 -0.10515 -1.1236
+0.1091 -0.10507 -1.1227
+0.11326 -0.10501 -1.122
+0.11736 -0.10488 -1.1207
+0.12151 -0.10482 -1.12
+0.12576 -0.10484 -1.1202
+0.13008 -0.10492 -1.121
+0.13455 -0.10511 -1.123
+0.13689 -0.10528 -1.1249
+0.13955 -0.1057 -1.1293
+0.14559 -0.1078 -1.1521
+0.14777 -0.10861 -1.1608
+0.15367 -0.11049 -1.1811
+0.15465 -0.1104 -1.1801
+0.1557 -0.11035 -1.1796
+0.15657 -0.11018 -1.1778
+0.15833 -0.10986 -1.1743
+0.16166 -0.10912 -1.1663
+0.16532 -0.10864 -1.1611
+0.16927 -0.10837 -1.1581
+0.17337 -0.1082 -1.1563
+0.17752 -0.10807 -1.1549
+0.18182 -0.10804 -1.1545
+0.18627 -0.1081 -1.1551
+0.19084 -0.10822 -1.1564
+0.1955 -0.10839 -1.1582
+0.20044 -0.1087 -1.1616
+0.20297 -0.10888 -1.1635
+0.20582 -0.10923 -1.1673
+-0.15241 -0.11589 -1.227
+-0.15123 -0.11587 -1.2268
+-0.13007 -0.10701 -1.1321
+-0.12153 -0.10701 -1.132
+-0.12043 -0.10697 -1.1317
+-0.11919 -0.10682 -1.1301
+-0.1166 -0.1064 -1.1256
+-0.11513 -0.10603 -1.1216
+-0.11408 -0.10603 -1.1216
+-0.11201 -0.10608 -1.1221
+-0.054036 -0.10441 -1.1045
+-0.052296 -0.1051 -1.1119
+-0.027163 -0.11397 -1.2068
+-0.024945 -0.11422 -1.2095
+-0.015912 -0.11479 -1.2156
+-0.013686 -0.11532 -1.2213
+-0.011402 -0.11548 -1.223
+0.004741 -0.11605 -1.2292
+0.00708 -0.11646 -1.2335
+0.03265 -0.11654 -1.2344
+0.042765 -0.11882 -1.2587
+0.045091 -0.1187 -1.2575
+0.070709 -0.118 -1.2499
+0.073296 -0.11838 -1.254
+0.087242 -0.11808 -1.2508
+0.10424 -0.11603 -1.2288
+0.1085 -0.11564 -1.2245
+0.10595 -0.10616 -1.123
+0.10802 -0.10611 -1.1225
+0.13802 -0.1064 -1.1255
+0.14095 -0.10701 -1.132
+0.15483 -0.11163 -1.1814
+0.15571 -0.11147 -1.1797
+0.15751 -0.11117 -1.1765
+0.20421 -0.11005 -1.1643
+0.20542 -0.11011 -1.165
+-0.26034 -0.13325 -1.3984
+-0.25902 -0.13325 -1.3984
+-0.25643 -0.13326 -1.3986
+-0.25386 -0.1333 -1.399
+-0.25134 -0.13336 -1.3996
+-0.24889 -0.13346 -1.4007
+-0.24639 -0.13353 -1.4015
+-0.24382 -0.13357 -1.4019
+-0.24256 -0.1336 -1.4022
+-0.1769 -0.11719 -1.2284
+-0.17447 -0.11711 -1.2277
+-0.17216 -0.11711 -1.2277
+-0.16988 -0.11713 -1.2279
+-0.16763 -0.11718 -1.2284
+-0.16516 -0.11707 -1.2272
+-0.16278 -0.11702 -1.2267
+-0.16043 -0.11699 -1.2264
+-0.15585 -0.11702 -1.2268
+-0.15362 -0.11708 -1.2274
+-0.15133 -0.1171 -1.2276
+-0.1501 -0.11704 -1.227
+-0.14883 -0.11695 -1.2261
+-0.13012 -0.10812 -1.1325
+-0.12897 -0.10805 -1.1317
+-0.12682 -0.10804 -1.1317
+-0.12477 -0.1081 -1.1323
+-0.12277 -0.10823 -1.1337
+-0.12074 -0.10832 -1.1347
+-0.11846 -0.1082 -1.1334
+-0.11731 -0.10812 -1.1326
+-0.11596 -0.10785 -1.1297
+-0.11451 -0.10749 -1.1259
+-0.11329 -0.10734 -1.1243
+-0.1111 -0.10728 -1.1236
+-0.10904 -0.10734 -1.1243
+-0.10514 -0.10768 -1.1279
+-0.061372 -0.10554 -1.1054
+-0.059173 -0.10533 -1.1032
+-0.057094 -0.10533 -1.1032
+-0.055035 -0.10537 -1.1036
+-0.054083 -0.10555 -1.1055
+-0.05322 -0.1059 -1.1092
+-0.052355 -0.10627 -1.1131
+-0.051349 -0.10636 -1.1141
+-0.049278 -0.10642 -1.1147
+-0.047191 -0.10645 -1.1151
+-0.045104 -0.10649 -1.1155
+-0.027177 -0.11517 -1.2075
+-0.026067 -0.11529 -1.2088
+-0.023841 -0.11553 -1.2114
+-0.021574 -0.11561 -1.2122
+-0.019304 -0.11568 -1.213
+-0.017052 -0.1159 -1.2153
+-0.01481 -0.11627 -1.2192
+-0.012545 -0.11655 -1.2221
+-0.010251 -0.11663 -1.223
+-0.007952 -0.11669 -1.2237
+-0.003348 -0.11683 -1.2251
+-0.001042 -0.11688 -1.2257
+0.001266 -0.11691 -1.2259
+0.003579 -0.11704 -1.2274
+0.005918 -0.1176 -1.2333
+0.00824 -0.1176 -1.2333
+0.010558 -0.11756 -1.2328
+0.012883 -0.11759 -1.2332
+0.015205 -0.11759 -1.2332
+0.017527 -0.11759 -1.2332
+0.019846 -0.11758 -1.233
+0.029153 -0.11766 -1.2339
+0.031485 -0.11769 -1.2343
+0.032645 -0.11769 -1.2342
+0.042756 -0.11998 -1.2585
+0.043936 -0.11997 -1.2583
+0.046231 -0.11977 -1.2563
+0.048492 -0.11952 -1.2536
+0.062335 -0.11892 -1.2472
+0.067117 -0.11907 -1.2488
+0.069467 -0.11907 -1.2487
+0.071982 -0.11934 -1.2516
+0.074531 -0.11965 -1.2549
+0.077119 -0.12 -1.2586
+0.08653 -0.11991 -1.2576
+0.087188 -0.11919 -1.25
+0.087489 -0.11801 -1.2375
+0.089537 -0.11764 -1.2335
+0.098718 -0.11751 -1.2321
+0.10111 -0.11759 -1.233
+0.10322 -0.11734 -1.2304
+0.10521 -0.11699 -1.2266
+0.10741 -0.11687 -1.2253
+0.10844 -0.11673 -1.2239
+0.10592 -0.10718 -1.1227
+0.10694 -0.10715 -1.1223
+0.109 -0.10709 -1.1217
+0.11106 -0.10704 -1.1211
+0.13677 -0.10731 -1.1239
+0.13795 -0.10741 -1.1249
+0.13928 -0.10762 -1.1271
+0.14089 -0.10803 -1.1315
+0.15456 -0.11336 -1.188
+0.15518 -0.113 -1.1841
+0.15574 -0.11261 -1.1799
+0.15665 -0.11246 -1.1784
+0.15842 -0.11214 -1.175
+0.16002 -0.11171 -1.1704
+0.19311 -0.11045 -1.1569
+0.19789 -0.11069 -1.1594
+0.20033 -0.11083 -1.1609
+0.20274 -0.11095 -1.1622
+0.20395 -0.11101 -1.1628
+-0.26497 -0.13425 -1.3951
+-0.2637 -0.13427 -1.3953
+-0.26245 -0.1343 -1.3956
+-0.2612 -0.13433 -1.3959
+-0.25992 -0.13435 -1.3961
+-0.24241 -0.13484 -1.4013
+-0.17685 -0.11831 -1.2281
+-0.17567 -0.1183 -1.228
+-0.17326 -0.11823 -1.2273
+-0.15018 -0.11826 -1.2277
+-0.14742 -0.1179 -1.2239
+-0.12903 -0.10917 -1.1323
+-0.12796 -0.10916 -1.1322
+-0.12689 -0.10916 -1.1322
+-0.1259 -0.10923 -1.1329
+-0.12492 -0.10931 -1.1337
+-0.124 -0.10944 -1.1351
+-0.12211 -0.10967 -1.1375
+-0.12104 -0.10967 -1.1375
+-0.1199 -0.1096 -1.1369
+-0.1187 -0.10949 -1.1357
+-0.11751 -0.10937 -1.1345
+-0.11487 -0.1089 -1.1295
+-0.11229 -0.10846 -1.1249
+-0.060322 -0.10657 -1.1052
+-0.059221 -0.10646 -1.1041
+-0.058131 -0.10637 -1.1031
+-0.057091 -0.10637 -1.1031
+-0.056067 -0.1064 -1.1035
+-0.054123 -0.10667 -1.1063
+-0.053326 -0.10716 -1.1115
+-0.052363 -0.10734 -1.1133
+-0.0272 -0.1164 -1.2085
+-0.024972 -0.11663 -1.2109
+-0.022709 -0.11671 -1.2118
+-0.021575 -0.11676 -1.2122
+-0.020441 -0.11679 -1.2126
+0.000112 -0.11806 -1.2259
+0.001266 -0.11807 -1.226
+0.002423 -0.11817 -1.2271
+0.00475 -0.11858 -1.2314
+0.007078 -0.11874 -1.2331
+0.030318 -0.11884 -1.2341
+0.031482 -0.11885 -1.2342
+0.042741 -0.12112 -1.258
+0.045089 -0.12107 -1.2574
+0.070683 -0.12031 -1.2495
+0.072003 -0.12055 -1.252
+0.07319 -0.12057 -1.2521
+0.086999 -0.12011 -1.2472
+0.10845 -0.1179 -1.224
+0.10691 -0.10817 -1.1219
+0.10793 -0.10814 -1.1215
+0.13789 -0.10842 -1.1244
+0.14066 -0.10892 -1.1297
+0.15533 -0.11506 -1.194
+0.15565 -0.11446 -1.1878
+0.15587 -0.11381 -1.1809
+0.1576 -0.11345 -1.1772
+0.20134 -0.11187 -1.1604
+0.20247 -0.11189 -1.1606
+-0.26968 -0.13529 -1.3922
+-0.26838 -0.13529 -1.3923
+-0.26582 -0.13532 -1.3926
+-0.26324 -0.13534 -1.3928
+-0.26077 -0.13542 -1.3937
+-0.2582 -0.13545 -1.3939
+-0.25329 -0.13563 -1.3958
+-0.2484 -0.13583 -1.3979
+-0.2435 -0.13603 -1.4
+-0.24104 -0.13613 -1.401
+-0.23981 -0.13617 -1.4015
+-0.17564 -0.11943 -1.2277
+-0.17447 -0.11942 -1.2276
+-0.1721 -0.11939 -1.2273
+-0.1676 -0.11947 -1.2282
+-0.16536 -0.11953 -1.2287
+-0.16304 -0.11952 -1.2287
+-0.15831 -0.11944 -1.2279
+-0.15367 -0.11943 -1.2278
+-0.15136 -0.11944 -1.2279
+-0.149 -0.1194 -1.2274
+-0.14765 -0.11924 -1.2258
+-0.12914 -0.11033 -1.1333
+-0.12725 -0.11054 -1.1355
+-0.12569 -0.11106 -1.1409
+-0.12364 -0.11115 -1.1418
+-0.12113 -0.11082 -1.1384
+-0.11878 -0.11063 -1.1364
+-0.11638 -0.11039 -1.1339
+-0.11361 -0.10978 -1.1276
+-0.11125 -0.10954 -1.1251
+-0.10913 -0.10954 -1.1251
+-0.10714 -0.10968 -1.1266
+-0.10541 -0.11009 -1.1308
+-0.10304 -0.10984 -1.1282
+-0.098175 -0.10916 -1.1212
+-0.09361 -0.10876 -1.1171
+-0.089257 -0.10859 -1.1153
+-0.084904 -0.1084 -1.1134
+-0.080639 -0.10831 -1.1124
+-0.076414 -0.10827 -1.112
+-0.072174 -0.1082 -1.1113
+-0.067947 -0.10814 -1.1107
+-0.06373 -0.10809 -1.1102
+-0.061537 -0.10791 -1.1083
+-0.059381 -0.10779 -1.1071
+-0.057193 -0.1076 -1.1051
+-0.055158 -0.1077 -1.1061
+-0.053335 -0.10823 -1.1117
+-0.051316 -0.10839 -1.1133
+-0.047187 -0.10855 -1.115
+-0.043012 -0.10862 -1.1157
+-0.038849 -0.10874 -1.117
+-0.034702 -0.10894 -1.1191
+-0.030611 -0.1094 -1.1238
+-0.027211 -0.11759 -1.209
+-0.026095 -0.11769 -1.2101
+-0.023842 -0.11782 -1.2114
+-0.021585 -0.11795 -1.2128
+-0.019341 -0.11819 -1.2153
+-0.017102 -0.11853 -1.2188
+-0.014827 -0.1187 -1.2205
+-0.010247 -0.11889 -1.2225
+-0.00795 -0.11896 -1.2233
+-0.00565 -0.11904 -1.224
+-0.003347 -0.1191 -1.2248
+-0.001042 -0.11917 -1.2254
+0.001269 -0.11945 -1.2283
+0.003591 -0.11976 -1.2315
+0.005915 -0.11987 -1.2327
+0.008236 -0.11988 -1.2328
+0.012877 -0.11986 -1.2326
+0.017519 -0.11986 -1.2326
+0.02217 -0.11991 -1.2332
+0.026812 -0.11991 -1.2331
+0.029151 -0.11998 -1.2338
+0.031476 -0.11998 -1.2339
+0.042724 -0.12226 -1.2575
+0.043911 -0.12227 -1.2576
+0.046253 -0.1222 -1.2569
+0.050763 -0.12167 -1.2513
+0.055279 -0.12124 -1.2469
+0.059934 -0.12116 -1.246
+0.064642 -0.12119 -1.2463
+0.069399 -0.1213 -1.2475
+0.071876 -0.12152 -1.2497
+0.074353 -0.12172 -1.2519
+0.077076 -0.1223 -1.2579
+0.079484 -0.12236 -1.2585
+0.084198 -0.12233 -1.2581
+0.086462 -0.12218 -1.2566
+0.087426 -0.12025 -1.2366
+0.089517 -0.11993 -1.2332
+0.091741 -0.11981 -1.2319
+0.096308 -0.11972 -1.2309
+0.10095 -0.11972 -1.231
+0.10523 -0.11932 -1.2268
+0.10738 -0.11914 -1.2249
+0.10948 -0.11892 -1.2226
+0.10687 -0.10919 -1.1215
+0.10892 -0.10913 -1.1208
+0.11309 -0.10907 -1.1202
+0.11729 -0.10905 -1.12
+0.12145 -0.10899 -1.1194
+0.12566 -0.10899 -1.1193
+0.12996 -0.10905 -1.12
+0.13442 -0.10925 -1.122
+0.13669 -0.10937 -1.1233
+0.13914 -0.10963 -1.126
+0.14055 -0.1099 -1.1288
+0.15613 -0.11678 -1.2002
+0.15627 -0.11522 -1.184
+0.15689 -0.11485 -1.1802
+0.15854 -0.11444 -1.1759
+0.1601 -0.11398 -1.171
+0.16169 -0.11354 -1.1665
+0.1654 -0.11307 -1.1616
+0.16926 -0.11273 -1.158
+0.1733 -0.11251 -1.1558
+0.17753 -0.11243 -1.1549
+0.18191 -0.11245 -1.1551
+0.18622 -0.11243 -1.1548
+0.19076 -0.11253 -1.1559
+0.1931 -0.11263 -1.1569
+0.19544 -0.11272 -1.1579
+0.19779 -0.11282 -1.1588
+0.19999 -0.11282 -1.1589
+0.20107 -0.11282 -1.1589
+-0.27445 -0.13637 -1.3898
+-0.273 -0.13629 -1.3891
+-0.2718 -0.13635 -1.3896
+-0.27049 -0.13635 -1.3896
+-0.26923 -0.13637 -1.3899
+-0.26409 -0.13642 -1.3904
+-0.23972 -0.13744 -1.401
+-0.1756 -0.12057 -1.2275
+-0.17329 -0.12056 -1.2275
+-0.14785 -0.12056 -1.2275
+-0.14647 -0.12037 -1.2256
+-0.12948 -0.11169 -1.1362
+-0.12857 -0.11183 -1.1377
+-0.1271 -0.11243 -1.1439
+-0.12494 -0.11243 -1.1439
+-0.12369 -0.11227 -1.1423
+-0.12254 -0.11221 -1.1416
+-0.10817 -0.11071 -1.1262
+-0.10724 -0.11085 -1.1276
+-0.1065 -0.11118 -1.1311
+-0.10444 -0.11126 -1.1319
+-0.060605 -0.10916 -1.1104
+-0.05956 -0.10917 -1.1105
+-0.058513 -0.10916 -1.1105
+-0.057432 -0.1091 -1.1098
+-0.056347 -0.10902 -1.109
+-0.055331 -0.10908 -1.1096
+-0.054375 -0.10926 -1.1115
+-0.052313 -0.10933 -1.1122
+-0.027206 -0.11871 -1.2088
+-0.024957 -0.11884 -1.2101
+-0.006799 -0.12014 -1.2235
+-0.002195 -0.1203 -1.2252
+-0.001042 -0.12043 -1.2265
+0.000112 -0.12065 -1.2288
+0.002431 -0.12089 -1.2312
+0.030299 -0.12109 -1.2333
+0.043902 -0.12342 -1.2573
+0.045085 -0.12343 -1.2573
+0.073038 -0.12267 -1.2495
+0.074228 -0.12269 -1.2497
+0.07544 -0.12275 -1.2503
+0.078251 -0.12347 -1.2577
+0.086945 -0.12238 -1.2464
+0.10684 -0.11022 -1.1212
+0.10787 -0.1102 -1.1209
+0.14041 -0.11086 -1.1277
+0.15677 -0.1184 -1.2052
+0.15697 -0.11603 -1.1808
+0.15778 -0.1158 -1.1785
+0.15851 -0.11553 -1.1757
+0.15932 -0.11532 -1.1735
+0.16008 -0.11506 -1.1708
+0.16098 -0.11492 -1.1693
+0.19193 -0.11367 -1.1564
+0.19421 -0.11373 -1.157
+0.19644 -0.11376 -1.1573
+0.19755 -0.11377 -1.1574
+0.19866 -0.11378 -1.1575
+-0.28141 -0.13724 -1.3854
+-0.28012 -0.13725 -1.3855
+-0.27757 -0.13728 -1.3858
+-0.27508 -0.13733 -1.3864
+-0.27249 -0.13734 -1.3864
+-0.26994 -0.13738 -1.3868
+-0.26755 -0.13749 -1.3879
+-0.26502 -0.13753 -1.3884
+-0.26265 -0.13766 -1.3897
+-0.2602 -0.13774 -1.3905
+-0.25516 -0.13785 -1.3917
+-0.24081 -0.13863 -1.3997
+-0.23962 -0.1387 -1.4004
+-0.17448 -0.12175 -1.2277
+-0.17218 -0.12176 -1.2278
+-0.16986 -0.12175 -1.2278
+-0.1653 -0.1218 -1.2283
+-0.15621 -0.12193 -1.2296
+-0.15393 -0.12196 -1.2299
+-0.15169 -0.12201 -1.2305
+-0.14928 -0.12194 -1.2298
+-0.14697 -0.12195 -1.2299
+-0.12938 -0.11361 -1.1449
+-0.12865 -0.11393 -1.1482
+-0.12658 -0.11402 -1.149
+-0.12536 -0.11389 -1.1478
+-0.12388 -0.11352 -1.144
+-0.12122 -0.11305 -1.1392
+-0.11872 -0.11271 -1.1358
+-0.11627 -0.11242 -1.1328
+-0.11365 -0.11194 -1.1279
+-0.11136 -0.11177 -1.1262
+-0.10922 -0.11175 -1.1261
+-0.10822 -0.11182 -1.1268
+-0.10752 -0.1122 -1.1306
+-0.10679 -0.11255 -1.1342
+-0.10583 -0.11267 -1.1354
+-0.10336 -0.11231 -1.1317
+-0.10064 -0.11166 -1.1251
+-0.098257 -0.11136 -1.1221
+-0.095914 -0.1111 -1.1194
+-0.06169 -0.11028 -1.1111
+-0.059577 -0.11024 -1.1108
+-0.057478 -0.11023 -1.1107
+-0.055392 -0.11025 -1.1109
+-0.053323 -0.1103 -1.1114
+-0.051269 -0.11039 -1.1123
+-0.049224 -0.11051 -1.1135
+-0.032667 -0.11131 -1.1217
+-0.030615 -0.11153 -1.124
+-0.027192 -0.11979 -1.2082
+-0.026068 -0.11985 -1.2088
+-0.023819 -0.11998 -1.2102
+-0.021587 -0.12025 -1.2129
+-0.019389 -0.12078 -1.2183
+-0.017111 -0.1209 -1.2195
+-0.012538 -0.12109 -1.2214
+-0.010244 -0.12116 -1.2222
+-0.007948 -0.12125 -1.223
+-0.0068 -0.1213 -1.2236
+-0.005651 -0.12137 -1.2243
+-0.003352 -0.1216 -1.2267
+-0.001046 -0.12203 -1.231
+0.001272 -0.12207 -1.2314
+0.003592 -0.12213 -1.232
+0.005913 -0.12214 -1.2322
+0.02448 -0.12218 -1.2326
+0.026802 -0.12219 -1.2326
+0.029094 -0.12207 -1.2314
+0.030235 -0.12199 -1.2306
+0.043877 -0.12454 -1.2566
+0.046235 -0.12452 -1.2564
+0.048477 -0.1242 -1.2532
+0.071739 -0.12363 -1.2473
+0.074212 -0.12384 -1.2495
+0.075405 -0.12387 -1.2497
+0.076893 -0.12438 -1.2549
+0.078196 -0.12457 -1.2568
+0.079419 -0.12463 -1.2575
+0.081818 -0.12468 -1.258
+0.086479 -0.12457 -1.2568
+0.087163 -0.12386 -1.2496
+0.087451 -0.12262 -1.2369
+0.08954 -0.12229 -1.2335
+0.091764 -0.12216 -1.2322
+0.09407 -0.12214 -1.232
+0.098628 -0.12204 -1.231
+0.10736 -0.12142 -1.2246
+0.10955 -0.1213 -1.2234
+0.10785 -0.11122 -1.1206
+0.10887 -0.1112 -1.1203
+0.11097 -0.11118 -1.1201
+0.11306 -0.11116 -1.12
+0.11515 -0.11114 -1.1198
+0.13666 -0.11146 -1.123
+0.13903 -0.11167 -1.1251
+0.14038 -0.11189 -1.1274
+0.15733 -0.11996 -1.2095
+0.15762 -0.11932 -1.203
+0.15801 -0.11708 -1.1802
+0.15872 -0.11679 -1.1773
+0.1603 -0.11633 -1.1725
+0.16185 -0.11586 -1.1677
+0.16363 -0.11556 -1.1646
+0.17975 -0.11464 -1.1552
+0.18408 -0.11463 -1.155
+0.18623 -0.11461 -1.1548
+0.18842 -0.11461 -1.1549
+0.19071 -0.11469 -1.1556
+0.19187 -0.11472 -1.156
+0.19299 -0.11475 -1.1562
+0.19524 -0.11479 -1.1567
+0.19623 -0.11473 -1.156
+-0.2847 -0.13824 -1.3823
+-0.28342 -0.13826 -1.3825
+-0.28219 -0.13829 -1.3828
+-0.28095 -0.13832 -1.3831
+-0.27837 -0.13833 -1.3832
+-0.23952 -0.13997 -1.3998
+-0.17453 -0.12294 -1.2281
+-0.17331 -0.12289 -1.2276
+-0.14825 -0.12321 -1.2309
+-0.14712 -0.12323 -1.2311
+-0.12999 -0.11524 -1.1505
+-0.12891 -0.11524 -1.1505
+-0.12782 -0.11524 -1.1505
+-0.12552 -0.11511 -1.1492
+-0.12268 -0.11449 -1.1429
+-0.11989 -0.11388 -1.1367
+-0.11753 -0.11367 -1.1346
+-0.11488 -0.11317 -1.1296
+-0.11253 -0.11295 -1.1273
+-0.10842 -0.11309 -1.1289
+-0.10695 -0.1138 -1.1359
+-0.10486 -0.11385 -1.1365
+-0.10219 -0.11327 -1.1306
+-0.099502 -0.11263 -1.1242
+-0.031649 -0.1125 -1.1231
+-0.027187 -0.1209 -1.2079
+-0.024932 -0.12099 -1.2089
+-0.009097 -0.12236 -1.2227
+-0.00795 -0.12242 -1.2232
+-0.006803 -0.12251 -1.2241
+0.025633 -0.1233 -1.2322
+0.027917 -0.12314 -1.2306
+0.029046 -0.12302 -1.2293
+0.045042 -0.12567 -1.2561
+0.075324 -0.12491 -1.2484
+0.07806 -0.12553 -1.2546
+0.08746 -0.12546 -1.2539
+0.088503 -0.12363 -1.2353
+0.090658 -0.12339 -1.2329
+0.11103 -0.12282 -1.2271
+0.10886 -0.11224 -1.1202
+0.1099 -0.11222 -1.12
+0.11199 -0.1122 -1.1198
+0.14036 -0.11294 -1.1272
+0.15754 -0.12126 -1.2111
+0.15834 -0.121 -1.2085
+0.15863 -0.12036 -1.202
+0.15807 -0.11824 -1.1807
+0.18513 -0.11569 -1.1548
+0.18622 -0.11569 -1.1548
+0.18731 -0.11569 -1.1548
+0.18842 -0.1157 -1.1549
+0.18951 -0.1157 -1.1549
+0.19063 -0.11572 -1.1551
+-0.29049 -0.1392 -1.3789
+-0.28926 -0.13924 -1.3792
+-0.28668 -0.13925 -1.3793
+-0.28545 -0.13928 -1.3796
+-0.28421 -0.13931 -1.38
+-0.28167 -0.13934 -1.3802
+-0.27937 -0.13949 -1.3817
+-0.27679 -0.13949 -1.3818
+-0.27187 -0.13964 -1.3833
+-0.26711 -0.13987 -1.3856
+-0.26461 -0.13993 -1.3862
+-0.26218 -0.14002 -1.3872
+-0.25741 -0.14027 -1.3896
+-0.2526 -0.1405 -1.3919
+-0.24783 -0.14077 -1.3946
+-0.243 -0.14101 -1.3971
+-0.24058 -0.14113 -1.3983
+-0.23822 -0.14129 -1.3999
+-0.17334 -0.12407 -1.2278
+-0.17213 -0.12403 -1.2274
+-0.16977 -0.124 -1.2271
+-0.1675 -0.12403 -1.2274
+-0.16299 -0.12411 -1.2283
+-0.15848 -0.12421 -1.2292
+-0.15392 -0.12427 -1.2299
+-0.14934 -0.12431 -1.2303
+-0.14709 -0.12436 -1.2308
+-0.14593 -0.12436 -1.2308
+-0.12897 -0.11638 -1.151
+-0.12678 -0.11636 -1.1508
+-0.12442 -0.11618 -1.149
+-0.1212 -0.11518 -1.139
+-0.11987 -0.11493 -1.1365
+-0.1187 -0.11484 -1.1356
+-0.11632 -0.1146 -1.1333
+-0.1138 -0.11422 -1.1294
+-0.1115 -0.11404 -1.1277
+-0.10947 -0.11414 -1.1287
+-0.108 -0.11484 -1.1357
+-0.10615 -0.11516 -1.1389
+-0.10508 -0.11516 -1.1389
+-0.1038 -0.11494 -1.1366
+-0.10252 -0.1147 -1.1342
+-0.10088 -0.11406 -1.1278
+-0.098401 -0.11365 -1.1238
+-0.095976 -0.11329 -1.1201
+-0.093672 -0.11305 -1.1178
+-0.089194 -0.11272 -1.1145
+-0.084811 -0.11248 -1.1121
+-0.080531 -0.11236 -1.1109
+-0.076286 -0.11228 -1.1101
+-0.072069 -0.11223 -1.1096
+-0.06789 -0.11224 -1.1097
+-0.063762 -0.11233 -1.1107
+-0.059566 -0.11232 -1.1106
+-0.055359 -0.11228 -1.1102
+-0.051224 -0.11239 -1.1113
+-0.047175 -0.11273 -1.1147
+-0.043046 -0.11292 -1.1166
+-0.038881 -0.11305 -1.1179
+-0.034738 -0.11328 -1.1203
+-0.03268 -0.11347 -1.1221
+-0.031655 -0.11359 -1.1233
+-0.027189 -0.12205 -1.208
+-0.026057 -0.12207 -1.2082
+-0.023799 -0.12216 -1.2092
+-0.021573 -0.12245 -1.212
+-0.019409 -0.12321 -1.2196
+-0.014836 -0.12337 -1.2212
+-0.012547 -0.12347 -1.2223
+-0.010252 -0.12355 -1.2231
+-0.007955 -0.12365 -1.2241
+-0.00566 -0.12386 -1.2261
+-0.003363 -0.1243 -1.2305
+-0.001047 -0.1244 -1.2315
+0.003591 -0.12441 -1.2316
+0.008228 -0.12439 -1.2315
+0.012864 -0.12438 -1.2313
+0.0175 -0.12437 -1.2313
+0.022147 -0.12443 -1.2318
+0.024468 -0.12444 -1.2319
+0.025628 -0.12444 -1.2319
+0.026749 -0.12426 -1.2301
+0.027877 -0.12413 -1.2288
+0.045021 -0.1268 -1.2555
+0.046203 -0.1268 -1.2555
+0.048469 -0.12654 -1.2529
+0.050712 -0.12626 -1.2501
+0.05519 -0.12573 -1.2448
+0.059745 -0.12546 -1.242
+0.064346 -0.12531 -1.2406
+0.069077 -0.12542 -1.2416
+0.074057 -0.12593 -1.2468
+0.076619 -0.12629 -1.2503
+0.079281 -0.12678 -1.2553
+0.084146 -0.12699 -1.2573
+0.086487 -0.12695 -1.2569
+0.087585 -0.12683 -1.2557
+0.088068 -0.12583 -1.2457
+0.088758 -0.12515 -1.2389
+0.089648 -0.12476 -1.235
+0.091844 -0.12459 -1.2333
+0.094137 -0.12455 -1.2329
+0.096433 -0.12452 -1.2326
+0.098592 -0.12431 -1.2305
+0.10068 -0.12403 -1.2277
+0.10521 -0.12391 -1.2265
+0.10755 -0.12396 -1.2269
+0.10997 -0.12407 -1.2281
+0.11126 -0.12423 -1.2296
+0.10884 -0.11327 -1.12
+0.11095 -0.11327 -1.1199
+0.11302 -0.11323 -1.1195
+0.11722 -0.11321 -1.1193
+0.12143 -0.1132 -1.1192
+0.12566 -0.11321 -1.1193
+0.12996 -0.11328 -1.1199
+0.13436 -0.11343 -1.1214
+0.13902 -0.11378 -1.125
+0.14033 -0.11399 -1.127
+0.15753 -0.1224 -1.2111
+0.15865 -0.12238 -1.2109
+0.1591 -0.12185 -1.2057
+0.15909 -0.11929 -1.18
+0.16049 -0.11868 -1.1739
+0.16205 -0.1182 -1.1691
+0.16367 -0.11778 -1.1649
+0.16559 -0.11759 -1.1629
+0.16944 -0.11722 -1.1593
+0.17345 -0.11698 -1.1568
+0.17758 -0.11682 -1.1552
+0.17973 -0.11681 -1.1551
+0.18187 -0.11678 -1.1548
+0.18402 -0.11677 -1.1547
+0.1851 -0.11676 -1.1546
+-0.41984 -0.14257 -1.3997
+-0.29372 -0.14019 -1.3758
+-0.29245 -0.1402 -1.3759
+-0.29122 -0.14023 -1.3762
+-0.28999 -0.14026 -1.3765
+-0.28748 -0.1403 -1.3769
+-0.28488 -0.1403 -1.3769
+-0.28369 -0.14035 -1.3774
+-0.28251 -0.14041 -1.378
+-0.17213 -0.12519 -1.2275
+-0.17093 -0.12516 -1.2271
+-0.16858 -0.12513 -1.2269
+-0.14587 -0.12547 -1.2303
+-0.12791 -0.11749 -1.1512
+-0.12571 -0.11746 -1.1509
+-0.12287 -0.11682 -1.1447
+-0.11997 -0.1161 -1.1375
+-0.11751 -0.1158 -1.1345
+-0.11064 -0.11532 -1.1298
+-0.10904 -0.11588 -1.1354
+-0.10523 -0.1164 -1.1405
+-0.10272 -0.11599 -1.1365
+-0.09968 -0.11496 -1.1263
+-0.097231 -0.11458 -1.1225
+-0.094852 -0.11426 -1.1193
+-0.031675 -0.11472 -1.124
+-0.027189 -0.12319 -1.208
+-0.024932 -0.12328 -1.2089
+-0.011408 -0.12476 -1.2236
+-0.004518 -0.12537 -1.2297
+-0.002206 -0.12554 -1.2314
+0.023304 -0.12557 -1.2317
+0.024462 -0.12557 -1.2316
+0.025577 -0.12535 -1.2295
+0.046193 -0.12795 -1.2552
+0.047345 -0.12787 -1.2544
+0.049587 -0.12757 -1.2514
+0.087566 -0.12798 -1.2554
+0.088908 -0.12653 -1.241
+0.089906 -0.12629 -1.2386
+0.090922 -0.12608 -1.2366
+0.093096 -0.12587 -1.2345
+0.094274 -0.12589 -1.2347
+0.095301 -0.12571 -1.2329
+0.099534 -0.1252 -1.2278
+0.11129 -0.12542 -1.2299
+0.14032 -0.11504 -1.1269
+0.15757 -0.12357 -1.2114
+0.15967 -0.12343 -1.21
+0.15914 -0.12044 -1.1803
+0.15987 -0.12015 -1.1775
+0.1614 -0.11964 -1.1724
+0.18077 -0.11787 -1.1548
+0.18186 -0.11787 -1.1548
+0.18293 -0.11785 -1.1546
+0.27188 -0.14218 -1.3955
+0.27325 -0.14221 -1.3958
+0.2746 -0.14222 -1.396
+0.27591 -0.14222 -1.396
+0.27723 -0.14222 -1.396
+0.29028 -0.14219 -1.3956
+0.29159 -0.14218 -1.3955
+0.29283 -0.14215 -1.3952
+0.29414 -0.14215 -1.3952
+0.29546 -0.14215 -1.3952
+0.29669 -0.14211 -1.3948
+0.29801 -0.14211 -1.3948
+0.29932 -0.14211 -1.3948
+0.3006 -0.1421 -1.3947
+0.30176 -0.14203 -1.394
+0.30316 -0.14207 -1.3944
+0.30586 -0.1421 -1.3947
+0.30717 -0.1421 -1.3947
+0.30849 -0.14211 -1.3948
+0.33725 -0.14206 -1.3943
+0.33848 -0.14202 -1.3939
+-0.41882 -0.14354 -1.3963
+-0.41785 -0.14366 -1.3974
+-0.29956 -0.14118 -1.3728
+-0.29819 -0.14115 -1.3725
+-0.2957 -0.14119 -1.3729
+-0.29448 -0.14122 -1.3732
+-0.29323 -0.14125 -1.3735
+-0.29062 -0.14123 -1.3733
+-0.28822 -0.14132 -1.3742
+-0.28583 -0.14142 -1.3752
+-0.28338 -0.14149 -1.3759
+-0.281 -0.1416 -1.3769
+-0.27857 -0.14168 -1.3777
+-0.26432 -0.14238 -1.3846
+-0.24997 -0.14312 -1.3919
+-0.24512 -0.14334 -1.3942
+-0.24277 -0.1435 -1.3957
+-0.24035 -0.14363 -1.397
+-0.23797 -0.14377 -1.3984
+-0.23548 -0.14386 -1.3993
+-0.17094 -0.12632 -1.2272
+-0.16974 -0.12629 -1.2269
+-0.16738 -0.12625 -1.2265
+-0.16513 -0.1263 -1.227
+-0.147 -0.12661 -1.2301
+-0.14461 -0.12654 -1.2295
+-0.12685 -0.1186 -1.1515
+-0.12573 -0.11857 -1.1512
+-0.12459 -0.11851 -1.1506
+-0.12306 -0.11809 -1.1464
+-0.12126 -0.11739 -1.1396
+-0.11876 -0.11704 -1.1362
+-0.11632 -0.11675 -1.1333
+-0.11402 -0.11657 -1.1316
+-0.11181 -0.1165 -1.1309
+-0.11078 -0.11654 -1.1313
+-0.10992 -0.11675 -1.1333
+-0.10919 -0.11711 -1.1369
+-0.10819 -0.11719 -1.1377
+-0.10628 -0.11745 -1.1403
+-0.10425 -0.11758 -1.1415
+-0.103 -0.11738 -1.1396
+-0.10163 -0.11704 -1.1363
+-0.10014 -0.11656 -1.1315
+-0.098552 -0.11594 -1.1255
+-0.097342 -0.11577 -1.1238
+-0.096077 -0.11552 -1.1213
+-0.093709 -0.11521 -1.1183
+-0.091445 -0.11501 -1.1163
+-0.057433 -0.11434 -1.1098
+-0.055335 -0.11432 -1.1097
+-0.053248 -0.11433 -1.1098
+-0.05121 -0.11445 -1.111
+-0.049205 -0.11466 -1.113
+-0.04722 -0.11494 -1.1157
+-0.04518 -0.1151 -1.1173
+-0.036839 -0.11536 -1.1199
+-0.034765 -0.11548 -1.1211
+-0.032706 -0.11568 -1.123
+-0.031681 -0.1158 -1.1242
+-0.02719 -0.12433 -1.208
+-0.026058 -0.12436 -1.2083
+-0.023821 -0.12456 -1.2103
+-0.021585 -0.12481 -1.2127
+-0.019379 -0.12531 -1.2177
+-0.017119 -0.12555 -1.2201
+-0.014835 -0.12567 -1.2212
+-0.012552 -0.12583 -1.2228
+-0.011409 -0.12592 -1.2237
+-0.01026 -0.12596 -1.2241
+-0.007961 -0.12605 -1.2249
+-0.005662 -0.12623 -1.2267
+-0.003363 -0.12663 -1.2307
+-0.001046 -0.12668 -1.2311
+0.001272 -0.1267 -1.2313
+0.015178 -0.12666 -1.2309
+0.019809 -0.12664 -1.2307
+0.022131 -0.12666 -1.2309
+0.023288 -0.12665 -1.2308
+0.024399 -0.1264 -1.2284
+0.046161 -0.12904 -1.2543
+0.048474 -0.12892 -1.2531
+0.050716 -0.12862 -1.2502
+0.052937 -0.1283 -1.247
+0.061914 -0.12745 -1.2386
+0.064217 -0.12739 -1.238
+0.066526 -0.12735 -1.2376
+0.07132 -0.12759 -1.2399
+0.073819 -0.12787 -1.2427
+0.076381 -0.12824 -1.2464
+0.079065 -0.12879 -1.2518
+0.08167 -0.12919 -1.2556
+0.084111 -0.1293 -1.2568
+0.08646 -0.12928 -1.2565
+0.087544 -0.12913 -1.2551
+0.088174 -0.12833 -1.2472
+0.088941 -0.12775 -1.2415
+0.089993 -0.12758 -1.2398
+0.092051 -0.1272 -1.2361
+0.094257 -0.12703 -1.2345
+0.096442 -0.12685 -1.2327
+0.098552 -0.12658 -1.23
+0.10062 -0.12626 -1.2268
+0.10292 -0.12626 -1.2268
+0.10766 -0.1264 -1.2281
+0.11006 -0.1265 -1.2291
+0.1124 -0.12652 -1.2293
+0.11089 -0.11532 -1.1193
+0.11297 -0.11529 -1.119
+0.11509 -0.1153 -1.1191
+0.13667 -0.11571 -1.123
+0.13907 -0.11594 -1.1253
+0.14031 -0.1161 -1.1268
+0.15773 -0.12483 -1.2126
+0.15885 -0.12482 -1.2125
+0.15983 -0.12469 -1.2112
+0.16055 -0.12437 -1.208
+0.16074 -0.12108 -1.1758
+0.16229 -0.12059 -1.1709
+0.16389 -0.12014 -1.1665
+0.16578 -0.11992 -1.1643
+0.16763 -0.11967 -1.1618
+0.1715 -0.11932 -1.1584
+0.17555 -0.1191 -1.1562
+0.17756 -0.11899 -1.1552
+0.17966 -0.11894 -1.1546
+0.18074 -0.11893 -1.1546
+0.27261 -0.14318 -1.3925
+0.27389 -0.14316 -1.3923
+0.2765 -0.14316 -1.3923
+0.28165 -0.14311 -1.3918
+0.28966 -0.14319 -1.3926
+0.29228 -0.14319 -1.3926
+0.29463 -0.14306 -1.3913
+0.29735 -0.14311 -1.3917
+0.29979 -0.14302 -1.3909
+0.30118 -0.14307 -1.3913
+0.30652 -0.14311 -1.3917
+0.33771 -0.14301 -1.3908
+-0.41882 -0.14486 -1.3963
+-0.41745 -0.14484 -1.3961
+-0.41623 -0.14487 -1.3964
+-0.41513 -0.14494 -1.3971
+-0.30402 -0.14214 -1.3696
+-0.30276 -0.14216 -1.3697
+-0.30151 -0.14218 -1.3699
+-0.30028 -0.14221 -1.3702
+-0.29901 -0.14222 -1.3703
+-0.29638 -0.14219 -1.37
+-0.29392 -0.14225 -1.3706
+-0.29144 -0.1423 -1.3711
+-0.24134 -0.14475 -1.395
+-0.24011 -0.1448 -1.3956
+-0.23884 -0.14483 -1.3958
+-0.23384 -0.14498 -1.3973
+-0.23252 -0.14498 -1.3973
+-0.23117 -0.14496 -1.3971
+-0.22986 -0.14496 -1.3971
+-0.22864 -0.14502 -1.3977
+-0.16979 -0.12748 -1.2272
+-0.16855 -0.12742 -1.2266
+-0.14577 -0.12771 -1.2295
+-0.14456 -0.12766 -1.229
+-0.12457 -0.11958 -1.1504
+-0.12304 -0.11915 -1.1463
+-0.11078 -0.1176 -1.1313
+-0.10917 -0.11816 -1.1367
+-0.10319 -0.11868 -1.1418
+-0.10191 -0.11844 -1.1394
+-0.10048 -0.11803 -1.1354
+-0.099058 -0.11761 -1.1313
+-0.096138 -0.11665 -1.122
+-0.094956 -0.1165 -1.1206
+-0.054286 -0.11536 -1.1096
+-0.05325 -0.11538 -1.1098
+-0.052249 -0.11548 -1.1108
+-0.033748 -0.11668 -1.1225
+-0.032717 -0.11677 -1.1234
+-0.028304 -0.12536 -1.207
+-0.027178 -0.12541 -1.2075
+-0.024933 -0.12556 -1.2089
+-0.020461 -0.12606 -1.2138
+-0.018251 -0.12658 -1.2189
+-0.01597 -0.1267 -1.2201
+-0.011406 -0.12704 -1.2233
+0.020931 -0.12757 -1.2285
+0.022069 -0.12746 -1.2274
+0.046146 -0.13018 -1.2539
+0.047316 -0.13015 -1.2536
+0.048496 -0.13016 -1.2536
+0.049592 -0.12993 -1.2515
+0.077482 -0.1293 -1.2452
+0.07887 -0.12965 -1.2487
+0.080235 -0.12996 -1.2517
+0.082849 -0.13036 -1.2556
+0.087378 -0.13007 -1.2527
+0.0881 -0.1294 -1.2461
+0.088902 -0.12886 -1.2409
+0.090943 -0.12844 -1.2368
+0.11353 -0.12765 -1.2291
+0.11089 -0.11637 -1.1193
+0.1119 -0.11633 -1.1189
+0.13786 -0.11688 -1.1241
+0.13906 -0.117 -1.1253
+0.1579 -0.12612 -1.214
+0.15998 -0.12595 -1.2124
+0.16094 -0.12234 -1.1772
+0.16163 -0.12203 -1.1741
+0.17659 -0.12016 -1.1559
+0.17759 -0.1201 -1.1553
+0.1786 -0.12005 -1.1548
+0.21618 -0.1324 -1.2749
+0.27195 -0.14414 -1.3891
+0.27439 -0.14405 -1.3882
+0.2771 -0.1441 -1.3887
+0.27837 -0.14408 -1.3885
+0.27968 -0.14409 -1.3885
+0.28226 -0.14407 -1.3884
+0.28354 -0.14405 -1.3882
+0.28484 -0.14405 -1.3882
+0.28616 -0.14406 -1.3883
+0.28749 -0.14407 -1.3884
+0.29016 -0.1441 -1.3887
+0.30049 -0.14404 -1.3881
+0.31082 -0.14399 -1.3875
+0.31212 -0.14399 -1.3875
+0.31348 -0.14401 -1.3877
+0.31866 -0.14399 -1.3875
+0.31998 -0.144 -1.3876
+0.32136 -0.14403 -1.3879
+0.3369 -0.14397 -1.3874
+0.33822 -0.14398 -1.3874
+0.33948 -0.14396 -1.3873
+0.34082 -0.14398 -1.3874
+0.34208 -0.14396 -1.3872
+-0.41763 -0.14576 -1.3923
+-0.4169 -0.14596 -1.3942
+-0.41559 -0.14596 -1.3942
+-0.4131 -0.14601 -1.3946
+-0.41077 -0.14611 -1.3956
+-0.40974 -0.14621 -1.3966
+-0.30728 -0.14315 -1.3669
+-0.30473 -0.14316 -1.367
+-0.30218 -0.14317 -1.3671
+-0.29967 -0.14321 -1.3674
+-0.29725 -0.14328 -1.3681
+-0.29478 -0.14333 -1.3686
+-0.2924 -0.14342 -1.3695
+-0.28996 -0.1435 -1.3702
+-0.28532 -0.14375 -1.3727
+-0.28295 -0.14386 -1.3737
+-0.28058 -0.14397 -1.3748
+-0.27581 -0.14418 -1.3769
+-0.27102 -0.1444 -1.3789
+-0.26636 -0.14468 -1.3817
+-0.26161 -0.14493 -1.3841
+-0.25684 -0.14518 -1.3865
+-0.25212 -0.14546 -1.3893
+-0.24966 -0.14555 -1.3902
+-0.24727 -0.14569 -1.3915
+-0.24479 -0.14577 -1.3923
+-0.24223 -0.14581 -1.3926
+-0.23974 -0.14588 -1.3934
+-0.23718 -0.14592 -1.3938
+-0.23462 -0.14596 -1.3941
+-0.232 -0.14596 -1.3942
+-0.22942 -0.14599 -1.3944
+-0.22691 -0.14607 -1.3952
+-0.22158 -0.14601 -1.3946
+-0.21635 -0.14602 -1.3948
+-0.21102 -0.14597 -1.3943
+-0.2058 -0.14599 -1.3945
+-0.20318 -0.14599 -1.3945
+-0.16981 -0.12866 -1.2274
+-0.16747 -0.12863 -1.2272
+-0.16287 -0.12865 -1.2274
+-0.15831 -0.1287 -1.2278
+-0.15374 -0.12875 -1.2283
+-0.14921 -0.12883 -1.2291
+-0.1469 -0.12884 -1.2293
+-0.14451 -0.12877 -1.2286
+-0.14307 -0.12851 -1.2261
+-0.12323 -0.12041 -1.148
+-0.12141 -0.11969 -1.141
+-0.11865 -0.11907 -1.1351
+-0.11626 -0.11882 -1.1327
+-0.11187 -0.11869 -1.1315
+-0.11005 -0.11903 -1.1347
+-0.10815 -0.11929 -1.1372
+-0.10433 -0.11983 -1.1425
+-0.1021 -0.11973 -1.1416
+-0.10082 -0.11949 -1.1392
+-0.099307 -0.11897 -1.1342
+-0.098051 -0.11874 -1.132
+-0.095023 -0.11764 -1.1214
+-0.093858 -0.1175 -1.12
+-0.091516 -0.11721 -1.1172
+-0.089215 -0.11695 -1.1148
+-0.08476 -0.11661 -1.1114
+-0.080431 -0.11641 -1.1095
+-0.076197 -0.11633 -1.1088
+-0.072 -0.1163 -1.1085
+-0.067846 -0.11635 -1.109
+-0.063734 -0.11647 -1.1102
+-0.059568 -0.11651 -1.1106
+-0.057451 -0.11647 -1.1101
+-0.055365 -0.11648 -1.1103
+-0.053386 -0.11673 -1.1127
+-0.051432 -0.11706 -1.1158
+-0.049352 -0.11711 -1.1164
+-0.047316 -0.11728 -1.118
+-0.045273 -0.11745 -1.1196
+-0.04315 -0.11741 -1.1193
+-0.038956 -0.11749 -1.1201
+-0.034798 -0.11771 -1.1222
+-0.032746 -0.11794 -1.1244
+-0.028295 -0.12646 -1.2066
+-0.026039 -0.12654 -1.2074
+-0.023794 -0.12669 -1.2089
+-0.021552 -0.1269 -1.2108
+-0.020441 -0.12708 -1.2126
+-0.01936 -0.12748 -1.2165
+-0.018242 -0.12767 -1.2183
+-0.017101 -0.12772 -1.2187
+-0.014824 -0.12787 -1.2203
+-0.012543 -0.12804 -1.2219
+-0.010254 -0.12819 -1.2233
+-0.007959 -0.12832 -1.2246
+-0.00566 -0.12849 -1.2262
+-0.003357 -0.12871 -1.2283
+-0.001046 -0.12899 -1.2311
+0.003591 -0.12906 -1.2317
+0.008229 -0.12905 -1.2316
+0.012872 -0.1291 -1.2321
+0.015176 -0.12897 -1.2308
+0.017493 -0.12896 -1.2307
+0.01977 -0.1287 -1.2282
+0.020884 -0.12844 -1.2257
+0.047307 -0.13131 -1.2534
+0.048472 -0.13127 -1.253
+0.050682 -0.13089 -1.2493
+0.055135 -0.13029 -1.2436
+0.059551 -0.12971 -1.2379
+0.06399 -0.12926 -1.2336
+0.066258 -0.12916 -1.2326
+0.068666 -0.12932 -1.2341
+0.073603 -0.12983 -1.2391
+0.076019 -0.12997 -1.2404
+0.077338 -0.13023 -1.2429
+0.079979 -0.13072 -1.2476
+0.081473 -0.13123 -1.2526
+0.08407 -0.13161 -1.2562
+0.086397 -0.13155 -1.2556
+0.087287 -0.13111 -1.2514
+0.087896 -0.13027 -1.2432
+0.088776 -0.12984 -1.2391
+0.08978 -0.12961 -1.2369
+0.091788 -0.12916 -1.2325
+0.094106 -0.12915 -1.2325
+0.096366 -0.12907 -1.2317
+0.10067 -0.12864 -1.2275
+0.1052 -0.12853 -1.2264
+0.10997 -0.12871 -1.2281
+0.11232 -0.12875 -1.2285
+0.11352 -0.12879 -1.2289
+0.11189 -0.11737 -1.1187
+0.11294 -0.11737 -1.1187
+0.11506 -0.11739 -1.1188
+0.11717 -0.11738 -1.1188
+0.12142 -0.11742 -1.1191
+0.12571 -0.11748 -1.1197
+0.13006 -0.1176 -1.1208
+0.13443 -0.11772 -1.122
+0.1367 -0.11785 -1.1233
+0.13785 -0.11793 -1.124
+0.13914 -0.11813 -1.1259
+0.15799 -0.12733 -1.2147
+0.15912 -0.12732 -1.2146
+0.1612 -0.12716 -1.213
+0.16174 -0.12322 -1.1749
+0.16253 -0.12298 -1.1726
+0.16404 -0.12246 -1.1676
+0.16586 -0.12218 -1.1649
+0.16957 -0.12169 -1.1601
+0.1715 -0.12151 -1.1584
+0.17349 -0.12137 -1.157
+0.17552 -0.12126 -1.156
+0.17656 -0.12123 -1.1557
+0.21182 -0.13312 -1.2703
+0.21435 -0.13321 -1.2712
+0.21685 -0.13327 -1.2718
+0.27126 -0.14508 -1.3855
+0.27257 -0.14508 -1.3856
+0.27509 -0.14504 -1.3851
+0.27775 -0.14507 -1.3854
+0.28033 -0.14505 -1.3852
+0.28291 -0.14504 -1.3851
+0.28559 -0.14508 -1.3855
+0.28797 -0.14497 -1.3844
+0.29081 -0.14508 -1.3855
+0.29587 -0.145 -1.3847
+0.29856 -0.14505 -1.3851
+0.29981 -0.14502 -1.3849
+0.31018 -0.145 -1.3846
+0.31142 -0.14497 -1.3844
+0.31283 -0.14502 -1.3848
+0.31796 -0.14498 -1.3845
+0.31924 -0.14497 -1.3844
+0.32057 -0.14498 -1.3845
+0.34003 -0.14494 -1.3841
+0.34129 -0.14493 -1.384
+0.34906 -0.14491 -1.3838
+-0.41687 -0.1468 -1.3897
+-0.41605 -0.14697 -1.3913
+-0.41488 -0.14702 -1.3918
+-0.41362 -0.14704 -1.392
+-0.41109 -0.14707 -1.3922
+-0.40872 -0.14716 -1.3931
+-0.4076 -0.14723 -1.3937
+-0.40634 -0.14725 -1.3939
+-0.40522 -0.14732 -1.3946
+-0.40391 -0.14732 -1.3946
+-0.4026 -0.14732 -1.3946
+-0.40116 -0.14727 -1.3941
+-0.31292 -0.14408 -1.3634
+-0.31164 -0.14408 -1.3634
+-0.31037 -0.14408 -1.3635
+-0.3091 -0.14409 -1.3635
+-0.30785 -0.14411 -1.3637
+-0.30537 -0.14414 -1.3641
+-0.30297 -0.14422 -1.3648
+-0.30169 -0.14423 -1.3648
+-0.30045 -0.14425 -1.3651
+-0.25067 -0.14669 -1.3885
+-0.24943 -0.14673 -1.3889
+-0.24815 -0.14675 -1.389
+-0.24306 -0.14682 -1.3898
+-0.24049 -0.14686 -1.3901
+-0.23795 -0.1469 -1.3905
+-0.23019 -0.14696 -1.3911
+-0.22765 -0.14701 -1.3916
+-0.20393 -0.1469 -1.3906
+-0.20267 -0.14693 -1.391
+-0.16864 -0.1298 -1.2273
+-0.14317 -0.12976 -1.227
+-0.14176 -0.12953 -1.2248
+-0.11998 -0.12041 -1.1376
+-0.11863 -0.12012 -1.1349
+-0.1174 -0.11996 -1.1334
+-0.101 -0.12079 -1.1414
+-0.099703 -0.12052 -1.1388
+-0.098288 -0.1201 -1.1348
+-0.092697 -0.11843 -1.1188
+-0.090417 -0.1182 -1.1166
+-0.056499 -0.11771 -1.112
+-0.055536 -0.11789 -1.1137
+-0.05452 -0.11796 -1.1144
+-0.053496 -0.11802 -1.115
+-0.052466 -0.11807 -1.1155
+-0.028274 -0.1275 -1.2057
+-0.02714 -0.12751 -1.2058
+-0.026007 -0.12752 -1.2059
+-0.024897 -0.12765 -1.2071
+-0.023782 -0.12777 -1.2082
+-0.022651 -0.12781 -1.2086
+-0.021528 -0.12789 -1.2095
+-0.020408 -0.12801 -1.2106
+-0.018211 -0.1286 -1.2162
+-0.017092 -0.12879 -1.2181
+-0.01595 -0.12884 -1.2185
+-0.014817 -0.12896 -1.2196
+-0.013676 -0.12903 -1.2203
+-0.012535 -0.12911 -1.2211
+-0.011392 -0.12919 -1.2219
+-0.009103 -0.12935 -1.2234
+-0.006808 -0.12952 -1.225
+0.047289 -0.13244 -1.2529
+0.048451 -0.1324 -1.2525
+0.049582 -0.13226 -1.2512
+0.074746 -0.13096 -1.2386
+0.075912 -0.13096 -1.2386
+0.078222 -0.13092 -1.2383
+0.082764 -0.13259 -1.2543
+0.085222 -0.13274 -1.2557
+0.087249 -0.13223 -1.2508
+0.088623 -0.13078 -1.237
+0.090632 -0.13033 -1.2326
+0.11352 -0.12995 -1.2289
+0.11468 -0.12996 -1.229
+0.11294 -0.11842 -1.1187
+0.11399 -0.11842 -1.1187
+0.1161 -0.11843 -1.1187
+0.13789 -0.11903 -1.1244
+0.15704 -0.12864 -1.2162
+0.15803 -0.12851 -1.215
+0.16231 -0.12828 -1.2127
+0.16266 -0.12418 -1.1735
+0.16337 -0.12388 -1.1707
+0.16492 -0.12339 -1.166
+0.17061 -0.12274 -1.1598
+0.17155 -0.12263 -1.1587
+0.17246 -0.1225 -1.1574
+0.17348 -0.12245 -1.157
+0.17452 -0.12242 -1.1567
+0.20637 -0.13312 -1.2589
+0.20796 -0.13337 -1.2613
+0.20972 -0.13374 -1.2648
+0.21259 -0.13405 -1.2678
+0.21496 -0.13404 -1.2677
+0.2162 -0.13407 -1.2679
+0.22148 -0.13438 -1.2708
+0.2706 -0.14603 -1.3821
+0.27322 -0.14604 -1.3822
+0.29908 -0.14597 -1.3815
+0.30036 -0.14596 -1.3814
+0.30164 -0.14595 -1.3813
+0.30295 -0.14596 -1.3814
+0.30814 -0.14595 -1.3813
+0.30945 -0.14596 -1.3813
+0.31204 -0.14595 -1.3813
+0.31714 -0.14591 -1.3809
+0.31974 -0.1459 -1.3809
+0.34043 -0.14586 -1.3805
+0.34821 -0.14586 -1.3804
+0.34951 -0.14586 -1.3805
+0.35855 -0.14584 -1.3803
+0.35984 -0.14583 -1.3802
+0.36107 -0.14581 -1.38
+0.36224 -0.14575 -1.3795
+-0.41635 -0.14792 -1.388
+-0.41502 -0.14791 -1.3879
+-0.41409 -0.14805 -1.3891
+-0.41171 -0.14813 -1.3899
+-0.40921 -0.14817 -1.3903
+-0.40671 -0.14821 -1.3907
+-0.40413 -0.14823 -1.3908
+-0.40144 -0.1482 -1.3905
+-0.31735 -0.14504 -1.3604
+-0.31606 -0.14503 -1.3603
+-0.31358 -0.14507 -1.3607
+-0.311 -0.14506 -1.3606
+-0.30849 -0.14508 -1.3608
+-0.30604 -0.14514 -1.3613
+-0.30372 -0.14526 -1.3624
+-0.30137 -0.14536 -1.3634
+-0.30012 -0.14537 -1.3635
+-0.29892 -0.14541 -1.3639
+-0.29664 -0.14555 -1.3653
+-0.29203 -0.14582 -1.3678
+-0.28255 -0.14624 -1.3718
+-0.27782 -0.14647 -1.374
+-0.26843 -0.14699 -1.3789
+-0.25404 -0.14768 -1.3854
+-0.25158 -0.14776 -1.3863
+-0.24904 -0.1478 -1.3867
+-0.24779 -0.14784 -1.387
+-0.24645 -0.14782 -1.3868
+-0.24395 -0.14788 -1.3874
+-0.24268 -0.1479 -1.3876
+-0.24133 -0.14787 -1.3874
+-0.24015 -0.14795 -1.3881
+-0.23884 -0.14795 -1.3881
+-0.23619 -0.14793 -1.3879
+-0.23362 -0.14795 -1.3881
+-0.23099 -0.14794 -1.388
+-0.22979 -0.14801 -1.3887
+-0.22842 -0.14797 -1.3883
+-0.22583 -0.14798 -1.3884
+-0.22317 -0.14795 -1.3881
+-0.20741 -0.14788 -1.3876
+-0.20478 -0.14787 -1.3874
+-0.20218 -0.14788 -1.3876
+-0.20094 -0.14793 -1.388
+-0.16967 -0.13086 -1.2264
+-0.16747 -0.13094 -1.2271
+-0.16514 -0.13093 -1.2271
+-0.16282 -0.13092 -1.227
+-0.16061 -0.13101 -1.2278
+-0.15827 -0.13098 -1.2276
+-0.15596 -0.13098 -1.2276
+-0.14686 -0.13112 -1.2289
+-0.14451 -0.13109 -1.2286
+-0.14188 -0.1308 -1.2259
+-0.14056 -0.13064 -1.2243
+-0.13936 -0.13059 -1.2239
+-0.11737 -0.121 -1.1331
+-0.11621 -0.12091 -1.1322
+-0.11405 -0.12088 -1.132
+-0.11204 -0.12101 -1.1332
+-0.11009 -0.12121 -1.1351
+-0.10615 -0.1216 -1.1388
+-0.10425 -0.12189 -1.1415
+-0.10226 -0.12209 -1.1434
+-0.10119 -0.12209 -1.1435
+-0.099899 -0.12183 -1.141
+-0.092688 -0.11947 -1.1187
+-0.091569 -0.11938 -1.1179
+-0.090481 -0.11934 -1.1174
+-0.089297 -0.11916 -1.1158
+-0.087012 -0.11892 -1.1134
+-0.057577 -0.11882 -1.1126
+-0.055569 -0.11901 -1.1144
+-0.053495 -0.11907 -1.115
+-0.05142 -0.11913 -1.1156
+-0.049344 -0.1192 -1.1162
+-0.045298 -0.11963 -1.1203
+-0.036918 -0.11984 -1.1223
+-0.034854 -0.12002 -1.124
+-0.032804 -0.12027 -1.1264
+-0.020357 -0.12883 -1.2076
+-0.019261 -0.12911 -1.2101
+-0.011384 -0.13025 -1.2209
+-0.010241 -0.13033 -1.2217
+-0.009096 -0.1304 -1.2224
+-0.007952 -0.13052 -1.2235
+-0.005656 -0.1307 -1.2252
+-0.003353 -0.13088 -1.2269
+-0.001046 -0.13131 -1.231
+0.001272 -0.13136 -1.2315
+0.010576 -0.13172 -1.2349
+0.012908 -0.13179 -1.2355
+0.015244 -0.13187 -1.2364
+0.017589 -0.132 -1.2376
+0.049572 -0.13342 -1.251
+0.050667 -0.1332 -1.2489
+0.052869 -0.13283 -1.2453
+0.066139 -0.13124 -1.2303
+0.070938 -0.13155 -1.2332
+0.073408 -0.13181 -1.2357
+0.075898 -0.1321 -1.2384
+0.077016 -0.13202 -1.2376
+0.078182 -0.13202 -1.2376
+0.079372 -0.13206 -1.238
+0.082658 -0.1336 -1.2526
+0.083974 -0.13382 -1.2547
+0.08518 -0.13386 -1.2551
+0.086356 -0.13385 -1.255
+0.087175 -0.1333 -1.2497
+0.087572 -0.13212 -1.2386
+0.089482 -0.1315 -1.2327
+0.091739 -0.13141 -1.2318
+0.094052 -0.1314 -1.2317
+0.11234 -0.13108 -1.2287
+0.11465 -0.13108 -1.2286
+0.11398 -0.11947 -1.1186
+0.11503 -0.11947 -1.1186
+0.11718 -0.11951 -1.1189
+0.11927 -0.11949 -1.1188
+0.13227 -0.1198 -1.1217
+0.13678 -0.12004 -1.1239
+0.1392 -0.1203 -1.1264
+0.15705 -0.12979 -1.2163
+0.15915 -0.12963 -1.2147
+0.16132 -0.12954 -1.2139
+0.16243 -0.12951 -1.2136
+0.16351 -0.12509 -1.1717
+0.16429 -0.12484 -1.1693
+0.16597 -0.12445 -1.1656
+0.16781 -0.12419 -1.1631
+0.1697 -0.12397 -1.1611
+0.2037 -0.13411 -1.257
+0.20491 -0.13412 -1.2571
+0.20769 -0.13439 -1.2597
+0.21086 -0.1349 -1.2645
+0.21218 -0.13498 -1.2653
+0.21321 -0.13488 -1.2643
+0.21435 -0.13485 -1.264
+0.21554 -0.13485 -1.264
+0.2171 -0.13508 -1.2662
+0.21852 -0.13522 -1.2675
+0.21972 -0.13522 -1.2675
+0.22104 -0.1353 -1.2683
+0.22225 -0.13531 -1.2683
+0.26869 -0.147 -1.379
+0.27131 -0.14701 -1.3791
+0.27389 -0.147 -1.379
+0.27646 -0.14699 -1.3789
+0.28155 -0.14694 -1.3784
+0.28659 -0.14686 -1.3777
+0.29704 -0.1469 -1.378
+0.29969 -0.14693 -1.3783
+0.30101 -0.14694 -1.3784
+0.30229 -0.14694 -1.3783
+0.30356 -0.14692 -1.3782
+0.3048 -0.14689 -1.3779
+0.30611 -0.1469 -1.378
+0.30743 -0.14691 -1.3781
+0.31003 -0.14691 -1.3781
+0.31132 -0.14691 -1.3781
+0.31637 -0.14685 -1.3775
+0.31764 -0.14683 -1.3774
+0.32022 -0.14683 -1.3773
+0.32273 -0.1468 -1.377
+0.32404 -0.1468 -1.377
+0.32935 -0.14686 -1.3776
+0.33837 -0.14683 -1.3774
+0.34087 -0.14679 -1.377
+0.34612 -0.14682 -1.3772
+0.34741 -0.14682 -1.3772
+0.34871 -0.14682 -1.3773
+0.359 -0.14679 -1.377
+0.36149 -0.14675 -1.3766
+-0.41531 -0.14886 -1.3845
+-0.41429 -0.14896 -1.3854
+-0.41315 -0.14901 -1.3859
+-0.41204 -0.14909 -1.3866
+-0.4095 -0.14911 -1.3868
+-0.4016 -0.14908 -1.3865
+-0.40023 -0.14906 -1.3863
+-0.32173 -0.14598 -1.3572
+-0.32045 -0.14598 -1.3572
+-0.31918 -0.14599 -1.3572
+-0.31796 -0.14601 -1.3575
+-0.31674 -0.14604 -1.3577
+-0.31415 -0.14602 -1.3576
+-0.29985 -0.14653 -1.3623
+-0.24727 -0.14883 -1.384
+-0.24219 -0.14891 -1.3848
+-0.23956 -0.1489 -1.3847
+-0.23694 -0.14888 -1.3846
+-0.22914 -0.14889 -1.3847
+-0.22653 -0.14889 -1.3847
+-0.20037 -0.14881 -1.384
+-0.199 -0.14876 -1.3836
+-0.16832 -0.13186 -1.2249
+-0.16734 -0.132 -1.2262
+-0.16627 -0.13207 -1.2269
+-0.16514 -0.13209 -1.227
+-0.16398 -0.13209 -1.227
+-0.16282 -0.13208 -1.227
+-0.16167 -0.13208 -1.227
+-0.1594 -0.13212 -1.2273
+-0.14059 -0.13182 -1.2246
+-0.11623 -0.12199 -1.1324
+-0.11513 -0.12195 -1.132
+-0.11309 -0.12205 -1.133
+-0.10325 -0.12306 -1.1424
+-0.1023 -0.12321 -1.1439
+-0.092655 -0.12048 -1.1182
+-0.090418 -0.12031 -1.1166
+-0.035907 -0.12106 -1.1238
+-0.007943 -0.13153 -1.2221
+-0.0068 -0.13167 -1.2235
+0.018763 -0.13323 -1.2382
+0.049548 -0.13453 -1.2503
+0.074456 -0.13277 -1.2338
+0.075594 -0.13273 -1.2334
+0.076761 -0.13274 -1.2335
+0.079261 -0.13304 -1.2363
+0.086239 -0.13485 -1.2533
+0.086964 -0.13415 -1.2467
+0.08842 -0.13281 -1.2341
+0.090564 -0.13255 -1.2316
+0.11575 -0.13217 -1.228
+0.11401 -0.12055 -1.1188
+0.11611 -0.12055 -1.1188
+0.13802 -0.12126 -1.1254
+0.15603 -0.13104 -1.2173
+0.15812 -0.13087 -1.2156
+0.16243 -0.13066 -1.2136
+0.1637 -0.12635 -1.1731
+0.16442 -0.12604 -1.1703
+0.16517 -0.12578 -1.1677
+0.20105 -0.1351 -1.2552
+0.20231 -0.13515 -1.2557
+0.20359 -0.13522 -1.2563
+0.20603 -0.13527 -1.2567
+0.21152 -0.13575 -1.2613
+0.21256 -0.13566 -1.2604
+0.21813 -0.13617 -1.2652
+0.21943 -0.13624 -1.2658
+0.22184 -0.13625 -1.266
+0.22307 -0.13628 -1.2662
+0.22435 -0.13633 -1.2667
+0.22584 -0.13651 -1.2684
+0.29765 -0.14786 -1.3748
+0.29895 -0.14786 -1.3748
+0.30411 -0.14785 -1.3748
+0.30527 -0.14779 -1.3742
+0.30802 -0.14787 -1.3749
+0.31061 -0.14787 -1.3749
+0.31184 -0.14784 -1.3746
+0.31307 -0.14781 -1.3743
+0.31435 -0.1478 -1.3743
+0.31564 -0.1478 -1.3742
+0.31819 -0.14779 -1.3741
+0.32339 -0.1478 -1.3742
+0.32468 -0.1478 -1.3742
+0.32594 -0.14778 -1.3741
+0.32724 -0.14779 -1.3741
+0.32855 -0.1478 -1.3742
+0.33882 -0.14776 -1.3739
+0.34007 -0.14774 -1.3737
+0.34528 -0.14776 -1.3739
+0.35028 -0.14769 -1.3732
+0.35938 -0.14771 -1.3734
+0.36187 -0.14767 -1.3731
+0.36308 -0.14764 -1.3728
+0.36436 -0.14763 -1.3727
+0.3708 -0.14763 -1.3727
+-0.41451 -0.14987 -1.3818
+-0.41312 -0.14984 -1.3815
+-0.41248 -0.15007 -1.3837
+-0.4099 -0.15008 -1.3837
+-0.40735 -0.1501 -1.3839
+-0.40489 -0.15016 -1.3844
+-0.40199 -0.15005 -1.3834
+-0.40039 -0.14993 -1.3823
+-0.39009 -0.14948 -1.378
+-0.38736 -0.14942 -1.3775
+-0.38478 -0.14943 -1.3775
+-0.36873 -0.14923 -1.3756
+-0.32484 -0.14694 -1.3542
+-0.32236 -0.14697 -1.3545
+-0.3197 -0.14692 -1.354
+-0.31727 -0.14697 -1.3545
+-0.31496 -0.14708 -1.3555
+-0.31258 -0.14716 -1.3563
+-0.30783 -0.14733 -1.3579
+-0.30316 -0.14755 -1.3599
+-0.30082 -0.14766 -1.3609
+-0.29847 -0.14776 -1.3619
+-0.29374 -0.14796 -1.3637
+-0.28902 -0.14818 -1.3657
+-0.28453 -0.14851 -1.3689
+-0.27978 -0.14873 -1.3709
+-0.27745 -0.14886 -1.3721
+-0.27507 -0.14897 -1.3731
+-0.27042 -0.14926 -1.3758
+-0.26798 -0.14934 -1.3766
+-0.2656 -0.14946 -1.3777
+-0.26076 -0.14966 -1.3796
+-0.25574 -0.14976 -1.3805
+-0.25062 -0.1498 -1.3809
+-0.24811 -0.14985 -1.3815
+-0.24552 -0.14986 -1.3815
+-0.243 -0.14991 -1.382
+-0.2403 -0.14985 -1.3814
+-0.23771 -0.14985 -1.3814
+-0.23511 -0.14985 -1.3815
+-0.22985 -0.14981 -1.3811
+-0.22728 -0.14983 -1.3813
+-0.22454 -0.14974 -1.3804
+-0.21944 -0.1498 -1.381
+-0.21422 -0.14978 -1.3809
+-0.20903 -0.14979 -1.381
+-0.20645 -0.1498 -1.3811
+-0.20382 -0.14978 -1.3809
+-0.2012 -0.14977 -1.3808
+-0.16052 -0.13325 -1.2271
+-0.15936 -0.13325 -1.2271
+-0.15827 -0.1333 -1.2276
+-0.15603 -0.13336 -1.2282
+-0.15372 -0.13336 -1.2282
+-0.14911 -0.13338 -1.2283
+-0.14452 -0.13341 -1.2286
+-0.14213 -0.13334 -1.228
+-0.13947 -0.13301 -1.2249
+-0.13689 -0.13274 -1.2224
+-0.11516 -0.12305 -1.1323
+-0.11417 -0.12314 -1.1331
+-0.11213 -0.12325 -1.1341
+-0.10811 -0.12354 -1.1368
+-0.10416 -0.12394 -1.1406
+-0.10216 -0.12412 -1.1422
+-0.093664 -0.12148 -1.1177
+-0.091457 -0.12134 -1.1165
+-0.089274 -0.12124 -1.1155
+-0.084807 -0.12087 -1.112
+-0.080423 -0.12058 -1.1094
+-0.076164 -0.12046 -1.1083
+-0.071974 -0.12044 -1.1081
+-0.067846 -0.12053 -1.109
+-0.063764 -0.12072 -1.1107
+-0.059756 -0.12108 -1.1141
+-0.05766 -0.12109 -1.1142
+-0.055566 -0.12111 -1.1144
+-0.053478 -0.12114 -1.1146
+-0.051473 -0.12136 -1.1167
+-0.049461 -0.12159 -1.1189
+-0.047403 -0.12172 -1.1201
+-0.043222 -0.12184 -1.1212
+-0.039051 -0.12202 -1.1228
+-0.036968 -0.12212 -1.1239
+-0.035939 -0.12223 -1.1248
+-0.034911 -0.12234 -1.1259
+-0.00793 -0.13247 -1.2202
+-0.005647 -0.1328 -1.2233
+-0.003349 -0.13302 -1.2253
+-0.001045 -0.13347 -1.2295
+0.00359 -0.13367 -1.2313
+0.008242 -0.1339 -1.2335
+0.012904 -0.13407 -1.2351
+0.015239 -0.13416 -1.236
+0.01758 -0.13426 -1.2369
+0.018745 -0.13427 -1.2369
+0.049517 -0.13563 -1.2496
+0.050661 -0.13554 -1.2487
+0.055093 -0.13488 -1.2426
+0.059433 -0.13411 -1.2354
+0.063727 -0.13336 -1.2285
+0.068396 -0.13345 -1.2292
+0.073189 -0.13374 -1.232
+0.075578 -0.13387 -1.2331
+0.077882 -0.13384 -1.2328
+0.079208 -0.13412 -1.2354
+0.086731 -0.13496 -1.2433
+0.087342 -0.1341 -1.2353
+0.088284 -0.13377 -1.2322
+0.08937 -0.13366 -1.2311
+0.091653 -0.13361 -1.2306
+0.09616 -0.13343 -1.229
+0.10057 -0.13313 -1.2262
+0.10516 -0.1331 -1.2259
+0.10996 -0.13332 -1.2279
+0.11224 -0.13328 -1.2276
+0.11447 -0.13319 -1.2267
+0.11662 -0.13301 -1.225
+0.11504 -0.12159 -1.1186
+0.11717 -0.12161 -1.1188
+0.12148 -0.12169 -1.1196
+0.12585 -0.12184 -1.1209
+0.1302 -0.12196 -1.122
+0.1324 -0.12203 -1.1227
+0.13461 -0.12212 -1.1236
+0.13691 -0.12228 -1.125
+0.13812 -0.12241 -1.1262
+0.15596 -0.13213 -1.2167
+0.15701 -0.13205 -1.2159
+0.15912 -0.1319 -1.2146
+0.16128 -0.1318 -1.2136
+0.16356 -0.13179 -1.2135
+0.19842 -0.1361 -1.2535
+0.1997 -0.13617 -1.2542
+0.20218 -0.13625 -1.2549
+0.20448 -0.13621 -1.2545
+0.20692 -0.13626 -1.255
+0.20954 -0.13642 -1.2565
+0.21186 -0.13639 -1.2562
+0.21281 -0.13625 -1.2548
+0.21898 -0.13715 -1.2632
+0.22032 -0.13724 -1.2641
+0.22266 -0.13722 -1.2638
+0.22518 -0.13731 -1.2647
+0.22645 -0.13735 -1.2651
+0.22788 -0.1375 -1.2664
+0.26739 -0.14887 -1.3722
+0.2727 -0.14895 -1.373
+0.27777 -0.1489 -1.3724
+0.28281 -0.14883 -1.3719
+0.28781 -0.14875 -1.3711
+0.29303 -0.14878 -1.3713
+0.2956 -0.14877 -1.3713
+0.29823 -0.1488 -1.3715
+0.30338 -0.14879 -1.3714
+0.3059 -0.14876 -1.3711
+0.30867 -0.14885 -1.372
+0.31115 -0.1488 -1.3716
+0.31367 -0.14878 -1.3713
+0.31612 -0.14871 -1.3707
+0.31873 -0.14873 -1.3708
+0.32126 -0.14871 -1.3706
+0.32391 -0.14874 -1.3709
+0.32637 -0.14868 -1.3704
+0.32901 -0.14871 -1.3707
+0.33154 -0.14869 -1.3705
+0.33803 -0.14871 -1.3706
+0.33927 -0.14869 -1.3704
+0.34055 -0.14868 -1.3704
+0.3418 -0.14866 -1.3703
+0.34311 -0.14867 -1.3703
+0.34441 -0.14868 -1.3704
+0.34946 -0.14863 -1.37
+0.35078 -0.14865 -1.3701
+0.35206 -0.14864 -1.3701
+0.35718 -0.14863 -1.3699
+0.35974 -0.14862 -1.3699
+0.36239 -0.14865 -1.3702
+0.36359 -0.14861 -1.3698
+0.36997 -0.14859 -1.3696
+0.37128 -0.1486 -1.3697
+-0.41339 -0.15076 -1.378
+-0.41247 -0.1509 -1.3793
+-0.41121 -0.15091 -1.3794
+-0.41007 -0.15097 -1.3799
+-0.40892 -0.15102 -1.3804
+-0.40764 -0.15103 -1.3805
+-0.40638 -0.15105 -1.3806
+-0.40508 -0.15105 -1.3806
+-0.40372 -0.15102 -1.3804
+-0.40234 -0.15099 -1.3801
+-0.40052 -0.1508 -1.3783
+-0.39916 -0.15077 -1.378
+-0.38746 -0.15026 -1.3732
+-0.38466 -0.15017 -1.3724
+-0.382 -0.15014 -1.3721
+-0.38061 -0.1501 -1.3718
+-0.37925 -0.15007 -1.3715
+-0.37794 -0.15007 -1.3714
+-0.37665 -0.15007 -1.3714
+-0.37551 -0.15013 -1.372
+-0.37422 -0.15013 -1.372
+-0.37283 -0.15009 -1.3716
+-0.37157 -0.1501 -1.3717
+-0.37025 -0.15009 -1.3716
+-0.36903 -0.15012 -1.3718
+-0.36773 -0.15011 -1.3718
+-0.3279 -0.14787 -1.351
+-0.32675 -0.14792 -1.3515
+-0.32548 -0.14792 -1.3515
+-0.32285 -0.14788 -1.3511
+-0.31789 -0.14794 -1.3517
+-0.31669 -0.14798 -1.352
+-0.31569 -0.1481 -1.3532
+-0.31334 -0.14819 -1.354
+-0.27601 -0.15007 -1.3714
+-0.26886 -0.1504 -1.3744
+-0.26773 -0.15049 -1.3753
+-0.26652 -0.15054 -1.3758
+-0.20467 -0.15074 -1.3778
+-0.20337 -0.15074 -1.3778
+-0.20206 -0.15074 -1.3777
+-0.15829 -0.13447 -1.2277
+-0.15716 -0.13449 -1.2279
+-0.15487 -0.13451 -1.2281
+-0.13839 -0.13424 -1.2256
+-0.13571 -0.13387 -1.2222
+-0.11524 -0.12421 -1.1331
+-0.11321 -0.12433 -1.1342
+-0.09361 -0.12246 -1.117
+-0.092472 -0.12235 -1.116
+-0.090175 -0.12209 -1.1136
+-0.05872 -0.12216 -1.1144
+-0.057651 -0.12212 -1.114
+-0.056601 -0.12212 -1.114
+-0.038028 -0.12319 -1.1239
+-0.036996 -0.12328 -1.1247
+-0.006777 -0.13353 -1.2193
+-0.004495 -0.13394 -1.2232
+-0.002198 -0.13433 -1.2267
+0.016403 -0.13532 -1.2359
+0.017563 -0.1353 -1.2357
+0.049505 -0.13677 -1.2492
+0.079014 -0.13495 -1.2324
+0.086517 -0.1358 -1.2402
+0.088232 -0.13485 -1.2314
+0.090452 -0.1347 -1.2301
+0.11762 -0.13398 -1.2234
+0.11612 -0.12266 -1.1188
+0.13354 -0.12317 -1.1235
+0.13583 -0.12332 -1.1248
+0.13699 -0.12341 -1.1256
+0.15597 -0.13328 -1.2168
+0.15805 -0.13311 -1.2151
+0.19548 -0.13688 -1.2498
+0.19695 -0.13708 -1.2517
+0.19827 -0.13718 -1.2526
+0.20077 -0.13727 -1.2534
+0.20522 -0.13709 -1.2517
+0.21023 -0.13728 -1.2535
+0.21121 -0.13715 -1.2523
+0.21218 -0.13702 -1.251
+0.2132 -0.13692 -1.2501
+0.21438 -0.13692 -1.2501
+0.21598 -0.13719 -1.2526
+0.21837 -0.13795 -1.2597
+0.2212 -0.13824 -1.2623
+0.22339 -0.13812 -1.2612
+0.22465 -0.13817 -1.2616
+0.22593 -0.13823 -1.2621
+0.22896 -0.13862 -1.2658
+0.29624 -0.14974 -1.3683
+0.2975 -0.14972 -1.3681
+0.30268 -0.14974 -1.3683
+0.3041 -0.1498 -1.3689
+0.30665 -0.14979 -1.3687
+0.30915 -0.14975 -1.3684
+0.3104 -0.14974 -1.3682
+0.31162 -0.1497 -1.3679
+0.32948 -0.14963 -1.3673
+0.33073 -0.14961 -1.3671
+0.3372 -0.14963 -1.3673
+0.33986 -0.14967 -1.3676
+0.34223 -0.14958 -1.3668
+0.34353 -0.14959 -1.3669
+0.34861 -0.14956 -1.3666
+0.34981 -0.14952 -1.3663
+0.35252 -0.14958 -1.3668
+0.35376 -0.14956 -1.3666
+0.35506 -0.14957 -1.3667
+0.35756 -0.14954 -1.3664
+0.36023 -0.14958 -1.3668
+0.36155 -0.14959 -1.3669
+0.36276 -0.14956 -1.3667
+0.37046 -0.14955 -1.3666
+0.38201 -0.14954 -1.3666
+0.39077 -0.14945 -1.3658
+0.39206 -0.14945 -1.3658
+0.39329 -0.14943 -1.3656
+0.39446 -0.14939 -1.3652
+-0.41245 -0.15171 -1.3749
+-0.41155 -0.15186 -1.3762
+-0.41026 -0.15186 -1.3762
+-0.38623 -0.15107 -1.3688
+-0.38467 -0.15096 -1.3678
+-0.38216 -0.15099 -1.3681
+-0.37959 -0.15099 -1.368
+-0.37692 -0.15095 -1.3677
+-0.37437 -0.15096 -1.3678
+-0.37329 -0.15104 -1.3685
+-0.37186 -0.15099 -1.368
+-0.37058 -0.15099 -1.368
+-0.33217 -0.14878 -1.3477
+-0.33091 -0.14878 -1.3477
+-0.32852 -0.14884 -1.3483
+-0.32601 -0.14886 -1.3484
+-0.32355 -0.14889 -1.3488
+-0.32116 -0.14896 -1.3494
+-0.3188 -0.14905 -1.3501
+-0.31653 -0.14918 -1.3513
+-0.31414 -0.14925 -1.352
+-0.31191 -0.1494 -1.3534
+-0.30966 -0.14954 -1.3547
+-0.30042 -0.15002 -1.359
+-0.28646 -0.15075 -1.3658
+-0.28186 -0.15104 -1.3684
+-0.27943 -0.15112 -1.3691
+-0.27706 -0.15123 -1.3702
+-0.27587 -0.15128 -1.3706
+-0.27464 -0.15132 -1.3709
+-0.27222 -0.15141 -1.3718
+-0.26975 -0.15147 -1.3724
+-0.26735 -0.15157 -1.3733
+-0.26488 -0.15164 -1.3739
+-0.26244 -0.15172 -1.3747
+-0.24692 -0.15172 -1.3747
+-0.24179 -0.15175 -1.375
+-0.23654 -0.1517 -1.3746
+-0.22621 -0.15171 -1.3747
+-0.22361 -0.1517 -1.3746
+-0.22099 -0.15168 -1.3744
+-0.21067 -0.1517 -1.3746
+-0.20812 -0.15173 -1.3749
+-0.20546 -0.15167 -1.3744
+-0.20417 -0.15167 -1.3744
+-0.156 -0.13565 -1.2279
+-0.15368 -0.13564 -1.2278
+-0.15141 -0.13568 -1.2282
+-0.14913 -0.13571 -1.2285
+-0.14684 -0.13573 -1.2287
+-0.14458 -0.13578 -1.2291
+-0.14226 -0.13578 -1.2291
+-0.13995 -0.13578 -1.2292
+-0.13876 -0.13575 -1.2289
+-0.13732 -0.13548 -1.2264
+-0.13463 -0.13509 -1.2229
+-0.13338 -0.13499 -1.2219
+-0.11426 -0.12538 -1.134
+-0.11219 -0.12545 -1.1347
+-0.11019 -0.12561 -1.1361
+-0.102 -0.12608 -1.1405
+-0.094651 -0.1235 -1.1169
+-0.09356 -0.12345 -1.1164
+-0.091132 -0.12301 -1.1124
+-0.089034 -0.12301 -1.1124
+-0.087062 -0.12319 -1.1141
+-0.084853 -0.12303 -1.1126
+-0.082635 -0.12285 -1.111
+-0.06185 -0.12317 -1.114
+-0.059805 -0.12329 -1.115
+-0.057707 -0.1233 -1.1151
+-0.055651 -0.1234 -1.1161
+-0.053638 -0.12361 -1.118
+-0.051581 -0.12373 -1.1191
+-0.049491 -0.12378 -1.1195
+-0.047408 -0.12385 -1.1202
+-0.045324 -0.12392 -1.1209
+-0.041174 -0.12415 -1.123
+-0.039082 -0.12423 -1.1237
+-0.038054 -0.12433 -1.1247
+-0.005625 -0.13459 -1.2185
+-0.004487 -0.13485 -1.2209
+-0.003343 -0.13511 -1.2233
+-0.001044 -0.1357 -1.2287
+0.00127 -0.13579 -1.2295
+0.010565 -0.13623 -1.2336
+0.012895 -0.13631 -1.2343
+0.015226 -0.13637 -1.2348
+0.01754 -0.13628 -1.2341
+0.047803 -0.15116 -1.3702
+0.049059 -0.15105 -1.3692
+0.049494 -0.13791 -1.2489
+0.050661 -0.13789 -1.2487
+0.052853 -0.13748 -1.245
+0.075453 -0.13597 -1.2311
+0.077786 -0.13599 -1.2313
+0.08013 -0.13603 -1.2317
+0.086279 -0.13659 -1.2367
+0.087229 -0.13625 -1.2337
+0.089259 -0.13581 -1.2296
+0.091529 -0.13574 -1.229
+0.093844 -0.13574 -1.229
+0.098282 -0.13548 -1.2265
+0.10281 -0.13536 -1.2254
+0.10756 -0.13553 -1.2269
+0.10988 -0.13553 -1.227
+0.11198 -0.13528 -1.2247
+0.11401 -0.13496 -1.2217
+0.11631 -0.13496 -1.2217
+0.11746 -0.13496 -1.2217
+0.11724 -0.12379 -1.1194
+0.11937 -0.12381 -1.1196
+0.12154 -0.12387 -1.1202
+0.1237 -0.12392 -1.1206
+0.13249 -0.12423 -1.1235
+0.13361 -0.12429 -1.124
+0.13476 -0.12438 -1.1248
+0.13714 -0.12461 -1.1269
+0.15606 -0.13451 -1.2175
+0.157 -0.13434 -1.2159
+0.1591 -0.13417 -1.2144
+0.16118 -0.134 -1.2127
+0.16344 -0.13398 -1.2126
+0.16579 -0.13403 -1.2131
+0.19233 -0.13748 -1.2446
+0.19362 -0.13757 -1.2454
+0.19657 -0.138 -1.2492
+0.19775 -0.138 -1.2493
+0.19924 -0.13822 -1.2512
+0.20168 -0.13827 -1.2518
+0.20361 -0.13798 -1.2491
+0.20479 -0.13798 -1.2491
+0.20612 -0.13809 -1.25
+0.20875 -0.13827 -1.2517
+0.21091 -0.13814 -1.2505
+0.21293 -0.13792 -1.2485
+0.21548 -0.13805 -1.2497
+0.21951 -0.13911 -1.2594
+0.22084 -0.1392 -1.2602
+0.22172 -0.13901 -1.2585
+0.22526 -0.139 -1.2583
+0.22679 -0.13922 -1.2603
+0.22828 -0.1394 -1.262
+0.22973 -0.13956 -1.2634
+0.26607 -0.15071 -1.3654
+0.26862 -0.1507 -1.3653
+0.27108 -0.15064 -1.3647
+0.27367 -0.15065 -1.3648
+0.29424 -0.15066 -1.3649
+0.29681 -0.15066 -1.3649
+0.29809 -0.15066 -1.3649
+0.29936 -0.15065 -1.3648
+0.30067 -0.15066 -1.3649
+0.30198 -0.15067 -1.365
+0.30461 -0.1507 -1.3653
+0.30706 -0.15065 -1.3648
+0.31209 -0.15059 -1.3643
+0.31461 -0.15057 -1.3641
+0.31987 -0.15063 -1.3646
+0.32484 -0.15055 -1.3639
+0.32741 -0.15055 -1.3639
+0.32992 -0.15053 -1.3637
+0.33119 -0.15052 -1.3637
+0.33635 -0.15054 -1.3638
+0.33768 -0.15055 -1.3639
+0.33898 -0.15056 -1.364
+0.34025 -0.15056 -1.364
+0.34146 -0.15052 -1.3637
+0.3427 -0.15051 -1.3635
+0.34393 -0.15049 -1.3633
+0.34519 -0.15047 -1.3632
+0.34647 -0.15047 -1.3632
+0.34776 -0.15048 -1.3633
+0.35044 -0.15052 -1.3637
+0.35287 -0.15047 -1.3632
+0.35558 -0.15053 -1.3638
+0.35808 -0.1505 -1.3635
+0.36825 -0.15046 -1.3632
+0.37088 -0.15049 -1.3634
+0.37217 -0.15049 -1.3634
+0.38135 -0.15057 -1.3642
+0.38234 -0.15045 -1.3632
+0.3835 -0.15041 -1.3627
+0.38991 -0.15041 -1.3628
+0.39116 -0.15039 -1.3627
+0.39362 -0.15035 -1.3623
+0.39488 -0.15034 -1.3622
+-0.41161 -0.15269 -1.372
+-0.41013 -0.15263 -1.3714
+-0.38511 -0.15191 -1.3648
+-0.38254 -0.15191 -1.3648
+-0.37457 -0.15181 -1.3638
+-0.37343 -0.15187 -1.3643
+-0.33541 -0.14979 -1.3454
+-0.3341 -0.14977 -1.3452
+-0.33285 -0.14978 -1.3453
+-0.33158 -0.14978 -1.3452
+-0.27794 -0.1523 -1.3681
+-0.27679 -0.15237 -1.3688
+-0.27557 -0.15241 -1.3691
+-0.20626 -0.1526 -1.3711
+-0.20498 -0.15261 -1.3711
+-0.15602 -0.13682 -1.228
+-0.15486 -0.13682 -1.228
+-0.1537 -0.13681 -1.228
+-0.15254 -0.13681 -1.228
+-0.15037 -0.13694 -1.2291
+-0.14914 -0.13688 -1.2286
+-0.14799 -0.13688 -1.2286
+-0.14581 -0.13701 -1.2298
+-0.13885 -0.13699 -1.2297
+-0.1363 -0.13676 -1.2275
+-0.13359 -0.13636 -1.2239
+-0.13222 -0.13613 -1.2219
+-0.13095 -0.136 -1.2207
+-0.11324 -0.1265 -1.1345
+-0.10049 -0.1266 -1.1355
+-0.098502 -0.12543 -1.1249
+-0.097044 -0.12492 -1.1202
+-0.09574 -0.1246 -1.1173
+-0.094636 -0.12453 -1.1167
+-0.092333 -0.12427 -1.1143
+-0.089758 -0.12361 -1.1084
+-0.087976 -0.12405 -1.1123
+-0.08599 -0.12421 -1.1138
+-0.054683 -0.12464 -1.1178
+-0.053648 -0.12468 -1.1182
+-0.05261 -0.12472 -1.1185
+-0.040152 -0.12532 -1.124
+-0.039108 -0.12537 -1.1245
+-0.030989 -0.13139 -1.1791
+-0.0299 -0.13149 -1.18
+-0.028803 -0.13155 -1.1805
+-0.027707 -0.13162 -1.1812
+-0.026603 -0.13167 -1.1816
+-0.0255 -0.13172 -1.1821
+-0.003337 -0.13601 -1.2211
+-0.002194 -0.13639 -1.2245
+0.014054 -0.13744 -1.234
+0.016361 -0.1373 -1.2327
+0.045106 -0.15204 -1.3665
+0.046393 -0.15205 -1.3665
+0.048953 -0.15202 -1.3662
+0.081217 -0.13707 -1.2305
+0.082587 -0.13742 -1.2337
+0.083799 -0.13751 -1.2345
+0.085059 -0.13766 -1.2359
+0.08616 -0.13756 -1.235
+0.11737 -0.136 -1.2207
+0.11852 -0.13601 -1.2208
+0.1183 -0.12485 -1.1195
+0.11937 -0.12486 -1.1196
+0.12043 -0.12488 -1.1197
+0.13373 -0.12546 -1.125
+0.13606 -0.12565 -1.1267
+0.15501 -0.13574 -1.2182
+0.15603 -0.13563 -1.2172
+0.15799 -0.13534 -1.2146
+0.16465 -0.13518 -1.2131
+0.16591 -0.13527 -1.2139
+0.16707 -0.13529 -1.2141
+0.18253 -0.13746 -1.2337
+0.18415 -0.1378 -1.2368
+0.18573 -0.13811 -1.2396
+0.18717 -0.13831 -1.2414
+0.18835 -0.13831 -1.2415
+0.18955 -0.13834 -1.2417
+0.19073 -0.13835 -1.2418
+0.19205 -0.13845 -1.2427
+0.19445 -0.1385 -1.2432
+0.19692 -0.13859 -1.2439
+0.19999 -0.13909 -1.2485
+0.2043 -0.13883 -1.2461
+0.21692 -0.1394 -1.2512
+0.22594 -0.13987 -1.2555
+0.26291 -0.15165 -1.3623
+0.26417 -0.15164 -1.3622
+0.29742 -0.1516 -1.3618
+0.29996 -0.15159 -1.3617
+0.33043 -0.15146 -1.3605
+0.33551 -0.15144 -1.3603
+0.33683 -0.15146 -1.3605
+0.34187 -0.15142 -1.3602
+0.34312 -0.15141 -1.3601
+0.34567 -0.1514 -1.36
+0.3508 -0.15141 -1.3601
+0.35213 -0.15143 -1.3603
+0.35343 -0.15144 -1.3604
+0.35605 -0.15146 -1.3606
+0.36228 -0.15139 -1.36
+0.36738 -0.15139 -1.3599
+0.36873 -0.15142 -1.3602
+0.3713 -0.15142 -1.3602
+0.38025 -0.15142 -1.3602
+0.38145 -0.15138 -1.36
+0.38265 -0.15135 -1.3597
+0.38897 -0.15132 -1.3594
+0.39146 -0.1513 -1.3592
+0.39271 -0.15129 -1.3591
+-0.38797 -0.15281 -1.3613
+-0.38543 -0.15282 -1.3614
+-0.38282 -0.1528 -1.3612
+-0.38002 -0.15271 -1.3603
+-0.37755 -0.15274 -1.3606
+-0.37497 -0.15273 -1.3605
+-0.34111 -0.15078 -1.3429
+-0.33988 -0.1508 -1.343
+-0.33719 -0.15072 -1.3423
+-0.33597 -0.15074 -1.3425
+-0.33475 -0.15076 -1.3427
+-0.33217 -0.15074 -1.3425
+-0.32971 -0.15077 -1.3428
+-0.32504 -0.15095 -1.3444
+-0.32042 -0.15116 -1.3462
+-0.31598 -0.15146 -1.349
+-0.31136 -0.15168 -1.351
+-0.30684 -0.15196 -1.3535
+-0.30226 -0.15222 -1.3558
+-0.2977 -0.15249 -1.3583
+-0.29304 -0.15273 -1.3604
+-0.28837 -0.15297 -1.3626
+-0.28607 -0.15312 -1.3639
+-0.28369 -0.15321 -1.3648
+-0.27878 -0.15334 -1.3659
+-0.27636 -0.15342 -1.3667
+-0.27391 -0.15349 -1.3673
+-0.26889 -0.15356 -1.3679
+-0.26386 -0.15363 -1.3686
+-0.25871 -0.15364 -1.3686
+-0.25355 -0.15363 -1.3686
+-0.24821 -0.15351 -1.3675
+-0.24581 -0.15362 -1.3685
+-0.24309 -0.15353 -1.3677
+-0.23802 -0.15357 -1.3681
+-0.23285 -0.15356 -1.368
+-0.2276 -0.15349 -1.3674
+-0.22242 -0.15347 -1.3672
+-0.21734 -0.15352 -1.3677
+-0.2122 -0.15352 -1.3677
+-0.20964 -0.15354 -1.3679
+-0.20703 -0.15351 -1.3676
+-0.18627 -0.15128 -1.3476
+-0.18501 -0.15128 -1.3476
+-0.15525 -0.13832 -1.2311
+-0.15409 -0.13832 -1.2311
+-0.15174 -0.1383 -1.2309
+-0.1494 -0.13828 -1.2308
+-0.14709 -0.13828 -1.2308
+-0.1448 -0.13831 -1.231
+-0.14014 -0.13829 -1.2309
+-0.13789 -0.13835 -1.2315
+-0.13673 -0.13835 -1.2315
+-0.13544 -0.13822 -1.2303
+-0.13419 -0.13813 -1.2295
+-0.13261 -0.13769 -1.2256
+-0.12997 -0.13734 -1.2223
+-0.11323 -0.12756 -1.1344
+-0.11222 -0.12762 -1.135
+-0.11018 -0.12774 -1.1361
+-0.10818 -0.12791 -1.1376
+-0.10412 -0.12818 -1.14
+-0.10197 -0.12818 -1.1401
+-0.10031 -0.12745 -1.1334
+-0.098344 -0.12629 -1.123
+-0.09693 -0.12583 -1.1189
+-0.09571 -0.12561 -1.117
+-0.093484 -0.12545 -1.1155
+-0.091994 -0.12486 -1.1101
+-0.090708 -0.12453 -1.1072
+-0.088654 -0.12458 -1.1076
+-0.087101 -0.12535 -1.1146
+-0.084916 -0.12522 -1.1135
+-0.080499 -0.12488 -1.1104
+-0.076199 -0.1247 -1.1088
+-0.072006 -0.12468 -1.1086
+-0.067881 -0.12478 -1.1095
+-0.063836 -0.12505 -1.112
+-0.059851 -0.12549 -1.1159
+-0.055731 -0.12568 -1.1177
+-0.053642 -0.12573 -1.1181
+-0.051554 -0.12577 -1.1185
+-0.047396 -0.12593 -1.1199
+-0.043253 -0.12616 -1.122
+-0.041194 -0.12633 -1.1235
+-0.040153 -0.12639 -1.1241
+-0.032014 -0.13215 -1.1759
+-0.029842 -0.13234 -1.1776
+-0.027652 -0.13248 -1.1788
+-0.025458 -0.13262 -1.1801
+-0.024354 -0.13266 -1.1805
+-0.023249 -0.1327 -1.1808
+-0.021042 -0.13281 -1.1818
+-0.01994 -0.13288 -1.1825
+-0.001043 -0.13781 -1.2269
+0.003587 -0.13816 -1.23
+0.008234 -0.13841 -1.2323
+0.010561 -0.1385 -1.2331
+0.012883 -0.1385 -1.2331
+0.014038 -0.13844 -1.2326
+0.015189 -0.13836 -1.2318
+0.043723 -0.15298 -1.3634
+0.045003 -0.15298 -1.3633
+0.047561 -0.15296 -1.3631
+0.048844 -0.15296 -1.3632
+0.052868 -0.13986 -1.2453
+0.055012 -0.13936 -1.2407
+0.059398 -0.13869 -1.2347
+0.06369 -0.13791 -1.2277
+0.068166 -0.13761 -1.225
+0.07282 -0.13769 -1.2257
+0.075266 -0.13794 -1.228
+0.077733 -0.13822 -1.2304
+0.080012 -0.13815 -1.2298
+0.082444 -0.13835 -1.2316
+0.084944 -0.13864 -1.2342
+0.087214 -0.13856 -1.2334
+0.089159 -0.13797 -1.2282
+0.091438 -0.13792 -1.2277
+0.096001 -0.13783 -1.2269
+0.09829 -0.1378 -1.2266
+0.10067 -0.13789 -1.2275
+0.10279 -0.13764 -1.2251
+0.10515 -0.13771 -1.2258
+0.10755 -0.13783 -1.2269
+0.10978 -0.13773 -1.2259
+0.11171 -0.13726 -1.2217
+0.11388 -0.1371 -1.2203
+0.11622 -0.13715 -1.2208
+0.1185 -0.13713 -1.2205
+0.11961 -0.13708 -1.2201
+0.12046 -0.12596 -1.1199
+0.12155 -0.126 -1.1203
+0.12372 -0.12605 -1.1208
+0.12596 -0.12618 -1.122
+0.13044 -0.12642 -1.1241
+0.13272 -0.12658 -1.1255
+0.13505 -0.12677 -1.1272
+0.13621 -0.12686 -1.128
+0.15489 -0.13679 -1.2173
+0.1569 -0.13653 -1.215
+0.15905 -0.13642 -1.214
+0.16113 -0.13625 -1.2124
+0.16352 -0.13634 -1.2132
+0.16475 -0.13641 -1.2139
+0.16625 -0.1367 -1.2165
+0.16906 -0.13712 -1.2203
+0.17476 -0.13799 -1.228
+0.1775 -0.13833 -1.2311
+0.17991 -0.13839 -1.2316
+0.18108 -0.1384 -1.2317
+0.18237 -0.1385 -1.2326
+0.18528 -0.13894 -1.2366
+0.18683 -0.13923 -1.2392
+0.18808 -0.13929 -1.2397
+0.19048 -0.13933 -1.2401
+0.19282 -0.13934 -1.2401
+0.195 -0.13923 -1.2391
+0.19617 -0.13923 -1.2391
+0.19783 -0.13958 -1.2423
+0.19925 -0.13975 -1.2438
+0.20042 -0.13975 -1.2438
+0.2027 -0.13971 -1.2434
+0.20536 -0.13992 -1.2454
+0.20811 -0.1402 -1.2478
+0.21041 -0.14016 -1.2475
+0.21508 -0.14014 -1.2473
+0.21772 -0.14033 -1.249
+0.21979 -0.14015 -1.2473
+0.22211 -0.14013 -1.2472
+0.22362 -0.14034 -1.2491
+0.22522 -0.14061 -1.2514
+0.22667 -0.14078 -1.253
+0.22805 -0.1409 -1.2541
+0.23066 -0.14105 -1.2554
+0.23209 -0.1412 -1.2568
+0.26101 -0.15257 -1.359
+0.26228 -0.15257 -1.359
+0.26472 -0.1525 -1.3584
+0.26985 -0.15251 -1.3585
+0.27492 -0.15249 -1.3582
+0.28013 -0.15254 -1.3587
+0.28525 -0.15254 -1.3587
+0.29028 -0.1525 -1.3583
+0.29538 -0.15249 -1.3583
+0.29795 -0.1525 -1.3583
+0.30054 -0.15252 -1.3585
+0.30552 -0.15245 -1.3579
+0.3106 -0.15243 -1.3577
+0.3157 -0.15243 -1.3577
+0.32078 -0.15241 -1.3576
+0.32585 -0.1524 -1.3574
+0.32841 -0.1524 -1.3574
+0.33089 -0.15236 -1.3571
+0.33339 -0.15234 -1.3569
+0.33598 -0.15236 -1.3571
+0.34103 -0.15233 -1.3568
+0.34367 -0.15237 -1.3572
+0.34612 -0.15232 -1.3568
+0.34867 -0.15232 -1.3567
+0.35388 -0.15236 -1.3571
+0.3564 -0.15235 -1.357
+0.36141 -0.15231 -1.3567
+0.36272 -0.15232 -1.3568
+0.36395 -0.1523 -1.3566
+0.36522 -0.1523 -1.3566
+0.36649 -0.1523 -1.3566
+0.36908 -0.15231 -1.3567
+0.37036 -0.15231 -1.3568
+0.37537 -0.15227 -1.3564
+0.37671 -0.1523 -1.3567
+0.37805 -0.15233 -1.3569
+0.3793 -0.15232 -1.3568
+0.38173 -0.15227 -1.3564
+0.38297 -0.15225 -1.3563
+0.38803 -0.15223 -1.3561
+0.38916 -0.15218 -1.3556
+0.3918 -0.15221 -1.3559
+-0.38957 -0.15371 -1.3579
+-0.38841 -0.15376 -1.3583
+-0.38589 -0.15378 -1.3585
+-0.38325 -0.15374 -1.3581
+-0.38196 -0.15374 -1.3581
+-0.38058 -0.15369 -1.3577
+-0.3793 -0.15369 -1.3577
+-0.37803 -0.15369 -1.3577
+-0.34273 -0.15164 -1.3393
+-0.34156 -0.15168 -1.3397
+-0.34038 -0.15172 -1.34
+-0.33523 -0.15167 -1.3396
+-0.2846 -0.15429 -1.363
+-0.21043 -0.15446 -1.3646
+-0.20779 -0.1544 -1.3641
+-0.18838 -0.1522 -1.3446
+-0.18712 -0.1522 -1.3445
+-0.18454 -0.15216 -1.3442
+-0.18328 -0.15216 -1.3442
+-0.18222 -0.15234 -1.3458
+-0.181 -0.15238 -1.3461
+-0.15561 -0.13981 -1.2341
+-0.1544 -0.13977 -1.2337
+-0.15316 -0.1397 -1.233
+-0.15196 -0.13966 -1.2327
+-0.15077 -0.13963 -1.2324
+-0.14841 -0.1396 -1.2322
+-0.14724 -0.13959 -1.2321
+-0.14609 -0.13959 -1.2321
+-0.13909 -0.13956 -1.2319
+-0.13795 -0.13958 -1.232
+-0.13676 -0.13955 -1.2318
+-0.13425 -0.13935 -1.23
+-0.13301 -0.13926 -1.2292
+-0.13147 -0.13886 -1.2257
+-0.13023 -0.13877 -1.2249
+-0.11224 -0.12872 -1.1352
+-0.11118 -0.12873 -1.1353
+-0.10915 -0.12887 -1.1365
+-0.10001 -0.12813 -1.13
+-0.096812 -0.12673 -1.1175
+-0.094596 -0.12659 -1.1162
+-0.091805 -0.12565 -1.1078
+-0.089541 -0.1254 -1.1057
+-0.087699 -0.12575 -1.1088
+-0.08605 -0.1264 -1.1146
+-0.042218 -0.12729 -1.1226
+-0.041203 -0.12742 -1.1238
+-0.03412 -0.13283 -1.1721
+-0.033053 -0.13298 -1.1734
+-0.024306 -0.1335 -1.1781
+-0.019895 -0.13369 -1.1798
+-0.018788 -0.13372 -1.1801
+-0.017679 -0.13374 -1.1802
+-0.016569 -0.13376 -1.1804
+0.011719 -0.13963 -1.2328
+0.012869 -0.13951 -1.2317
+0.041064 -0.15392 -1.3603
+0.042339 -0.1539 -1.3601
+0.043617 -0.1539 -1.3601
+0.04618 -0.15391 -1.3602
+0.053942 -0.14078 -1.243
+0.083616 -0.13953 -1.2317
+0.086135 -0.13985 -1.2346
+0.088235 -0.1395 -1.2315
+0.090263 -0.13905 -1.2274
+0.10398 -0.13885 -1.2256
+0.11955 -0.13816 -1.2194
+0.12066 -0.13811 -1.219
+0.12157 -0.12707 -1.1204
+0.12265 -0.1271 -1.1207
+0.12486 -0.12719 -1.1215
+0.13398 -0.12782 -1.1271
+0.13513 -0.12791 -1.1279
+0.15381 -0.13799 -1.2178
+0.16284 -0.13787 -1.2167
+0.16526 -0.13797 -1.2176
+0.168 -0.13834 -1.2209
+0.1708 -0.13875 -1.2245
+0.17207 -0.13885 -1.2254
+0.17356 -0.13911 -1.2278
+0.18098 -0.13948 -1.231
+0.1835 -0.13963 -1.2324
+0.18621 -0.13993 -1.235
+0.18872 -0.14006 -1.2362
+0.19602 -0.14029 -1.2382
+0.1971 -0.14023 -1.2377
+0.19839 -0.14031 -1.2384
+0.1998 -0.14049 -1.24
+0.20104 -0.14054 -1.2404
+0.20358 -0.14068 -1.2416
+0.21839 -0.14118 -1.2461
+0.22315 -0.14122 -1.2464
+0.22596 -0.14151 -1.249
+0.22863 -0.14171 -1.2508
+0.23143 -0.14198 -1.2532
+0.2329 -0.14216 -1.2547
+0.26165 -0.15348 -1.3557
+0.26285 -0.15343 -1.3553
+0.30607 -0.15336 -1.3546
+0.3073 -0.15334 -1.3544
+0.30858 -0.15334 -1.3544
+0.33384 -0.15324 -1.3535
+0.33517 -0.15326 -1.3537
+0.34019 -0.15323 -1.3535
+0.34152 -0.15325 -1.3537
+0.34402 -0.15323 -1.3535
+0.34658 -0.15324 -1.3535
+0.34787 -0.15324 -1.3536
+0.35427 -0.15326 -1.3537
+0.35673 -0.15322 -1.3534
+0.35795 -0.1532 -1.3532
+0.35925 -0.15321 -1.3533
+0.36187 -0.15324 -1.3536
+0.36442 -0.15324 -1.3536
+0.36569 -0.15324 -1.3536
+0.36696 -0.15324 -1.3536
+0.36825 -0.15325 -1.3537
+0.36949 -0.15323 -1.3535
+0.3707 -0.15321 -1.3533
+0.37194 -0.15319 -1.3532
+0.37322 -0.1532 -1.3532
+0.37458 -0.15323 -1.3536
+0.37588 -0.15324 -1.3536
+0.37719 -0.15325 -1.3538
+0.37845 -0.15325 -1.3537
+0.37962 -0.15321 -1.3534
+0.38208 -0.15317 -1.3531
+0.38712 -0.15315 -1.3529
+0.38978 -0.1532 -1.3533
+0.39092 -0.15314 -1.3529
+-0.39654 -0.15472 -1.3556
+-0.39372 -0.15461 -1.3546
+-0.39125 -0.15464 -1.3549
+-0.38997 -0.15464 -1.3549
+-0.38876 -0.15467 -1.3551
+-0.38639 -0.15474 -1.3557
+-0.38368 -0.15468 -1.3551
+-0.38235 -0.15465 -1.3549
+-0.3458 -0.15259 -1.3366
+-0.34332 -0.15261 -1.3367
+-0.34074 -0.15258 -1.3364
+-0.3385 -0.1527 -1.3375
+-0.33591 -0.15267 -1.3372
+-0.33358 -0.15276 -1.338
+-0.33129 -0.15286 -1.3389
+-0.32896 -0.15295 -1.3397
+-0.32666 -0.15305 -1.3406
+-0.30402 -0.15437 -1.3522
+-0.29966 -0.15475 -1.3556
+-0.28522 -0.15522 -1.3598
+-0.28275 -0.15527 -1.3602
+-0.28036 -0.15536 -1.361
+-0.27535 -0.15543 -1.3616
+-0.24452 -0.15537 -1.3612
+-0.21887 -0.15535 -1.3611
+-0.21375 -0.15536 -1.3612
+-0.21117 -0.15534 -1.361
+-0.20988 -0.15533 -1.361
+-0.20854 -0.15529 -1.3606
+-0.18919 -0.1531 -1.3412
+-0.18793 -0.1531 -1.3413
+-0.18543 -0.15312 -1.3414
+-0.18301 -0.15321 -1.3423
+-0.18057 -0.15328 -1.3429
+-0.17941 -0.15337 -1.3437
+-0.1557 -0.14105 -1.2347
+-0.15444 -0.14097 -1.234
+-0.15203 -0.14089 -1.2333
+-0.14965 -0.14083 -1.2328
+-0.14729 -0.1408 -1.2325
+-0.14613 -0.14079 -1.2325
+-0.14497 -0.14079 -1.2325
+-0.1426 -0.14075 -1.2321
+-0.14026 -0.14073 -1.232
+-0.13792 -0.14071 -1.2318
+-0.13556 -0.14067 -1.2314
+-0.13437 -0.14064 -1.2311
+-0.13299 -0.1404 -1.229
+-0.13028 -0.13998 -1.2253
+-0.12905 -0.13989 -1.2246
+-0.11227 -0.12982 -1.1355
+-0.11019 -0.1299 -1.1361
+-0.10812 -0.12999 -1.137
+-0.10611 -0.13014 -1.1383
+-0.10406 -0.13027 -1.1395
+-0.10188 -0.13022 -1.1391
+-0.098017 -0.12798 -1.1193
+-0.095669 -0.12767 -1.1165
+-0.09457 -0.1276 -1.1159
+-0.093157 -0.12711 -1.1115
+-0.091759 -0.12663 -1.1073
+-0.09056 -0.12641 -1.1054
+-0.088484 -0.12642 -1.1055
+-0.087582 -0.12662 -1.1073
+-0.087087 -0.12743 -1.1144
+-0.084985 -0.12743 -1.1144
+-0.082734 -0.1272 -1.1123
+-0.053648 -0.12785 -1.1182
+-0.045311 -0.12812 -1.1206
+-0.043249 -0.12826 -1.1219
+-0.042222 -0.12836 -1.1227
+-0.035157 -0.13368 -1.1698
+-0.034087 -0.1338 -1.1709
+-0.031938 -0.13405 -1.1731
+-0.029766 -0.13421 -1.1746
+-0.02537 -0.13437 -1.176
+-0.023167 -0.13444 -1.1766
+-0.020954 -0.13447 -1.1768
+-0.018743 -0.13451 -1.1772
+-0.016539 -0.13462 -1.1782
+-0.015434 -0.13466 -1.1785
+-0.014327 -0.1347 -1.1788
+0.001267 -0.14013 -1.227
+0.003586 -0.14044 -1.2296
+0.005905 -0.14053 -1.2305
+0.00823 -0.14067 -1.2317
+0.010552 -0.1407 -1.232
+0.011707 -0.14064 -1.2315
+0.039689 -0.15482 -1.3569
+0.04223 -0.15478 -1.3566
+0.044804 -0.15485 -1.3572
+0.046069 -0.15482 -1.3569
+0.055029 -0.14174 -1.2411
+0.057211 -0.14135 -1.2377
+0.059367 -0.14094 -1.234
+0.061526 -0.14056 -1.2307
+0.075048 -0.13985 -1.2243
+0.079978 -0.14041 -1.2293
+0.082438 -0.14066 -1.2315
+0.084977 -0.14102 -1.2347
+0.087245 -0.14093 -1.2339
+0.088332 -0.14081 -1.2328
+0.089269 -0.14046 -1.2297
+0.090228 -0.14015 -1.227
+0.091365 -0.14012 -1.2267
+0.093666 -0.14011 -1.2266
+0.095961 -0.14009 -1.2264
+0.098382 -0.14024 -1.2278
+0.1008 -0.14039 -1.229
+0.10307 -0.14033 -1.2285
+0.10409 -0.14014 -1.2269
+0.10523 -0.14013 -1.2268
+0.10755 -0.14014 -1.2268
+0.10964 -0.13986 -1.2243
+0.11172 -0.13957 -1.2218
+0.11616 -0.13938 -1.2201
+0.11837 -0.13928 -1.2192
+0.12057 -0.13916 -1.2181
+0.1217 -0.13914 -1.218
+0.12269 -0.12819 -1.121
+0.12378 -0.12823 -1.1213
+0.12601 -0.12835 -1.1224
+0.12828 -0.1285 -1.1237
+0.13059 -0.12869 -1.1254
+0.13291 -0.12888 -1.1271
+0.13412 -0.12902 -1.1283
+0.15367 -0.13902 -1.2167
+0.15476 -0.13896 -1.2163
+0.15699 -0.13891 -1.2157
+0.15925 -0.13888 -1.2155
+0.16177 -0.13908 -1.2173
+0.16429 -0.13927 -1.2189
+0.16672 -0.13939 -1.22
+0.1696 -0.13986 -1.2242
+0.17207 -0.14 -1.2253
+0.17352 -0.14024 -1.2274
+0.17476 -0.14031 -1.2281
+0.17723 -0.14043 -1.2292
+0.1796 -0.14047 -1.2295
+0.18192 -0.14047 -1.2295
+0.1843 -0.14052 -1.23
+0.18696 -0.14078 -1.2323
+0.18939 -0.14086 -1.233
+0.19201 -0.14108 -1.2349
+0.19457 -0.14125 -1.2364
+0.19691 -0.14125 -1.2364
+0.19951 -0.14145 -1.2381
+0.20214 -0.14166 -1.24
+0.20471 -0.14182 -1.2414
+0.20758 -0.14219 -1.2446
+0.21697 -0.14219 -1.2446
+0.2181 -0.14217 -1.2444
+0.21912 -0.14207 -1.2435
+0.22126 -0.14194 -1.2424
+0.22407 -0.14224 -1.245
+0.22672 -0.14243 -1.2467
+0.22928 -0.14256 -1.2479
+0.23247 -0.14308 -1.2524
+0.2339 -0.14323 -1.2538
+0.26211 -0.15428 -1.3515
+0.26349 -0.15434 -1.352
+0.26598 -0.15431 -1.3517
+0.26859 -0.15435 -1.3521
+0.27116 -0.15436 -1.3522
+0.28634 -0.15431 -1.3517
+0.28881 -0.15427 -1.3514
+0.29145 -0.15432 -1.3518
+0.29644 -0.15427 -1.3514
+0.30153 -0.15427 -1.3514
+0.30419 -0.15433 -1.3519
+0.30668 -0.1543 -1.3517
+0.30915 -0.15427 -1.3513
+0.31165 -0.15425 -1.3511
+0.32682 -0.15421 -1.3508
+0.33191 -0.15421 -1.3508
+0.33439 -0.15418 -1.3506
+0.33563 -0.15416 -1.3504
+0.33683 -0.15413 -1.3502
+0.33811 -0.15413 -1.3502
+0.33941 -0.15415 -1.3503
+0.34183 -0.15409 -1.3498
+0.34448 -0.15414 -1.3503
+0.34578 -0.15415 -1.3504
+0.35208 -0.15413 -1.3502
+0.35475 -0.15419 -1.3507
+0.35708 -0.1541 -1.3499
+0.35966 -0.15411 -1.35
+0.36232 -0.15417 -1.3505
+0.36354 -0.15414 -1.3503
+0.36979 -0.1541 -1.35
+0.37105 -0.1541 -1.3499
+0.37992 -0.15409 -1.3499
+0.38245 -0.15408 -1.3499
+0.38493 -0.15406 -1.3497
+0.3875 -0.15407 -1.3498
+0.39002 -0.15406 -1.3497
+0.39125 -0.15404 -1.3496
+0.39247 -0.15403 -1.3494
+0.39376 -0.15403 -1.3495
+0.39998 -0.15399 -1.3491
+0.40256 -0.154 -1.3493
+0.40617 -0.15393 -1.3486
+-0.40039 -0.15551 -1.3514
+-0.39917 -0.15553 -1.3515
+-0.39806 -0.15559 -1.3521
+-0.39679 -0.15559 -1.3521
+-0.3942 -0.15557 -1.3519
+-0.39174 -0.15561 -1.3522
+-0.38928 -0.15564 -1.3524
+-0.38661 -0.15559 -1.352
+-0.38538 -0.15561 -1.3521
+-0.38411 -0.15561 -1.3521
+-0.35136 -0.15353 -1.3338
+-0.35001 -0.15349 -1.3334
+-0.34876 -0.15349 -1.3334
+-0.34753 -0.1535 -1.3335
+-0.34633 -0.15353 -1.3337
+-0.34379 -0.15351 -1.3336
+-0.33201 -0.15387 -1.3367
+-0.33089 -0.15394 -1.3373
+-0.3297 -0.15397 -1.3376
+-0.21195 -0.15625 -1.3578
+-0.21069 -0.15626 -1.3579
+-0.19256 -0.15403 -1.3383
+-0.19129 -0.15402 -1.3383
+-0.18998 -0.15398 -1.3379
+-0.18872 -0.15398 -1.3379
+-0.17917 -0.15443 -1.3419
+-0.17808 -0.15457 -1.3432
+-0.17695 -0.15469 -1.3442
+-0.15578 -0.14229 -1.2354
+-0.14612 -0.14195 -1.2324
+-0.13429 -0.14171 -1.2303
+-0.13159 -0.1413 -1.2268
+-0.12905 -0.14105 -1.2246
+-0.12772 -0.14086 -1.2229
+-0.11149 -0.13123 -1.1385
+-0.11027 -0.13106 -1.1369
+-0.10918 -0.13104 -1.1368
+-0.10813 -0.13106 -1.137
+-0.10715 -0.13117 -1.138
+-0.10612 -0.13123 -1.1384
+-0.10512 -0.13132 -1.1392
+-0.10408 -0.13136 -1.1396
+-0.103 -0.13136 -1.1396
+-0.099636 -0.12977 -1.1257
+-0.094438 -0.12848 -1.1143
+-0.091729 -0.12763 -1.1069
+-0.089479 -0.1274 -1.1049
+-0.08752 -0.12758 -1.1065
+-0.086063 -0.12852 -1.1147
+-0.044274 -0.12923 -1.121
+-0.043253 -0.12933 -1.122
+-0.036162 -0.13442 -1.1667
+-0.035107 -0.13459 -1.1681
+-0.032978 -0.13488 -1.1707
+-0.015396 -0.13545 -1.1757
+-0.013195 -0.13559 -1.1769
+-0.012092 -0.13564 -1.1774
+-0.010989 -0.13573 -1.1781
+0.001266 -0.14111 -1.2254
+0.002423 -0.14132 -1.2272
+0.004743 -0.1416 -1.2297
+0.007055 -0.14153 -1.229
+0.008211 -0.1415 -1.2288
+0.009367 -0.14149 -1.2287
+0.010522 -0.14146 -1.2285
+0.038316 -0.15571 -1.3535
+0.045954 -0.1557 -1.3535
+0.055039 -0.14293 -1.2413
+0.056089 -0.14263 -1.2387
+0.058269 -0.14226 -1.2354
+0.083736 -0.14205 -1.2335
+0.086091 -0.14211 -1.234
+0.088358 -0.14201 -1.2332
+0.090229 -0.14131 -1.227
+0.1044 -0.14173 -1.2306
+0.12163 -0.14021 -1.2172
+0.12277 -0.1402 -1.2172
+0.12391 -0.1402 -1.2172
+0.12383 -0.12934 -1.1218
+0.12493 -0.12939 -1.1222
+0.13184 -0.12994 -1.127
+0.13303 -0.13006 -1.1281
+0.15251 -0.14014 -1.2165
+0.15364 -0.14013 -1.2164
+0.17334 -0.14124 -1.2261
+0.21763 -0.14303 -1.2417
+0.23003 -0.14347 -1.2455
+0.26283 -0.15522 -1.3486
+0.26404 -0.15519 -1.3483
+0.26675 -0.15529 -1.3492
+0.28686 -0.15517 -1.3481
+0.33494 -0.15512 -1.3476
+0.33742 -0.15509 -1.3474
+0.34494 -0.15505 -1.3471
+0.34991 -0.15501 -1.3467
+0.35259 -0.15507 -1.3473
+0.36264 -0.15503 -1.347
+0.37013 -0.15498 -1.3465
+0.3803 -0.15499 -1.3467
+0.38161 -0.15501 -1.3469
+0.38283 -0.15499 -1.3467
+0.38407 -0.15498 -1.3466
+0.38534 -0.15498 -1.3467
+0.38658 -0.15497 -1.3466
+0.38784 -0.15497 -1.3466
+0.39031 -0.15495 -1.3464
+0.39161 -0.15496 -1.3465
+0.39921 -0.15496 -1.3465
+0.40046 -0.15495 -1.3465
+-0.40465 -0.15646 -1.3486
+-0.40309 -0.15635 -1.3476
+-0.40089 -0.15648 -1.3488
+-0.39967 -0.1565 -1.3489
+-0.3972 -0.15653 -1.3491
+-0.39457 -0.15649 -1.3488
+-0.39214 -0.15653 -1.3491
+-0.39086 -0.15653 -1.3491
+-0.38965 -0.15655 -1.3493
+-0.3871 -0.15655 -1.3493
+-0.35179 -0.15442 -1.3306
+-0.34921 -0.15439 -1.3303
+-0.34681 -0.15444 -1.3307
+-0.34445 -0.1545 -1.3313
+-0.34214 -0.15459 -1.332
+-0.33755 -0.15479 -1.3337
+-0.33298 -0.15499 -1.3355
+-0.3306 -0.15506 -1.3361
+-0.32836 -0.15519 -1.3372
+-0.32409 -0.15556 -1.3404
+-0.31942 -0.15574 -1.342
+-0.31508 -0.15609 -1.3451
+-0.31051 -0.15634 -1.3472
+-0.30595 -0.1566 -1.3495
+-0.30358 -0.15669 -1.3503
+-0.30124 -0.15679 -1.3512
+-0.29895 -0.15693 -1.3523
+-0.29652 -0.15699 -1.3529
+-0.2916 -0.15708 -1.3537
+-0.28676 -0.15722 -1.3549
+-0.2818 -0.1573 -1.3556
+-0.27669 -0.1573 -1.3556
+-0.27161 -0.15731 -1.3557
+-0.2665 -0.1573 -1.3557
+-0.26143 -0.15733 -1.3559
+-0.25623 -0.15726 -1.3553
+-0.25114 -0.15727 -1.3554
+-0.24596 -0.15722 -1.355
+-0.24087 -0.15723 -1.3551
+-0.23577 -0.15723 -1.3551
+-0.23066 -0.15723 -1.3551
+-0.2256 -0.15725 -1.3553
+-0.22041 -0.15719 -1.3548
+-0.21785 -0.15718 -1.3547
+-0.21532 -0.15719 -1.3548
+-0.21269 -0.15714 -1.3543
+-0.19205 -0.15487 -1.3347
+-0.18949 -0.15484 -1.3344
+-0.18704 -0.15488 -1.3348
+-0.18235 -0.15518 -1.3374
+-0.18003 -0.15535 -1.3389
+-0.17779 -0.15559 -1.341
+-0.17668 -0.15572 -1.3421
+-0.15578 -0.14346 -1.2354
+-0.15453 -0.14338 -1.2347
+-0.14966 -0.14316 -1.2329
+-0.14729 -0.14311 -1.2325
+-0.14494 -0.14309 -1.2323
+-0.14022 -0.14301 -1.2316
+-0.13547 -0.14289 -1.2306
+-0.13299 -0.14272 -1.2291
+-0.13026 -0.14227 -1.2251
+-0.12892 -0.14205 -1.2233
+-0.11313 -0.13298 -1.1443
+-0.11095 -0.13295 -1.1441
+-0.10839 -0.13245 -1.1397
+-0.10637 -0.13261 -1.1411
+-0.1043 -0.13272 -1.1421
+-0.10167 -0.13211 -1.1367
+-0.099501 -0.13066 -1.1242
+-0.09795 -0.13001 -1.1185
+-0.095608 -0.12969 -1.1157
+-0.09442 -0.1295 -1.1141
+-0.093031 -0.12903 -1.11
+-0.091662 -0.12858 -1.1061
+-0.090505 -0.12842 -1.1047
+-0.08844 -0.12845 -1.1049
+-0.087471 -0.12855 -1.1058
+-0.086989 -0.12939 -1.1131
+-0.086124 -0.12966 -1.1155
+-0.085072 -0.12966 -1.1155
+-0.080633 -0.12929 -1.1123
+-0.076335 -0.12911 -1.1107
+-0.072106 -0.12904 -1.1101
+-0.067962 -0.12912 -1.1108
+-0.063927 -0.12943 -1.1136
+-0.059895 -0.12979 -1.1167
+-0.055733 -0.1299 -1.1177
+-0.051534 -0.12994 -1.118
+-0.047382 -0.13011 -1.1195
+-0.045309 -0.13022 -1.1205
+-0.044283 -0.13031 -1.1213
+-0.037183 -0.13524 -1.1642
+-0.036152 -0.13548 -1.1663
+-0.034022 -0.13575 -1.1687
+-0.03187 -0.13597 -1.1705
+-0.027513 -0.13623 -1.1728
+-0.0231 -0.13627 -1.1732
+-0.018684 -0.1363 -1.1734
+-0.016471 -0.13628 -1.1733
+-0.014269 -0.13636 -1.174
+-0.012065 -0.13645 -1.1747
+-0.009867 -0.13666 -1.1766
+0.00242 -0.14227 -1.2254
+0.003584 -0.14269 -1.2291
+0.004746 -0.14283 -1.2303
+0.0059 -0.14272 -1.2294
+0.007047 -0.14251 -1.2275
+0.035702 -0.15668 -1.3509
+0.036954 -0.1566 -1.3502
+0.0395 -0.15663 -1.3504
+0.04457 -0.15659 -1.3501
+0.045834 -0.15657 -1.3499
+0.056094 -0.14381 -1.2388
+0.057149 -0.14353 -1.2363
+0.059356 -0.14324 -1.2338
+0.063637 -0.14242 -1.2267
+0.067933 -0.14174 -1.2208
+0.072492 -0.14167 -1.2201
+0.077281 -0.14202 -1.2232
+0.079794 -0.1424 -1.2264
+0.082372 -0.14286 -1.2305
+0.084879 -0.14318 -1.2332
+0.087179 -0.14314 -1.2329
+0.088312 -0.1431 -1.2325
+0.089309 -0.14284 -1.2302
+0.090218 -0.14244 -1.2268
+0.091279 -0.1423 -1.2255
+0.093591 -0.1423 -1.2256
+0.096063 -0.14255 -1.2277
+0.098504 -0.14274 -1.2293
+0.10082 -0.14274 -1.2293
+0.10323 -0.14287 -1.2305
+0.10557 -0.1429 -1.2307
+0.10762 -0.14254 -1.2276
+0.10945 -0.14192 -1.2222
+0.11383 -0.14164 -1.2198
+0.11825 -0.14144 -1.2179
+0.12047 -0.14135 -1.2172
+0.12274 -0.14132 -1.2169
+0.12503 -0.14131 -1.2168
+0.12497 -0.13049 -1.1226
+0.12611 -0.13057 -1.1233
+0.12842 -0.13076 -1.1249
+0.13076 -0.13098 -1.1268
+0.13191 -0.13107 -1.1276
+0.15247 -0.14126 -1.2163
+0.15468 -0.14119 -1.2156
+0.15935 -0.14126 -1.2163
+0.16429 -0.14157 -1.2189
+0.16672 -0.14169 -1.2199
+0.16929 -0.14192 -1.2219
+0.17188 -0.14215 -1.224
+0.17447 -0.14239 -1.226
+0.17918 -0.14246 -1.2266
+0.18389 -0.14253 -1.2272
+0.18891 -0.14282 -1.2298
+0.19391 -0.1431 -1.2321
+0.19902 -0.14343 -1.235
+0.2041 -0.14373 -1.2377
+0.20938 -0.14416 -1.2413
+0.21398 -0.14411 -1.2409
+0.21609 -0.14396 -1.2396
+0.21824 -0.14383 -1.2385
+0.22314 -0.14398 -1.2398
+0.22542 -0.14395 -1.2395
+0.22786 -0.14402 -1.2401
+0.22921 -0.14413 -1.2411
+0.26353 -0.15615 -1.3457
+0.26489 -0.15621 -1.3461
+0.26742 -0.15621 -1.3461
+0.27244 -0.15618 -1.3459
+0.27747 -0.15616 -1.3457
+0.28256 -0.15617 -1.3458
+0.28499 -0.15612 -1.3453
+0.28609 -0.15603 -1.3445
+0.28752 -0.15612 -1.3453
+0.29253 -0.15609 -1.345
+0.29755 -0.15606 -1.3448
+0.30252 -0.15602 -1.3444
+0.30771 -0.15608 -1.345
+0.31262 -0.15601 -1.3443
+0.31778 -0.15605 -1.3447
+0.32281 -0.15604 -1.3446
+0.32761 -0.15592 -1.3435
+0.33284 -0.15599 -1.3442
+0.33531 -0.15597 -1.344
+0.33778 -0.15594 -1.3438
+0.34283 -0.15593 -1.3437
+0.34409 -0.15593 -1.3437
+0.34911 -0.15591 -1.3436
+0.35036 -0.15591 -1.3435
+0.353 -0.15596 -1.344
+0.35549 -0.15594 -1.3438
+0.35794 -0.15591 -1.3435
+0.36053 -0.15593 -1.3438
+0.3618 -0.15593 -1.3438
+0.36793 -0.15586 -1.3431
+0.36921 -0.15586 -1.3432
+0.37805 -0.15586 -1.3432
+0.38688 -0.15585 -1.3432
+0.38807 -0.15582 -1.3429
+0.39064 -0.15584 -1.3431
+-0.40343 -0.15726 -1.3445
+-0.40257 -0.15741 -1.3459
+-0.40128 -0.15741 -1.3458
+-0.40002 -0.15741 -1.3458
+-0.39766 -0.15748 -1.3464
+-0.39257 -0.15746 -1.3462
+-0.39134 -0.15748 -1.3464
+-0.35725 -0.15533 -1.3276
+-0.35601 -0.15533 -1.3277
+-0.35476 -0.15533 -1.3277
+-0.35352 -0.15534 -1.3277
+-0.35233 -0.15536 -1.3279
+-0.34978 -0.15534 -1.3277
+-0.34858 -0.15537 -1.3279
+-0.34742 -0.1554 -1.3283
+-0.30204 -0.15782 -1.349
+-0.29728 -0.15799 -1.3505
+-0.21608 -0.15809 -1.3516
+-0.21344 -0.15802 -1.3509
+-0.21216 -0.15802 -1.3509
+-0.19682 -0.15594 -1.333
+-0.1954 -0.1558 -1.3318
+-0.19405 -0.15572 -1.3312
+-0.19279 -0.15572 -1.3311
+-0.17639 -0.15673 -1.3399
+-0.15575 -0.14459 -1.2351
+-0.1316 -0.14363 -1.2269
+-0.13022 -0.14337 -1.2247
+-0.11319 -0.13413 -1.1449
+-0.11211 -0.13413 -1.1449
+-0.11107 -0.13417 -1.1453
+-0.10997 -0.13414 -1.1451
+-0.10889 -0.13414 -1.1451
+-0.10794 -0.13431 -1.1465
+-0.10686 -0.13431 -1.1465
+-0.10578 -0.1343 -1.1465
+-0.1047 -0.13431 -1.1465
+-0.097944 -0.13105 -1.1184
+-0.096716 -0.13082 -1.1164
+-0.094327 -0.13043 -1.113
+-0.091602 -0.12954 -1.1053
+-0.089443 -0.12943 -1.1044
+-0.087439 -0.12955 -1.1054
+-0.08611 -0.13069 -1.1153
+-0.046338 -0.1312 -1.1198
+-0.045306 -0.13127 -1.1204
+-0.038222 -0.13613 -1.1624
+-0.037176 -0.13631 -1.1639
+-0.008748 -0.13761 -1.1752
+-0.007651 -0.13778 -1.1766
+0.004756 -0.1443 -1.233
+0.034346 -0.15756 -1.3475
+0.0356 -0.1575 -1.347
+0.038129 -0.15748 -1.3468
+0.045726 -0.15747 -1.3467
+0.049928 -0.15102 -1.291
+0.051106 -0.15091 -1.29
+0.05613 -0.14507 -1.2396
+0.058249 -0.14454 -1.235
+0.088258 -0.14417 -1.2318
+0.090232 -0.14362 -1.227
+0.092414 -0.14342 -1.2253
+0.093579 -0.14344 -1.2254
+0.094864 -0.14364 -1.2271
+0.1067 -0.14403 -1.2304
+0.10856 -0.14341 -1.2251
+0.12617 -0.13169 -1.1238
+0.12734 -0.1318 -1.1248
+0.12967 -0.13202 -1.1266
+0.13082 -0.13211 -1.1274
+0.16554 -0.1428 -1.2197
+0.16794 -0.14289 -1.2204
+0.22575 -0.14458 -1.2348
+0.22691 -0.14458 -1.2348
+0.22833 -0.14474 -1.2362
+0.26293 -0.15706 -1.3426
+0.26552 -0.1571 -1.3429
+0.28551 -0.15697 -1.3417
+0.34327 -0.15683 -1.3405
+0.34451 -0.15681 -1.3404
+0.34573 -0.15679 -1.3402
+0.34702 -0.15681 -1.3404
+0.34827 -0.1568 -1.3403
+0.35068 -0.15675 -1.3399
+0.35583 -0.1568 -1.3403
+0.36096 -0.15684 -1.3407
+0.36217 -0.15682 -1.3405
+0.36706 -0.15675 -1.3399
+0.36831 -0.15674 -1.3399
+0.36961 -0.15676 -1.34
+0.37087 -0.15676 -1.34
+0.37588 -0.15675 -1.3399
+0.38589 -0.15671 -1.3397
+0.40345 -0.15668 -1.3395
+-0.40298 -0.15835 -1.343
+-0.40198 -0.15845 -1.3439
+-0.40061 -0.15841 -1.3435
+-0.3982 -0.15846 -1.3439
+-0.39553 -0.1584 -1.3434
+-0.39296 -0.15838 -1.3432
+-0.36029 -0.15627 -1.325
+-0.35786 -0.1563 -1.3253
+-0.35534 -0.15629 -1.3252
+-0.35288 -0.1563 -1.3253
+-0.35059 -0.1564 -1.3261
+-0.3493 -0.15637 -1.3259
+-0.34819 -0.15644 -1.3264
+-0.3459 -0.15653 -1.3272
+-0.34358 -0.15662 -1.3279
+-0.33021 -0.15739 -1.3345
+-0.30761 -0.15869 -1.3456
+-0.30515 -0.15873 -1.3459
+-0.30283 -0.15884 -1.3469
+-0.30165 -0.15889 -1.3473
+-0.30042 -0.1589 -1.3474
+-0.298 -0.15897 -1.348
+-0.29684 -0.15902 -1.3485
+-0.29548 -0.15898 -1.3481
+-0.29291 -0.15896 -1.3479
+-0.22192 -0.15899 -1.3483
+-0.21929 -0.15893 -1.3478
+-0.21676 -0.15893 -1.3479
+-0.21548 -0.15892 -1.3478
+-0.21421 -0.15892 -1.3478
+-0.19748 -0.15672 -1.3289
+-0.19621 -0.1567 -1.3288
+-0.19355 -0.15657 -1.3277
+-0.19101 -0.15654 -1.3274
+-0.18868 -0.15668 -1.3286
+-0.17942 -0.15733 -1.3342
+-0.17725 -0.15764 -1.3369
+-0.17621 -0.15782 -1.3385
+-0.15571 -0.14572 -1.2348
+-0.15446 -0.14563 -1.2341
+-0.15205 -0.14555 -1.2334
+-0.14964 -0.14547 -1.2327
+-0.14724 -0.14539 -1.2321
+-0.13296 -0.145 -1.2287
+-0.13016 -0.14447 -1.2242
+-0.10823 -0.13575 -1.1496
+-0.096718 -0.13187 -1.1164
+-0.09557 -0.13174 -1.1153
+-0.092889 -0.13093 -1.1083
+-0.09158 -0.13055 -1.1051
+-0.090475 -0.13046 -1.1043
+-0.088387 -0.13045 -1.1042
+-0.086564 -0.13084 -1.1076
+-0.08504 -0.13172 -1.1151
+-0.082897 -0.13165 -1.1145
+-0.080725 -0.13154 -1.1135
+-0.078602 -0.1315 -1.1132
+-0.057828 -0.13199 -1.1174
+-0.053632 -0.13203 -1.1178
+-0.051536 -0.13206 -1.1181
+-0.049447 -0.13211 -1.1185
+-0.047378 -0.13222 -1.1194
+-0.045326 -0.13239 -1.1209
+-0.040187 -0.13646 -1.1558
+-0.039198 -0.13681 -1.1588
+-0.038192 -0.13712 -1.1615
+-0.036093 -0.13746 -1.1644
+-0.033967 -0.13773 -1.1667
+-0.016427 -0.13812 -1.1701
+-0.012026 -0.13822 -1.1709
+-0.009828 -0.13833 -1.1719
+-0.007636 -0.13861 -1.1743
+-0.006537 -0.13876 -1.1756
+0.031743 -0.15849 -1.3446
+0.032989 -0.1584 -1.3438
+0.034247 -0.15837 -1.3436
+0.036766 -0.15834 -1.3432
+0.039288 -0.15831 -1.3431
+0.041832 -0.15838 -1.3436
+0.044353 -0.15836 -1.3434
+0.04687 -0.15832 -1.3431
+0.049968 -0.15236 -1.292
+0.051059 -0.15199 -1.2888
+0.052251 -0.15192 -1.2883
+0.056118 -0.14621 -1.2393
+0.057184 -0.14595 -1.2371
+0.059328 -0.14549 -1.2332
+0.061479 -0.14509 -1.2297
+0.074732 -0.14386 -1.2191
+0.079561 -0.14429 -1.2228
+0.082161 -0.14481 -1.2273
+0.084742 -0.14527 -1.2312
+0.087095 -0.14533 -1.2317
+0.089317 -0.14517 -1.2303
+0.090336 -0.14495 -1.2284
+0.091368 -0.14475 -1.2267
+0.092419 -0.14459 -1.2253
+0.093696 -0.14478 -1.227
+0.096168 -0.14502 -1.229
+0.0985 -0.14505 -1.2292
+0.10082 -0.14505 -1.2293
+0.10321 -0.14515 -1.2302
+0.10557 -0.14521 -1.2306
+0.10672 -0.1452 -1.2306
+0.1077 -0.14496 -1.2285
+0.10948 -0.14426 -1.2224
+0.11149 -0.14389 -1.2193
+0.11374 -0.14383 -1.2188
+0.11597 -0.14374 -1.218
+0.12045 -0.14362 -1.2169
+0.12494 -0.1435 -1.216
+0.12722 -0.14349 -1.2159
+0.12738 -0.13291 -1.1251
+0.12858 -0.13305 -1.1264
+0.12974 -0.13315 -1.1272
+0.15038 -0.14374 -1.2179
+0.15252 -0.14359 -1.2166
+0.15464 -0.14343 -1.2152
+0.15686 -0.14337 -1.2147
+0.16165 -0.14356 -1.2163
+0.16415 -0.14375 -1.2179
+0.16547 -0.14389 -1.2191
+0.16662 -0.14389 -1.2191
+0.16896 -0.14393 -1.2195
+0.17144 -0.14409 -1.2208
+0.17414 -0.14442 -1.2236
+0.17652 -0.14448 -1.2242
+0.17877 -0.14444 -1.2238
+0.18104 -0.14441 -1.2235
+0.186 -0.14468 -1.2258
+0.19086 -0.14486 -1.2274
+0.20584 -0.14565 -1.234
+0.20826 -0.14571 -1.2346
+0.2107 -0.14579 -1.2353
+0.21313 -0.14586 -1.2359
+0.21543 -0.14585 -1.2357
+0.21764 -0.14576 -1.235
+0.21977 -0.14563 -1.2339
+0.2218 -0.14544 -1.2323
+0.22412 -0.14544 -1.2323
+0.22658 -0.14553 -1.233
+0.228 -0.1457 -1.2344
+0.26235 -0.15798 -1.3396
+0.26364 -0.158 -1.3397
+0.26611 -0.15797 -1.3394
+0.2686 -0.15795 -1.3393
+0.28363 -0.15789 -1.3388
+0.28602 -0.15782 -1.3382
+0.2886 -0.15785 -1.3385
+0.33375 -0.15776 -1.3377
+0.33883 -0.15778 -1.3379
+0.34138 -0.15779 -1.338
+0.34377 -0.15774 -1.3375
+0.34623 -0.15771 -1.3373
+0.34869 -0.15768 -1.3371
+0.35128 -0.15772 -1.3374
+0.35376 -0.1577 -1.3372
+0.35503 -0.15771 -1.3373
+0.36012 -0.15773 -1.3375
+0.36133 -0.15771 -1.3373
+0.36746 -0.15764 -1.3367
+0.3687 -0.15763 -1.3367
+0.37001 -0.15765 -1.3369
+0.37501 -0.15764 -1.3368
+0.37619 -0.15761 -1.3365
+0.38496 -0.15759 -1.3365
+0.38626 -0.15761 -1.3366
+0.38869 -0.15757 -1.3363
+0.40252 -0.15757 -1.3364
+-0.4024 -0.15938 -1.341
+-0.40114 -0.15938 -1.3411
+-0.39985 -0.15937 -1.3409
+-0.39855 -0.15936 -1.3408
+-0.39728 -0.15935 -1.3408
+-0.39597 -0.15933 -1.3406
+-0.36318 -0.15715 -1.3219
+-0.36197 -0.15717 -1.322
+-0.36081 -0.1572 -1.3223
+-0.34887 -0.15743 -1.3242
+-0.34665 -0.15755 -1.3253
+-0.30106 -0.15984 -1.3446
+-0.29865 -0.15991 -1.3452
+-0.29752 -0.15998 -1.3458
+-0.29624 -0.15997 -1.3458
+-0.21746 -0.15978 -1.3443
+-0.21619 -0.15978 -1.3443
+-0.19828 -0.15761 -1.3259
+-0.19697 -0.15756 -1.3255
+-0.17583 -0.15875 -1.3356
+-0.15442 -0.14676 -1.2338
+-0.15318 -0.14669 -1.2332
+-0.15077 -0.1466 -1.2324
+-0.10624 -0.13848 -1.1636
+-0.096722 -0.13293 -1.1164
+-0.095589 -0.13282 -1.1155
+-0.094283 -0.13246 -1.1125
+-0.091569 -0.13158 -1.1049
+-0.089409 -0.13147 -1.104
+-0.087378 -0.13154 -1.1046
+-0.086387 -0.13162 -1.1053
+-0.085562 -0.13195 -1.1081
+-0.083847 -0.13255 -1.1132
+-0.082863 -0.13265 -1.1141
+-0.081813 -0.13265 -1.1141
+-0.050489 -0.13313 -1.1182
+-0.049441 -0.13315 -1.1184
+-0.048409 -0.13321 -1.1189
+-0.040189 -0.13756 -1.1559
+-0.039182 -0.13785 -1.1583
+-0.037133 -0.13835 -1.1626
+-0.006525 -0.13962 -1.1734
+-0.005425 -0.13977 -1.1747
+0.032902 -0.15925 -1.3402
+0.051076 -0.15325 -1.2892
+0.052231 -0.15308 -1.2878
+0.057178 -0.1471 -1.237
+0.058252 -0.14687 -1.235
+0.080712 -0.14544 -1.2228
+0.090432 -0.14626 -1.2297
+0.092595 -0.14602 -1.2277
+0.094972 -0.14612 -1.2285
+0.10671 -0.14635 -1.2304
+0.10873 -0.14595 -1.227
+0.1493 -0.14496 -1.2185
+0.16523 -0.14483 -1.2174
+0.16754 -0.14485 -1.2175
+0.22749 -0.14653 -1.2316
+0.26159 -0.15878 -1.3357
+0.26424 -0.15886 -1.3363
+0.35423 -0.15861 -1.3342
+0.35919 -0.15858 -1.334
+0.36168 -0.15857 -1.3339
+0.36662 -0.15854 -1.3337
+0.36915 -0.15855 -1.3338
+0.37415 -0.15853 -1.3337
+0.37651 -0.15847 -1.3332
+0.38151 -0.15846 -1.3331
+0.3828 -0.15848 -1.3333
+0.38406 -0.15848 -1.3333
+0.39285 -0.15848 -1.3334
+0.39405 -0.15846 -1.3332
+0.40156 -0.15845 -1.3332
+-0.40169 -0.16036 -1.3387
+-0.40035 -0.16033 -1.3384
+-0.3663 -0.15813 -1.3197
+-0.36377 -0.15811 -1.3195
+-0.36121 -0.15808 -1.3192
+-0.35894 -0.15817 -1.32
+-0.35659 -0.15823 -1.3205
+-0.35423 -0.15829 -1.321
+-0.34979 -0.15853 -1.323
+-0.34744 -0.1586 -1.3235
+-0.34519 -0.15871 -1.3245
+-0.3408 -0.15898 -1.3268
+-0.33629 -0.15922 -1.3287
+-0.3319 -0.15951 -1.3312
+-0.32741 -0.15976 -1.3333
+-0.32287 -0.16 -1.3353
+-0.31834 -0.16025 -1.3374
+-0.31359 -0.1604 -1.3387
+-0.30907 -0.16067 -1.3409
+-0.30416 -0.16074 -1.3415
+-0.30176 -0.16081 -1.3421
+-0.29925 -0.16082 -1.3422
+-0.29691 -0.16092 -1.343
+-0.29431 -0.16088 -1.3427
+-0.28928 -0.16089 -1.3428
+-0.28424 -0.1609 -1.3429
+-0.27917 -0.16089 -1.3428
+-0.27411 -0.16089 -1.3428
+-0.26902 -0.16086 -1.3426
+-0.26389 -0.16082 -1.3422
+-0.25885 -0.16083 -1.3423
+-0.25383 -0.16085 -1.3425
+-0.24871 -0.16081 -1.3421
+-0.2437 -0.16083 -1.3424
+-0.2386 -0.16081 -1.3422
+-0.23336 -0.16067 -1.3411
+-0.22846 -0.16078 -1.342
+-0.22338 -0.16076 -1.3418
+-0.22081 -0.16073 -1.3416
+-0.2182 -0.16066 -1.341
+-0.21684 -0.16059 -1.3404
+-0.19903 -0.15847 -1.3226
+-0.19773 -0.15842 -1.3222
+-0.19509 -0.15829 -1.3211
+-0.19031 -0.15846 -1.3225
+-0.18566 -0.15874 -1.3249
+-0.18112 -0.15913 -1.3282
+-0.17668 -0.15964 -1.3325
+-0.17564 -0.15983 -1.3341
+-0.15313 -0.1478 -1.2328
+-0.15193 -0.14776 -1.2324
+-0.14955 -0.1477 -1.2319
+-0.14474 -0.14753 -1.2305
+-0.14008 -0.1475 -1.2303
+-0.13532 -0.14737 -1.2292
+-0.13289 -0.14724 -1.2281
+-0.10888 -0.14015 -1.1684
+-0.10777 -0.14014 -1.1683
+-0.1066 -0.14006 -1.1676
+-0.094276 -0.1335 -1.1124
+-0.092881 -0.13301 -1.1082
+-0.091555 -0.1326 -1.1048
+-0.090452 -0.13251 -1.104
+-0.088352 -0.13248 -1.1038
+-0.086357 -0.13261 -1.1049
+-0.084369 -0.13276 -1.1062
+-0.082593 -0.13326 -1.1104
+-0.081743 -0.13359 -1.1131
+-0.080721 -0.13363 -1.1135
+-0.078654 -0.13369 -1.1139
+-0.076554 -0.13369 -1.114
+-0.072306 -0.1336 -1.1132
+-0.068112 -0.13361 -1.1133
+-0.064067 -0.13392 -1.116
+-0.059939 -0.1341 -1.1175
+-0.057854 -0.13415 -1.1179
+-0.055752 -0.13417 -1.118
+-0.053646 -0.13417 -1.1181
+-0.051541 -0.13418 -1.1182
+-0.050487 -0.13418 -1.1182
+-0.042245 -0.13825 -1.1525
+-0.041223 -0.13846 -1.1543
+-0.040182 -0.13862 -1.1557
+-0.038146 -0.13914 -1.16
+-0.036056 -0.13951 -1.1632
+-0.031758 -0.13989 -1.1663
+-0.027404 -0.1401 -1.1681
+-0.023005 -0.14011 -1.1683
+-0.018594 -0.14005 -1.1677
+-0.014191 -0.14002 -1.1675
+-0.009801 -0.14016 -1.1686
+-0.007608 -0.14032 -1.17
+-0.005416 -0.14063 -1.1726
+-0.004317 -0.14081 -1.1741
+-0.003216 -0.14102 -1.1759
+0.029055 -0.16015 -1.3372
+0.03156 -0.16009 -1.3367
+0.034077 -0.1601 -1.3368
+0.039118 -0.16015 -1.3372
+0.04416 -0.16018 -1.3375
+0.046657 -0.16012 -1.3369
+0.049931 -0.15468 -1.291
+0.052197 -0.15419 -1.287
+0.053394 -0.15415 -1.2866
+0.057171 -0.14825 -1.2368
+0.059329 -0.14782 -1.2332
+0.063615 -0.14699 -1.2262
+0.067866 -0.1462 -1.2195
+0.072256 -0.14579 -1.216
+0.074499 -0.1457 -1.2153
+0.076882 -0.14588 -1.2168
+0.079315 -0.14614 -1.2189
+0.080523 -0.14625 -1.2199
+0.081846 -0.14656 -1.2225
+0.084729 -0.14757 -1.231
+0.087106 -0.14767 -1.2319
+0.089363 -0.14756 -1.231
+0.091576 -0.1474 -1.2295
+0.093838 -0.14731 -1.2288
+0.096151 -0.14731 -1.2288
+0.10081 -0.14736 -1.2292
+0.10554 -0.14749 -1.2303
+0.10776 -0.14737 -1.2292
+0.10878 -0.14718 -1.2276
+0.1096 -0.14673 -1.2239
+0.11147 -0.14615 -1.219
+0.11371 -0.14608 -1.2184
+0.11819 -0.14595 -1.2172
+0.12263 -0.14578 -1.2158
+0.12718 -0.14574 -1.2154
+0.12947 -0.14575 -1.2155
+0.14818 -0.14613 -1.2187
+0.15044 -0.1461 -1.2184
+0.15264 -0.14601 -1.2176
+0.15468 -0.14576 -1.2156
+0.15902 -0.14555 -1.2137
+0.16376 -0.1457 -1.215
+0.16608 -0.14572 -1.2152
+0.16838 -0.14573 -1.2153
+0.17077 -0.14582 -1.216
+0.17361 -0.14628 -1.2198
+0.17612 -0.14646 -1.2214
+0.17839 -0.14643 -1.2211
+0.18314 -0.14655 -1.2221
+0.18551 -0.1466 -1.2225
+0.18788 -0.14666 -1.223
+0.19024 -0.1467 -1.2233
+0.1927 -0.14682 -1.2243
+0.19781 -0.14718 -1.2274
+0.20296 -0.14757 -1.2306
+0.20517 -0.14749 -1.23
+0.20729 -0.14735 -1.2288
+0.20942 -0.14722 -1.2277
+0.21196 -0.14738 -1.229
+0.21478 -0.14773 -1.232
+0.21711 -0.14773 -1.232
+0.2211 -0.1473 -1.2283
+0.22333 -0.14724 -1.2278
+0.22573 -0.1473 -1.2283
+0.22829 -0.14746 -1.2296
+0.26102 -0.15968 -1.3327
+0.26233 -0.15972 -1.333
+0.26483 -0.15972 -1.3329
+0.2698 -0.15969 -1.3327
+0.27478 -0.15966 -1.3325
+0.27969 -0.15961 -1.332
+0.28467 -0.15959 -1.3318
+0.28972 -0.1596 -1.332
+0.29475 -0.15961 -1.332
+0.29975 -0.15961 -1.332
+0.30478 -0.15962 -1.3321
+0.30966 -0.15954 -1.3315
+0.31468 -0.15955 -1.3315
+0.31962 -0.15951 -1.3312
+0.32466 -0.15953 -1.3313
+0.32981 -0.15959 -1.3319
+0.33474 -0.15955 -1.3316
+0.33951 -0.15944 -1.3306
+0.34215 -0.1595 -1.3311
+0.34452 -0.15944 -1.3306
+0.34959 -0.15947 -1.3309
+0.35221 -0.15952 -1.3313
+0.35347 -0.15952 -1.3313
+0.3583 -0.15944 -1.3307
+0.35956 -0.15945 -1.3307
+0.36085 -0.15946 -1.3309
+0.36579 -0.15943 -1.3306
+0.36703 -0.15942 -1.3306
+0.36829 -0.15943 -1.3306
+0.37332 -0.15944 -1.3307
+0.37462 -0.15946 -1.3309
+0.37572 -0.15939 -1.3303
+0.38066 -0.15937 -1.3302
+0.38202 -0.15941 -1.3305
+0.38443 -0.15937 -1.3302
+0.3868 -0.15932 -1.3298
+0.3919 -0.15936 -1.3301
+0.39317 -0.15936 -1.3302
+0.40036 -0.15923 -1.3292
+-0.36917 -0.15901 -1.3166
+-0.36799 -0.15903 -1.3168
+-0.36683 -0.15907 -1.3171
+-0.36427 -0.15903 -1.3168
+-0.35719 -0.15919 -1.3181
+-0.356 -0.15921 -1.3183
+-0.35476 -0.15921 -1.3183
+-0.22153 -0.16159 -1.3382
+-0.21894 -0.16154 -1.3378
+-0.20106 -0.15935 -1.3195
+-0.19979 -0.15932 -1.3193
+-0.19849 -0.15928 -1.3189
+-0.19593 -0.15921 -1.3184
+-0.17537 -0.16084 -1.3321
+-0.17414 -0.16086 -1.3322
+-0.15312 -0.14894 -1.2326
+-0.15069 -0.14884 -1.2318
+-0.10885 -0.14122 -1.1681
+-0.10775 -0.14122 -1.1681
+-0.10658 -0.14113 -1.1674
+-0.09295 -0.13415 -1.109
+-0.091607 -0.13372 -1.1054
+-0.089384 -0.13351 -1.1037
+-0.083312 -0.13379 -1.106
+-0.082382 -0.13397 -1.1075
+-0.081441 -0.13414 -1.1089
+-0.079618 -0.13459 -1.1127
+-0.078641 -0.13471 -1.1138
+-0.077611 -0.13475 -1.114
+-0.056816 -0.13525 -1.1183
+-0.055766 -0.13525 -1.1183
+-0.054708 -0.13525 -1.1183
+-0.053659 -0.13526 -1.1184
+-0.052611 -0.13527 -1.1185
+-0.042259 -0.13938 -1.1529
+-0.041227 -0.13956 -1.1544
+-0.004308 -0.14163 -1.1718
+-0.002106 -0.14203 -1.175
+0.027728 -0.16101 -1.3338
+0.050998 -0.15544 -1.2872
+0.053381 -0.15532 -1.2863
+0.058252 -0.1492 -1.235
+0.075474 -0.14651 -1.2125
+0.080403 -0.14718 -1.218
+0.10877 -0.14833 -1.2276
+0.1105 -0.14754 -1.221
+0.11259 -0.14727 -1.2187
+0.14815 -0.14725 -1.2184
+0.14928 -0.14723 -1.2182
+0.15157 -0.14723 -1.2182
+0.15369 -0.14706 -1.2169
+0.17446 -0.14718 -1.2178
+0.17561 -0.14718 -1.2178
+0.17697 -0.14736 -1.2193
+0.18634 -0.1475 -1.2204
+0.1874 -0.14743 -1.2198
+0.18855 -0.14743 -1.2198
+0.18979 -0.1475 -1.2204
+0.19105 -0.14759 -1.2211
+0.22924 -0.14848 -1.2285
+0.23057 -0.1486 -1.2295
+0.26173 -0.16061 -1.3299
+0.26294 -0.16059 -1.3297
+0.33999 -0.16033 -1.3276
+0.34111 -0.16027 -1.3271
+0.34246 -0.16031 -1.3275
+0.35011 -0.16039 -1.3281
+0.35502 -0.16034 -1.3277
+0.35621 -0.16032 -1.3275
+0.35742 -0.1603 -1.3274
+0.35998 -0.16033 -1.3276
+0.36126 -0.16034 -1.3278
+0.36251 -0.16034 -1.3277
+0.36377 -0.16034 -1.3278
+0.36498 -0.16033 -1.3277
+0.36741 -0.1603 -1.3274
+0.37244 -0.16031 -1.3276
+0.37486 -0.16028 -1.3273
+0.37608 -0.16027 -1.3272
+0.37729 -0.16025 -1.3271
+0.37853 -0.16025 -1.327
+0.37977 -0.16024 -1.327
+0.38223 -0.16022 -1.3269
+0.39092 -0.16021 -1.3268
+0.39583 -0.16017 -1.3265
+0.39704 -0.16015 -1.3264
+0.39829 -0.16015 -1.3264
+0.39958 -0.16017 -1.3266
+-0.37221 -0.15995 -1.3142
+-0.3697 -0.15994 -1.3141
+-0.36717 -0.15992 -1.3139
+-0.36492 -0.16001 -1.3147
+-0.36244 -0.16001 -1.3147
+-0.36022 -0.16012 -1.3156
+-0.35789 -0.16019 -1.3161
+-0.35561 -0.16028 -1.3169
+-0.35443 -0.1603 -1.3171
+-0.35342 -0.16041 -1.3179
+-0.35122 -0.16054 -1.319
+-0.34692 -0.16085 -1.3215
+-0.31981 -0.16224 -1.333
+-0.31754 -0.16236 -1.334
+-0.31516 -0.16243 -1.3346
+-0.31267 -0.16244 -1.3347
+-0.31021 -0.16247 -1.3349
+-0.30549 -0.16263 -1.3363
+-0.3031 -0.1627 -1.3368
+-0.30057 -0.16269 -1.3367
+-0.29547 -0.16266 -1.3365
+-0.25505 -0.16254 -1.3356
+-0.2524 -0.16246 -1.3349
+-0.24996 -0.1625 -1.3353
+-0.2249 -0.16256 -1.3358
+-0.22222 -0.16244 -1.3348
+-0.2209 -0.16239 -1.3344
+-0.21963 -0.16238 -1.3343
+-0.20322 -0.16033 -1.3173
+-0.20188 -0.16025 -1.3167
+-0.19921 -0.1601 -1.3155
+-0.19667 -0.16004 -1.315
+-0.19425 -0.16009 -1.3154
+-0.19186 -0.16016 -1.316
+-0.17834 -0.16138 -1.3261
+-0.17613 -0.16164 -1.3283
+-0.17392 -0.16191 -1.3305
+-0.15312 -0.15011 -1.2326
+-0.15182 -0.14997 -1.2315
+-0.14943 -0.1499 -1.2309
+-0.14699 -0.14978 -1.2299
+-0.14459 -0.14969 -1.2292
+-0.14229 -0.14971 -1.2293
+-0.13994 -0.14967 -1.2291
+-0.13763 -0.14968 -1.2291
+-0.13531 -0.14967 -1.229
+-0.13295 -0.14963 -1.2287
+-0.11449 -0.14249 -1.1695
+-0.11315 -0.14218 -1.1669
+-0.1109 -0.14212 -1.1665
+-0.10979 -0.1421 -1.1663
+-0.10869 -0.14211 -1.1663
+-0.1065 -0.14212 -1.1664
+-0.1054 -0.14212 -1.1664
+-0.091781 -0.13502 -1.1075
+-0.090463 -0.13461 -1.1041
+-0.088358 -0.13458 -1.1038
+-0.086343 -0.13468 -1.1047
+-0.084337 -0.1348 -1.1057
+-0.082345 -0.13495 -1.107
+-0.08035 -0.13511 -1.1083
+-0.078484 -0.13549 -1.1115
+-0.076577 -0.13583 -1.1143
+-0.074516 -0.1359 -1.1149
+-0.070339 -0.13595 -1.1153
+-0.066237 -0.13617 -1.1171
+-0.064162 -0.13623 -1.1177
+-0.062105 -0.13634 -1.1186
+-0.060017 -0.13639 -1.119
+-0.05789 -0.13635 -1.1186
+-0.044347 -0.1402 -1.1507
+-0.043307 -0.14034 -1.1518
+-0.042267 -0.14049 -1.1531
+-0.04019 -0.14083 -1.1559
+-0.038121 -0.14123 -1.1592
+-0.007589 -0.14217 -1.167
+-0.005398 -0.14237 -1.1687
+-0.003203 -0.14268 -1.1713
+-0.002103 -0.1429 -1.1731
+0.025166 -0.16193 -1.3311
+0.02641 -0.16188 -1.3306
+0.028913 -0.16187 -1.3306
+0.031417 -0.16188 -1.3306
+0.046435 -0.16186 -1.3305
+0.049826 -0.15678 -1.2883
+0.052162 -0.15651 -1.2861
+0.053313 -0.15634 -1.2846
+0.057151 -0.15052 -1.2364
+0.059324 -0.15013 -1.2331
+0.061434 -0.14962 -1.2288
+0.069949 -0.14805 -1.2157
+0.072103 -0.14777 -1.2134
+0.074205 -0.1474 -1.2104
+0.075341 -0.1474 -1.2103
+0.0766 -0.14763 -1.2122
+0.079062 -0.14796 -1.215
+0.081533 -0.14829 -1.2178
+0.084604 -0.14967 -1.2292
+0.087054 -0.1499 -1.2311
+0.089373 -0.1499 -1.2311
+0.093878 -0.14969 -1.2293
+0.098475 -0.14964 -1.2289
+0.10768 -0.14957 -1.2283
+0.10879 -0.14951 -1.2278
+0.1097 -0.14916 -1.2249
+0.11155 -0.14856 -1.2199
+0.11374 -0.14841 -1.2187
+0.11598 -0.14835 -1.2181
+0.12947 -0.14803 -1.2154
+0.13173 -0.148 -1.2152
+0.1458 -0.14834 -1.218
+0.14693 -0.14832 -1.2178
+0.14806 -0.1483 -1.2177
+0.15035 -0.14831 -1.2177
+0.15154 -0.14834 -1.218
+0.15257 -0.14823 -1.2171
+0.15469 -0.14807 -1.2157
+0.15681 -0.14791 -1.2144
+0.16588 -0.14784 -1.2137
+0.17048 -0.14786 -1.2139
+0.17285 -0.14793 -1.2145
+0.174 -0.14793 -1.2145
+0.17534 -0.1481 -1.2158
+0.17795 -0.14837 -1.2181
+0.18032 -0.14843 -1.2186
+0.18493 -0.14844 -1.2187
+0.18721 -0.14843 -1.2185
+0.18964 -0.14853 -1.2194
+0.19216 -0.14871 -1.2209
+0.19463 -0.14884 -1.2219
+0.19988 -0.14932 -1.2259
+0.20204 -0.14921 -1.225
+0.2041 -0.14903 -1.2235
+0.20627 -0.14893 -1.2227
+0.2086 -0.14895 -1.2228
+0.21374 -0.14932 -1.2259
+0.21614 -0.14938 -1.2264
+0.21835 -0.14932 -1.2258
+0.22273 -0.14916 -1.2245
+0.22502 -0.14915 -1.2244
+0.22752 -0.14927 -1.2255
+0.23022 -0.14953 -1.2276
+0.26231 -0.16145 -1.3265
+0.26356 -0.16145 -1.3265
+0.26602 -0.16143 -1.3263
+0.28599 -0.16142 -1.3262
+0.28852 -0.16144 -1.3264
+0.29089 -0.16137 -1.3258
+0.29351 -0.16144 -1.3264
+0.29579 -0.16132 -1.3254
+0.32565 -0.16128 -1.3251
+0.32797 -0.1612 -1.3244
+0.33049 -0.16121 -1.3245
+0.33296 -0.1612 -1.3244
+0.33553 -0.16123 -1.3247
+0.33793 -0.16119 -1.3244
+0.34043 -0.1612 -1.3244
+0.34279 -0.16113 -1.3239
+0.34543 -0.1612 -1.3245
+0.348 -0.16124 -1.3248
+0.34929 -0.16126 -1.3249
+0.35423 -0.16124 -1.3248
+0.35538 -0.16119 -1.3244
+0.35783 -0.16117 -1.3243
+0.36044 -0.16122 -1.3247
+0.36308 -0.16129 -1.3252
+0.36532 -0.16117 -1.3243
+0.36783 -0.16118 -1.3244
+0.37037 -0.1612 -1.3246
+0.37278 -0.16117 -1.3243
+0.37522 -0.16115 -1.3241
+0.37757 -0.16109 -1.3236
+0.37994 -0.16104 -1.3232
+0.38258 -0.1611 -1.3238
+0.38499 -0.16106 -1.3235
+0.39 -0.16108 -1.3236
+0.39499 -0.16108 -1.3237
+0.39774 -0.16118 -1.3246
+0.39897 -0.16118 -1.3245
+-0.37648 -0.1609 -1.3119
+-0.37519 -0.16088 -1.3117
+-0.37381 -0.16082 -1.3112
+-0.37263 -0.16084 -1.3113
+-0.35419 -0.16143 -1.3161
+-0.31582 -0.16338 -1.332
+-0.31465 -0.16342 -1.3324
+-0.31332 -0.16338 -1.3321
+-0.22297 -0.16332 -1.3317
+-0.22148 -0.16315 -1.3303
+-0.20395 -0.16117 -1.314
+-0.20262 -0.1611 -1.3134
+-0.19997 -0.16095 -1.3122
+-0.17239 -0.1629 -1.3284
+-0.15313 -0.15129 -1.2327
+-0.1506 -0.15108 -1.2311
+-0.14819 -0.15098 -1.2302
+-0.14696 -0.1509 -1.2296
+-0.14572 -0.15082 -1.2289
+-0.1434 -0.15082 -1.2289
+-0.14224 -0.15082 -1.2289
+-0.14107 -0.1508 -1.2288
+-0.13416 -0.15084 -1.2291
+-0.11659 -0.14347 -1.1684
+-0.11531 -0.14323 -1.1665
+-0.11399 -0.14296 -1.1643
+-0.11169 -0.14283 -1.1632
+-0.11055 -0.14277 -1.1627
+-0.10941 -0.14271 -1.1622
+-0.10836 -0.14277 -1.1628
+-0.10735 -0.14288 -1.1637
+-0.10526 -0.14303 -1.1649
+-0.10416 -0.14303 -1.1649
+-0.090589 -0.13584 -1.1057
+-0.089407 -0.13563 -1.1039
+-0.079335 -0.1362 -1.1087
+-0.07832 -0.13626 -1.1092
+-0.077321 -0.13634 -1.1098
+-0.063236 -0.13756 -1.12
+-0.06114 -0.1376 -1.1202
+-0.0601 -0.13763 -1.1205
+-0.059044 -0.13763 -1.1205
+-0.057975 -0.1376 -1.1203
+-0.046426 -0.14101 -1.1484
+-0.045394 -0.14117 -1.1497
+-0.043319 -0.14147 -1.1522
+-0.04123 -0.14175 -1.1545
+-0.0021 -0.14378 -1.1712
+-0.000998 -0.14398 -1.1729
+0.022606 -0.16278 -1.3278
+0.023855 -0.16278 -1.3278
+0.025102 -0.16276 -1.3276
+0.027596 -0.16274 -1.3274
+0.047488 -0.16244 -1.3249
+0.050941 -0.15769 -1.2858
+0.052102 -0.15754 -1.2846
+0.057143 -0.15167 -1.2362
+0.058269 -0.15157 -1.2354
+0.07522 -0.1483 -1.2084
+0.082701 -0.14948 -1.2181
+0.085743 -0.1508 -1.2289
+0.10872 -0.15056 -1.2269
+0.14461 -0.14944 -1.2176
+0.14686 -0.1494 -1.2173
+0.14905 -0.1493 -1.2164
+0.15135 -0.14931 -1.2165
+0.15358 -0.14925 -1.216
+0.17378 -0.14889 -1.2129
+0.1751 -0.14904 -1.2142
+0.17641 -0.14918 -1.2153
+0.20241 -0.14978 -1.2202
+0.20356 -0.14978 -1.2202
+0.20473 -0.1498 -1.2203
+0.22603 -0.15021 -1.2236
+0.22725 -0.15025 -1.224
+0.22849 -0.1503 -1.2244
+0.23133 -0.15065 -1.2273
+0.23301 -0.15099 -1.2301
+0.23603 -0.15219 -1.24
+0.26169 -0.16231 -1.3233
+0.28905 -0.16229 -1.3231
+0.2904 -0.16235 -1.3235
+0.29157 -0.16231 -1.3232
+0.34847 -0.16212 -1.3218
+0.35337 -0.16209 -1.3215
+0.35597 -0.16214 -1.322
+0.38542 -0.16197 -1.3207
+0.38664 -0.16196 -1.3206
+0.38791 -0.16197 -1.3207
+0.3953 -0.16194 -1.3205
+0.3963 -0.16184 -1.3197
+0.39814 -0.16208 -1.3217
+-0.37931 -0.16176 -1.3089
+-0.37807 -0.16176 -1.3088
+-0.37684 -0.16176 -1.3088
+-0.37563 -0.16177 -1.3089
+-0.37301 -0.1617 -1.3083
+-0.37065 -0.16175 -1.3087
+-0.36621 -0.16197 -1.3104
+-0.36157 -0.16209 -1.3115
+-0.35712 -0.16232 -1.3133
+-0.35492 -0.16245 -1.3143
+-0.35287 -0.16264 -1.3159
+-0.34846 -0.16289 -1.3179
+-0.34408 -0.16317 -1.3201
+-0.33962 -0.16342 -1.3222
+-0.33515 -0.16366 -1.3242
+-0.33053 -0.16384 -1.3256
+-0.32591 -0.16403 -1.3272
+-0.32118 -0.16417 -1.3282
+-0.31637 -0.16426 -1.329
+-0.31396 -0.16432 -1.3295
+-0.31148 -0.16433 -1.3295
+-0.30663 -0.16441 -1.3302
+-0.30162 -0.16441 -1.3302
+-0.29662 -0.16442 -1.3303
+-0.29156 -0.16438 -1.33
+-0.28658 -0.1644 -1.3301
+-0.28156 -0.16439 -1.3301
+-0.27653 -0.16438 -1.33
+-0.27154 -0.16439 -1.3301
+-0.26646 -0.16435 -1.3297
+-0.26129 -0.16425 -1.3289
+-0.25635 -0.16428 -1.3292
+-0.25136 -0.16429 -1.3293
+-0.24631 -0.16426 -1.3291
+-0.24135 -0.16429 -1.3293
+-0.23633 -0.16428 -1.3292
+-0.23128 -0.16425 -1.329
+-0.22624 -0.16422 -1.3288
+-0.22363 -0.16414 -1.3282
+-0.2223 -0.16408 -1.3277
+-0.22101 -0.16405 -1.3274
+-0.2047 -0.16202 -1.3109
+-0.20336 -0.16194 -1.3102
+-0.20072 -0.1618 -1.3091
+-0.19825 -0.1618 -1.309
+-0.19343 -0.16188 -1.3098
+-0.1887 -0.16206 -1.3112
+-0.18431 -0.16253 -1.3151
+-0.1799 -0.16303 -1.3192
+-0.17546 -0.16352 -1.3232
+-0.17323 -0.16376 -1.3252
+-0.17216 -0.16393 -1.3266
+-0.15346 -0.15277 -1.2354
+-0.1521 -0.15257 -1.2338
+-0.1496 -0.15239 -1.2323
+-0.14714 -0.15226 -1.2312
+-0.14472 -0.15215 -1.2303
+-0.14234 -0.15208 -1.2298
+-0.13997 -0.15202 -1.2293
+-0.13538 -0.15206 -1.2297
+-0.13416 -0.15199 -1.2291
+-0.11877 -0.14454 -1.1682
+-0.1175 -0.14433 -1.1665
+-0.11501 -0.14397 -1.1636
+-0.11256 -0.14364 -1.1609
+-0.11038 -0.14365 -1.1609
+-0.10819 -0.14364 -1.1609
+-0.10614 -0.14383 -1.1624
+-0.10403 -0.14394 -1.1634
+-0.10298 -0.14401 -1.1639
+-0.090816 -0.13723 -1.1085
+-0.08839 -0.13671 -1.1042
+-0.086322 -0.13673 -1.1044
+-0.084322 -0.13686 -1.1055
+-0.080332 -0.13717 -1.108
+-0.078307 -0.13728 -1.109
+-0.076242 -0.13733 -1.1093
+-0.074444 -0.13787 -1.1138
+-0.072457 -0.13809 -1.1156
+-0.070433 -0.13824 -1.1168
+-0.068408 -0.1384 -1.1182
+-0.066378 -0.13857 -1.1195
+-0.064365 -0.13878 -1.1212
+-0.062566 -0.13948 -1.127
+-0.050679 -0.14188 -1.1467
+-0.048551 -0.14198 -1.1475
+-0.047499 -0.14207 -1.1482
+-0.046467 -0.14222 -1.1494
+-0.044385 -0.14249 -1.1516
+-0.042286 -0.14273 -1.1536
+-0.040194 -0.14303 -1.156
+-0.035962 -0.14352 -1.1601
+-0.031655 -0.14382 -1.1625
+-0.027306 -0.14399 -1.1639
+-0.022921 -0.14399 -1.1639
+-0.018524 -0.14391 -1.1632
+-0.01414 -0.1439 -1.1632
+-0.009761 -0.14397 -1.1638
+-0.005385 -0.14424 -1.1659
+-0.003194 -0.14448 -1.1679
+-0.000996 -0.14488 -1.1712
+0.000107 -0.14511 -1.1731
+0.021311 -0.16368 -1.3249
+0.023796 -0.16363 -1.3245
+0.026285 -0.16361 -1.3243
+0.028778 -0.16361 -1.3243
+0.033758 -0.16359 -1.3241
+0.038751 -0.16363 -1.3245
+0.04373 -0.16361 -1.3243
+0.046225 -0.16362 -1.3244
+0.047373 -0.16329 -1.3216
+0.04982 -0.15918 -1.2881
+0.05204 -0.15856 -1.283
+0.056198 -0.15343 -1.2411
+0.057215 -0.15303 -1.2377
+0.059363 -0.15256 -1.2339
+0.061454 -0.15198 -1.2292
+0.06359 -0.15155 -1.2257
+0.067836 -0.15073 -1.219
+0.072023 -0.14989 -1.2121
+0.074037 -0.14935 -1.2076
+0.076333 -0.14939 -1.208
+0.078855 -0.14986 -1.2118
+0.08125 -0.15007 -1.2135
+0.082569 -0.15039 -1.2161
+0.084286 -0.15141 -1.2245
+0.086856 -0.15188 -1.2283
+0.091557 -0.152 -1.2293
+0.096161 -0.15196 -1.2289
+0.098463 -0.15194 -1.2288
+0.10077 -0.15192 -1.2286
+0.10525 -0.15172 -1.2269
+0.10754 -0.15168 -1.2266
+0.10969 -0.15146 -1.2248
+0.11375 -0.15072 -1.2188
+0.1182 -0.15055 -1.2174
+0.12261 -0.15033 -1.2155
+0.12705 -0.15017 -1.2142
+0.1317 -0.15025 -1.2149
+0.13404 -0.15031 -1.2153
+0.13518 -0.15031 -1.2153
+0.14341 -0.15053 -1.2171
+0.1457 -0.15053 -1.2171
+0.14781 -0.15035 -1.2156
+0.14999 -0.15024 -1.2147
+0.15228 -0.15024 -1.2147
+0.15454 -0.15021 -1.2144
+0.15887 -0.14998 -1.2126
+0.1635 -0.15004 -1.213
+0.16794 -0.14992 -1.212
+0.1725 -0.14991 -1.2119
+0.17488 -0.15 -1.2127
+0.17744 -0.15023 -1.2146
+0.18008 -0.15052 -1.2169
+0.18238 -0.15053 -1.217
+0.18696 -0.15052 -1.2169
+0.19168 -0.15063 -1.2178
+0.1966 -0.15089 -1.2199
+0.19904 -0.15099 -1.2207
+0.20108 -0.1508 -1.2191
+0.202 -0.15063 -1.2177
+0.20315 -0.15063 -1.2177
+0.2054 -0.1506 -1.2174
+0.21041 -0.1509 -1.2199
+0.21544 -0.1512 -1.2224
+0.22002 -0.15119 -1.2222
+0.22473 -0.15126 -1.2228
+0.2271 -0.1513 -1.2231
+0.22959 -0.15143 -1.2242
+0.23274 -0.15198 -1.2286
+0.2353 -0.15289 -1.2361
+0.26109 -0.16318 -1.3202
+0.26233 -0.16318 -1.3202
+0.26726 -0.16316 -1.32
+0.27215 -0.16311 -1.3196
+0.27715 -0.16313 -1.3198
+0.28211 -0.16312 -1.3197
+0.28708 -0.16312 -1.3197
+0.28963 -0.16316 -1.32
+0.29198 -0.16309 -1.3194
+0.29694 -0.16308 -1.3194
+0.30192 -0.16309 -1.3194
+0.30691 -0.1631 -1.3195
+0.31181 -0.16306 -1.3192
+0.31677 -0.16306 -1.3192
+0.32154 -0.16296 -1.3184
+0.32668 -0.16305 -1.3191
+0.33161 -0.16303 -1.319
+0.33641 -0.16295 -1.3183
+0.34151 -0.16301 -1.3189
+0.34639 -0.16297 -1.3186
+0.3489 -0.16299 -1.3187
+0.3513 -0.16295 -1.3184
+0.35385 -0.16298 -1.3186
+0.35631 -0.16297 -1.3186
+0.35871 -0.16294 -1.3183
+0.36121 -0.16294 -1.3184
+0.3661 -0.16291 -1.3181
+0.37107 -0.16291 -1.3182
+0.37589 -0.16285 -1.3177
+0.37853 -0.16292 -1.3183
+0.38088 -0.16286 -1.3178
+0.38333 -0.16285 -1.3177
+0.38461 -0.16287 -1.3179
+0.38593 -0.1629 -1.3182
+0.38714 -0.16289 -1.3181
+0.38829 -0.16285 -1.3178
+0.39318 -0.16282 -1.3176
+0.39555 -0.16277 -1.3172
+0.39711 -0.16291 -1.3183
+-0.38085 -0.1626 -1.3057
+-0.37968 -0.16263 -1.3059
+-0.37849 -0.16265 -1.306
+-0.37712 -0.16259 -1.3055
+-0.37596 -0.16261 -1.3057
+-0.22428 -0.16495 -1.3246
+-0.223 -0.16493 -1.3244
+-0.20667 -0.16286 -1.3077
+-0.20537 -0.16281 -1.3072
+-0.20407 -0.16276 -1.3068
+-0.17183 -0.16487 -1.324
+-0.15348 -0.15396 -1.2356
+-0.151 -0.15381 -1.2344
+-0.14852 -0.15364 -1.233
+-0.14728 -0.15356 -1.2324
+-0.14605 -0.15349 -1.2318
+-0.13411 -0.1531 -1.2286
+-0.11973 -0.14547 -1.1668
+-0.1185 -0.14531 -1.1655
+-0.11603 -0.14496 -1.1627
+-0.10289 -0.14498 -1.1629
+-0.089784 -0.13829 -1.1086
+-0.088512 -0.13794 -1.1058
+-0.087367 -0.13778 -1.1045
+-0.085321 -0.13784 -1.1049
+-0.075206 -0.13839 -1.1095
+-0.074257 -0.13857 -1.111
+-0.073229 -0.13861 -1.1113
+-0.071387 -0.1391 -1.1153
+-0.070421 -0.13927 -1.1166
+-0.069403 -0.13934 -1.1172
+-0.068428 -0.1395 -1.1185
+-0.067408 -0.13957 -1.1191
+-0.06642 -0.13971 -1.1202
+-0.065411 -0.13981 -1.121
+-0.063617 -0.14052 -1.1268
+-0.063026 -0.14158 -1.1353
+-0.061209 -0.14233 -1.1415
+-0.060206 -0.1425 -1.1429
+-0.059162 -0.14258 -1.1435
+-0.05069 -0.143 -1.1469
+-0.049624 -0.14304 -1.1473
+-0.047535 -0.14326 -1.1491
+-0.045456 -0.14353 -1.1513
+0.000107 -0.14601 -1.1714
+0.001212 -0.14622 -1.1731
+0.04728 -0.16421 -1.319
+0.050883 -0.15993 -1.2843
+0.056212 -0.15464 -1.2414
+0.057241 -0.15426 -1.2383
+0.058297 -0.15397 -1.2359
+0.082375 -0.15118 -1.2132
+0.08393 -0.15192 -1.2193
+0.085421 -0.15253 -1.2242
+0.099575 -0.15303 -1.2282
+0.13516 -0.15143 -1.2151
+0.13631 -0.15144 -1.2152
+0.13747 -0.15146 -1.2153
+0.13863 -0.15147 -1.2154
+0.13981 -0.15151 -1.2157
+0.14103 -0.15159 -1.2164
+0.14219 -0.1516 -1.2165
+0.14452 -0.15165 -1.2169
+0.20163 -0.1515 -1.2154
+0.20392 -0.1515 -1.2154
+0.23507 -0.1539 -1.2349
+0.23784 -0.15495 -1.2433
+0.26042 -0.16401 -1.3168
+0.35896 -0.16372 -1.3146
+0.37881 -0.16375 -1.3149
+0.38009 -0.16376 -1.3151
+0.38126 -0.16373 -1.3148
+0.3825 -0.16373 -1.3149
+0.38741 -0.16372 -1.3147
+0.38856 -0.16368 -1.3145
+0.38978 -0.16367 -1.3144
+0.39102 -0.16368 -1.3144
+0.39349 -0.16367 -1.3145
+0.39449 -0.16357 -1.3136
+0.39616 -0.16376 -1.3151
+-0.38392 -0.16357 -1.3036
+-0.38137 -0.16353 -1.3033
+-0.37885 -0.1635 -1.303
+-0.37649 -0.16354 -1.3033
+-0.3742 -0.16361 -1.3039
+-0.37191 -0.16369 -1.3045
+-0.35438 -0.16467 -1.3123
+-0.34116 -0.16545 -1.3185
+-0.33685 -0.16577 -1.321
+-0.32724 -0.16594 -1.3224
+-0.325 -0.16607 -1.3234
+-0.32242 -0.16602 -1.323
+-0.31261 -0.1661 -1.3237
+-0.30268 -0.16612 -1.3239
+-0.23274 -0.16601 -1.323
+-0.23022 -0.16599 -1.3228
+-0.22763 -0.16591 -1.3223
+-0.22492 -0.16575 -1.321
+-0.22362 -0.16571 -1.3206
+-0.2061 -0.16364 -1.304
+-0.20476 -0.16356 -1.3033
+-0.2022 -0.16346 -1.3026
+-0.1998 -0.16351 -1.303
+-0.17257 -0.16562 -1.3201
+-0.17142 -0.16571 -1.3208
+-0.15354 -0.15518 -1.2361
+-0.15226 -0.15507 -1.2351
+-0.1498 -0.15492 -1.234
+-0.14728 -0.15473 -1.2324
+-0.14485 -0.1546 -1.2314
+-0.14246 -0.15452 -1.2308
+-0.14007 -0.15445 -1.2302
+-0.1377 -0.15439 -1.2297
+-0.13531 -0.15431 -1.2291
+-0.13406 -0.15419 -1.2282
+-0.12201 -0.14667 -1.1676
+-0.12076 -0.14648 -1.1661
+-0.11951 -0.1463 -1.1646
+-0.11706 -0.14598 -1.1621
+-0.1147 -0.14577 -1.1604
+-0.11245 -0.14569 -1.1597
+-0.10808 -0.14569 -1.1597
+-0.1038 -0.14581 -1.1607
+-0.1017 -0.14594 -1.1617
+-0.09 -0.13967 -1.1113
+-0.088828 -0.13948 -1.1098
+-0.086393 -0.13893 -1.1053
+-0.085322 -0.13888 -1.105
+-0.084331 -0.13896 -1.1056
+-0.082291 -0.13904 -1.1062
+-0.080287 -0.13918 -1.1074
+-0.078268 -0.1393 -1.1084
+-0.07624 -0.13942 -1.1093
+-0.074203 -0.13952 -1.1101
+-0.072156 -0.13961 -1.1109
+-0.07009 -0.13967 -1.1113
+-0.068225 -0.14014 -1.1151
+-0.067362 -0.14053 -1.1183
+-0.065382 -0.14081 -1.1205
+-0.064563 -0.14133 -1.1247
+-0.064084 -0.14262 -1.1351
+-0.062291 -0.14342 -1.1416
+-0.061363 -0.14376 -1.1443
+-0.059233 -0.14383 -1.1449
+-0.058161 -0.14385 -1.145
+-0.057084 -0.14385 -1.1451
+-0.054976 -0.14398 -1.1461
+-0.052826 -0.14401 -1.1463
+-0.051773 -0.14408 -1.1469
+-0.050701 -0.14411 -1.1472
+-0.048604 -0.1443 -1.1487
+-0.046522 -0.14456 -1.1508
+-0.044419 -0.14478 -1.1525
+-0.042297 -0.14494 -1.1539
+-0.003187 -0.14635 -1.1652
+-0.000993 -0.14666 -1.1678
+0.001211 -0.14716 -1.1718
+0.018728 -0.16538 -1.3185
+0.021204 -0.16533 -1.3181
+0.023684 -0.16533 -1.3181
+0.026164 -0.16533 -1.3181
+0.046011 -0.16535 -1.3182
+0.047142 -0.16497 -1.3151
+0.048195 -0.16434 -1.31
+0.0498 -0.16155 -1.2876
+0.050855 -0.16105 -1.2836
+0.051805 -0.16025 -1.2771
+0.056161 -0.15567 -1.2402
+0.057177 -0.15525 -1.2369
+0.059339 -0.15482 -1.2334
+0.061505 -0.15443 -1.2302
+0.063645 -0.154 -1.2268
+0.065729 -0.15347 -1.2225
+0.069887 -0.15249 -1.2146
+0.073999 -0.15155 -1.207
+0.076124 -0.15125 -1.2046
+0.07861 -0.15167 -1.208
+0.081138 -0.15214 -1.2118
+0.082358 -0.15229 -1.2129
+0.083912 -0.15304 -1.219
+0.085351 -0.15356 -1.2232
+0.086656 -0.15383 -1.2254
+0.089082 -0.15404 -1.227
+0.093791 -0.15418 -1.2282
+0.096073 -0.15413 -1.2278
+0.098334 -0.15405 -1.2271
+0.09949 -0.15405 -1.2271
+0.10059 -0.15397 -1.2265
+0.10283 -0.15386 -1.2256
+0.10738 -0.15376 -1.2248
+0.11161 -0.15325 -1.2206
+0.1137 -0.15295 -1.2182
+0.11586 -0.15278 -1.2169
+0.11808 -0.15269 -1.2161
+0.12026 -0.15255 -1.215
+0.12915 -0.15223 -1.2124
+0.13155 -0.15237 -1.2135
+0.13388 -0.15242 -1.2139
+0.13617 -0.15243 -1.2139
+0.13847 -0.15243 -1.214
+0.14084 -0.15253 -1.2147
+0.14328 -0.15269 -1.216
+0.14554 -0.15266 -1.2158
+0.14775 -0.15258 -1.2151
+0.15202 -0.15227 -1.2126
+0.17004 -0.15204 -1.2107
+0.1723 -0.15202 -1.2105
+0.1745 -0.15195 -1.2099
+0.17687 -0.15203 -1.2106
+0.17949 -0.15232 -1.2129
+0.19365 -0.15267 -1.2157
+0.19627 -0.15293 -1.2177
+0.19856 -0.15293 -1.2177
+0.20042 -0.15259 -1.215
+0.20236 -0.15233 -1.2129
+0.20479 -0.15244 -1.2138
+0.20734 -0.15263 -1.2153
+0.22693 -0.15349 -1.2222
+0.22937 -0.15358 -1.2229
+0.23212 -0.15388 -1.2254
+0.23444 -0.15465 -1.2316
+0.23765 -0.156 -1.2424
+0.23896 -0.15609 -1.2431
+0.25985 -0.16489 -1.3139
+0.26109 -0.16489 -1.3139
+0.26353 -0.16487 -1.3137
+0.28825 -0.16486 -1.3137
+0.30288 -0.16475 -1.3128
+0.30537 -0.16475 -1.3128
+0.30787 -0.16477 -1.3129
+0.34726 -0.16469 -1.3124
+0.35219 -0.16469 -1.3124
+0.35474 -0.16472 -1.3127
+0.35708 -0.16467 -1.3122
+0.35831 -0.16466 -1.3122
+0.35959 -0.16468 -1.3124
+0.36205 -0.16468 -1.3124
+0.36446 -0.16465 -1.3121
+0.36692 -0.16465 -1.3121
+0.37663 -0.16457 -1.3116
+0.38162 -0.1646 -1.3118
+0.38648 -0.16456 -1.3116
+0.38881 -0.1645 -1.3111
+0.3913 -0.16451 -1.3112
+0.39249 -0.1645 -1.3111
+0.39503 -0.16452 -1.3113
+-0.38681 -0.16446 -1.301
+-0.38559 -0.16446 -1.301
+-0.38434 -0.16445 -1.3009
+-0.22829 -0.16674 -1.3189
+-0.22699 -0.16669 -1.3185
+-0.22562 -0.16659 -1.3178
+-0.20817 -0.16457 -1.3016
+-0.20684 -0.16449 -1.3009
+-0.20556 -0.16444 -1.3006
+-0.20293 -0.1643 -1.2994
+-0.171 -0.16655 -1.3175
+-0.16989 -0.16667 -1.3186
+-0.15223 -0.1562 -1.2348
+-0.15101 -0.15614 -1.2344
+-0.13644 -0.15543 -1.2288
+-0.13525 -0.1554 -1.2285
+-0.12313 -0.14779 -1.1677
+-0.12053 -0.1473 -1.1638
+-0.10051 -0.14689 -1.1606
+-0.099499 -0.14702 -1.1616
+-0.090225 -0.14107 -1.1141
+-0.085508 -0.14023 -1.1074
+-0.084341 -0.14002 -1.1058
+-0.083317 -0.14005 -1.106
+-0.081294 -0.14016 -1.1069
+-0.069092 -0.14082 -1.1121
+-0.068053 -0.14083 -1.1123
+-0.062416 -0.14479 -1.1439
+-0.058196 -0.14501 -1.1457
+-0.051775 -0.14517 -1.147
+-0.04967 -0.14534 -1.1483
+0.002317 -0.14838 -1.1727
+0.016216 -0.1663 -1.3159
+0.017448 -0.16625 -1.3155
+0.047124 -0.16614 -1.3146
+0.048234 -0.1657 -1.3111
+0.049798 -0.16275 -1.2875
+0.050807 -0.16211 -1.2824
+0.051716 -0.16118 -1.2749
+0.05503 -0.15694 -1.241
+0.05605 -0.15653 -1.2377
+0.058205 -0.15606 -1.234
+0.074969 -0.15234 -1.2043
+0.077223 -0.15232 -1.204
+0.079806 -0.15292 -1.2089
+0.082369 -0.15345 -1.2131
+0.083928 -0.15422 -1.2192
+0.085333 -0.15468 -1.2229
+0.097093 -0.15507 -1.226
+0.098219 -0.15503 -1.2257
+0.099351 -0.15499 -1.2254
+0.11471 -0.15392 -1.2168
+0.11578 -0.15383 -1.216
+0.11692 -0.15381 -1.2159
+0.17109 -0.1531 -1.21
+0.23059 -0.15478 -1.2233
+0.23398 -0.15551 -1.2291
+0.23712 -0.15682 -1.2396
+0.25933 -0.16579 -1.3113
+0.30332 -0.16555 -1.3093
+0.35508 -0.16554 -1.3094
+0.35627 -0.16553 -1.3092
+0.36244 -0.16553 -1.3093
+0.3807 -0.16543 -1.3086
+0.38557 -0.16541 -1.3085
+0.38667 -0.16535 -1.308
+0.39128 -0.16522 -1.307
+-0.38983 -0.16541 -1.2988
+-0.38821 -0.16524 -1.2974
+-0.38608 -0.16537 -1.2985
+-0.38471 -0.16531 -1.298
+-0.38226 -0.16531 -1.2979
+-0.3778 -0.1655 -1.2994
+-0.3734 -0.16572 -1.3011
+-0.36894 -0.16591 -1.3026
+-0.3646 -0.16617 -1.3046
+-0.36029 -0.16645 -1.3068
+-0.35598 -0.16673 -1.3091
+-0.35379 -0.16686 -1.3101
+-0.3516 -0.16699 -1.3111
+-0.34709 -0.1672 -1.3127
+-0.34269 -0.16746 -1.3148
+-0.34041 -0.16756 -1.3155
+-0.33803 -0.16761 -1.3159
+-0.33337 -0.16775 -1.317
+-0.32851 -0.16781 -1.3174
+-0.32359 -0.16783 -1.3176
+-0.31865 -0.16784 -1.3177
+-0.31386 -0.16793 -1.3184
+-0.3087 -0.16783 -1.3176
+-0.30386 -0.16789 -1.3181
+-0.30124 -0.16781 -1.3175
+-0.29873 -0.1678 -1.3173
+-0.29379 -0.16781 -1.3174
+-0.28873 -0.16775 -1.317
+-0.28389 -0.16782 -1.3175
+-0.27886 -0.16778 -1.3172
+-0.274 -0.16784 -1.3177
+-0.26895 -0.16779 -1.3173
+-0.26388 -0.16772 -1.3167
+-0.25886 -0.16767 -1.3164
+-0.254 -0.16774 -1.3169
+-0.24899 -0.16771 -1.3167
+-0.24404 -0.16771 -1.3167
+-0.23911 -0.16773 -1.3169
+-0.23417 -0.16774 -1.317
+-0.23155 -0.16764 -1.3162
+-0.22897 -0.16756 -1.3156
+-0.22767 -0.16752 -1.3152
+-0.21027 -0.16552 -1.2994
+-0.20891 -0.16541 -1.2985
+-0.2063 -0.16528 -1.2975
+-0.20374 -0.16518 -1.2967
+-0.20134 -0.16521 -1.297
+-0.19897 -0.16528 -1.2975
+-0.19665 -0.16538 -1.2984
+-0.19197 -0.16556 -1.2998
+-0.18751 -0.16595 -1.3029
+-0.18305 -0.16635 -1.3061
+-0.17867 -0.16685 -1.31
+-0.17418 -0.16727 -1.3134
+-0.17187 -0.16743 -1.3147
+-0.16954 -0.16758 -1.3158
+-0.15214 -0.15727 -1.2341
+-0.14973 -0.15718 -1.2334
+-0.14723 -0.157 -1.232
+-0.14474 -0.15681 -1.2305
+-0.13994 -0.15662 -1.229
+-0.13756 -0.15654 -1.2284
+-0.13515 -0.15644 -1.2276
+-0.1229 -0.14861 -1.1655
+-0.12161 -0.14838 -1.1637
+-0.11911 -0.148 -1.1607
+-0.11444 -0.14762 -1.1577
+-0.11 -0.14752 -1.1569
+-0.10577 -0.14769 -1.1583
+-0.10146 -0.14778 -1.159
+-0.09939 -0.14795 -1.1603
+-0.089151 -0.14209 -1.1138
+-0.086832 -0.14173 -1.111
+-0.084514 -0.14136 -1.1081
+-0.082371 -0.14126 -1.1073
+-0.080298 -0.14129 -1.1075
+-0.076198 -0.14143 -1.1087
+-0.072141 -0.14167 -1.1106
+-0.070129 -0.14184 -1.1119
+-0.068098 -0.14198 -1.113
+-0.067045 -0.14197 -1.113
+-0.066021 -0.14202 -1.1134
+-0.06142 -0.14606 -1.1454
+-0.059283 -0.14611 -1.1458
+-0.057138 -0.14615 -1.1461
+-0.052866 -0.14628 -1.1472
+-0.050755 -0.14643 -1.1484
+-0.048659 -0.14663 -1.15
+-0.04442 -0.14695 -1.1525
+-0.040135 -0.14717 -1.1543
+-0.035846 -0.14742 -1.1563
+-0.031548 -0.1477 -1.1585
+-0.027211 -0.14786 -1.1597
+-0.022847 -0.1479 -1.1601
+-0.018471 -0.14787 -1.1599
+-0.014098 -0.14785 -1.1597
+-0.009731 -0.1479 -1.1601
+-0.005366 -0.14811 -1.1617
+-0.000991 -0.14856 -1.1654
+0.001208 -0.149 -1.1688
+0.002313 -0.14925 -1.1708
+0.014941 -0.16713 -1.3127
+0.016174 -0.16711 -1.3125
+0.01864 -0.16707 -1.3122
+0.023568 -0.16699 -1.3116
+0.028513 -0.16705 -1.312
+0.033444 -0.16701 -1.3117
+0.038379 -0.167 -1.3116
+0.043323 -0.16703 -1.3119
+0.045797 -0.16705 -1.312
+0.047032 -0.16705 -1.312
+0.048151 -0.16665 -1.3088
+0.049206 -0.16605 -1.3041
+0.052477 -0.16103 -1.2642
+0.053426 -0.16031 -1.2585
+0.054178 -0.15904 -1.2484
+0.054966 -0.15793 -1.2396
+0.057077 -0.15731 -1.2347
+0.05927 -0.15696 -1.2319
+0.061519 -0.15678 -1.2305
+0.063723 -0.1565 -1.2283
+0.065812 -0.15597 -1.2241
+0.067827 -0.1553 -1.2188
+0.069892 -0.1548 -1.2147
+0.071975 -0.15435 -1.2112
+0.073975 -0.15377 -1.2066
+0.074931 -0.1534 -1.2037
+0.075988 -0.15325 -1.2024
+0.077121 -0.15325 -1.2024
+0.078396 -0.15353 -1.2046
+0.081059 -0.15428 -1.2106
+0.082471 -0.15479 -1.2146
+0.084133 -0.15575 -1.2222
+0.086623 -0.15608 -1.2249
+0.09135 -0.15628 -1.2264
+0.095844 -0.15607 -1.2248
+0.098007 -0.15584 -1.223
+0.10036 -0.15592 -1.2236
+0.10266 -0.15591 -1.2235
+0.10497 -0.15592 -1.2235
+0.10947 -0.15576 -1.2223
+0.11163 -0.15557 -1.2208
+0.11368 -0.15522 -1.218
+0.11575 -0.15493 -1.2157
+0.11794 -0.15479 -1.2146
+0.12221 -0.15441 -1.2115
+0.12662 -0.15422 -1.21
+0.12883 -0.15414 -1.2094
+0.13112 -0.15416 -1.2095
+0.13358 -0.15437 -1.2112
+0.13597 -0.15449 -1.2121
+0.14052 -0.15447 -1.212
+0.14534 -0.15474 -1.2141
+0.14971 -0.15453 -1.2124
+0.15402 -0.15427 -1.2103
+0.15847 -0.15417 -1.2095
+0.16312 -0.15425 -1.2101
+0.16748 -0.15406 -1.2086
+0.16986 -0.15416 -1.2094
+0.17101 -0.15417 -1.2095
+0.17201 -0.15404 -1.2085
+0.17635 -0.15386 -1.207
+0.18146 -0.15434 -1.2108
+0.18609 -0.15439 -1.2112
+0.19083 -0.15453 -1.2123
+0.19559 -0.15469 -1.2135
+0.19783 -0.15465 -1.2132
+0.19977 -0.15438 -1.211
+0.20167 -0.15409 -1.2087
+0.2041 -0.1542 -1.2096
+0.20949 -0.15482 -1.2145
+0.21448 -0.15512 -1.2169
+0.2194 -0.15536 -1.2188
+0.22431 -0.15558 -1.2205
+0.22675 -0.15568 -1.2212
+0.22925 -0.15581 -1.2223
+0.23052 -0.15589 -1.223
+0.23191 -0.15605 -1.2242
+0.2588 -0.16669 -1.3086
+0.26002 -0.16667 -1.3085
+0.26473 -0.16654 -1.3074
+0.26968 -0.16656 -1.3075
+0.27453 -0.16651 -1.3072
+0.27948 -0.16653 -1.3073
+0.28441 -0.16653 -1.3073
+0.28933 -0.16653 -1.3073
+0.2942 -0.1665 -1.3071
+0.29906 -0.16647 -1.3068
+0.30143 -0.16642 -1.3064
+0.30406 -0.16651 -1.3072
+0.3088 -0.16641 -1.3063
+0.31374 -0.16642 -1.3065
+0.31869 -0.16644 -1.3066
+0.32358 -0.16642 -1.3065
+0.3284 -0.16637 -1.3061
+0.33333 -0.16638 -1.3062
+0.33834 -0.16642 -1.3065
+0.34309 -0.16634 -1.3059
+0.34542 -0.16628 -1.3054
+0.34796 -0.16632 -1.3057
+0.35312 -0.16644 -1.3067
+0.35544 -0.16637 -1.3061
+0.36155 -0.16635 -1.306
+0.36292 -0.16642 -1.3065
+0.36761 -0.16631 -1.3057
+0.37249 -0.1663 -1.3057
+0.37484 -0.16625 -1.3053
+0.37981 -0.16627 -1.3055
+0.381 -0.16626 -1.3054
+0.3822 -0.16624 -1.3053
+0.38344 -0.16625 -1.3054
+0.38467 -0.16625 -1.3054
+0.38692 -0.16616 -1.3047
+0.3894 -0.16617 -1.3048
+0.39079 -0.16624 -1.3053
+-0.38897 -0.16627 -1.2959
+-0.38743 -0.16613 -1.2948
+-0.38648 -0.16624 -1.2957
+-0.38526 -0.16624 -1.2957
+-0.38284 -0.16625 -1.2957
+-0.35242 -0.16803 -1.3096
+-0.3387 -0.16856 -1.3137
+-0.29924 -0.16863 -1.3141
+-0.22964 -0.16839 -1.3123
+-0.22838 -0.16837 -1.3122
+-0.21217 -0.16631 -1.296
+-0.21093 -0.16629 -1.2959
+-0.20963 -0.16623 -1.2954
+-0.20705 -0.16612 -1.2945
+-0.1974 -0.1662 -1.2952
+-0.15087 -0.15832 -1.2332
+-0.14841 -0.15817 -1.2321
+-0.1459 -0.15797 -1.2305
+-0.13628 -0.15757 -1.2274
+-0.13508 -0.15751 -1.2269
+-0.124 -0.14972 -1.1656
+-0.1227 -0.14946 -1.1636
+-0.12018 -0.14907 -1.1604
+-0.098211 -0.14891 -1.1593
+-0.088057 -0.14307 -1.1133
+-0.085751 -0.14272 -1.1106
+-0.067064 -0.14306 -1.1133
+-0.06601 -0.14305 -1.1132
+-0.061427 -0.14716 -1.1455
+-0.060358 -0.14718 -1.1457
+-0.058242 -0.14729 -1.1466
+0.002311 -0.1502 -1.1696
+0.003418 -0.15045 -1.1716
+0.01244 -0.16795 -1.3094
+0.013673 -0.16795 -1.3094
+0.014903 -0.16794 -1.3093
+0.017363 -0.1679 -1.309
+0.046906 -0.16784 -1.3085
+0.048131 -0.16782 -1.3083
+0.049281 -0.16754 -1.3061
+0.052398 -0.16198 -1.2623
+0.054138 -0.16009 -1.2475
+0.066934 -0.15705 -1.2235
+0.067862 -0.15653 -1.2194
+0.068897 -0.15628 -1.2174
+0.069885 -0.15592 -1.2146
+0.070909 -0.15566 -1.2125
+0.072985 -0.15522 -1.209
+0.073971 -0.1549 -1.2065
+0.078488 -0.15484 -1.2061
+0.079842 -0.15527 -1.2094
+0.082725 -0.15641 -1.2184
+0.085379 -0.15707 -1.2236
+0.10368 -0.15687 -1.222
+0.1708 -0.15512 -1.208
+0.22793 -0.15685 -1.2214
+0.22913 -0.15688 -1.2216
+0.25686 -0.16745 -1.3049
+0.25809 -0.16746 -1.3049
+0.34615 -0.16727 -1.3035
+0.35345 -0.16724 -1.3033
+0.3546 -0.16721 -1.3031
+0.36068 -0.16718 -1.3029
+0.37525 -0.16711 -1.3024
+0.37645 -0.1671 -1.3024
+0.37774 -0.16713 -1.3026
+0.38022 -0.16714 -1.3027
+0.38273 -0.16717 -1.3029
+0.38496 -0.16707 -1.3022
+0.38932 -0.16684 -1.3004
+-0.38802 -0.16708 -1.2927
+-0.3872 -0.16725 -1.2941
+-0.38599 -0.16725 -1.294
+-0.38351 -0.16723 -1.2939
+-0.38125 -0.16731 -1.2945
+-0.37913 -0.16745 -1.2956
+-0.37471 -0.16765 -1.2971
+-0.3531 -0.169 -1.3075
+-0.35203 -0.16908 -1.3081
+-0.35087 -0.16911 -1.3083
+-0.34852 -0.16917 -1.3088
+-0.34392 -0.16933 -1.31
+-0.34156 -0.16938 -1.3104
+-0.33928 -0.16947 -1.3111
+-0.33807 -0.16949 -1.3112
+-0.33684 -0.16949 -1.3112
+-0.33442 -0.16951 -1.3114
+-0.30491 -0.16958 -1.3119
+-0.30219 -0.16944 -1.3108
+-0.29973 -0.16945 -1.3108
+-0.29844 -0.16941 -1.3106
+-0.29728 -0.16945 -1.3109
+-0.29476 -0.16942 -1.3107
+-0.2924 -0.16948 -1.3111
+-0.28987 -0.16945 -1.3108
+-0.25522 -0.16939 -1.3104
+-0.25263 -0.1693 -1.3097
+-0.25031 -0.1694 -1.3105
+-0.23547 -0.16937 -1.3103
+-0.23298 -0.16936 -1.3102
+-0.23026 -0.16917 -1.3087
+-0.21283 -0.1671 -1.2926
+-0.21025 -0.16698 -1.2917
+-0.20779 -0.16695 -1.2915
+-0.20529 -0.1669 -1.2911
+-0.20292 -0.16695 -1.2915
+-0.19813 -0.16701 -1.2919
+-0.19698 -0.16707 -1.2924
+-0.19584 -0.16713 -1.2929
+-0.19361 -0.16731 -1.2943
+-0.1711 -0.16915 -1.3088
+-0.16872 -0.16923 -1.3094
+-0.14954 -0.1593 -1.2318
+-0.14835 -0.15927 -1.2316
+-0.14708 -0.15915 -1.2306
+-0.14458 -0.15895 -1.2291
+-0.14213 -0.1588 -1.2279
+-0.13741 -0.15869 -1.2271
+-0.13621 -0.15864 -1.2267
+-0.12388 -0.15066 -1.1643
+-0.12129 -0.15017 -1.1605
+-0.11884 -0.14985 -1.158
+-0.1165 -0.14964 -1.1564
+-0.099195 -0.14984 -1.158
+-0.098168 -0.14994 -1.1588
+-0.088044 -0.1441 -1.1131
+-0.08692 -0.14397 -1.1121
+-0.084692 -0.14375 -1.1104
+-0.082501 -0.14358 -1.1091
+-0.070074 -0.14383 -1.1111
+-0.068057 -0.14399 -1.1123
+-0.066034 -0.14415 -1.1136
+-0.064984 -0.14415 -1.1136
+-0.060413 -0.1484 -1.1468
+-0.059354 -0.14845 -1.1472
+-0.0572 -0.14847 -1.1474
+-0.055051 -0.14851 -1.1477
+-0.050785 -0.14868 -1.1491
+0.001205 -0.15086 -1.1661
+0.003414 -0.15135 -1.17
+0.01241 -0.16877 -1.3062
+0.013637 -0.16874 -1.3059
+0.016097 -0.16877 -1.3061
+0.018553 -0.16875 -1.306
+0.021011 -0.16875 -1.306
+0.045579 -0.16871 -1.3057
+0.04803 -0.16869 -1.3055
+0.049259 -0.16869 -1.3055
+0.052343 -0.163 -1.261
+0.05329 -0.16226 -1.2552
+0.054905 -0.16008 -1.2382
+0.056994 -0.1594 -1.2329
+0.05921 -0.15912 -1.2306
+0.061478 -0.15899 -1.2296
+0.063778 -0.15895 -1.2293
+0.066046 -0.15884 -1.2284
+0.067121 -0.15865 -1.2269
+0.06805 -0.15812 -1.2228
+0.070028 -0.15739 -1.2171
+0.072036 -0.15677 -1.2123
+0.074106 -0.15632 -1.2087
+0.078872 -0.15674 -1.212
+0.08158 -0.15756 -1.2184
+0.08296 -0.15801 -1.2219
+0.084145 -0.15807 -1.2224
+0.086546 -0.15825 -1.2238
+0.08891 -0.15836 -1.2246
+0.091282 -0.15847 -1.2255
+0.093531 -0.15837 -1.2247
+0.095707 -0.15816 -1.223
+0.097901 -0.15798 -1.2216
+0.10013 -0.15786 -1.2207
+0.10239 -0.1578 -1.2202
+0.10351 -0.15776 -1.2199
+0.10468 -0.15779 -1.2201
+0.10701 -0.15784 -1.2205
+0.11151 -0.15769 -1.2194
+0.1136 -0.15742 -1.2172
+0.11569 -0.15713 -1.215
+0.1178 -0.1569 -1.2131
+0.11981 -0.15654 -1.2104
+0.12198 -0.1564 -1.2093
+0.12422 -0.15635 -1.2088
+0.12864 -0.15619 -1.2076
+0.13347 -0.15651 -1.2101
+0.16508 -0.15623 -1.2077
+0.16729 -0.15617 -1.2073
+0.16953 -0.15614 -1.207
+0.17161 -0.15596 -1.2056
+0.17379 -0.15588 -1.205
+0.19273 -0.15651 -1.2098
+0.195 -0.15651 -1.2098
+0.19722 -0.15645 -1.2094
+0.19923 -0.15624 -1.2078
+0.20133 -0.15611 -1.2067
+0.22158 -0.15757 -1.2181
+0.22387 -0.15757 -1.2181
+0.22653 -0.15782 -1.22
+0.22783 -0.15793 -1.2208
+0.255 -0.16827 -1.3016
+0.25622 -0.16827 -1.3016
+0.25872 -0.1683 -1.3019
+0.26111 -0.16826 -1.3016
+0.30012 -0.16815 -1.3007
+0.3442 -0.16814 -1.3008
+0.34543 -0.16815 -1.3008
+0.34655 -0.16809 -1.3004
+0.34901 -0.1681 -1.3004
+0.35137 -0.16806 -1.3001
+0.3538 -0.16805 -1.3001
+0.35501 -0.16804 -1.3
+0.3562 -0.16803 -1.2999
+0.35861 -0.16801 -1.2998
+0.36087 -0.16792 -1.2991
+0.36349 -0.168 -1.2997
+0.37325 -0.16799 -1.2997
+0.37577 -0.16803 -1.3
+0.37814 -0.16799 -1.2997
+0.38052 -0.16796 -1.2995
+0.38293 -0.16795 -1.2994
+0.38517 -0.16786 -1.2988
+0.38768 -0.16789 -1.299
+0.38896 -0.16791 -1.2992
+0.39126 -0.16784 -1.2987
+-0.38756 -0.16809 -1.2912
+-0.38626 -0.16806 -1.2909
+-0.38542 -0.16823 -1.2921
+-0.38421 -0.16823 -1.2922
+-0.38187 -0.16827 -1.2924
+-0.35144 -0.17003 -1.3059
+-0.33971 -0.17031 -1.308
+-0.33862 -0.17038 -1.3086
+-0.33729 -0.17033 -1.3082
+-0.30014 -0.17021 -1.3072
+-0.2989 -0.1702 -1.3071
+-0.29771 -0.17023 -1.3073
+-0.23354 -0.1701 -1.3064
+-0.23225 -0.17006 -1.3061
+-0.23091 -0.16997 -1.3054
+-0.19669 -0.16804 -1.2905
+-0.16706 -0.17003 -1.306
+-0.14699 -0.16022 -1.2299
+-0.14575 -0.16012 -1.2292
+-0.13617 -0.15975 -1.2263
+-0.098083 -0.1509 -1.1578
+-0.096954 -0.15085 -1.1573
+-0.086978 -0.14512 -1.1129
+-0.085827 -0.14494 -1.1116
+-0.065013 -0.14527 -1.1141
+-0.064039 -0.14544 -1.1154
+-0.060424 -0.14951 -1.147
+-0.058293 -0.14958 -1.1476
+0.012379 -0.16958 -1.3029
+0.049154 -0.16956 -1.3027
+0.052246 -0.16388 -1.2586
+0.054103 -0.16234 -1.2466
+0.067162 -0.1599 -1.2277
+0.068261 -0.15977 -1.2266
+0.069222 -0.15932 -1.2232
+0.071252 -0.15871 -1.2184
+0.073413 -0.15842 -1.2162
+0.074577 -0.15846 -1.2165
+0.079442 -0.15903 -1.2209
+0.080593 -0.15903 -1.2209
+0.081749 -0.15904 -1.221
+0.082931 -0.1591 -1.2215
+0.085279 -0.15919 -1.2221
+0.10107 -0.15869 -1.2182
+0.10221 -0.15867 -1.2181
+0.10337 -0.1587 -1.2183
+0.11865 -0.15765 -1.2101
+0.12077 -0.15744 -1.2085
+0.22502 -0.15872 -1.2181
+0.22638 -0.15887 -1.2192
+0.25321 -0.16911 -1.2987
+0.25443 -0.16911 -1.2987
+0.25686 -0.1691 -1.2986
+0.3445 -0.16892 -1.2972
+0.35421 -0.16889 -1.2971
+0.38787 -0.16866 -1.2955
+0.38888 -0.16857 -1.2948
+0.39038 -0.16869 -1.2958
+-0.38703 -0.16908 -1.2894
+-0.38598 -0.16915 -1.2899
+-0.38493 -0.16922 -1.2905
+-0.38264 -0.16928 -1.2909
+-0.38052 -0.16942 -1.292
+-0.37622 -0.16968 -1.2939
+-0.37415 -0.16984 -1.2952
+-0.37198 -0.16997 -1.2961
+-0.36776 -0.17027 -1.2984
+-0.36332 -0.17048 -1.3
+-0.35893 -0.17072 -1.3018
+-0.35435 -0.17088 -1.303
+-0.35215 -0.171 -1.3039
+-0.34977 -0.17104 -1.3042
+-0.34501 -0.17111 -1.3047
+-0.34261 -0.17114 -1.305
+-0.34026 -0.17119 -1.3054
+-0.33779 -0.17119 -1.3053
+-0.33532 -0.17118 -1.3053
+-0.33066 -0.17131 -1.3062
+-0.32567 -0.17128 -1.306
+-0.32064 -0.17122 -1.3055
+-0.31586 -0.17129 -1.3061
+-0.31084 -0.17124 -1.3056
+-0.30584 -0.17119 -1.3053
+-0.30084 -0.17114 -1.3048
+-0.29838 -0.17114 -1.3048
+-0.29608 -0.17123 -1.3055
+-0.29354 -0.17118 -1.3052
+-0.29108 -0.17118 -1.3052
+-0.2862 -0.1712 -1.3053
+-0.28119 -0.17114 -1.3049
+-0.27617 -0.17108 -1.3044
+-0.27137 -0.17114 -1.3049
+-0.2662 -0.17098 -1.3037
+-0.26128 -0.17097 -1.3036
+-0.25651 -0.17107 -1.3043
+-0.25167 -0.17111 -1.3047
+-0.2468 -0.17115 -1.3049
+-0.24179 -0.17108 -1.3044
+-0.23678 -0.17101 -1.3039
+-0.23421 -0.17092 -1.3032
+-0.23284 -0.17082 -1.3024
+-0.21688 -0.16889 -1.2876
+-0.21425 -0.16873 -1.2864
+-0.20922 -0.16858 -1.2853
+-0.20445 -0.16864 -1.2857
+-0.19984 -0.16884 -1.2873
+-0.19752 -0.16893 -1.288
+-0.19529 -0.16909 -1.2892
+-0.19069 -0.16932 -1.291
+-0.18628 -0.16973 -1.2942
+-0.18189 -0.17018 -1.2977
+-0.17737 -0.17053 -1.3004
+-0.17272 -0.17078 -1.3023
+-0.16787 -0.17083 -1.3027
+-0.16673 -0.17092 -1.3034
+-0.14439 -0.16105 -1.2274
+-0.14196 -0.16092 -1.2264
+-0.13959 -0.16086 -1.2259
+-0.13727 -0.16083 -1.2258
+-0.13611 -0.16083 -1.2258
+-0.12364 -0.15257 -1.1621
+-0.11864 -0.15177 -1.156
+-0.11402 -0.15142 -1.1533
+-0.1096 -0.15133 -1.1526
+-0.10535 -0.15146 -1.1536
+-0.10113 -0.15166 -1.1552
+-0.099045 -0.1518 -1.1562
+-0.096921 -0.15188 -1.1569
+-0.085933 -0.14617 -1.1129
+-0.084764 -0.14597 -1.1114
+-0.082576 -0.1458 -1.1101
+-0.080421 -0.14569 -1.1092
+-0.076208 -0.14563 -1.1088
+-0.072068 -0.14572 -1.1095
+-0.068004 -0.14597 -1.1114
+-0.065982 -0.14614 -1.1127
+-0.064028 -0.14647 -1.1152
+-0.060446 -0.15064 -1.1474
+-0.059397 -0.15072 -1.148
+-0.057227 -0.15071 -1.1479
+-0.052921 -0.15077 -1.1484
+-0.048625 -0.15087 -1.1492
+-0.044341 -0.15103 -1.1504
+-0.040041 -0.15117 -1.1515
+-0.035751 -0.15138 -1.1531
+-0.031465 -0.15167 -1.1554
+-0.027138 -0.15182 -1.1566
+-0.022784 -0.15186 -1.1569
+-0.018422 -0.15184 -1.1567
+-0.014062 -0.15184 -1.1567
+-0.009705 -0.15188 -1.157
+-0.005351 -0.15204 -1.1583
+-0.000988 -0.15247 -1.1615
+0.001203 -0.15273 -1.1636
+0.003407 -0.15326 -1.1677
+0.01235 -0.1704 -1.2997
+0.013573 -0.17041 -1.2998
+0.018463 -0.17038 -1.2996
+0.023354 -0.17037 -1.2995
+0.02825 -0.1704 -1.2998
+0.033134 -0.17036 -1.2994
+0.038031 -0.17039 -1.2996
+0.042925 -0.17039 -1.2996
+0.047809 -0.17036 -1.2994
+0.049047 -0.17042 -1.2998
+0.053186 -0.16431 -1.2528
+0.054979 -0.16263 -1.2399
+0.057003 -0.16175 -1.233
+0.059191 -0.16139 -1.2302
+0.063731 -0.16115 -1.2284
+0.066009 -0.16106 -1.2277
+0.068218 -0.16082 -1.2259
+0.070425 -0.16059 -1.2241
+0.072629 -0.16037 -1.2223
+0.074883 -0.16026 -1.2215
+0.076034 -0.16026 -1.2215
+0.077152 -0.1602 -1.221
+0.078276 -0.16014 -1.2206
+0.079425 -0.16014 -1.2206
+0.081726 -0.16015 -1.2206
+0.084063 -0.16022 -1.2212
+0.086429 -0.16034 -1.2221
+0.091096 -0.16045 -1.223
+0.093341 -0.16035 -1.2222
+0.095559 -0.16021 -1.2211
+0.097754 -0.16004 -1.2198
+0.099942 -0.15987 -1.2184
+0.10218 -0.15978 -1.2177
+0.1045 -0.15982 -1.2181
+0.10903 -0.15974 -1.2174
+0.11342 -0.15946 -1.2152
+0.11759 -0.15891 -1.211
+0.11849 -0.15859 -1.2085
+0.11959 -0.15853 -1.2081
+0.12179 -0.15844 -1.2073
+0.12623 -0.1583 -1.2063
+0.13079 -0.15832 -1.2064
+0.13571 -0.15875 -1.2097
+0.14019 -0.15866 -1.209
+0.14475 -0.15866 -1.209
+0.14914 -0.15849 -1.2077
+0.15368 -0.15848 -1.2076
+0.15816 -0.15841 -1.207
+0.16275 -0.15846 -1.2074
+0.16703 -0.1582 -1.2054
+0.17134 -0.15798 -1.2037
+0.17364 -0.15802 -1.2039
+0.17624 -0.15831 -1.2062
+0.18069 -0.15823 -1.2055
+0.18524 -0.15823 -1.2056
+0.19007 -0.15847 -1.2074
+0.19477 -0.15859 -1.2083
+0.199 -0.15834 -1.2064
+0.20095 -0.15808 -1.2044
+0.20329 -0.15814 -1.2048
+0.2085 -0.15865 -1.2087
+0.2139 -0.15927 -1.2135
+0.21911 -0.15974 -1.2171
+0.22376 -0.15978 -1.2174
+0.22626 -0.15993 -1.2186
+0.25016 -0.16993 -1.2956
+0.25137 -0.16992 -1.2955
+0.25259 -0.16993 -1.2955
+0.25505 -0.16994 -1.2956
+0.2575 -0.16994 -1.2956
+0.26233 -0.16991 -1.2954
+0.26713 -0.16986 -1.295
+0.27204 -0.16989 -1.2952
+0.27689 -0.16987 -1.2951
+0.28158 -0.16975 -1.2941
+0.28655 -0.16981 -1.2946
+0.29146 -0.16983 -1.2948
+0.29629 -0.1698 -1.2946
+0.30118 -0.16981 -1.2947
+0.30599 -0.16978 -1.2944
+0.31079 -0.16973 -1.294
+0.31575 -0.16978 -1.2944
+0.32039 -0.16966 -1.2935
+0.32524 -0.16965 -1.2934
+0.33023 -0.16971 -1.2939
+0.33514 -0.16973 -1.2941
+0.34001 -0.16972 -1.294
+0.34249 -0.16975 -1.2942
+0.34486 -0.16971 -1.294
+0.34959 -0.16965 -1.2935
+0.3521 -0.16968 -1.2938
+0.35456 -0.16969 -1.2939
+0.35939 -0.16967 -1.2937
+0.36425 -0.16967 -1.2937
+0.36909 -0.16965 -1.2936
+0.37369 -0.16953 -1.2927
+0.37865 -0.16957 -1.2931
+0.38339 -0.16952 -1.2927
+0.38585 -0.16953 -1.2928
+0.38814 -0.16947 -1.2923
+0.38938 -0.16947 -1.2924
+-0.38654 -0.17008 -1.2878
+-0.38553 -0.17017 -1.2884
+-0.38438 -0.1702 -1.2886
+-0.3833 -0.17025 -1.2891
+-0.38111 -0.17036 -1.2898
+-0.37278 -0.17099 -1.2946
+-0.34325 -0.17208 -1.3027
+-0.34209 -0.17211 -1.303
+-0.34079 -0.17207 -1.3027
+-0.21627 -0.16963 -1.284
+-0.21488 -0.16949 -1.2829
+-0.16632 -0.17172 -1.3002
+-0.1651 -0.17172 -1.3002
+-0.14072 -0.16198 -1.2257
+-0.13841 -0.16198 -1.2257
+-0.13723 -0.16194 -1.2254
+-0.084873 -0.14721 -1.1128
+-0.083742 -0.14706 -1.1117
+-0.081548 -0.14688 -1.1104
+-0.060454 -0.15174 -1.1476
+-0.058309 -0.15179 -1.1479
+0.004512 -0.15453 -1.1689
+0.012321 -0.17123 -1.2967
+0.048917 -0.17119 -1.2963
+0.054032 -0.16447 -1.245
+0.064804 -0.1621 -1.2268
+0.065913 -0.16199 -1.2259
+0.067037 -0.16191 -1.2254
+0.076017 -0.16138 -1.2213
+0.078226 -0.16119 -1.2198
+0.080495 -0.16113 -1.2194
+0.09655 -0.1611 -1.2191
+0.098727 -0.1609 -1.2176
+0.11847 -0.15969 -1.2082
+0.12058 -0.15948 -1.2066
+0.17492 -0.15928 -1.2049
+0.24841 -0.17078 -1.2928
+0.25079 -0.17075 -1.2925
+0.38615 -0.17034 -1.2897
+0.38706 -0.17021 -1.2887
+0.38841 -0.17027 -1.2892
+-0.38606 -0.17108 -1.2861
+-0.38534 -0.1713 -1.2878
+-0.38414 -0.1713 -1.2878
+-0.38199 -0.17143 -1.2887
+-0.37992 -0.17159 -1.2899
+-0.37784 -0.17175 -1.2911
+-0.37358 -0.17202 -1.2932
+-0.37255 -0.17211 -1.2938
+-0.37142 -0.17215 -1.2941
+-0.36923 -0.17226 -1.295
+-0.36481 -0.17248 -1.2966
+-0.36247 -0.17253 -1.2969
+-0.36013 -0.17258 -1.2973
+-0.35795 -0.1727 -1.2982
+-0.35557 -0.17273 -1.2985
+-0.35321 -0.17278 -1.2988
+-0.35081 -0.1728 -1.2989
+-0.34859 -0.17291 -1.2998
+-0.346 -0.17284 -1.2992
+-0.34357 -0.17285 -1.2993
+-0.34129 -0.17293 -1.2999
+-0.33886 -0.17294 -1.3
+-0.33638 -0.17292 -1.2998
+-0.2972 -0.17291 -1.2996
+-0.29217 -0.17283 -1.299
+-0.248 -0.17273 -1.2983
+-0.24316 -0.17277 -1.2986
+-0.24075 -0.17279 -1.2987
+-0.23814 -0.17267 -1.2978
+-0.23545 -0.17249 -1.2965
+-0.21971 -0.1707 -1.2829
+-0.21824 -0.17049 -1.2813
+-0.21695 -0.17042 -1.2808
+-0.21566 -0.17035 -1.2803
+-0.21305 -0.1702 -1.2791
+-0.21062 -0.17018 -1.279
+-0.206 -0.17034 -1.2802
+-0.20359 -0.17034 -1.2802
+-0.20133 -0.17047 -1.2813
+-0.19681 -0.17074 -1.2833
+-0.16961 -0.17256 -1.2972
+-0.16714 -0.17253 -1.297
+-0.16466 -0.17249 -1.2967
+-0.16341 -0.17246 -1.2965
+-0.14076 -0.16319 -1.2261
+-0.13961 -0.16319 -1.2261
+-0.13727 -0.16315 -1.2258
+-0.12335 -0.15439 -1.1593
+-0.12087 -0.15402 -1.1565
+-0.11845 -0.15371 -1.1541
+-0.11611 -0.15349 -1.1525
+-0.098916 -0.15378 -1.1547
+-0.096823 -0.15391 -1.1557
+-0.094558 -0.15377 -1.1547
+-0.084964 -0.14841 -1.114
+-0.082702 -0.14812 -1.1118
+-0.080526 -0.14798 -1.1107
+-0.078382 -0.14788 -1.11
+-0.065985 -0.14824 -1.1127
+-0.063983 -0.14847 -1.1144
+-0.062082 -0.14895 -1.1181
+-0.06134 -0.15234 -1.1439
+-0.060443 -0.1528 -1.1473
+-0.059376 -0.15283 -1.1476
+-0.057213 -0.15284 -1.1476
+-0.055054 -0.15285 -1.1477
+0.001201 -0.15469 -1.1618
+0.0034 -0.15515 -1.1653
+0.004511 -0.1556 -1.1687
+0.012293 -0.17205 -1.2937
+0.013511 -0.17206 -1.2937
+0.015951 -0.17211 -1.2941
+0.045156 -0.17202 -1.2934
+0.047581 -0.17199 -1.2931
+0.050038 -0.17207 -1.2937
+0.053934 -0.16535 -1.2427
+0.054952 -0.16489 -1.2392
+0.057032 -0.16416 -1.2337
+0.059164 -0.16363 -1.2297
+0.061387 -0.16338 -1.2278
+0.063634 -0.16322 -1.2265
+0.065889 -0.16308 -1.2255
+0.068144 -0.16295 -1.2245
+0.070399 -0.16284 -1.2236
+0.074825 -0.16244 -1.2206
+0.077057 -0.1623 -1.2195
+0.079282 -0.16215 -1.2184
+0.08158 -0.16216 -1.2184
+0.08394 -0.16228 -1.2194
+0.093182 -0.16238 -1.2201
+0.095359 -0.16217 -1.2185
+0.096426 -0.16204 -1.2175
+0.097559 -0.16202 -1.2173
+0.098664 -0.16195 -1.2168
+0.099774 -0.16189 -1.2163
+0.10204 -0.16185 -1.216
+0.1153 -0.16118 -1.2109
+0.11741 -0.16094 -1.2091
+0.11945 -0.16063 -1.2067
+0.12165 -0.16052 -1.2059
+0.12389 -0.16048 -1.2055
+0.14225 -0.1607 -1.2072
+0.14456 -0.16073 -1.2074
+0.14677 -0.16067 -1.2069
+0.16026 -0.16051 -1.2057
+0.17356 -0.16021 -1.2033
+0.17486 -0.16036 -1.2045
+0.176 -0.16037 -1.2045
+0.17816 -0.16027 -1.2038
+0.18261 -0.1602 -1.2032
+0.18475 -0.16008 -1.2024
+0.18711 -0.16016 -1.203
+0.18977 -0.1605 -1.2055
+0.19215 -0.16059 -1.2062
+0.19681 -0.16068 -1.2068
+0.2007 -0.16016 -1.2029
+0.22595 -0.16201 -1.2169
+0.24782 -0.1716 -1.2897
+0.24907 -0.17162 -1.2899
+0.25161 -0.17169 -1.2904
+0.25389 -0.17159 -1.2897
+0.31177 -0.17137 -1.288
+0.31402 -0.17128 -1.2873
+0.31658 -0.17135 -1.2878
+0.34094 -0.17141 -1.2883
+0.3505 -0.17134 -1.2878
+0.37944 -0.17127 -1.2875
+0.38182 -0.17125 -1.2874
+0.38396 -0.17112 -1.2864
+0.3866 -0.17122 -1.2872
+0.38741 -0.17104 -1.2858
+-0.38596 -0.17225 -1.2858
+-0.38493 -0.17233 -1.2864
+-0.38372 -0.17233 -1.2864
+-0.38252 -0.17233 -1.2864
+-0.3807 -0.1726 -1.2884
+-0.37215 -0.17314 -1.2924
+-0.23873 -0.17344 -1.2944
+-0.23743 -0.17337 -1.2939
+-0.23617 -0.17334 -1.2937
+-0.22165 -0.17153 -1.2801
+-0.22026 -0.17139 -1.279
+-0.21894 -0.1713 -1.2783
+-0.21627 -0.17109 -1.2768
+-0.21382 -0.17106 -1.2765
+-0.16304 -0.17329 -1.2935
+-0.16179 -0.17325 -1.2932
+-0.16057 -0.17325 -1.2932
+-0.13977 -0.16453 -1.2275
+-0.13855 -0.16445 -1.2269
+-0.12324 -0.15535 -1.1583
+-0.12201 -0.15517 -1.1569
+-0.11956 -0.15482 -1.1543
+-0.095612 -0.1548 -1.1542
+-0.094524 -0.1548 -1.1542
+-0.083928 -0.14949 -1.1142
+-0.081668 -0.1492 -1.112
+-0.060431 -0.15385 -1.1471
+-0.058292 -0.15391 -1.1476
+0.004504 -0.15647 -1.167
+0.012265 -0.17288 -1.2908
+0.048693 -0.17283 -1.2903
+0.049907 -0.17283 -1.2903
+0.054937 -0.16601 -1.2389
+0.055972 -0.16562 -1.2359
+0.058065 -0.16496 -1.2309
+0.096388 -0.16312 -1.217
+0.09864 -0.16306 -1.2165
+0.17466 -0.16131 -1.2031
+0.18566 -0.16102 -1.2009
+0.18671 -0.16095 -1.2004
+0.18815 -0.16122 -1.2024
+0.24586 -0.17229 -1.2857
+0.24718 -0.17236 -1.2863
+0.2497 -0.17243 -1.2868
+0.382 -0.17199 -1.2839
+0.3832 -0.17199 -1.2838
+0.3844 -0.17199 -1.2838
+0.38533 -0.17186 -1.2829
+0.38648 -0.17183 -1.2827
+-0.38554 -0.17327 -1.2844
+-0.38453 -0.17336 -1.2851
+-0.38332 -0.17336 -1.2851
+-0.38129 -0.17354 -1.2864
+-0.37925 -0.17371 -1.2877
+-0.37502 -0.174 -1.2897
+-0.37278 -0.17408 -1.2904
+-0.37046 -0.17414 -1.2908
+-0.36842 -0.17432 -1.2921
+-0.36603 -0.17434 -1.2923
+-0.36113 -0.17433 -1.2921
+-0.35629 -0.17434 -1.2922
+-0.35156 -0.1744 -1.2926
+-0.34691 -0.17451 -1.2934
+-0.34197 -0.17448 -1.2932
+-0.33724 -0.17455 -1.2937
+-0.33235 -0.17454 -1.2936
+-0.32742 -0.17451 -1.2933
+-0.32259 -0.17453 -1.2935
+-0.31768 -0.17451 -1.2933
+-0.31284 -0.17453 -1.2934
+-0.30799 -0.17454 -1.2935
+-0.30307 -0.17451 -1.2933
+-0.29815 -0.17448 -1.2931
+-0.29323 -0.17445 -1.2928
+-0.28834 -0.17444 -1.2927
+-0.28351 -0.17446 -1.2929
+-0.27853 -0.1744 -1.2924
+-0.27366 -0.17439 -1.2924
+-0.26884 -0.17442 -1.2926
+-0.26392 -0.17439 -1.2924
+-0.25909 -0.17441 -1.2926
+-0.25427 -0.17444 -1.2928
+-0.24941 -0.17445 -1.2929
+-0.24687 -0.17438 -1.2923
+-0.24443 -0.17437 -1.2923
+-0.24191 -0.17431 -1.2918
+-0.23933 -0.1742 -1.291
+-0.23806 -0.17416 -1.2907
+-0.2222 -0.17223 -1.2763
+-0.21952 -0.17201 -1.2747
+-0.21698 -0.17191 -1.2738
+-0.2145 -0.17184 -1.2734
+-0.21217 -0.17189 -1.2738
+-0.20748 -0.17198 -1.2744
+-0.20524 -0.17211 -1.2754
+-0.20302 -0.17227 -1.2766
+-0.19846 -0.17249 -1.2783
+-0.19401 -0.17281 -1.2807
+-0.18957 -0.17316 -1.2833
+-0.18512 -0.17352 -1.286
+-0.18064 -0.17387 -1.2887
+-0.17602 -0.1741 -1.2904
+-0.17127 -0.17421 -1.2912
+-0.16641 -0.17421 -1.2913
+-0.16392 -0.17415 -1.2908
+-0.1615 -0.17416 -1.2909
+-0.15901 -0.17409 -1.2904
+-0.13861 -0.16568 -1.2274
+-0.1374 -0.16562 -1.227
+-0.12446 -0.15661 -1.1595
+-0.1232 -0.15639 -1.1579
+-0.12067 -0.15594 -1.1546
+-0.11829 -0.15567 -1.1525
+-0.11366 -0.15529 -1.1497
+-0.10925 -0.15518 -1.1489
+-0.10502 -0.15532 -1.1499
+-0.10084 -0.15557 -1.1518
+-0.096582 -0.1557 -1.1528
+-0.094433 -0.15574 -1.1531
+-0.093361 -0.15576 -1.1533
+-0.084112 -0.15087 -1.1166
+-0.082973 -0.15071 -1.1155
+-0.080698 -0.15039 -1.1131
+-0.076369 -0.15013 -1.1112
+-0.072178 -0.15013 -1.1112
+-0.068056 -0.15029 -1.1123
+-0.064033 -0.15069 -1.1153
+-0.062063 -0.15101 -1.1178
+-0.060434 -0.15494 -1.1472
+-0.059365 -0.15497 -1.1474
+-0.057202 -0.15497 -1.1474
+-0.052881 -0.15498 -1.1475
+-0.048586 -0.15508 -1.1482
+-0.044275 -0.15514 -1.1487
+-0.039969 -0.15523 -1.1494
+-0.03569 -0.15546 -1.1511
+-0.031397 -0.15569 -1.1528
+-0.027074 -0.15582 -1.1538
+-0.022738 -0.1559 -1.1545
+-0.018374 -0.1558 -1.1536
+-0.014022 -0.15576 -1.1534
+-0.009679 -0.15581 -1.1538
+-0.005336 -0.15598 -1.1551
+-0.000985 -0.15636 -1.1578
+0.003394 -0.15706 -1.1631
+0.005616 -0.1579 -1.1694
+0.012239 -0.17372 -1.2879
+0.013447 -0.17367 -1.2875
+0.018297 -0.1737 -1.2877
+0.023155 -0.17377 -1.2883
+0.027993 -0.1737 -1.2878
+0.032838 -0.17369 -1.2876
+0.037683 -0.17368 -1.2876
+0.042523 -0.17364 -1.2873
+0.047369 -0.17365 -1.2873
+0.049792 -0.17364 -1.2873
+0.051018 -0.17369 -1.2877
+0.054908 -0.16709 -1.2382
+0.056999 -0.16639 -1.2329
+0.059124 -0.16584 -1.2288
+0.063612 -0.16547 -1.2261
+0.068127 -0.16522 -1.2242
+0.072498 -0.16468 -1.2201
+0.076923 -0.16431 -1.2173
+0.08152 -0.16433 -1.2175
+0.086204 -0.16452 -1.2189
+0.090777 -0.16448 -1.2186
+0.095211 -0.16422 -1.2166
+0.097502 -0.16421 -1.2166
+0.099718 -0.16409 -1.2156
+0.10419 -0.16392 -1.2144
+0.10879 -0.16396 -1.2147
+0.113 -0.16343 -1.2106
+0.11736 -0.16315 -1.2085
+0.12157 -0.16269 -1.2051
+0.126 -0.16255 -1.204
+0.13052 -0.16253 -1.2039
+0.13528 -0.1628 -1.2058
+0.13972 -0.16268 -1.205
+0.14416 -0.16256 -1.204
+0.14633 -0.16245 -1.2032
+0.14862 -0.16248 -1.2034
+0.15317 -0.16249 -1.2035
+0.15782 -0.16261 -1.2044
+0.16006 -0.16258 -1.2042
+0.16232 -0.16258 -1.2041
+0.16657 -0.1623 -1.202
+0.17092 -0.16212 -1.2007
+0.17334 -0.16228 -1.2018
+0.17566 -0.16233 -1.2022
+0.18012 -0.16226 -1.2017
+0.18449 -0.16212 -1.2006
+0.18663 -0.16201 -1.1998
+0.18776 -0.16201 -1.1998
+0.18925 -0.16232 -1.2021
+0.19193 -0.16268 -1.2048
+0.19428 -0.16274 -1.2052
+0.19673 -0.16289 -1.2064
+0.19881 -0.16273 -1.2052
+0.20064 -0.16238 -1.2025
+0.20287 -0.16234 -1.2023
+0.20783 -0.16268 -1.2047
+0.21293 -0.16311 -1.208
+0.21826 -0.16369 -1.2123
+0.22319 -0.16396 -1.2143
+0.22557 -0.16403 -1.2148
+0.24557 -0.17329 -1.2842
+0.24787 -0.17322 -1.2836
+0.25027 -0.1732 -1.2835
+0.25518 -0.17325 -1.2839
+0.25997 -0.17322 -1.2836
+0.26477 -0.1732 -1.2834
+0.26953 -0.17315 -1.2831
+0.27447 -0.17322 -1.2836
+0.27929 -0.17321 -1.2835
+0.28397 -0.17312 -1.2828
+0.28882 -0.17313 -1.2829
+0.29352 -0.17305 -1.2823
+0.29834 -0.17305 -1.2823
+0.30311 -0.17301 -1.2821
+0.30781 -0.17294 -1.2815
+0.31281 -0.17303 -1.2822
+0.31757 -0.173 -1.282
+0.32234 -0.17297 -1.2818
+0.32713 -0.17294 -1.2816
+0.33199 -0.17296 -1.2818
+0.33686 -0.17298 -1.2819
+0.3417 -0.17299 -1.282
+0.34652 -0.17299 -1.282
+0.35148 -0.17305 -1.2825
+0.35607 -0.17294 -1.2817
+0.36081 -0.17289 -1.2814
+0.36571 -0.17293 -1.2817
+0.3704 -0.17287 -1.2813
+0.37531 -0.1729 -1.2816
+0.37997 -0.17283 -1.281
+0.38114 -0.17281 -1.2809
+0.38594 -0.1728 -1.2809
+-0.38513 -0.17429 -1.283
+-0.38407 -0.17436 -1.2835
+-0.38299 -0.17442 -1.2839
+-0.38194 -0.17449 -1.2845
+-0.37994 -0.17468 -1.2859
+-0.36879 -0.17514 -1.2891
+-0.36768 -0.17519 -1.2895
+-0.36648 -0.17519 -1.2895
+-0.24506 -0.17517 -1.2891
+-0.23996 -0.175 -1.2879
+-0.23871 -0.17496 -1.2876
+-0.22426 -0.17317 -1.2743
+-0.22295 -0.17308 -1.2736
+-0.15742 -0.17489 -1.2873
+-0.1562 -0.17489 -1.2873
+-0.13857 -0.1668 -1.2271
+-0.12434 -0.15755 -1.1584
+-0.093255 -0.15667 -1.152
+-0.092198 -0.15672 -1.1523
+-0.084215 -0.15211 -1.118
+-0.081929 -0.15178 -1.1156
+-0.060434 -0.15602 -1.1472
+-0.058276 -0.15603 -1.1473
+0.012211 -0.17454 -1.285
+0.050888 -0.17446 -1.2843
+0.14486 -0.1632 -1.2004
+0.14601 -0.16323 -1.2006
+0.14723 -0.16333 -1.2013
+0.18767 -0.16306 -1.1992
+0.19545 -0.16391 -1.2055
+0.19774 -0.16392 -1.2056
+0.22431 -0.16508 -1.2142
+0.22551 -0.16513 -1.2145
+0.24372 -0.17405 -1.2808
+0.38023 -0.17361 -1.2779
+0.38485 -0.17352 -1.2773
+-0.38481 -0.17535 -1.2819
+-0.38404 -0.17555 -1.2834
+-0.38277 -0.17553 -1.2832
+-0.38061 -0.17564 -1.284
+-0.37841 -0.17575 -1.2848
+-0.37605 -0.17578 -1.285
+-0.37391 -0.17591 -1.2859
+-0.37152 -0.17592 -1.286
+-0.36903 -0.17589 -1.2857
+-0.36669 -0.17593 -1.286
+-0.36563 -0.176 -1.2865
+-0.36437 -0.17597 -1.2863
+-0.36196 -0.17598 -1.2864
+-0.35718 -0.17601 -1.2866
+-0.35494 -0.1761 -1.2872
+-0.35235 -0.17602 -1.2866
+-0.33806 -0.17615 -1.2875
+-0.33559 -0.17613 -1.2873
+-0.33317 -0.17612 -1.2873
+-0.24569 -0.17597 -1.286
+-0.24451 -0.17599 -1.2862
+-0.24321 -0.17593 -1.2858
+-0.2406 -0.17579 -1.2847
+-0.22354 -0.17381 -1.2702
+-0.22092 -0.17363 -1.2688
+-0.21842 -0.17354 -1.2682
+-0.21366 -0.17355 -1.2683
+-0.20452 -0.17391 -1.2709
+-0.16315 -0.17575 -1.2847
+-0.15825 -0.17568 -1.2841
+-0.15584 -0.1757 -1.2843
+-0.1546 -0.17565 -1.284
+-0.15342 -0.17569 -1.2842
+-0.15221 -0.17569 -1.2842
+-0.13854 -0.16792 -1.2268
+-0.13734 -0.16786 -1.2264
+-0.12431 -0.15861 -1.1581
+-0.12298 -0.15829 -1.1558
+-0.12053 -0.15794 -1.1532
+-0.09425 -0.15761 -1.1508
+-0.092084 -0.15761 -1.1509
+-0.090999 -0.15761 -1.1509
+-0.084399 -0.1535 -1.1205
+-0.083149 -0.15314 -1.1179
+-0.080901 -0.15288 -1.1159
+-0.078663 -0.15262 -1.114
+-0.062079 -0.15316 -1.118
+-0.060402 -0.15702 -1.1465
+-0.059337 -0.15706 -1.1468
+-0.057178 -0.15707 -1.1469
+-0.055033 -0.15711 -1.1472
+0.005604 -0.15976 -1.1669
+0.012182 -0.17533 -1.2819
+0.013389 -0.17534 -1.2819
+0.015803 -0.17534 -1.282
+0.049553 -0.17522 -1.281
+0.051973 -0.17525 -1.2812
+0.054924 -0.16947 -1.2386
+0.05703 -0.16881 -1.2336
+0.059097 -0.16808 -1.2282
+0.061341 -0.16789 -1.2268
+0.063607 -0.16777 -1.2259
+0.065862 -0.16763 -1.2249
+0.088446 -0.16672 -1.2181
+0.097346 -0.16624 -1.2146
+0.1193 -0.16496 -1.2051
+0.12156 -0.16495 -1.205
+0.12386 -0.16499 -1.2053
+0.12602 -0.16484 -1.2042
+0.12817 -0.16469 -1.203
+0.14164 -0.16455 -1.2019
+0.14367 -0.16427 -1.1999
+0.14467 -0.16413 -1.1988
+0.14589 -0.16423 -1.1996
+0.14829 -0.16439 -1.2007
+0.15055 -0.16437 -1.2006
+0.15267 -0.16423 -1.1996
+0.15492 -0.16421 -1.1994
+0.15727 -0.16431 -1.2002
+0.15976 -0.16454 -1.2019
+0.16205 -0.16457 -1.2021
+0.16428 -0.16454 -1.2018
+0.17316 -0.16437 -1.2005
+0.18646 -0.16413 -1.1987
+0.18879 -0.16419 -1.1992
+0.19184 -0.16486 -1.2042
+0.19417 -0.16492 -1.2045
+0.1954 -0.165 -1.2052
+0.19654 -0.165 -1.2052
+0.19765 -0.16498 -1.205
+0.19858 -0.16481 -1.2038
+0.20057 -0.16458 -1.2021
+0.20278 -0.16454 -1.2017
+0.20524 -0.1647 -1.2029
+0.21003 -0.1649 -1.2044
+0.22042 -0.16589 -1.2116
+0.2229 -0.16603 -1.2127
+0.22542 -0.16621 -1.214
+0.2267 -0.16631 -1.2148
+0.24312 -0.17482 -1.2776
+0.24432 -0.17482 -1.2776
+0.24686 -0.17491 -1.2783
+0.27067 -0.17475 -1.277
+0.27298 -0.17468 -1.2766
+0.27544 -0.17472 -1.2768
+0.27784 -0.17472 -1.2768
+0.28026 -0.17473 -1.2769
+0.3521 -0.17458 -1.276
+0.35445 -0.17455 -1.2758
+0.35669 -0.17448 -1.2752
+0.35916 -0.1745 -1.2755
+0.36156 -0.1745 -1.2755
+0.36397 -0.17451 -1.2755
+0.36627 -0.17446 -1.2752
+0.37592 -0.17448 -1.2754
+0.37824 -0.17444 -1.2752
+0.37936 -0.17441 -1.2749
+0.38394 -0.17431 -1.2742
+-0.38453 -0.17643 -1.281
+-0.38324 -0.1764 -1.2807
+-0.38228 -0.17651 -1.2815
+-0.38124 -0.17658 -1.2821
+-0.37902 -0.17668 -1.2827
+-0.36457 -0.1767 -1.2828
+-0.33596 -0.17689 -1.2841
+-0.2439 -0.17676 -1.283
+-0.24118 -0.17654 -1.2814
+-0.22809 -0.17483 -1.2689
+-0.22683 -0.17478 -1.2685
+-0.22549 -0.17466 -1.2676
+-0.22415 -0.17455 -1.2668
+-0.22157 -0.1744 -1.2657
+-0.15429 -0.17651 -1.2814
+-0.15186 -0.17649 -1.2812
+-0.13849 -0.16901 -1.2264
+-0.12422 -0.15957 -1.1572
+-0.090885 -0.1585 -1.1494
+-0.084384 -0.15453 -1.1203
+-0.082039 -0.15409 -1.1171
+-0.060388 -0.15806 -1.1463
+-0.058242 -0.1581 -1.1466
+0.012154 -0.17613 -1.2789
+0.056024 -0.17044 -1.2371
+0.058115 -0.16974 -1.232
+0.060224 -0.16915 -1.2276
+0.061346 -0.16906 -1.2269
+0.062501 -0.16906 -1.2269
+0.14458 -0.16515 -1.198
+0.14699 -0.16532 -1.1993
+0.15343 -0.16496 -1.1966
+0.15438 -0.16477 -1.1952
+0.15562 -0.1649 -1.1961
+0.15828 -0.16532 -1.1992
+0.15964 -0.16555 -1.2009
+0.16079 -0.16557 -1.2011
+0.19037 -0.16571 -1.2021
+0.19293 -0.16596 -1.2039
+0.19532 -0.16607 -1.2047
+0.19749 -0.16598 -1.204
+0.22411 -0.16722 -1.2131
+0.22539 -0.16733 -1.2138
+0.24256 -0.17562 -1.2746
+0.35474 -0.17531 -1.2725
+0.35582 -0.17525 -1.2721
+0.35708 -0.17528 -1.2723
+0.37847 -0.1752 -1.2719
+0.37964 -0.17519 -1.2718
+0.38088 -0.1752 -1.2719
+0.38207 -0.1752 -1.272
+0.38324 -0.17519 -1.2719
+-0.3839 -0.17735 -1.2789
+-0.38276 -0.17738 -1.2791
+-0.38174 -0.17747 -1.2797
+-0.37947 -0.17753 -1.2802
+-0.37697 -0.17749 -1.2798
+-0.37203 -0.17743 -1.2794
+-0.36728 -0.17746 -1.2796
+-0.36484 -0.17745 -1.2795
+-0.36244 -0.17745 -1.2795
+-0.35787 -0.17758 -1.2803
+-0.35305 -0.17758 -1.2803
+-0.34843 -0.17768 -1.281
+-0.34366 -0.17771 -1.2812
+-0.33896 -0.17777 -1.2816
+-0.33656 -0.17778 -1.2817
+-0.33428 -0.17785 -1.2822
+-0.32928 -0.17776 -1.2815
+-0.32446 -0.17776 -1.2815
+-0.3196 -0.17774 -1.2814
+-0.31478 -0.17775 -1.2814
+-0.31011 -0.17783 -1.282
+-0.3052 -0.17779 -1.2817
+-0.30024 -0.17771 -1.2811
+-0.29547 -0.17774 -1.2813
+-0.2906 -0.17771 -1.2811
+-0.28573 -0.17769 -1.2809
+-0.28104 -0.17777 -1.2815
+-0.27606 -0.17767 -1.2808
+-0.27118 -0.17764 -1.2805
+-0.26637 -0.17764 -1.2806
+-0.26153 -0.17764 -1.2806
+-0.25674 -0.17766 -1.2807
+-0.25188 -0.17763 -1.2805
+-0.24697 -0.17757 -1.2801
+-0.24438 -0.17744 -1.2792
+-0.24176 -0.17729 -1.278
+-0.24045 -0.17721 -1.2774
+-0.23015 -0.17577 -1.267
+-0.22886 -0.1757 -1.2665
+-0.22745 -0.17553 -1.2652
+-0.22479 -0.17531 -1.2637
+-0.22226 -0.17519 -1.2628
+-0.21972 -0.17507 -1.2619
+-0.21511 -0.17518 -1.2627
+-0.21056 -0.17535 -1.264
+-0.20602 -0.17554 -1.2654
+-0.20165 -0.17589 -1.2679
+-0.19728 -0.17625 -1.2705
+-0.19282 -0.17655 -1.2727
+-0.1884 -0.1769 -1.2753
+-0.18384 -0.17714 -1.2771
+-0.17925 -0.17735 -1.2786
+-0.17453 -0.17744 -1.2793
+-0.16972 -0.17745 -1.2794
+-0.16493 -0.17748 -1.2796
+-0.15997 -0.17733 -1.2786
+-0.15513 -0.1773 -1.2783
+-0.15273 -0.17731 -1.2784
+-0.12417 -0.1606 -1.1567
+-0.12286 -0.16031 -1.1546
+-0.11799 -0.15961 -1.1496
+-0.11335 -0.15918 -1.1464
+-0.1089 -0.15901 -1.1451
+-0.10462 -0.15906 -1.1456
+-0.10047 -0.15932 -1.1475
+-0.096263 -0.15952 -1.1489
+-0.094083 -0.1595 -1.1488
+-0.091909 -0.15948 -1.1487
+-0.084348 -0.15552 -1.1198
+-0.083167 -0.15529 -1.1181
+-0.080889 -0.15496 -1.1157
+-0.076504 -0.1546 -1.1131
+-0.072264 -0.15451 -1.1125
+-0.068114 -0.15461 -1.1132
+-0.06405 -0.15494 -1.1156
+-0.062058 -0.15521 -1.1176
+-0.060366 -0.15909 -1.1458
+-0.059304 -0.15914 -1.1462
+-0.057147 -0.15914 -1.1463
+-0.052839 -0.15918 -1.1466
+-0.048518 -0.15918 -1.1466
+-0.044208 -0.15923 -1.1469
+-0.039907 -0.15932 -1.1476
+-0.035623 -0.1595 -1.1489
+-0.031323 -0.15966 -1.1501
+-0.027023 -0.15987 -1.1516
+-0.022701 -0.16 -1.1525
+-0.018335 -0.1598 -1.1511
+-0.013981 -0.15963 -1.1498
+-0.009648 -0.15965 -1.15
+-0.00532 -0.15986 -1.1515
+-0.000982 -0.16024 -1.1543
+0.003382 -0.16087 -1.1589
+0.005594 -0.16169 -1.1649
+0.013326 -0.17692 -1.2758
+0.018134 -0.17696 -1.2761
+0.022945 -0.17701 -1.2765
+0.027739 -0.17693 -1.2759
+0.03254 -0.17692 -1.2758
+0.037351 -0.17695 -1.2761
+0.042146 -0.17691 -1.2758
+0.046937 -0.17687 -1.2754
+0.05174 -0.17687 -1.2755
+0.056025 -0.17161 -1.2371
+0.057109 -0.17136 -1.2353
+0.059238 -0.1708 -1.2312
+0.061428 -0.17044 -1.2286
+0.063696 -0.17032 -1.2277
+0.068083 -0.16973 -1.2234
+0.072408 -0.16906 -1.2185
+0.076864 -0.16877 -1.2164
+0.081406 -0.16869 -1.2158
+0.086088 -0.16889 -1.2172
+0.088319 -0.16877 -1.2163
+0.090379 -0.16834 -1.2132
+0.094939 -0.16832 -1.2131
+0.099384 -0.16811 -1.2115
+0.10403 -0.16824 -1.2124
+0.10855 -0.16816 -1.2119
+0.11268 -0.16752 -1.2072
+0.11707 -0.16729 -1.2055
+0.11923 -0.16713 -1.2043
+0.12159 -0.16727 -1.2053
+0.12391 -0.16733 -1.2057
+0.12599 -0.16707 -1.2039
+0.13032 -0.16681 -1.202
+0.13487 -0.16683 -1.2021
+0.13924 -0.16664 -1.2007
+0.14329 -0.1661 -1.1967
+0.14544 -0.16597 -1.1958
+0.14806 -0.16639 -1.1988
+0.15214 -0.16591 -1.1954
+0.15426 -0.16577 -1.1943
+0.15672 -0.16599 -1.1959
+0.15929 -0.16632 -1.1983
+0.16059 -0.16649 -1.1996
+0.16172 -0.16649 -1.1996
+0.16613 -0.16639 -1.1988
+0.17063 -0.16637 -1.1987
+0.17528 -0.1665 -1.1996
+0.17986 -0.16655 -1.1999
+0.18429 -0.16647 -1.1993
+0.18638 -0.16632 -1.1982
+0.18873 -0.1664 -1.1988
+0.19039 -0.16687 -1.2022
+0.19172 -0.16704 -1.2034
+0.19403 -0.16707 -1.2037
+0.19637 -0.16713 -1.2041
+0.19837 -0.16691 -1.2025
+0.20271 -0.16675 -1.2013
+0.20756 -0.16701 -1.2032
+0.21277 -0.16754 -1.2071
+0.21773 -0.16786 -1.2094
+0.2227 -0.16817 -1.2116
+0.22522 -0.16834 -1.2129
+0.24198 -0.1764 -1.2715
+0.24317 -0.1764 -1.2715
+0.24795 -0.17639 -1.2715
+0.25278 -0.17641 -1.2716
+0.25752 -0.17638 -1.2714
+0.26227 -0.17636 -1.2712
+0.26716 -0.17642 -1.2717
+0.27179 -0.17632 -1.271
+0.27424 -0.17636 -1.2712
+0.27664 -0.17636 -1.2712
+0.28147 -0.17638 -1.2714
+0.28615 -0.17632 -1.2709
+0.29088 -0.17628 -1.2707
+0.29575 -0.17633 -1.271
+0.30028 -0.17618 -1.27
+0.30508 -0.17619 -1.27
+0.30992 -0.17622 -1.2703
+0.31471 -0.17623 -1.2703
+0.31959 -0.17628 -1.2707
+0.32422 -0.1762 -1.2701
+0.32899 -0.17619 -1.2701
+0.33378 -0.17619 -1.2701
+0.33861 -0.17621 -1.2703
+0.34332 -0.17618 -1.2701
+0.34798 -0.17611 -1.2696
+0.35297 -0.17622 -1.2704
+0.3552 -0.17614 -1.2699
+0.3576 -0.17614 -1.2699
+0.35989 -0.17609 -1.2695
+0.36234 -0.17612 -1.2698
+0.3669 -0.17601 -1.269
+0.37163 -0.17599 -1.2689
+0.37637 -0.17597 -1.2688
+0.3788 -0.17599 -1.269
+0.38122 -0.176 -1.2691
+0.38236 -0.17598 -1.2689
+-0.38321 -0.17824 -1.2766
+-0.38222 -0.17833 -1.2773
+-0.38082 -0.17824 -1.2766
+-0.37962 -0.17824 -1.2766
+-0.37725 -0.17826 -1.2767
+-0.24506 -0.17827 -1.2764
+-0.24236 -0.17805 -1.2748
+-0.23203 -0.17658 -1.2642
+-0.23074 -0.17651 -1.2637
+-0.22805 -0.17626 -1.2619
+-0.22546 -0.1761 -1.2607
+-0.13865 -0.17151 -1.2278
+-0.12406 -0.16155 -1.1557
+-0.092908 -0.16042 -1.1476
+-0.091804 -0.16038 -1.1473
+-0.084213 -0.15633 -1.118
+-0.081986 -0.1561 -1.1164
+-0.060365 -0.16016 -1.1458
+-0.058213 -0.16019 -1.146
+0.056046 -0.17284 -1.2376
+0.058202 -0.17232 -1.2338
+0.087184 -0.16994 -1.2165
+0.089311 -0.16962 -1.2142
+0.12275 -0.16843 -1.2055
+0.12483 -0.16817 -1.2036
+0.14649 -0.16701 -1.1952
+0.16025 -0.16727 -1.197
+0.18747 -0.16741 -1.1979
+0.19055 -0.16813 -1.2032
+0.19286 -0.16817 -1.2034
+0.22392 -0.16937 -1.2121
+0.22515 -0.16944 -1.2125
+0.2414 -0.17717 -1.2685
+0.37905 -0.17675 -1.2658
+0.38024 -0.17675 -1.2658
+0.3815 -0.17678 -1.266
+-0.38231 -0.17901 -1.2735
+-0.38112 -0.17902 -1.2736
+-0.37992 -0.17902 -1.2736
+-0.37739 -0.17896 -1.2731
+-0.37495 -0.17894 -1.2729
+-0.37264 -0.17898 -1.2732
+-0.36309 -0.179 -1.2733
+-0.33502 -0.17937 -1.2758
+-0.2482 -0.17913 -1.2739
+-0.24556 -0.17896 -1.2727
+-0.24423 -0.17886 -1.272
+-0.2429 -0.17876 -1.2713
+-0.23134 -0.17724 -1.2604
+-0.22865 -0.177 -1.2586
+-0.22607 -0.17684 -1.2575
+-0.2236 -0.17675 -1.2569
+-0.22111 -0.17665 -1.2562
+-0.19 -0.17854 -1.2698
+-0.18779 -0.17872 -1.2712
+-0.18551 -0.17883 -1.2719
+-0.18314 -0.17886 -1.2721
+-0.18083 -0.17894 -1.2727
+-0.15205 -0.17892 -1.2727
+-0.13987 -0.17275 -1.2283
+-0.13861 -0.17263 -1.2275
+-0.12527 -0.1628 -1.1568
+-0.12269 -0.16228 -1.1531
+-0.12019 -0.16183 -1.1499
+-0.098224 -0.16135 -1.1465
+-0.096103 -0.16142 -1.147
+-0.093931 -0.1614 -1.1469
+-0.092845 -0.16139 -1.1468
+-0.084192 -0.15734 -1.1177
+-0.083047 -0.15717 -1.1165
+-0.080836 -0.15696 -1.115
+-0.078643 -0.15678 -1.1137
+-0.062072 -0.15736 -1.1179
+-0.061079 -0.16028 -1.1389
+-0.060333 -0.16116 -1.1452
+-0.059272 -0.16121 -1.1456
+-0.057113 -0.16121 -1.1456
+-0.054967 -0.16125 -1.1458
+0.005579 -0.16343 -1.1616
+0.013265 -0.17849 -1.2699
+0.01566 -0.17855 -1.2703
+0.018049 -0.17853 -1.2701
+0.02044 -0.17852 -1.27
+0.022836 -0.17856 -1.2704
+0.025225 -0.17855 -1.2702
+0.053897 -0.17846 -1.2696
+0.054974 -0.17808 -1.2669
+0.056163 -0.17437 -1.2402
+0.057193 -0.17395 -1.2371
+0.05933 -0.17339 -1.2331
+0.061537 -0.17306 -1.2308
+0.063786 -0.17288 -1.2294
+0.065947 -0.17247 -1.2265
+0.070209 -0.1716 -1.2202
+0.074549 -0.17101 -1.216
+0.083678 -0.17094 -1.2155
+0.086029 -0.17106 -1.2163
+0.087174 -0.17106 -1.2163
+0.088233 -0.17089 -1.2151
+0.090293 -0.17046 -1.212
+0.092557 -0.17043 -1.2118
+0.11475 -0.16949 -1.2049
+0.11683 -0.16922 -1.203
+0.11909 -0.1692 -1.2029
+0.12136 -0.16922 -1.203
+0.12358 -0.16914 -1.2025
+0.1258 -0.16909 -1.2021
+0.128 -0.169 -1.2014
+0.14098 -0.16829 -1.1963
+0.143 -0.16801 -1.1942
+0.14515 -0.16789 -1.1934
+0.1463 -0.16792 -1.1936
+0.14752 -0.16803 -1.1944
+0.14971 -0.16796 -1.1939
+0.15181 -0.16779 -1.1927
+0.15405 -0.16779 -1.1926
+0.15642 -0.16792 -1.1936
+0.15881 -0.16807 -1.1946
+0.16118 -0.1682 -1.1955
+0.16353 -0.1683 -1.1962
+0.1659 -0.16842 -1.1971
+0.16817 -0.16843 -1.1972
+0.17044 -0.16844 -1.1973
+0.17274 -0.16849 -1.1976
+0.18636 -0.16856 -1.1981
+0.1875 -0.16857 -1.1981
+0.1891 -0.16899 -1.2012
+0.19052 -0.16924 -1.203
+0.19165 -0.16924 -1.203
+0.19395 -0.16927 -1.2032
+0.19613 -0.1692 -1.2026
+0.21493 -0.16973 -1.2064
+0.21745 -0.16992 -1.2078
+0.22001 -0.17014 -1.2094
+0.22266 -0.17042 -1.2114
+0.22393 -0.17052 -1.2121
+0.24099 -0.17806 -1.2663
+0.24213 -0.17802 -1.266
+0.24447 -0.17799 -1.2658
+0.27303 -0.17796 -1.2656
+0.27773 -0.17792 -1.2652
+0.28003 -0.17786 -1.2648
+0.28248 -0.17791 -1.2652
+0.34884 -0.17773 -1.264
+0.35111 -0.17767 -1.2637
+0.35369 -0.17777 -1.2644
+0.35826 -0.17767 -1.2637
+0.37707 -0.17757 -1.2631
+0.37959 -0.17764 -1.2636
+0.38053 -0.17752 -1.2628
+-0.38117 -0.17968 -1.2697
+-0.38009 -0.17973 -1.2701
+-0.3789 -0.17974 -1.2701
+-0.37765 -0.17971 -1.2699
+-0.37512 -0.17964 -1.2694
+-0.24624 -0.17977 -1.27
+-0.2448 -0.17959 -1.2687
+-0.2306 -0.17786 -1.2563
+-0.22927 -0.17774 -1.2555
+-0.1505 -0.17969 -1.2696
+-0.14101 -0.17389 -1.2282
+-0.13848 -0.17362 -1.2263
+-0.12395 -0.16358 -1.1546
+-0.094959 -0.16239 -1.1462
+-0.093854 -0.16235 -1.1459
+-0.08416 -0.15834 -1.1173
+-0.081921 -0.15808 -1.1154
+-0.060321 -0.16221 -1.145
+-0.058177 -0.16225 -1.1452
+0.014424 -0.17925 -1.2667
+0.015617 -0.17925 -1.2667
+0.01681 -0.17925 -1.2667
+0.019202 -0.17932 -1.2672
+0.021593 -0.17937 -1.2676
+0.054855 -0.17889 -1.2641
+0.056323 -0.17604 -1.2437
+0.058344 -0.17507 -1.2368
+0.087167 -0.1722 -1.2162
+0.089208 -0.17171 -1.2128
+0.12233 -0.17012 -1.2013
+0.12344 -0.17008 -1.2011
+0.12457 -0.17008 -1.2011
+0.1439 -0.16887 -1.1924
+0.145 -0.16885 -1.1922
+0.14614 -0.16886 -1.1923
+0.15275 -0.16872 -1.1912
+0.15389 -0.16875 -1.1914
+0.15507 -0.1688 -1.1918
+0.18774 -0.16992 -1.1997
+0.19045 -0.17032 -1.2025
+0.19265 -0.17026 -1.2021
+0.2186 -0.17107 -1.2078
+0.22144 -0.1715 -1.2109
+0.22275 -0.17164 -1.2119
+0.24038 -0.1788 -1.2631
+0.34899 -0.17839 -1.2603
+0.37758 -0.17844 -1.2608
+0.3788 -0.17845 -1.261
+0.37973 -0.17833 -1.2601
+-0.38056 -0.18058 -1.2677
+-0.37914 -0.18048 -1.2669
+-0.37795 -0.18048 -1.2669
+-0.37536 -0.18038 -1.2662
+-0.37311 -0.18044 -1.2666
+-0.3683 -0.18043 -1.2664
+-0.3636 -0.18046 -1.2666
+-0.35925 -0.18067 -1.2681
+-0.35463 -0.18075 -1.2686
+-0.35014 -0.1809 -1.2697
+-0.34528 -0.18085 -1.2693
+-0.34074 -0.18098 -1.2702
+-0.33598 -0.181 -1.2703
+-0.33117 -0.18098 -1.2702
+-0.32626 -0.18091 -1.2696
+-0.32158 -0.18097 -1.27
+-0.31678 -0.18096 -1.27
+-0.31189 -0.1809 -1.2695
+-0.30723 -0.18097 -1.27
+-0.30234 -0.18091 -1.2696
+-0.29761 -0.18094 -1.2698
+-0.29277 -0.1809 -1.2695
+-0.28792 -0.18086 -1.2692
+-0.28316 -0.18088 -1.2693
+-0.27846 -0.18093 -1.2697
+-0.27356 -0.18085 -1.2691
+-0.26882 -0.18088 -1.2693
+-0.26398 -0.18084 -1.269
+-0.25923 -0.18086 -1.2692
+-0.25436 -0.1808 -1.2687
+-0.24932 -0.18061 -1.2674
+-0.2467 -0.18043 -1.2662
+-0.24537 -0.18033 -1.2655
+-0.23383 -0.1788 -1.2546
+-0.23251 -0.17869 -1.2538
+-0.2312 -0.17859 -1.2531
+-0.22992 -0.17851 -1.2526
+-0.22735 -0.17835 -1.2514
+-0.2225 -0.17824 -1.2507
+-0.21801 -0.17842 -1.252
+-0.21358 -0.17866 -1.2536
+-0.20918 -0.17894 -1.2556
+-0.20483 -0.17927 -1.258
+-0.20047 -0.17961 -1.2604
+-0.19609 -0.17994 -1.2628
+-0.19166 -0.18025 -1.265
+-0.18707 -0.18042 -1.2662
+-0.18476 -0.1805 -1.2667
+-0.18241 -0.18052 -1.2669
+-0.17769 -0.18058 -1.2673
+-0.17296 -0.18063 -1.2677
+-0.16822 -0.18066 -1.268
+-0.1634 -0.18062 -1.2676
+-0.15857 -0.18056 -1.2672
+-0.15377 -0.18052 -1.267
+-0.15133 -0.18046 -1.2666
+-0.15016 -0.18048 -1.2667
+-0.14098 -0.175 -1.2279
+-0.13965 -0.1748 -1.2264
+-0.13843 -0.17471 -1.2258
+-0.12516 -0.16484 -1.1558
+-0.12254 -0.16425 -1.1516
+-0.11761 -0.16343 -1.1458
+-0.11297 -0.16296 -1.1425
+-0.1085 -0.16272 -1.1408
+-0.10419 -0.16271 -1.1408
+-0.10006 -0.16299 -1.1428
+-0.098043 -0.16321 -1.1444
+-0.095976 -0.16337 -1.1454
+-0.094893 -0.16336 -1.1454
+-0.084127 -0.15933 -1.1168
+-0.083 -0.15918 -1.1158
+-0.080756 -0.15891 -1.1139
+-0.076427 -0.15864 -1.112
+-0.072226 -0.15862 -1.1119
+-0.068092 -0.15876 -1.1128
+-0.064013 -0.15906 -1.1149
+-0.062079 -0.15949 -1.118
+-0.061291 -0.163 -1.1429
+-0.059234 -0.16326 -1.1448
+-0.057083 -0.16328 -1.1449
+-0.052771 -0.1633 -1.145
+-0.048445 -0.16326 -1.1448
+-0.044131 -0.16327 -1.1449
+-0.039836 -0.16336 -1.1455
+-0.035545 -0.16348 -1.1463
+-0.03126 -0.16367 -1.1477
+-0.026973 -0.16391 -1.1494
+-0.022675 -0.16416 -1.1512
+-0.018282 -0.16367 -1.1478
+-0.013932 -0.1634 -1.1458
+-0.009612 -0.16339 -1.1457
+-0.0053 -0.16359 -1.1472
+-0.000978 -0.16399 -1.15
+0.003369 -0.16462 -1.1545
+0.005565 -0.16521 -1.1586
+0.016769 -0.18001 -1.2637
+0.017962 -0.18005 -1.2639
+0.019152 -0.18005 -1.2639
+0.020344 -0.18006 -1.264
+0.022737 -0.18017 -1.2648
+0.025111 -0.18012 -1.2644
+0.027491 -0.18011 -1.2644
+0.032241 -0.18005 -1.2639
+0.036997 -0.18004 -1.2638
+0.041747 -0.18 -1.2636
+0.046496 -0.17997 -1.2633
+0.051249 -0.17995 -1.2632
+0.053642 -0.18 -1.2635
+0.054817 -0.17995 -1.2632
+0.055884 -0.17956 -1.2604
+0.05748 -0.17717 -1.2434
+0.059517 -0.17626 -1.237
+0.061617 -0.17561 -1.2324
+0.063837 -0.17533 -1.2304
+0.068162 -0.17454 -1.2248
+0.070194 -0.17386 -1.2199
+0.072363 -0.17355 -1.2178
+0.07454 -0.17328 -1.2158
+0.076745 -0.17309 -1.2145
+0.081298 -0.17304 -1.2141
+0.086023 -0.17334 -1.2163
+0.087157 -0.17332 -1.2161
+0.088174 -0.17307 -1.2143
+0.090207 -0.17258 -1.2108
+0.094802 -0.17264 -1.2113
+0.0993 -0.17253 -1.2104
+0.10383 -0.17248 -1.2101
+0.1083 -0.17233 -1.209
+0.11244 -0.1717 -1.2045
+0.11679 -0.17142 -1.2025
+0.1212 -0.17126 -1.2014
+0.1234 -0.17116 -1.2007
+0.12565 -0.17115 -1.2006
+0.13006 -0.171 -1.1995
+0.13436 -0.17072 -1.1975
+0.13874 -0.17056 -1.1964
+0.14277 -0.16999 -1.1923
+0.14488 -0.16982 -1.1911
+0.14718 -0.16989 -1.1916
+0.15156 -0.16977 -1.1907
+0.15379 -0.16976 -1.1906
+0.15621 -0.16995 -1.192
+0.16088 -0.17013 -1.1933
+0.1655 -0.17026 -1.1942
+0.16798 -0.17049 -1.1958
+0.17031 -0.17057 -1.1964
+0.17499 -0.17073 -1.1975
+0.17988 -0.1711 -1.2
+0.18421 -0.17092 -1.1988
+0.18639 -0.17085 -1.1983
+0.1892 -0.17135 -1.2018
+0.19153 -0.1714 -1.2022
+0.19379 -0.1714 -1.2022
+0.19813 -0.17123 -1.201
+0.20289 -0.17143 -1.2024
+0.20788 -0.17181 -1.2051
+0.21263 -0.17198 -1.2063
+0.21482 -0.17191 -1.2058
+0.21725 -0.17204 -1.2066
+0.21848 -0.17211 -1.2072
+0.2199 -0.17233 -1.2087
+0.22284 -0.17285 -1.2124
+0.23866 -0.17959 -1.2602
+0.24096 -0.17954 -1.2598
+0.2457 -0.17953 -1.2598
+0.25046 -0.17955 -1.2599
+0.2552 -0.17954 -1.2598
+0.25997 -0.17955 -1.2599
+0.26472 -0.17956 -1.2599
+0.26934 -0.17948 -1.2594
+0.27418 -0.17954 -1.2598
+0.279 -0.17958 -1.2601
+0.28363 -0.17952 -1.2596
+0.28829 -0.17946 -1.2593
+0.29304 -0.17946 -1.2593
+0.29766 -0.17939 -1.2588
+0.30238 -0.17938 -1.2587
+0.3071 -0.17936 -1.2586
+0.31188 -0.17939 -1.2588
+0.31665 -0.1794 -1.2589
+0.32135 -0.17938 -1.2588
+0.32607 -0.17937 -1.2587
+0.33082 -0.17937 -1.2588
+0.3355 -0.17934 -1.2585
+0.34028 -0.17936 -1.2587
+0.34487 -0.17929 -1.2582
+0.34716 -0.17924 -1.2579
+0.34819 -0.17916 -1.2573
+0.34961 -0.17928 -1.2582
+0.35426 -0.17924 -1.2579
+0.35903 -0.17925 -1.2581
+0.36382 -0.17928 -1.2583
+0.36845 -0.17923 -1.258
+0.37307 -0.17917 -1.2576
+0.37546 -0.17918 -1.2577
+0.37783 -0.17918 -1.2577
+0.37897 -0.17916 -1.2576
+-0.37954 -0.18129 -1.2642
+-0.37814 -0.18119 -1.2635
+-0.37696 -0.18119 -1.2635
+-0.37573 -0.18118 -1.2634
+-0.37333 -0.18117 -1.2633
+-0.24724 -0.18115 -1.2628
+-0.23311 -0.17943 -1.2507
+-0.23051 -0.17924 -1.2494
+-0.22801 -0.17912 -1.2485
+-0.14991 -0.18137 -1.2646
+-0.14102 -0.17622 -1.2283
+-0.13957 -0.17585 -1.2257
+-0.13837 -0.17579 -1.2252
+-0.12369 -0.16542 -1.1522
+-0.096932 -0.16424 -1.144
+-0.095921 -0.16435 -1.1448
+-0.085211 -0.16044 -1.1172
+-0.084077 -0.16029 -1.1161
+-0.081835 -0.16002 -1.1142
+-0.063034 -0.16029 -1.1162
+-0.062121 -0.16065 -1.1187
+0.020294 -0.18081 -1.2609
+0.021486 -0.18085 -1.2612
+0.022673 -0.18085 -1.2612
+0.023861 -0.18085 -1.2612
+0.026246 -0.18093 -1.2617
+0.054679 -0.18069 -1.26
+0.055853 -0.18065 -1.2597
+0.056936 -0.18032 -1.2574
+0.057842 -0.17946 -1.2513
+0.058737 -0.1786 -1.2453
+0.059682 -0.17792 -1.2405
+0.060736 -0.17759 -1.2381
+0.06171 -0.17704 -1.2342
+0.06277 -0.17675 -1.2322
+0.071306 -0.17492 -1.2193
+0.072348 -0.17466 -1.2175
+0.073468 -0.1746 -1.217
+0.075628 -0.17429 -1.2149
+0.08716 -0.17447 -1.2161
+0.089156 -0.1739 -1.2121
+0.21844 -0.17322 -1.2069
+0.22164 -0.17395 -1.2121
+0.23807 -0.18034 -1.2571
+0.2393 -0.18037 -1.2573
+0.34765 -0.18006 -1.2554
+0.37595 -0.18003 -1.2553
+0.37715 -0.18004 -1.2554
+0.37809 -0.17993 -1.2546
+-0.37837 -0.18192 -1.2603
+-0.3772 -0.18193 -1.2604
+-0.37598 -0.18191 -1.2602
+-0.37361 -0.18191 -1.2602
+-0.37128 -0.18193 -1.2603
+-0.36896 -0.18196 -1.2605
+-0.25551 -0.1823 -1.2625
+-0.25304 -0.18223 -1.262
+-0.25045 -0.18208 -1.261
+-0.2478 -0.18188 -1.2596
+-0.24653 -0.18182 -1.2592
+-0.23497 -0.18022 -1.248
+-0.23371 -0.18016 -1.2475
+-0.23114 -0.17999 -1.2464
+-0.22863 -0.17986 -1.2455
+-0.22624 -0.17983 -1.2452
+-0.22395 -0.17987 -1.2456
+-0.18399 -0.18212 -1.2614
+-0.15073 -0.18212 -1.2615
+-0.14833 -0.18209 -1.2613
+-0.14687 -0.18174 -1.2589
+-0.12504 -0.16685 -1.1547
+-0.12231 -0.1661 -1.1494
+-0.11979 -0.16561 -1.1459
+-0.097847 -0.16504 -1.142
+-0.096804 -0.1651 -1.1424
+-0.086309 -0.16158 -1.1178
+-0.085146 -0.16137 -1.1164
+-0.082906 -0.16111 -1.1145
+-0.080697 -0.16089 -1.113
+-0.078512 -0.16072 -1.1118
+-0.066012 -0.16091 -1.1132
+-0.064015 -0.16117 -1.115
+-0.063023 -0.16131 -1.116
+-0.062284 -0.16213 -1.1217
+-0.061316 -0.16522 -1.1434
+-0.059208 -0.16535 -1.1443
+-0.057047 -0.16534 -1.1442
+-0.05489 -0.16534 -1.1442
+-0.024813 -0.16612 -1.1497
+0.001189 -0.1661 -1.1496
+0.003363 -0.16647 -1.1522
+0.005553 -0.16703 -1.1561
+0.023805 -0.18162 -1.2582
+0.024993 -0.18164 -1.2584
+0.027361 -0.18164 -1.2583
+0.029737 -0.18168 -1.2586
+0.032101 -0.18164 -1.2584
+0.034471 -0.18165 -1.2584
+0.036839 -0.18164 -1.2584
+0.039197 -0.18159 -1.258
+0.053381 -0.18149 -1.2573
+0.055739 -0.18146 -1.2571
+0.057948 -0.18097 -1.2536
+0.059003 -0.18059 -1.251
+0.059939 -0.17986 -1.2459
+0.061007 -0.17955 -1.2437
+0.061939 -0.17886 -1.2389
+0.062859 -0.17816 -1.234
+0.063942 -0.17794 -1.2324
+0.066141 -0.17762 -1.2301
+0.068292 -0.17718 -1.2271
+0.070363 -0.17658 -1.2229
+0.072438 -0.17603 -1.219
+0.07454 -0.17557 -1.2158
+0.076721 -0.17532 -1.2141
+0.078999 -0.1753 -1.2139
+0.081297 -0.17533 -1.2141
+0.083663 -0.17549 -1.2152
+0.086051 -0.17569 -1.2166
+0.087162 -0.17562 -1.2161
+0.088196 -0.1754 -1.2146
+0.090202 -0.17486 -1.2108
+0.092463 -0.17482 -1.2105
+0.11904 -0.17368 -1.2024
+0.1212 -0.17352 -1.2013
+0.12336 -0.17338 -1.2003
+0.12564 -0.1734 -1.2005
+0.12786 -0.17334 -1.2001
+0.13205 -0.1729 -1.197
+0.14061 -0.17234 -1.193
+0.14467 -0.17183 -1.1894
+0.15355 -0.17173 -1.1887
+0.16301 -0.17226 -1.1924
+0.16528 -0.17229 -1.1926
+0.1677 -0.17246 -1.1938
+0.17019 -0.1727 -1.1955
+0.1725 -0.17276 -1.1959
+0.18657 -0.17327 -1.1994
+0.19142 -0.17357 -1.2015
+0.21495 -0.17429 -1.2065
+0.21725 -0.17431 -1.2067
+0.22038 -0.17499 -1.2114
+0.22185 -0.17526 -1.2132
+0.23656 -0.18127 -1.2553
+0.23759 -0.18116 -1.2545
+0.23997 -0.18116 -1.2546
+0.24228 -0.18112 -1.2543
+0.30801 -0.18088 -1.2526
+0.31028 -0.18083 -1.2523
+0.31273 -0.18088 -1.2526
+0.31505 -0.18086 -1.2525
+0.31756 -0.18094 -1.2531
+0.32684 -0.18086 -1.2525
+0.34559 -0.18079 -1.2522
+0.34797 -0.1808 -1.2523
+0.35032 -0.1808 -1.2522
+0.35978 -0.18081 -1.2524
+0.36209 -0.18079 -1.2523
+0.36444 -0.18078 -1.2522
+0.37375 -0.18072 -1.2519
+0.37616 -0.18075 -1.2521
+0.37756 -0.18086 -1.2529
+-0.37744 -0.18266 -1.2572
+-0.37608 -0.18257 -1.2566
+-0.3749 -0.18257 -1.2566
+-0.37385 -0.18264 -1.257
+-0.37147 -0.18263 -1.2569
+-0.25098 -0.18279 -1.2576
+-0.24968 -0.18271 -1.2571
+-0.24843 -0.18266 -1.2567
+-0.23688 -0.18107 -1.2457
+-0.23561 -0.18099 -1.2451
+-0.23432 -0.1809 -1.2445
+-0.23177 -0.18074 -1.2434
+-0.14656 -0.18255 -1.2562
+-0.14534 -0.18251 -1.2559
+-0.12355 -0.1674 -1.1509
+-0.096645 -0.1659 -1.1405
+-0.087351 -0.16261 -1.1176
+-0.086231 -0.16248 -1.1168
+-0.063015 -0.16235 -1.1159
+-0.061316 -0.1663 -1.1433
+-0.06025 -0.16633 -1.1436
+-0.058103 -0.16635 -1.1437
+0.004451 -0.16765 -1.1528
+0.005546 -0.16791 -1.1546
+0.033216 -0.18245 -1.2557
+0.035573 -0.18241 -1.2555
+0.058968 -0.18166 -1.2502
+0.060103 -0.18153 -1.2493
+0.061117 -0.18105 -1.246
+0.062163 -0.18068 -1.2434
+0.063125 -0.18008 -1.2392
+0.071493 -0.17768 -1.2225
+0.072471 -0.17726 -1.2196
+0.073517 -0.17701 -1.2178
+0.075669 -0.17668 -1.2155
+0.087221 -0.17689 -1.217
+0.089157 -0.17618 -1.2121
+0.12226 -0.17455 -1.2006
+0.12334 -0.17448 -1.2001
+0.12449 -0.1745 -1.2003
+0.22189 -0.17643 -1.2134
+0.23474 -0.18196 -1.2519
+0.23593 -0.18196 -1.2519
+0.23832 -0.18199 -1.2521
+0.35996 -0.18149 -1.2489
+0.37398 -0.18144 -1.2487
+0.37528 -0.1815 -1.2491
+0.37638 -0.18146 -1.2489
+-0.37641 -0.18334 -1.2537
+-0.37522 -0.18333 -1.2537
+-0.37417 -0.1834 -1.2541
+-0.37185 -0.18342 -1.2542
+-0.36966 -0.1835 -1.2548
+-0.36523 -0.18365 -1.2558
+-0.36069 -0.18375 -1.2564
+-0.35634 -0.18394 -1.2577
+-0.35179 -0.18404 -1.2584
+-0.34727 -0.18416 -1.2592
+-0.34258 -0.18419 -1.2593
+-0.33788 -0.18421 -1.2595
+-0.333 -0.18414 -1.2589
+-0.3282 -0.1841 -1.2587
+-0.32347 -0.18411 -1.2587
+-0.31864 -0.18406 -1.2583
+-0.31393 -0.18407 -1.2584
+-0.30917 -0.18407 -1.2583
+-0.30447 -0.18409 -1.2585
+-0.29968 -0.18406 -1.2583
+-0.29492 -0.18405 -1.2582
+-0.29011 -0.184 -1.2578
+-0.28542 -0.18404 -1.2581
+-0.28065 -0.18401 -1.2579
+-0.27588 -0.18399 -1.2578
+-0.27119 -0.18402 -1.258
+-0.26646 -0.18403 -1.2581
+-0.26159 -0.18394 -1.2574
+-0.25672 -0.18385 -1.2568
+-0.25416 -0.1837 -1.2558
+-0.25157 -0.18354 -1.2546
+-0.25029 -0.18347 -1.2541
+-0.23751 -0.18182 -1.2428
+-0.23492 -0.18163 -1.2414
+-0.23236 -0.18146 -1.2403
+-0.22999 -0.18143 -1.2401
+-0.22536 -0.18146 -1.2403
+-0.22096 -0.18169 -1.2419
+-0.21662 -0.18197 -1.2439
+-0.2123 -0.18229 -1.2461
+-0.20801 -0.18264 -1.2485
+-0.20368 -0.18298 -1.2508
+-0.19926 -0.18324 -1.2527
+-0.19482 -0.18351 -1.2545
+-0.19025 -0.18366 -1.2556
+-0.18553 -0.18367 -1.2557
+-0.18086 -0.18373 -1.2561
+-0.17614 -0.18374 -1.2561
+-0.17143 -0.18376 -1.2563
+-0.16669 -0.18376 -1.2563
+-0.16195 -0.18374 -1.2562
+-0.15716 -0.18368 -1.2558
+-0.1524 -0.18364 -1.2556
+-0.14769 -0.18367 -1.2558
+-0.14524 -0.18356 -1.255
+-0.1248 -0.16871 -1.1524
+-0.12215 -0.16805 -1.1478
+-0.11715 -0.16709 -1.1412
+-0.11249 -0.16656 -1.1376
+-0.10802 -0.16629 -1.1357
+-0.10375 -0.1663 -1.1358
+-0.099624 -0.16657 -1.1377
+-0.097549 -0.16669 -1.1385
+-0.087323 -0.16361 -1.1173
+-0.085033 -0.16326 -1.1148
+-0.080606 -0.16281 -1.1118
+-0.076331 -0.16264 -1.1105
+-0.072152 -0.16265 -1.1107
+-0.068029 -0.16281 -1.1118
+-0.065994 -0.16296 -1.1128
+-0.06399 -0.1632 -1.1145
+-0.063021 -0.16342 -1.116
+-0.062013 -0.16636 -1.1363
+-0.061292 -0.16731 -1.1429
+-0.059158 -0.16737 -1.1433
+-0.057011 -0.16739 -1.1435
+-0.052689 -0.16736 -1.1432
+-0.048362 -0.1673 -1.1428
+-0.04405 -0.16728 -1.1427
+-0.039758 -0.16735 -1.1432
+-0.03547 -0.16745 -1.1439
+-0.031197 -0.16766 -1.1454
+-0.026924 -0.16794 -1.1473
+-0.024791 -0.16814 -1.1486
+-0.022636 -0.16821 -1.1492
+-0.018219 -0.16742 -1.1437
+-0.013884 -0.16714 -1.1418
+-0.009579 -0.16712 -1.1416
+-0.00528 -0.16727 -1.1427
+-0.000975 -0.16767 -1.1454
+0.003356 -0.16831 -1.1498
+0.005541 -0.16886 -1.1537
+0.00664 -0.16916 -1.1557
+0.02958 -0.18307 -1.2519
+0.031952 -0.18316 -1.2525
+0.033131 -0.18316 -1.2524
+0.034309 -0.18315 -1.2524
+0.036665 -0.18314 -1.2523
+0.041381 -0.18314 -1.2523
+0.046091 -0.18312 -1.2522
+0.050769 -0.18298 -1.2512
+0.055466 -0.18293 -1.2509
+0.057772 -0.18277 -1.2498
+0.060037 -0.18251 -1.2479
+0.062227 -0.18204 -1.2447
+0.064369 -0.18147 -1.2407
+0.06638 -0.18058 -1.2346
+0.068477 -0.17998 -1.2305
+0.070616 -0.17953 -1.2273
+0.072628 -0.17879 -1.2222
+0.074647 -0.17812 -1.2176
+0.076824 -0.17785 -1.2157
+0.081427 -0.1779 -1.216
+0.086086 -0.17806 -1.2171
+0.088338 -0.17798 -1.2166
+0.090242 -0.17722 -1.2113
+0.094717 -0.17705 -1.2101
+0.099219 -0.17695 -1.2094
+0.10375 -0.1769 -1.2091
+0.10818 -0.1767 -1.2077
+0.11229 -0.17601 -1.2029
+0.11684 -0.17604 -1.2031
+0.12116 -0.17573 -1.2009
+0.12341 -0.1757 -1.2007
+0.12568 -0.17572 -1.2009
+0.12986 -0.17526 -1.1976
+0.13186 -0.17491 -1.1953
+0.13407 -0.17486 -1.1949
+0.13844 -0.17469 -1.1937
+0.14054 -0.1745 -1.1924
+0.14242 -0.17406 -1.1894
+0.14699 -0.17416 -1.19
+0.15118 -0.17382 -1.1876
+0.15345 -0.17386 -1.1879
+0.156 -0.1742 -1.1903
+0.16044 -0.17415 -1.1899
+0.16511 -0.17435 -1.1913
+0.16737 -0.17437 -1.1914
+0.17006 -0.17483 -1.1946
+0.17492 -0.17519 -1.197
+0.17983 -0.17558 -1.1997
+0.18426 -0.17548 -1.1991
+0.18897 -0.17566 -1.2003
+0.19358 -0.17574 -1.2008
+0.1981 -0.17574 -1.2008
+0.20316 -0.1762 -1.204
+0.2078 -0.17629 -1.2046
+0.21273 -0.17661 -1.2068
+0.21524 -0.1768 -1.2081
+0.21791 -0.17712 -1.2103
+0.22057 -0.17743 -1.2125
+0.22236 -0.17795 -1.216
+0.23303 -0.18272 -1.249
+0.23427 -0.18277 -1.2494
+0.23657 -0.18273 -1.249
+0.23892 -0.18273 -1.249
+0.24358 -0.1827 -1.2488
+0.2482 -0.18263 -1.2484
+0.25298 -0.18268 -1.2487
+0.25768 -0.18268 -1.2487
+0.26231 -0.18263 -1.2484
+0.26699 -0.18262 -1.2483
+0.27163 -0.18257 -1.2479
+0.27637 -0.1826 -1.2481
+0.28108 -0.18261 -1.2482
+0.28578 -0.1826 -1.2482
+0.29039 -0.18255 -1.2478
+0.29511 -0.18256 -1.2479
+0.29973 -0.18251 -1.2475
+0.30443 -0.18251 -1.2476
+0.30912 -0.1825 -1.2475
+0.31391 -0.18255 -1.2479
+0.31852 -0.1825 -1.2476
+0.32325 -0.18252 -1.2477
+0.3255 -0.18246 -1.2473
+0.32784 -0.18246 -1.2473
+0.3324 -0.18238 -1.2468
+0.33706 -0.18236 -1.2467
+0.3417 -0.18234 -1.2465
+0.34648 -0.18238 -1.2468
+0.35107 -0.18232 -1.2465
+0.35582 -0.18235 -1.2467
+0.35819 -0.18236 -1.2468
+0.36063 -0.18241 -1.2471
+0.36519 -0.18234 -1.2467
+0.36983 -0.18231 -1.2466
+0.37212 -0.18228 -1.2464
+0.37454 -0.18232 -1.2467
+0.37552 -0.18223 -1.246
+-0.37555 -0.1841 -1.2508
+-0.37444 -0.18413 -1.2511
+-0.37329 -0.18415 -1.2511
+-0.37219 -0.18418 -1.2514
+-0.36996 -0.18425 -1.2518
+-0.25208 -0.18424 -1.2513
+-0.23934 -0.18261 -1.2401
+-0.23808 -0.18253 -1.2396
+-0.23553 -0.18237 -1.2385
+-0.14614 -0.18439 -1.2526
+-0.14496 -0.18439 -1.2526
+-0.1233 -0.16923 -1.1486
+-0.098446 -0.16746 -1.1364
+-0.064979 -0.1641 -1.1134
+-0.063036 -0.16451 -1.1162
+-0.062052 -0.16753 -1.137
+-0.023706 -0.1692 -1.1485
+0.006629 -0.16997 -1.1538
+0.034225 -0.18388 -1.2493
+0.035402 -0.18389 -1.2493
+0.063285 -0.18288 -1.2424
+0.064438 -0.18283 -1.2421
+0.065522 -0.1826 -1.2404
+0.066586 -0.18231 -1.2385
+0.067564 -0.1818 -1.235
+0.13074 -0.17605 -1.1953
+0.13292 -0.17595 -1.1947
+0.22276 -0.17942 -1.2182
+0.23128 -0.18345 -1.2459
+0.23247 -0.18346 -1.246
+0.32588 -0.18319 -1.2443
+0.37242 -0.18303 -1.2435
+0.37332 -0.1829 -1.2426
+0.37493 -0.18311 -1.244
+-0.37466 -0.18484 -1.2478
+-0.37366 -0.18492 -1.2484
+-0.37249 -0.18493 -1.2484
+-0.37024 -0.18498 -1.2487
+-0.36815 -0.18511 -1.2496
+-0.36604 -0.18523 -1.2504
+-0.25789 -0.18536 -1.2509
+-0.25529 -0.18517 -1.2496
+-0.25272 -0.18502 -1.2486
+-0.25135 -0.18487 -1.2476
+-0.23996 -0.18335 -1.2372
+-0.2387 -0.18328 -1.2367
+-0.23615 -0.18311 -1.2356
+-0.23371 -0.18302 -1.235
+-0.23133 -0.18298 -1.2347
+-0.14938 -0.1852 -1.25
+-0.147 -0.18517 -1.2498
+-0.14463 -0.18514 -1.2497
+-0.14345 -0.18514 -1.2497
+-0.14229 -0.18517 -1.2498
+-0.12467 -0.1707 -1.1511
+-0.12198 -0.16998 -1.1462
+-0.11938 -0.16936 -1.142
+-0.10146 -0.1682 -1.1342
+-0.099398 -0.16833 -1.135
+-0.098327 -0.16833 -1.135
+-0.090553 -0.16585 -1.1181
+-0.089451 -0.16576 -1.1175
+-0.087176 -0.16544 -1.1154
+-0.084913 -0.16513 -1.1133
+-0.082716 -0.16494 -1.1119
+-0.070048 -0.16473 -1.1105
+-0.068004 -0.16485 -1.1114
+-0.065983 -0.16503 -1.1126
+-0.064979 -0.16515 -1.1134
+-0.064004 -0.16534 -1.1147
+-0.063072 -0.16566 -1.1169
+-0.062142 -0.16885 -1.1387
+-0.061259 -0.16938 -1.1423
+-0.059124 -0.16943 -1.1426
+-0.029031 -0.16978 -1.145
+-0.0269 -0.16995 -1.1462
+-0.02477 -0.17016 -1.1477
+-0.023699 -0.17023 -1.1482
+-0.022617 -0.17023 -1.1482
+-0.020378 -0.16961 -1.1439
+0.005528 -0.17064 -1.1509
+0.006622 -0.17087 -1.1525
+0.036502 -0.18468 -1.2467
+0.038854 -0.1847 -1.2468
+0.041195 -0.18467 -1.2466
+0.043541 -0.18466 -1.2466
+0.045908 -0.18474 -1.2471
+0.048238 -0.18467 -1.2466
+0.050573 -0.18462 -1.2463
+0.052903 -0.18457 -1.2459
+0.05754 -0.18439 -1.2447
+0.06207 -0.18392 -1.2415
+0.064379 -0.18384 -1.2409
+0.066612 -0.18355 -1.239
+0.068764 -0.18307 -1.2357
+0.070894 -0.18256 -1.2322
+0.07315 -0.1824 -1.2311
+0.07507 -0.18144 -1.2245
+0.07705 -0.18067 -1.2193
+0.079264 -0.18048 -1.218
+0.088426 -0.18045 -1.2178
+0.090291 -0.1796 -1.212
+0.092495 -0.17944 -1.2109
+0.094703 -0.17931 -1.21
+0.09698 -0.1793 -1.2099
+0.11463 -0.17838 -1.2036
+0.12344 -0.17801 -1.201
+0.12786 -0.17787 -1.2001
+0.12975 -0.17736 -1.1966
+0.13071 -0.17714 -1.1951
+0.13178 -0.17706 -1.1945
+0.13396 -0.17697 -1.1939
+0.13607 -0.17678 -1.1926
+0.14042 -0.17661 -1.1914
+0.14898 -0.17611 -1.188
+0.15105 -0.17591 -1.1866
+0.15339 -0.17603 -1.1875
+0.16273 -0.17646 -1.1903
+0.16719 -0.17642 -1.1901
+0.17249 -0.17726 -1.1958
+0.19124 -0.17794 -1.2004
+0.19578 -0.17795 -1.2005
+0.19831 -0.17819 -1.2021
+0.20096 -0.17853 -1.2044
+0.20321 -0.17852 -1.2043
+0.20544 -0.17848 -1.204
+0.20788 -0.17863 -1.2051
+0.21047 -0.17889 -1.2069
+0.21555 -0.17934 -1.2099
+0.21809 -0.17955 -1.2113
+0.22119 -0.18022 -1.2159
+0.22932 -0.18399 -1.2416
+0.23088 -0.1843 -1.2437
+0.23318 -0.18426 -1.2435
+0.23551 -0.18425 -1.2434
+0.30984 -0.18388 -1.2409
+0.31221 -0.1839 -1.2411
+0.31462 -0.18395 -1.2414
+0.32402 -0.18397 -1.2416
+0.32502 -0.18388 -1.241
+0.32629 -0.18394 -1.2414
+0.32865 -0.18395 -1.2414
+0.34272 -0.18397 -1.2417
+0.34491 -0.18389 -1.2411
+0.3472 -0.18386 -1.241
+0.34962 -0.18391 -1.2413
+0.35196 -0.18391 -1.2413
+0.3564 -0.18379 -1.2405
+0.37066 -0.18391 -1.2415
+0.37278 -0.1838 -1.2408
+0.374 -0.18382 -1.2409
+-0.37396 -0.18567 -1.2455
+-0.37285 -0.1857 -1.2457
+-0.37178 -0.18575 -1.246
+-0.37064 -0.18577 -1.2461
+-0.3684 -0.18582 -1.2465
+-0.24307 -0.18423 -1.2353
+-0.24178 -0.18413 -1.2346
+-0.24053 -0.18407 -1.2342
+-0.23927 -0.18399 -1.2337
+-0.1431 -0.18586 -1.2466
+-0.14193 -0.18586 -1.2466
+-0.12324 -0.17131 -1.1479
+-0.098168 -0.16913 -1.1332
+-0.091661 -0.167 -1.1188
+-0.090502 -0.16681 -1.1175
+-0.066987 -0.16597 -1.1119
+-0.065977 -0.16607 -1.1125
+-0.064976 -0.16619 -1.1134
+-0.06312 -0.16683 -1.1177
+-0.062167 -0.16999 -1.1391
+-0.025826 -0.17107 -1.1465
+-0.02476 -0.17117 -1.1472
+-0.023683 -0.1712 -1.1474
+0.006616 -0.1718 -1.1514
+0.012832 -0.18308 -1.2279
+0.01399 -0.1831 -1.2281
+0.01515 -0.18315 -1.2284
+0.016308 -0.18316 -1.2285
+0.046974 -0.18549 -1.2442
+0.049299 -0.18542 -1.2438
+0.065459 -0.18476 -1.2392
+0.066579 -0.18463 -1.2384
+0.067697 -0.18449 -1.2374
+0.069911 -0.18419 -1.2354
+0.070983 -0.18395 -1.2338
+0.072038 -0.18368 -1.2319
+0.074275 -0.18347 -1.2305
+0.075332 -0.18323 -1.2288
+0.076307 -0.18279 -1.2259
+0.091413 -0.1807 -1.2117
+0.093586 -0.18049 -1.2102
+0.13065 -0.17819 -1.1945
+0.13285 -0.17811 -1.194
+0.14992 -0.17701 -1.1865
+0.20432 -0.17963 -1.2041
+0.20545 -0.17963 -1.2041
+0.2067 -0.17973 -1.2048
+0.21966 -0.18105 -1.2138
+0.22916 -0.18503 -1.2407
+0.23161 -0.18511 -1.2413
+0.32447 -0.18473 -1.2388
+0.3709 -0.18462 -1.2383
+0.37207 -0.18462 -1.2384
+0.37328 -0.18464 -1.2385
+-0.37342 -0.18657 -1.2437
+-0.37208 -0.18649 -1.2431
+-0.37103 -0.18655 -1.2435
+-0.36886 -0.18664 -1.2441
+-0.36678 -0.18677 -1.2449
+-0.36243 -0.18694 -1.2461
+-0.35803 -0.1871 -1.2471
+-0.35351 -0.18719 -1.2477
+-0.34889 -0.18723 -1.2479
+-0.34418 -0.18722 -1.2478
+-0.33945 -0.18721 -1.2477
+-0.33469 -0.18718 -1.2475
+-0.33003 -0.1872 -1.2476
+-0.32521 -0.18713 -1.2471
+-0.32056 -0.18716 -1.2473
+-0.3158 -0.18712 -1.247
+-0.31124 -0.1872 -1.2475
+-0.30648 -0.18717 -1.2473
+-0.30172 -0.18713 -1.247
+-0.29686 -0.18703 -1.2463
+-0.29237 -0.18716 -1.2472
+-0.28757 -0.18709 -1.2467
+-0.28285 -0.18707 -1.2466
+-0.2782 -0.1871 -1.2468
+-0.27342 -0.18705 -1.2465
+-0.2687 -0.18703 -1.2463
+-0.26381 -0.1869 -1.2454
+-0.25894 -0.18677 -1.2445
+-0.25633 -0.18657 -1.2432
+-0.24242 -0.1849 -1.2319
+-0.23977 -0.18464 -1.2302
+-0.23736 -0.18457 -1.2297
+-0.23255 -0.18443 -1.2288
+-0.22813 -0.1846 -1.23
+-0.22385 -0.1849 -1.2319
+-0.21951 -0.18515 -1.2336
+-0.21532 -0.18554 -1.2363
+-0.21112 -0.18595 -1.2391
+-0.20678 -0.18624 -1.241
+-0.20236 -0.18647 -1.2426
+-0.19787 -0.18665 -1.2438
+-0.1933 -0.18677 -1.2446
+-0.18864 -0.1868 -1.2448
+-0.18396 -0.18681 -1.2449
+-0.17925 -0.18679 -1.2448
+-0.17456 -0.18679 -1.2448
+-0.16988 -0.1868 -1.2449
+-0.16521 -0.18682 -1.245
+-0.16051 -0.18681 -1.2449
+-0.15578 -0.18676 -1.2447
+-0.15106 -0.18672 -1.2444
+-0.14635 -0.18669 -1.2442
+-0.14398 -0.18666 -1.244
+-0.14165 -0.18667 -1.2441
+-0.14046 -0.18665 -1.2439
+-0.1231 -0.17219 -1.1466
+-0.12174 -0.17181 -1.144
+-0.11666 -0.17069 -1.1364
+-0.11202 -0.17014 -1.1328
+-0.10759 -0.16989 -1.1311
+-0.1033 -0.16986 -1.1309
+-0.10121 -0.16992 -1.1313
+-0.099119 -0.16999 -1.1318
+-0.097994 -0.16989 -1.1311
+-0.092702 -0.16803 -1.1186
+-0.091547 -0.16785 -1.1174
+-0.089278 -0.16754 -1.1153
+-0.084817 -0.16704 -1.112
+-0.080471 -0.16673 -1.1098
+-0.076243 -0.16663 -1.1092
+-0.072089 -0.1667 -1.1097
+-0.068003 -0.16694 -1.1113
+-0.065985 -0.16714 -1.1127
+-0.064975 -0.16724 -1.1133
+-0.064047 -0.16756 -1.1155
+-0.063251 -0.16824 -1.1201
+-0.062233 -0.17125 -1.1403
+-0.061209 -0.17139 -1.1413
+-0.056931 -0.17147 -1.1418
+-0.052637 -0.1715 -1.1421
+-0.048303 -0.1714 -1.1414
+-0.043991 -0.17136 -1.1411
+-0.039702 -0.17142 -1.1415
+-0.035423 -0.17154 -1.1423
+-0.031147 -0.17171 -1.1435
+-0.026886 -0.17202 -1.1456
+-0.02475 -0.17218 -1.1467
+-0.022578 -0.1721 -1.1461
+-0.02034 -0.17144 -1.1417
+-0.018163 -0.17121 -1.1401
+-0.013841 -0.17091 -1.1382
+-0.009546 -0.17084 -1.1376
+-0.005262 -0.171 -1.1387
+-0.000971 -0.17132 -1.1409
+0.003341 -0.17189 -1.1447
+0.005514 -0.17237 -1.148
+0.006606 -0.17262 -1.1496
+0.007711 -0.17311 -1.153
+0.012805 -0.18386 -1.2253
+0.015109 -0.18381 -1.225
+0.017424 -0.18389 -1.2256
+0.01974 -0.18396 -1.2261
+0.04332 -0.18606 -1.2402
+0.045676 -0.18614 -1.2407
+0.046842 -0.18613 -1.2407
+0.04801 -0.18613 -1.2407
+0.050344 -0.18613 -1.2406
+0.055018 -0.18613 -1.2406
+0.059607 -0.18587 -1.2389
+0.061884 -0.1857 -1.2377
+0.064154 -0.18553 -1.2365
+0.066497 -0.18557 -1.2368
+0.068748 -0.18535 -1.2354
+0.070991 -0.18513 -1.2339
+0.073147 -0.18471 -1.231
+0.075394 -0.18454 -1.2298
+0.077502 -0.18404 -1.2265
+0.079506 -0.18334 -1.2218
+0.08169 -0.18307 -1.22
+0.086272 -0.18304 -1.2198
+0.088525 -0.18295 -1.2192
+0.090465 -0.18223 -1.2143
+0.091461 -0.18194 -1.2123
+0.092563 -0.18186 -1.2118
+0.094751 -0.18168 -1.2106
+0.097035 -0.18169 -1.2106
+0.099286 -0.18163 -1.2102
+0.10366 -0.18131 -1.208
+0.10808 -0.18108 -1.2065
+0.11253 -0.18093 -1.2055
+0.1148 -0.18093 -1.2054
+0.11689 -0.18065 -1.2036
+0.12129 -0.18044 -1.2022
+0.12572 -0.1803 -1.2012
+0.12781 -0.18007 -1.1996
+0.12957 -0.17937 -1.1949
+0.13175 -0.17927 -1.1943
+0.13387 -0.1791 -1.1931
+0.13829 -0.179 -1.1924
+0.14248 -0.17862 -1.1898
+0.14689 -0.17852 -1.1892
+0.14887 -0.17822 -1.1871
+0.14981 -0.178 -1.1856
+0.15092 -0.178 -1.1856
+0.15576 -0.17842 -1.1885
+0.16024 -0.17842 -1.1884
+0.16265 -0.17861 -1.1897
+0.16484 -0.17855 -1.1893
+0.16706 -0.17853 -1.1892
+0.16992 -0.17919 -1.1936
+0.17265 -0.17968 -1.1969
+0.17502 -0.1798 -1.1977
+0.17969 -0.17996 -1.1988
+0.18444 -0.18018 -1.2002
+0.18894 -0.18016 -1.2001
+0.1912 -0.18016 -1.2001
+0.19342 -0.18013 -1.1999
+0.19619 -0.18059 -1.203
+0.19882 -0.18092 -1.2052
+0.20337 -0.18093 -1.2052
+0.20565 -0.18093 -1.2053
+0.20861 -0.18154 -1.2093
+0.21328 -0.18163 -1.2099
+0.21566 -0.18172 -1.2105
+0.21831 -0.18202 -1.2126
+0.22003 -0.1825 -1.2158
+0.22865 -0.18578 -1.2379
+0.22987 -0.18582 -1.2382
+0.23219 -0.18581 -1.2381
+0.23673 -0.18572 -1.2375
+0.24146 -0.18577 -1.2378
+0.24602 -0.18569 -1.2373
+0.25063 -0.18566 -1.237
+0.25524 -0.18562 -1.2368
+0.25989 -0.18561 -1.2367
+0.26456 -0.18562 -1.2368
+0.26921 -0.18561 -1.2367
+0.27384 -0.18559 -1.2366
+0.2786 -0.18566 -1.2371
+0.28319 -0.18561 -1.2368
+0.28793 -0.18567 -1.2371
+0.29249 -0.1856 -1.2367
+0.29712 -0.18558 -1.2366
+0.30166 -0.18551 -1.2361
+0.30627 -0.18548 -1.2359
+0.31095 -0.18549 -1.236
+0.31551 -0.18544 -1.2357
+0.3201 -0.1854 -1.2354
+0.32263 -0.18551 -1.2362
+0.32502 -0.18555 -1.2364
+0.32956 -0.18548 -1.236
+0.33435 -0.18556 -1.2366
+0.33891 -0.1855 -1.2362
+0.34352 -0.18548 -1.2361
+0.34586 -0.18549 -1.2361
+0.34819 -0.18549 -1.2362
+0.35253 -0.18532 -1.2351
+0.35734 -0.1854 -1.2357
+0.36194 -0.18537 -1.2355
+0.36656 -0.18536 -1.2355
+0.36874 -0.18528 -1.235
+0.371 -0.18525 -1.2348
+0.37218 -0.18526 -1.2348
+-0.37278 -0.18742 -1.2415
+-0.3715 -0.18736 -1.2411
+-0.37033 -0.18736 -1.2411
+-0.36931 -0.18744 -1.2416
+-0.36714 -0.18752 -1.2422
+-0.25685 -0.18727 -1.24
+-0.25556 -0.18718 -1.2394
+-0.24565 -0.18587 -1.2307
+-0.24431 -0.18573 -1.2297
+-0.243 -0.18562 -1.229
+-0.14019 -0.18746 -1.2415
+-0.12293 -0.17304 -1.145
+-0.10004 -0.17081 -1.1302
+-0.098936 -0.17075 -1.1297
+-0.096113 -0.16952 -1.1215
+-0.094904 -0.16925 -1.1197
+-0.09374 -0.16906 -1.1184
+-0.092581 -0.16887 -1.1171
+-0.090326 -0.16859 -1.1153
+-0.065007 -0.16837 -1.1139
+-0.063381 -0.16964 -1.1224
+-0.062984 -0.17144 -1.1344
+-0.06223 -0.17232 -1.1403
+-0.023653 -0.17315 -1.1459
+-0.021428 -0.17262 -1.1424
+-0.019233 -0.17224 -1.1398
+0.006598 -0.17351 -1.1483
+0.020842 -0.18465 -1.2229
+0.021996 -0.18467 -1.2231
+0.047885 -0.18681 -1.2374
+0.049055 -0.18683 -1.2375
+0.060704 -0.18682 -1.2374
+0.062837 -0.18624 -1.2335
+0.063977 -0.18618 -1.2331
+0.065154 -0.18622 -1.2334
+0.067506 -0.1863 -1.2339
+0.068684 -0.18635 -1.2342
+0.069813 -0.18625 -1.2336
+0.070927 -0.18613 -1.2328
+0.072033 -0.18599 -1.2318
+0.091588 -0.18334 -1.214
+0.093751 -0.18309 -1.2124
+0.094788 -0.18289 -1.211
+0.095928 -0.18289 -1.211
+0.098208 -0.18289 -1.211
+0.14977 -0.17908 -1.1854
+0.16145 -0.17964 -1.1891
+0.16371 -0.17966 -1.1892
+0.19009 -0.18131 -1.2002
+0.19116 -0.18125 -1.1998
+0.19229 -0.18125 -1.1998
+0.1937 -0.18152 -1.2016
+0.1952 -0.18186 -1.2039
+0.1979 -0.18225 -1.2065
+0.21444 -0.18279 -1.21
+0.21579 -0.18296 -1.2112
+0.21711 -0.18312 -1.2123
+0.21878 -0.18356 -1.2152
+0.22125 -0.18466 -1.2226
+0.22814 -0.18654 -1.2351
+0.23045 -0.18652 -1.235
+0.36908 -0.18603 -1.2322
+0.37024 -0.18603 -1.2322
+0.37183 -0.18625 -1.2337
+-0.37188 -0.18813 -1.2385
+-0.37093 -0.18824 -1.2392
+-0.36975 -0.18824 -1.2392
+-0.36751 -0.18829 -1.2395
+-0.36539 -0.18839 -1.2402
+-0.36328 -0.18851 -1.2409
+-0.26009 -0.18825 -1.2388
+-0.25738 -0.18797 -1.2369
+-0.24736 -0.18657 -1.2276
+-0.24614 -0.18652 -1.2273
+-0.24352 -0.18628 -1.2257
+-0.24101 -0.18613 -1.2247
+-0.23862 -0.18607 -1.2243
+-0.14332 -0.18814 -1.2383
+-0.14103 -0.18819 -1.2386
+-0.13986 -0.18819 -1.2386
+-0.12288 -0.17405 -1.1445
+-0.12143 -0.17352 -1.141
+-0.11886 -0.17291 -1.1369
+-0.1052 -0.1716 -1.1283
+-0.10307 -0.17159 -1.1282
+-0.10094 -0.1716 -1.1283
+-0.099861 -0.17157 -1.1281
+-0.097152 -0.17055 -1.1213
+-0.095942 -0.17028 -1.1195
+-0.093617 -0.16989 -1.1169
+-0.091356 -0.1696 -1.115
+-0.089129 -0.16936 -1.1134
+-0.086919 -0.16915 -1.112
+-0.070022 -0.16886 -1.1101
+-0.067989 -0.16901 -1.1111
+-0.066008 -0.1693 -1.1131
+-0.064076 -0.16974 -1.116
+-0.063398 -0.17075 -1.1227
+-0.063041 -0.17267 -1.1355
+-0.062227 -0.17338 -1.1402
+-0.061175 -0.17345 -1.1407
+-0.059041 -0.17349 -1.141
+-0.033264 -0.17366 -1.1421
+-0.028991 -0.17386 -1.1434
+-0.024712 -0.17408 -1.1449
+-0.023631 -0.17406 -1.1448
+-0.022527 -0.17387 -1.1435
+-0.021406 -0.17352 -1.1412
+-0.020299 -0.17325 -1.1394
+-0.01813 -0.17305 -1.1381
+-0.015967 -0.17286 -1.1368
+0.005501 -0.17413 -1.1453
+0.007694 -0.17491 -1.1504
+0.012753 -0.18541 -1.2203
+0.015049 -0.18538 -1.2201
+0.017343 -0.18534 -1.2198
+0.01964 -0.18533 -1.2198
+0.021943 -0.18538 -1.2201
+0.023093 -0.18539 -1.2202
+0.024254 -0.18548 -1.2207
+0.025407 -0.1855 -1.2209
+0.050091 -0.18752 -1.2343
+0.052428 -0.18756 -1.2346
+0.054786 -0.18768 -1.2353
+0.057124 -0.18771 -1.2356
+0.05945 -0.18771 -1.2355
+0.060484 -0.18731 -1.2329
+0.061619 -0.18723 -1.2324
+0.062729 -0.18708 -1.2313
+0.0637 -0.18652 -1.2277
+0.066119 -0.18683 -1.2297
+0.071983 -0.18702 -1.231
+0.073113 -0.18694 -1.2304
+0.075375 -0.18681 -1.2295
+0.077598 -0.18658 -1.228
+0.079769 -0.18625 -1.2258
+0.081926 -0.18591 -1.2235
+0.084114 -0.18565 -1.2218
+0.086375 -0.18556 -1.2212
+0.088664 -0.18554 -1.2211
+0.090793 -0.18519 -1.2187
+0.092897 -0.18481 -1.2162
+0.095037 -0.18452 -1.2142
+0.096022 -0.18421 -1.2122
+0.097156 -0.1842 -1.2121
+0.099386 -0.1841 -1.2115
+0.10162 -0.18401 -1.2109
+0.10376 -0.18377 -1.2092
+0.10589 -0.18351 -1.2075
+0.10814 -0.18347 -1.2072
+0.11039 -0.18341 -1.2069
+0.1127 -0.18349 -1.2073
+0.11496 -0.18346 -1.2072
+0.11703 -0.18314 -1.205
+0.11921 -0.183 -1.2041
+0.12782 -0.18234 -1.1997
+0.13179 -0.18158 -1.1946
+0.13605 -0.18126 -1.1925
+0.14031 -0.18095 -1.1904
+0.14884 -0.18041 -1.1868
+0.14977 -0.18019 -1.1853
+0.15088 -0.18019 -1.1853
+0.15333 -0.18044 -1.187
+0.15786 -0.1805 -1.1874
+0.16023 -0.18065 -1.1883
+0.16148 -0.18079 -1.1893
+0.16261 -0.18081 -1.1894
+0.16465 -0.18059 -1.188
+0.16704 -0.18075 -1.189
+0.17274 -0.18203 -1.1975
+0.17731 -0.18209 -1.1979
+0.17975 -0.18227 -1.1991
+0.18222 -0.18249 -1.2006
+0.18459 -0.18259 -1.2012
+0.18687 -0.18261 -1.2013
+0.18913 -0.18261 -1.2013
+0.19148 -0.18269 -1.2019
+0.1943 -0.18321 -1.2053
+0.19696 -0.18357 -1.2077
+0.19932 -0.18365 -1.2083
+0.20152 -0.18358 -1.2078
+0.20631 -0.1838 -1.2092
+0.2086 -0.1838 -1.2092
+0.21087 -0.1838 -1.2092
+0.21324 -0.18388 -1.2098
+0.21611 -0.18438 -1.2131
+0.21758 -0.18466 -1.2149
+0.21992 -0.18567 -1.2216
+0.22383 -0.18701 -1.2305
+0.22646 -0.18727 -1.2323
+0.22887 -0.18735 -1.2328
+0.23107 -0.18725 -1.2321
+0.23349 -0.18732 -1.2326
+0.32104 -0.18692 -1.2301
+0.34419 -0.18691 -1.2301
+0.36725 -0.18685 -1.2299
+0.36952 -0.18683 -1.2298
+0.37057 -0.18678 -1.2295
+-0.37118 -0.18895 -1.2362
+-0.36998 -0.18893 -1.236
+-0.36885 -0.18895 -1.2361
+-0.36797 -0.18909 -1.2371
+-0.36574 -0.18914 -1.2374
+-0.24665 -0.18719 -1.2241
+-0.1395 -0.18887 -1.2354
+-0.12272 -0.1749 -1.143
+-0.10187 -0.17243 -1.1268
+-0.099465 -0.17195 -1.1236
+-0.098103 -0.17142 -1.1201
+-0.096942 -0.17124 -1.1188
+-0.094627 -0.17086 -1.1164
+-0.066988 -0.17017 -1.1119
+-0.066003 -0.17034 -1.113
+-0.065033 -0.17054 -1.1143
+-0.064082 -0.17081 -1.1161
+-0.063035 -0.17372 -1.1354
+-0.062219 -0.17443 -1.1401
+-0.02361 -0.17499 -1.1438
+-0.021382 -0.1744 -1.1399
+-0.019191 -0.17402 -1.1374
+0.006587 -0.17538 -1.1464
+0.013877 -0.18622 -1.2181
+0.016165 -0.18614 -1.2176
+0.023033 -0.18605 -1.2169
+0.025339 -0.18615 -1.2176
+0.026487 -0.18616 -1.2176
+0.027636 -0.18618 -1.2178
+0.028784 -0.18619 -1.2178
+0.029936 -0.18621 -1.218
+0.031097 -0.1863 -1.2185
+0.053442 -0.1882 -1.2311
+0.054621 -0.18827 -1.2316
+0.055784 -0.18828 -1.2316
+0.058142 -0.1884 -1.2324
+0.060444 -0.18835 -1.2321
+0.062529 -0.18764 -1.2274
+0.064928 -0.18789 -1.229
+0.076428 -0.18771 -1.2278
+0.077521 -0.18756 -1.2268
+0.078663 -0.18752 -1.2266
+0.079804 -0.18749 -1.2264
+0.080838 -0.18721 -1.2245
+0.083028 -0.18695 -1.2228
+0.085258 -0.18679 -1.2217
+0.089793 -0.18665 -1.2208
+0.090917 -0.18659 -1.2204
+0.091984 -0.18643 -1.2193
+0.093118 -0.1864 -1.2191
+0.094262 -0.18639 -1.2191
+0.095275 -0.18613 -1.2173
+0.096246 -0.18579 -1.2151
+0.098358 -0.18545 -1.2129
+0.14991 -0.18147 -1.1864
+0.16147 -0.1819 -1.1892
+0.16361 -0.1818 -1.1885
+0.18804 -0.18378 -1.2016
+0.18917 -0.18378 -1.2016
+0.19045 -0.18392 -1.2025
+0.19347 -0.18464 -1.2073
+0.19495 -0.18497 -1.2094
+0.19615 -0.18502 -1.2098
+0.19842 -0.18501 -1.2097
+0.20971 -0.18492 -1.2091
+0.21085 -0.18493 -1.2091
+0.21241 -0.18529 -1.2115
+0.21512 -0.18566 -1.2139
+0.21654 -0.1859 -1.2155
+0.21883 -0.18687 -1.222
+0.22231 -0.18787 -1.2286
+0.22371 -0.18807 -1.2299
+0.2249 -0.1881 -1.2301
+0.36746 -0.18753 -1.2267
+0.36832 -0.18737 -1.2258
+0.36958 -0.18743 -1.2261
+-0.37034 -0.18968 -1.2333
+-0.36944 -0.18981 -1.2342
+-0.36828 -0.18981 -1.2342
+-0.36615 -0.18992 -1.2348
+-0.36404 -0.19003 -1.2356
+-0.35974 -0.19022 -1.2368
+-0.35503 -0.19019 -1.2365
+-0.35051 -0.19026 -1.237
+-0.3459 -0.19029 -1.2371
+-0.34112 -0.19022 -1.2366
+-0.33637 -0.19017 -1.2363
+-0.33149 -0.19004 -1.2354
+-0.32686 -0.19006 -1.2355
+-0.32207 -0.18998 -1.2349
+-0.31756 -0.19006 -1.2355
+-0.31299 -0.19011 -1.2358
+-0.30849 -0.19021 -1.2364
+-0.30371 -0.19013 -1.2359
+-0.29903 -0.19012 -1.2358
+-0.29439 -0.19013 -1.2358
+-0.28973 -0.19013 -1.2358
+-0.28499 -0.19007 -1.2354
+-0.28048 -0.19017 -1.2361
+-0.27563 -0.19003 -1.2352
+-0.27097 -0.19003 -1.2352
+-0.26617 -0.18993 -1.2345
+-0.26108 -0.18961 -1.2323
+-0.25839 -0.18934 -1.2306
+-0.2485 -0.188 -1.2218
+-0.2472 -0.18788 -1.221
+-0.2446 -0.18765 -1.2195
+-0.23975 -0.18746 -1.2182
+-0.23524 -0.18752 -1.2186
+-0.23099 -0.1878 -1.2205
+-0.22669 -0.18804 -1.2221
+-0.22253 -0.18842 -1.2246
+-0.21834 -0.18879 -1.227
+-0.21409 -0.18912 -1.2292
+-0.20979 -0.18942 -1.2311
+-0.20542 -0.18966 -1.2328
+-0.20088 -0.18977 -1.2335
+-0.19627 -0.1898 -1.2337
+-0.19172 -0.18989 -1.2343
+-0.18707 -0.18989 -1.2343
+-0.18244 -0.18992 -1.2345
+-0.17773 -0.18985 -1.2341
+-0.17306 -0.18983 -1.2339
+-0.16838 -0.18979 -1.2337
+-0.16375 -0.18982 -1.2339
+-0.15906 -0.18977 -1.2336
+-0.15438 -0.18973 -1.2334
+-0.14968 -0.18967 -1.2329
+-0.14501 -0.18962 -1.2326
+-0.1403 -0.18954 -1.2321
+-0.13911 -0.1895 -1.2318
+-0.12256 -0.17575 -1.1415
+-0.12119 -0.17533 -1.1387
+-0.11616 -0.17422 -1.1315
+-0.11155 -0.17369 -1.128
+-0.10711 -0.17338 -1.126
+-0.10279 -0.17325 -1.1251
+-0.10171 -0.17322 -1.1249
+-0.10044 -0.17287 -1.1226
+-0.0991 -0.17238 -1.1194
+-0.097921 -0.17216 -1.118
+-0.095658 -0.17188 -1.1161
+-0.093399 -0.1716 -1.1143
+-0.089001 -0.17122 -1.1118
+-0.084623 -0.17085 -1.1094
+-0.080349 -0.17066 -1.1081
+-0.076156 -0.17062 -1.1079
+-0.072041 -0.17077 -1.1089
+-0.067984 -0.17109 -1.111
+-0.066018 -0.17142 -1.1132
+-0.06504 -0.17161 -1.1144
+-0.064124 -0.17197 -1.1168
+-0.063178 -0.17519 -1.138
+-0.061151 -0.17553 -1.1402
+-0.056878 -0.17561 -1.1407
+-0.052579 -0.17561 -1.1408
+-0.048242 -0.17548 -1.1399
+-0.043938 -0.17546 -1.1397
+-0.039662 -0.17555 -1.1403
+-0.035375 -0.17561 -1.1407
+-0.033236 -0.17567 -1.1411
+-0.031097 -0.17574 -1.1416
+-0.028959 -0.17582 -1.1421
+-0.026826 -0.17595 -1.143
+-0.02468 -0.17601 -1.1434
+-0.022464 -0.17554 -1.1403
+-0.020241 -0.1749 -1.1361
+-0.018086 -0.17477 -1.1352
+-0.013787 -0.17453 -1.1337
+-0.009514 -0.17454 -1.1337
+-0.005243 -0.17467 -1.1346
+-0.000967 -0.17497 -1.1365
+0.003328 -0.17552 -1.1402
+0.005491 -0.17597 -1.1431
+0.006579 -0.17624 -1.1449
+0.013849 -0.18699 -1.2155
+0.014992 -0.18697 -1.2154
+0.017273 -0.18687 -1.2148
+0.02184 -0.18679 -1.2143
+0.024127 -0.18679 -1.2143
+0.026423 -0.18686 -1.2147
+0.028708 -0.18684 -1.2145
+0.031017 -0.18696 -1.2154
+0.032178 -0.18706 -1.216
+0.033329 -0.18709 -1.2162
+0.03448 -0.18712 -1.2164
+0.056824 -0.18904 -1.229
+0.059136 -0.18903 -1.2289
+0.060333 -0.18916 -1.2298
+0.061339 -0.18869 -1.2267
+0.063598 -0.18854 -1.2257
+0.065745 -0.18807 -1.2226
+0.079684 -0.18836 -1.2245
+0.081888 -0.18813 -1.223
+0.083029 -0.1881 -1.2228
+0.084142 -0.18801 -1.2222
+0.086344 -0.1878 -1.2208
+0.088623 -0.18776 -1.2205
+0.090896 -0.1877 -1.2201
+0.093097 -0.1875 -1.2188
+0.095311 -0.18734 -1.2178
+0.097487 -0.18712 -1.2163
+0.099592 -0.18677 -1.214
+0.10181 -0.18665 -1.2132
+0.10404 -0.18654 -1.2125
+0.10625 -0.18641 -1.2116
+0.10852 -0.18638 -1.2114
+0.11078 -0.18635 -1.2112
+0.11308 -0.18638 -1.2114
+0.11529 -0.18626 -1.2106
+0.11741 -0.18602 -1.209
+0.12159 -0.18544 -1.2052
+0.12597 -0.1852 -1.2036
+0.13008 -0.1846 -1.1997
+0.13375 -0.18344 -1.192
+0.13608 -0.18355 -1.1927
+0.13826 -0.18346 -1.1921
+0.14025 -0.18312 -1.1899
+0.14255 -0.18319 -1.1904
+0.14682 -0.18292 -1.1886
+0.14885 -0.18267 -1.1869
+0.15101 -0.18257 -1.1863
+0.15555 -0.18266 -1.1868
+0.15776 -0.18263 -1.1866
+0.16027 -0.18294 -1.1887
+0.16255 -0.18298 -1.1889
+0.1647 -0.18288 -1.1882
+0.167 -0.18295 -1.1887
+0.16983 -0.18359 -1.1929
+0.17278 -0.18433 -1.1978
+0.17529 -0.1846 -1.1995
+0.17779 -0.18485 -1.2012
+0.18019 -0.18499 -1.2021
+0.18257 -0.1851 -1.2028
+0.18491 -0.18518 -1.2034
+0.18714 -0.18514 -1.2031
+0.18965 -0.18538 -1.2047
+0.19106 -0.18564 -1.2064
+0.19277 -0.18621 -1.2101
+0.19518 -0.18633 -1.2109
+0.19753 -0.18639 -1.2113
+0.19978 -0.18636 -1.211
+0.20417 -0.1862 -1.21
+0.20859 -0.18608 -1.2092
+0.21129 -0.18645 -1.2116
+0.21419 -0.18699 -1.2152
+0.21763 -0.18798 -1.2217
+0.22068 -0.18862 -1.2259
+0.22325 -0.18884 -1.2273
+0.22561 -0.18888 -1.2276
+0.23015 -0.18881 -1.2271
+0.23478 -0.18882 -1.2272
+0.23928 -0.18872 -1.2265
+0.24391 -0.18872 -1.2265
+0.24852 -0.18872 -1.2265
+0.25308 -0.18867 -1.2262
+0.2576 -0.1886 -1.2257
+0.26222 -0.1886 -1.2257
+0.26679 -0.18857 -1.2255
+0.27139 -0.18855 -1.2254
+0.27603 -0.18857 -1.2256
+0.28062 -0.18855 -1.2254
+0.28525 -0.18856 -1.2255
+0.2899 -0.18857 -1.2256
+0.29451 -0.18857 -1.2256
+0.2993 -0.18868 -1.2263
+0.30377 -0.18859 -1.2257
+0.30829 -0.18853 -1.2253
+0.31268 -0.18839 -1.2245
+0.31734 -0.18842 -1.2247
+0.32202 -0.18845 -1.2249
+0.32669 -0.18849 -1.2252
+0.33133 -0.1885 -1.2253
+0.33592 -0.18848 -1.2252
+0.34037 -0.1884 -1.2247
+0.34491 -0.18836 -1.2244
+0.34958 -0.18838 -1.2246
+0.35419 -0.18838 -1.2247
+0.35886 -0.18842 -1.2249
+0.36345 -0.1884 -1.2249
+0.36569 -0.18837 -1.2247
+0.3677 -0.18821 -1.2237
+0.36899 -0.18829 -1.2242
+-0.36972 -0.19053 -1.2313
+-0.3687 -0.19059 -1.2317
+-0.36762 -0.19063 -1.232
+-0.36646 -0.19063 -1.2319
+-0.36441 -0.19078 -1.2329
+-0.24771 -0.18855 -1.2179
+-0.24515 -0.18834 -1.2165
+-0.13877 -0.19019 -1.2288
+-0.12244 -0.17666 -1.1404
+-0.10148 -0.17389 -1.1224
+-0.09894 -0.17315 -1.1176
+-0.06503 -0.17264 -1.1143
+-0.064207 -0.17325 -1.1183
+-0.063188 -0.17629 -1.1381
+-0.062186 -0.17649 -1.1394
+-0.032149 -0.17668 -1.1407
+-0.031079 -0.17671 -1.1409
+-0.030006 -0.17672 -1.141
+-0.028936 -0.17676 -1.1412
+-0.02787 -0.17682 -1.1416
+-0.0268 -0.17686 -1.1419
+-0.025724 -0.17686 -1.1419
+-0.024637 -0.17678 -1.1414
+-0.023534 -0.17658 -1.14
+0.006574 -0.17719 -1.1441
+0.013823 -0.18779 -1.2133
+0.016102 -0.18771 -1.2128
+0.032076 -0.18761 -1.2121
+0.034386 -0.18776 -1.2131
+0.035536 -0.18779 -1.2133
+0.036686 -0.18783 -1.2136
+0.037855 -0.18796 -1.2144
+0.060093 -0.18956 -1.2248
+0.061247 -0.18956 -1.2248
+0.062431 -0.18965 -1.2254
+0.064617 -0.1893 -1.2231
+0.065689 -0.18907 -1.2216
+0.066578 -0.18833 -1.2167
+0.067673 -0.18818 -1.2158
+0.06887 -0.18833 -1.2167
+0.084119 -0.18912 -1.2219
+0.085175 -0.1889 -1.2205
+0.086314 -0.18888 -1.2203
+0.087435 -0.18882 -1.2199
+0.088579 -0.18881 -1.2199
+0.089691 -0.18873 -1.2194
+0.1008 -0.18804 -1.2148
+0.10195 -0.18805 -1.2149
+0.10309 -0.18804 -1.2148
+0.10422 -0.18801 -1.2146
+0.10533 -0.18794 -1.2142
+0.10751 -0.18776 -1.213
+0.1098 -0.18776 -1.213
+0.11096 -0.18781 -1.2133
+0.11211 -0.18781 -1.2133
+0.11324 -0.18778 -1.2131
+0.11436 -0.18775 -1.2129
+0.11549 -0.18773 -1.2128
+0.1165 -0.18752 -1.2114
+0.13493 -0.18463 -1.1925
+0.13727 -0.18476 -1.1933
+0.14988 -0.18368 -1.1862
+0.16358 -0.184 -1.1882
+0.1794 -0.18648 -1.2044
+0.18059 -0.18654 -1.2048
+0.18173 -0.18654 -1.2048
+0.18406 -0.1866 -1.2052
+0.19159 -0.18731 -1.2098
+0.19288 -0.18745 -1.2108
+0.19405 -0.18748 -1.2109
+0.21031 -0.18774 -1.2126
+0.21165 -0.18791 -1.2137
+0.21318 -0.18826 -1.216
+0.22386 -0.18954 -1.2243
+0.36595 -0.18906 -1.2217
+0.3671 -0.18906 -1.2217
+0.36816 -0.18901 -1.2214
+-0.36922 -0.19142 -1.2296
+-0.36805 -0.19142 -1.2295
+-0.36701 -0.19148 -1.2299
+-0.36476 -0.19152 -1.2301
+-0.36263 -0.19161 -1.2307
+-0.36042 -0.19167 -1.2311
+-0.27211 -0.19153 -1.2298
+-0.26968 -0.19145 -1.2292
+-0.26718 -0.19131 -1.2284
+-0.2647 -0.19119 -1.2276
+-0.26205 -0.19095 -1.226
+-0.24696 -0.18912 -1.2141
+-0.24571 -0.18904 -1.2136
+-0.24333 -0.18896 -1.2131
+-0.24103 -0.18895 -1.213
+-0.142 -0.19103 -1.2267
+-0.13966 -0.19098 -1.2264
+-0.1385 -0.19098 -1.2264
+-0.12223 -0.17742 -1.1384
+-0.12087 -0.177 -1.1357
+-0.11834 -0.17643 -1.132
+-0.10469 -0.17501 -1.1228
+-0.10242 -0.17475 -1.1211
+-0.099973 -0.17417 -1.1173
+-0.097676 -0.17383 -1.1151
+-0.095442 -0.17359 -1.1136
+-0.066025 -0.17354 -1.1133
+-0.065033 -0.1737 -1.1143
+-0.064308 -0.17458 -1.1201
+-0.063874 -0.1763 -1.1312
+-0.06322 -0.17746 -1.1387
+-0.061107 -0.17755 -1.1394
+-0.058982 -0.17762 -1.1398
+-0.054682 -0.17761 -1.1397
+-0.050375 -0.17758 -1.1395
+-0.048225 -0.17757 -1.1395
+-0.046074 -0.17756 -1.1394
+-0.043924 -0.17755 -1.1394
+-0.041779 -0.17756 -1.1394
+-0.039639 -0.1776 -1.1397
+-0.037498 -0.17763 -1.1399
+-0.035349 -0.17763 -1.1399
+-0.033198 -0.17762 -1.1398
+-0.032122 -0.17761 -1.1397
+-0.023447 -0.17699 -1.1358
+-0.022356 -0.17683 -1.1347
+-0.020193 -0.17662 -1.1333
+-0.018051 -0.17657 -1.133
+-0.015901 -0.17641 -1.132
+0.00548 -0.17776 -1.1407
+0.006566 -0.17805 -1.1426
+0.013802 -0.18864 -1.2114
+0.014934 -0.18853 -1.2107
+0.017212 -0.1885 -1.2105
+0.019487 -0.18845 -1.2102
+0.024032 -0.18834 -1.2094
+0.02859 -0.18835 -1.2095
+0.030864 -0.18832 -1.2093
+0.033144 -0.18833 -1.2094
+0.03544 -0.18843 -1.21
+0.037741 -0.18854 -1.2107
+0.038891 -0.18858 -1.211
+0.04004 -0.18862 -1.2113
+0.042353 -0.18876 -1.2122
+0.059964 -0.1903 -1.2221
+0.061092 -0.19023 -1.2217
+0.062262 -0.19029 -1.2221
+0.063412 -0.19029 -1.2221
+0.064403 -0.18982 -1.219
+0.065508 -0.18969 -1.2182
+0.066512 -0.18929 -1.2155
+0.067616 -0.18917 -1.2148
+0.06866 -0.18889 -1.213
+0.069802 -0.1889 -1.213
+0.070877 -0.18871 -1.2118
+0.072073 -0.18886 -1.2127
+0.090767 -0.18973 -1.2184
+0.092881 -0.18936 -1.216
+0.095122 -0.18926 -1.2153
+0.097396 -0.18923 -1.2151
+0.099642 -0.18915 -1.2146
+0.10193 -0.18915 -1.2146
+0.1042 -0.18911 -1.2143
+0.10639 -0.18895 -1.2133
+0.10863 -0.18887 -1.2127
+0.11094 -0.18891 -1.213
+0.11322 -0.1889 -1.2129
+0.11547 -0.18884 -1.2126
+0.11762 -0.18862 -1.2111
+0.11976 -0.1884 -1.2096
+0.12189 -0.18817 -1.2082
+0.12411 -0.18809 -1.2076
+0.12625 -0.18789 -1.2063
+0.12838 -0.18768 -1.2049
+0.13039 -0.1873 -1.2025
+0.13218 -0.18663 -1.1982
+0.13408 -0.18613 -1.1949
+0.13623 -0.186 -1.194
+0.13835 -0.18583 -1.1929
+0.14026 -0.18538 -1.19
+0.14886 -0.18492 -1.187
+0.14988 -0.1848 -1.1862
+0.15098 -0.18477 -1.186
+0.15321 -0.18477 -1.186
+0.15545 -0.18478 -1.1861
+0.15787 -0.18499 -1.1874
+0.16036 -0.18528 -1.1893
+0.16253 -0.1852 -1.1888
+0.16363 -0.18518 -1.1886
+0.16476 -0.18518 -1.1887
+0.16709 -0.18529 -1.1894
+0.16983 -0.18583 -1.1929
+0.17296 -0.18679 -1.1991
+0.17565 -0.18724 -1.202
+0.17822 -0.18757 -1.2042
+0.18063 -0.18771 -1.2051
+0.18316 -0.18798 -1.2068
+0.18551 -0.18806 -1.2073
+0.18772 -0.188 -1.2069
+0.19028 -0.18827 -1.2087
+0.19164 -0.18849 -1.2101
+0.19284 -0.18855 -1.2105
+0.19515 -0.18858 -1.2106
+0.19742 -0.18857 -1.2106
+0.19971 -0.18858 -1.2107
+0.20188 -0.18847 -1.2099
+0.2042 -0.18851 -1.2102
+0.20663 -0.18864 -1.2111
+0.20928 -0.18898 -1.2132
+0.21242 -0.18975 -1.2182
+0.2149 -0.18991 -1.2192
+0.21752 -0.19019 -1.2211
+0.21994 -0.1903 -1.2218
+0.22218 -0.19024 -1.2214
+0.22327 -0.19019 -1.221
+0.22446 -0.19023 -1.2213
+0.22675 -0.19022 -1.2212
+0.3595 -0.18984 -1.2192
+0.36157 -0.18972 -1.2185
+0.36386 -0.18972 -1.2185
+0.36609 -0.18969 -1.2183
+0.3673 -0.18972 -1.2185
+-0.36833 -0.19212 -1.2266
+-0.36737 -0.19222 -1.2272
+-0.36621 -0.19222 -1.2272
+-0.36512 -0.19225 -1.2274
+-0.36301 -0.19236 -1.2281
+-0.26776 -0.19206 -1.2257
+-0.26512 -0.19182 -1.2241
+-0.24869 -0.18984 -1.2114
+-0.24753 -0.18983 -1.2113
+-0.24633 -0.18978 -1.211
+-0.24387 -0.18964 -1.2101
+-0.13816 -0.19167 -1.2233
+-0.12211 -0.17832 -1.1372
+-0.065071 -0.17485 -1.115
+-0.063975 -0.17764 -1.133
+-0.062155 -0.17855 -1.1389
+-0.047131 -0.17857 -1.139
+-0.046057 -0.17857 -1.139
+-0.044984 -0.17857 -1.139
+-0.043903 -0.17854 -1.1388
+-0.042829 -0.17854 -1.1388
+-0.041756 -0.17854 -1.1388
+-0.040685 -0.17855 -1.1389
+-0.024444 -0.17753 -1.1323
+-0.023377 -0.17753 -1.1323
+0.006559 -0.17894 -1.1414
+0.007655 -0.17941 -1.1444
+0.013777 -0.18944 -1.2092
+0.016046 -0.18934 -1.2085
+0.038776 -0.18916 -1.2074
+0.063065 -0.19039 -1.2153
+0.064262 -0.19055 -1.2163
+0.066497 -0.19039 -1.2152
+0.067488 -0.18996 -1.2125
+0.06863 -0.18996 -1.2124
+0.07085 -0.18979 -1.2113
+0.07316 -0.18986 -1.2118
+0.074301 -0.18986 -1.2118
+0.075357 -0.18964 -1.2104
+0.076537 -0.18974 -1.211
+0.090547 -0.19042 -1.2154
+0.091684 -0.1904 -1.2153
+0.092751 -0.19024 -1.2142
+0.093824 -0.1901 -1.2133
+0.095001 -0.19017 -1.2138
+0.096144 -0.19017 -1.2138
+0.098449 -0.1902 -1.214
+0.099592 -0.1902 -1.214
+0.1007 -0.19013 -1.2135
+0.10181 -0.19007 -1.2131
+0.10295 -0.19007 -1.2131
+0.14995 -0.186 -1.1867
+0.15207 -0.18586 -1.1858
+0.15319 -0.18586 -1.1858
+0.15431 -0.18587 -1.1859
+0.15543 -0.18588 -1.1859
+0.15671 -0.18607 -1.1871
+0.15924 -0.18641 -1.1893
+0.16371 -0.18639 -1.1892
+0.16848 -0.18671 -1.1912
+0.1716 -0.18767 -1.1975
+0.1745 -0.18836 -1.2019
+0.18898 -0.18926 -1.2077
+0.19162 -0.18962 -1.21
+0.19392 -0.18963 -1.2101
+0.20069 -0.18957 -1.2096
+0.20189 -0.18963 -1.21
+0.20303 -0.18963 -1.21
+0.20827 -0.19025 -1.214
+0.20973 -0.19054 -1.2159
+0.21099 -0.19063 -1.2165
+0.21237 -0.19085 -1.2179
+0.21355 -0.19088 -1.2181
+0.21482 -0.19099 -1.2188
+0.216 -0.19101 -1.2189
+0.21828 -0.191 -1.2189
+0.22288 -0.191 -1.2189
+0.36206 -0.19052 -1.2163
+0.36315 -0.1905 -1.2161
+0.36429 -0.1905 -1.2161
+0.36528 -0.19041 -1.2156
+0.36653 -0.19047 -1.2159
+-0.36643 -0.19288 -1.2241
+-0.3654 -0.19294 -1.2245
+-0.36334 -0.19308 -1.2253
+-0.36114 -0.19313 -1.2256
+-0.35677 -0.19327 -1.2264
+-0.35206 -0.19322 -1.2261
+-0.34755 -0.19328 -1.2264
+-0.34277 -0.19319 -1.2258
+-0.33808 -0.19315 -1.2255
+-0.33339 -0.1931 -1.2252
+-0.32859 -0.193 -1.2245
+-0.32399 -0.19301 -1.2245
+-0.31942 -0.19303 -1.2247
+-0.31488 -0.19308 -1.225
+-0.31042 -0.19317 -1.2255
+-0.30562 -0.19306 -1.2248
+-0.30114 -0.19314 -1.2253
+-0.29643 -0.19308 -1.2249
+-0.29168 -0.193 -1.2244
+-0.28718 -0.19307 -1.2248
+-0.28253 -0.19305 -1.2246
+-0.27787 -0.19301 -1.2244
+-0.27331 -0.19305 -1.2247
+-0.27079 -0.1929 -1.2237
+-0.26827 -0.19275 -1.2227
+-0.26706 -0.19271 -1.2225
+-0.26568 -0.19254 -1.2214
+-0.2493 -0.19057 -1.2087
+-0.24691 -0.19048 -1.2082
+-0.24457 -0.19044 -1.2079
+-0.24235 -0.19048 -1.2082
+-0.23791 -0.19058 -1.2088
+-0.23376 -0.19091 -1.2109
+-0.22962 -0.19126 -1.2131
+-0.22549 -0.19163 -1.2156
+-0.22123 -0.19191 -1.2173
+-0.2171 -0.19231 -1.2199
+-0.2127 -0.1925 -1.2211
+-0.20827 -0.19266 -1.2221
+-0.20377 -0.19275 -1.2227
+-0.1992 -0.19279 -1.223
+-0.19463 -0.19282 -1.2232
+-0.19001 -0.19281 -1.2232
+-0.18541 -0.19282 -1.2233
+-0.18075 -0.19278 -1.223
+-0.17615 -0.19278 -1.223
+-0.17158 -0.19283 -1.2233
+-0.16692 -0.19276 -1.2229
+-0.16229 -0.19274 -1.2228
+-0.15765 -0.1927 -1.2225
+-0.15298 -0.19261 -1.222
+-0.14835 -0.19259 -1.2218
+-0.14368 -0.1925 -1.2213
+-0.13904 -0.19244 -1.2209
+-0.13789 -0.19245 -1.221
+-0.12198 -0.1792 -1.136
+-0.12058 -0.17872 -1.1329
+-0.11567 -0.17774 -1.1266
+-0.11107 -0.17717 -1.123
+-0.10665 -0.17686 -1.1211
+-0.10443 -0.17669 -1.1199
+-0.10204 -0.1762 -1.1168
+-0.097446 -0.17552 -1.1125
+-0.093065 -0.17517 -1.1102
+-0.088742 -0.17491 -1.1085
+-0.084435 -0.17464 -1.1069
+-0.080242 -0.1746 -1.1066
+-0.076082 -0.17464 -1.1068
+-0.072008 -0.17488 -1.1084
+-0.067977 -0.17526 -1.1109
+-0.066027 -0.17565 -1.1133
+-0.065068 -0.1759 -1.1149
+-0.064145 -0.17919 -1.1361
+-0.063199 -0.17954 -1.1383
+-0.061063 -0.17957 -1.1385
+-0.05679 -0.17963 -1.1389
+-0.05464 -0.17962 -1.1389
+-0.052487 -0.1796 -1.1387
+-0.050334 -0.17958 -1.1386
+-0.048169 -0.17951 -1.1381
+-0.024371 -0.17807 -1.1289
+-0.022268 -0.17827 -1.1302
+-0.017997 -0.17817 -1.1296
+-0.013729 -0.17805 -1.1288
+-0.009473 -0.17805 -1.1288
+-0.005224 -0.17828 -1.1303
+-0.000964 -0.17864 -1.1326
+0.003316 -0.17919 -1.1361
+0.005471 -0.17963 -1.1389
+0.007643 -0.18022 -1.1427
+0.013759 -0.19032 -1.2075
+0.014888 -0.19022 -1.2068
+0.017154 -0.19014 -1.2064
+0.02168 -0.18997 -1.2052
+0.02621 -0.18989 -1.2048
+0.030743 -0.18985 -1.2045
+0.035272 -0.18981 -1.2042
+0.037551 -0.18986 -1.2045
+0.03983 -0.1899 -1.2048
+0.044397 -0.19002 -1.2056
+0.048996 -0.19024 -1.207
+0.050145 -0.19029 -1.2073
+0.061797 -0.19116 -1.2128
+0.06294 -0.19116 -1.2128
+0.065209 -0.19111 -1.2125
+0.067493 -0.19111 -1.2125
+0.068636 -0.19112 -1.2126
+0.069629 -0.19071 -1.2099
+0.071962 -0.19085 -1.2108
+0.074291 -0.19097 -1.2116
+0.075435 -0.19098 -1.2117
+0.07652 -0.19084 -1.2108
+0.077604 -0.1907 -1.2099
+0.078744 -0.1907 -1.2099
+0.079832 -0.19058 -1.2091
+0.093568 -0.19072 -1.21
+0.094708 -0.19072 -1.21
+0.097102 -0.19095 -1.2114
+0.09832 -0.19109 -1.2124
+0.1029 -0.19112 -1.2125
+0.10403 -0.19109 -1.2124
+0.10848 -0.19089 -1.211
+0.11313 -0.19104 -1.212
+0.11756 -0.19082 -1.2106
+0.11975 -0.19066 -1.2095
+0.12187 -0.19042 -1.208
+0.12632 -0.19026 -1.2069
+0.13046 -0.18967 -1.2031
+0.13435 -0.18878 -1.1974
+0.13849 -0.18826 -1.1941
+0.14039 -0.18779 -1.1911
+0.14258 -0.18773 -1.1907
+0.14676 -0.18733 -1.1881
+0.14895 -0.18727 -1.1877
+0.1511 -0.18716 -1.187
+0.15332 -0.18715 -1.1869
+0.15444 -0.18715 -1.1869
+0.15572 -0.18733 -1.1881
+0.15823 -0.18766 -1.1902
+0.16044 -0.18762 -1.1899
+0.16271 -0.18765 -1.1901
+0.16502 -0.18773 -1.1906
+0.16732 -0.18779 -1.191
+0.16864 -0.18801 -1.1924
+0.17028 -0.18859 -1.1961
+0.172 -0.18924 -1.2003
+0.17338 -0.18951 -1.202
+0.17584 -0.18971 -1.2033
+0.18063 -0.18998 -1.2051
+0.18303 -0.19013 -1.2059
+0.18546 -0.19028 -1.2069
+0.18773 -0.19028 -1.2069
+0.18889 -0.1903 -1.2071
+0.19023 -0.19051 -1.2084
+0.19149 -0.19062 -1.2091
+0.19272 -0.19072 -1.2097
+0.19504 -0.19076 -1.21
+0.19973 -0.19088 -1.2108
+0.20191 -0.19079 -1.2102
+0.20435 -0.19093 -1.2111
+0.20712 -0.19138 -1.214
+0.20969 -0.19164 -1.2156
+0.21199 -0.19165 -1.2157
+0.21434 -0.19171 -1.216
+0.2167 -0.19176 -1.2164
+0.21901 -0.19178 -1.2165
+0.2213 -0.19178 -1.2165
+0.22354 -0.19173 -1.2162
+0.22799 -0.19162 -1.2155
+0.23264 -0.19168 -1.2159
+0.23717 -0.19164 -1.2156
+0.24177 -0.19165 -1.2157
+0.24637 -0.19167 -1.2158
+0.251 -0.19171 -1.216
+0.25547 -0.19162 -1.2154
+0.25991 -0.19152 -1.2148
+0.26447 -0.1915 -1.2147
+0.26897 -0.19145 -1.2144
+0.27359 -0.19148 -1.2146
+0.2782 -0.1915 -1.2147
+0.28271 -0.19146 -1.2145
+0.28741 -0.19154 -1.215
+0.29188 -0.19147 -1.2145
+0.29652 -0.19151 -1.2148
+0.30094 -0.19141 -1.2142
+0.30544 -0.19136 -1.2139
+0.30999 -0.19134 -1.2138
+0.31476 -0.19146 -1.2146
+0.3193 -0.19144 -1.2145
+0.32386 -0.19143 -1.2144
+0.32843 -0.19143 -1.2145
+0.3329 -0.19137 -1.2141
+0.3375 -0.19138 -1.2142
+0.34192 -0.1913 -1.2137
+0.34655 -0.19133 -1.2139
+0.35119 -0.19136 -1.2142
+0.35572 -0.19134 -1.2141
+0.36034 -0.19136 -1.2143
+0.36253 -0.19132 -1.214
+0.365 -0.19141 -1.2146
+0.36614 -0.19141 -1.2146
+-0.36568 -0.19364 -1.2215
+-0.36366 -0.19379 -1.2225
+-0.36155 -0.19389 -1.2231
+-0.27129 -0.19359 -1.2208
+-0.27007 -0.19354 -1.2204
+-0.26876 -0.19342 -1.2197
+-0.2675 -0.19335 -1.2192
+-0.25104 -0.1913 -1.2061
+-0.24988 -0.19129 -1.206
+-0.24747 -0.19118 -1.2054
+-0.13761 -0.1932 -1.2184
+-0.12186 -0.18009 -1.1348
+-0.065168 -0.17722 -1.1166
+-0.064207 -0.18044 -1.1372
+-0.062113 -0.18058 -1.1381
+-0.055654 -0.18051 -1.1376
+-0.054582 -0.18051 -1.1376
+-0.053508 -0.1805 -1.1376
+-0.052401 -0.18038 -1.1368
+-0.051293 -0.18025 -1.136
+-0.049082 -0.18 -1.1344
+-0.029651 -0.17888 -1.1273
+-0.028588 -0.17888 -1.1273
+-0.027525 -0.17888 -1.1273
+-0.026494 -0.17909 -1.1287
+-0.025425 -0.17906 -1.1284
+-0.023302 -0.17909 -1.1286
+0.013733 -0.1911 -1.2052
+0.015993 -0.19098 -1.2045
+0.049995 -0.19085 -1.2036
+0.051135 -0.19088 -1.2038
+0.052301 -0.191 -1.2045
+0.053447 -0.19104 -1.2048
+0.054634 -0.19122 -1.2059
+0.055787 -0.19128 -1.2063
+0.06162 -0.19175 -1.2093
+0.063966 -0.19195 -1.2106
+0.065107 -0.19195 -1.2106
+0.066285 -0.19206 -1.2113
+0.06728 -0.19165 -1.2087
+0.068503 -0.19189 -1.2102
+0.069614 -0.1918 -1.2096
+0.070819 -0.19198 -1.2108
+0.075441 -0.19214 -1.2118
+0.077734 -0.19216 -1.2119
+0.079966 -0.19204 -1.2111
+0.080775 -0.19126 -1.2061
+0.081878 -0.19118 -1.2056
+0.082973 -0.19108 -1.205
+0.084209 -0.19131 -1.2065
+0.08526 -0.19112 -1.2053
+0.086483 -0.19131 -1.2065
+0.087488 -0.19103 -1.2047
+0.088711 -0.19122 -1.2059
+0.089847 -0.19122 -1.2059
+0.090983 -0.19122 -1.2059
+0.092005 -0.19098 -1.2044
+0.09314 -0.19098 -1.2044
+0.095583 -0.19133 -1.2066
+0.096756 -0.1914 -1.207
+0.11857 -0.19175 -1.2092
+0.1207 -0.19151 -1.2077
+0.14148 -0.18887 -1.1908
+0.1547 -0.18858 -1.1889
+0.16889 -0.18942 -1.1942
+0.17221 -0.1906 -1.2017
+0.17466 -0.19081 -1.203
+0.18179 -0.19115 -1.2052
+0.18298 -0.19121 -1.2056
+0.18413 -0.19122 -1.2057
+0.1854 -0.19136 -1.2066
+0.18655 -0.19137 -1.2066
+0.18885 -0.1914 -1.2068
+0.19005 -0.19146 -1.2072
+0.20554 -0.19212 -1.2114
+0.20707 -0.19248 -1.2137
+0.20822 -0.19248 -1.2137
+0.36287 -0.19203 -1.2113
+0.36389 -0.19197 -1.2109
+0.36524 -0.19208 -1.2116
+-0.36291 -0.19454 -1.2199
+-0.36184 -0.19458 -1.2202
+-0.35964 -0.19463 -1.2205
+-0.35742 -0.19468 -1.2208
+-0.32477 -0.1944 -1.2188
+-0.27897 -0.19448 -1.2191
+-0.27673 -0.19453 -1.2194
+-0.27433 -0.19445 -1.2189
+-0.27175 -0.19425 -1.2176
+-0.27054 -0.19421 -1.2173
+-0.25277 -0.19203 -1.2035
+-0.2516 -0.19201 -1.2034
+-0.25043 -0.19197 -1.2032
+-0.24809 -0.19192 -1.2028
+-0.24578 -0.19188 -1.2026
+-0.24365 -0.19199 -1.2033
+-0.14087 -0.19409 -1.2168
+-0.13855 -0.19405 -1.2165
+-0.1374 -0.19405 -1.2165
+-0.12176 -0.18102 -1.134
+-0.12034 -0.18049 -1.1306
+-0.11778 -0.17984 -1.1265
+-0.10412 -0.17827 -1.1165
+-0.066052 -0.17782 -1.1138
+-0.065229 -0.17844 -1.1177
+-0.064837 -0.18028 -1.1294
+-0.0641 -0.1812 -1.1352
+-0.063135 -0.18151 -1.1372
+-0.06101 -0.18156 -1.1375
+-0.058836 -0.18147 -1.1369
+-0.056642 -0.18131 -1.1359
+-0.054409 -0.18101 -1.134
+-0.051111 -0.18068 -1.1319
+-0.049999 -0.18052 -1.1309
+-0.047853 -0.18046 -1.1306
+-0.038128 -0.17984 -1.1266
+-0.037061 -0.17981 -1.1264
+-0.034931 -0.17977 -1.1262
+-0.033792 -0.17937 -1.1236
+-0.032741 -0.17941 -1.1239
+-0.030709 -0.17992 -1.1271
+-0.028583 -0.17991 -1.1271
+-0.026465 -0.17997 -1.1274
+-0.024337 -0.17994 -1.1273
+-0.022205 -0.17989 -1.1269
+-0.020077 -0.17986 -1.1267
+0.005463 -0.18148 -1.137
+0.013712 -0.19194 -1.2033
+0.014838 -0.19185 -1.2027
+0.017097 -0.19177 -1.2022
+0.019352 -0.19167 -1.2016
+0.03738 -0.19125 -1.199
+0.046455 -0.19142 -1.2
+0.048714 -0.19141 -1.2
+0.051007 -0.19153 -1.2007
+0.053299 -0.19164 -1.2014
+0.055605 -0.19179 -1.2023
+0.056773 -0.19191 -1.2031
+0.061421 -0.19227 -1.2054
+0.062586 -0.19236 -1.2059
+0.064921 -0.19254 -1.2071
+0.067215 -0.1926 -1.2075
+0.069456 -0.19251 -1.2069
+0.070756 -0.19295 -1.2097
+0.071896 -0.19295 -1.2097
+0.074262 -0.19318 -1.2111
+0.076565 -0.19324 -1.2115
+0.078807 -0.19314 -1.2109
+0.080976 -0.19287 -1.2092
+0.081819 -0.19218 -1.2047
+0.082954 -0.19218 -1.2047
+0.084427 -0.19295 -1.2096
+0.085349 -0.19246 -1.2065
+0.086472 -0.19243 -1.2063
+0.087348 -0.19186 -1.2027
+0.089547 -0.19171 -1.2018
+0.091783 -0.19165 -1.2014
+0.093061 -0.19195 -1.2033
+0.094123 -0.19181 -1.2024
+0.09635 -0.19173 -1.2019
+0.097483 -0.19173 -1.2019
+0.10206 -0.19183 -1.2025
+0.11937 -0.19234 -1.2057
+0.12171 -0.19245 -1.2064
+0.12399 -0.19246 -1.2065
+0.12617 -0.19232 -1.2056
+0.12841 -0.19227 -1.2052
+0.13043 -0.1919 -1.2029
+0.1324 -0.19147 -1.2001
+0.14055 -0.19025 -1.1924
+0.14155 -0.19009 -1.1914
+0.14258 -0.18997 -1.1906
+0.14477 -0.1899 -1.1902
+0.14917 -0.18979 -1.1895
+0.15373 -0.18989 -1.1901
+0.15605 -0.18998 -1.1906
+0.15837 -0.19007 -1.1912
+0.16065 -0.19012 -1.1915
+0.16298 -0.19021 -1.1921
+0.16773 -0.1905 -1.1939
+0.17077 -0.19139 -1.1996
+0.17347 -0.19187 -1.2026
+0.17582 -0.19197 -1.2032
+0.17816 -0.19204 -1.2037
+0.18049 -0.19211 -1.2041
+0.18749 -0.19231 -1.2054
+0.18951 -0.19205 -1.2037
+0.20312 -0.19206 -1.2037
+0.20619 -0.1928 -1.2084
+0.20756 -0.19302 -1.2099
+0.2087 -0.19302 -1.2099
+0.21102 -0.19306 -1.2101
+0.21568 -0.19315 -1.2106
+0.22019 -0.1931 -1.2103
+0.34285 -0.19282 -1.2089
+0.35638 -0.19275 -1.2086
+0.35858 -0.19271 -1.2083
+0.36096 -0.19277 -1.2087
+0.3633 -0.1928 -1.2089
+0.36415 -0.19264 -1.208
+-0.36101 -0.19528 -1.2174
+-0.35999 -0.19535 -1.2178
+-0.2748 -0.19512 -1.2159
+-0.27358 -0.19507 -1.2155
+-0.27242 -0.19505 -1.2155
+-0.25091 -0.1926 -1.2
+-0.13713 -0.19481 -1.2141
+-0.12157 -0.18181 -1.1322
+-0.065289 -0.17966 -1.1187
+-0.064824 -0.18131 -1.1291
+-0.063909 -0.18173 -1.1318
+-0.061947 -0.18224 -1.135
+-0.055317 -0.18155 -1.1306
+-0.054185 -0.18132 -1.1292
+-0.053089 -0.18122 -1.1286
+-0.051994 -0.18111 -1.1279
+-0.050916 -0.18106 -1.1276
+-0.049848 -0.18104 -1.1274
+-0.048784 -0.18103 -1.1274
+-0.047708 -0.18098 -1.1271
+-0.046625 -0.1809 -1.1266
+-0.045546 -0.18084 -1.1262
+-0.044471 -0.18078 -1.1258
+-0.043414 -0.1808 -1.1259
+-0.042348 -0.18078 -1.1258
+-0.041291 -0.1808 -1.1259
+-0.040229 -0.18079 -1.1259
+-0.039198 -0.18093 -1.1268
+-0.038121 -0.18086 -1.1264
+-0.035993 -0.18084 -1.1262
+-0.033844 -0.1807 -1.1254
+-0.03173 -0.18075 -1.1256
+0.013685 -0.1927 -1.201
+0.015942 -0.19264 -1.2006
+0.0566 -0.19245 -1.1994
+0.057751 -0.19252 -1.1998
+0.058897 -0.19258 -1.2001
+0.06006 -0.19268 -1.2008
+0.061221 -0.19277 -1.2014
+0.070487 -0.19336 -1.205
+0.081985 -0.1937 -1.2072
+0.083122 -0.1937 -1.2072
+0.084407 -0.19404 -1.2093
+0.085373 -0.19365 -1.2069
+0.086466 -0.19355 -1.2062
+0.087589 -0.19352 -1.2061
+0.088725 -0.19352 -1.2061
+0.089527 -0.1928 -1.2015
+0.090659 -0.1928 -1.2015
+0.091762 -0.19274 -1.2011
+0.093051 -0.19307 -1.2032
+0.097402 -0.19271 -1.2009
+0.098443 -0.19253 -1.1998
+0.099517 -0.19242 -1.1991
+0.10062 -0.19237 -1.1988
+0.10175 -0.19237 -1.1988
+0.10281 -0.19224 -1.198
+0.10393 -0.19222 -1.1978
+0.10503 -0.19218 -1.1976
+0.12719 -0.19327 -1.2044
+0.12937 -0.19314 -1.2036
+0.14166 -0.19136 -1.1923
+0.17456 -0.19296 -1.2024
+0.17575 -0.19303 -1.2027
+0.17689 -0.19303 -1.2027
+0.17796 -0.19297 -1.2024
+0.17879 -0.19264 -1.2003
+0.20266 -0.19275 -1.201
+0.20421 -0.19315 -1.2035
+0.20676 -0.19341 -1.2051
+0.35899 -0.19346 -1.2059
+0.36347 -0.19342 -1.2057
+-0.36012 -0.19595 -1.2143
+-0.35809 -0.19608 -1.2152
+-0.35355 -0.19611 -1.2153
+-0.34895 -0.19609 -1.2151
+-0.34445 -0.19614 -1.2154
+-0.33987 -0.19614 -1.2154
+-0.33511 -0.19603 -1.2147
+-0.33035 -0.19592 -1.214
+-0.32581 -0.19595 -1.2141
+-0.32347 -0.19591 -1.2138
+-0.32122 -0.19593 -1.214
+-0.31677 -0.19601 -1.2144
+-0.3122 -0.19601 -1.2144
+-0.30767 -0.19604 -1.2146
+-0.30307 -0.19603 -1.2145
+-0.29846 -0.19601 -1.2143
+-0.29396 -0.19606 -1.2146
+-0.28935 -0.19603 -1.2144
+-0.28469 -0.19598 -1.2141
+-0.28007 -0.19594 -1.2139
+-0.27769 -0.19588 -1.2135
+-0.27521 -0.19574 -1.2126
+-0.27407 -0.19574 -1.2126
+-0.25627 -0.19352 -1.1986
+-0.25385 -0.1934 -1.1979
+-0.25153 -0.19334 -1.1976
+-0.24925 -0.19333 -1.1975
+-0.24492 -0.19347 -1.1984
+-0.24067 -0.19369 -1.1997
+-0.23658 -0.19404 -1.2019
+-0.23252 -0.19444 -1.2044
+-0.22832 -0.19473 -1.2062
+-0.22422 -0.19511 -1.2086
+-0.21986 -0.19529 -1.2097
+-0.21555 -0.19551 -1.2111
+-0.21116 -0.19567 -1.2121
+-0.20661 -0.19569 -1.2123
+-0.20209 -0.19574 -1.2126
+-0.19753 -0.19574 -1.2126
+-0.19297 -0.19575 -1.2127
+-0.18833 -0.19569 -1.2123
+-0.18377 -0.19569 -1.2123
+-0.17919 -0.19568 -1.2123
+-0.17461 -0.19567 -1.2122
+-0.17002 -0.19564 -1.212
+-0.16546 -0.19565 -1.2121
+-0.16091 -0.19567 -1.2123
+-0.15631 -0.19562 -1.2119
+-0.15168 -0.19555 -1.2115
+-0.14708 -0.19551 -1.2112
+-0.14257 -0.19558 -1.2117
+-0.13796 -0.19551 -1.2113
+-0.13681 -0.19551 -1.2113
+-0.12145 -0.18269 -1.131
+-0.12012 -0.18229 -1.1285
+-0.11522 -0.18127 -1.1221
+-0.11063 -0.18069 -1.1185
+-0.10615 -0.18026 -1.1158
+-0.10152 -0.1795 -1.111
+-0.097105 -0.17909 -1.1085
+-0.092777 -0.17881 -1.1067
+-0.08851 -0.17862 -1.1056
+-0.08431 -0.17856 -1.1052
+-0.080148 -0.17857 -1.1053
+-0.076026 -0.17868 -1.106
+-0.07197 -0.17897 -1.1078
+-0.06802 -0.17957 -1.1116
+-0.066127 -0.18012 -1.115
+-0.06535 -0.18088 -1.1198
+-0.064689 -0.18199 -1.1267
+-0.063832 -0.18258 -1.1304
+-0.06283 -0.18277 -1.1316
+-0.060681 -0.18272 -1.1313
+-0.058433 -0.18236 -1.129
+-0.056287 -0.1823 -1.1287
+-0.054089 -0.18206 -1.1272
+-0.051951 -0.18202 -1.1269
+-0.049837 -0.18206 -1.1272
+-0.047699 -0.18201 -1.1269
+-0.045551 -0.18192 -1.1263
+-0.043412 -0.18185 -1.1259
+-0.041283 -0.18182 -1.1257
+-0.03916 -0.18182 -1.1257
+-0.037025 -0.18176 -1.1253
+-0.034903 -0.18175 -1.1253
+-0.032776 -0.18173 -1.1251
+-0.030654 -0.18172 -1.1251
+-0.026397 -0.18162 -1.1245
+-0.022147 -0.18154 -1.1239
+-0.017904 -0.18149 -1.1236
+-0.013675 -0.1816 -1.1243
+-0.009439 -0.18165 -1.1247
+-0.005205 -0.18189 -1.1262
+-0.000961 -0.18232 -1.1288
+0.003306 -0.18289 -1.1324
+0.007618 -0.18391 -1.1388
+0.013675 -0.1937 -1.2001
+0.014797 -0.19358 -1.1994
+0.01704 -0.19339 -1.1982
+0.021528 -0.19316 -1.1967
+0.026018 -0.19301 -1.1958
+0.030497 -0.19284 -1.1947
+0.034982 -0.19275 -1.1942
+0.039479 -0.19273 -1.1941
+0.043985 -0.19276 -1.1942
+0.048494 -0.1928 -1.1945
+0.05302 -0.19289 -1.195
+0.055293 -0.19296 -1.1955
+0.057581 -0.19308 -1.1962
+0.059873 -0.19321 -1.197
+0.062174 -0.19335 -1.1979
+0.066812 -0.19371 -1.2001
+0.069148 -0.19392 -1.2014
+0.071461 -0.19406 -1.2023
+0.073828 -0.19432 -1.204
+0.076096 -0.19432 -1.204
+0.078498 -0.19465 -1.206
+0.080802 -0.19473 -1.2065
+0.08308 -0.19474 -1.2066
+0.084217 -0.19474 -1.2066
+0.08519 -0.19437 -1.2042
+0.087467 -0.19439 -1.2044
+0.089766 -0.19445 -1.2048
+0.092058 -0.1945 -1.205
+0.094328 -0.1945 -1.205
+0.096416 -0.19413 -1.2027
+0.09755 -0.19413 -1.2027
+0.098421 -0.19362 -1.1995
+0.1006 -0.19345 -1.1985
+0.10279 -0.19333 -1.1977
+0.10501 -0.19327 -1.1973
+0.10608 -0.19316 -1.1966
+0.10715 -0.19306 -1.196
+0.10934 -0.19294 -1.1953
+0.11149 -0.19277 -1.1941
+0.11374 -0.19276 -1.1941
+0.1184 -0.19303 -1.1958
+0.12075 -0.19319 -1.1968
+0.12679 -0.1938 -1.2006
+0.1282 -0.19423 -1.2032
+0.13036 -0.19406 -1.2022
+0.13239 -0.19372 -1.2001
+0.13444 -0.19341 -1.1981
+0.13863 -0.19297 -1.1953
+0.14074 -0.19276 -1.1941
+0.14278 -0.19248 -1.1923
+0.14712 -0.19228 -1.191
+0.15163 -0.19231 -1.1912
+0.15614 -0.19233 -1.1913
+0.16079 -0.19253 -1.1925
+0.16548 -0.19276 -1.194
+0.16798 -0.19304 -1.1957
+0.1708 -0.19368 -1.1998
+0.17332 -0.19398 -1.2016
+0.17537 -0.19373 -1.2001
+0.17733 -0.19341 -1.198
+0.17895 -0.19272 -1.1937
+0.18584 -0.19287 -1.1946
+0.18809 -0.19287 -1.1946
+0.19034 -0.19287 -1.1946
+0.1929 -0.19318 -1.1965
+0.19363 -0.19278 -1.1941
+0.19474 -0.19277 -1.194
+0.19702 -0.19279 -1.1941
+0.19965 -0.19316 -1.1964
+0.20098 -0.19336 -1.1976
+0.20231 -0.19355 -1.1989
+0.2053 -0.19424 -1.2032
+0.20779 -0.19445 -1.2045
+0.21242 -0.19453 -1.205
+0.21693 -0.19451 -1.2048
+0.22147 -0.1945 -1.2048
+0.226 -0.19449 -1.2047
+0.23062 -0.19456 -1.2052
+0.23512 -0.19453 -1.205
+0.23967 -0.19453 -1.205
+0.2442 -0.19452 -1.2049
+0.2487 -0.1945 -1.2048
+0.2532 -0.19446 -1.2046
+0.25774 -0.19446 -1.2046
+0.26213 -0.19435 -1.2039
+0.26678 -0.19443 -1.2044
+0.27122 -0.19437 -1.204
+0.2757 -0.19432 -1.2037
+0.28032 -0.19438 -1.2041
+0.28488 -0.1944 -1.2042
+0.28934 -0.19434 -1.2039
+0.29375 -0.19426 -1.2034
+0.29825 -0.19423 -1.2032
+0.3028 -0.19425 -1.2033
+0.3074 -0.19428 -1.2036
+0.3119 -0.19426 -1.2035
+0.31641 -0.19425 -1.2034
+0.3209 -0.19422 -1.2032
+0.32527 -0.19412 -1.2027
+0.33005 -0.19427 -1.2036
+0.3346 -0.19428 -1.2037
+0.33899 -0.19419 -1.2032
+0.34147 -0.19432 -1.204
+0.34341 -0.19413 -1.2029
+0.34808 -0.19421 -1.2034
+0.35251 -0.19415 -1.2031
+0.357 -0.19412 -1.2029
+0.35814 -0.19413 -1.203
+0.36238 -0.19397 -1.202
+-0.35829 -0.19671 -1.212
+-0.3216 -0.19661 -1.2111
+-0.27816 -0.19655 -1.2105
+-0.27576 -0.19647 -1.21
+-0.25557 -0.19412 -1.1953
+-0.2543 -0.19401 -1.1946
+-0.13654 -0.19625 -1.2088
+-0.12129 -0.18352 -1.1295
+-0.067035 -0.18079 -1.1126
+-0.066165 -0.18128 -1.1157
+-0.065485 -0.18231 -1.1221
+-0.063789 -0.18352 -1.1296
+-0.061652 -0.1835 -1.1295
+-0.06053 -0.18333 -1.1284
+-0.05943 -0.18321 -1.1277
+-0.057268 -0.1831 -1.127
+0.01365 -0.19446 -1.1978
+0.015898 -0.19436 -1.1972
+0.083993 -0.19536 -1.2033
+0.086146 -0.1951 -1.2017
+0.087442 -0.19547 -1.204
+0.088581 -0.19548 -1.2041
+0.089745 -0.19554 -1.2045
+0.09089 -0.19556 -1.2046
+0.092037 -0.19559 -1.2048
+0.093179 -0.19561 -1.2049
+0.094307 -0.19559 -1.2048
+0.095331 -0.19536 -1.2033
+0.097598 -0.19536 -1.2033
+0.098671 -0.19524 -1.2026
+0.099767 -0.19517 -1.2021
+0.10074 -0.19486 -1.2002
+0.10187 -0.19486 -1.2002
+0.10405 -0.19472 -1.1993
+0.10527 -0.19489 -1.2003
+0.10631 -0.19472 -1.1993
+0.10825 -0.19414 -1.1957
+0.10928 -0.19397 -1.1946
+0.11034 -0.19385 -1.1939
+0.11477 -0.19373 -1.1932
+0.11591 -0.19376 -1.1933
+0.11707 -0.19382 -1.1937
+0.11934 -0.19385 -1.1939
+0.12033 -0.19363 -1.1925
+0.12639 -0.19431 -1.1967
+0.12789 -0.19488 -1.2003
+0.12908 -0.19498 -1.2009
+0.17206 -0.19496 -1.2006
+0.17315 -0.19491 -1.2004
+0.1742 -0.19482 -1.1998
+0.17517 -0.19465 -1.1987
+0.17616 -0.19449 -1.1977
+0.17782 -0.19384 -1.1937
+0.17984 -0.19359 -1.1921
+0.18095 -0.19359 -1.1921
+0.18213 -0.19364 -1.1924
+0.18333 -0.19373 -1.193
+0.18446 -0.19373 -1.193
+0.18687 -0.1939 -1.194
+0.18888 -0.19365 -1.1925
+0.19142 -0.19395 -1.1943
+0.19385 -0.19412 -1.1954
+0.19583 -0.19385 -1.1937
+0.20102 -0.19452 -1.1979
+0.35727 -0.19479 -1.2
+0.36168 -0.19473 -1.1997
+-0.35652 -0.1975 -1.2098
+-0.35442 -0.19761 -1.2104
+-0.35206 -0.19756 -1.2101
+-0.34975 -0.19755 -1.21
+-0.32196 -0.19727 -1.2081
+-0.32081 -0.19727 -1.2081
+-0.31977 -0.19733 -1.2084
+-0.31761 -0.1974 -1.2089
+-0.28582 -0.19747 -1.2092
+-0.28346 -0.19741 -1.2088
+-0.28105 -0.19731 -1.2082
+-0.27862 -0.19721 -1.2075
+-0.27741 -0.19716 -1.2072
+-0.27622 -0.19712 -1.207
+-0.25849 -0.1949 -1.1932
+-0.25721 -0.19478 -1.1924
+-0.25607 -0.19477 -1.1924
+-0.25495 -0.19477 -1.1924
+-0.25265 -0.19473 -1.1921
+-0.25051 -0.19481 -1.1927
+-0.13967 -0.19699 -1.2063
+-0.1374 -0.197 -1.2063
+-0.13626 -0.19698 -1.2063
+-0.12115 -0.18437 -1.1282
+-0.11988 -0.18406 -1.1263
+-0.11739 -0.18349 -1.1227
+-0.069984 -0.18133 -1.1094
+-0.068062 -0.18178 -1.1123
+-0.067174 -0.18222 -1.1149
+-0.066494 -0.18324 -1.1213
+-0.065658 -0.18386 -1.1251
+-0.064737 -0.18426 -1.1276
+-0.062682 -0.18446 -1.1289
+-0.060481 -0.18424 -1.1275
+-0.0583 -0.18407 -1.1264
+-0.056168 -0.18404 -1.1263
+-0.054028 -0.18398 -1.1259
+-0.04974 -0.18383 -1.125
+-0.045454 -0.18365 -1.1238
+-0.041193 -0.18355 -1.1232
+-0.036944 -0.18348 -1.1228
+-0.032704 -0.18345 -1.1226
+0.005447 -0.18523 -1.1337
+0.01363 -0.19531 -1.1961
+0.014744 -0.19514 -1.195
+0.016992 -0.1951 -1.1948
+0.019231 -0.19498 -1.194
+0.055021 -0.19426 -1.1895
+0.059557 -0.19443 -1.1906
+0.068719 -0.19497 -1.1939
+0.073369 -0.19537 -1.1964
+0.075675 -0.1955 -1.1972
+0.077948 -0.19555 -1.1975
+0.08261 -0.1959 -1.1997
+0.084889 -0.19594 -1.1999
+0.085972 -0.19584 -1.1993
+0.087237 -0.19614 -1.2011
+0.089535 -0.19622 -1.2016
+0.091833 -0.19629 -1.2021
+0.094098 -0.19629 -1.2021
+0.096383 -0.19633 -1.2023
+0.098622 -0.19628 -1.202
+0.10074 -0.19599 -1.2002
+0.10298 -0.19596 -1.2
+0.10525 -0.19597 -1.2001
+0.10638 -0.19597 -1.2001
+0.10729 -0.19557 -1.1976
+0.10945 -0.19539 -1.1964
+0.11057 -0.19539 -1.1964
+0.11151 -0.19505 -1.1943
+0.11364 -0.19484 -1.1931
+0.11601 -0.19506 -1.1944
+0.11819 -0.19494 -1.1936
+0.1203 -0.19471 -1.1922
+0.1213 -0.19452 -1.191
+0.12235 -0.19439 -1.1903
+0.12467 -0.19451 -1.191
+0.12589 -0.19467 -1.1919
+0.12731 -0.19513 -1.1948
+0.12844 -0.19513 -1.1948
+0.13003 -0.19583 -1.1991
+0.13229 -0.19583 -1.1991
+0.1345 -0.19577 -1.1987
+0.13673 -0.19573 -1.1985
+0.13875 -0.19539 -1.1964
+0.14089 -0.19523 -1.1954
+0.14304 -0.19509 -1.1945
+0.14506 -0.19478 -1.1926
+0.14947 -0.19467 -1.1919
+0.15393 -0.19462 -1.1916
+0.15844 -0.19465 -1.1918
+0.16314 -0.1949 -1.1933
+0.16571 -0.19527 -1.1956
+0.16819 -0.19554 -1.1972
+0.17048 -0.19558 -1.1975
+0.17175 -0.19575 -1.1985
+0.17288 -0.19575 -1.1985
+0.17467 -0.19522 -1.1952
+0.17688 -0.19518 -1.195
+0.17865 -0.19465 -1.1917
+0.17957 -0.19442 -1.1903
+0.18081 -0.19455 -1.1911
+0.1835 -0.19503 -1.194
+0.18494 -0.19536 -1.1961
+0.18582 -0.1951 -1.1945
+0.18807 -0.19511 -1.1945
+0.18884 -0.19473 -1.1922
+0.19011 -0.19489 -1.1932
+0.19175 -0.19541 -1.1964
+0.19288 -0.19541 -1.1964
+0.19484 -0.19512 -1.1946
+0.1973 -0.19533 -1.1959
+0.19977 -0.19553 -1.1971
+0.20109 -0.19572 -1.1983
+0.20221 -0.19571 -1.1983
+0.20454 -0.19578 -1.1987
+0.33966 -0.19554 -1.1975
+0.35298 -0.19542 -1.1969
+0.35522 -0.19542 -1.1969
+0.35753 -0.19545 -1.1971
+0.35892 -0.19559 -1.198
+0.36095 -0.19547 -1.1973
+-0.32033 -0.19811 -1.2062
+-0.28158 -0.19803 -1.2056
+-0.27902 -0.19782 -1.2043
+-0.27783 -0.19778 -1.2041
+-0.25897 -0.19553 -1.1902
+-0.25781 -0.19551 -1.19
+-0.25543 -0.1954 -1.1894
+-0.25329 -0.19548 -1.1899
+-0.13599 -0.19774 -1.2039
+-0.12242 -0.18574 -1.1301
+-0.12108 -0.18533 -1.1275
+-0.067297 -0.1836 -1.117
+-0.065714 -0.18508 -1.1261
+0.013612 -0.19618 -1.1945
+0.015844 -0.19595 -1.1931
+0.085853 -0.1967 -1.1976
+0.088173 -0.19684 -1.1985
+0.099544 -0.197 -1.1994
+0.10068 -0.197 -1.1994
+0.10183 -0.19704 -1.1997
+0.10294 -0.19701 -1.1995
+0.10403 -0.19694 -1.199
+0.10614 -0.19666 -1.1973
+0.11061 -0.19659 -1.1969
+0.11174 -0.19659 -1.1969
+0.11287 -0.19659 -1.1969
+0.11405 -0.19667 -1.1974
+0.11516 -0.19665 -1.1972
+0.11629 -0.19665 -1.1972
+0.11725 -0.19638 -1.1956
+0.11838 -0.19638 -1.1956
+0.11951 -0.19638 -1.1956
+0.12159 -0.1961 -1.1938
+0.12232 -0.19547 -1.19
+0.12338 -0.19538 -1.1894
+0.12451 -0.19539 -1.1894
+0.12576 -0.19559 -1.1907
+0.12697 -0.19573 -1.1916
+0.12811 -0.19575 -1.1917
+0.12955 -0.19623 -1.1946
+0.13102 -0.19675 -1.1978
+0.13333 -0.19684 -1.1983
+0.13446 -0.19683 -1.1983
+0.13556 -0.19679 -1.1981
+0.13669 -0.19679 -1.1981
+0.13767 -0.19659 -1.1968
+0.13872 -0.19647 -1.1961
+0.13976 -0.19635 -1.1954
+0.14089 -0.19635 -1.1954
+0.14207 -0.19642 -1.1958
+0.16445 -0.19624 -1.1946
+0.17149 -0.19657 -1.1966
+0.17357 -0.19638 -1.1954
+0.17796 -0.19625 -1.1946
+0.17978 -0.19578 -1.1918
+0.18119 -0.19609 -1.1937
+0.18232 -0.19609 -1.1937
+0.18458 -0.19611 -1.1938
+0.18698 -0.19627 -1.1947
+0.18923 -0.19627 -1.1947
+0.19171 -0.19649 -1.1961
+0.19283 -0.19649 -1.1961
+0.19367 -0.1962 -1.1943
+0.19479 -0.1962 -1.1943
+0.19592 -0.1962 -1.1943
+0.19853 -0.19655 -1.1965
+0.19966 -0.19655 -1.1965
+0.20078 -0.19655 -1.1965
+0.35544 -0.19605 -1.1938
+0.35664 -0.19609 -1.1941
+-0.3528 -0.19897 -1.2048
+-0.35053 -0.19897 -1.2048
+-0.346 -0.19898 -1.2048
+-0.34132 -0.19889 -1.2043
+-0.33678 -0.19889 -1.2042
+-0.33222 -0.19888 -1.2041
+-0.32753 -0.19879 -1.2035
+-0.32312 -0.19886 -1.2039
+-0.3208 -0.19883 -1.2037
+-0.31863 -0.19889 -1.2041
+-0.31404 -0.19886 -1.2039
+-0.30946 -0.19883 -1.2037
+-0.30502 -0.19889 -1.204
+-0.30039 -0.19883 -1.2036
+-0.29595 -0.1989 -1.204
+-0.29142 -0.1989 -1.204
+-0.28682 -0.19886 -1.2037
+-0.28452 -0.19884 -1.2036
+-0.28208 -0.19872 -1.2029
+-0.28088 -0.19867 -1.2026
+-0.27968 -0.19862 -1.2023
+-0.26192 -0.19634 -1.1883
+-0.26066 -0.19624 -1.1877
+-0.25951 -0.19622 -1.1875
+-0.25836 -0.1962 -1.1874
+-0.25599 -0.1961 -1.1868
+-0.25392 -0.19622 -1.1875
+-0.25179 -0.19631 -1.188
+-0.24762 -0.19655 -1.1895
+-0.24345 -0.1968 -1.1911
+-0.23936 -0.19713 -1.1931
+-0.23533 -0.19752 -1.1955
+-0.23117 -0.19783 -1.1973
+-0.22703 -0.19814 -1.1993
+-0.22269 -0.19831 -1.2003
+-0.21831 -0.19844 -1.2011
+-0.21389 -0.19853 -1.2017
+-0.20944 -0.19861 -1.2022
+-0.20496 -0.19866 -1.2025
+-0.20036 -0.19859 -1.202
+-0.19583 -0.19859 -1.2021
+-0.19131 -0.19861 -1.2022
+-0.18681 -0.19864 -1.2024
+-0.18224 -0.1986 -1.2021
+-0.17765 -0.19853 -1.2017
+-0.1731 -0.19851 -1.2016
+-0.16856 -0.1985 -1.2015
+-0.164 -0.19845 -1.2012
+-0.15948 -0.19846 -1.2013
+-0.15498 -0.1985 -1.2016
+-0.15043 -0.19847 -1.2014
+-0.1459 -0.19846 -1.2013
+-0.14135 -0.19843 -1.2012
+-0.13684 -0.19846 -1.2014
+-0.13571 -0.19846 -1.2014
+-0.12232 -0.18667 -1.1292
+-0.11961 -0.18575 -1.1236
+-0.11479 -0.18482 -1.1179
+-0.11019 -0.18418 -1.114
+-0.10568 -0.18364 -1.1107
+-0.1012 -0.18313 -1.1076
+-0.096871 -0.18283 -1.1058
+-0.092593 -0.18262 -1.1045
+-0.088384 -0.18253 -1.104
+-0.084217 -0.18253 -1.1039
+-0.080076 -0.18258 -1.1043
+-0.075981 -0.18275 -1.1053
+-0.071983 -0.18318 -1.108
+-0.070025 -0.18353 -1.1101
+-0.068191 -0.18423 -1.1144
+-0.066606 -0.18567 -1.1232
+-0.06464 -0.1861 -1.1259
+-0.060325 -0.18589 -1.1246
+-0.056047 -0.18577 -1.1238
+-0.05177 -0.18562 -1.1229
+-0.0475 -0.18549 -1.1221
+-0.043241 -0.18537 -1.1214
+-0.038997 -0.18529 -1.1209
+-0.034753 -0.1852 -1.1204
+-0.030518 -0.18514 -1.12
+-0.02629 -0.18511 -1.1198
+-0.022062 -0.18507 -1.1196
+-0.017842 -0.18509 -1.1197
+-0.013627 -0.18518 -1.1203
+-0.009413 -0.18539 -1.1216
+-0.005189 -0.18557 -1.1227
+-0.000958 -0.18607 -1.1257
+0.003297 -0.18668 -1.1294
+0.00544 -0.18713 -1.1322
+0.007601 -0.18778 -1.1362
+0.013589 -0.19696 -1.1924
+0.014704 -0.19685 -1.1917
+0.016942 -0.19677 -1.1912
+0.021399 -0.19648 -1.1894
+0.025838 -0.19615 -1.1874
+0.030281 -0.19595 -1.1862
+0.034713 -0.19573 -1.1849
+0.039162 -0.19566 -1.1844
+0.043605 -0.19556 -1.1838
+0.048053 -0.19551 -1.1835
+0.052525 -0.19555 -1.1837
+0.057005 -0.19562 -1.1841
+0.061507 -0.19575 -1.1849
+0.066016 -0.19587 -1.1857
+0.070595 -0.19618 -1.1875
+0.075239 -0.19662 -1.1902
+0.079853 -0.19694 -1.1922
+0.084437 -0.19715 -1.1935
+0.08675 -0.1973 -1.1944
+0.089054 -0.19742 -1.1951
+0.093656 -0.19763 -1.1963
+0.098168 -0.19763 -1.1964
+0.10047 -0.19772 -1.1969
+0.10273 -0.19774 -1.197
+0.10498 -0.19772 -1.1969
+0.10722 -0.1977 -1.1968
+0.1094 -0.19755 -1.1959
+0.11171 -0.19766 -1.1965
+0.11402 -0.19776 -1.1971
+0.11626 -0.19773 -1.197
+0.11723 -0.19746 -1.1953
+0.11835 -0.19746 -1.1953
+0.12051 -0.1973 -1.1943
+0.12268 -0.19718 -1.1936
+0.1247 -0.19682 -1.1913
+0.12694 -0.19681 -1.1913
+0.12808 -0.19683 -1.1914
+0.12952 -0.19731 -1.1944
+0.13196 -0.19759 -1.1961
+0.13397 -0.19724 -1.1939
+0.13633 -0.19741 -1.1949
+0.13829 -0.19698 -1.1923
+0.14064 -0.19714 -1.1933
+0.14308 -0.19739 -1.1948
+0.14516 -0.19717 -1.1934
+0.14734 -0.19707 -1.1928
+0.14951 -0.19697 -1.1922
+0.15174 -0.19695 -1.1921
+0.15395 -0.19689 -1.1917
+0.15619 -0.19689 -1.1917
+0.15843 -0.19689 -1.1917
+0.16076 -0.19698 -1.1923
+0.16309 -0.19708 -1.1929
+0.16421 -0.19708 -1.1929
+0.16556 -0.19735 -1.1945
+0.17019 -0.1975 -1.1954
+0.17115 -0.19731 -1.1943
+0.17228 -0.19731 -1.1943
+0.17459 -0.19738 -1.1947
+0.17676 -0.1973 -1.1942
+0.17886 -0.19712 -1.1931
+0.18107 -0.19708 -1.1928
+0.18341 -0.19719 -1.1935
+0.18569 -0.19722 -1.1937
+0.18802 -0.1973 -1.1941
+0.19022 -0.19725 -1.1938
+0.19245 -0.19723 -1.1937
+0.19457 -0.19709 -1.1929
+0.19697 -0.19725 -1.1938
+0.19922 -0.19725 -1.1938
+0.20152 -0.1973 -1.1941
+0.20602 -0.19729 -1.1941
+0.21058 -0.19736 -1.1945
+0.2151 -0.19737 -1.1946
+0.21965 -0.19741 -1.1948
+0.22409 -0.19735 -1.1945
+0.22854 -0.19731 -1.1942
+0.23308 -0.19734 -1.1944
+0.23747 -0.19725 -1.1938
+0.24211 -0.19737 -1.1945
+0.24662 -0.19737 -1.1946
+0.25106 -0.19732 -1.1943
+0.25561 -0.19736 -1.1945
+0.26001 -0.19728 -1.194
+0.26459 -0.19734 -1.1944
+0.26893 -0.19722 -1.1937
+0.27359 -0.19734 -1.1944
+0.27798 -0.19726 -1.1939
+0.28245 -0.19724 -1.1938
+0.28689 -0.1972 -1.1936
+0.29132 -0.19715 -1.1933
+0.29583 -0.19716 -1.1934
+0.30032 -0.19715 -1.1934
+0.30483 -0.19716 -1.1934
+0.30931 -0.19715 -1.1934
+0.31371 -0.19709 -1.193
+0.31817 -0.19707 -1.1929
+0.32264 -0.19705 -1.1929
+0.32708 -0.19702 -1.1927
+0.3316 -0.19703 -1.1928
+0.33592 -0.19693 -1.1922
+0.34031 -0.19687 -1.1919
+0.3447 -0.19682 -1.1916
+0.34905 -0.19674 -1.1911
+0.35336 -0.19664 -1.1906
+0.3557 -0.19669 -1.1909
+-0.352 -0.19966 -1.2021
+-0.35088 -0.19966 -1.2021
+-0.28257 -0.1994 -1.2001
+-0.2814 -0.19937 -1.1999
+-0.26239 -0.19698 -1.1854
+-0.26128 -0.19698 -1.1854
+-0.25891 -0.19688 -1.1848
+-0.25669 -0.19689 -1.1848
+-0.1354 -0.19914 -1.1986
+-0.12084 -0.18708 -1.1252
+-0.069093 -0.18488 -1.1119
+-0.067434 -0.18609 -1.1193
+-0.06556 -0.18676 -1.1234
+0.006511 -0.18832 -1.1329
+0.01357 -0.19781 -1.1907
+0.015802 -0.19767 -1.1899
+0.11714 -0.19844 -1.1944
+0.11935 -0.19837 -1.1939
+0.12815 -0.19807 -1.1921
+0.1305 -0.19823 -1.1931
+0.13149 -0.19802 -1.1918
+0.1325 -0.19786 -1.1908
+0.13362 -0.19786 -1.1908
+0.13483 -0.19798 -1.1916
+0.13708 -0.19798 -1.1915
+0.13895 -0.19745 -1.1883
+0.14355 -0.19762 -1.1893
+0.14577 -0.19759 -1.1891
+0.15031 -0.19767 -1.1896
+0.15154 -0.19781 -1.1905
+0.15266 -0.19781 -1.1905
+0.1537 -0.1977 -1.1898
+0.15482 -0.1977 -1.1898
+0.15611 -0.19791 -1.1911
+0.15729 -0.19798 -1.1915
+0.15835 -0.19791 -1.1911
+0.15955 -0.198 -1.1916
+0.16409 -0.19806 -1.192
+0.17088 -0.19812 -1.1923
+0.17313 -0.19813 -1.1924
+0.17757 -0.19806 -1.192
+0.17878 -0.19816 -1.1926
+0.1799 -0.19816 -1.1926
+0.18198 -0.19797 -1.1914
+-0.35007 -0.20033 -1.1993
+-0.34898 -0.20035 -1.1994
+-0.34673 -0.20036 -1.1994
+-0.3195 -0.20029 -1.1988
+-0.28778 -0.20022 -1.1982
+-0.28552 -0.20022 -1.1982
+-0.28308 -0.20009 -1.1974
+-0.28187 -0.20003 -1.1971
+-0.26541 -0.19785 -1.1838
+-0.26421 -0.19779 -1.1835
+-0.26296 -0.19769 -1.1829
+-0.26181 -0.19766 -1.1827
+-0.25951 -0.1976 -1.1824
+-0.25726 -0.19759 -1.1823
+-0.25512 -0.19766 -1.1827
+-0.25305 -0.19778 -1.1834
+-0.13849 -0.19983 -1.1959
+-0.13624 -0.19984 -1.196
+-0.13511 -0.19984 -1.196
+-0.12212 -0.18848 -1.1273
+-0.11946 -0.18764 -1.1222
+-0.11699 -0.18708 -1.1188
+-0.070082 -0.18577 -1.111
+-0.069162 -0.18612 -1.1131
+-0.068354 -0.18678 -1.1171
+-0.067567 -0.18751 -1.1215
+-0.066554 -0.18764 -1.1223
+-0.064472 -0.18774 -1.1229
+-0.062343 -0.1877 -1.1227
+0.005434 -0.18905 -1.1309
+0.006508 -0.18931 -1.1325
+0.007591 -0.18968 -1.1347
+0.013548 -0.19861 -1.1888
+0.014667 -0.19861 -1.1887
+0.016891 -0.19842 -1.1876
+0.019115 -0.19828 -1.1867
+0.086258 -0.19842 -1.1875
+0.095461 -0.19894 -1.1907
+0.097764 -0.19906 -1.1914
+0.099993 -0.19903 -1.1912
+0.1045 -0.19907 -1.1914
+0.109 -0.19909 -1.1915
+0.11352 -0.19914 -1.1918
+0.11573 -0.19908 -1.1914
+0.11799 -0.19911 -1.1916
+0.12027 -0.19916 -1.1919
+0.12247 -0.19908 -1.1914
+0.12468 -0.19903 -1.1911
+0.12697 -0.1991 -1.1916
+0.12921 -0.1991 -1.1915
+0.13134 -0.19892 -1.1905
+0.13356 -0.19889 -1.1903
+0.13548 -0.19841 -1.1873
+0.13741 -0.19797 -1.1847
+0.13958 -0.19787 -1.1841
+0.14188 -0.19797 -1.1847
+0.14406 -0.19791 -1.1843
+0.14633 -0.19796 -1.1846
+0.14867 -0.19809 -1.1854
+0.15095 -0.19816 -1.1858
+0.15326 -0.19825 -1.1863
+0.15413 -0.19794 -1.1844
+0.15534 -0.19806 -1.1852
+0.15679 -0.19848 -1.1877
+0.15803 -0.19863 -1.1886
+0.16054 -0.19896 -1.1906
+0.16279 -0.19896 -1.1906
+0.16498 -0.19891 -1.1903
+0.16717 -0.19884 -1.1899
+0.16946 -0.19889 -1.1902
+0.17166 -0.19885 -1.1899
+0.17384 -0.19878 -1.1895
+0.17611 -0.19881 -1.1897
+0.17839 -0.19886 -1.19
+0.18058 -0.19879 -1.1896
+0.18273 -0.19869 -1.1889
+0.18501 -0.19873 -1.1892
+0.18947 -0.19871 -1.189
+0.19391 -0.19867 -1.1888
+0.19836 -0.19864 -1.1886
+0.2835 -0.19865 -1.1887
+0.28583 -0.19871 -1.1891
+0.28794 -0.19862 -1.1886
+0.34082 -0.19811 -1.1858
+0.35383 -0.19789 -1.1846
+-0.34931 -0.20102 -1.1967
+-0.28595 -0.20086 -1.1953
+-0.26701 -0.1985 -1.1811
+-0.26583 -0.19845 -1.1807
+-0.26467 -0.19841 -1.1805
+-0.26232 -0.19832 -1.1799
+-0.26009 -0.19831 -1.1799
+-0.13482 -0.20054 -1.1934
+-0.12064 -0.1889 -1.1234
+-0.069295 -0.18753 -1.1152
+-0.067555 -0.18854 -1.1213
+-0.065482 -0.18866 -1.122
+0.006507 -0.19032 -1.1321
+0.013531 -0.19948 -1.1872
+0.015756 -0.19934 -1.1864
+0.13233 -0.19985 -1.1893
+0.13345 -0.19985 -1.1893
+0.13451 -0.19976 -1.1887
+0.13641 -0.19925 -1.1857
+0.13841 -0.19891 -1.1836
+0.13932 -0.19863 -1.1819
+0.14073 -0.19904 -1.1844
+0.14719 -0.19872 -1.1824
+0.14925 -0.1985 -1.1811
+0.15037 -0.1985 -1.1811
+0.15163 -0.19871 -1.1824
+0.15386 -0.19871 -1.1824
+0.15516 -0.19895 -1.1838
+0.15643 -0.19913 -1.1849
+0.1587 -0.19919 -1.1852
+0.15983 -0.1992 -1.1853
+0.16124 -0.19956 -1.1875
+0.16354 -0.19964 -1.1879
+0.35412 -0.19855 -1.1818
+-0.3474 -0.2017 -1.194
+-0.34514 -0.20169 -1.1939
+-0.34284 -0.20166 -1.1937
+-0.33822 -0.20159 -1.1932
+-0.33381 -0.20164 -1.1935
+-0.32923 -0.20159 -1.1932
+-0.32498 -0.20174 -1.194
+-0.32049 -0.20175 -1.194
+-0.31587 -0.20167 -1.1936
+-0.31139 -0.20168 -1.1936
+-0.30685 -0.20166 -1.1934
+-0.30242 -0.2017 -1.1937
+-0.29792 -0.2017 -1.1936
+-0.29335 -0.20165 -1.1933
+-0.28876 -0.20159 -1.1929
+-0.28636 -0.20148 -1.1922
+-0.28517 -0.20144 -1.192
+-0.28402 -0.20141 -1.1919
+-0.26756 -0.1992 -1.1786
+-0.26507 -0.19899 -1.1773
+-0.26281 -0.19896 -1.1771
+-0.26062 -0.19898 -1.1772
+-0.25846 -0.19903 -1.1776
+-0.25423 -0.19919 -1.1785
+-0.25019 -0.19951 -1.1804
+-0.24613 -0.19983 -1.1823
+-0.24211 -0.20019 -1.1845
+-0.23798 -0.20047 -1.1861
+-0.23388 -0.20079 -1.188
+-0.2297 -0.20105 -1.1896
+-0.22538 -0.2012 -1.1905
+-0.22108 -0.20136 -1.1915
+-0.21664 -0.20142 -1.1918
+-0.21219 -0.20145 -1.192
+-0.20768 -0.20144 -1.1919
+-0.20321 -0.20146 -1.1921
+-0.19872 -0.20146 -1.1921
+-0.1942 -0.20144 -1.1919
+-0.18966 -0.20138 -1.1916
+-0.18516 -0.20138 -1.1916
+-0.18062 -0.20132 -1.1913
+-0.17613 -0.20132 -1.1913
+-0.17162 -0.2013 -1.1912
+-0.16714 -0.20131 -1.1913
+-0.16263 -0.20129 -1.1911
+-0.15814 -0.20128 -1.1911
+-0.15367 -0.20131 -1.1913
+-0.14916 -0.20129 -1.1911
+-0.14464 -0.20124 -1.1909
+-0.14016 -0.20125 -1.1909
+-0.13566 -0.20124 -1.1909
+-0.13453 -0.20122 -1.1908
+-0.12061 -0.18991 -1.1231
+-0.11933 -0.18956 -1.121
+-0.11447 -0.18852 -1.1148
+-0.10987 -0.18785 -1.1108
+-0.10538 -0.18731 -1.1076
+-0.10099 -0.18691 -1.1052
+-0.096738 -0.18675 -1.1042
+-0.092486 -0.18657 -1.1032
+-0.088283 -0.18649 -1.1027
+-0.084133 -0.18651 -1.1028
+-0.080035 -0.18665 -1.1037
+-0.075981 -0.18692 -1.1053
+-0.072059 -0.18756 -1.1091
+-0.07021 -0.18821 -1.113
+-0.068552 -0.18943 -1.1203
+-0.066485 -0.18956 -1.1211
+-0.064367 -0.18955 -1.121
+-0.060103 -0.18943 -1.1204
+-0.05587 -0.18941 -1.1202
+-0.05162 -0.18931 -1.1196
+-0.047366 -0.18919 -1.1189
+-0.043124 -0.18908 -1.1183
+-0.038884 -0.18898 -1.1176
+-0.034652 -0.18888 -1.1171
+-0.030427 -0.18881 -1.1166
+-0.026213 -0.18879 -1.1165
+-0.022006 -0.18881 -1.1167
+-0.017802 -0.18889 -1.1171
+-0.013596 -0.18898 -1.1177
+-0.009388 -0.18912 -1.1185
+-0.005178 -0.18943 -1.1204
+-0.000956 -0.18986 -1.123
+0.00329 -0.1905 -1.1268
+0.00543 -0.19106 -1.1301
+0.007586 -0.1917 -1.134
+0.013512 -0.20033 -1.1856
+0.014625 -0.20028 -1.1853
+0.016842 -0.20007 -1.1841
+0.021273 -0.19978 -1.1823
+0.025688 -0.19947 -1.1804
+0.030091 -0.19917 -1.1786
+0.034489 -0.19891 -1.1771
+0.038887 -0.19871 -1.1759
+0.043275 -0.19851 -1.1747
+0.04767 -0.19838 -1.1739
+0.05207 -0.19828 -1.1733
+0.056483 -0.19825 -1.1731
+0.060915 -0.19828 -1.1733
+0.065365 -0.19837 -1.1738
+0.069841 -0.19852 -1.1747
+0.074343 -0.19872 -1.1759
+0.078891 -0.19901 -1.1776
+0.083471 -0.19934 -1.1796
+0.088057 -0.19966 -1.1815
+0.092688 -0.20005 -1.1838
+0.097171 -0.20009 -1.1841
+0.10174 -0.20031 -1.1853
+0.10626 -0.20039 -1.1859
+0.11077 -0.20047 -1.1863
+0.11524 -0.20047 -1.1863
+0.11975 -0.20053 -1.1866
+0.12421 -0.20052 -1.1866
+0.12866 -0.20048 -1.1864
+0.13091 -0.2005 -1.1864
+0.13314 -0.2005 -1.1864
+0.13534 -0.20044 -1.1861
+0.13733 -0.20009 -1.184
+0.13952 -0.20003 -1.1836
+0.14178 -0.20006 -1.1838
+0.144 -0.20004 -1.1837
+0.14607 -0.19984 -1.1825
+0.14715 -0.19979 -1.1822
+0.14792 -0.19933 -1.1794
+0.15019 -0.19939 -1.1798
+0.1524 -0.19936 -1.1796
+0.15462 -0.19936 -1.1796
+0.15609 -0.19983 -1.1824
+0.15727 -0.19991 -1.1829
+0.15972 -0.20018 -1.1845
+0.16206 -0.20031 -1.1853
+0.16429 -0.20031 -1.1852
+0.16874 -0.20029 -1.1851
+0.17309 -0.20016 -1.1843
+0.17763 -0.20024 -1.1848
+0.18205 -0.20018 -1.1845
+0.18649 -0.20016 -1.1843
+0.19095 -0.20016 -1.1843
+0.1954 -0.20015 -1.1842
+0.19986 -0.20014 -1.1842
+0.20439 -0.2002 -1.1845
+0.20878 -0.20014 -1.1841
+0.21327 -0.20016 -1.1843
+0.21774 -0.20016 -1.1843
+0.22226 -0.20022 -1.1846
+0.22669 -0.20018 -1.1844
+0.23111 -0.20014 -1.1842
+0.23558 -0.20015 -1.1842
+0.24004 -0.20015 -1.1842
+0.24449 -0.20014 -1.1841
+0.24894 -0.20012 -1.1841
+0.25345 -0.20016 -1.1843
+0.25789 -0.20014 -1.1842
+0.2622 -0.20002 -1.1835
+0.26664 -0.20001 -1.1834
+0.271 -0.19993 -1.183
+0.27551 -0.19997 -1.1832
+0.28003 -0.20001 -1.1835
+0.28433 -0.1999 -1.1828
+0.28902 -0.20006 -1.1838
+0.29333 -0.19996 -1.1832
+0.29775 -0.19993 -1.183
+0.30219 -0.19992 -1.183
+0.30668 -0.19994 -1.1831
+0.31106 -0.19989 -1.1829
+0.31568 -0.19999 -1.1835
+0.32002 -0.19992 -1.1831
+0.32444 -0.19989 -1.183
+0.32878 -0.19982 -1.1826
+0.33331 -0.19986 -1.1829
+0.33747 -0.19969 -1.1818
+0.33958 -0.19962 -1.1815
+0.34164 -0.19952 -1.1809
+0.34572 -0.19931 -1.1797
+0.34977 -0.19908 -1.1784
+0.35218 -0.19919 -1.179
+0.35321 -0.19914 -1.1788
+0.3553 -0.19907 -1.1784
+-0.34662 -0.20236 -1.1912
+-0.3455 -0.20237 -1.1912
+-0.34322 -0.20235 -1.1911
+-0.28681 -0.20213 -1.1894
+-0.28562 -0.20208 -1.1891
+-0.26929 -0.19994 -1.1764
+-0.26804 -0.19983 -1.1757
+-0.13425 -0.20193 -1.1883
+-0.12057 -0.19091 -1.1227
+-0.069415 -0.18996 -1.1172
+0.006501 -0.19229 -1.1311
+0.013492 -0.20115 -1.1838
+0.015713 -0.20102 -1.1831
+0.14282 -0.20108 -1.1832
+0.14396 -0.20112 -1.1834
+0.1449 -0.20086 -1.1819
+0.14704 -0.20074 -1.1812
+0.14899 -0.20038 -1.1791
+0.15319 -0.20006 -1.1771
+0.15587 -0.20065 -1.1806
+0.15819 -0.20078 -1.1814
+0.34 -0.20032 -1.1791
+0.35241 -0.1998 -1.1761
+0.35352 -0.1998 -1.1761
+0.35446 -0.19971 -1.1756
+-0.34473 -0.20304 -1.1886
+-0.34361 -0.20304 -1.1886
+-0.34132 -0.20301 -1.1884
+-0.33912 -0.20303 -1.1885
+-0.29429 -0.203 -1.188
+-0.29203 -0.20299 -1.1879
+-0.28975 -0.20295 -1.1877
+-0.28731 -0.20281 -1.1869
+-0.2861 -0.20275 -1.1865
+-0.27083 -0.20055 -1.1734
+-0.26968 -0.20051 -1.1732
+-0.26854 -0.20049 -1.173
+-0.26624 -0.20042 -1.1726
+-0.26399 -0.20039 -1.1725
+-0.25964 -0.20045 -1.1728
+-0.13733 -0.20263 -1.1858
+-0.13509 -0.20262 -1.1858
+-0.13285 -0.20262 -1.1857
+-0.12054 -0.19191 -1.1224
+-0.11918 -0.19144 -1.1196
+-0.11676 -0.19093 -1.1166
+-0.07404 -0.18937 -1.1075
+-0.0721 -0.18976 -1.1098
+-0.070344 -0.19068 -1.1152
+-0.069505 -0.19126 -1.1186
+-0.068493 -0.19138 -1.1193
+-0.066406 -0.19145 -1.1198
+0.001162 -0.19215 -1.1239
+0.003287 -0.19247 -1.1259
+0.005425 -0.19301 -1.129
+0.006499 -0.1933 -1.1308
+0.007585 -0.19381 -1.1337
+0.012344 -0.20172 -1.1806
+0.013474 -0.20199 -1.1822
+0.014584 -0.20194 -1.1819
+0.016798 -0.20178 -1.1809
+0.019007 -0.20161 -1.18
+0.10349 -0.20159 -1.1797
+0.1304 -0.20195 -1.1818
+0.13479 -0.20185 -1.1812
+0.13697 -0.20179 -1.1808
+0.13917 -0.20175 -1.1806
+0.14145 -0.20183 -1.1811
+0.14368 -0.20183 -1.1811
+0.14589 -0.20181 -1.1809
+0.14783 -0.20142 -1.1786
+0.15013 -0.20152 -1.1792
+0.15228 -0.20143 -1.1787
+0.15444 -0.20135 -1.1782
+0.15549 -0.20127 -1.1777
+0.15693 -0.20169 -1.1802
+0.15919 -0.20175 -1.1805
+0.16139 -0.20171 -1.1803
+0.33829 -0.20108 -1.1769
+0.3394 -0.20108 -1.1769
+0.34012 -0.20085 -1.1756
+0.34209 -0.20071 -1.1748
+0.35053 -0.20047 -1.1734
+0.35264 -0.20041 -1.1731
+0.35394 -0.20052 -1.1738
+-0.34285 -0.20371 -1.1859
+-0.34176 -0.20372 -1.186
+-0.29017 -0.20359 -1.1849
+-0.28899 -0.20354 -1.1846
+-0.28783 -0.20351 -1.1844
+-0.27266 -0.20137 -1.1717
+-0.27138 -0.20124 -1.171
+-0.26903 -0.20113 -1.1704
+-0.26671 -0.20105 -1.1698
+-0.12051 -0.19293 -1.1221
+-0.069503 -0.19231 -1.1186
+0.004354 -0.19377 -1.1272
+0.005424 -0.19405 -1.1289
+0.006498 -0.19433 -1.1305
+0.012339 -0.20275 -1.1801
+0.013444 -0.20264 -1.1795
+0.015662 -0.2026 -1.1792
+0.14667 -0.20246 -1.1782
+0.14772 -0.20239 -1.1778
+0.14887 -0.20243 -1.178
+0.15543 -0.20231 -1.1773
+0.15768 -0.20235 -1.1775
+0.33835 -0.20157 -1.1733
+0.35093 -0.20117 -1.1711
+0.35221 -0.20127 -1.1717
+0.35336 -0.2013 -1.1719
+-0.34211 -0.20438 -1.1833
+-0.33994 -0.20442 -1.1835
+-0.33547 -0.20441 -1.1834
+-0.33103 -0.20442 -1.1835
+-0.32652 -0.20439 -1.1832
+-0.32224 -0.20451 -1.1839
+-0.31771 -0.20446 -1.1836
+-0.31325 -0.20446 -1.1836
+-0.30874 -0.20443 -1.1833
+-0.3043 -0.20444 -1.1834
+-0.29981 -0.20442 -1.1832
+-0.29539 -0.20445 -1.1834
+-0.29299 -0.20433 -1.1827
+-0.2906 -0.20422 -1.182
+-0.28945 -0.20419 -1.1819
+-0.27311 -0.20199 -1.1689
+-0.27197 -0.20196 -1.1688
+-0.26951 -0.20177 -1.1676
+-0.26725 -0.20172 -1.1674
+-0.26501 -0.2017 -1.1672
+-0.26082 -0.20186 -1.1681
+-0.25667 -0.20206 -1.1693
+-0.2527 -0.20241 -1.1713
+-0.24876 -0.2028 -1.1736
+-0.24477 -0.20316 -1.1757
+-0.24066 -0.20344 -1.1773
+-0.23652 -0.20369 -1.1788
+-0.23234 -0.20392 -1.1802
+-0.22812 -0.20412 -1.1813
+-0.22374 -0.20419 -1.1817
+-0.21932 -0.20422 -1.1819
+-0.21485 -0.20421 -1.1819
+-0.21041 -0.20423 -1.182
+-0.20599 -0.20426 -1.1821
+-0.20149 -0.20422 -1.1819
+-0.19704 -0.20422 -1.1819
+-0.19254 -0.20418 -1.1817
+-0.18804 -0.20412 -1.1814
+-0.18356 -0.20409 -1.1812
+-0.1791 -0.20409 -1.1812
+-0.17466 -0.2041 -1.1813
+-0.17022 -0.20411 -1.1813
+-0.16578 -0.20413 -1.1814
+-0.16129 -0.20409 -1.1812
+-0.15691 -0.20418 -1.1817
+-0.15239 -0.20409 -1.1812
+-0.14791 -0.20405 -1.181
+-0.14346 -0.20405 -1.181
+-0.139 -0.20405 -1.181
+-0.1345 -0.20397 -1.1805
+-0.13228 -0.20398 -1.1806
+-0.12047 -0.19393 -1.1218
+-0.11915 -0.19349 -1.1192
+-0.11426 -0.19236 -1.1126
+-0.10968 -0.1917 -1.1088
+-0.10523 -0.19121 -1.1059
+-0.10089 -0.1909 -1.1041
+-0.096642 -0.19073 -1.1031
+-0.092429 -0.19062 -1.1025
+-0.088244 -0.19057 -1.1022
+-0.084116 -0.19063 -1.1026
+-0.080027 -0.1908 -1.1035
+-0.076023 -0.1912 -1.1059
+-0.072155 -0.192 -1.1106
+-0.070527 -0.19328 -1.1181
+-0.068446 -0.19336 -1.1186
+-0.064217 -0.19333 -1.1184
+-0.059971 -0.19323 -1.1178
+-0.055729 -0.19315 -1.1173
+-0.0515 -0.19309 -1.117
+-0.047267 -0.193 -1.1165
+-0.043039 -0.19293 -1.1161
+-0.038812 -0.19284 -1.1155
+-0.034584 -0.19272 -1.1148
+-0.030369 -0.19265 -1.1144
+-0.026159 -0.1926 -1.1142
+-0.021962 -0.19264 -1.1144
+-0.017769 -0.19275 -1.115
+-0.013575 -0.1929 -1.1159
+-0.009378 -0.19313 -1.1173
+-0.005172 -0.19343 -1.119
+-0.000954 -0.19382 -1.1213
+0.003286 -0.19451 -1.1254
+0.005423 -0.19508 -1.1287
+0.007583 -0.1959 -1.1335
+0.012313 -0.20344 -1.1776
+0.014528 -0.20338 -1.1773
+0.01674 -0.2033 -1.1768
+0.02116 -0.20315 -1.1759
+0.025546 -0.20279 -1.1738
+0.02992 -0.20245 -1.1718
+0.034294 -0.2022 -1.1704
+0.038656 -0.20194 -1.1688
+0.043001 -0.20166 -1.1672
+0.047348 -0.20144 -1.1659
+0.051682 -0.2012 -1.1645
+0.056031 -0.20105 -1.1636
+0.06038 -0.20093 -1.1629
+0.064757 -0.20091 -1.1628
+0.069166 -0.20098 -1.1632
+0.073583 -0.20107 -1.1637
+0.078021 -0.2012 -1.1645
+0.082508 -0.20144 -1.1659
+0.087044 -0.20177 -1.1678
+0.091617 -0.20215 -1.17
+0.096203 -0.20252 -1.1721
+0.1007 -0.20267 -1.173
+0.10298 -0.20282 -1.1739
+0.10522 -0.20287 -1.1742
+0.10967 -0.20291 -1.1744
+0.11416 -0.20302 -1.175
+0.11864 -0.2031 -1.1755
+0.12315 -0.20324 -1.1763
+0.12759 -0.20326 -1.1764
+0.132 -0.20321 -1.1761
+0.13639 -0.20314 -1.1757
+0.14084 -0.20317 -1.1759
+0.14526 -0.20315 -1.1757
+0.14746 -0.20313 -1.1756
+0.14964 -0.20309 -1.1754
+0.15183 -0.20305 -1.1751
+0.15406 -0.20307 -1.1752
+0.15631 -0.20311 -1.1755
+0.15851 -0.20311 -1.1754
+0.1629 -0.20304 -1.1751
+0.16735 -0.20307 -1.1752
+0.17177 -0.20306 -1.1752
+0.17613 -0.20298 -1.1747
+0.1806 -0.20302 -1.1749
+0.18502 -0.20301 -1.1749
+0.18939 -0.20296 -1.1745
+0.19387 -0.203 -1.1748
+0.19827 -0.20297 -1.1746
+0.20269 -0.20297 -1.1746
+0.20704 -0.20289 -1.1741
+0.21148 -0.20291 -1.1742
+0.21591 -0.20291 -1.1743
+0.22035 -0.20292 -1.1743
+0.2248 -0.20294 -1.1744
+0.22911 -0.20284 -1.1738
+0.23351 -0.20282 -1.1737
+0.23794 -0.20282 -1.1737
+0.24235 -0.20281 -1.1737
+0.24678 -0.20281 -1.1737
+0.25116 -0.20278 -1.1735
+0.25555 -0.20275 -1.1733
+0.25985 -0.20265 -1.1728
+0.26431 -0.20269 -1.173
+0.26882 -0.20275 -1.1734
+0.27321 -0.20272 -1.1732
+0.27758 -0.20269 -1.173
+0.28201 -0.20269 -1.1731
+0.28634 -0.20263 -1.1727
+0.29073 -0.20261 -1.1726
+0.29531 -0.20272 -1.1733
+0.29954 -0.20258 -1.1725
+0.30382 -0.20249 -1.172
+0.30832 -0.20255 -1.1723
+0.31286 -0.20263 -1.1728
+0.31721 -0.20258 -1.1726
+0.32153 -0.20252 -1.1723
+0.32603 -0.20257 -1.1726
+0.3302 -0.20242 -1.1717
+0.3345 -0.20234 -1.1713
+0.33639 -0.20216 -1.1703
+0.33848 -0.20209 -1.1699
+0.34254 -0.20188 -1.1687
+0.34689 -0.20185 -1.1686
+0.34917 -0.20189 -1.1689
+0.3514 -0.20191 -1.169
+0.3524 -0.20185 -1.1686
+-0.34024 -0.20504 -1.1807
+-0.291 -0.20483 -1.1791
+-0.28983 -0.20479 -1.1789
+-0.27475 -0.20268 -1.1665
+-0.27353 -0.20259 -1.166
+-0.27238 -0.20255 -1.1658
+-0.27003 -0.20244 -1.1651
+-0.12045 -0.19495 -1.1216
+0.006499 -0.19649 -1.1307
+0.1038 -0.20336 -1.1706
+0.34962 -0.20262 -1.1667
+0.35065 -0.20258 -1.1665
+0.35177 -0.20259 -1.1666
+-0.33949 -0.2057 -1.1781
+-0.33845 -0.20575 -1.1783
+-0.33634 -0.20581 -1.1786
+-0.33398 -0.20573 -1.1781
+-0.33187 -0.20579 -1.1785
+-0.30091 -0.20588 -1.1788
+-0.29619 -0.20569 -1.1776
+-0.29391 -0.20564 -1.1774
+-0.29143 -0.20546 -1.1763
+-0.29028 -0.20543 -1.1761
+-0.27643 -0.2034 -1.1643
+-0.27523 -0.20332 -1.1639
+-0.27277 -0.20313 -1.1627
+-0.27053 -0.20309 -1.1625
+-0.26832 -0.20308 -1.1624
+-0.26615 -0.20309 -1.1625
+-0.13168 -0.20526 -1.1751
+-0.11915 -0.1956 -1.1192
+-0.11663 -0.19492 -1.1153
+-0.074097 -0.1937 -1.1083
+-0.072413 -0.19479 -1.1146
+-0.0705 -0.19532 -1.1177
+-0.068387 -0.1953 -1.1176
+-0.066262 -0.19525 -1.1173
+0.005423 -0.1972 -1.1286
+0.006498 -0.19753 -1.1305
+0.012269 -0.20493 -1.1734
+0.014476 -0.20486 -1.173
+0.016688 -0.20489 -1.1731
+0.018887 -0.20476 -1.1724
+0.093351 -0.20333 -1.164
+0.097902 -0.20367 -1.166
+0.10236 -0.20379 -1.1667
+0.10349 -0.20385 -1.167
+0.10466 -0.20399 -1.1678
+0.1069 -0.20407 -1.1683
+0.14684 -0.20449 -1.1706
+0.15126 -0.2045 -1.1707
+0.1556 -0.20441 -1.1701
+0.33499 -0.20351 -1.1653
+0.34786 -0.20333 -1.1645
+0.35016 -0.20339 -1.1648
+0.35115 -0.20333 -1.1645
+-0.33778 -0.20644 -1.1759
+-0.33673 -0.20648 -1.1761
+-0.33448 -0.20646 -1.176
+-0.29433 -0.20627 -1.1746
+-0.29313 -0.20621 -1.1742
+-0.29192 -0.20613 -1.1738
+-0.27951 -0.20434 -1.1635
+-0.27832 -0.20427 -1.163
+-0.27704 -0.20414 -1.1623
+-0.27575 -0.204 -1.1615
+-0.27333 -0.20382 -1.1604
+-0.13032 -0.20598 -1.1729
+0.006496 -0.19855 -1.1303
+0.012242 -0.20558 -1.1708
+0.013345 -0.20558 -1.1708
+0.015551 -0.20558 -1.1707
+0.10326 -0.20451 -1.1645
+0.34827 -0.20403 -1.1622
+0.34937 -0.20403 -1.1622
+0.35053 -0.20407 -1.1624
+-0.33604 -0.20716 -1.1737
+-0.33497 -0.20719 -1.1738
+-0.33279 -0.20721 -1.1739
+-0.3282 -0.2071 -1.1732
+-0.32389 -0.20717 -1.1736
+-0.31944 -0.20716 -1.1735
+-0.31507 -0.20719 -1.1737
+-0.31063 -0.20718 -1.1736
+-0.30631 -0.20725 -1.1739
+-0.30188 -0.20724 -1.1739
+-0.29953 -0.20715 -1.1733
+-0.29724 -0.20709 -1.173
+-0.29479 -0.20693 -1.172
+-0.29358 -0.20685 -1.1716
+-0.2799 -0.20492 -1.1605
+-0.2787 -0.20484 -1.16
+-0.27623 -0.20463 -1.1588
+-0.27386 -0.20449 -1.158
+-0.27158 -0.20442 -1.1576
+-0.26725 -0.20445 -1.1577
+-0.26312 -0.20463 -1.1588
+-0.25907 -0.20488 -1.1602
+-0.25513 -0.20523 -1.1622
+-0.25126 -0.20565 -1.1646
+-0.24724 -0.20596 -1.1663
+-0.24322 -0.20628 -1.1682
+-0.23908 -0.20651 -1.1695
+-0.23489 -0.2067 -1.1706
+-0.23066 -0.20686 -1.1715
+-0.22632 -0.20694 -1.1719
+-0.22195 -0.20698 -1.1722
+-0.21754 -0.20698 -1.1722
+-0.2131 -0.20697 -1.1721
+-0.20866 -0.20694 -1.172
+-0.20424 -0.20695 -1.172
+-0.19977 -0.20689 -1.1717
+-0.19534 -0.20688 -1.1716
+-0.19092 -0.20687 -1.1716
+-0.18649 -0.20687 -1.1715
+-0.18201 -0.20679 -1.1711
+-0.17759 -0.20678 -1.1711
+-0.17317 -0.20678 -1.1711
+-0.16873 -0.20675 -1.1709
+-0.16435 -0.20679 -1.1711
+-0.15997 -0.20683 -1.1714
+-0.15551 -0.20677 -1.171
+-0.15113 -0.20683 -1.1714
+-0.14666 -0.20674 -1.1709
+-0.14222 -0.20671 -1.1707
+-0.13776 -0.20664 -1.1703
+-0.13336 -0.20666 -1.1704
+-0.13121 -0.20674 -1.1709
+-0.13011 -0.20674 -1.1709
+-0.11916 -0.19773 -1.1193
+-0.11661 -0.19699 -1.115
+-0.11421 -0.19648 -1.1122
+-0.10963 -0.1958 -1.1083
+-0.1052 -0.19533 -1.1056
+-0.10086 -0.19499 -1.1037
+-0.096606 -0.19482 -1.1027
+-0.092406 -0.19473 -1.1022
+-0.088259 -0.19476 -1.1023
+-0.084144 -0.19486 -1.1029
+-0.080097 -0.19513 -1.1045
+-0.07612 -0.19562 -1.1073
+-0.074248 -0.19619 -1.1106
+-0.072547 -0.19726 -1.1167
+-0.068335 -0.19726 -1.1167
+-0.064121 -0.19725 -1.1167
+-0.05989 -0.19719 -1.1163
+-0.055673 -0.19716 -1.1162
+-0.051433 -0.19705 -1.1155
+-0.047209 -0.19697 -1.1151
+-0.042978 -0.19686 -1.1144
+-0.038753 -0.19674 -1.1138
+-0.034541 -0.19668 -1.1134
+-0.030325 -0.19657 -1.1128
+-0.026133 -0.19661 -1.113
+-0.021942 -0.19667 -1.1134
+-0.017755 -0.19679 -1.1141
+-0.013563 -0.19694 -1.1149
+-0.009372 -0.19722 -1.1165
+-0.00517 -0.19755 -1.1184
+-0.000954 -0.19798 -1.1208
+0.003285 -0.19872 -1.1251
+0.005421 -0.19925 -1.1281
+0.006495 -0.19959 -1.1301
+0.011117 -0.20628 -1.1684
+0.012218 -0.20628 -1.1684
+0.014418 -0.20625 -1.1682
+0.016621 -0.20626 -1.1683
+0.021015 -0.20617 -1.1678
+0.025397 -0.20601 -1.1669
+0.029765 -0.2058 -1.1657
+0.03411 -0.20551 -1.164
+0.038433 -0.20516 -1.162
+0.04276 -0.20491 -1.1605
+0.047089 -0.20471 -1.1594
+0.051383 -0.2044 -1.1576
+0.055676 -0.20414 -1.1561
+0.059987 -0.20398 -1.1552
+0.064274 -0.20377 -1.154
+0.068603 -0.2037 -1.1536
+0.072905 -0.20357 -1.1528
+0.077241 -0.20354 -1.1527
+0.081619 -0.20363 -1.1531
+0.086067 -0.20386 -1.1545
+0.090541 -0.20414 -1.1561
+0.092798 -0.20431 -1.157
+0.095117 -0.20461 -1.1587
+0.097361 -0.20473 -1.1594
+0.099615 -0.20487 -1.1602
+0.10186 -0.20499 -1.1609
+0.10416 -0.20521 -1.1622
+0.10637 -0.20525 -1.1624
+0.10863 -0.20538 -1.1632
+0.11305 -0.20544 -1.1635
+0.11755 -0.20564 -1.1647
+0.12205 -0.20582 -1.1656
+0.12647 -0.20587 -1.1659
+0.13087 -0.20587 -1.1659
+0.13526 -0.20587 -1.1659
+0.13959 -0.20577 -1.1653
+0.14405 -0.20587 -1.1659
+0.14846 -0.20588 -1.166
+0.15285 -0.20587 -1.1659
+0.15726 -0.20589 -1.166
+0.16165 -0.20588 -1.1659
+0.16602 -0.20586 -1.1658
+0.17035 -0.20578 -1.1653
+0.17466 -0.20568 -1.1648
+0.17901 -0.20563 -1.1644
+0.1834 -0.20563 -1.1645
+0.18777 -0.20561 -1.1643
+0.19217 -0.20562 -1.1644
+0.19655 -0.20561 -1.1643
+0.20093 -0.2056 -1.1643
+0.20535 -0.20563 -1.1645
+0.20973 -0.20562 -1.1644
+0.21409 -0.20559 -1.1642
+0.21847 -0.20559 -1.1642
+0.2229 -0.20562 -1.1644
+0.22723 -0.20557 -1.1641
+0.23166 -0.2056 -1.1643
+0.23595 -0.20551 -1.1638
+0.24034 -0.20552 -1.1638
+0.2447 -0.20549 -1.1637
+0.24907 -0.20548 -1.1636
+0.25353 -0.20554 -1.1639
+0.25784 -0.20548 -1.1636
+0.26216 -0.20543 -1.1633
+0.26654 -0.20542 -1.1633
+0.27081 -0.20534 -1.1628
+0.27539 -0.20548 -1.1637
+0.27976 -0.20547 -1.1636
+0.28406 -0.2054 -1.1633
+0.28846 -0.20541 -1.1633
+0.29266 -0.20528 -1.1626
+0.2971 -0.20532 -1.1629
+0.30143 -0.20529 -1.1627
+0.30585 -0.20531 -1.1629
+0.31012 -0.20524 -1.1625
+0.31445 -0.20521 -1.1623
+0.31874 -0.20514 -1.162
+0.32299 -0.20506 -1.1615
+0.32727 -0.205 -1.1612
+0.33144 -0.20488 -1.1606
+0.33572 -0.20481 -1.1603
+0.34007 -0.2048 -1.1602
+0.3445 -0.20483 -1.1604
+0.34656 -0.20476 -1.16
+0.3487 -0.20473 -1.1599
+0.35005 -0.20488 -1.1608
+-0.33536 -0.20785 -1.1713
+-0.33319 -0.20787 -1.1714
+-0.29769 -0.20774 -1.1704
+-0.29525 -0.20758 -1.1695
+-0.29406 -0.20751 -1.1691
+-0.28159 -0.20565 -1.1584
+-0.28038 -0.20557 -1.1579
+-0.27916 -0.20547 -1.1574
+-0.27665 -0.20523 -1.156
+-0.1298 -0.20736 -1.1681
+-0.11788 -0.19841 -1.1171
+-0.11538 -0.19774 -1.1134
+-0.073452 -0.19792 -1.1144
+0.004351 -0.20001 -1.1264
+0.005421 -0.20033 -1.1282
+0.011093 -0.20693 -1.1659
+0.093647 -0.20487 -1.154
+0.098179 -0.20525 -1.1562
+0.09932 -0.20536 -1.1568
+0.10044 -0.20541 -1.1571
+0.10157 -0.2055 -1.1576
+0.10272 -0.2056 -1.1582
+0.10383 -0.20565 -1.1585
+0.10495 -0.20571 -1.1588
+0.1072 -0.20584 -1.1595
+0.34709 -0.20552 -1.1582
+0.34818 -0.20552 -1.1582
+0.34936 -0.20557 -1.1585
+-0.33358 -0.20853 -1.1689
+-0.33139 -0.20854 -1.1689
+-0.32911 -0.20849 -1.1686
+-0.30261 -0.20844 -1.1681
+-0.30035 -0.2084 -1.1679
+-0.29804 -0.20832 -1.1675
+-0.29688 -0.20828 -1.1672
+-0.29571 -0.20823 -1.1669
+-0.28464 -0.20658 -1.1575
+-0.28214 -0.20635 -1.1562
+-0.27961 -0.20609 -1.1547
+-0.27725 -0.20595 -1.1539
+-0.27488 -0.20581 -1.1531
+-0.27264 -0.20576 -1.1528
+-0.13058 -0.20795 -1.1652
+-0.12834 -0.20789 -1.1649
+-0.11789 -0.19949 -1.1173
+-0.11659 -0.19906 -1.1148
+-0.11419 -0.19854 -1.1119
+-0.11187 -0.19816 -1.1098
+-0.074422 -0.19875 -1.1132
+-0.073557 -0.19925 -1.116
+-0.072552 -0.19938 -1.1168
+-0.070433 -0.19934 -1.1166
+0.001162 -0.20048 -1.1231
+0.003285 -0.20085 -1.1251
+0.00542 -0.20136 -1.128
+0.009968 -0.20749 -1.1628
+0.012163 -0.20755 -1.1631
+0.014357 -0.20757 -1.1632
+0.092227 -0.20522 -1.1498
+0.094435 -0.20531 -1.1503
+0.10014 -0.20588 -1.1536
+0.10467 -0.20625 -1.1556
+0.10578 -0.20628 -1.1558
+0.10804 -0.20643 -1.1567
+0.11027 -0.20653 -1.1572
+0.1125 -0.20662 -1.1577
+0.11473 -0.2067 -1.1582
+0.1192 -0.20688 -1.1592
+0.34544 -0.20628 -1.1563
+0.34777 -0.20637 -1.1568
+0.34873 -0.20629 -1.1564
+-0.33291 -0.20921 -1.1665
+-0.33181 -0.20921 -1.1665
+-0.29845 -0.20894 -1.1647
+-0.29728 -0.20889 -1.1644
+-0.28512 -0.20723 -1.155
+-0.11787 -0.2005 -1.1171
+-0.11539 -0.19986 -1.1135
+-0.073591 -0.2004 -1.1165
+0.004349 -0.20208 -1.1261
+0.009947 -0.20815 -1.1603
+0.011041 -0.20815 -1.1603
+0.095286 -0.20589 -1.1475
+0.096425 -0.20601 -1.1482
+0.10659 -0.20684 -1.1528
+0.10773 -0.20694 -1.1534
+0.10885 -0.20701 -1.1538
+0.10996 -0.20703 -1.1539
+0.11107 -0.20708 -1.1542
+0.34599 -0.20704 -1.1545
+0.34707 -0.20704 -1.1545
+0.34812 -0.20702 -1.1543
+-0.3311 -0.20986 -1.164
+-0.33002 -0.20987 -1.164
+-0.32543 -0.20974 -1.1633
+-0.32113 -0.2098 -1.1635
+-0.31683 -0.20985 -1.1638
+-0.31242 -0.20984 -1.1637
+-0.30789 -0.20974 -1.1631
+-0.3036 -0.2098 -1.1635
+-0.29892 -0.2096 -1.1623
+-0.29641 -0.20937 -1.161
+-0.2868 -0.20796 -1.153
+-0.28559 -0.20787 -1.1525
+-0.28309 -0.20763 -1.1512
+-0.27823 -0.20724 -1.149
+-0.2737 -0.20709 -1.1481
+-0.26943 -0.20713 -1.1483
+-0.26535 -0.20733 -1.1494
+-0.26138 -0.20762 -1.151
+-0.2575 -0.20799 -1.1531
+-0.25357 -0.20833 -1.155
+-0.24966 -0.20871 -1.1571
+-0.24568 -0.20903 -1.1589
+-0.24163 -0.20931 -1.1605
+-0.23746 -0.20949 -1.1615
+-0.23321 -0.20961 -1.1621
+-0.2289 -0.20967 -1.1625
+-0.22451 -0.20966 -1.1624
+-0.22013 -0.20967 -1.1625
+-0.21573 -0.20965 -1.1624
+-0.2113 -0.20961 -1.1621
+-0.2069 -0.20959 -1.162
+-0.20253 -0.20959 -1.162
+-0.19813 -0.20957 -1.1619
+-0.19363 -0.20945 -1.1612
+-0.18934 -0.20955 -1.1618
+-0.18493 -0.20951 -1.1616
+-0.18054 -0.20949 -1.1615
+-0.17609 -0.20941 -1.161
+-0.17173 -0.20944 -1.1612
+-0.16742 -0.20952 -1.1617
+-0.16298 -0.20945 -1.1613
+-0.15858 -0.20941 -1.1611
+-0.15421 -0.20942 -1.1611
+-0.14977 -0.20935 -1.1607
+-0.14539 -0.20933 -1.1606
+-0.14099 -0.20929 -1.1604
+-0.13662 -0.20931 -1.1605
+-0.13222 -0.20926 -1.1603
+-0.12779 -0.20918 -1.1598
+-0.11664 -0.20125 -1.1153
+-0.11422 -0.20071 -1.1123
+-0.1096 -0.19992 -1.1079
+-0.1052 -0.1995 -1.1055
+-0.10085 -0.19915 -1.1036
+-0.096603 -0.19898 -1.1026
+-0.092437 -0.19896 -1.1026
+-0.088299 -0.19901 -1.1028
+-0.084224 -0.19921 -1.104
+-0.080215 -0.1996 -1.1061
+-0.076313 -0.20031 -1.1101
+-0.074616 -0.20138 -1.1161
+-0.072541 -0.20146 -1.1166
+-0.068336 -0.20148 -1.1167
+-0.064109 -0.20143 -1.1164
+-0.059878 -0.20136 -1.1161
+-0.055635 -0.20124 -1.1154
+-0.051406 -0.20115 -1.1149
+-0.047187 -0.20109 -1.1145
+-0.042952 -0.20094 -1.1137
+-0.038739 -0.20088 -1.1134
+-0.03452 -0.20076 -1.1127
+-0.030319 -0.20073 -1.1125
+-0.026124 -0.20074 -1.1126
+-0.021937 -0.20082 -1.1131
+-0.01775 -0.20095 -1.1138
+-0.013562 -0.20113 -1.1148
+-0.009372 -0.20144 -1.1165
+-0.00517 -0.20177 -1.1184
+-0.000955 -0.20232 -1.1215
+0.003285 -0.20297 -1.1251
+0.004348 -0.20307 -1.1257
+0.005423 -0.20361 -1.1287
+0.008819 -0.20841 -1.1556
+0.009926 -0.20878 -1.1577
+0.012109 -0.2088 -1.1578
+0.01648 -0.20888 -1.1583
+0.020851 -0.20893 -1.1585
+0.025215 -0.20891 -1.1584
+0.029572 -0.20883 -1.158
+0.033914 -0.20869 -1.1572
+0.038233 -0.20846 -1.1559
+0.042548 -0.20825 -1.1547
+0.046848 -0.20801 -1.1534
+0.051139 -0.20778 -1.1521
+0.055413 -0.20752 -1.1506
+0.059664 -0.20722 -1.1489
+0.063908 -0.20693 -1.1473
+0.068173 -0.20675 -1.1463
+0.072453 -0.20663 -1.1456
+0.076704 -0.20645 -1.1446
+0.080958 -0.20629 -1.1437
+0.085221 -0.20617 -1.143
+0.089527 -0.20616 -1.1429
+0.09392 -0.20635 -1.144
+0.096094 -0.20638 -1.1442
+0.097237 -0.20652 -1.1449
+0.098349 -0.20659 -1.1453
+0.11075 -0.20757 -1.1508
+0.11187 -0.20764 -1.1512
+0.11635 -0.20789 -1.1526
+0.11858 -0.20799 -1.1532
+0.12084 -0.20813 -1.154
+0.12526 -0.20826 -1.1546
+0.12968 -0.20836 -1.1552
+0.13406 -0.20841 -1.1555
+0.13844 -0.20843 -1.1556
+0.14284 -0.2085 -1.156
+0.1472 -0.20849 -1.1559
+0.15146 -0.20837 -1.1552
+0.15589 -0.20846 -1.1557
+0.16023 -0.20845 -1.1556
+0.16464 -0.20851 -1.156
+0.16892 -0.20841 -1.1554
+0.17322 -0.20834 -1.155
+0.17755 -0.20831 -1.1549
+0.18179 -0.20818 -1.1541
+0.18618 -0.20822 -1.1543
+0.19049 -0.20818 -1.1541
+0.19478 -0.20811 -1.1537
+0.19921 -0.2082 -1.1542
+0.20358 -0.20821 -1.1543
+0.20799 -0.20827 -1.1546
+0.21232 -0.20825 -1.1545
+0.2167 -0.20827 -1.1546
+0.22105 -0.20827 -1.1546
+0.22539 -0.20826 -1.1545
+0.22974 -0.20825 -1.1545
+0.2341 -0.20826 -1.1546
+0.2385 -0.20831 -1.1548
+0.24279 -0.20824 -1.1545
+0.24705 -0.20817 -1.1541
+0.25134 -0.20811 -1.1538
+0.25578 -0.20819 -1.1542
+0.2602 -0.20825 -1.1545
+0.26451 -0.20821 -1.1544
+0.26868 -0.20807 -1.1536
+0.27303 -0.20807 -1.1536
+0.27736 -0.20805 -1.1535
+0.2817 -0.20805 -1.1535
+0.28605 -0.20805 -1.1535
+0.29045 -0.20809 -1.1538
+0.29466 -0.20799 -1.1532
+0.29895 -0.20795 -1.153
+0.30336 -0.20799 -1.1533
+0.30767 -0.20796 -1.1532
+0.31192 -0.2079 -1.1529
+0.31621 -0.20786 -1.1527
+0.32029 -0.20769 -1.1517
+0.32463 -0.20769 -1.1518
+0.32892 -0.20766 -1.1517
+0.33326 -0.20766 -1.1517
+0.33764 -0.20768 -1.1519
+0.34223 -0.20783 -1.1528
+0.34429 -0.20777 -1.1524
+0.3466 -0.20785 -1.1529
+0.34783 -0.20794 -1.1534
+-0.33034 -0.21048 -1.1613
+-0.29678 -0.20996 -1.1581
+-0.28605 -0.2085 -1.15
+-0.28353 -0.20824 -1.1485
+-0.12645 -0.20985 -1.1575
+-0.11663 -0.2023 -1.1153
+-0.11544 -0.20205 -1.1139
+0.00435 -0.20422 -1.1261
+0.00771 -0.20896 -1.1526
+0.008812 -0.20933 -1.1547
+0.010992 -0.2094 -1.1551
+0.096912 -0.20691 -1.1411
+0.098054 -0.20705 -1.1418
+0.11714 -0.20844 -1.1496
+0.11943 -0.20866 -1.1508
+0.34463 -0.2084 -1.1499
+0.34571 -0.2084 -1.1499
+0.34701 -0.20853 -1.1506
+-0.32961 -0.2111 -1.1587
+-0.32853 -0.21111 -1.1587
+-0.32635 -0.21111 -1.1587
+-0.32415 -0.2111 -1.1586
+-0.32192 -0.21107 -1.1584
+-0.29978 -0.21085 -1.1571
+-0.29718 -0.21055 -1.1554
+-0.29452 -0.21021 -1.1535
+-0.28913 -0.20946 -1.1493
+-0.28653 -0.20914 -1.1475
+-0.28395 -0.20884 -1.1458
+-0.28151 -0.20863 -1.1447
+-0.27909 -0.20844 -1.1436
+-0.12947 -0.21054 -1.1552
+-0.12728 -0.21051 -1.1551
+-0.12618 -0.21051 -1.155
+-0.1155 -0.20321 -1.1145
+-0.11432 -0.20298 -1.1132
+-0.11196 -0.2025 -1.1106
+-0.082268 -0.2016 -1.1057
+-0.080269 -0.20182 -1.1069
+-0.078333 -0.20221 -1.109
+-0.076603 -0.20317 -1.1144
+-0.07462 -0.20349 -1.1162
+-0.072526 -0.20352 -1.1163
+-0.070432 -0.20356 -1.1165
+0.001162 -0.20477 -1.1233
+0.003285 -0.20511 -1.1252
+0.004356 -0.20556 -1.1277
+0.006605 -0.20946 -1.1494
+0.007705 -0.20992 -1.1519
+0.009876 -0.20992 -1.1519
+0.012055 -0.21004 -1.1526
+0.014231 -0.2101 -1.1529
+0.091339 -0.20754 -1.1386
+0.093453 -0.20747 -1.1382
+0.095622 -0.20752 -1.1385
+0.097794 -0.20757 -1.1388
+0.098876 -0.20759 -1.1389
+0.099957 -0.20761 -1.139
+0.10216 -0.20772 -1.1396
+0.1044 -0.20789 -1.1405
+0.11678 -0.20889 -1.1461
+0.11793 -0.20901 -1.1467
+0.12016 -0.20914 -1.1474
+0.12237 -0.20922 -1.1479
+0.16171 -0.20971 -1.1505
+0.16382 -0.20963 -1.1501
+0.16603 -0.20969 -1.1504
+0.34307 -0.20919 -1.1483
+0.34525 -0.20921 -1.1484
+0.3464 -0.20924 -1.1486
+-0.32782 -0.21174 -1.1562
+-0.32671 -0.21173 -1.1561
+-0.32455 -0.21174 -1.1562
+-0.29225 -0.21045 -1.1488
+-0.29088 -0.21024 -1.1477
+-0.28958 -0.21009 -1.1468
+-0.28707 -0.20983 -1.1454
+-0.12592 -0.21115 -1.1526
+-0.12483 -0.21115 -1.1525
+-0.11554 -0.20433 -1.1149
+-0.079334 -0.20314 -1.1084
+-0.07754 -0.20392 -1.1127
+0.002224 -0.20609 -1.1247
+0.003287 -0.20629 -1.1258
+0.005485 -0.20914 -1.1416
+0.006594 -0.21019 -1.1474
+0.098619 -0.20812 -1.1359
+0.10079 -0.20818 -1.1362
+0.1052 -0.20843 -1.1375
+0.10629 -0.20847 -1.1378
+0.10741 -0.20856 -1.1383
+0.10855 -0.20868 -1.139
+0.11641 -0.20931 -1.1424
+0.11867 -0.20949 -1.1434
+0.34356 -0.20991 -1.1463
+0.34466 -0.20993 -1.1464
+0.34556 -0.20982 -1.1458
+-0.32711 -0.21237 -1.1537
+-0.32488 -0.21233 -1.1534
+-0.32277 -0.21238 -1.1537
+-0.31844 -0.21239 -1.1537
+-0.31424 -0.21249 -1.1542
+-0.30982 -0.21244 -1.1539
+-0.30536 -0.21236 -1.1535
+-0.30062 -0.21209 -1.1519
+-0.29535 -0.21143 -1.1482
+-0.29272 -0.21109 -1.1464
+-0.28999 -0.21068 -1.1441
+-0.28741 -0.21037 -1.1424
+-0.28491 -0.21011 -1.141
+-0.28018 -0.2098 -1.1392
+-0.27563 -0.2096 -1.1381
+-0.27155 -0.20977 -1.139
+-0.26746 -0.20992 -1.1398
+-0.2636 -0.21028 -1.1418
+-0.25975 -0.21064 -1.1438
+-0.25588 -0.21101 -1.1458
+-0.25204 -0.21141 -1.148
+-0.24814 -0.21177 -1.15
+-0.24408 -0.21201 -1.1513
+-0.23995 -0.2122 -1.1523
+-0.23568 -0.21227 -1.1526
+-0.23135 -0.21228 -1.1527
+-0.22704 -0.21232 -1.1529
+-0.22264 -0.21227 -1.1527
+-0.21833 -0.2123 -1.1528
+-0.21394 -0.21226 -1.1526
+-0.20948 -0.21215 -1.152
+-0.20521 -0.21222 -1.1524
+-0.20085 -0.21221 -1.1523
+-0.19651 -0.21222 -1.1524
+-0.19218 -0.21223 -1.1524
+-0.18779 -0.21218 -1.1521
+-0.18344 -0.21217 -1.1521
+-0.17901 -0.21207 -1.1516
+-0.17469 -0.2121 -1.1517
+-0.17027 -0.212 -1.1512
+-0.16596 -0.21204 -1.1514
+-0.16164 -0.21207 -1.1516
+-0.15728 -0.21204 -1.1514
+-0.15295 -0.21206 -1.1515
+-0.14852 -0.21194 -1.1509
+-0.14414 -0.21188 -1.1506
+-0.13978 -0.21184 -1.1503
+-0.1354 -0.21177 -1.15
+-0.13106 -0.21177 -1.15
+-0.12673 -0.21177 -1.15
+-0.12457 -0.2118 -1.1501
+-0.11555 -0.2054 -1.115
+-0.11441 -0.20523 -1.1141
+-0.10971 -0.20431 -1.109
+-0.10528 -0.20383 -1.1064
+-0.10096 -0.20355 -1.1048
+-0.096691 -0.20332 -1.1036
+-0.092537 -0.20334 -1.1037
+-0.088408 -0.20342 -1.1042
+-0.084335 -0.20364 -1.1054
+-0.080361 -0.20414 -1.1081
+-0.079387 -0.20433 -1.1092
+-0.078519 -0.20479 -1.1117
+-0.076743 -0.20565 -1.1164
+-0.072552 -0.20571 -1.1167
+-0.07046 -0.20575 -1.117
+-0.068428 -0.20597 -1.1182
+-0.064188 -0.20589 -1.1178
+-0.059935 -0.20577 -1.1171
+-0.055673 -0.20559 -1.1161
+-0.051442 -0.2055 -1.1157
+-0.0472 -0.20535 -1.1148
+-0.042976 -0.20526 -1.1143
+-0.03875 -0.20513 -1.1136
+-0.034537 -0.20506 -1.1132
+-0.030331 -0.20501 -1.113
+-0.02614 -0.20506 -1.1132
+-0.021945 -0.2051 -1.1135
+-0.017757 -0.20523 -1.1142
+-0.013575 -0.20553 -1.1159
+-0.00938 -0.20582 -1.1174
+-0.005175 -0.2062 -1.1195
+-0.000955 -0.20667 -1.1221
+0.001163 -0.2071 -1.1245
+0.003292 -0.20767 -1.1276
+0.004385 -0.2091 -1.1354
+0.005495 -0.21063 -1.1438
+0.006588 -0.2111 -1.1465
+0.00767 -0.21114 -1.1466
+0.011999 -0.21124 -1.1472
+0.016334 -0.21137 -1.1479
+0.020678 -0.21154 -1.1488
+0.025009 -0.21153 -1.1488
+0.029341 -0.21154 -1.1488
+0.033662 -0.21147 -1.1485
+0.037986 -0.21144 -1.1483
+0.042275 -0.21124 -1.1472
+0.04657 -0.2111 -1.1464
+0.050864 -0.21098 -1.1458
+0.055108 -0.21069 -1.1442
+0.059357 -0.21046 -1.1429
+0.063584 -0.21019 -1.1414
+0.067816 -0.20997 -1.1402
+0.072038 -0.20974 -1.1389
+0.076275 -0.20959 -1.1381
+0.080499 -0.20941 -1.1371
+0.084697 -0.20919 -1.1359
+0.088909 -0.20902 -1.1349
+0.093131 -0.20889 -1.1342
+0.097348 -0.20877 -1.1335
+0.099496 -0.20879 -1.1336
+0.10165 -0.20882 -1.1338
+0.10382 -0.20889 -1.1342
+0.10601 -0.20899 -1.1347
+0.10824 -0.20915 -1.1356
+0.10933 -0.2092 -1.1359
+0.11377 -0.20948 -1.1374
+0.11492 -0.20962 -1.1382
+0.11718 -0.20983 -1.1393
+0.11941 -0.20997 -1.1401
+0.12388 -0.21027 -1.1417
+0.12834 -0.21052 -1.1431
+0.13274 -0.21066 -1.1439
+0.13713 -0.21078 -1.1445
+0.1415 -0.21087 -1.145
+0.14585 -0.2109 -1.1452
+0.15023 -0.21099 -1.1456
+0.15458 -0.21103 -1.1459
+0.15888 -0.21101 -1.1458
+0.16328 -0.21111 -1.1463
+0.16752 -0.21101 -1.1457
+0.17184 -0.21101 -1.1458
+0.17611 -0.21095 -1.1454
+0.18031 -0.2108 -1.1446
+0.18461 -0.21079 -1.1445
+0.18898 -0.21085 -1.1449
+0.19326 -0.21081 -1.1446
+0.19771 -0.21095 -1.1454
+0.20195 -0.21087 -1.145
+0.20635 -0.21095 -1.1454
+0.21055 -0.21083 -1.1448
+0.21489 -0.21086 -1.1449
+0.21917 -0.21081 -1.1447
+0.2235 -0.21083 -1.1447
+0.22777 -0.21079 -1.1445
+0.23214 -0.21084 -1.1448
+0.23646 -0.21084 -1.1448
+0.24074 -0.21081 -1.1446
+0.24501 -0.21077 -1.1444
+0.24932 -0.21076 -1.1444
+0.2537 -0.21082 -1.1447
+0.25798 -0.21079 -1.1446
+0.2623 -0.21079 -1.1446
+0.26653 -0.21072 -1.1442
+0.27085 -0.21072 -1.1443
+0.2752 -0.21076 -1.1445
+0.27952 -0.21075 -1.1445
+0.28382 -0.21075 -1.1445
+0.28816 -0.21076 -1.1446
+0.29246 -0.21075 -1.1445
+0.29664 -0.21066 -1.144
+0.30084 -0.21058 -1.1436
+0.30503 -0.21049 -1.1432
+0.30934 -0.2105 -1.1433
+0.31354 -0.21042 -1.1428
+0.31778 -0.21037 -1.1426
+0.32209 -0.21038 -1.1427
+0.32625 -0.21028 -1.1422
+0.3306 -0.21031 -1.1424
+0.33514 -0.21046 -1.1433
+0.33969 -0.2106 -1.1441
+0.34175 -0.21055 -1.1438
+0.34411 -0.21067 -1.1445
+0.34515 -0.21065 -1.1444
+-0.11577 -0.20684 -1.1171
+-0.079502 -0.20567 -1.1108
+-0.077787 -0.20668 -1.1163
+-0.071519 -0.20682 -1.1171
+-0.070482 -0.20686 -1.1173
+-0.069485 -0.20703 -1.1182
+0.002229 -0.20869 -1.1273
+0.003302 -0.20936 -1.131
+0.004401 -0.21094 -1.1397
+0.006574 -0.21172 -1.1439
+0.10903 -0.20969 -1.1327
+0.11012 -0.20974 -1.133
+0.11122 -0.20979 -1.1332
+0.11234 -0.20989 -1.1338
+0.11346 -0.20998 -1.1343
+0.34211 -0.21118 -1.1414
+0.34329 -0.21125 -1.1418
+0.34459 -0.21139 -1.1426
+-0.32565 -0.21359 -1.1485
+-0.32352 -0.21361 -1.1486
+-0.32141 -0.21365 -1.1488
+-0.31928 -0.21367 -1.1489
+-0.31085 -0.21383 -1.1497
+-0.29097 -0.21198 -1.1395
+-0.28583 -0.21135 -1.136
+-0.12409 -0.21314 -1.1456
+-0.12193 -0.21315 -1.1457
+-0.12062 -0.21273 -1.1434
+-0.11447 -0.20744 -1.1147
+-0.11212 -0.20699 -1.1122
+-0.10979 -0.20656 -1.1098
+-0.1075 -0.20618 -1.1078
+-0.082428 -0.20618 -1.1078
+-0.080531 -0.20667 -1.1105
+-0.078812 -0.20766 -1.1159
+-0.076847 -0.20804 -1.1179
+-0.074745 -0.20805 -1.1181
+-0.07267 -0.20815 -1.1186
+-0.070645 -0.2084 -1.1199
+-0.068623 -0.20867 -1.1214
+-0.066524 -0.20872 -1.1217
+-0.062145 -0.20822 -1.119
+-0.060007 -0.20812 -1.1184
+-0.05788 -0.20806 -1.1181
+-0.055735 -0.20793 -1.1174
+-0.053601 -0.20782 -1.1168
+-0.051478 -0.20775 -1.1164
+-0.049365 -0.20772 -1.1163
+-0.047242 -0.20764 -1.1158
+-0.045128 -0.2076 -1.1156
+-0.043008 -0.20752 -1.1152
+-0.040886 -0.20742 -1.1146
+-0.036657 -0.20728 -1.1139
+-0.034549 -0.20723 -1.1136
+-0.032442 -0.20719 -1.1134
+-0.030346 -0.20722 -1.1135
+-0.028248 -0.20723 -1.1136
+-0.024051 -0.20726 -1.1138
+-0.021955 -0.20729 -1.1139
+-0.019865 -0.2074 -1.1146
+-0.015679 -0.20764 -1.1158
+-0.013582 -0.20775 -1.1164
+-0.011486 -0.20791 -1.1173
+-0.009386 -0.20806 -1.1181
+-0.007285 -0.20827 -1.1193
+-0.005181 -0.20855 -1.1208
+-0.003072 -0.20887 -1.1226
+-0.000958 -0.20932 -1.125
+0.001166 -0.20974 -1.1273
+0.002235 -0.21038 -1.1308
+0.00332 -0.21155 -1.1371
+0.005486 -0.21241 -1.1418
+0.007638 -0.2124 -1.1417
+0.00979 -0.2124 -1.1417
+0.099117 -0.21012 -1.1293
+0.10335 -0.21007 -1.129
+0.10762 -0.2101 -1.1291
+0.10982 -0.21022 -1.1298
+0.11202 -0.21036 -1.1305
+0.11424 -0.21051 -1.1314
+0.11647 -0.21069 -1.1323
+0.34033 -0.21182 -1.139
+0.34253 -0.21185 -1.1392
+0.34367 -0.2119 -1.1395
+-0.32386 -0.21421 -1.146
+-0.32174 -0.21424 -1.1461
+-0.12044 -0.21349 -1.1417
+-0.11927 -0.21332 -1.1408
+-0.079842 -0.20866 -1.1156
+-0.07797 -0.20927 -1.1189
+-0.05685 -0.20921 -1.1186
+-0.033501 -0.20829 -1.1137
+-0.032449 -0.20828 -1.1136
+-0.031399 -0.20828 -1.1136
+-0.023007 -0.20836 -1.114
+-0.012537 -0.20893 -1.1171
+-0.011492 -0.20908 -1.1179
+-0.010438 -0.20908 -1.1179
+-0.008339 -0.20932 -1.1192
+-0.007289 -0.20944 -1.1199
+-0.006238 -0.20963 -1.1209
+0.000103 -0.21088 -1.1277
+0.002245 -0.21238 -1.1358
+0.34067 -0.21243 -1.1366
+0.34174 -0.21243 -1.1366
+0.34285 -0.21246 -1.1367
+-0.32314 -0.21481 -1.1434
+-0.32205 -0.2148 -1.1433
+-0.31997 -0.21485 -1.1436
+-0.31588 -0.215 -1.1443
+-0.3115 -0.21495 -1.1441
+-0.30927 -0.2149 -1.1438
+-0.30706 -0.21487 -1.1436
+-0.30243 -0.21464 -1.1423
+-0.29713 -0.21392 -1.1384
+-0.29177 -0.21314 -1.1342
+-0.28685 -0.21266 -1.1316
+-0.28204 -0.21226 -1.1294
+-0.27775 -0.21223 -1.1292
+-0.2737 -0.21239 -1.1301
+-0.26959 -0.21252 -1.1307
+-0.26574 -0.21285 -1.1325
+-0.2619 -0.2132 -1.1344
+-0.25815 -0.21363 -1.1367
+-0.2543 -0.214 -1.1386
+-0.25043 -0.21436 -1.1406
+-0.24642 -0.21462 -1.1419
+-0.24228 -0.21476 -1.1427
+-0.23821 -0.21498 -1.1439
+-0.23381 -0.2149 -1.1434
+-0.22942 -0.21483 -1.143
+-0.22518 -0.2149 -1.1434
+-0.22081 -0.21484 -1.1431
+-0.21653 -0.21487 -1.1432
+-0.21217 -0.21482 -1.143
+-0.20786 -0.21481 -1.1429
+-0.20354 -0.21481 -1.1429
+-0.19922 -0.2148 -1.1429
+-0.19483 -0.21471 -1.1423
+-0.19056 -0.21475 -1.1426
+-0.1862 -0.21469 -1.1423
+-0.18198 -0.21479 -1.1428
+-0.17756 -0.21466 -1.1421
+-0.17322 -0.21463 -1.1419
+-0.16893 -0.21464 -1.142
+-0.16461 -0.21463 -1.142
+-0.16032 -0.21465 -1.1421
+-0.15598 -0.2146 -1.1418
+-0.15162 -0.21453 -1.1414
+-0.1472 -0.21435 -1.1405
+-0.14278 -0.21417 -1.1395
+-0.13851 -0.21422 -1.1398
+-0.13426 -0.2143 -1.1402
+-0.13 -0.21435 -1.1405
+-0.12576 -0.21446 -1.1411
+-0.12145 -0.21444 -1.141
+-0.11913 -0.21415 -1.1394
+-0.1178 -0.21369 -1.137
+-0.11224 -0.20931 -1.1134
+-0.10985 -0.20876 -1.1104
+-0.1054 -0.20824 -1.1076
+-0.10108 -0.20796 -1.1061
+-0.096832 -0.20779 -1.1052
+-0.092701 -0.20788 -1.1057
+-0.088626 -0.2081 -1.1069
+-0.084582 -0.20843 -1.1087
+-0.082629 -0.20877 -1.1106
+-0.080895 -0.20971 -1.1156
+-0.080043 -0.21024 -1.1184
+-0.079061 -0.21043 -1.1195
+-0.077024 -0.21063 -1.1206
+-0.072945 -0.21106 -1.1228
+-0.068792 -0.2113 -1.1242
+-0.064543 -0.21128 -1.1241
+-0.060228 -0.21101 -1.1226
+-0.058064 -0.21084 -1.1217
+-0.055914 -0.21071 -1.121
+-0.051632 -0.21049 -1.1198
+-0.047352 -0.21023 -1.1184
+-0.045206 -0.21007 -1.1175
+-0.043081 -0.20998 -1.1171
+-0.040958 -0.20989 -1.1166
+-0.038846 -0.20986 -1.1164
+-0.034599 -0.20964 -1.1153
+-0.032488 -0.20959 -1.115
+-0.030383 -0.20957 -1.1149
+-0.026185 -0.20963 -1.1152
+-0.024089 -0.20969 -1.1155
+-0.021988 -0.20971 -1.1157
+-0.017791 -0.20984 -1.1163
+-0.013603 -0.21017 -1.1181
+-0.011502 -0.21032 -1.1189
+-0.009407 -0.21065 -1.1207
+-0.007303 -0.21091 -1.1221
+-0.005197 -0.21132 -1.1243
+-0.003083 -0.21174 -1.1266
+-0.000962 -0.21238 -1.13
+0.001173 -0.21316 -1.1342
+0.00332 -0.21374 -1.1374
+0.007604 -0.21361 -1.1366
+0.011889 -0.21358 -1.1365
+0.016175 -0.2136 -1.1366
+0.020474 -0.21373 -1.1373
+0.024779 -0.21388 -1.1381
+0.029083 -0.21398 -1.1386
+0.033381 -0.214 -1.1388
+0.03767 -0.21397 -1.1386
+0.041941 -0.21386 -1.138
+0.046219 -0.2138 -1.1377
+0.050517 -0.21384 -1.1379
+0.054771 -0.2137 -1.1371
+0.05901 -0.21352 -1.1361
+0.063244 -0.21335 -1.1352
+0.06746 -0.21315 -1.1341
+0.071683 -0.21299 -1.1332
+0.075884 -0.21279 -1.1322
+0.080076 -0.21258 -1.131
+0.084228 -0.21229 -1.1295
+0.088375 -0.21202 -1.128
+0.092509 -0.21175 -1.1266
+0.096663 -0.21154 -1.1254
+0.10082 -0.21135 -1.1244
+0.10505 -0.21133 -1.1243
+0.10928 -0.21131 -1.1242
+0.11364 -0.21154 -1.1254
+0.11798 -0.21171 -1.1263
+0.12238 -0.21198 -1.1278
+0.12683 -0.2123 -1.1295
+0.13123 -0.21254 -1.1307
+0.13564 -0.21277 -1.132
+0.14007 -0.21301 -1.1333
+0.14448 -0.21321 -1.1343
+0.14882 -0.2133 -1.1348
+0.15314 -0.21336 -1.1351
+0.15743 -0.21336 -1.1351
+0.16177 -0.21344 -1.1356
+0.16613 -0.21354 -1.1361
+0.17045 -0.21358 -1.1363
+0.17472 -0.21357 -1.1362
+0.17898 -0.21354 -1.1361
+0.18318 -0.21344 -1.1355
+0.18743 -0.21341 -1.1354
+0.19173 -0.21342 -1.1354
+0.1961 -0.21352 -1.136
+0.20035 -0.21348 -1.1357
+0.20473 -0.21358 -1.1363
+0.20889 -0.21346 -1.1356
+0.2131 -0.21338 -1.1352
+0.21731 -0.21332 -1.1349
+0.2216 -0.21332 -1.1349
+0.22577 -0.21321 -1.1343
+0.22999 -0.21316 -1.1341
+0.2344 -0.21329 -1.1347
+0.23876 -0.21336 -1.1351
+0.24304 -0.21335 -1.1351
+0.24728 -0.21332 -1.1349
+0.25153 -0.2133 -1.1348
+0.25573 -0.21323 -1.1345
+0.26007 -0.21328 -1.1348
+0.26446 -0.21337 -1.1353
+0.26868 -0.21332 -1.135
+0.27297 -0.21333 -1.1351
+0.27731 -0.21338 -1.1354
+0.28156 -0.21335 -1.1353
+0.2858 -0.21332 -1.1351
+0.29011 -0.21335 -1.1353
+0.29426 -0.21325 -1.1348
+0.29835 -0.21312 -1.1341
+0.30246 -0.21299 -1.1335
+0.30667 -0.21295 -1.1333
+0.31097 -0.21297 -1.1334
+0.31533 -0.21303 -1.1337
+0.31961 -0.21303 -1.1338
+0.32405 -0.21314 -1.1344
+0.32834 -0.21315 -1.1346
+0.33272 -0.21322 -1.1349
+0.33689 -0.21315 -1.1346
+0.339 -0.21313 -1.1345
+0.34134 -0.21326 -1.1353
+0.34195 -0.21297 -1.1337
+-0.32245 -0.21542 -1.1409
+-0.32026 -0.2154 -1.1408
+-0.30756 -0.21554 -1.1414
+-0.11783 -0.21481 -1.1372
+-0.11618 -0.21375 -1.1316
+-0.11113 -0.21026 -1.1128
+-0.080134 -0.21153 -1.1197
+-0.078125 -0.21181 -1.1212
+-0.00415 -0.21302 -1.1277
+-0.003088 -0.21316 -1.1285
+-0.002027 -0.2134 -1.1298
+-0.000963 -0.21374 -1.1316
+0.000104 -0.21398 -1.1329
+0.002244 -0.21438 -1.135
+0.33947 -0.21382 -1.1325
+0.34034 -0.2137 -1.1319
+0.34132 -0.21365 -1.1316
+-0.32178 -0.21605 -1.1385
+-0.32071 -0.21605 -1.1385
+-0.31859 -0.21607 -1.1386
+-0.3165 -0.21611 -1.1388
+-0.30805 -0.2162 -1.1392
+-0.30695 -0.21618 -1.1391
+-0.30572 -0.21607 -1.1385
+-0.30323 -0.21583 -1.1372
+-0.11886 -0.21581 -1.1368
+-0.11776 -0.21575 -1.1365
+-0.11646 -0.21534 -1.1343
+-0.11503 -0.21466 -1.1307
+-0.11153 -0.21207 -1.1169
+-0.1101 -0.21133 -1.1129
+-0.10772 -0.21079 -1.1101
+-0.10553 -0.2106 -1.1091
+-0.10332 -0.21036 -1.1078
+-0.099116 -0.2103 -1.1075
+-0.096991 -0.21022 -1.1071
+-0.094879 -0.21017 -1.1068
+-0.092816 -0.21023 -1.1071
+-0.090793 -0.21038 -1.1079
+-0.088783 -0.21057 -1.1089
+-0.086775 -0.21077 -1.11
+-0.084815 -0.2111 -1.1118
+-0.083042 -0.21193 -1.1162
+-0.081275 -0.21281 -1.1209
+-0.079241 -0.21303 -1.122
+-0.077255 -0.21338 -1.1239
+-0.075238 -0.21367 -1.1255
+-0.073209 -0.21395 -1.1269
+-0.071196 -0.21428 -1.1287
+-0.069105 -0.2144 -1.1294
+-0.066976 -0.2144 -1.1294
+-0.06484 -0.21438 -1.1293
+-0.062613 -0.21405 -1.1275
+-0.060437 -0.21387 -1.1266
+-0.058299 -0.21382 -1.1263
+-0.056142 -0.21369 -1.1256
+-0.05401 -0.21365 -1.1254
+-0.051828 -0.21341 -1.1241
+-0.049675 -0.21326 -1.1233
+-0.047521 -0.2131 -1.1225
+-0.045372 -0.21295 -1.1217
+-0.041099 -0.21273 -1.1205
+-0.038961 -0.21259 -1.1198
+-0.036845 -0.21257 -1.1196
+-0.032597 -0.2124 -1.1187
+-0.030466 -0.21225 -1.1179
+-0.028354 -0.21223 -1.1178
+-0.026255 -0.21229 -1.1182
+-0.024146 -0.2123 -1.1182
+-0.022047 -0.21239 -1.1187
+-0.019945 -0.21246 -1.1191
+-0.017848 -0.21262 -1.1199
+-0.015753 -0.21285 -1.1212
+-0.01365 -0.21302 -1.1221
+-0.011548 -0.21327 -1.1234
+-0.009441 -0.21352 -1.1247
+-0.007332 -0.21388 -1.1267
+-0.005212 -0.21406 -1.1276
+-0.00309 -0.21432 -1.129
+-0.000963 -0.21464 -1.1307
+0.001172 -0.21504 -1.1328
+0.003308 -0.21509 -1.1331
+0.005444 -0.21506 -1.1329
+0.3376 -0.21438 -1.1298
+0.34001 -0.21456 -1.1308
+0.34095 -0.21448 -1.1304
+-0.32007 -0.21669 -1.1362
+-0.31901 -0.2167 -1.1363
+-0.30615 -0.21669 -1.1361
+-0.11752 -0.21639 -1.1342
+-0.11521 -0.21606 -1.1325
+-0.11228 -0.21455 -1.1244
+-0.10916 -0.21259 -1.1141
+-0.1079 -0.21218 -1.1119
+-0.10677 -0.21203 -1.1111
+-0.096031 -0.21145 -1.1081
+-0.094975 -0.21143 -1.1079
+-0.09393 -0.21143 -1.1079
+-0.087869 -0.21193 -1.1106
+-0.086884 -0.21208 -1.1114
+-0.085922 -0.21229 -1.1125
+-0.084957 -0.2125 -1.1136
+-0.084132 -0.21307 -1.1167
+-0.082321 -0.21384 -1.1207
+-0.078412 -0.21471 -1.1254
+-0.07635 -0.21488 -1.1262
+-0.075407 -0.21522 -1.128
+-0.074361 -0.21527 -1.1283
+-0.07015 -0.2154 -1.129
+-0.053005 -0.21494 -1.1266
+-0.051916 -0.21483 -1.126
+-0.050844 -0.21479 -1.1258
+-0.048692 -0.21466 -1.1251
+-0.016838 -0.21426 -1.123
+-0.015791 -0.21443 -1.1239
+-0.014733 -0.21445 -1.124
+-0.01368 -0.21455 -1.1245
+-0.012623 -0.21461 -1.1249
+-0.011571 -0.21476 -1.1257
+-0.010513 -0.21483 -1.1261
+-0.009455 -0.2149 -1.1264
+-0.008395 -0.21497 -1.1268
+-0.006274 -0.21508 -1.1274
+-0.002025 -0.21536 -1.1288
+-0.000962 -0.21558 -1.13
+0.000103 -0.21566 -1.1305
+0.002235 -0.21569 -1.1306
+0.33797 -0.21501 -1.1275
+0.33912 -0.21506 -1.1278
+0.34009 -0.215 -1.1275
+-0.31945 -0.21735 -1.134
+-0.3173 -0.21733 -1.134
+-0.31312 -0.2174 -1.1343
+-0.30887 -0.21742 -1.1343
+-0.30659 -0.21732 -1.1338
+-0.30413 -0.21709 -1.1325
+-0.29878 -0.21631 -1.1284
+-0.29353 -0.21558 -1.1245
+-0.28866 -0.2151 -1.122
+-0.28406 -0.21483 -1.1205
+-0.27973 -0.21474 -1.12
+-0.27564 -0.21485 -1.1206
+-0.27167 -0.21505 -1.1216
+-0.26782 -0.21535 -1.1232
+-0.26409 -0.21577 -1.1254
+-0.26041 -0.21624 -1.1278
+-0.25662 -0.21663 -1.1299
+-0.25275 -0.21697 -1.1316
+-0.24877 -0.21722 -1.1329
+-0.24469 -0.21739 -1.1338
+-0.24048 -0.21745 -1.1341
+-0.23624 -0.21749 -1.1343
+-0.23195 -0.21747 -1.1342
+-0.22763 -0.21743 -1.134
+-0.22334 -0.21742 -1.1339
+-0.21906 -0.21741 -1.1339
+-0.21475 -0.21738 -1.1337
+-0.21043 -0.21733 -1.1335
+-0.20617 -0.21735 -1.1336
+-0.20191 -0.21737 -1.1337
+-0.1976 -0.21733 -1.1335
+-0.19333 -0.21733 -1.1335
+-0.18902 -0.21729 -1.1333
+-0.18471 -0.21726 -1.1331
+-0.18047 -0.21729 -1.1333
+-0.17611 -0.21718 -1.1327
+-0.17185 -0.2172 -1.1328
+-0.16759 -0.21721 -1.1328
+-0.16325 -0.21713 -1.1324
+-0.15892 -0.21704 -1.1319
+-0.15448 -0.2168 -1.1307
+-0.15015 -0.21671 -1.1302
+-0.14588 -0.21669 -1.1301
+-0.14161 -0.21668 -1.1301
+-0.13749 -0.21691 -1.1313
+-0.13326 -0.21698 -1.1316
+-0.12903 -0.21704 -1.132
+-0.12477 -0.21706 -1.1321
+-0.12052 -0.21708 -1.1322
+-0.11838 -0.21708 -1.1322
+-0.11627 -0.21712 -1.1324
+-0.11392 -0.21671 -1.1302
+-0.11111 -0.21539 -1.1233
+-0.10947 -0.21427 -1.1174
+-0.10827 -0.21397 -1.1158
+-0.1058 -0.21323 -1.1119
+-0.10363 -0.21308 -1.1111
+-0.10144 -0.21288 -1.11
+-0.097249 -0.21288 -1.1101
+-0.095148 -0.21286 -1.11
+-0.09306 -0.21287 -1.11
+-0.090953 -0.21284 -1.1099
+-0.089013 -0.21321 -1.1118
+-0.087093 -0.21364 -1.1141
+-0.08524 -0.21427 -1.1174
+-0.083509 -0.21524 -1.1225
+-0.08148 -0.21547 -1.1237
+-0.079461 -0.21574 -1.1252
+-0.077396 -0.2159 -1.126
+-0.075391 -0.21624 -1.1278
+-0.073284 -0.21629 -1.1281
+-0.071157 -0.21629 -1.1281
+-0.070087 -0.21627 -1.128
+-0.069013 -0.21624 -1.1278
+-0.064759 -0.21624 -1.1278
+-0.06263 -0.21623 -1.1278
+-0.060493 -0.21619 -1.1276
+-0.058348 -0.21613 -1.1272
+-0.0562 -0.21604 -1.1268
+-0.054055 -0.21596 -1.1263
+-0.05191 -0.21587 -1.1259
+-0.049772 -0.21581 -1.1256
+-0.047626 -0.2157 -1.125
+-0.045527 -0.2158 -1.1256
+-0.043397 -0.21576 -1.1253
+-0.041274 -0.21576 -1.1253
+-0.039149 -0.21574 -1.1252
+-0.03701 -0.21564 -1.1247
+-0.034891 -0.21565 -1.1247
+-0.032747 -0.2155 -1.124
+-0.030635 -0.21555 -1.1242
+-0.028523 -0.21561 -1.1245
+-0.026403 -0.21561 -1.1246
+-0.024285 -0.21563 -1.1247
+-0.022164 -0.21563 -1.1247
+-0.020043 -0.21563 -1.1246
+-0.01793 -0.21573 -1.1252
+-0.015809 -0.21573 -1.1252
+-0.013688 -0.21574 -1.1252
+-0.011569 -0.21578 -1.1254
+-0.009453 -0.21592 -1.1262
+-0.007332 -0.21599 -1.1266
+-0.005209 -0.21604 -1.1268
+-0.003084 -0.21602 -1.1267
+-0.000959 -0.21606 -1.1269
+0.001167 -0.21628 -1.1281
+0.003296 -0.21642 -1.1288
+0.007547 -0.21627 -1.128
+0.011794 -0.21613 -1.1273
+0.016035 -0.216 -1.1266
+0.020276 -0.21592 -1.1262
+0.024535 -0.21602 -1.1267
+0.028798 -0.21613 -1.1273
+0.033073 -0.21629 -1.1281
+0.037341 -0.21637 -1.1285
+0.041588 -0.21632 -1.1283
+0.045833 -0.21627 -1.128
+0.050102 -0.21634 -1.1284
+0.05437 -0.21639 -1.1286
+0.058623 -0.21638 -1.1286
+0.062843 -0.21625 -1.1279
+0.067022 -0.21601 -1.1266
+0.071247 -0.21594 -1.1263
+0.075428 -0.21575 -1.1252
+0.079595 -0.21554 -1.1241
+0.083731 -0.21528 -1.1227
+0.087875 -0.21506 -1.1216
+0.091977 -0.21476 -1.12
+0.096052 -0.21443 -1.1182
+0.10015 -0.21418 -1.1169
+0.10428 -0.21399 -1.1159
+0.10845 -0.21391 -1.1155
+0.11266 -0.21393 -1.1156
+0.11696 -0.2141 -1.1164
+0.12122 -0.21419 -1.1169
+0.12551 -0.21432 -1.1176
+0.12984 -0.2145 -1.1186
+0.13414 -0.21464 -1.1193
+0.13859 -0.21499 -1.1211
+0.14298 -0.21523 -1.1224
+0.14731 -0.21537 -1.1231
+0.15168 -0.21556 -1.1241
+0.15592 -0.21556 -1.1241
+0.16018 -0.21559 -1.1243
+0.16447 -0.21565 -1.1246
+0.16884 -0.21582 -1.1255
+0.17319 -0.21595 -1.1262
+0.17747 -0.21599 -1.1264
+0.18176 -0.21604 -1.1266
+0.18603 -0.21606 -1.1268
+0.19025 -0.21603 -1.1266
+0.19453 -0.21606 -1.1268
+0.19874 -0.21602 -1.1265
+0.20298 -0.21601 -1.1265
+0.20711 -0.21589 -1.1258
+0.21129 -0.21582 -1.1255
+0.21544 -0.21572 -1.125
+0.21971 -0.21574 -1.1251
+0.2239 -0.2157 -1.1249
+0.22832 -0.21587 -1.1258
+0.2326 -0.2159 -1.1259
+0.23695 -0.21599 -1.1264
+0.24124 -0.21603 -1.1267
+0.2454 -0.21595 -1.1262
+0.24951 -0.21583 -1.1256
+0.25378 -0.21585 -1.1258
+0.25804 -0.21587 -1.1258
+0.26238 -0.21594 -1.1262
+0.26653 -0.21586 -1.1258
+0.27074 -0.21584 -1.1257
+0.27508 -0.21591 -1.1261
+0.27917 -0.21579 -1.1255
+0.28347 -0.21583 -1.1258
+0.28779 -0.21588 -1.1261
+0.29172 -0.21566 -1.1249
+0.29592 -0.21562 -1.1247
+0.29999 -0.2155 -1.1241
+0.30423 -0.2155 -1.1242
+0.30858 -0.21558 -1.1246
+0.31292 -0.21565 -1.125
+0.31725 -0.21571 -1.1254
+0.32156 -0.21575 -1.1257
+0.32555 -0.21558 -1.1248
+0.32988 -0.21564 -1.1252
+0.33399 -0.21556 -1.1248
+0.33606 -0.21552 -1.1246
+0.33812 -0.21549 -1.1245
+0.33922 -0.21551 -1.1246
+-0.31781 -0.21802 -1.132
+-0.11496 -0.21773 -1.13
+-0.11389 -0.21773 -1.13
+-0.11257 -0.21724 -1.1274
+-0.10862 -0.21571 -1.1194
+-0.10732 -0.21524 -1.1169
+-0.080451 -0.21661 -1.1242
+-0.079445 -0.21676 -1.1249
+-0.078424 -0.21687 -1.1255
+-0.077376 -0.2169 -1.1257
+-0.07632 -0.21692 -1.1258
+-0.075259 -0.21692 -1.1258
+-0.074189 -0.2169 -1.1257
+-0.072007 -0.21672 -1.1247
+-0.07093 -0.21667 -1.1245
+-0.061403 -0.21672 -1.1247
+-0.060358 -0.21677 -1.1251
+-0.059308 -0.21681 -1.1253
+-0.058247 -0.21681 -1.1253
+-0.05718 -0.21679 -1.1251
+-0.056119 -0.21679 -1.1251
+-0.055058 -0.21679 -1.1251
+-0.05401 -0.21684 -1.1254
+-0.052949 -0.21684 -1.1254
+-0.051888 -0.21684 -1.1254
+-0.050831 -0.21686 -1.1255
+-0.049758 -0.21681 -1.1252
+-0.048677 -0.21671 -1.1248
+-0.047617 -0.21671 -1.1248
+-0.046579 -0.21682 -1.1253
+-0.045518 -0.21682 -1.1253
+-0.044449 -0.21678 -1.1251
+-0.043388 -0.21678 -1.1251
+-0.042328 -0.21678 -1.1251
+-0.041266 -0.21678 -1.1251
+-0.040191 -0.2167 -1.1247
+-0.039142 -0.21676 -1.125
+-0.038062 -0.21666 -1.1245
+-0.037002 -0.21666 -1.1245
+-0.035942 -0.21666 -1.1245
+-0.034884 -0.21667 -1.1245
+-0.033808 -0.21657 -1.124
+-0.031681 -0.21652 -1.1237
+-0.029573 -0.2166 -1.1242
+-0.028517 -0.21663 -1.1243
+-0.027457 -0.21663 -1.1243
+-0.02322 -0.21665 -1.1244
+-0.018983 -0.21669 -1.1247
+-0.017927 -0.21674 -1.1249
+-0.016866 -0.21674 -1.1249
+-0.015806 -0.21674 -1.1249
+-0.014746 -0.21676 -1.125
+-0.013686 -0.21676 -1.125
+-0.012621 -0.21668 -1.1246
+-0.01156 -0.21668 -1.1246
+-0.0105 -0.21669 -1.1246
+-0.009441 -0.21672 -1.1248
+-0.008382 -0.21676 -1.125
+-0.007322 -0.21676 -1.125
+-0.006255 -0.21656 -1.124
+0.33622 -0.21601 -1.1216
+0.33726 -0.21599 -1.1216
+0.33847 -0.2161 -1.1221
+-0.31815 -0.21859 -1.1293
+-0.31618 -0.2187 -1.1299
+-0.31405 -0.2187 -1.1299
+-0.30514 -0.21842 -1.1284
+-0.11791 -0.21833 -1.1276
+-0.11577 -0.21832 -1.1275
+-0.11361 -0.21826 -1.1272
+-0.11133 -0.21795 -1.1256
+-0.11007 -0.21756 -1.1236
+-0.10758 -0.2168 -1.1196
+-0.1064 -0.21655 -1.1183
+-0.10404 -0.21603 -1.1156
+-0.10183 -0.21581 -1.1144
+-0.099681 -0.2157 -1.1139
+-0.097581 -0.21571 -1.1139
+-0.095487 -0.21572 -1.114
+-0.093446 -0.21586 -1.1147
+-0.091478 -0.21618 -1.1163
+-0.089485 -0.21645 -1.1178
+-0.087507 -0.21677 -1.1194
+-0.08557 -0.21721 -1.1218
+-0.083553 -0.21747 -1.1231
+-0.081422 -0.21743 -1.1229
+-0.079305 -0.21743 -1.1229
+-0.077166 -0.21737 -1.1226
+-0.075017 -0.21728 -1.1221
+-0.072873 -0.2172 -1.1217
+-0.071802 -0.21716 -1.1215
+-0.053834 -0.21719 -1.1217
+-0.051714 -0.21717 -1.1216
+-0.049599 -0.21717 -1.1216
+-0.047518 -0.21733 -1.1224
+-0.045402 -0.21733 -1.1224
+-0.043283 -0.21732 -1.1224
+-0.041159 -0.21728 -1.1221
+-0.039049 -0.21731 -1.1223
+-0.037989 -0.2173 -1.1222
+-0.032704 -0.21734 -1.1225
+-0.030586 -0.21732 -1.1224
+-0.029522 -0.21728 -1.1222
+-0.028464 -0.21728 -1.1222
+-0.027418 -0.21738 -1.1227
+-0.026365 -0.21742 -1.1229
+-0.024246 -0.21741 -1.1229
+-0.023188 -0.21741 -1.1229
+-0.022135 -0.21747 -1.1231
+-0.020009 -0.21738 -1.1227
+-0.01895 -0.21738 -1.1227
+-0.01789 -0.21736 -1.1226
+-0.015765 -0.21724 -1.122
+-0.013649 -0.21724 -1.122
+-0.011531 -0.21719 -1.1217
+-0.009414 -0.21716 -1.1215
+-0.006237 -0.21698 -1.1206
+-0.005178 -0.2169 -1.1202
+-0.003066 -0.2169 -1.1202
+-0.000954 -0.21704 -1.1209
+0.001162 -0.21749 -1.1233
+0.003285 -0.21782 -1.125
+0.005404 -0.21772 -1.1245
+0.33471 -0.21677 -1.1201
+0.33679 -0.21675 -1.12
+0.3378 -0.21672 -1.1198
+-0.3175 -0.21921 -1.1271
+-0.31654 -0.21928 -1.1274
+-0.11001 -0.21849 -1.1229
+-0.10881 -0.21821 -1.1214
+-0.1076 -0.21791 -1.1198
+-0.10539 -0.21769 -1.1187
+-0.10427 -0.21756 -1.118
+-0.10317 -0.21747 -1.1176
+-0.10096 -0.21725 -1.1164
+-0.099905 -0.21724 -1.1164
+-0.09884 -0.21722 -1.1163
+-0.097787 -0.21722 -1.1163
+-0.096708 -0.21716 -1.1159
+-0.095715 -0.21729 -1.1166
+-0.094691 -0.21735 -1.117
+-0.093707 -0.21752 -1.1178
+-0.092679 -0.21758 -1.1181
+-0.091711 -0.21778 -1.1192
+-0.090662 -0.2178 -1.1193
+-0.089606 -0.2178 -1.1193
+-0.088567 -0.21784 -1.1195
+-0.086527 -0.21802 -1.1204
+-0.071538 -0.21741 -1.1173
+-0.070484 -0.21741 -1.1173
+-0.059893 -0.21721 -1.1163
+-0.058841 -0.21721 -1.1163
+-0.057782 -0.21719 -1.1162
+-0.056756 -0.21729 -1.1167
+-0.028386 -0.21774 -1.1191
+-0.022064 -0.21783 -1.1195
+-0.021009 -0.21783 -1.1195
+-0.019944 -0.21773 -1.119
+-0.006217 -0.21733 -1.1169
+-0.004108 -0.2172 -1.1162
+-0.003057 -0.21729 -1.1167
+-0.002009 -0.21791 -1.12
+-0.000954 -0.21799 -1.1203
+0.000103 -0.21811 -1.121
+0.002219 -0.21835 -1.1222
+0.33491 -0.21727 -1.1172
+0.33597 -0.21728 -1.1172
+0.33671 -0.21708 -1.1162
+-0.31593 -0.21991 -1.1252
+-0.31492 -0.21995 -1.1254
+-0.31059 -0.21989 -1.125
+-0.30575 -0.21946 -1.1228
+-0.30059 -0.21878 -1.1192
+-0.29542 -0.21809 -1.1156
+-0.29048 -0.21753 -1.1127
+-0.28599 -0.21731 -1.1115
+-0.28173 -0.21726 -1.1112
+-0.2776 -0.21731 -1.1114
+-0.27372 -0.21755 -1.1127
+-0.26997 -0.21791 -1.1145
+-0.26623 -0.21829 -1.1165
+-0.26257 -0.21875 -1.1188
+-0.25881 -0.21914 -1.1208
+-0.25505 -0.21954 -1.1229
+-0.25112 -0.21981 -1.1242
+-0.24696 -0.21989 -1.1246
+-0.24278 -0.21994 -1.1249
+-0.23858 -0.21998 -1.1251
+-0.23428 -0.21992 -1.1248
+-0.23011 -0.22 -1.1252
+-0.22579 -0.21992 -1.1247
+-0.22155 -0.21992 -1.1248
+-0.21725 -0.21986 -1.1244
+-0.21302 -0.21987 -1.1245
+-0.20882 -0.21992 -1.1247
+-0.20452 -0.21986 -1.1244
+-0.20024 -0.21981 -1.1241
+-0.196 -0.21982 -1.1242
+-0.19172 -0.21977 -1.1239
+-0.18747 -0.21976 -1.1239
+-0.18319 -0.21971 -1.1236
+-0.17897 -0.21972 -1.1237
+-0.17474 -0.21974 -1.1238
+-0.17045 -0.21968 -1.1235
+-0.16607 -0.21948 -1.1225
+-0.1617 -0.21929 -1.1215
+-0.15737 -0.21915 -1.1208
+-0.15304 -0.21901 -1.12
+-0.1489 -0.21913 -1.1207
+-0.14477 -0.21928 -1.1214
+-0.14066 -0.21946 -1.1224
+-0.13647 -0.21954 -1.1228
+-0.13225 -0.21956 -1.1229
+-0.12804 -0.21961 -1.1232
+-0.12381 -0.21961 -1.1232
+-0.11954 -0.21956 -1.1229
+-0.1153 -0.21954 -1.1228
+-0.11096 -0.21934 -1.1218
+-0.10874 -0.21914 -1.1207
+-0.10645 -0.21876 -1.1188
+-0.10425 -0.21857 -1.1178
+-0.10208 -0.21844 -1.1171
+-0.099959 -0.21841 -1.117
+-0.097816 -0.21833 -1.1166
+-0.095735 -0.21839 -1.1169
+-0.093689 -0.21853 -1.1176
+-0.091693 -0.21879 -1.119
+-0.089588 -0.21881 -1.1191
+-0.087501 -0.21887 -1.1194
+-0.08539 -0.21887 -1.1194
+-0.081062 -0.21858 -1.1179
+-0.078836 -0.21825 -1.1162
+-0.076696 -0.21816 -1.1157
+-0.07457 -0.21809 -1.1154
+-0.072452 -0.21805 -1.1151
+-0.070234 -0.21769 -1.1133
+-0.069222 -0.21781 -1.1139
+-0.068065 -0.21747 -1.1121
+-0.065977 -0.2175 -1.1123
+-0.064928 -0.2175 -1.1123
+-0.05977 -0.21781 -1.1139
+-0.057656 -0.21777 -1.1137
+-0.055535 -0.21768 -1.1133
+-0.053456 -0.21777 -1.1137
+-0.051354 -0.21776 -1.1137
+-0.049274 -0.21785 -1.1141
+-0.048255 -0.21799 -1.1149
+-0.047148 -0.21773 -1.1135
+-0.015667 -0.21799 -1.1149
+-0.013544 -0.21767 -1.1132
+-0.012511 -0.21796 -1.1147
+-0.011452 -0.21781 -1.1139
+-0.00934 -0.21755 -1.1126
+-0.007245 -0.21765 -1.1131
+-0.005149 -0.21776 -1.1137
+-0.003054 -0.21814 -1.1157
+-0.000952 -0.21854 -1.1177
+0.001159 -0.21906 -1.1204
+0.003271 -0.21903 -1.1203
+0.007495 -0.21899 -1.1201
+0.011708 -0.21879 -1.119
+0.015908 -0.2185 -1.1175
+0.020111 -0.21838 -1.1169
+0.02431 -0.21826 -1.1163
+0.028521 -0.21827 -1.1163
+0.032741 -0.21833 -1.1166
+0.036964 -0.2184 -1.117
+0.041201 -0.21853 -1.1176
+0.045418 -0.21854 -1.1177
+0.049653 -0.21862 -1.1181
+0.053902 -0.21875 -1.1188
+0.058155 -0.21887 -1.1194
+0.062378 -0.21888 -1.1195
+0.066578 -0.21881 -1.1191
+0.070776 -0.21874 -1.1187
+0.074972 -0.21867 -1.1183
+0.079114 -0.21846 -1.1173
+0.083223 -0.21818 -1.1158
+0.087349 -0.21798 -1.1148
+0.091402 -0.21762 -1.1129
+0.095449 -0.21727 -1.1111
+0.099477 -0.21692 -1.1093
+0.10358 -0.21674 -1.1084
+0.10767 -0.21657 -1.1074
+0.11182 -0.2165 -1.1071
+0.11597 -0.21646 -1.1068
+0.12023 -0.21662 -1.1077
+0.12445 -0.2167 -1.1081
+0.12868 -0.21677 -1.1084
+0.1329 -0.21684 -1.1088
+0.13716 -0.21696 -1.1094
+0.1414 -0.21704 -1.1098
+0.14567 -0.21717 -1.1105
+0.15003 -0.21742 -1.1118
+0.15428 -0.21749 -1.1121
+0.15852 -0.21756 -1.1125
+0.16273 -0.21758 -1.1126
+0.16709 -0.21779 -1.1137
+0.17139 -0.21792 -1.1143
+0.17568 -0.21801 -1.1149
+0.18 -0.21815 -1.1156
+0.18422 -0.21817 -1.1157
+0.18851 -0.21826 -1.1161
+0.19273 -0.21828 -1.1162
+0.19692 -0.21826 -1.1161
+0.20111 -0.21823 -1.116
+0.20526 -0.21817 -1.1157
+0.20948 -0.21818 -1.1157
+0.2137 -0.21819 -1.1158
+0.21787 -0.21815 -1.1156
+0.22221 -0.21828 -1.1163
+0.22647 -0.21833 -1.1165
+0.23068 -0.21833 -1.1165
+0.23488 -0.21831 -1.1165
+0.23911 -0.21834 -1.1166
+0.24324 -0.21826 -1.1162
+0.24745 -0.21826 -1.1162
+0.25158 -0.2182 -1.1159
+0.25586 -0.21826 -1.1162
+0.26012 -0.2183 -1.1164
+0.26445 -0.21839 -1.117
+0.26864 -0.21837 -1.1169
+0.27274 -0.21829 -1.1165
+0.27708 -0.21839 -1.117
+0.2813 -0.2184 -1.1171
+0.28549 -0.21837 -1.117
+0.2896 -0.2183 -1.1166
+0.29363 -0.21817 -1.116
+0.29771 -0.21807 -1.1155
+0.3018 -0.21799 -1.1151
+0.30588 -0.2179 -1.1147
+0.31022 -0.21799 -1.1152
+0.31454 -0.21807 -1.1157
+0.31861 -0.21798 -1.1152
+0.32291 -0.21805 -1.1156
+0.32699 -0.21796 -1.1152
+0.33105 -0.21787 -1.1148
+0.33304 -0.21779 -1.1144
+0.33494 -0.21766 -1.1138
+0.33615 -0.21776 -1.1143
+-0.31529 -0.22053 -1.1229
+-0.10954 -0.21968 -1.1181
+-0.10737 -0.21955 -1.1174
+-0.10525 -0.21953 -1.1173
+-0.10419 -0.21951 -1.1172
+-0.10312 -0.21946 -1.117
+-0.10205 -0.21943 -1.1168
+-0.101 -0.21943 -1.1168
+-0.099939 -0.21942 -1.1168
+-0.098849 -0.21934 -1.1164
+-0.097796 -0.21934 -1.1164
+-0.096769 -0.2194 -1.1166
+-0.095716 -0.2194 -1.1166
+-0.094673 -0.21942 -1.1168
+-0.092571 -0.21943 -1.1168
+-0.091507 -0.2194 -1.1167
+-0.09044 -0.21937 -1.1165
+-0.079766 -0.21897 -1.1145
+-0.078665 -0.21883 -1.1137
+-0.077593 -0.21877 -1.1134
+-0.075338 -0.21832 -1.1111
+-0.074313 -0.21839 -1.1115
+-0.073302 -0.2185 -1.112
+-0.072289 -0.21861 -1.1126
+-0.071247 -0.21863 -1.1127
+-0.0691 -0.21848 -1.1119
+-0.064891 -0.21842 -1.1117
+-0.063842 -0.21842 -1.1117
+-0.062776 -0.21836 -1.1113
+-0.061729 -0.21836 -1.1113
+-0.060648 -0.21825 -1.1108
+-0.052219 -0.21804 -1.1097
+-0.051173 -0.21804 -1.1097
+-0.05016 -0.21818 -1.1104
+-0.049113 -0.21819 -1.1105
+-0.048119 -0.21843 -1.1117
+-0.045973 -0.21819 -1.1105
+-0.044925 -0.21819 -1.1105
+-0.043878 -0.21819 -1.1105
+-0.042865 -0.21836 -1.1114
+-0.041778 -0.21816 -1.1103
+-0.028199 -0.2184 -1.1116
+-0.02191 -0.21841 -1.1116
+-0.020859 -0.21837 -1.1114
+-0.019811 -0.21837 -1.1114
+-0.01876 -0.21834 -1.1113
+-0.017708 -0.2183 -1.111
+-0.016661 -0.2183 -1.111
+-0.014573 -0.21841 -1.1116
+-0.012479 -0.21846 -1.1119
+-0.01038 -0.2184 -1.1116
+-0.0041 -0.21887 -1.114
+-0.003057 -0.21943 -1.1169
+-0.002004 -0.21943 -1.1169
+0.33317 -0.21824 -1.1114
+0.33421 -0.21824 -1.1113
+0.33549 -0.21839 -1.1121
+-0.31463 -0.22112 -1.1205
+-0.31358 -0.22113 -1.1206
+-0.31142 -0.2211 -1.1204
+-0.30912 -0.22096 -1.1196
+-0.3067 -0.22074 -1.1185
+-0.11272 -0.22077 -1.1182
+-0.11055 -0.22063 -1.1176
+-0.10832 -0.22038 -1.1163
+-0.10609 -0.22014 -1.115
+-0.1039 -0.21995 -1.1141
+-0.10182 -0.21999 -1.1143
+-0.099733 -0.22002 -1.1144
+-0.097622 -0.22 -1.1143
+-0.095497 -0.21995 -1.1141
+-0.093419 -0.22 -1.1143
+-0.091236 -0.21981 -1.1133
+-0.089147 -0.21983 -1.1135
+-0.087044 -0.21982 -1.1134
+-0.08494 -0.21982 -1.1134
+-0.082772 -0.21964 -1.1125
+-0.080674 -0.21964 -1.1125
+-0.07861 -0.21973 -1.113
+-0.076288 -0.21909 -1.1097
+-0.074238 -0.21922 -1.1103
+-0.072239 -0.21951 -1.1118
+-0.071215 -0.21958 -1.1122
+-0.070067 -0.21927 -1.1106
+-0.069117 -0.21958 -1.1122
+-0.067973 -0.21927 -1.1106
+-0.065918 -0.2194 -1.1113
+-0.063813 -0.21937 -1.1111
+-0.061649 -0.21913 -1.1099
+-0.059589 -0.21925 -1.1105
+-0.057463 -0.21913 -1.1099
+-0.055352 -0.21906 -1.1096
+-0.053255 -0.21904 -1.1095
+-0.051132 -0.21891 -1.1088
+-0.049104 -0.21919 -1.1102
+-0.048035 -0.21909 -1.1097
+-0.04701 -0.21919 -1.1102
+-0.044796 -0.21861 -1.1072
+-0.042726 -0.2187 -1.1077
+-0.040602 -0.21851 -1.1068
+-0.038524 -0.21856 -1.107
+-0.036446 -0.21863 -1.1073
+-0.034331 -0.21845 -1.1065
+-0.032255 -0.21853 -1.1068
+-0.030179 -0.21861 -1.1073
+-0.029157 -0.21878 -1.1081
+-0.028112 -0.21878 -1.1081
+-0.027034 -0.21851 -1.1067
+-0.025979 -0.21842 -1.1063
+-0.02393 -0.21876 -1.108
+-0.022885 -0.21876 -1.108
+-0.021858 -0.21893 -1.1089
+-0.019748 -0.21873 -1.1079
+-0.017659 -0.21873 -1.1079
+-0.015583 -0.21892 -1.1089
+-0.013492 -0.21893 -1.1089
+-0.011393 -0.21877 -1.1081
+-0.009308 -0.2189 -1.1087
+-0.007227 -0.2192 -1.1103
+-0.005146 -0.21974 -1.1131
+-0.003052 -0.2201 -1.1149
+-0.000949 -0.22013 -1.1151
+0.001154 -0.22031 -1.116
+0.3315 -0.21888 -1.1092
+0.33381 -0.21902 -1.11
+0.33478 -0.21897 -1.1098
+-0.31287 -0.22168 -1.118
+-0.3118 -0.22167 -1.1179
+-0.30951 -0.22154 -1.1172
+-0.094165 -0.22034 -1.1107
+-0.089903 -0.22016 -1.1098
+-0.085738 -0.22022 -1.1101
+-0.084691 -0.22022 -1.1101
+-0.08369 -0.22034 -1.1107
+-0.081577 -0.22029 -1.1105
+-0.07532 -0.22037 -1.1109
+-0.073235 -0.2204 -1.111
+-0.071191 -0.22055 -1.1118
+-0.06997 -0.22001 -1.1091
+-0.069006 -0.22027 -1.1104
+-0.067779 -0.21969 -1.1074
+-0.0669 -0.22024 -1.1102
+-0.065854 -0.22024 -1.1102
+-0.06499 -0.22086 -1.1134
+-0.060533 -0.21992 -1.1086
+-0.059453 -0.21979 -1.108
+-0.058498 -0.22014 -1.1097
+-0.056388 -0.22007 -1.1093
+-0.048047 -0.2202 -1.11
+-0.045811 -0.21951 -1.1065
+-0.044716 -0.21926 -1.1052
+-0.04367 -0.21924 -1.1051
+-0.041626 -0.21945 -1.1062
+-0.040589 -0.21948 -1.1064
+-0.039554 -0.21953 -1.1066
+-0.031141 -0.21908 -1.1043
+-0.029116 -0.21951 -1.1065
+-0.027017 -0.21942 -1.1061
+-0.02286 -0.21956 -1.1068
+-0.016585 -0.21939 -1.1059
+-0.015542 -0.21939 -1.1059
+-0.014515 -0.21963 -1.1071
+-0.010346 -0.21978 -1.1079
+-0.0093 -0.21975 -1.1077
+-0.008267 -0.22006 -1.1093
+-0.006194 -0.22072 -1.1127
+0.33203 -0.21958 -1.1075
+0.33307 -0.21958 -1.1075
+0.33394 -0.21947 -1.1069
+-0.31017 -0.20558 -1.0311
+-0.31211 -0.2222 -1.1152
+-0.30991 -0.22212 -1.1148
+-0.3075 -0.2219 -1.1137
+-0.30235 -0.22121 -1.1101
+-0.29729 -0.22056 -1.1068
+-0.29238 -0.22 -1.104
+-0.28774 -0.21965 -1.1021
+-0.28363 -0.21968 -1.1022
+-0.27964 -0.21981 -1.1029
+-0.27584 -0.2201 -1.1043
+-0.27208 -0.22043 -1.106
+-0.26837 -0.2208 -1.1078
+-0.26469 -0.22122 -1.1099
+-0.26101 -0.22165 -1.1121
+-0.25724 -0.22202 -1.114
+-0.2534 -0.22234 -1.1156
+-0.24927 -0.2224 -1.1159
+-0.24507 -0.22241 -1.1159
+-0.24082 -0.22237 -1.1157
+-0.23663 -0.22239 -1.1158
+-0.23236 -0.22234 -1.1155
+-0.22815 -0.22233 -1.1155
+-0.22387 -0.22226 -1.1151
+-0.2197 -0.2223 -1.1153
+-0.21548 -0.22228 -1.1152
+-0.21131 -0.22232 -1.1154
+-0.20705 -0.22227 -1.1151
+-0.20293 -0.22236 -1.1156
+-0.19863 -0.22225 -1.115
+-0.19438 -0.22221 -1.1148
+-0.19014 -0.22217 -1.1146
+-0.18598 -0.22221 -1.1148
+-0.1818 -0.22225 -1.115
+-0.17753 -0.22216 -1.1145
+-0.17325 -0.22207 -1.1141
+-0.16885 -0.2218 -1.1127
+-0.16451 -0.22162 -1.1118
+-0.1602 -0.22145 -1.111
+-0.15601 -0.22145 -1.1109
+-0.15188 -0.22155 -1.1115
+-0.14781 -0.22172 -1.1123
+-0.14372 -0.22189 -1.1132
+-0.13961 -0.22204 -1.1139
+-0.13543 -0.22207 -1.1141
+-0.13123 -0.22207 -1.1141
+-0.12702 -0.22206 -1.114
+-0.1228 -0.22204 -1.114
+-0.11859 -0.22202 -1.1139
+-0.11439 -0.22202 -1.1139
+-0.11016 -0.22196 -1.1136
+-0.10569 -0.22139 -1.1107
+-0.10338 -0.22094 -1.1084
+-0.10122 -0.22079 -1.1076
+-0.099097 -0.22071 -1.1072
+-0.097081 -0.22087 -1.1081
+-0.095 -0.2209 -1.1082
+-0.093928 -0.22083 -1.1079
+-0.092779 -0.22058 -1.1066
+-0.090674 -0.22054 -1.1064
+-0.08963 -0.22054 -1.1064
+-0.088684 -0.22078 -1.1076
+-0.086636 -0.22089 -1.1082
+-0.084619 -0.22108 -1.1091
+-0.082593 -0.22125 -1.11
+-0.080514 -0.22129 -1.1102
+-0.07848 -0.22146 -1.1111
+-0.076268 -0.22113 -1.1094
+-0.075351 -0.22151 -1.1113
+-0.074303 -0.22151 -1.1113
+-0.072204 -0.2215 -1.1113
+-0.070086 -0.22143 -1.1109
+-0.067934 -0.22124 -1.11
+-0.065838 -0.22123 -1.1099
+-0.063821 -0.2215 -1.1113
+-0.061617 -0.22111 -1.1093
+-0.059515 -0.22107 -1.1091
+-0.05855 -0.22138 -1.1107
+-0.057441 -0.22114 -1.1095
+-0.055331 -0.22107 -1.1091
+-0.051152 -0.22109 -1.1092
+-0.049067 -0.22112 -1.1094
+-0.048045 -0.22123 -1.1099
+-0.046904 -0.22079 -1.1077
+-0.044708 -0.22026 -1.105
+-0.042598 -0.22013 -1.1043
+-0.040639 -0.2208 -1.1078
+-0.038503 -0.22053 -1.1064
+-0.03431 -0.22041 -1.1058
+-0.032216 -0.22035 -1.1055
+-0.031078 -0.21968 -1.1021
+-0.030042 -0.2197 -1.1022
+-0.029073 -0.22023 -1.1049
+-0.028035 -0.22026 -1.105
+-0.025931 -0.22009 -1.1042
+-0.023861 -0.22021 -1.1048
+-0.021777 -0.22021 -1.1048
+-0.019727 -0.22059 -1.1067
+-0.017631 -0.22048 -1.1061
+-0.015539 -0.22039 -1.1057
+-0.013454 -0.2204 -1.1057
+-0.01139 -0.22081 -1.1078
+-0.009317 -0.22119 -1.1097
+-0.007224 -0.22119 -1.1098
+-0.006191 -0.22168 -1.1122
+-0.005142 -0.22169 -1.1123
+-0.000947 -0.22168 -1.1122
+0.003248 -0.22167 -1.1122
+0.007438 -0.22153 -1.1115
+0.011623 -0.22139 -1.1107
+0.015798 -0.22118 -1.1097
+0.019962 -0.22095 -1.1085
+0.024122 -0.22075 -1.1075
+0.028292 -0.22069 -1.1072
+0.03245 -0.22056 -1.1066
+0.036626 -0.22057 -1.1066
+0.040807 -0.22062 -1.1068
+0.044991 -0.22066 -1.107
+0.04917 -0.22068 -1.1071
+0.053381 -0.22082 -1.1078
+0.057618 -0.22104 -1.109
+0.06185 -0.22122 -1.1099
+0.066061 -0.2213 -1.1103
+0.070258 -0.22133 -1.1104
+0.074433 -0.22129 -1.1102
+0.078604 -0.22124 -1.11
+0.082708 -0.22102 -1.1088
+0.086801 -0.22079 -1.1077
+0.090839 -0.22045 -1.1059
+0.094883 -0.22015 -1.1044
+0.098891 -0.2198 -1.1026
+0.10292 -0.21952 -1.1012
+0.10695 -0.21928 -1.1
+0.11101 -0.21909 -1.099
+0.11515 -0.21908 -1.0989
+0.11925 -0.219 -1.0985
+0.12346 -0.2191 -1.0991
+0.12764 -0.21917 -1.0994
+0.13174 -0.2191 -1.099
+0.13598 -0.21925 -1.0998
+0.14017 -0.21931 -1.1001
+0.14438 -0.2194 -1.1005
+0.14856 -0.21944 -1.1008
+0.15275 -0.21949 -1.101
+0.15692 -0.21951 -1.1011
+0.16109 -0.21953 -1.1012
+0.16527 -0.21958 -1.1014
+0.16951 -0.21968 -1.102
+0.17377 -0.21982 -1.1026
+0.17804 -0.21994 -1.1033
+0.18229 -0.22005 -1.1038
+0.18662 -0.22024 -1.1048
+0.19087 -0.22034 -1.1053
+0.19523 -0.22055 -1.1064
+0.19945 -0.22061 -1.1067
+0.20359 -0.22057 -1.1065
+0.20792 -0.22073 -1.1073
+0.212 -0.22063 -1.1068
+0.21617 -0.22063 -1.1068
+0.22029 -0.22058 -1.1065
+0.22445 -0.22056 -1.1064
+0.22852 -0.22046 -1.1059
+0.23256 -0.22034 -1.1054
+0.23668 -0.22028 -1.1051
+0.24073 -0.22018 -1.1046
+0.24495 -0.22023 -1.1048
+0.24922 -0.22032 -1.1053
+0.25337 -0.2203 -1.1052
+0.25755 -0.22032 -1.1053
+0.26192 -0.22048 -1.1062
+0.26619 -0.22056 -1.1066
+0.27029 -0.22051 -1.1063
+0.27438 -0.22044 -1.106
+0.27861 -0.22048 -1.1063
+0.28285 -0.22053 -1.1065
+0.28714 -0.22062 -1.107
+0.29141 -0.22069 -1.1074
+0.29562 -0.22072 -1.1076
+0.29965 -0.22061 -1.1071
+0.30356 -0.22042 -1.1062
+0.30761 -0.22034 -1.1058
+0.3117 -0.22028 -1.1055
+0.31587 -0.22028 -1.1056
+0.31997 -0.22023 -1.1054
+0.32406 -0.22018 -1.1052
+0.32821 -0.22017 -1.1052
+0.33026 -0.22015 -1.1051
+0.33232 -0.22013 -1.105
+0.33335 -0.22012 -1.105
+-0.30955 -0.20614 -1.029
+-0.3089 -0.20636 -1.0301
+-0.09995 -0.22133 -1.1051
+-0.098878 -0.22126 -1.1048
+-0.097832 -0.22126 -1.1047
+-0.096781 -0.22124 -1.1046
+-0.09574 -0.22123 -1.1046
+-0.093665 -0.22126 -1.1047
+-0.089572 -0.22144 -1.1057
+-0.075336 -0.22251 -1.1111
+-0.073143 -0.22221 -1.1096
+-0.066872 -0.22224 -1.1097
+-0.065827 -0.22224 -1.1097
+-0.064845 -0.22247 -1.1109
+-0.063798 -0.22247 -1.1109
+-0.06265 -0.22211 -1.1091
+-0.060524 -0.22198 -1.1084
+-0.058534 -0.22237 -1.1104
+-0.056354 -0.22203 -1.1087
+-0.050103 -0.22213 -1.1092
+-0.049058 -0.22213 -1.1092
+-0.048035 -0.22223 -1.1097
+-0.045792 -0.22151 -1.1061
+-0.044775 -0.22164 -1.1067
+-0.043714 -0.22155 -1.1063
+-0.042658 -0.22148 -1.1059
+-0.04162 -0.22151 -1.1061
+-0.039587 -0.22181 -1.1076
+-0.031144 -0.22118 -1.1044
+-0.029071 -0.22126 -1.1048
+-0.02703 -0.22161 -1.1066
+-0.025961 -0.22139 -1.1055
+-0.024918 -0.22139 -1.1055
+-0.022819 -0.22126 -1.1048
+-0.014507 -0.22159 -1.1065
+-0.013474 -0.22177 -1.1074
+-0.012432 -0.22181 -1.1076
+-0.010343 -0.22181 -1.1076
+-0.006176 -0.2222 -1.1095
+0.3307 -0.22078 -1.103
+0.33177 -0.2208 -1.1032
+0.33265 -0.2207 -1.1026
+-0.30922 -0.20689 -1.0279
+-0.30825 -0.20689 -1.0279
+-0.30775 -0.20721 -1.0295
+-0.31058 -0.2232 -1.1097
+-0.30833 -0.22309 -1.1091
+-0.30578 -0.22275 -1.1074
+-0.30322 -0.2224 -1.1057
+-0.2981 -0.2217 -1.1021
+-0.29566 -0.22143 -1.1007
+-0.29329 -0.2212 -1.0995
+-0.1076 -0.22312 -1.1088
+-0.10548 -0.22304 -1.1085
+-0.10328 -0.22282 -1.1073
+-0.10094 -0.22226 -1.1045
+-0.098854 -0.22225 -1.1045
+-0.096749 -0.2222 -1.1042
+-0.094624 -0.2221 -1.1037
+-0.092566 -0.22216 -1.104
+-0.090558 -0.22234 -1.105
+-0.088512 -0.22244 -1.1054
+-0.086493 -0.22261 -1.1063
+-0.084603 -0.22313 -1.1089
+-0.082523 -0.22316 -1.1091
+-0.080408 -0.22309 -1.1087
+-0.078239 -0.22287 -1.1076
+-0.076172 -0.22294 -1.108
+-0.074157 -0.22316 -1.1091
+-0.072056 -0.22313 -1.1089
+-0.069951 -0.22309 -1.1087
+-0.067858 -0.22309 -1.1087
+-0.065767 -0.22309 -1.1087
+-0.064721 -0.22309 -1.1087
+-0.063675 -0.22308 -1.1087
+-0.061486 -0.22273 -1.1069
+-0.059467 -0.22299 -1.1082
+-0.057388 -0.22303 -1.1084
+-0.055277 -0.22295 -1.108
+-0.053185 -0.22294 -1.108
+-0.051089 -0.22291 -1.1078
+-0.048943 -0.22265 -1.1065
+-0.0479 -0.22265 -1.1066
+-0.046826 -0.22251 -1.1058
+-0.044766 -0.22264 -1.1065
+-0.042648 -0.22248 -1.1057
+-0.040568 -0.22251 -1.1058
+-0.038483 -0.22251 -1.1058
+-0.036391 -0.22247 -1.1056
+-0.034287 -0.22235 -1.105
+-0.032181 -0.22219 -1.1042
+-0.030097 -0.22218 -1.1042
+-0.028024 -0.22226 -1.1046
+-0.025949 -0.22233 -1.1049
+-0.02387 -0.22238 -1.1052
+-0.021773 -0.22226 -1.1046
+-0.019701 -0.22238 -1.1052
+-0.017631 -0.22256 -1.1061
+-0.015546 -0.22257 -1.1062
+-0.013461 -0.22259 -1.1063
+-0.011385 -0.22281 -1.1073
+-0.009297 -0.22281 -1.1073
+-0.007209 -0.22282 -1.1074
+-0.005121 -0.22286 -1.1076
+-0.003032 -0.22289 -1.1077
+0.21324 -0.22185 -1.1024
+0.26694 -0.22154 -1.101
+0.30446 -0.22164 -1.1018
+0.32917 -0.22149 -1.1014
+0.33111 -0.2214 -1.1009
+0.33223 -0.22146 -1.1013
+-0.3087 -0.20751 -1.0262
+-0.30796 -0.20766 -1.0269
+-0.30723 -0.20783 -1.0277
+-0.30658 -0.20805 -1.0288
+-0.30885 -0.22375 -1.1072
+-0.30625 -0.22337 -1.1053
+-0.29587 -0.22185 -1.0976
+-0.10427 -0.22374 -1.1067
+-0.10323 -0.22374 -1.1067
+-0.10214 -0.22366 -1.1063
+-0.10096 -0.22334 -1.1047
+-0.099852 -0.2232 -1.104
+-0.097793 -0.22325 -1.1043
+-0.089537 -0.22344 -1.1052
+-0.064598 -0.22371 -1.1066
+-0.047809 -0.22327 -1.1044
+-0.033183 -0.22297 -1.1029
+-0.032166 -0.22313 -1.1037
+-0.031126 -0.22314 -1.1038
+-0.024902 -0.22333 -1.1047
+-0.023863 -0.22336 -1.1049
+-0.022822 -0.22336 -1.1049
+-0.020711 -0.22307 -1.1034
+-0.019698 -0.22338 -1.105
+-0.018658 -0.22341 -1.1051
+0.32974 -0.22222 -1.0998
+0.33082 -0.22225 -1.1
+0.33202 -0.22236 -1.1006
+-0.30838 -0.20827 -1.0251
+-0.30749 -0.20832 -1.0253
+-0.30678 -0.20849 -1.0262
+-0.30556 -0.20898 -1.0286
+-0.3079 -0.22411 -1.1038
+-0.30666 -0.22396 -1.1031
+-0.30414 -0.22364 -1.1014
+-0.29897 -0.22287 -1.0976
+-0.29657 -0.22263 -1.0964
+-0.29419 -0.22239 -1.0952
+-0.28975 -0.22215 -1.0939
+-0.28558 -0.22212 -1.0937
+-0.28154 -0.22219 -1.0941
+-0.27786 -0.22254 -1.0958
+-0.27416 -0.2229 -1.0975
+-0.27054 -0.22332 -1.0996
+-0.26683 -0.2237 -1.1015
+-0.26318 -0.22412 -1.1036
+-0.25952 -0.22456 -1.1057
+-0.25562 -0.22479 -1.1069
+-0.2515 -0.22485 -1.1071
+-0.24733 -0.22485 -1.1071
+-0.24313 -0.22483 -1.107
+-0.23886 -0.22473 -1.1065
+-0.23464 -0.2247 -1.1063
+-0.23037 -0.2246 -1.1058
+-0.22614 -0.22454 -1.1055
+-0.22203 -0.2246 -1.1058
+-0.21789 -0.22464 -1.106
+-0.21377 -0.22469 -1.1062
+-0.20962 -0.22472 -1.1064
+-0.20545 -0.22472 -1.1063
+-0.20128 -0.22472 -1.1064
+-0.19706 -0.22468 -1.1061
+-0.1929 -0.22468 -1.1061
+-0.18874 -0.2247 -1.1062
+-0.18454 -0.22467 -1.1061
+-0.1803 -0.22459 -1.1057
+-0.17597 -0.22438 -1.1046
+-0.17159 -0.2241 -1.1033
+-0.16731 -0.22395 -1.1025
+-0.16306 -0.22382 -1.1018
+-0.1589 -0.22382 -1.1019
+-0.1548 -0.2239 -1.1023
+-0.1507 -0.22399 -1.1027
+-0.14669 -0.22421 -1.1038
+-0.14266 -0.22443 -1.1049
+-0.13859 -0.22459 -1.1057
+-0.13436 -0.22449 -1.1052
+-0.13021 -0.22452 -1.1053
+-0.12602 -0.22448 -1.1052
+-0.12187 -0.22452 -1.1054
+-0.11766 -0.22445 -1.105
+-0.11344 -0.22434 -1.1045
+-0.10929 -0.22437 -1.1046
+-0.10513 -0.2244 -1.1048
+-0.10298 -0.22426 -1.1041
+-0.10194 -0.22426 -1.1041
+-0.10073 -0.22387 -1.1022
+-0.098718 -0.22403 -1.1029
+-0.096701 -0.22418 -1.1037
+-0.094498 -0.22389 -1.1023
+-0.092419 -0.22389 -1.1023
+-0.090517 -0.22433 -1.1044
+-0.089472 -0.22432 -1.1044
+-0.088278 -0.22393 -1.1025
+-0.08633 -0.22427 -1.1042
+-0.084265 -0.22432 -1.1044
+-0.08008 -0.22427 -1.1042
+-0.075928 -0.22431 -1.1044
+-0.071777 -0.22436 -1.1046
+-0.067602 -0.22433 -1.1045
+-0.065534 -0.22438 -1.1047
+-0.063429 -0.22431 -1.1044
+-0.059243 -0.22423 -1.104
+-0.055063 -0.22417 -1.1037
+-0.050877 -0.22406 -1.1032
+-0.048775 -0.22397 -1.1027
+-0.04668 -0.2239 -1.1023
+-0.042493 -0.22375 -1.1016
+-0.03832 -0.22364 -1.1011
+-0.034158 -0.22359 -1.1008
+-0.032091 -0.22365 -1.1011
+-0.030013 -0.22364 -1.1011
+-0.025886 -0.22387 -1.1022
+-0.023815 -0.22395 -1.1026
+-0.021732 -0.22392 -1.1024
+-0.019666 -0.22407 -1.1032
+-0.017579 -0.22398 -1.1028
+-0.013422 -0.22403 -1.103
+-0.009259 -0.22398 -1.1027
+-0.0051 -0.22404 -1.103
+-0.000939 -0.22407 -1.1032
+0.003222 -0.22404 -1.103
+0.007382 -0.22401 -1.1029
+0.01154 -0.22398 -1.1027
+0.015691 -0.22385 -1.1021
+0.019829 -0.22362 -1.101
+0.023962 -0.22343 -1.1
+0.028091 -0.22328 -1.0992
+0.032218 -0.22314 -1.0986
+0.03634 -0.223 -1.0979
+0.040467 -0.22292 -1.0975
+0.044597 -0.22287 -1.0972
+0.048737 -0.22287 -1.0972
+0.052876 -0.22287 -1.0972
+0.057043 -0.22298 -1.0977
+0.061267 -0.22328 -1.0993
+0.065487 -0.22353 -1.1005
+0.069668 -0.22363 -1.101
+0.073863 -0.22375 -1.1016
+0.077991 -0.22367 -1.1012
+0.082137 -0.22365 -1.1011
+0.086225 -0.22348 -1.1002
+0.09029 -0.22327 -1.0992
+0.094292 -0.22293 -1.0975
+0.098269 -0.22256 -1.0956
+0.10228 -0.22228 -1.0942
+0.10628 -0.22202 -1.0929
+0.11029 -0.2218 -1.0918
+0.11437 -0.22171 -1.0914
+0.11841 -0.22157 -1.0907
+0.12254 -0.22161 -1.0908
+0.12664 -0.22157 -1.0906
+0.13078 -0.22161 -1.0909
+0.13483 -0.2215 -1.0903
+0.13905 -0.22167 -1.0911
+0.14326 -0.22182 -1.0919
+0.14741 -0.22187 -1.0921
+0.15155 -0.22189 -1.0922
+0.15563 -0.22183 -1.0919
+0.15976 -0.22186 -1.0921
+0.16388 -0.22184 -1.092
+0.16796 -0.22179 -1.0917
+0.17211 -0.22184 -1.092
+0.17623 -0.22184 -1.092
+0.18038 -0.22187 -1.0921
+0.18459 -0.22198 -1.0927
+0.18884 -0.22213 -1.0934
+0.19314 -0.22233 -1.0944
+0.1974 -0.22248 -1.0952
+0.20167 -0.22262 -1.0959
+0.20596 -0.22279 -1.0967
+0.2102 -0.22291 -1.0973
+0.21229 -0.22292 -1.0974
+0.21427 -0.22283 -1.0969
+0.21831 -0.22273 -1.0965
+0.22233 -0.22261 -1.0959
+0.22638 -0.22253 -1.0955
+0.2305 -0.22252 -1.0954
+0.2346 -0.22249 -1.0953
+0.23859 -0.22236 -1.0947
+0.24281 -0.22244 -1.0951
+0.24704 -0.22253 -1.0955
+0.25126 -0.22261 -1.096
+0.25535 -0.22257 -1.0958
+0.2595 -0.22259 -1.0959
+0.26377 -0.2227 -1.0965
+0.26582 -0.22268 -1.0964
+0.26779 -0.22259 -1.096
+0.27197 -0.22264 -1.0962
+0.2761 -0.22263 -1.0962
+0.28026 -0.22266 -1.0964
+0.2845 -0.22273 -1.0968
+0.28873 -0.22281 -1.0972
+0.293 -0.2229 -1.0977
+0.29717 -0.22293 -1.0979
+0.3014 -0.223 -1.0982
+0.30328 -0.22286 -1.0975
+0.30541 -0.2229 -1.0978
+0.3095 -0.22287 -1.0977
+0.31374 -0.22293 -1.098
+0.31786 -0.22292 -1.098
+0.3221 -0.22299 -1.0984
+0.32632 -0.22304 -1.0987
+0.32843 -0.22307 -1.0989
+0.33058 -0.22312 -1.0992
+0.33157 -0.22309 -1.099
+-0.30797 -0.20895 -1.0237
+-0.30714 -0.20905 -1.0242
+-0.30632 -0.20915 -1.0247
+-0.30566 -0.20935 -1.0257
+-0.30437 -0.2098 -1.0279
+-0.30705 -0.22452 -1.1007
+-0.3045 -0.22418 -1.099
+-0.10175 -0.22487 -1.1019
+-0.095542 -0.22494 -1.1023
+-0.094462 -0.22484 -1.1018
+-0.093428 -0.22486 -1.1019
+-0.0924 -0.22488 -1.102
+-0.091363 -0.22489 -1.102
+-0.089269 -0.22485 -1.1019
+-0.088229 -0.22485 -1.1019
+-0.087164 -0.22478 -1.1015
+-0.085125 -0.22488 -1.102
+0.21271 -0.22332 -1.0942
+0.26422 -0.22323 -1.094
+0.26522 -0.22321 -1.0939
+0.26624 -0.2232 -1.0939
+0.32925 -0.22396 -1.0982
+0.33043 -0.22406 -1.0987
+0.33139 -0.224 -1.0984
+-0.30754 -0.20963 -1.0223
+-0.30679 -0.20978 -1.023
+-0.30602 -0.20991 -1.0236
+-0.30451 -0.2102 -1.0251
+-0.30309 -0.21056 -1.0268
+-0.30627 -0.22499 -1.0979
+-0.30497 -0.22479 -1.0969
+-0.30241 -0.22443 -1.0951
+-0.2999 -0.2241 -1.0934
+-0.29524 -0.22369 -1.0914
+-0.10262 -0.22553 -1.1001
+-0.10052 -0.22548 -1.0998
+-0.098481 -0.22557 -1.1003
+-0.096396 -0.22555 -1.1001
+-0.094299 -0.22549 -1.0999
+-0.092209 -0.22546 -1.0997
+-0.090137 -0.22546 -1.0997
+-0.088041 -0.22541 -1.0995
+-0.085983 -0.22545 -1.0997
+-0.083912 -0.22546 -1.0997
+-0.081855 -0.22551 -1.1
+-0.065251 -0.22549 -1.0999
+-0.048579 -0.22514 -1.0982
+-0.031955 -0.22478 -1.0964
+-0.023719 -0.22512 -1.0981
+-0.01958 -0.22516 -1.0983
+0.207 -0.22376 -1.0913
+0.21116 -0.22379 -1.0915
+0.21209 -0.2237 -1.091
+0.21322 -0.22381 -1.0915
+0.2152 -0.22372 -1.0911
+0.2607 -0.2239 -1.0922
+0.26278 -0.22392 -1.0923
+0.26483 -0.22391 -1.0922
+0.26689 -0.22392 -1.0923
+0.26909 -0.22403 -1.0929
+0.28991 -0.22419 -1.0938
+0.29202 -0.22422 -1.094
+0.29414 -0.22427 -1.0942
+0.29624 -0.22429 -1.0944
+0.29838 -0.22435 -1.0947
+0.30042 -0.22434 -1.0946
+0.30252 -0.22436 -1.0948
+0.30468 -0.22443 -1.0951
+0.30681 -0.22448 -1.0954
+0.32803 -0.22487 -1.0976
+0.33003 -0.22482 -1.0974
+0.33109 -0.22484 -1.0975
+-0.30732 -0.21044 -1.0216
+-0.30641 -0.21048 -1.0217
+-0.30558 -0.21057 -1.0222
+-0.30487 -0.21075 -1.023
+-0.30334 -0.21103 -1.0244
+-0.30196 -0.21141 -1.0262
+-0.30134 -0.21166 -1.0275
+-0.30533 -0.22533 -1.0945
+-0.30281 -0.225 -1.0928
+0.21169 -0.2243 -1.0889
+0.29893 -0.22502 -1.0929
+0.32893 -0.22581 -1.0971
+0.33006 -0.22588 -1.0975
+0.33101 -0.22582 -1.0972
+-0.30713 -0.21127 -1.0209
+-0.30633 -0.21139 -1.0215
+-0.30539 -0.21141 -1.0215
+-0.30372 -0.21159 -1.0224
+-0.30218 -0.21186 -1.0237
+-0.30088 -0.2123 -1.0259
+-0.30331 -0.22563 -1.0909
+-0.30073 -0.22523 -1.0889
+-0.29606 -0.22481 -1.0868
+-0.2916 -0.22453 -1.0854
+-0.28753 -0.22455 -1.0855
+-0.28368 -0.22475 -1.0864
+-0.27994 -0.22503 -1.0878
+-0.27629 -0.2254 -1.0896
+-0.27267 -0.22581 -1.0915
+-0.26893 -0.22612 -1.093
+-0.26533 -0.22657 -1.0952
+-0.26157 -0.22689 -1.0968
+-0.25771 -0.22714 -1.0979
+-0.25365 -0.22721 -1.0983
+-0.24956 -0.22726 -1.0985
+-0.24533 -0.22718 -1.0981
+-0.24112 -0.22712 -1.0977
+-0.23687 -0.22701 -1.0972
+-0.23264 -0.22692 -1.0968
+-0.22839 -0.22681 -1.0962
+-0.22436 -0.22691 -1.0967
+-0.22025 -0.22695 -1.0968
+-0.21616 -0.22699 -1.0971
+-0.21208 -0.22706 -1.0974
+-0.20797 -0.22709 -1.0975
+-0.20385 -0.22711 -1.0976
+-0.19974 -0.22716 -1.0978
+-0.19558 -0.22713 -1.0977
+-0.19135 -0.22702 -1.0972
+-0.18725 -0.22707 -1.0974
+-0.18297 -0.2269 -1.0966
+-0.17863 -0.22664 -1.0953
+-0.17434 -0.22644 -1.0943
+-0.17009 -0.22627 -1.0935
+-0.1659 -0.22619 -1.0931
+-0.16172 -0.22612 -1.0927
+-0.15768 -0.22623 -1.0933
+-0.1537 -0.22645 -1.0944
+-0.1496 -0.22649 -1.0945
+-0.14565 -0.22676 -1.0959
+-0.14156 -0.22683 -1.0962
+-0.13746 -0.2269 -1.0966
+-0.13333 -0.22692 -1.0967
+-0.12918 -0.22689 -1.0965
+-0.12502 -0.22684 -1.0963
+-0.12087 -0.22681 -1.0961
+-0.1167 -0.22676 -1.0959
+-0.11255 -0.22673 -1.0957
+-0.10842 -0.22673 -1.0958
+-0.10425 -0.22665 -1.0954
+-0.10012 -0.22667 -1.0955
+-0.095967 -0.22661 -1.0952
+-0.091831 -0.2266 -1.0951
+-0.087687 -0.22657 -1.095
+-0.083554 -0.22656 -1.095
+-0.079456 -0.22666 -1.0954
+-0.075329 -0.22667 -1.0955
+-0.071201 -0.22669 -1.0956
+-0.067064 -0.22668 -1.0956
+-0.062914 -0.22662 -1.0953
+-0.058776 -0.22659 -1.0952
+-0.054639 -0.22658 -1.0951
+-0.050455 -0.22634 -1.0939
+-0.046299 -0.22619 -1.0932
+-0.042136 -0.22599 -1.0922
+-0.038 -0.22589 -1.0917
+-0.033865 -0.22579 -1.0912
+-0.029768 -0.22594 -1.092
+-0.025669 -0.22612 -1.0929
+-0.021562 -0.22629 -1.0937
+-0.017441 -0.22635 -1.094
+-0.013317 -0.22641 -1.0943
+-0.009187 -0.22637 -1.0941
+-0.005059 -0.22635 -1.094
+-0.000932 -0.22635 -1.094
+0.003196 -0.22636 -1.094
+0.007324 -0.22638 -1.0941
+0.011454 -0.22643 -1.0944
+0.015583 -0.22644 -1.0944
+0.019695 -0.22624 -1.0934
+0.023804 -0.22609 -1.0927
+0.027905 -0.22592 -1.0919
+0.032002 -0.22576 -1.0911
+0.036093 -0.2256 -1.0903
+0.04017 -0.2254 -1.0893
+0.044265 -0.22532 -1.0889
+0.048335 -0.22514 -1.0881
+0.052437 -0.22513 -1.088
+0.056548 -0.22515 -1.0881
+0.06069 -0.22529 -1.0888
+0.064876 -0.22556 -1.0901
+0.069046 -0.22575 -1.091
+0.073196 -0.22585 -1.0915
+0.077369 -0.22601 -1.0923
+0.081552 -0.22618 -1.0931
+0.085613 -0.22602 -1.0923
+0.089708 -0.22595 -1.092
+0.09374 -0.22574 -1.0909
+0.097719 -0.22542 -1.0894
+0.10167 -0.22507 -1.0877
+0.10562 -0.22475 -1.0861
+0.10959 -0.22448 -1.0848
+0.11361 -0.22435 -1.0841
+0.11762 -0.22419 -1.0833
+0.1217 -0.22417 -1.0832
+0.12582 -0.22423 -1.0835
+0.12985 -0.22413 -1.083
+0.13395 -0.22415 -1.0831
+0.13805 -0.22417 -1.0832
+0.14221 -0.22428 -1.0837
+0.14638 -0.22441 -1.0844
+0.15043 -0.22435 -1.0841
+0.15453 -0.22436 -1.0841
+0.15861 -0.22434 -1.084
+0.16265 -0.22428 -1.0837
+0.16679 -0.22435 -1.0841
+0.17089 -0.22435 -1.0841
+0.17503 -0.22442 -1.0844
+0.1791 -0.22439 -1.0843
+0.18317 -0.22436 -1.0841
+0.18735 -0.22447 -1.0847
+0.19144 -0.22446 -1.0847
+0.19554 -0.22448 -1.0847
+0.19973 -0.22458 -1.0853
+0.20393 -0.2247 -1.0858
+0.20598 -0.2247 -1.0858
+0.20811 -0.2248 -1.0863
+0.21019 -0.22483 -1.0865
+0.21232 -0.22491 -1.0869
+0.21632 -0.22481 -1.0864
+0.22046 -0.22484 -1.0866
+0.22455 -0.22484 -1.0865
+0.22872 -0.22491 -1.0869
+0.23292 -0.225 -1.0874
+0.23707 -0.22505 -1.0876
+0.24122 -0.22509 -1.0878
+0.2454 -0.22515 -1.0882
+0.24961 -0.22526 -1.0887
+0.25383 -0.22536 -1.0892
+0.25806 -0.22546 -1.0897
+0.26224 -0.22552 -1.09
+0.26633 -0.2255 -1.09
+0.27049 -0.22554 -1.0902
+0.27471 -0.22563 -1.0906
+0.27892 -0.22571 -1.0911
+0.2831 -0.22576 -1.0913
+0.2873 -0.22582 -1.0917
+0.29149 -0.22588 -1.092
+0.29578 -0.22601 -1.0927
+0.2978 -0.22598 -1.0925
+0.29989 -0.226 -1.0927
+0.30202 -0.22605 -1.093
+0.3041 -0.22607 -1.093
+0.30849 -0.22627 -1.0941
+0.31269 -0.22632 -1.0944
+0.31701 -0.22646 -1.0951
+0.32126 -0.22654 -1.0955
+0.32552 -0.22663 -1.0961
+0.3276 -0.22664 -1.0961
+0.32986 -0.22677 -1.0968
+0.33091 -0.22678 -1.0969
+-0.30662 -0.21188 -1.0192
+-0.30581 -0.21199 -1.0197
+-0.30499 -0.21209 -1.0202
+-0.30423 -0.21223 -1.0209
+-0.30264 -0.21247 -1.022
+-0.30125 -0.22588 -1.0871
+0.32862 -0.22767 -1.0961
+0.32981 -0.22777 -1.0966
+0.33078 -0.22773 -1.0965
+-0.30638 -0.21269 -1.0184
+-0.30554 -0.21277 -1.0188
+-0.30478 -0.21291 -1.0195
+-0.30305 -0.21304 -1.0201
+-0.30147 -0.21329 -1.0213
+-0.29995 -0.21358 -1.0227
+-0.29865 -0.21403 -1.0248
+-0.30166 -0.22645 -1.0849
+-0.29925 -0.22617 -1.0835
+-0.29695 -0.22598 -1.0826
+0.20541 -0.22612 -1.0828
+0.20747 -0.22614 -1.0829
+0.20962 -0.22625 -1.0834
+0.2976 -0.22789 -1.0918
+0.30182 -0.22797 -1.0922
+0.32753 -0.22866 -1.0959
+0.32971 -0.22874 -1.0963
+0.33078 -0.22877 -1.0965
+-0.30622 -0.21353 -1.0179
+-0.3053 -0.21356 -1.018
+-0.30441 -0.21361 -1.0182
+-0.30359 -0.21371 -1.0187
+-0.30186 -0.21385 -1.0194
+-0.29965 -0.22673 -1.0813
+0.32848 -0.22964 -1.0957
+0.32935 -0.22952 -1.0951
+0.33068 -0.22973 -1.0961
+-0.30599 -0.21433 -1.0171
+-0.30505 -0.21434 -1.0172
+-0.30424 -0.21445 -1.0177
+-0.30242 -0.21452 -1.018
+-0.30077 -0.21471 -1.0189
+-0.29764 -0.21523 -1.0213
+-0.29628 -0.21564 -1.0233
+-0.30007 -0.22729 -1.0791
+-0.29779 -0.22711 -1.0782
+-0.29353 -0.22695 -1.0775
+-0.28946 -0.22695 -1.0774
+-0.28566 -0.22716 -1.0784
+-0.28188 -0.22739 -1.0794
+-0.2783 -0.22779 -1.0813
+-0.27468 -0.22818 -1.0832
+-0.27107 -0.22857 -1.085
+-0.26744 -0.22898 -1.0869
+-0.26373 -0.22931 -1.0885
+-0.25977 -0.22944 -1.0891
+-0.25578 -0.22955 -1.0896
+-0.25167 -0.22955 -1.0896
+-0.24745 -0.22945 -1.0891
+-0.2433 -0.22941 -1.0889
+-0.23908 -0.22931 -1.0884
+-0.23482 -0.22915 -1.0876
+-0.23067 -0.22911 -1.0874
+-0.22657 -0.22911 -1.0874
+-0.22259 -0.22923 -1.088
+-0.21853 -0.22928 -1.0882
+-0.21452 -0.22938 -1.0886
+-0.21043 -0.22941 -1.0888
+-0.20634 -0.22943 -1.0889
+-0.20222 -0.22941 -1.0887
+-0.19813 -0.22943 -1.0888
+-0.19405 -0.22946 -1.089
+-0.18988 -0.22939 -1.0887
+-0.18565 -0.22924 -1.0879
+-0.18134 -0.22898 -1.0867
+-0.17706 -0.22875 -1.0856
+-0.17286 -0.22861 -1.0849
+-0.16872 -0.22855 -1.0846
+-0.16462 -0.22854 -1.0846
+-0.1605 -0.2285 -1.0844
+-0.15649 -0.22862 -1.0849
+-0.15259 -0.22891 -1.0863
+-0.1486 -0.22908 -1.0871
+-0.14455 -0.22915 -1.0875
+-0.14048 -0.22921 -1.0878
+-0.13635 -0.22917 -1.0876
+-0.13226 -0.22919 -1.0877
+-0.12815 -0.22918 -1.0876
+-0.12402 -0.22913 -1.0874
+-0.1199 -0.2291 -1.0872
+-0.11581 -0.22913 -1.0874
+-0.1117 -0.22912 -1.0873
+-0.10757 -0.22906 -1.0871
+-0.10344 -0.229 -1.0868
+-0.099279 -0.22886 -1.0861
+-0.09518 -0.22885 -1.0861
+-0.09104 -0.22875 -1.0856
+-0.086923 -0.22869 -1.0853
+-0.082849 -0.22875 -1.0856
+-0.078809 -0.22891 -1.0864
+-0.074743 -0.22902 -1.0869
+-0.070655 -0.22906 -1.0871
+-0.066526 -0.22896 -1.0866
+-0.062431 -0.22898 -1.0867
+-0.058314 -0.22892 -1.0864
+-0.054189 -0.22881 -1.0859
+-0.050064 -0.22868 -1.0853
+-0.045929 -0.22848 -1.0843
+-0.041803 -0.22829 -1.0834
+-0.037695 -0.22817 -1.0829
+-0.033599 -0.22811 -1.0825
+-0.029505 -0.22803 -1.0822
+-0.025443 -0.22823 -1.0831
+-0.021372 -0.22839 -1.0839
+-0.01729 -0.22849 -1.0844
+-0.01321 -0.22869 -1.0854
+-0.009114 -0.22868 -1.0853
+-0.00502 -0.22873 -1.0855
+-0.000925 -0.22871 -1.0855
+0.003171 -0.22874 -1.0856
+0.007268 -0.22877 -1.0858
+0.011367 -0.2288 -1.0859
+0.01546 -0.22875 -1.0856
+0.019555 -0.22873 -1.0856
+0.023642 -0.22865 -1.0852
+0.027728 -0.22858 -1.0848
+0.031802 -0.22844 -1.0842
+0.035858 -0.22822 -1.0831
+0.039904 -0.22799 -1.082
+0.043947 -0.22778 -1.081
+0.047996 -0.22764 -1.0803
+0.052047 -0.22753 -1.0798
+0.056088 -0.2274 -1.0791
+0.060158 -0.22739 -1.0791
+0.064288 -0.22759 -1.0801
+0.068408 -0.22774 -1.0808
+0.072549 -0.22794 -1.0817
+0.076684 -0.2281 -1.0825
+0.080831 -0.22828 -1.0833
+0.084989 -0.22846 -1.0842
+0.089088 -0.22848 -1.0843
+0.093132 -0.22837 -1.0838
+0.097118 -0.22813 -1.0826
+0.10112 -0.22794 -1.0817
+0.10501 -0.22753 -1.0797
+0.10898 -0.2273 -1.0786
+0.11292 -0.22705 -1.0774
+0.1169 -0.22688 -1.0766
+0.12097 -0.22689 -1.0766
+0.12508 -0.22698 -1.0771
+0.12912 -0.22693 -1.0768
+0.13322 -0.22699 -1.0771
+0.13726 -0.22695 -1.0769
+0.14134 -0.22698 -1.0771
+0.14545 -0.22705 -1.0774
+0.14952 -0.22705 -1.0774
+0.15356 -0.22702 -1.0773
+0.1577 -0.22713 -1.0778
+0.16178 -0.22715 -1.0779
+0.16585 -0.22715 -1.0779
+0.16995 -0.2272 -1.0781
+0.17404 -0.22723 -1.0782
+0.17811 -0.22723 -1.0782
+0.18224 -0.22729 -1.0786
+0.18641 -0.22742 -1.0792
+0.19049 -0.22742 -1.0792
+0.19465 -0.22753 -1.0797
+0.19878 -0.22759 -1.08
+0.20292 -0.22766 -1.0804
+0.20707 -0.22774 -1.0808
+0.21121 -0.22781 -1.0811
+0.21535 -0.22788 -1.0814
+0.21951 -0.22797 -1.0819
+0.22369 -0.22806 -1.0823
+0.22785 -0.22814 -1.0827
+0.23201 -0.22821 -1.0831
+0.23624 -0.22835 -1.0838
+0.24039 -0.22841 -1.0841
+0.24461 -0.22853 -1.0846
+0.24883 -0.22865 -1.0852
+0.25295 -0.22867 -1.0854
+0.25722 -0.22882 -1.0861
+0.26145 -0.22894 -1.0867
+0.26562 -0.229 -1.087
+0.26979 -0.22906 -1.0874
+0.27407 -0.22921 -1.0881
+0.27823 -0.22925 -1.0883
+0.28247 -0.22936 -1.0889
+0.28673 -0.22949 -1.0895
+0.29101 -0.22962 -1.0902
+0.29535 -0.2298 -1.0911
+0.29958 -0.22989 -1.0916
+0.30382 -0.22998 -1.0921
+0.30812 -0.23012 -1.0928
+0.31232 -0.23018 -1.0931
+0.31663 -0.23031 -1.0938
+0.32098 -0.23048 -1.0946
+0.32524 -0.23057 -1.0951
+0.32737 -0.23061 -1.0954
+0.32964 -0.23076 -1.0961
+0.3306 -0.23071 -1.0959
+-0.3056 -0.21502 -1.0158
+-0.30459 -0.21498 -1.0156
+-0.30399 -0.21523 -1.0168
+-0.30303 -0.21524 -1.0168
+-0.30132 -0.21538 -1.0175
+-0.29653 -0.21609 -1.0208
+-0.29589 -0.21633 -1.0219
+-0.29823 -0.22768 -1.0761
+0.32849 -0.23171 -1.0957
+0.32951 -0.2317 -1.0957
+0.33064 -0.23177 -1.096
+-0.30546 -0.21588 -1.0154
+-0.30445 -0.21584 -1.0152
+-0.30358 -0.2159 -1.0155
+-0.30184 -0.21603 -1.016
+-0.30012 -0.21618 -1.0167
+-0.29848 -0.21638 -1.0176
+-0.29696 -0.21666 -1.019
+-0.29551 -0.21701 -1.0206
+-0.29487 -0.21725 -1.0217
+-0.29862 -0.22822 -1.0739
+-0.29649 -0.22814 -1.0735
+-0.29439 -0.22808 -1.0732
+0.32741 -0.23271 -1.0955
+0.32954 -0.23275 -1.0958
+0.33061 -0.23278 -1.0959
+-0.30523 -0.21667 -1.0146
+-0.30432 -0.21671 -1.0147
+-0.30336 -0.21671 -1.0147
+-0.30244 -0.21673 -1.0148
+-0.30065 -0.21682 -1.0152
+-0.29446 -0.21791 -1.0203
+-0.29378 -0.21812 -1.0213
+-0.29693 -0.22871 -1.0714
+0.32848 -0.23377 -1.0957
+0.32957 -0.23381 -1.0959
+0.33075 -0.23391 -1.0964
+-0.30496 -0.21744 -1.0137
+-0.30395 -0.2174 -1.0135
+-0.30316 -0.21752 -1.014
+-0.30134 -0.21758 -1.0143
+-0.29958 -0.2177 -1.0149
+-0.29628 -0.21809 -1.0166
+-0.29475 -0.21838 -1.018
+-0.29337 -0.21878 -1.0199
+-0.2974 -0.22931 -1.0695
+-0.29528 -0.22923 -1.069
+-0.29139 -0.22934 -1.0695
+-0.28754 -0.22948 -1.0702
+-0.28391 -0.22981 -1.0717
+-0.28029 -0.23016 -1.0733
+-0.27672 -0.23056 -1.0752
+-0.27314 -0.23096 -1.077
+-0.26954 -0.23136 -1.0789
+-0.26577 -0.23162 -1.0801
+-0.26187 -0.23178 -1.0808
+-0.25789 -0.23186 -1.0812
+-0.25384 -0.23189 -1.0813
+-0.2497 -0.23184 -1.081
+-0.24559 -0.2318 -1.0808
+-0.24128 -0.23158 -1.0797
+-0.2371 -0.23148 -1.0792
+-0.23293 -0.23138 -1.0788
+-0.22884 -0.23136 -1.0786
+-0.22474 -0.23133 -1.0785
+-0.22082 -0.23149 -1.0792
+-0.21687 -0.23161 -1.0798
+-0.21289 -0.23172 -1.0803
+-0.20884 -0.23175 -1.0804
+-0.20476 -0.23174 -1.0804
+-0.20068 -0.23174 -1.0804
+-0.19659 -0.23172 -1.0803
+-0.19248 -0.23168 -1.0801
+-0.18827 -0.23152 -1.0793
+-0.18407 -0.23137 -1.0786
+-0.17988 -0.23121 -1.0778
+-0.1757 -0.23106 -1.0771
+-0.17147 -0.23084 -1.0761
+-0.16741 -0.23084 -1.0761
+-0.16335 -0.23084 -1.0761
+-0.15934 -0.23092 -1.0764
+-0.15543 -0.23114 -1.0775
+-0.15151 -0.23137 -1.0786
+-0.14751 -0.23147 -1.079
+-0.14348 -0.23154 -1.0794
+-0.13941 -0.23155 -1.0794
+-0.13532 -0.23151 -1.0793
+-0.13126 -0.23153 -1.0794
+-0.12716 -0.23149 -1.0791
+-0.12305 -0.23142 -1.0788
+-0.11896 -0.23138 -1.0786
+-0.1149 -0.23141 -1.0788
+-0.11082 -0.23138 -1.0787
+-0.10671 -0.23129 -1.0782
+-0.10259 -0.23118 -1.0777
+-0.098485 -0.23109 -1.0773
+-0.094369 -0.23097 -1.0767
+-0.090268 -0.23087 -1.0763
+-0.086217 -0.2309 -1.0764
+-0.08218 -0.23097 -1.0767
+-0.078201 -0.23122 -1.0779
+-0.074163 -0.23131 -1.0783
+-0.07011 -0.23136 -1.0786
+-0.066013 -0.23127 -1.0782
+-0.061923 -0.23119 -1.0778
+-0.057849 -0.23116 -1.0777
+-0.053749 -0.23102 -1.077
+-0.049643 -0.23082 -1.076
+-0.045556 -0.23069 -1.0754
+-0.041462 -0.23049 -1.0745
+-0.037387 -0.23036 -1.0739
+-0.033328 -0.23032 -1.0737
+-0.029271 -0.23028 -1.0735
+-0.025227 -0.23034 -1.0738
+-0.021198 -0.23059 -1.075
+-0.017153 -0.23075 -1.0757
+-0.013108 -0.23099 -1.0769
+-0.009048 -0.23108 -1.0773
+-0.004982 -0.23106 -1.0772
+-0.000917 -0.23102 -1.077
+0.003146 -0.23101 -1.077
+0.007211 -0.23103 -1.0771
+0.011276 -0.23105 -1.0771
+0.015339 -0.23103 -1.077
+0.01941 -0.2311 -1.0774
+0.023467 -0.23103 -1.077
+0.027529 -0.23101 -1.0769
+0.031586 -0.23096 -1.0767
+0.035627 -0.23081 -1.076
+0.039643 -0.23056 -1.0748
+0.043646 -0.23028 -1.0735
+0.047661 -0.23011 -1.0727
+0.051689 -0.23002 -1.0722
+0.055704 -0.22989 -1.0716
+0.0597 -0.2297 -1.0708
+0.063743 -0.22971 -1.0708
+0.067857 -0.22996 -1.072
+0.071936 -0.23006 -1.0725
+0.07602 -0.23018 -1.073
+0.080098 -0.23026 -1.0734
+0.084211 -0.23043 -1.0742
+0.088342 -0.23063 -1.0751
+0.092422 -0.23069 -1.0754
+0.096502 -0.23074 -1.0756
+0.10049 -0.23058 -1.0749
+0.10442 -0.23031 -1.0736
+0.10831 -0.22995 -1.0719
+0.11226 -0.22976 -1.071
+0.11629 -0.22973 -1.0709
+0.12036 -0.2298 -1.0712
+0.12446 -0.2299 -1.0716
+0.12854 -0.22996 -1.0719
+0.13258 -0.22996 -1.0719
+0.1366 -0.22992 -1.0717
+0.14068 -0.22997 -1.0719
+0.14479 -0.23006 -1.0724
+0.14888 -0.23014 -1.0728
+0.15296 -0.23018 -1.0729
+0.15705 -0.23025 -1.0733
+0.1612 -0.23038 -1.0739
+0.16525 -0.23038 -1.0739
+0.16939 -0.2305 -1.0745
+0.17354 -0.23063 -1.0751
+0.17765 -0.2307 -1.0754
+0.18181 -0.23082 -1.076
+0.18589 -0.23085 -1.0761
+0.19002 -0.23094 -1.0766
+0.19424 -0.23112 -1.0774
+0.19839 -0.23122 -1.0779
+0.2025 -0.23126 -1.0781
+0.20667 -0.23139 -1.0787
+0.21087 -0.23152 -1.0794
+0.21502 -0.23161 -1.0798
+0.21918 -0.2317 -1.0802
+0.22337 -0.23181 -1.0808
+0.22748 -0.23184 -1.0809
+0.23168 -0.23197 -1.0816
+0.23594 -0.23215 -1.0824
+0.24006 -0.23218 -1.0826
+0.24424 -0.23227 -1.083
+0.24843 -0.23237 -1.0835
+0.25266 -0.2325 -1.0841
+0.25694 -0.23267 -1.085
+0.26113 -0.23276 -1.0854
+0.26538 -0.23289 -1.0861
+0.2696 -0.23301 -1.0866
+0.27379 -0.23308 -1.087
+0.27806 -0.23322 -1.0877
+0.28231 -0.23334 -1.0883
+0.28664 -0.23352 -1.0892
+0.29088 -0.23363 -1.0897
+0.29515 -0.23376 -1.0904
+0.29945 -0.2339 -1.0911
+0.30367 -0.23399 -1.0916
+0.30803 -0.23417 -1.0925
+0.31231 -0.2343 -1.0931
+0.31656 -0.23439 -1.0936
+0.32089 -0.23454 -1.0943
+0.32543 -0.23484 -1.0958
+0.3275 -0.23484 -1.0959
+0.32952 -0.23481 -1.0957
+0.33052 -0.23478 -1.0956
+-0.30485 -0.21831 -1.0133
+-0.30389 -0.21832 -1.0133
+-0.30294 -0.21832 -1.0133
+-0.30199 -0.21832 -1.0133
+-0.30018 -0.2184 -1.0137
+-0.29368 -0.21926 -1.0176
+-0.29303 -0.21949 -1.0187
+-0.2958 -0.22985 -1.0673
+0.32862 -0.23593 -1.0962
+0.32965 -0.23593 -1.0962
+0.33074 -0.23597 -1.0964
+-0.30452 -0.21903 -1.0122
+-0.30355 -0.21903 -1.0122
+-0.30265 -0.21906 -1.0123
+-0.30082 -0.21912 -1.0126
+-0.29909 -0.21926 -1.0132
+-0.29742 -0.21943 -1.014
+-0.2957 -0.21957 -1.0146
+-0.29409 -0.21981 -1.0157
+-0.29271 -0.22021 -1.0176
+-0.29208 -0.22046 -1.0187
+-0.29524 -0.23042 -1.0652
+-0.29423 -0.23042 -1.0652
+-0.29233 -0.23051 -1.0656
+-0.29046 -0.23061 -1.0661
+-0.28855 -0.2307 -1.0665
+-0.28667 -0.2308 -1.0669
+-0.28483 -0.23094 -1.0676
+-0.28317 -0.23124 -1.0689
+-0.28132 -0.23137 -1.0695
+-0.27954 -0.23156 -1.0704
+-0.27774 -0.23175 -1.0713
+-0.27593 -0.23193 -1.0721
+-0.27416 -0.23214 -1.073
+-0.27233 -0.23231 -1.0738
+-0.27046 -0.23244 -1.0744
+-0.26872 -0.23269 -1.0756
+-0.2668 -0.23278 -1.076
+-0.26491 -0.2329 -1.0765
+-0.26292 -0.23294 -1.0767
+-0.26094 -0.23299 -1.0769
+-0.25895 -0.23302 -1.0771
+-0.25694 -0.23304 -1.0772
+-0.25486 -0.233 -1.0769
+-0.25283 -0.233 -1.0769
+-0.2507 -0.23291 -1.0765
+-0.24862 -0.23287 -1.0763
+-0.24661 -0.23288 -1.0763
+-0.24452 -0.23282 -1.0761
+-0.24246 -0.23279 -1.0759
+-0.24035 -0.23272 -1.0755
+-0.23827 -0.23267 -1.0753
+-0.23623 -0.23266 -1.0752
+-0.23411 -0.23257 -1.0748
+-0.23204 -0.23253 -1.0746
+-0.22998 -0.23249 -1.0744
+-0.22797 -0.23251 -1.0745
+-0.22592 -0.23249 -1.0744
+-0.22396 -0.23255 -1.0747
+-0.22201 -0.23264 -1.0751
+-0.22004 -0.2327 -1.0754
+-0.21805 -0.23274 -1.0756
+-0.21609 -0.23281 -1.0759
+-0.21406 -0.23282 -1.0759
+-0.21208 -0.23287 -1.0762
+-0.21006 -0.23289 -1.0762
+-0.20803 -0.23288 -1.0762
+-0.206 -0.23288 -1.0762
+-0.204 -0.23291 -1.0763
+-0.20196 -0.23291 -1.0763
+-0.19992 -0.23289 -1.0762
+-0.19787 -0.23287 -1.0761
+-0.19576 -0.23278 -1.0757
+-0.19372 -0.23276 -1.0756
+-0.19168 -0.23276 -1.0756
+-0.1896 -0.23269 -1.0753
+-0.18756 -0.23267 -1.0752
+-0.18549 -0.23263 -1.0749
+-0.18338 -0.23253 -1.0745
+-0.18131 -0.23247 -1.0742
+-0.17921 -0.23238 -1.0738
+-0.17712 -0.23229 -1.0734
+-0.17504 -0.23221 -1.073
+-0.17293 -0.23211 -1.0725
+-0.17084 -0.23201 -1.0721
+-0.16881 -0.232 -1.072
+-0.16677 -0.23198 -1.0719
+-0.16476 -0.232 -1.072
+-0.16276 -0.23202 -1.0721
+-0.16078 -0.23209 -1.0724
+-0.15879 -0.23213 -1.0726
+-0.1568 -0.23219 -1.0729
+-0.15486 -0.23232 -1.0735
+-0.15292 -0.23245 -1.0741
+-0.15097 -0.23257 -1.0747
+-0.14899 -0.23264 -1.075
+-0.14698 -0.23267 -1.0751
+-0.14495 -0.23267 -1.0751
+-0.14294 -0.2327 -1.0753
+-0.14094 -0.23275 -1.0755
+-0.13887 -0.23268 -1.0752
+-0.13683 -0.23266 -1.0751
+-0.1348 -0.23265 -1.075
+-0.13276 -0.23264 -1.075
+-0.13075 -0.23266 -1.0751
+-0.12871 -0.23265 -1.0751
+-0.12668 -0.23264 -1.075
+-0.12463 -0.2326 -1.0748
+-0.12258 -0.23256 -1.0746
+-0.12054 -0.23254 -1.0745
+-0.1185 -0.23251 -1.0744
+-0.11647 -0.23251 -1.0744
+-0.11445 -0.23252 -1.0745
+-0.11242 -0.23252 -1.0744
+-0.11037 -0.23247 -1.0742
+-0.10833 -0.23244 -1.0741
+-0.10627 -0.23238 -1.0738
+-0.10422 -0.23233 -1.0735
+-0.10217 -0.23227 -1.0733
+-0.10011 -0.23219 -1.0729
+-0.098048 -0.23209 -1.0724
+-0.096011 -0.23206 -1.0723
+-0.093975 -0.23203 -1.0722
+-0.091931 -0.23198 -1.0719
+-0.089899 -0.23195 -1.0718
+-0.087886 -0.23198 -1.0719
+-0.085872 -0.232 -1.072
+-0.083852 -0.23201 -1.0721
+-0.081863 -0.23211 -1.0725
+-0.079871 -0.2322 -1.073
+-0.077886 -0.23231 -1.0735
+-0.075887 -0.23239 -1.0739
+-0.073889 -0.23248 -1.0743
+-0.071874 -0.23252 -1.0745
+-0.069841 -0.2325 -1.0744
+-0.067796 -0.23244 -1.0741
+-0.065754 -0.23239 -1.0739
+-0.063713 -0.23233 -1.0736
+-0.061674 -0.23229 -1.0734
+-0.059642 -0.23226 -1.0733
+-0.057599 -0.23219 -1.0729
+-0.055545 -0.23207 -1.0724
+-0.053524 -0.23208 -1.0724
+-0.051477 -0.23197 -1.0719
+-0.049434 -0.23187 -1.0715
+-0.047393 -0.23178 -1.071
+-0.045362 -0.23172 -1.0708
+-0.043321 -0.23161 -1.0703
+-0.041288 -0.23154 -1.0699
+-0.03926 -0.23149 -1.0697
+-0.037235 -0.23145 -1.0695
+-0.035207 -0.23138 -1.0692
+-0.033192 -0.23139 -1.0692
+-0.031171 -0.23137 -1.0691
+-0.029154 -0.23138 -1.0692
+-0.027143 -0.23143 -1.0694
+-0.025128 -0.23146 -1.0695
+-0.023123 -0.23159 -1.0701
+-0.021113 -0.23169 -1.0706
+-0.019107 -0.23186 -1.0714
+-0.017091 -0.23194 -1.0718
+-0.015073 -0.232 -1.0721
+-0.013058 -0.23214 -1.0727
+-0.011038 -0.23222 -1.0731
+-0.009014 -0.23224 -1.0732
+-0.00699 -0.23226 -1.0733
+-0.004964 -0.23224 -1.0732
+-0.002938 -0.23216 -1.0728
+-0.000914 -0.23213 -1.0727
+0.00111 -0.23205 -1.0723
+0.003134 -0.23209 -1.0725
+0.005157 -0.2321 -1.0725
+0.007181 -0.23209 -1.0725
+0.009204 -0.23209 -1.0725
+0.011228 -0.23209 -1.0725
+0.01325 -0.23206 -1.0724
+0.015273 -0.23205 -1.0723
+0.017297 -0.23206 -1.0723
+0.019322 -0.23209 -1.0725
+0.021348 -0.23212 -1.0726
+0.02338 -0.2322 -1.073
+0.025404 -0.23219 -1.0729
+0.027436 -0.23225 -1.0733
+0.029453 -0.23219 -1.073
+0.031474 -0.23217 -1.0728
+0.033499 -0.23217 -1.0729
+0.035502 -0.23203 -1.0722
+0.0375 -0.23188 -1.0715
+0.039498 -0.23174 -1.0708
+0.041494 -0.2316 -1.0702
+0.043504 -0.23155 -1.0699
+0.045491 -0.23139 -1.0692
+0.047491 -0.2313 -1.0688
+0.049499 -0.23126 -1.0686
+0.051506 -0.23122 -1.0684
+0.053517 -0.2312 -1.0683
+0.055522 -0.23115 -1.0681
+0.057521 -0.23108 -1.0678
+0.059524 -0.23104 -1.0676
+0.061533 -0.23102 -1.0675
+0.063548 -0.23102 -1.0675
+0.065555 -0.231 -1.0673
+0.067585 -0.23105 -1.0676
+0.069637 -0.23117 -1.0682
+0.071657 -0.23119 -1.0682
+0.073681 -0.23122 -1.0684
+0.075723 -0.2313 -1.0687
+0.077742 -0.2313 -1.0688
+0.07977 -0.23133 -1.0689
+0.081792 -0.23135 -1.069
+0.083829 -0.2314 -1.0692
+0.085909 -0.23157 -1.07
+0.087953 -0.23164 -1.0703
+0.089944 -0.23156 -1.07
+0.092024 -0.23172 -1.0707
+0.094059 -0.23175 -1.0709
+0.096106 -0.23181 -1.0712
+0.09813 -0.23182 -1.0712
+0.10016 -0.23185 -1.0713
+0.10214 -0.23176 -1.0709
+0.1041 -0.23161 -1.0702
+0.10605 -0.23147 -1.0695
+0.10801 -0.23133 -1.0689
+0.10996 -0.2312 -1.0682
+0.11198 -0.23121 -1.0683
+0.114 -0.23121 -1.0683
+0.11605 -0.23129 -1.0687
+0.11806 -0.23127 -1.0686
+0.1201 -0.23131 -1.0688
+0.12216 -0.23139 -1.0691
+0.12419 -0.23142 -1.0693
+0.12621 -0.23143 -1.0693
+0.12826 -0.23149 -1.0696
+0.13028 -0.23148 -1.0696
+0.13233 -0.23154 -1.0698
+0.13437 -0.23157 -1.07
+0.13642 -0.23162 -1.0702
+0.13844 -0.23163 -1.0703
+0.14048 -0.23167 -1.0705
+0.14253 -0.23171 -1.0706
+0.14458 -0.23176 -1.0709
+0.14661 -0.23177 -1.0709
+0.14866 -0.23181 -1.0711
+0.15071 -0.23187 -1.0714
+0.15277 -0.23193 -1.0717
+0.15483 -0.23198 -1.0719
+0.15689 -0.23204 -1.0722
+0.15896 -0.2321 -1.0725
+0.16101 -0.23214 -1.0727
+0.16307 -0.23219 -1.0729
+0.16512 -0.23223 -1.0731
+0.1672 -0.23231 -1.0734
+0.16923 -0.23231 -1.0735
+0.17132 -0.23239 -1.0739
+0.17342 -0.23249 -1.0743
+0.17546 -0.23252 -1.0744
+0.17756 -0.23261 -1.0749
+0.1796 -0.23262 -1.0749
+0.18168 -0.23269 -1.0753
+0.18374 -0.23273 -1.0754
+0.1858 -0.23277 -1.0756
+0.18784 -0.23278 -1.0757
+0.18988 -0.2328 -1.0757
+0.19203 -0.23294 -1.0764
+0.19412 -0.23301 -1.0768
+0.19619 -0.23305 -1.077
+0.19823 -0.23307 -1.077
+0.20034 -0.23316 -1.0774
+0.20246 -0.23325 -1.0779
+0.20447 -0.23322 -1.0778
+0.20658 -0.23332 -1.0782
+0.20872 -0.23344 -1.0788
+0.21084 -0.23353 -1.0792
+0.21292 -0.23357 -1.0794
+0.215 -0.23363 -1.0797
+0.21712 -0.23371 -1.0801
+0.21918 -0.23374 -1.0802
+0.22121 -0.23373 -1.0802
+0.22328 -0.23376 -1.0803
+0.22537 -0.23382 -1.0806
+0.22745 -0.23386 -1.0808
+0.22953 -0.2339 -1.081
+0.23163 -0.23396 -1.0813
+0.23375 -0.23404 -1.0817
+0.23588 -0.23413 -1.0821
+0.23794 -0.23415 -1.0822
+0.24002 -0.23419 -1.0824
+0.24207 -0.23419 -1.0824
+0.24421 -0.23429 -1.0829
+0.24636 -0.23439 -1.0834
+0.24849 -0.23447 -1.0838
+0.25055 -0.23448 -1.0838
+0.25273 -0.23461 -1.0845
+0.25489 -0.23471 -1.0849
+0.25698 -0.23475 -1.0851
+0.25903 -0.23476 -1.0852
+0.26114 -0.23482 -1.0855
+0.26325 -0.23487 -1.0857
+0.26537 -0.23493 -1.086
+0.26748 -0.23499 -1.0863
+0.2696 -0.23505 -1.0866
+0.27176 -0.23515 -1.0871
+0.27391 -0.23523 -1.0875
+0.27602 -0.23528 -1.0877
+0.27812 -0.23532 -1.0879
+0.28022 -0.23537 -1.0882
+0.28235 -0.23543 -1.0885
+0.28452 -0.23553 -1.089
+0.28673 -0.23565 -1.0896
+0.28875 -0.23563 -1.0895
+0.29096 -0.23575 -1.0901
+0.29304 -0.23577 -1.0902
+0.29516 -0.23583 -1.0904
+0.29746 -0.23602 -1.0914
+0.29951 -0.23601 -1.0914
+0.30155 -0.236 -1.0913
+0.30377 -0.23613 -1.0919
+0.30589 -0.23617 -1.0922
+0.30805 -0.23625 -1.0926
+0.31021 -0.23632 -1.0929
+0.31235 -0.23639 -1.0933
+0.31456 -0.2365 -1.0938
+0.31668 -0.23654 -1.094
+0.3189 -0.23666 -1.0946
+0.32103 -0.2367 -1.0948
+0.3232 -0.23679 -1.0953
+0.32546 -0.23693 -1.0959
+0.32754 -0.23693 -1.096
+0.32968 -0.23699 -1.0963
+0.33094 -0.23716 -1.0971
+-0.30427 -0.21981 -1.0114
+-0.3033 -0.2198 -1.0113
+-0.3025 -0.21991 -1.0118
+-0.30155 -0.21991 -1.0118
+-0.2997 -0.21996 -1.012
+-0.29809 -0.22018 -1.013
+-0.29637 -0.22032 -1.0137
+-0.29461 -0.22044 -1.0142
+-0.29309 -0.22073 -1.0155
+-0.29165 -0.22109 -1.0172
+-0.29462 -0.23095 -1.063
+-0.29266 -0.23098 -1.0631
+-0.29083 -0.23112 -1.0638
+-0.2891 -0.23134 -1.0648
+-0.28709 -0.23134 -1.0647
+-0.28531 -0.23152 -1.0656
+-0.2835 -0.23169 -1.0663
+-0.28181 -0.23195 -1.0676
+-0.28001 -0.23213 -1.0683
+-0.27824 -0.23234 -1.0693
+-0.27648 -0.23255 -1.0703
+-0.27473 -0.23278 -1.0713
+-0.27275 -0.23282 -1.0715
+-0.27109 -0.23312 -1.0729
+-0.26921 -0.23325 -1.0735
+-0.26732 -0.23337 -1.074
+-0.26538 -0.23344 -1.0743
+-0.2634 -0.23348 -1.0745
+-0.26145 -0.23355 -1.0748
+-0.25952 -0.23364 -1.0752
+-0.25747 -0.23362 -1.0751
+-0.25536 -0.23354 -1.0747
+-0.25332 -0.23353 -1.0747
+-0.25128 -0.23352 -1.0746
+-0.24923 -0.2335 -1.0745
+-0.24713 -0.23343 -1.0741
+-0.24507 -0.2334 -1.074
+-0.24304 -0.2334 -1.074
+-0.24093 -0.23331 -1.0736
+-0.23887 -0.23328 -1.0734
+-0.23677 -0.2332 -1.0731
+-0.23474 -0.2332 -1.0731
+-0.23269 -0.23318 -1.0729
+-0.23053 -0.23304 -1.0723
+-0.22854 -0.23307 -1.0724
+-0.22654 -0.23309 -1.0725
+-0.22451 -0.23309 -1.0725
+-0.22254 -0.23315 -1.0728
+-0.22062 -0.23325 -1.0732
+-0.21857 -0.23322 -1.0731
+-0.21663 -0.23332 -1.0735
+-0.21468 -0.2334 -1.0739
+-0.21263 -0.23337 -1.0738
+-0.21066 -0.23344 -1.0741
+-0.20866 -0.23347 -1.0742
+-0.20659 -0.23342 -1.074
+-0.2046 -0.23346 -1.0741
+-0.20259 -0.23348 -1.0742
+-0.20054 -0.23345 -1.0741
+-0.19848 -0.23341 -1.0739
+-0.19644 -0.2334 -1.0738
+-0.19441 -0.23339 -1.0738
+-0.19233 -0.23332 -1.0735
+-0.19024 -0.23325 -1.0731
+-0.18824 -0.23328 -1.0733
+-0.18618 -0.23324 -1.0731
+-0.18408 -0.23314 -1.0726
+-0.18198 -0.23304 -1.0722
+-0.17992 -0.233 -1.0719
+-0.17783 -0.23291 -1.0715
+-0.17578 -0.23286 -1.0713
+-0.17365 -0.23272 -1.0707
+-0.17154 -0.23261 -1.0701
+-0.16952 -0.23261 -1.0701
+-0.16746 -0.23254 -1.0698
+-0.16542 -0.23252 -1.0697
+-0.16348 -0.23262 -1.0702
+-0.16146 -0.23263 -1.0702
+-0.15946 -0.23265 -1.0703
+-0.15751 -0.23275 -1.0708
+-0.15552 -0.23281 -1.0711
+-0.15359 -0.23294 -1.0717
+-0.15165 -0.23306 -1.0722
+-0.1497 -0.23318 -1.0728
+-0.14775 -0.2333 -1.0733
+-0.14568 -0.23322 -1.073
+-0.14366 -0.23323 -1.073
+-0.14164 -0.23324 -1.0731
+-0.13962 -0.23325 -1.0731
+-0.13756 -0.2332 -1.0729
+-0.13554 -0.2332 -1.0729
+-0.13353 -0.23322 -1.073
+-0.13152 -0.23325 -1.0731
+-0.12949 -0.23325 -1.0731
+-0.12747 -0.23325 -1.0731
+-0.12544 -0.23325 -1.0731
+-0.12333 -0.23307 -1.0723
+-0.12131 -0.23309 -1.0724
+-0.11928 -0.23307 -1.0723
+-0.11725 -0.23307 -1.0723
+-0.11522 -0.23306 -1.0722
+-0.11319 -0.23303 -1.0721
+-0.11114 -0.23298 -1.0719
+-0.10912 -0.23298 -1.0719
+-0.10709 -0.23296 -1.0718
+-0.105 -0.23281 -1.0711
+-0.10298 -0.23281 -1.0711
+-0.10093 -0.23275 -1.0708
+-0.098877 -0.23267 -1.0704
+-0.096832 -0.23261 -1.0702
+-0.094782 -0.23254 -1.0698
+-0.092721 -0.23243 -1.0693
+-0.09072 -0.23248 -1.0695
+-0.088708 -0.23249 -1.0696
+-0.086704 -0.23253 -1.0698
+-0.084696 -0.23256 -1.0699
+-0.082704 -0.23264 -1.0703
+-0.080709 -0.23271 -1.0706
+-0.07872 -0.2328 -1.071
+-0.076739 -0.23292 -1.0716
+-0.07473 -0.23296 -1.0718
+-0.072754 -0.23311 -1.0725
+-0.070731 -0.23311 -1.0725
+-0.068678 -0.23301 -1.072
+-0.066638 -0.23295 -1.0718
+-0.064603 -0.23291 -1.0716
+-0.062563 -0.23284 -1.0712
+-0.060535 -0.23281 -1.0711
+-0.058497 -0.23275 -1.0708
+-0.056456 -0.23266 -1.0704
+-0.05443 -0.23263 -1.0703
+-0.052384 -0.23252 -1.0698
+-0.050347 -0.23243 -1.0694
+-0.048325 -0.23241 -1.0693
+-0.046277 -0.23226 -1.0686
+-0.044251 -0.23221 -1.0683
+-0.042212 -0.23208 -1.0677
+-0.040188 -0.23203 -1.0675
+-0.038171 -0.23201 -1.0674
+-0.036146 -0.23194 -1.0671
+-0.034128 -0.23191 -1.0669
+-0.032111 -0.23189 -1.0668
+-0.030103 -0.23193 -1.067
+-0.028095 -0.23196 -1.0672
+-0.026082 -0.23198 -1.0672
+-0.024082 -0.23211 -1.0679
+-0.022082 -0.23227 -1.0686
+-0.020073 -0.23235 -1.069
+-0.018063 -0.23244 -1.0694
+-0.016051 -0.23253 -1.0698
+-0.01404 -0.23265 -1.0704
+-0.012027 -0.23279 -1.071
+-0.010005 -0.23275 -1.0709
+-0.007989 -0.23288 -1.0714
+-0.005966 -0.23283 -1.0712
+-0.003943 -0.23276 -1.0709
+-0.001922 -0.23271 -1.0706
+9.8e-005 -0.2327 -1.0706
+0.002117 -0.23262 -1.0702
+0.004137 -0.23261 -1.0702
+0.006155 -0.23258 -1.0701
+0.008174 -0.23257 -1.07
+0.010194 -0.23258 -1.0701
+0.012213 -0.23259 -1.0701
+0.014227 -0.23251 -1.0697
+0.016247 -0.23253 -1.0698
+0.018267 -0.23254 -1.0699
+0.020286 -0.23255 -1.0699
+0.022321 -0.23272 -1.0707
+0.024341 -0.23272 -1.0707
+0.026361 -0.23272 -1.0707
+0.028393 -0.23281 -1.0711
+0.030406 -0.23275 -1.0708
+0.032423 -0.23272 -1.0707
+0.034438 -0.23269 -1.0706
+0.036436 -0.23255 -1.0699
+0.03844 -0.23245 -1.0695
+0.04042 -0.23224 -1.0684
+0.042418 -0.23214 -1.068
+0.044415 -0.23205 -1.0676
+0.046402 -0.23191 -1.0669
+0.048417 -0.23191 -1.0669
+0.050405 -0.2318 -1.0664
+0.05242 -0.23181 -1.0665
+0.054438 -0.23184 -1.0666
+0.056444 -0.23181 -1.0664
+0.058446 -0.23177 -1.0663
+0.060439 -0.23169 -1.0659
+0.062432 -0.23163 -1.0656
+0.064438 -0.23161 -1.0655
+0.066477 -0.23171 -1.066
+0.068499 -0.23174 -1.0661
+0.070515 -0.23176 -1.0662
+0.072529 -0.23176 -1.0662
+0.07457 -0.23185 -1.0666
+0.07658 -0.23184 -1.0666
+0.078591 -0.23184 -1.0666
+0.080642 -0.23195 -1.0671
+0.082662 -0.23197 -1.0672
+0.084723 -0.2321 -1.0678
+0.086749 -0.23213 -1.0679
+0.088767 -0.23213 -1.0679
+0.090806 -0.2322 -1.0682
+0.092838 -0.23224 -1.0684
+0.09488 -0.2323 -1.0687
+0.096919 -0.23235 -1.069
+0.098936 -0.23235 -1.069
+0.10096 -0.23237 -1.069
+0.10295 -0.23232 -1.0688
+0.10493 -0.23222 -1.0683
+0.1069 -0.23213 -1.0679
+0.10883 -0.23194 -1.067
+0.10982 -0.2319 -1.0668
+0.11085 -0.23195 -1.0671
+0.11289 -0.232 -1.0673
+0.11493 -0.23205 -1.0675
+0.11694 -0.23206 -1.0676
+0.11896 -0.23206 -1.0676
+0.12102 -0.23215 -1.068
+0.12304 -0.23216 -1.068
+0.1251 -0.23224 -1.0684
+0.12713 -0.23227 -1.0685
+0.12915 -0.23227 -1.0685
+0.1312 -0.23234 -1.0689
+0.13328 -0.23245 -1.0694
+0.13526 -0.23239 -1.0691
+0.13732 -0.23245 -1.0694
+0.13936 -0.23249 -1.0696
+0.14146 -0.23262 -1.0702
+0.14348 -0.23263 -1.0702
+0.1455 -0.23263 -1.0702
+0.14755 -0.23267 -1.0704
+0.14963 -0.23276 -1.0708
+0.1517 -0.23283 -1.0712
+0.15373 -0.23286 -1.0713
+0.15577 -0.23289 -1.0714
+0.15782 -0.23293 -1.0716
+0.15994 -0.23307 -1.0723
+0.16201 -0.23313 -1.0725
+0.16405 -0.23316 -1.0727
+0.16615 -0.23326 -1.0732
+0.16819 -0.23328 -1.0733
+0.17027 -0.23336 -1.0736
+0.17232 -0.2334 -1.0738
+0.17441 -0.23348 -1.0742
+0.1765 -0.23356 -1.0746
+0.17857 -0.23361 -1.0748
+0.18063 -0.23366 -1.0751
+0.18268 -0.23368 -1.0751
+0.18475 -0.23374 -1.0754
+0.1868 -0.23377 -1.0756
+0.18883 -0.23377 -1.0756
+0.19096 -0.23388 -1.0761
+0.19306 -0.23398 -1.0765
+0.19513 -0.23402 -1.0767
+0.19717 -0.23403 -1.0768
+0.19926 -0.2341 -1.0771
+0.20136 -0.23418 -1.0775
+0.20343 -0.23422 -1.0777
+0.20553 -0.2343 -1.078
+0.20763 -0.23437 -1.0784
+0.2098 -0.23452 -1.0791
+0.21184 -0.23453 -1.0791
+0.21394 -0.2346 -1.0795
+0.21602 -0.23465 -1.0797
+0.21812 -0.23472 -1.08
+0.22018 -0.23474 -1.0801
+0.22222 -0.23474 -1.0801
+0.22431 -0.23479 -1.0804
+0.22638 -0.23483 -1.0806
+0.22847 -0.23488 -1.0808
+0.23056 -0.23493 -1.0811
+0.23266 -0.23499 -1.0814
+0.2348 -0.2351 -1.0819
+0.2369 -0.23515 -1.0821
+0.23894 -0.23515 -1.0821
+0.24101 -0.23518 -1.0823
+0.24314 -0.23527 -1.0827
+0.24535 -0.23542 -1.0834
+0.24742 -0.23545 -1.0836
+0.24949 -0.23547 -1.0837
+0.25166 -0.23559 -1.0842
+0.25381 -0.23568 -1.0847
+0.25591 -0.23574 -1.0849
+0.25804 -0.23582 -1.0853
+0.26014 -0.23586 -1.0856
+0.26223 -0.2359 -1.0857
+0.26438 -0.23599 -1.0862
+0.26642 -0.23598 -1.0862
+0.26853 -0.23604 -1.0864
+0.27068 -0.23613 -1.0869
+0.27278 -0.23617 -1.0871
+0.27494 -0.23626 -1.0875
+0.27704 -0.2363 -1.0877
+0.2792 -0.23639 -1.0882
+0.28133 -0.23646 -1.0885
+0.28339 -0.23647 -1.0886
+0.2856 -0.2366 -1.0892
+0.28783 -0.23674 -1.0899
+0.28987 -0.23673 -1.0898
+0.29193 -0.23673 -1.0899
+0.29401 -0.23675 -1.09
+0.29635 -0.23699 -1.0911
+0.29844 -0.23701 -1.0912
+0.3005 -0.23701 -1.0912
+0.30269 -0.23711 -1.0917
+0.30495 -0.23727 -1.0925
+0.307 -0.23727 -1.0925
+0.30912 -0.23731 -1.0927
+0.31134 -0.23743 -1.0933
+0.31347 -0.23748 -1.0936
+0.31574 -0.23764 -1.0943
+0.31794 -0.23775 -1.0949
+0.31996 -0.23771 -1.0947
+0.3221 -0.23776 -1.095
+0.32437 -0.23791 -1.0957
+0.32656 -0.23801 -1.0962
+0.32862 -0.23801 -1.0962
+0.32979 -0.2381 -1.0967
+0.33086 -0.23813 -1.0968
+-0.30414 -0.22067 -1.011
+-0.30317 -0.22066 -1.0109
+-0.30212 -0.22059 -1.0106
+-0.30135 -0.22072 -1.0112
+-0.30038 -0.22071 -1.0111
+-0.29941 -0.2207 -1.0111
+-0.29855 -0.22077 -1.0113
+-0.29771 -0.22086 -1.0117
+-0.29694 -0.22099 -1.0124
+-0.29614 -0.22111 -1.0129
+-0.29511 -0.22105 -1.0126
+-0.29434 -0.22119 -1.0133
+-0.29361 -0.22136 -1.014
+-0.29279 -0.22146 -1.0145
+-0.29211 -0.22167 -1.0154
+-0.29142 -0.22188 -1.0164
+-0.29315 -0.23158 -1.0613
+-0.2923 -0.2317 -1.0618
+-0.29142 -0.23179 -1.0623
+-0.29043 -0.23181 -1.0623
+-0.28942 -0.2318 -1.0623
+-0.28857 -0.23192 -1.0628
+-0.28769 -0.23202 -1.0632
+-0.28667 -0.232 -1.0632
+-0.28586 -0.23216 -1.0639
+-0.28495 -0.23223 -1.0642
+-0.28411 -0.23237 -1.0648
+-0.28325 -0.23249 -1.0654
+-0.28223 -0.23247 -1.0653
+-0.28137 -0.2326 -1.0659
+-0.28053 -0.23273 -1.0665
+-0.27954 -0.23274 -1.0665
+-0.27871 -0.23289 -1.0672
+-0.27797 -0.23311 -1.0682
+-0.27703 -0.23317 -1.0685
+-0.27606 -0.2332 -1.0686
+-0.2751 -0.23325 -1.0688
+-0.27421 -0.23335 -1.0693
+-0.27344 -0.23355 -1.0702
+-0.27246 -0.23358 -1.0703
+-0.27165 -0.23374 -1.0711
+-0.27073 -0.23382 -1.0715
+-0.26975 -0.23385 -1.0716
+-0.26883 -0.23393 -1.0719
+-0.26793 -0.23402 -1.0724
+-0.26691 -0.23402 -1.0723
+-0.26591 -0.23403 -1.0724
+-0.26492 -0.23405 -1.0725
+-0.26386 -0.234 -1.0722
+-0.26301 -0.23415 -1.0729
+-0.26195 -0.2341 -1.0727
+-0.26093 -0.2341 -1.0726
+-0.26003 -0.2342 -1.0731
+-0.25902 -0.2342 -1.0731
+-0.25788 -0.23409 -1.0726
+-0.25693 -0.23414 -1.0728
+-0.25593 -0.23415 -1.0729
+-0.25492 -0.23416 -1.0729
+-0.25381 -0.23406 -1.0724
+-0.25285 -0.23411 -1.0727
+-0.2518 -0.23408 -1.0725
+-0.25083 -0.23412 -1.0727
+-0.24984 -0.23414 -1.0728
+-0.24875 -0.23406 -1.0724
+-0.24777 -0.23409 -1.0725
+-0.24669 -0.23403 -1.0722
+-0.24549 -0.23385 -1.0714
+-0.24451 -0.23387 -1.0715
+-0.2436 -0.23397 -1.072
+-0.24249 -0.23388 -1.0715
+-0.24142 -0.23382 -1.0713
+-0.24048 -0.23389 -1.0716
+-0.23942 -0.23384 -1.0713
+-0.23833 -0.23377 -1.071
+-0.23738 -0.23382 -1.0712
+-0.23638 -0.23383 -1.0713
+-0.23539 -0.23386 -1.0714
+-0.23425 -0.23373 -1.0708
+-0.23332 -0.2338 -1.0711
+-0.23227 -0.23376 -1.0709
+-0.23119 -0.23369 -1.0706
+-0.23016 -0.23368 -1.0705
+-0.22907 -0.23359 -1.0701
+-0.22812 -0.23365 -1.0704
+-0.2271 -0.23364 -1.0704
+-0.22614 -0.2337 -1.0706
+-0.22516 -0.23372 -1.0707
+-0.22412 -0.23369 -1.0706
+-0.22323 -0.23382 -1.0712
+-0.22211 -0.23371 -1.0706
+-0.22119 -0.2338 -1.0711
+-0.2202 -0.23383 -1.0712
+-0.21922 -0.23386 -1.0713
+-0.21822 -0.23386 -1.0714
+-0.2172 -0.23385 -1.0713
+-0.21612 -0.23378 -1.071
+-0.21524 -0.23392 -1.0716
+-0.21433 -0.23403 -1.0721
+-0.21316 -0.23386 -1.0713
+-0.21221 -0.23393 -1.0717
+-0.21129 -0.23403 -1.0721
+-0.21027 -0.23402 -1.072
+-0.20929 -0.23405 -1.0722
+-0.20835 -0.23413 -1.0726
+-0.20726 -0.23404 -1.0721
+-0.20619 -0.23398 -1.0718
+-0.2052 -0.23401 -1.072
+-0.20428 -0.2341 -1.0724
+-0.20321 -0.23404 -1.0721
+-0.20217 -0.234 -1.072
+-0.20114 -0.23399 -1.0719
+-0.20016 -0.23402 -1.072
+-0.19912 -0.23399 -1.0719
+-0.19813 -0.23401 -1.072
+-0.19711 -0.234 -1.0719
+-0.1961 -0.234 -1.0719
+-0.19506 -0.23397 -1.0718
+-0.19402 -0.23394 -1.0716
+-0.19307 -0.234 -1.0719
+-0.19193 -0.23385 -1.0712
+-0.19092 -0.23386 -1.0713
+-0.18991 -0.23385 -1.0712
+-0.18887 -0.23381 -1.0711
+-0.18785 -0.23381 -1.071
+-0.1868 -0.23376 -1.0708
+-0.18582 -0.23379 -1.071
+-0.18482 -0.23381 -1.071
+-0.18374 -0.23372 -1.0706
+-0.1827 -0.23368 -1.0704
+-0.18167 -0.23366 -1.0703
+-0.18067 -0.23367 -1.0704
+-0.17957 -0.23355 -1.0698
+-0.17854 -0.23352 -1.0697
+-0.17744 -0.2334 -1.0691
+-0.17646 -0.23344 -1.0693
+-0.17542 -0.23341 -1.0691
+-0.17442 -0.23341 -1.0692
+-0.17332 -0.23329 -1.0686
+-0.17225 -0.23321 -1.0682
+-0.17126 -0.23323 -1.0683
+-0.17019 -0.23314 -1.0679
+-0.16918 -0.23315 -1.0679
+-0.16817 -0.23314 -1.0679
+-0.16715 -0.23312 -1.0678
+-0.16611 -0.23307 -1.0676
+-0.16517 -0.23318 -1.0681
+-0.16412 -0.23311 -1.0678
+-0.16315 -0.23316 -1.068
+-0.16213 -0.23314 -1.0679
+-0.16114 -0.23317 -1.0681
+-0.1601 -0.23313 -1.0679
+-0.15918 -0.23325 -1.0684
+-0.15819 -0.23328 -1.0685
+-0.15724 -0.23337 -1.069
+-0.15623 -0.23336 -1.0689
+-0.15521 -0.23334 -1.0688
+-0.15431 -0.23351 -1.0696
+-0.15334 -0.23356 -1.0699
+-0.15232 -0.23356 -1.0699
+-0.15141 -0.23372 -1.0706
+-0.15043 -0.23375 -1.0707
+-0.14941 -0.23374 -1.0707
+-0.14848 -0.23387 -1.0713
+-0.14745 -0.23384 -1.0711
+-0.14643 -0.23382 -1.0711
+-0.14547 -0.2339 -1.0714
+-0.14439 -0.2338 -1.0709
+-0.14345 -0.23391 -1.0715
+-0.1424 -0.23384 -1.0712
+-0.14134 -0.23375 -1.0707
+-0.14031 -0.23373 -1.0706
+-0.13935 -0.23382 -1.071
+-0.13832 -0.23378 -1.0709
+-0.1373 -0.23377 -1.0708
+-0.13628 -0.23374 -1.0707
+-0.13527 -0.23375 -1.0707
+-0.13424 -0.23371 -1.0706
+-0.13331 -0.23384 -1.0712
+-0.13228 -0.23382 -1.0711
+-0.13127 -0.23382 -1.071
+-0.13024 -0.23379 -1.0709
+-0.12928 -0.23387 -1.0713
+-0.12822 -0.23378 -1.0709
+-0.12718 -0.23373 -1.0707
+-0.12622 -0.23383 -1.0711
+-0.12517 -0.23375 -1.0707
+-0.12418 -0.23379 -1.0709
+-0.12314 -0.23374 -1.0707
+-0.12209 -0.23365 -1.0703
+-0.12113 -0.23374 -1.0707
+-0.12008 -0.23368 -1.0704
+-0.11905 -0.23363 -1.0702
+-0.11804 -0.23364 -1.0702
+-0.11703 -0.23363 -1.0702
+-0.11602 -0.23364 -1.0702
+-0.11502 -0.23365 -1.0703
+-0.11398 -0.23359 -1.07
+-0.113 -0.23364 -1.0702
+-0.11196 -0.2336 -1.07
+-0.11098 -0.23364 -1.0702
+-0.10992 -0.23354 -1.0698
+-0.10892 -0.23356 -1.0698
+-0.10791 -0.23356 -1.0699
+-0.10687 -0.2335 -1.0696
+-0.10588 -0.23353 -1.0697
+-0.10479 -0.23337 -1.069
+-0.10378 -0.23335 -1.0689
+-0.1028 -0.23341 -1.0692
+-0.10175 -0.23334 -1.0688
+-0.10072 -0.23327 -1.0685
+-0.099703 -0.23325 -1.0685
+-0.098681 -0.23322 -1.0683
+-0.097643 -0.23315 -1.068
+-0.096642 -0.23317 -1.068
+-0.095611 -0.23311 -1.0678
+-0.094584 -0.23306 -1.0676
+-0.093585 -0.23308 -1.0676
+-0.092581 -0.23309 -1.0677
+-0.091572 -0.23309 -1.0677
+-0.090536 -0.23301 -1.0673
+-0.089547 -0.23306 -1.0676
+-0.088536 -0.23305 -1.0675
+-0.087546 -0.2331 -1.0677
+-0.08654 -0.2331 -1.0677
+-0.085551 -0.23315 -1.068
+-0.084571 -0.23323 -1.0683
+-0.08354 -0.23316 -1.068
+-0.082566 -0.23325 -1.0685
+-0.081563 -0.23327 -1.0685
+-0.080567 -0.23331 -1.0687
+-0.079581 -0.23337 -1.069
+-0.078582 -0.2334 -1.0691
+-0.077619 -0.23354 -1.0698
+-0.07661 -0.23354 -1.0698
+-0.075594 -0.23352 -1.0697
+-0.074615 -0.23361 -1.0701
+-0.073612 -0.23363 -1.0702
+-0.072619 -0.23369 -1.0705
+-0.0716 -0.23366 -1.0703
+-0.070584 -0.23364 -1.0702
+-0.069566 -0.23361 -1.0701
+-0.068573 -0.23367 -1.0704
+-0.067551 -0.23362 -1.0702
+-0.066507 -0.2335 -1.0696
+-0.065509 -0.23355 -1.0698
+-0.064475 -0.23345 -1.0694
+-0.063456 -0.23342 -1.0692
+-0.062436 -0.23337 -1.069
+-0.061416 -0.23333 -1.0688
+-0.060416 -0.23337 -1.069
+-0.059396 -0.23332 -1.0688
+-0.058387 -0.23332 -1.0688
+-0.05737 -0.23328 -1.0686
+-0.056367 -0.2333 -1.0687
+-0.055346 -0.23325 -1.0685
+-0.054334 -0.23323 -1.0684
+-0.053323 -0.23322 -1.0683
+-0.052271 -0.23302 -1.0674
+-0.051262 -0.23301 -1.0674
+-0.050246 -0.23297 -1.0672
+-0.049231 -0.23293 -1.067
+-0.04822 -0.23292 -1.0669
+-0.047203 -0.23286 -1.0667
+-0.046185 -0.2328 -1.0664
+-0.045165 -0.23274 -1.0661
+-0.044162 -0.23275 -1.0661
+-0.043145 -0.23269 -1.0659
+-0.04213 -0.23264 -1.0656
+-0.041123 -0.23263 -1.0656
+-0.040115 -0.23261 -1.0655
+-0.039099 -0.23255 -1.0652
+-0.038091 -0.23253 -1.0651
+-0.037087 -0.23253 -1.0652
+-0.036078 -0.23251 -1.065
+-0.035079 -0.23255 -1.0652
+-0.034057 -0.23243 -1.0647
+-0.033056 -0.23246 -1.0648
+-0.032057 -0.2325 -1.065
+-0.031055 -0.23252 -1.0651
+-0.030048 -0.2325 -1.065
+-0.029039 -0.23247 -1.0649
+-0.028049 -0.2326 -1.0654
+-0.027042 -0.23258 -1.0653
+-0.026041 -0.23261 -1.0655
+-0.025034 -0.2326 -1.0655
+-0.024034 -0.23266 -1.0657
+-0.023034 -0.2327 -1.0659
+-0.022034 -0.23277 -1.0662
+-0.021036 -0.23285 -1.0666
+-0.020039 -0.23296 -1.0671
+-0.019039 -0.23304 -1.0675
+-0.018038 -0.23313 -1.0679
+-0.017029 -0.2331 -1.0678
+-0.016025 -0.23316 -1.0681
+-0.015016 -0.23314 -1.068
+-0.014017 -0.23328 -1.0686
+-0.013011 -0.23332 -1.0688
+-0.012002 -0.23331 -1.0688
+-0.010998 -0.2334 -1.0692
+-0.00999 -0.23342 -1.0692
+-0.008981 -0.23342 -1.0693
+-0.007974 -0.23345 -1.0694
+-0.006964 -0.23343 -1.0693
+-0.005955 -0.23343 -1.0693
+-0.004945 -0.23337 -1.069
+-0.003936 -0.23331 -1.0688
+-0.002926 -0.23322 -1.0683
+-0.001919 -0.23335 -1.069
+-0.00091 -0.23321 -1.0683
+9.8e-005 -0.23328 -1.0686
+0.001106 -0.23321 -1.0683
+0.002114 -0.23321 -1.0683
+0.003122 -0.23326 -1.0685
+0.004128 -0.23313 -1.0679
+0.005137 -0.23322 -1.0683
+0.006145 -0.23319 -1.0682
+0.007151 -0.23315 -1.068
+0.008158 -0.23313 -1.0679
+0.009166 -0.23314 -1.068
+0.010171 -0.23308 -1.0677
+0.011179 -0.2331 -1.0678
+0.012183 -0.23303 -1.0675
+0.013191 -0.23304 -1.0675
+0.014203 -0.23312 -1.0679
+0.015208 -0.23309 -1.0677
+0.016213 -0.23305 -1.0676
+0.017221 -0.23306 -1.0676
+0.018235 -0.23315 -1.068
+0.019248 -0.23321 -1.0683
+0.020248 -0.23312 -1.0679
+0.021263 -0.23321 -1.0683
+0.022267 -0.23316 -1.0681
+0.023285 -0.23327 -1.0685
+0.024299 -0.23333 -1.0688
+0.025313 -0.23338 -1.0691
+0.026318 -0.23334 -1.0689
+0.027327 -0.23335 -1.0689
+0.028337 -0.23336 -1.069
+0.029356 -0.23344 -1.0694
+0.030367 -0.23346 -1.0694
+0.031372 -0.23343 -1.0693
+0.032371 -0.23336 -1.069
+0.033367 -0.23327 -1.0686
+0.034377 -0.23328 -1.0686
+0.035378 -0.23324 -1.0684
+0.036381 -0.23321 -1.0683
+0.037372 -0.2331 -1.0678
+0.03837 -0.23304 -1.0675
+0.039368 -0.23299 -1.0673
+0.040348 -0.23283 -1.0665
+0.041358 -0.23285 -1.0666
+0.042338 -0.23271 -1.066
+0.043333 -0.23265 -1.0657
+0.044336 -0.23264 -1.0656
+0.045341 -0.23263 -1.0656
+0.046339 -0.2326 -1.0654
+0.047321 -0.23249 -1.0649
+0.048339 -0.23255 -1.0652
+0.049333 -0.2325 -1.065
+0.050335 -0.23248 -1.0649
+0.051338 -0.23247 -1.0649
+0.052365 -0.23257 -1.0653
+0.053361 -0.23253 -1.0651
+0.054365 -0.23253 -1.0651
+0.055356 -0.23247 -1.0648
+0.056373 -0.23252 -1.0651
+0.057382 -0.23254 -1.0652
+0.058372 -0.23248 -1.0649
+0.059374 -0.23247 -1.0648
+0.060354 -0.23237 -1.0644
+0.061343 -0.23231 -1.0641
+0.062336 -0.23228 -1.0639
+0.063362 -0.23236 -1.0643
+0.064358 -0.23233 -1.0642
+0.065367 -0.23234 -1.0642
+0.066385 -0.23239 -1.0645
+0.067388 -0.23239 -1.0644
+0.068418 -0.23248 -1.0649
+0.069407 -0.23242 -1.0646
+0.070399 -0.23238 -1.0644
+0.071421 -0.23244 -1.0647
+0.072422 -0.23243 -1.0646
+0.073462 -0.23254 -1.0651
+0.074469 -0.23255 -1.0652
+0.075456 -0.23249 -1.0649
+0.076475 -0.23253 -1.0651
+0.077497 -0.23258 -1.0653
+0.078488 -0.23254 -1.0652
+0.07947 -0.23248 -1.0649
+0.080517 -0.2326 -1.0654
+0.081534 -0.23263 -1.0656
+0.082514 -0.23256 -1.0652
+0.083546 -0.23263 -1.0656
+0.084575 -0.2327 -1.0659
+0.085572 -0.23267 -1.0658
+0.086588 -0.2327 -1.0659
+0.087605 -0.23273 -1.066
+0.088641 -0.23281 -1.0664
+0.089641 -0.2328 -1.0663
+0.090664 -0.23284 -1.0665
+0.091668 -0.23283 -1.0665
+0.092674 -0.23283 -1.0665
+0.093719 -0.23293 -1.0669
+0.094738 -0.23296 -1.0671
+0.095704 -0.23286 -1.0666
+0.096765 -0.23299 -1.0672
+0.097759 -0.23296 -1.0671
+0.098748 -0.23292 -1.0669
+0.099755 -0.23292 -1.0669
+0.10084 -0.2331 -1.0677
+0.10176 -0.23291 -1.0669
+0.10279 -0.23295 -1.067
+0.1038 -0.23295 -1.067
+0.10477 -0.23288 -1.0667
+0.10573 -0.23277 -1.0662
+0.10675 -0.2328 -1.0663
+0.10773 -0.23274 -1.0661
+0.10879 -0.23286 -1.0666
+0.10974 -0.23274 -1.0661
+0.11079 -0.23284 -1.0665
+0.1118 -0.23285 -1.0665
+0.11279 -0.23281 -1.0664
+0.11383 -0.23288 -1.0667
+0.11482 -0.23285 -1.0665
+0.11586 -0.23291 -1.0669
+0.11689 -0.23297 -1.0671
+0.11788 -0.23293 -1.0669
+0.11887 -0.2329 -1.0668
+0.11994 -0.23302 -1.0674
+0.12096 -0.23305 -1.0675
+0.12195 -0.233 -1.0673
+0.12298 -0.23305 -1.0675
+0.124 -0.23307 -1.0676
+0.12503 -0.23313 -1.0678
+0.12601 -0.23306 -1.0675
+0.12706 -0.23315 -1.0679
+0.12812 -0.23324 -1.0683
+0.12907 -0.23314 -1.0679
+0.13013 -0.23323 -1.0683
+0.13114 -0.23325 -1.0684
+0.13219 -0.23331 -1.0687
+0.13326 -0.23341 -1.0692
+0.13422 -0.23333 -1.0688
+0.13523 -0.23333 -1.0688
+0.13625 -0.23335 -1.0689
+0.13727 -0.23337 -1.069
+0.1383 -0.23341 -1.0691
+0.13926 -0.23333 -1.0688
+0.14029 -0.23337 -1.069
+0.14135 -0.23345 -1.0693
+0.14246 -0.23362 -1.0701
+0.14345 -0.23359 -1.07
+0.14445 -0.23357 -1.0699
+0.14544 -0.23354 -1.0698
+0.14651 -0.23364 -1.0702
+0.14749 -0.2336 -1.07
+0.14851 -0.23361 -1.0701
+0.14959 -0.23372 -1.0706
+0.15061 -0.23373 -1.0706
+0.15158 -0.23367 -1.0704
+0.15268 -0.23381 -1.071
+0.1536 -0.23367 -1.0704
+0.15469 -0.23379 -1.0709
+0.15572 -0.23382 -1.0711
+0.15676 -0.23386 -1.0712
+0.15779 -0.2339 -1.0714
+0.15879 -0.23387 -1.0713
+0.1599 -0.23403 -1.072
+0.16098 -0.23413 -1.0725
+0.16207 -0.23424 -1.073
+0.16301 -0.23414 -1.0725
+0.16396 -0.23405 -1.0721
+0.1651 -0.23423 -1.073
+0.16619 -0.23434 -1.0734
+0.16716 -0.23428 -1.0732
+0.16816 -0.23425 -1.0731
+0.16918 -0.23426 -1.0731
+0.17022 -0.23431 -1.0733
+0.17133 -0.23444 -1.0739
+0.17229 -0.23437 -1.0736
+0.17331 -0.23438 -1.0736
+0.17438 -0.23445 -1.074
+0.17543 -0.2345 -1.0742
+0.17647 -0.23453 -1.0744
+0.17754 -0.23461 -1.0747
+0.17869 -0.2348 -1.0756
+0.17966 -0.23473 -1.0753
+0.18064 -0.23469 -1.0751
+0.18162 -0.23465 -1.0749
+0.18267 -0.23469 -1.0751
+0.18372 -0.23473 -1.0753
+0.18473 -0.23472 -1.0753
+0.18583 -0.23484 -1.0758
+0.18683 -0.23482 -1.0757
+0.18782 -0.23478 -1.0755
+0.18884 -0.2348 -1.0756
+0.1899 -0.23486 -1.0759
+0.19103 -0.23499 -1.0765
+0.19201 -0.23495 -1.0763
+0.19303 -0.23495 -1.0763
+0.19409 -0.23501 -1.0766
+0.19513 -0.23504 -1.0767
+0.19612 -0.235 -1.0766
+0.19712 -0.23499 -1.0765
+0.1983 -0.23518 -1.0774
+0.19936 -0.23524 -1.0777
+0.20024 -0.23507 -1.0769
+0.20132 -0.23515 -1.0773
+0.20243 -0.23526 -1.0778
+0.20337 -0.23517 -1.0774
+0.20454 -0.23534 -1.0782
+0.2055 -0.23528 -1.0779
+0.20655 -0.23531 -1.078
+0.20762 -0.23538 -1.0783
+0.20874 -0.23549 -1.0789
+0.20984 -0.23559 -1.0793
+0.21081 -0.23553 -1.0791
+0.21188 -0.23559 -1.0793
+0.21277 -0.23545 -1.0787
+0.21391 -0.23558 -1.0793
+0.21493 -0.23558 -1.0793
+0.21601 -0.23566 -1.0797
+0.217 -0.23562 -1.0795
+0.21815 -0.23577 -1.0802
+0.21918 -0.23578 -1.0802
+0.22019 -0.23577 -1.0802
+0.22112 -0.23567 -1.0797
+0.22246 -0.23601 -1.0813
+0.22333 -0.23585 -1.0806
+0.2243 -0.2358 -1.0803
+0.22532 -0.2358 -1.0804
+0.22648 -0.23595 -1.0811
+0.22753 -0.23598 -1.0812
+0.22849 -0.23592 -1.0809
+0.22956 -0.23598 -1.0812
+0.2305 -0.23589 -1.0808
+0.23156 -0.23594 -1.081
+0.23258 -0.23593 -1.081
+0.23374 -0.23607 -1.0816
+0.23476 -0.23607 -1.0817
+0.23591 -0.2362 -1.0823
+0.23686 -0.23614 -1.082
+0.23791 -0.23616 -1.0821
+0.239 -0.23623 -1.0824
+0.23992 -0.23613 -1.0819
+0.24096 -0.23615 -1.0821
+0.24215 -0.23631 -1.0828
+0.24313 -0.23628 -1.0826
+0.24431 -0.23643 -1.0834
+0.24538 -0.23648 -1.0836
+0.24648 -0.23655 -1.0839
+0.24751 -0.23656 -1.084
+0.24847 -0.2365 -1.0837
+0.2495 -0.2365 -1.0837
+0.2505 -0.23649 -1.0837
+0.2517 -0.23665 -1.0844
+0.25273 -0.23666 -1.0845
+0.25378 -0.23669 -1.0846
+0.25498 -0.23685 -1.0854
+0.25605 -0.23689 -1.0856
+0.25705 -0.23687 -1.0855
+0.25833 -0.23711 -1.0866
+0.25924 -0.237 -1.0861
+0.2601 -0.23685 -1.0854
+0.26129 -0.237 -1.0861
+0.26227 -0.23696 -1.0859
+0.26334 -0.237 -1.0861
+0.26435 -0.23699 -1.0861
+0.2655 -0.2371 -1.0866
+0.26637 -0.23696 -1.086
+0.26746 -0.23702 -1.0862
+0.26874 -0.23725 -1.0873
+0.26975 -0.23723 -1.0872
+0.27083 -0.23728 -1.0875
+0.27183 -0.23726 -1.0874
+0.27282 -0.23723 -1.0872
+0.27395 -0.23732 -1.0877
+0.27497 -0.23731 -1.0876
+0.27597 -0.23729 -1.0876
+0.27711 -0.23739 -1.088
+0.2782 -0.23745 -1.0883
+0.27925 -0.23747 -1.0884
+0.28028 -0.23747 -1.0884
+0.28129 -0.23746 -1.0884
+0.28234 -0.23747 -1.0885
+0.28344 -0.23754 -1.0888
+0.28472 -0.23775 -1.0898
+0.28566 -0.23768 -1.0894
+0.28674 -0.23772 -1.0896
+0.28782 -0.23776 -1.0898
+0.28894 -0.23784 -1.0902
+0.28979 -0.23769 -1.0895
+0.29111 -0.23793 -1.0906
+0.29176 -0.23763 -1.0893
+0.29288 -0.2377 -1.0896
+0.29425 -0.23797 -1.0909
+0.29527 -0.23797 -1.0909
+0.29646 -0.2381 -1.0915
+0.29755 -0.23815 -1.0917
+0.29839 -0.238 -1.091
+0.2995 -0.23806 -1.0913
+0.30051 -0.23804 -1.0913
+0.30175 -0.23821 -1.0921
+0.3028 -0.23823 -1.0922
+0.30385 -0.23825 -1.0923
+0.30489 -0.23825 -1.0923
+0.30594 -0.23827 -1.0924
+0.30712 -0.23839 -1.0929
+0.30827 -0.23848 -1.0934
+0.30906 -0.2383 -1.0925
+0.31025 -0.23842 -1.0931
+0.3114 -0.23851 -1.0936
+0.31251 -0.23857 -1.0938
+0.31355 -0.23858 -1.0939
+0.31472 -0.23868 -1.0944
+0.31571 -0.23865 -1.0942
+0.317 -0.23885 -1.0952
+0.31799 -0.23882 -1.095
+0.31898 -0.23878 -1.0949
+0.32006 -0.23882 -1.0951
+0.32093 -0.2387 -1.0945
+0.32226 -0.23891 -1.0956
+0.32313 -0.2388 -1.095
+0.32431 -0.23891 -1.0956
+0.32548 -0.23901 -1.096
+0.32678 -0.23921 -1.097
+0.32772 -0.23913 -1.0966
+0.32888 -0.23923 -1.0971
+0.33002 -0.2393 -1.0975
+0.33109 -0.23933 -1.0976
+-0.30397 -0.22151 -1.0104
+-0.30302 -0.2215 -1.0104
+-0.3019 -0.22138 -1.0098
+-0.30114 -0.22152 -1.0105
+-0.30013 -0.22148 -1.0103
+-0.2991 -0.22143 -1.01
+-0.29838 -0.2216 -1.0108
+-0.29758 -0.22171 -1.0113
+-0.29667 -0.22175 -1.0114
+-0.29583 -0.22183 -1.0118
+-0.29505 -0.22197 -1.0124
+-0.29405 -0.22193 -1.0122
+-0.29309 -0.22193 -1.0122
+-0.29247 -0.22218 -1.0134
+-0.2918 -0.2224 -1.0144
+-0.29095 -0.22248 -1.0147
+-0.29034 -0.22274 -1.0159
+-0.28967 -0.22297 -1.017
+-0.29351 -0.23207 -1.0589
+-0.2929 -0.23238 -1.0604
+-0.29177 -0.23228 -1.0599
+-0.29093 -0.2324 -1.0604
+-0.28994 -0.23241 -1.0605
+-0.28906 -0.23251 -1.0609
+-0.28821 -0.23263 -1.0615
+-0.2872 -0.23263 -1.0614
+-0.28634 -0.23274 -1.062
+-0.28533 -0.23273 -1.0619
+-0.28444 -0.23283 -1.0623
+-0.28367 -0.23301 -1.0632
+-0.28279 -0.23311 -1.0636
+-0.28179 -0.23311 -1.0636
+-0.28092 -0.23323 -1.0641
+-0.28025 -0.23351 -1.0654
+-0.27913 -0.23341 -1.065
+-0.27831 -0.23356 -1.0657
+-0.27749 -0.23372 -1.0664
+-0.2767 -0.2339 -1.0672
+-0.27567 -0.23389 -1.0671
+-0.27474 -0.23395 -1.0674
+-0.27389 -0.23408 -1.068
+-0.27295 -0.23414 -1.0683
+-0.27208 -0.23426 -1.0688
+-0.27124 -0.2344 -1.0695
+-0.27027 -0.23444 -1.0696
+-0.26936 -0.23453 -1.07
+-0.26826 -0.23444 -1.0696
+-0.26752 -0.23468 -1.0707
+-0.26641 -0.23459 -1.0703
+-0.26554 -0.23472 -1.0709
+-0.26441 -0.23461 -1.0704
+-0.26358 -0.23477 -1.0711
+-0.26249 -0.23469 -1.0707
+-0.26144 -0.23466 -1.0706
+-0.2604 -0.23463 -1.0705
+-0.25956 -0.23479 -1.0712
+-0.2584 -0.23465 -1.0705
+-0.25743 -0.23469 -1.0707
+-0.25637 -0.23464 -1.0705
+-0.25535 -0.23463 -1.0704
+-0.25444 -0.23472 -1.0708
+-0.25323 -0.23454 -1.07
+-0.25222 -0.23453 -1.0699
+-0.25126 -0.23458 -1.0702
+-0.25031 -0.23464 -1.0704
+-0.24926 -0.23461 -1.0703
+-0.24821 -0.23457 -1.0701
+-0.24715 -0.23452 -1.0698
+-0.24624 -0.23461 -1.0702
+-0.2451 -0.23449 -1.0697
+-0.24404 -0.23444 -1.0694
+-0.24314 -0.23454 -1.0699
+-0.24212 -0.23453 -1.0699
+-0.24106 -0.23448 -1.0696
+-0.23997 -0.2344 -1.0693
+-0.23896 -0.2344 -1.0693
+-0.23786 -0.23431 -1.0688
+-0.23698 -0.23444 -1.0694
+-0.23604 -0.23451 -1.0697
+-0.235 -0.23447 -1.0696
+-0.23387 -0.23435 -1.069
+-0.23282 -0.23432 -1.0688
+-0.23184 -0.23434 -1.0689
+-0.23067 -0.23417 -1.0682
+-0.22978 -0.2343 -1.0687
+-0.22877 -0.2343 -1.0687
+-0.22767 -0.2342 -1.0683
+-0.22669 -0.23423 -1.0684
+-0.22567 -0.23422 -1.0684
+-0.22475 -0.23431 -1.0688
+-0.22371 -0.23427 -1.0686
+-0.2227 -0.23427 -1.0686
+-0.22175 -0.23434 -1.0689
+-0.22071 -0.2343 -1.0687
+-0.21978 -0.23439 -1.0691
+-0.21878 -0.23439 -1.0691
+-0.21778 -0.2344 -1.0692
+-0.21686 -0.2345 -1.0696
+-0.21583 -0.23448 -1.0695
+-0.21485 -0.23451 -1.0697
+-0.21387 -0.23454 -1.0698
+-0.21281 -0.23449 -1.0696
+-0.2118 -0.23448 -1.0695
+-0.21089 -0.23459 -1.07
+-0.20985 -0.23456 -1.0699
+-0.20893 -0.23466 -1.0703
+-0.20795 -0.23469 -1.0705
+-0.20679 -0.23453 -1.0697
+-0.20581 -0.23456 -1.0699
+-0.20486 -0.23463 -1.0702
+-0.20385 -0.23463 -1.0702
+-0.20284 -0.23462 -1.0701
+-0.20175 -0.23453 -1.0697
+-0.20077 -0.23457 -1.0699
+-0.19978 -0.23459 -1.07
+-0.19869 -0.23449 -1.0695
+-0.19773 -0.23455 -1.0698
+-0.19667 -0.2345 -1.0696
+-0.19567 -0.2345 -1.0696
+-0.19465 -0.23449 -1.0695
+-0.19362 -0.23446 -1.0694
+-0.1926 -0.23445 -1.0693
+-0.19159 -0.23445 -1.0693
+-0.19059 -0.23446 -1.0694
+-0.18964 -0.23453 -1.0697
+-0.18857 -0.23446 -1.0694
+-0.18751 -0.23439 -1.069
+-0.18648 -0.23437 -1.0689
+-0.18554 -0.23446 -1.0694
+-0.18452 -0.23444 -1.0693
+-0.18337 -0.23426 -1.0685
+-0.18236 -0.23426 -1.0684
+-0.18136 -0.23427 -1.0685
+-0.18028 -0.23417 -1.068
+-0.17923 -0.23412 -1.0678
+-0.17821 -0.2341 -1.0677
+-0.17717 -0.23406 -1.0675
+-0.17612 -0.234 -1.0672
+-0.17505 -0.23391 -1.0668
+-0.174 -0.23386 -1.0666
+-0.17303 -0.23391 -1.0668
+-0.17199 -0.23386 -1.0666
+-0.17097 -0.23384 -1.0665
+-0.16993 -0.2338 -1.0663
+-0.16885 -0.2337 -1.0658
+-0.16784 -0.23369 -1.0658
+-0.16684 -0.23369 -1.0658
+-0.16584 -0.2337 -1.0658
+-0.1648 -0.23365 -1.0656
+-0.1638 -0.23366 -1.0656
+-0.16287 -0.23377 -1.0661
+-0.16182 -0.23371 -1.0659
+-0.16086 -0.23378 -1.0662
+-0.15987 -0.2338 -1.0663
+-0.1589 -0.23385 -1.0665
+-0.15797 -0.23396 -1.067
+-0.15688 -0.23385 -1.0665
+-0.15589 -0.23386 -1.0666
+-0.1549 -0.23389 -1.0667
+-0.15396 -0.23399 -1.0672
+-0.15304 -0.23412 -1.0678
+-0.15199 -0.23406 -1.0675
+-0.15109 -0.23423 -1.0683
+-0.15007 -0.23421 -1.0682
+-0.14911 -0.23427 -1.0685
+-0.14817 -0.23439 -1.069
+-0.14715 -0.23436 -1.0689
+-0.14622 -0.23449 -1.0695
+-0.1452 -0.23449 -1.0695
+-0.1442 -0.23449 -1.0695
+-0.14313 -0.23439 -1.069
+-0.14212 -0.23439 -1.069
+-0.14107 -0.23433 -1.0687
+-0.14007 -0.23434 -1.0688
+-0.13908 -0.23437 -1.0689
+-0.138 -0.23424 -1.0683
+-0.13703 -0.23431 -1.0687
+-0.13598 -0.23423 -1.0683
+-0.13494 -0.23419 -1.0681
+-0.13399 -0.23428 -1.0685
+-0.13296 -0.23425 -1.0684
+-0.13197 -0.23427 -1.0685
+-0.13105 -0.23444 -1.0692
+-0.12995 -0.23428 -1.0685
+-0.12899 -0.23435 -1.0688
+-0.12801 -0.23441 -1.0691
+-0.12697 -0.23436 -1.0689
+-0.12598 -0.23439 -1.069
+-0.12496 -0.23437 -1.0689
+-0.12395 -0.23437 -1.0689
+-0.12291 -0.23431 -1.0686
+-0.12193 -0.23435 -1.0688
+-0.12081 -0.23414 -1.0679
+-0.11983 -0.23419 -1.0681
+-0.11881 -0.23417 -1.068
+-0.11781 -0.23418 -1.068
+-0.11683 -0.23424 -1.0683
+-0.11583 -0.23427 -1.0685
+-0.11481 -0.23422 -1.0683
+-0.11377 -0.23417 -1.068
+-0.11276 -0.23416 -1.068
+-0.11177 -0.23419 -1.0681
+-0.1107 -0.23407 -1.0675
+-0.10968 -0.23405 -1.0674
+-0.10872 -0.23415 -1.0679
+-0.10765 -0.234 -1.0672
+-0.10658 -0.23387 -1.0666
+-0.10563 -0.234 -1.0672
+-0.10461 -0.23396 -1.067
+-0.10352 -0.23378 -1.0662
+-0.10254 -0.23384 -1.0665
+-0.1015 -0.23376 -1.0661
+-0.10051 -0.23379 -1.0663
+-0.099497 -0.23378 -1.0662
+-0.09847 -0.23373 -1.066
+-0.097425 -0.23364 -1.0656
+-0.096446 -0.2337 -1.0658
+-0.095427 -0.23367 -1.0657
+-0.094421 -0.23367 -1.0657
+-0.093399 -0.23363 -1.0655
+-0.092363 -0.23355 -1.0651
+-0.091336 -0.23349 -1.0649
+-0.090348 -0.23353 -1.0651
+-0.089363 -0.23359 -1.0653
+-0.088339 -0.23354 -1.0651
+-0.087391 -0.23369 -1.0658
+-0.086365 -0.23363 -1.0655
+-0.085389 -0.23372 -1.0659
+-0.084387 -0.23372 -1.066
+-0.083394 -0.23376 -1.0661
+-0.082416 -0.23384 -1.0665
+-0.081432 -0.2339 -1.0668
+-0.080435 -0.23393 -1.0669
+-0.079423 -0.23392 -1.0669
+-0.078422 -0.23393 -1.0669
+-0.077465 -0.23408 -1.0676
+-0.076456 -0.23408 -1.0676
+-0.07547 -0.23414 -1.0679
+-0.074455 -0.23412 -1.0678
+-0.073491 -0.23426 -1.0684
+-0.072474 -0.23423 -1.0683
+-0.071452 -0.23418 -1.0681
+-0.07045 -0.2342 -1.0682
+-0.069446 -0.23422 -1.0682
+-0.068419 -0.23415 -1.0679
+-0.067402 -0.23412 -1.0678
+-0.066395 -0.23412 -1.0678
+-0.065379 -0.23409 -1.0677
+-0.064368 -0.23408 -1.0676
+-0.063347 -0.23402 -1.0674
+-0.062319 -0.23395 -1.067
+-0.061292 -0.23387 -1.0666
+-0.060281 -0.23385 -1.0666
+-0.05926 -0.23379 -1.0663
+-0.058259 -0.23382 -1.0664
+-0.05725 -0.2338 -1.0663
+-0.056237 -0.23377 -1.0662
+-0.055216 -0.23371 -1.0659
+-0.054215 -0.23373 -1.066
+-0.053198 -0.23368 -1.0658
+-0.052177 -0.23361 -1.0655
+-0.051155 -0.23353 -1.0651
+-0.050136 -0.23347 -1.0648
+-0.049136 -0.23349 -1.0649
+-0.048113 -0.2334 -1.0645
+-0.047108 -0.2334 -1.0645
+-0.046092 -0.23334 -1.0642
+-0.045075 -0.23328 -1.0639
+-0.044081 -0.23333 -1.0642
+-0.043056 -0.23321 -1.0636
+-0.042054 -0.23322 -1.0637
+-0.041045 -0.23319 -1.0635
+-0.040037 -0.23317 -1.0634
+-0.039027 -0.23312 -1.0632
+-0.038016 -0.23308 -1.063
+-0.037009 -0.23305 -1.0629
+-0.036011 -0.23308 -1.063
+-0.034999 -0.23303 -1.0628
+-0.033987 -0.23296 -1.0625
+-0.032986 -0.23297 -1.0625
+-0.031993 -0.23304 -1.0628
+-0.030988 -0.23302 -1.0628
+-0.029988 -0.23304 -1.0628
+-0.028981 -0.23301 -1.0627
+-0.027979 -0.23302 -1.0627
+-0.026984 -0.23308 -1.063
+-0.025985 -0.23312 -1.0632
+-0.024992 -0.23321 -1.0636
+-0.02399 -0.23323 -1.0637
+-0.022989 -0.23326 -1.0638
+-0.02199 -0.2333 -1.064
+-0.021001 -0.23347 -1.0648
+-0.019999 -0.2335 -1.065
+-0.019 -0.23358 -1.0653
+-0.017991 -0.23353 -1.0651
+-0.016998 -0.23369 -1.0658
+-0.015995 -0.23373 -1.066
+-0.014995 -0.23382 -1.0665
+-0.013991 -0.23385 -1.0666
+-0.012983 -0.23383 -1.0665
+-0.011984 -0.23396 -1.0671
+-0.010978 -0.23399 -1.0672
+-0.009971 -0.23397 -1.0671
+-0.00896 -0.23388 -1.0667
+-0.007957 -0.23397 -1.0671
+-0.006949 -0.23392 -1.0669
+-0.005943 -0.23394 -1.067
+-0.004937 -0.23401 -1.0673
+-0.00393 -0.23401 -1.0673
+-0.002922 -0.2339 -1.0668
+-0.001915 -0.23387 -1.0667
+-0.000909 -0.2338 -1.0663
+9.8e-005 -0.23376 -1.0662
+0.001104 -0.23377 -1.0662
+0.002109 -0.23377 -1.0662
+0.003116 -0.23378 -1.0663
+0.00412 -0.23368 -1.0658
+0.005127 -0.23378 -1.0662
+0.00613 -0.23365 -1.0657
+0.007137 -0.23371 -1.0659
+0.008141 -0.23365 -1.0657
+0.009147 -0.23367 -1.0658
+0.01015 -0.23361 -1.0655
+0.011158 -0.23365 -1.0657
+0.012159 -0.23358 -1.0654
+0.013166 -0.23361 -1.0655
+0.014171 -0.23361 -1.0655
+0.015176 -0.2336 -1.0654
+0.016178 -0.23356 -1.0652
+0.017184 -0.23357 -1.0653
+0.01819 -0.23358 -1.0653
+0.019202 -0.23366 -1.0657
+0.020207 -0.23365 -1.0657
+0.021214 -0.23367 -1.0658
+0.022224 -0.23372 -1.066
+0.023232 -0.23375 -1.0661
+0.024245 -0.23381 -1.0664
+0.025254 -0.23383 -1.0665
+0.026251 -0.23376 -1.0662
+0.027275 -0.23391 -1.0669
+0.028276 -0.23386 -1.0666
+0.029288 -0.23391 -1.0669
+0.030306 -0.234 -1.0673
+0.031309 -0.23397 -1.0671
+0.032303 -0.23387 -1.0667
+0.033309 -0.23387 -1.0667
+0.034297 -0.23375 -1.0661
+0.035306 -0.23377 -1.0662
+0.036309 -0.23375 -1.0661
+0.03729 -0.2336 -1.0654
+0.038287 -0.23354 -1.0652
+0.039296 -0.23357 -1.0653
+0.040284 -0.23347 -1.0648
+0.041282 -0.23343 -1.0646
+0.042273 -0.23336 -1.0643
+0.043265 -0.23329 -1.064
+0.04426 -0.23324 -1.0638
+0.045254 -0.2332 -1.0636
+0.046245 -0.23313 -1.0632
+0.047254 -0.23316 -1.0634
+0.048266 -0.2332 -1.0636
+0.04926 -0.23316 -1.0634
+0.050274 -0.23321 -1.0636
+0.051271 -0.23317 -1.0634
+0.052275 -0.23318 -1.0635
+0.053281 -0.23319 -1.0635
+0.054296 -0.23324 -1.0638
+0.055301 -0.23325 -1.0638
+0.056302 -0.23323 -1.0637
+0.057287 -0.23316 -1.0634
+0.058287 -0.23315 -1.0633
+0.059276 -0.23309 -1.0631
+0.060267 -0.23304 -1.0628
+0.061289 -0.23311 -1.0632
+0.062254 -0.23297 -1.0625
+0.06327 -0.23302 -1.0627
+0.064281 -0.23305 -1.0629
+0.065282 -0.23305 -1.0628
+0.066283 -0.23304 -1.0628
+0.067278 -0.23301 -1.0627
+0.068303 -0.23309 -1.063
+0.06931 -0.2331 -1.0631
+0.070317 -0.23311 -1.0632
+0.071366 -0.23326 -1.0638
+0.072339 -0.23317 -1.0634
+0.073339 -0.23316 -1.0633
+0.074305 -0.23304 -1.0628
+0.075346 -0.23316 -1.0633
+0.076357 -0.23318 -1.0635
+0.077372 -0.23321 -1.0636
+0.078375 -0.23321 -1.0636
+0.079366 -0.23317 -1.0634
+0.08039 -0.23324 -1.0637
+0.081401 -0.23325 -1.0638
+0.082394 -0.23322 -1.0637
+0.083428 -0.23331 -1.0641
+0.084439 -0.23333 -1.0641
+0.085461 -0.23338 -1.0644
+0.086433 -0.23329 -1.064
+0.087461 -0.23336 -1.0643
+0.088471 -0.23337 -1.0643
+0.08948 -0.23338 -1.0644
+0.090506 -0.23344 -1.0647
+0.091528 -0.23348 -1.0648
+0.09256 -0.23355 -1.0652
+0.093596 -0.23363 -1.0655
+0.094592 -0.23361 -1.0654
+0.095571 -0.23354 -1.0651
+0.096605 -0.23361 -1.0654
+0.097583 -0.23355 -1.0651
+0.098616 -0.23361 -1.0654
+0.099617 -0.2336 -1.0654
+0.10063 -0.23363 -1.0655
+0.10163 -0.23361 -1.0654
+0.10267 -0.23368 -1.0657
+0.10364 -0.23361 -1.0654
+0.10463 -0.23357 -1.0652
+0.10562 -0.23354 -1.0651
+0.1066 -0.23348 -1.0648
+0.1076 -0.23346 -1.0647
+0.10861 -0.23349 -1.0649
+0.10965 -0.23356 -1.0652
+0.11073 -0.23371 -1.0659
+0.11174 -0.23372 -1.0659
+0.11271 -0.23365 -1.0656
+0.11374 -0.23371 -1.0659
+0.11474 -0.23369 -1.0658
+0.11581 -0.23382 -1.0664
+0.11679 -0.23377 -1.0662
+0.11778 -0.23374 -1.066
+0.11881 -0.2338 -1.0663
+0.11983 -0.23381 -1.0663
+0.12081 -0.23377 -1.0661
+0.12189 -0.23391 -1.0668
+0.12294 -0.23398 -1.0671
+0.12398 -0.23405 -1.0674
+0.12495 -0.23398 -1.0671
+0.12596 -0.23399 -1.0672
+0.127 -0.23405 -1.0674
+0.12807 -0.23417 -1.068
+0.12903 -0.23407 -1.0675
+0.13011 -0.23421 -1.0682
+0.13111 -0.2342 -1.0681
+0.13212 -0.2342 -1.0681
+0.13311 -0.23417 -1.068
+0.13417 -0.23427 -1.0684
+0.13519 -0.23428 -1.0685
+0.13626 -0.23438 -1.069
+0.13723 -0.23432 -1.0687
+0.13824 -0.23433 -1.0687
+0.13923 -0.2343 -1.0686
+0.14023 -0.23428 -1.0685
+0.14136 -0.23448 -1.0694
+0.14234 -0.23444 -1.0692
+0.14335 -0.23444 -1.0692
+0.14438 -0.23446 -1.0693
+0.14548 -0.23461 -1.0701
+0.14652 -0.23466 -1.0703
+0.14749 -0.23459 -1.0699
+0.14848 -0.23457 -1.0698
+0.1495 -0.23458 -1.0699
+0.15056 -0.23466 -1.0703
+0.15154 -0.23462 -1.0701
+0.15257 -0.23465 -1.0702
+0.15366 -0.23476 -1.0707
+0.15473 -0.23486 -1.0712
+0.15569 -0.23478 -1.0708
+0.15672 -0.23482 -1.071
+0.15776 -0.23485 -1.0712
+0.15878 -0.23488 -1.0713
+0.15986 -0.23498 -1.0717
+0.1609 -0.23502 -1.0719
+0.162 -0.23514 -1.0725
+0.16298 -0.2351 -1.0723
+0.16402 -0.23515 -1.0725
+0.16506 -0.23519 -1.0727
+0.16606 -0.23516 -1.0726
+0.16697 -0.23502 -1.0719
+0.16816 -0.23527 -1.0731
+0.16924 -0.23536 -1.0735
+0.17022 -0.23532 -1.0733
+0.1713 -0.23542 -1.0738
+0.17223 -0.2353 -1.0732
+0.17337 -0.23547 -1.074
+0.17439 -0.23548 -1.0741
+0.17544 -0.23553 -1.0743
+0.17653 -0.23564 -1.0748
+0.17756 -0.23565 -1.0749
+0.17858 -0.23566 -1.0749
+0.17958 -0.23564 -1.0748
+0.18062 -0.23567 -1.075
+0.18156 -0.23558 -1.0745
+0.18266 -0.2357 -1.0751
+0.18369 -0.23572 -1.0752
+0.18471 -0.23572 -1.0752
+0.18577 -0.23577 -1.0754
+0.18677 -0.23575 -1.0753
+0.18789 -0.23589 -1.0759
+0.18885 -0.23582 -1.0756
+0.18991 -0.23588 -1.0759
+0.19095 -0.23591 -1.0761
+0.19192 -0.23585 -1.0758
+0.19299 -0.23592 -1.0761
+0.19406 -0.23599 -1.0764
+0.19502 -0.23592 -1.0761
+0.19606 -0.23595 -1.0763
+0.19721 -0.23611 -1.077
+0.19827 -0.23617 -1.0773
+0.19924 -0.23611 -1.077
+0.20031 -0.23617 -1.0773
+0.20123 -0.23606 -1.0768
+0.2024 -0.23624 -1.0776
+0.20336 -0.23618 -1.0773
+0.20453 -0.23635 -1.0781
+0.20553 -0.23633 -1.078
+0.20672 -0.23653 -1.0789
+0.20767 -0.23646 -1.0786
+0.20873 -0.2365 -1.0788
+0.20974 -0.23649 -1.0788
+0.21087 -0.23661 -1.0794
+0.21172 -0.23643 -1.0785
+0.21278 -0.23648 -1.0787
+0.21404 -0.23675 -1.08
+0.21499 -0.23667 -1.0796
+0.21618 -0.23686 -1.0805
+0.21707 -0.23672 -1.0799
+0.21816 -0.2368 -1.0802
+0.2192 -0.23682 -1.0803
+0.22024 -0.23684 -1.0804
+0.22126 -0.23684 -1.0804
+0.22228 -0.23684 -1.0805
+0.22325 -0.23679 -1.0802
+0.2244 -0.23693 -1.0809
+0.22534 -0.23684 -1.0805
+0.22645 -0.23693 -1.0809
+0.22752 -0.23699 -1.0812
+0.22845 -0.2369 -1.0807
+0.22945 -0.23688 -1.0806
+0.23049 -0.2369 -1.0808
+0.23146 -0.23685 -1.0805
+0.23269 -0.23706 -1.0815
+0.23368 -0.23704 -1.0814
+0.23482 -0.23716 -1.0819
+0.23582 -0.23714 -1.0819
+0.23696 -0.23725 -1.0824
+0.23807 -0.23735 -1.0828
+0.23889 -0.23714 -1.0819
+0.23998 -0.23721 -1.0822
+0.24112 -0.23733 -1.0828
+0.24221 -0.2374 -1.0831
+0.24319 -0.23736 -1.0829
+0.24436 -0.2375 -1.0836
+0.24537 -0.23749 -1.0835
+0.24644 -0.23754 -1.0838
+0.2474 -0.23747 -1.0835
+0.24849 -0.23754 -1.0838
+0.24951 -0.23754 -1.0838
+0.25055 -0.23755 -1.0838
+0.25181 -0.23778 -1.0849
+0.2528 -0.23775 -1.0848
+0.25387 -0.23779 -1.085
+0.25495 -0.23784 -1.0852
+0.25603 -0.2379 -1.0855
+0.25715 -0.23799 -1.0859
+0.25798 -0.23781 -1.0851
+0.25912 -0.23791 -1.0856
+0.26015 -0.23792 -1.0856
+0.2614 -0.23813 -1.0866
+0.26236 -0.23806 -1.0863
+0.26359 -0.23825 -1.0872
+0.26452 -0.23816 -1.0868
+0.2655 -0.23813 -1.0866
+0.26655 -0.23815 -1.0867
+0.26755 -0.23813 -1.0866
+0.26883 -0.23835 -1.0877
+0.26986 -0.23835 -1.0877
+0.27068 -0.23817 -1.0868
+0.27175 -0.23822 -1.0871
+0.27303 -0.23844 -1.0881
+0.27395 -0.23835 -1.0877
+0.27504 -0.23841 -1.088
+0.27598 -0.23833 -1.0876
+0.27716 -0.23846 -1.0882
+0.27825 -0.23851 -1.0885
+0.27932 -0.23855 -1.0887
+0.28024 -0.23846 -1.0883
+0.28132 -0.23851 -1.0885
+0.28234 -0.2385 -1.0885
+0.28346 -0.23858 -1.0888
+0.28448 -0.23858 -1.0888
+0.28576 -0.23879 -1.0898
+0.28681 -0.2388 -1.0899
+0.28775 -0.23874 -1.0896
+0.28883 -0.23878 -1.0898
+0.28991 -0.23882 -1.09
+0.29101 -0.23888 -1.0903
+0.29207 -0.23891 -1.0904
+0.29297 -0.2388 -1.0899
+0.29417 -0.23894 -1.0906
+0.2952 -0.23894 -1.0906
+0.29635 -0.23904 -1.0911
+0.29751 -0.23915 -1.0916
+0.29853 -0.23914 -1.0916
+0.29961 -0.23918 -1.0917
+0.30065 -0.23919 -1.0918
+0.30178 -0.23927 -1.0922
+0.30279 -0.23925 -1.0921
+0.30385 -0.23928 -1.0923
+0.30501 -0.23938 -1.0927
+0.3061 -0.23943 -1.093
+0.307 -0.23932 -1.0925
+0.30836 -0.23958 -1.0937
+0.30943 -0.23961 -1.0938
+0.31059 -0.23971 -1.0943
+0.3116 -0.23969 -1.0942
+0.31246 -0.23956 -1.0937
+0.31366 -0.23969 -1.0943
+0.31461 -0.23963 -1.094
+0.3157 -0.23967 -1.0942
+0.3171 -0.23995 -1.0955
+0.31802 -0.23987 -1.0951
+0.31889 -0.23975 -1.0946
+0.31966 -0.23955 -1.0937
+0.32116 -0.2399 -1.0953
+0.32228 -0.23996 -1.0956
+0.32329 -0.23995 -1.0956
+0.32432 -0.23995 -1.0956
+0.32564 -0.24016 -1.0966
+0.32677 -0.24023 -1.0969
+0.32773 -0.24018 -1.0967
+0.32899 -0.24034 -1.0975
+0.32994 -0.24028 -1.0972
+0.33102 -0.24031 -1.0974
\ No newline at end of file
--- /dev/null
+3356
+10371
+20589
+21679
+16877
+2729
+8168
+18761
+19259
+12100
+16409
+11089
+29687
+6808
+25943
+15049
+25468
+21888
+3342
+14859
+11191
+5131
+15854
+24187
+8486
+11802
+13300
+26215
+25094
+22463
+212
+9868
+16960
+25218
+9891
+21421
+1330
+13841
+28461
+2670
+26205
+2279
+22351
+23302
+11963
+11051
+2440
+12414
+26626
+10000
+25924
+6118
+17265
+21579
+5919
+2716
+29320
+1432
+10765
+23171
+6279
+1254
+3260
+28721
+28414
+14009
+7014
+15724
+8995
+12848
+1090
+13847
+14825
+7033
+26104
+5150
+5647
+26736
+18364
+25057
+14898
+2477
+13484
+6229
+9498
+25614
+6916
+7221
+5473
+10832
+23612
+26994
+19153
+20176
+9387
+616
+13346
+7616
+16600
+15316
+332
+16397
+10546
+15792
+7267
+30362
+19089
+2131
+2844
+20265
+607
+1041
+6129
+15060
+4521
+7165
+29042
+18515
+16513
+12918
+25997
+5962
+12827
+19514
+24243
+28236
+25246
+24941
+22174
+14099
+15605
+5323
+21539
+13741
+27424
+12639
+6656
+1659
+19142
+28444
+30197
+8397
+9147
+6200
+5047
+12936
+14962
+10933
+14639
+22108
+2393
+5801
+5708
+3263
+10981
+5641
+28056
+16567
+5506
+26868
+670
+9571
+7344
+23704
+22130
+18700
+6358
+10575
+9338
+21810
+4913
+9945
+11522
+3920
+30050
+15888
+28808
+3606
+9523
+9684
+6988
+27335
+19876
+24504
+5620
+21272
+16156
+1324
+13712
+15496
+8968
+10282
+29975
+8790
+29635
+10204
+20220
+21641
+25904
+30716
+23671
+30493
+20041
+27446
+5215
+6704
+16639
+18007
+12138
+9236
+10398
+13840
+16436
+21338
+13991
+12969
+6723
+18027
+21458
+2025
+18500
+24314
+19873
+21
+10695
+15423
+9206
+25099
+11968
+5522
+26457
+31294
+6983
+11805
+19974
+2934
+22931
+31753
+2141
+26655
+26168
+16502
+28474
+14590
+7888
+25479
+4313
+8869
+22001
+24989
+19151
+24735
+6381
+8335
+23639
+20987
+8979
+6101
+5910
+11159
+1112
+1698
+14092
+17912
+26998
+29788
+30275
+18673
+21394
+7073
+14617
+28654
+21835
+19499
+20259
+12857
+9240
+15192
+2915
+22692
+25884
+15317
+17202
+24619
+24457
+22481
+8727
+6399
+16525
+5350
+12388
+7161
+16640
+25008
+25906
+4087
+29857
+29865
+28624
+12542
+9933
+24363
+30760
+16160
+27518
+1997
+31975
+17894
+27991
+2601
+13033
+28988
+8931
+23911
+29629
+2296
+12034
+6130
+9505
+19271
+18337
+21609
+17673
+16810
+12884
+30603
+4173
+8416
+14699
+23236
+25727
+2140
+3462
+18950
+8238
+25860
+21076
+31342
+3362
+16208
+9980
+3710
+28244
+7582
+30103
+21381
+23074
+25862
+29872
+12362
+30878
+27039
+6405
+976
+29037
+9952
+14487
+8636
+24240
+28886
+11204
+2824
+13311
+4581
+9693
+3340
+3065
+6072
+14278
+25638
+14621
+23011
+28366
+7997
+26050
+26298
+5193
+19037
+4020
+4058
+18058
+29747
+27255
+3045
+16860
+9754
+20083
+2333
+17153
+2135
+3965
+21680
+19423
+929
+20669
+9698
+3197
+12575
+20555
+21234
+415
+24295
+5407
+7717
+16759
+31562
+16838
+25292
+31042
+2848
+29039
+15551
+30637
+23623
+14855
+3341
+24038
+29912
+23386
+28453
+5639
+811
+25745
+11293
+29044
+21264
+25340
+22564
+9535
+11720
+24962
+10417
+7902
+26476
+2060
+5144
+27498
+2034
+5942
+14043
+26952
+11631
+15965
+23645
+28330
+23177
+11463
+30212
+6565
+30705
+30437
+14172
+2361
+28611
+7995
+9572
+1021
+20142
+9032
+29091
+30468
+438
+29811
+2487
+24481
+19948
+4407
+13805
+6364
+20293
+6375
+3275
+3151
+11893
+7565
+13863
+2542
+28778
+3981
+21280
+16893
+6005
+9784
+17899
+7989
+11660
+28723
+4099
+4314
+1157
+29473
+25082
+1514
+5736
+13197
+18064
+7078
+10834
+8573
+18684
+1050
+9617
+8451
+8541
+18350
+3282
+9804
+22644
+4539
+6382
+2054
+6438
+15517
+4608
+11431
+24091
+24201
+28873
+5973
+25497
+2629
+900
+25005
+18037
+18008
+23175
+29420
+26438
+23682
+1561
+3925
+30246
+31679
+7374
+27946
+11484
+13386
+15313
+5921
+132
+29390
+30604
+3819
+13435
+16188
+7011
+23686
+24006
+6336
+28371
+22127
+5505
+7862
+9372
+12993
+801
+29858
+6071
+20465
+18936
+31973
+16991
+8511
+15893
+17939
+24783
+2529
+18810
+9286
+10725
+30821
+2065
+29926
+13722
+6807
+1932
+2936
+1803
+18240
+15512
+28481
+25691
+28135
+21047
+14182
+8506
+27053
+28393
+26608
+15526
+23992
+24092
+24949
+16032
+30095
+27035
+22245
+27222
+27300
+9002
+16087
+6932
+17401
+1792
+3919
+3205
+7122
+21730
+889
+28322
+16863
+26885
+6702
+6251
+3690
+30411
+19911
+26170
+10346
+14987
+31816
+14433
+1458
+27792
+19543
+11608
+23752
+5989
+17601
+1919
+28416
+14353
+27662
+25431
+27840
+25439
+18770
+12022
+16426
+17649
+13630
+23055
+19763
+10901
+74
+30154
+17382
+6444
+26377
+30696
+18917
+13875
+18097
+21174
+28177
+22608
+12125
+10552
+24685
+4066
+2314
+24195
+25592
+30774
+18424
+16266
+483
+11073
+19279
+569
+121
+28499
+14858
+23219
+17133
+10251
+564
+6571
+9736
+21806
+29771
+20095
+7148
+8856
+28161
+16374
+2298
+31597
+21791
+4279
+3383
+18430
+23346
+24123
+24382
+9687
+22748
+24785
+25222
+21303
+28219
+16656
+18590
+11843
+13060
+10452
+23821
+2759
+16849
+2646
+24081
+13164
+1325
+31065
+24222
+31133
+11733
+22882
+12402
+16672
+17081
+16628
+12968
+10704
+16014
+27918
+4563
+3477
+30558
+13251
+19820
+28769
+2675
+8928
+21692
+17909
+15122
+23082
+23586
+22296
+18982
+23950
+5599
+20760
+19219
+4337
+2735
+22845
+22710
+26296
+13227
+7789
+18197
+24177
+19513
+15009
+25043
+7264
+11070
+20535
+12475
+9533
+1568
+22841
+17004
+16917
+20192
+13812
+31749
+14371
+16008
+1206
+9873
+26872
+24326
+8106
+30252
+6366
+870
+25896
+1934
+16044
+4866
+12127
+9018
+1425
+2494
+16734
+12148
+2625
+14313
+4714
+19690
+6217
+3132
+29769
+17404
+29879
+1348
+11055
+10818
+23196
+31917
+5418
+13990
+6687
+30703
+24829
+28790
+8605
+24763
+17247
+18253
+4093
+2657
+8076
+18482
+3423
+27045
+17393
+11396
+17696
+17338
+23619
+15505
+14747
+15249
+28357
+1372
+19290
+947
+16980
+17597
+11091
+24050
+26540
+30540
+3956
+29694
+7363
+13217
+3156
+6492
+21213
+6206
+19520
+12808
+6429
+30543
+12513
+6984
+20604
+30402
+4042
+12990
+31426
+17736
+23969
+25326
+9317
+6177
+29256
+29682
+19846
+23046
+19707
+29848
+14506
+25958
+26941
+16410
+4153
+16077
+30076
+7967
+30378
+26519
+16288
+4910
+6862
+14382
+3910
+25775
+9832
+13306
+46
+10034
+6635
+11270
+5495
+15789
+6409
+9618
+14674
+19212
+26008
+5409
+2259
+27204
+26434
+19888
+31241
+26530
+10955
+27990
+18689
+11584
+7005
+24389
+15314
+17424
+8574
+18811
+25254
+19113
+16324
+21370
+14335
+3750
+12567
+16711
+17105
+9028
+22424
+19129
+11669
+4079
+8434
+31994
+30858
+1457
+2568
+15071
+21996
+15262
+20965
+11027
+19780
+7735
+2030
+14462
+30245
+5953
+17917
+16744
+17724
+9875
+22580
+10294
+28646
+6226
+19741
+21067
+4478
+6168
+29628
+17992
+15189
+14685
+15488
+29523
+28762
+8320
+4319
+6422
+14481
+30827
+8508
+13124
+6434
+13605
+11433
+14229
+17995
+1640
+3101
+8900
+12169
+31523
+5352
+5697
+22259
+18489
+11548
+25049
+3554
+21180
+14032
+21476
+28133
+26521
+609
+20435
+23774
+23569
+28809
+29433
+5088
+1713
+5038
\ No newline at end of file
--- /dev/null
+5059 5187 5188
+12394 12393 12465
+3555 3512 3554
+6038 5901 5900
+5864 5935 5936
+930 886 885
+4399 4400 4340
+27259 27258 27388
+7781 7930 7782
+31738 31739 31106
+29384 29052 29383
+28691 28690 29032
+20056 19888 19887
+23668 23277 23276
+31808 31806 31815
+29077 28978 28977
+12433 12434 12341
+24240 24449 24241
+18747 18634 18633
+17122 17175 17176
+15257 15370 15371
+15125 15319 15126
+6244 6245 6142
+5747 5748 5665
+8120 8180 8213
+26119 26310 26120
+4523 4465 4387
+6962 6839 6961
+5134 5065 5064
+6944 6945 6890
+4867 4798 4866
+13137 13336 13337
+13022 13129 12926
+11230 11229 11292
+247 244 243
+228 202 227
+328 387 329
+5944 6073 6074
+1017 1085 931
+13 25 14
+2576 2549 2548
+3065 3064 3150
+4954 4687 4686
+7300 7214 7213
+23344 23740 23741
+27057 26769 26768
+13691 13768 13692
+21208 20939 20938
+7472 7416 7415
+29471 29472 29157
+19950 19818 19949
+15265 15188 15187
+31950 31948 31952
+29596 29597 29548
+12103 12016 12163
+26676 26964 26965
+29553 29615 29351
+30935 30563 30244
+19994 20185 19995
+30917 31550 30918
+31515 31513 31512
+27765 27764 28043
+18385 18266 18384
+14381 14380 14572
+30609 31027 31028
+22003 22002 22252
+21457 21979 21458
+28979 28921 29078
+22214 21943 22116
+17008 17179 16846
+21948 22121 21949
+17509 17508 17608
+16018 15898 16085
+24797 24676 24675
+24617 24483 24702
+14950 15145 15146
+22684 22779 22600
+17788 17789 17674
+19374 19682 19683
+17173 17004 17003
+21155 20876 20875
+15629 15715 15716
+13984 13620 13983
+16820 17153 16927
+30236 30554 30918
+19665 19666 19069
+23856 23648 23450
+24415 24662 24596
+19196 19012 19195
+5560 5559 5662
+24187 23998 23997
+19495 19606 19607
+12667 12666 12850
+21293 21294 21138
+17186 17022 17124
+12094 12146 12095
+8206 8112 8111
+8896 8785 8983
+4143 4201 4263
+5527 5561 5528
+1837 1928 1838
+4377 4513 4629
+3670 3669 3722
+3989 3988 4041
+4504 4453 4503
+3747 3748 3708
+3743 3805 3542
+3751 3750 3835
+3112 3113 3027
+32 42 43
+3609 3648 3610
+3542 3642 3743
+3617 3655 3618
+5127 5177 5128
+5459 5404 5403
+3449 3448 3542
+3549 3613 3550
+3803 3741 3821
+3937 3938 3845
+4052 3929 4051
+1636 1763 1764
+7480 7609 7481
+11552 11553 11414
+15147 15146 15246
+12707 12895 12896
+10477 10585 10544
+14369 14368 14467
+12802 12702 12609
+15634 15633 15728
+13843 13922 13923
+17019 17183 17345
+11670 11786 11731
+16796 16699 16698
+16509 16414 16508
+12900 12901 12806
+15342 15434 15435
+22716 22715 22921
+23922 24137 23739
+15582 15373 15777
+26923 27081 26924
+11427 11161 11426
+10372 10469 10470
+13933 13932 14044
+16135 15952 16134
+6359 6360 6285
+10343 10342 10376
+10483 10482 10547
+10196 10258 10259
+10108 10154 10109
+6174 6173 6331
+4871 4805 4804
+4925 5012 5013
+3488 3434 3433
+8156 8048 8047
+6742 6849 6620
+6423 6360 6501
+6137 6081 6136
+168 134 167
+523 566 567
+3960 3861 3903
+2455 2454 2538
+675 716 676
+2282 2283 2214
+7002 6869 6868
+5719 5718 5953
+1679 1642 1770
+233 232 274
+10234 10419 10235
+11765 11841 11766
+8417 8622 8418
+14220 14219 14300
+8621 8622 8417
+11709 11708 11954
+16566 16567 16370
+17914 18098 18099
+11991 11938 11937
+21561 21562 21262
+27888 28168 28169
+3817 3801 3800
+347 354 369
+23025 22798 22797
+9983 9913 9912
+18977 18978 18878
+19468 19467 19585
+30780 31369 30461
+18704 18588 18587
+22538 22054 22294
+20949 21058 21059
+19432 19260 19575
+21516 22048 21517
+18566 18308 18307
+13492 13491 13667
+20096 19907 20095
+22509 22612 22510
+29888 29887 30089
+25949 25948 26406
+25267 25524 25353
+19135 19134 19259
+25524 25646 25525
+25030 24770 24852
+26262 26425 26426
+26270 26522 26431
+28950 29105 29001
+27401 27318 27400
+26587 26775 26588
+27324 27071 27070
+27391 27392 27290
+31145 30667 31144
+27301 27051 27050
+29695 29442 29694
+20377 20522 20642
+30374 30692 31195
+31369 30781 30461
+30715 30396 31239
+25501 25989 25502
+26227 26113 26112
+28174 28175 27894
+25050 25553 25051
+27346 27604 27605
+27619 27361 27360
+28681 28680 29022
+29032 28690 29031
+29804 29977 29813
+28274 28206 28188
+28972 28971 29015
+27656 27408 27655
+29994 29817 29980
+29775 29595 29608
+27407 27207 27379
+23597 24005 23598
+29775 29609 29595
+23542 23229 23431
+28029 28332 28030
+26554 26325 26635
+27149 27189 26970
+26851 26685 26684
+29846 29643 29642
+23542 23618 23432
+30026 30211 30212
+29377 29376 29640
+27514 27777 27778
+28219 28220 28067
+23449 23647 23450
+29060 29059 29391
+28707 28706 29048
+21675 21939 21676
+30952 31585 30953
+28337 28034 28336
+26978 26886 26689
+30571 30047 30252
+27502 27766 27503
+31509 31508 31510
+31544 30912 30911
+30270 30588 30986
+29378 29377 29641
+29387 29055 29386
+26460 26459 26547
+30600 31009 31010
+29402 29260 29326
+30062 29861 29860
+26360 26716 26361
+28651 28732 28733
+28848 28910 29065
+29209 29260 29261
+28228 28229 28073
+29277 29415 29278
+30294 30613 30068
+28855 28914 28856
+28294 28517 28387
+31059 30306 30624
+29217 29277 29218
+30059 30277 30278
+31450 32083 32084
+31117 30653 31116
+31115 31748 31116
+29305 29241 29117
+27813 27971 27814
+30627 30309 30075
+30078 30314 30633
+28406 28405 28546
+29093 28936 28992
+29338 29429 29569
+29007 29115 29240
+28253 28408 28409
+28623 28665 28666
+28666 28760 28898
+26948 27044 27045
+28552 28614 28615
+27163 27023 27022
+29565 29671 29415
+25098 25201 25319
+24809 24697 24954
+26896 26897 26856
+27642 27519 27641
+23856 24239 24051
+31673 31041 31040
+27530 27456 27426
+28921 28978 29078
+27714 27713 27783
+28641 28854 28728
+26362 26565 26566
+28212 28213 28190
+28362 28361 28716
+28725 28638 28637
+24445 24239 24673
+20194 20330 20331
+22863 22773 22669
+25903 26367 26368
+21954 21953 22448
+23966 23868 23965
+22450 22344 22223
+21314 21449 21450
+24608 24681 24453
+26942 26895 27021
+28093 27963 28092
+27025 27024 27273
+17043 17206 17044
+27686 27646 27822
+21453 21452 21974
+23968 23874 24084
+26857 26646 26753
+21038 21164 20886
+21438 21153 21307
+24080 24479 24081
+20767 20766 20883
+20893 20892 21457
+17882 17700 17881
+18538 18072 18071
+17527 17705 17706
+18387 18525 18526
+18810 18809 19084
+18671 18525 18670
+17351 17350 17514
+20873 20872 21029
+23458 23267 23071
+21161 21037 20884
+21702 21436 21701
+21034 21033 21312
+21842 21960 21702
+19521 19663 19364
+18375 18374 18497
+19860 20005 19861
+17675 17865 17866
+19678 19075 19373
+21303 21304 21146
+18238 18147 18237
+21672 21930 21827
+19520 19519 19660
+23064 22863 22862
+18924 19043 19044
+21946 21684 21945
+21412 21127 21411
+21141 21140 21297
+20338 20507 20610
+23446 23160 23060
+24344 24236 24343
+27454 27641 27519
+24238 24239 24050
+21826 21825 21929
+24794 24894 25161
+19042 19043 18923
+22112 22427 22203
+21925 21926 21821
+18764 18923 18765
+23047 23151 23231
+26675 26963 26964
+19496 19310 19495
+23044 23043 23211
+21100 21099 21274
+18356 18213 18133
+20285 20819 20820
+17112 17153 17154
+19973 20294 20295
+19027 19624 19028
+21109 20823 21108
+15276 14889 15076
+18746 18747 18632
+18649 18480 18479
+17113 17112 17154
+17315 17314 17483
+18463 18759 18639
+17156 17157 16984
+17313 17482 17314
+17652 17587 17586
+14725 14655 14654
+17259 17153 17258
+16654 16453 16452
+17157 17158 16985
+18945 19237 19073
+16020 16091 16092
+19073 19371 18805
+21603 21442 21602
+21442 21443 21156
+18494 18495 18245
+17676 17866 17867
+15516 15630 15720
+15403 15303 15302
+15219 15220 15095
+16590 16465 16665
+16854 16683 16853
+12028 11972 12027
+15320 15126 15319
+15325 15130 15129
+14919 14742 14741
+12480 12304 12479
+14747 14926 14850
+13269 13624 13455
+14758 14757 15126
+12004 11967 11882
+12787 12669 12786
+15696 15490 15294
+17594 17494 17593
+17591 17493 17492
+17442 17328 17441
+15484 15399 15286
+15818 15690 15689
+15611 15482 15687
+14334 14541 14731
+13966 14141 14087
+12777 12841 12778
+9371 9457 9330
+6145 6146 6016
+4514 4378 4377
+5888 5850 5979
+6163 6267 6268
+5028 5112 5029
+5307 5389 5308
+19313 19204 19312
+5035 4757 4887
+4749 4881 4831
+5848 5885 5886
+4881 4749 4830
+3918 3991 3992
+3417 3637 3538
+3539 3540 3445
+3549 3455 3454
+3824 3823 3879
+4374 4250 4373
+4127 4126 4186
+4184 4122 4245
+3990 3989 4041
+4372 4249 4248
+5850 5784 5849
+6025 6155 6156
+3455 3366 3365
+4044 4045 3994
+3506 3541 3507
+1388 1338 1337
+1137 1136 1240
+1923 1922 1965
+3505 3539 3444
+2794 2793 2816
+3750 3652 3651
+4059 4058 4151
+6317 6409 6318
+6945 6891 6890
+5560 5662 5663
+6671 6819 6714
+6096 5980 6020
+6163 6269 6164
+11126 11002 11125
+6266 6316 6267
+6823 6717 6716
+8687 8688 8582
+11135 11268 11136
+10463 10464 10437
+7627 7626 7697
+5801 5903 5678
+2147 2184 2148
+2483 2514 2476
+5801 5901 5902
+7074 7075 6944
+9177 9070 8984
+6467 6330 6329
+2148 2184 2233
+3213 3212 3298
+1706 1845 1707
+1838 1701 1837
+2442 2485 2525
+2824 2798 2757
+2736 2704 2735
+2699 2700 2688
+2825 2861 2892
+2707 2759 2826
+4393 4466 4394
+5196 5195 5463
+4729 4790 4791
+3318 3231 3138
+1467 1383 1382
+2488 2528 2489
+1151 1221 1152
+6184 6183 6280
+4157 4207 4208
+7162 7082 7225
+8694 8742 8775
+8388 8317 8387
+6789 6831 6832
+7092 7034 7033
+6730 6790 6731
+8474 8533 8588
+9166 9274 9167
+7985 7921 8035
+7095 7096 6961
+6338 6280 6183
+13211 13114 13210
+13752 13671 13847
+11677 11552 11551
+10823 10822 10888
+13108 12909 12908
+12328 12327 12411
+12902 12901 13104
+11544 11613 11614
+10336 10276 10275
+11545 11615 11546
+9884 9883 9914
+11548 11486 11411
+11407 11406 11542
+11900 11666 11899
+8648 8679 8574
+10180 10250 10274
+14466 14465 14555
+15034 15133 15134
+12703 12501 12702
+13395 13289 13288
+12313 12314 12172
+15738 15641 15539
+16710 16514 16513
+16494 16495 16301
+15740 15739 15839
+14180 14375 14181
+14382 14013 14381
+18511 18512 18255
+18054 18053 18518
+17690 17797 17874
+15543 15645 15743
+16501 16410 16409
+16954 16953 17037
+20036 20215 20037
+16120 16119 16312
+14196 14281 14197
+13006 13099 13007
+14955 14865 14864
+12254 12415 12332
+12720 12617 12186
+15344 15247 15343
+15946 16126 16127
+17216 17217 17058
+16512 16317 16511
+16891 16804 16732
+13839 13917 13918
+14114 14213 14115
+12255 12256 12185
+14869 14792 14965
+11156 11157 11033
+10603 10604 10393
+13317 13494 13495
+13849 14035 14036
+12190 12121 12120
+11913 11914 11855
+14603 14406 14602
+14501 14612 14613
+13931 13857 13930
+12056 12128 12057
+12643 12750 12544
+10309 10265 10217
+13692 13515 13691
+12923 12822 13127
+12931 12751 12930
+12190 12119 12189
+10203 10036 10035
+11163 11429 11430
+10557 10620 10621
+11435 11359 11296
+12364 12558 12365
+7700 7699 7776
+8806 8805 9003
+8449 8407 8406
+7254 7186 7185
+8617 8506 8616
+10218 10310 10311
+10755 10598 10687
+8406 8363 8331
+8856 8857 8796
+8362 8405 8406
+8800 8859 8801
+9484 9483 9542
+11155 11032 11154
+11296 11168 11167
+8493 8492 8544
+8714 8751 8715
+9071 9036 9070
+9837 10035 10036
+6188 6480 6189
+6968 6738 6737
+7702 7632 7631
+8405 8404 8448
+5709 5763 5645
+4866 4798 4797
+5471 5472 5407
+4665 4739 4666
+4660 4542 4605
+914 999 1000
+255 259 256
+1343 1397 1344
+475 441 440
+1154 1055 1153
+211 193 210
+484 473 472
+564 596 565
+556 555 570
+3852 3812 3774
+4607 4547 4546
+2459 2505 2460
+3851 3852 3774
+533 454 453
+218 219 210
+535 455 534
+310 311 296
+133 122 132
+60 42 32
+137 104 136
+137 172 138
+543 542 581
+530 451 450
+5768 5831 5832
+5720 5501 5719
+5413 5412 5492
+5091 4934 4933
+1517 1762 1518
+835 912 873
+6854 6853 6904
+7181 7108 7250
+6627 6563 6562
+6992 6993 6762
+6565 6491 6629
+8051 7934 8050
+6569 6505 6504
+6766 6692 6691
+6218 6083 6138
+4683 4428 4427
+2291 2222 2221
+5237 5236 5500
+779 778 843
+850 784 723
+230 229 271
+881 927 847
+694 729 706
+787 788 751
+334 333 393
+1905 1904 2025
+928 883 882
+3791 3815 3792
+4026 3977 3976
+2312 2356 2313
+2429 2354 2428
+697 734 735
+330 269 329
+337 275 336
+699 657 698
+1446 1430 1530
+515 546 558
+1648 1568 1567
+1321 1237 1180
+4706 4705 4743
+3816 3815 3865
+3335 3286 3285
+3499 3536 3596
+3866 3816 3865
+8056 8254 8057
+3974 3975 3870
+7212 7066 7151
+6387 6388 6238
+6523 6377 6522
+7643 7581 7580
+9213 9258 9214
+8351 8456 8457
+13427 13364 13363
+10427 10426 10457
+11073 10861 10951
+9362 9312 9361
+11191 11192 10934
+6523 6434 6378
+8346 8347 8270
+8525 8571 8526
+8431 8516 8432
+8296 8347 8348
+6769 6797 6798
+7291 7332 7333
+7191 7273 7125
+9957 9958 9857
+7642 7578 7641
+10098 10138 10065
+7526 7578 7642
+9868 9965 9869
+9700 9699 9870
+10627 10628 10509
+9686 9623 9685
+11808 11693 11570
+10841 10914 10915
+13347 13226 13346
+10771 10843 10772
+13698 13871 13872
+11686 11687 11563
+13344 13517 13422
+12557 12943 12558
+14885 14832 14884
+12570 12955 12571
+13773 13717 13716
+13230 13361 13362
+13884 13775 13883
+10460 10429 10459
+13586 13720 13721
+16011 15811 15605
+18979 18878 18978
+20149 19953 19952
+11962 12087 11963
+12379 12573 12574
+10177 10178 10151
+9325 9449 9581
+15005 15202 15071
+15391 15390 15466
+14885 14833 14832
+11821 11750 11820
+17755 17574 17573
+20099 19908 20098
+19765 19434 19764
+19274 19149 18979
+20953 20424 20423
+19818 19601 19600
+11842 11841 11881
+10566 10524 10523
+19299 19595 19809
+19441 19440 19770
+18976 19147 18877
+21530 21232 21345
+19151 19150 19447
+20094 19906 19757
+17414 17567 17464
+17744 17743 18109
+18119 17929 17928
+22935 23104 23105
+19900 20086 20087
+26660 26609 26794
+17459 17557 17558
+22720 22518 22614
+17301 17413 17463
+25502 25503 25247
+25518 25261 25351
+17250 17308 17309
+17761 17427 17760
+17152 17096 17151
+17421 17467 17573
+17424 17425 17101
+16375 16442 16443
+17758 17759 17424
+15590 15382 15793
+16186 16185 16248
+14877 14990 14878
+17564 17742 17407
+16362 16750 16751
+14414 14501 14415
+14998 15066 14999
+15863 15983 15984
+16968 17075 17076
+15665 15779 15780
+17072 17139 17073
+14809 14981 14608
+14812 14873 14813
+14599 14804 14691
+14393 14488 14394
+15773 15574 15664
+16159 16551 16353
+16136 15953 16135
+17128 17204 17042
+14037 13851 14036
+14200 14030 14199
+16732 16804 16733
+18294 18087 18293
+15775 15973 15776
+15771 15663 15571
+16721 16531 16530
+17135 17225 17136
+16155 16233 16234
+25202 25465 25203
+21041 20899 21170
+20381 20049 20380
+22362 22502 22363
+19407 19117 18847
+22912 23088 22913
+25119 24992 25118
+19549 19718 19719
+21490 21491 21192
+17393 17289 17392
+17397 17231 17230
+18568 18567 19119
+22515 22279 22278
+20665 20532 20664
+22268 22267 22507
+26272 26273 26192
+25522 25265 25521
+25510 25509 25637
+25752 25751 25995
+26183 26182 26424
+24991 24992 24737
+23315 22924 22923
+23914 23723 24124
+26284 26201 26200
+24633 24634 24512
+25479 25614 25615
+26758 27046 27047
+23466 23290 23167
+19705 19545 19393
+22136 21851 21987
+24717 24825 24718
+24274 24496 24497
+27576 27395 27575
+24830 24726 24725
+26072 26255 26174
+25511 25749 25750
+27839 27570 27838
+28442 28443 28124
+27845 27695 27694
+30118 29916 29915
+30371 30689 31189
+30487 30807 30488
+31287 31921 31288
+26436 26523 26598
+30713 30394 31235
+31287 30420 30739
+30121 30122 29919
+30424 30425 30133
+28141 27860 28140
+26446 26534 26535
+30737 31282 31283
+30422 30741 31291
+30430 30136 30135
+31925 31926 31292
+31938 31936 31941
+31287 31919 31920
+31295 30424 30743
+26805 26463 26462
+30422 30742 30423
+31759 31756 31762
+31351 30452 30771
+31941 31936 31934
+32010 32008 32013
+25534 25535 25361
+26109 26222 26110
+29738 29793 29794
+25032 25142 25033
+27874 27602 27873
+31975 31976 31342
+26463 26464 26298
+26225 26224 26299
+25013 25012 25254
+26612 26539 26538
+25639 25755 25519
+25751 25513 25512
+26814 26475 26474
+23825 23745 23924
+26465 26300 26299
+26224 26111 26005
+27343 27093 27092
+25762 26013 25843
+21258 21560 21259
+19815 19814 19946
+22740 22545 22617
+18894 18610 18609
+19943 19813 19942
+22579 22380 22578
+23025 22797 23143
+25771 25570 25770
+25288 25371 25146
+29196 29197 28838
+24570 25054 24571
+22157 22376 22158
+22296 22542 22372
+24158 24157 24566
+25069 25068 25288
+28834 28494 28493
+31367 32000 32001
+30458 31363 30778
+29510 29586 29587
+32014 31382 31381
+29980 29817 29790
+31475 31476 30843
+29550 29526 29319
+29551 29613 29552
+30192 30512 30193
+31467 30837 31466
+30890 30889 31522
+30533 30215 30028
+28334 28688 28689
+31496 30864 30863
+31466 30837 30836
+30019 30006 30182
+26972 26935 26934
+30513 30194 30181
+29353 29354 29022
+28684 29025 29026
+28029 28331 28332
+30878 31510 31511
+27486 27224 27485
+28332 28687 28333
+26329 26508 26556
+29024 29356 29025
+28903 28904 28570
+29609 29596 29595
+29550 29549 29599
+29593 29592 29606
+27992 28015 27927
+29975 29986 29976
+29345 29317 29522
+26958 27142 27129
+29545 29593 29546
+27927 27928 27658
+26323 25862 25861
+29547 29523 29594
+22816 22643 22642
+25381 25852 25382
+22632 22391 22631
+21909 21908 22188
+25658 25383 25854
+25846 25847 25775
+24657 24790 24791
+24868 25075 25076
+24185 24186 23997
+23838 24221 23999
+24872 24396 24395
+24185 24218 24219
+24790 24865 24866
+24873 24396 24872
+27185 27144 27143
+26678 26320 26677
+18452 18354 18451
+20586 20827 20828
+26558 26559 26509
+26976 26940 26883
+26511 26561 26690
+26885 26687 26884
+28028 27749 28027
+26688 26885 26978
+26884 26686 26853
+26879 26880 26850
+26555 26326 26554
+26883 26939 26976
+29355 29619 29356
+26883 26882 26939
+28329 28683 28684
+27156 26939 26975
+27419 27195 27222
+29362 29363 29031
+28039 28342 28040
+28347 28346 28701
+27764 27763 28042
+22662 22438 22437
+27492 27491 27755
+27753 27489 27752
+29035 28693 29034
+30917 30918 30554
+27496 27760 27497
+24902 25410 24903
+24663 24664 24598
+25875 25874 26339
+24421 24899 24422
+27238 27237 27499
+24422 24030 24421
+25879 25408 25878
+24898 25406 24899
+26988 26699 26987
+23625 23239 23238
+27769 27505 27768
+26705 26704 26993
+28046 27767 28045
+24429 24430 24038
+23852 24232 24047
+25420 25890 25891
+24235 24234 24440
+21584 21679 21585
+25896 25895 26360
+26709 26710 26354
+26716 27005 26717
+25426 25166 25165
+29856 29652 29855
+27254 27255 27007
+26994 26993 27241
+27766 27765 28044
+26716 26715 27004
+27778 27779 27515
+29382 29645 29646
+26715 26714 27003
+27002 27001 27249
+27244 26996 27243
+28713 29054 29055
+28060 28363 28061
+30051 29850 29849
+30271 30988 30989
+29854 30056 29855
+30992 31625 30993
+31001 30277 31000
+30951 30952 30571
+30572 30254 30253
+30249 30250 30045
+30570 30950 30252
+30577 30964 30259
+28345 28700 28346
+30562 30933 30934
+30539 30031 30220
+29831 29628 29627
+30546 30902 30228
+27234 27495 27496
+30230 30549 30036
+30912 31544 31545
+28694 28340 28339
+31536 30904 30903
+29633 29369 29632
+30916 30915 31548
+30946 30947 30250
+29830 30032 29831
+31534 30902 30901
+30045 30248 30567
+30251 30252 30046
+30532 30873 30874
+30221 30889 30540
+30896 31529 30897
+30917 30235 30916
+30923 30922 31555
+31585 30952 31584
+30261 30580 30262
+30052 30263 30264
+30949 31582 30950
+31641 31008 31640
+30598 31005 31006
+30280 30599 30061
+30278 30596 31002
+30283 31012 31013
+31564 31563 31561
+30283 30062 30601
+31008 31007 31640
+28851 28850 28912
+31038 31671 31039
+29533 29407 29406
+30606 30287 31021
+30291 31028 31029
+31044 31676 31677
+29862 29863 29659
+28509 28369 28576
+28365 28720 28366
+29658 29394 29657
+28724 28635 28847
+28573 28721 28506
+28643 28728 28729
+29257 29258 29066
+29864 29660 29863
+31667 31668 31035
+29211 29074 29073
+29257 29323 29258
+28924 28865 28737
+28382 28290 28289
+28739 28868 28869
+28084 27954 27953
+29281 29093 29221
+29087 29216 28988
+27943 27944 27797
+29089 28933 28932
+30635 31081 30317
+31096 31728 31729
+29404 29403 29530
+28914 28854 29068
+29868 29664 29867
+31041 31673 31674
+31672 31673 31040
+31057 30624 30305
+31079 31080 30635
+30318 30636 31083
+31717 31084 31716
+31087 30639 30320
+31116 31749 31117
+31720 31723 31721
+29227 29228 29099
+31099 30644 31098
+29292 29291 29423
+30644 31099 30326
+31715 31083 31082
+29010 29118 29119
+30090 30338 30657
+30091 30660 30342
+28762 28761 28966
+30341 31129 30660
+30670 30096 30351
+30668 30349 31145
+31149 31782 31783
+30356 30675 30099
+30337 30656 30338
+29304 29305 29117
+27822 28107 28108
+30667 30095 30348
+29121 29435 29436
+31768 31765 31770
+30095 30349 30668
+29435 29121 29120
+28624 28623 28666
+29436 29435 29688
+28620 28562 28561
+28005 28006 27971
+28895 28961 29007
+29333 29427 29334
+28410 28611 28551
+29681 29884 29885
+30087 30333 30334
+29114 28960 29006
+28308 28417 28562
+30646 31102 31103
+28995 29098 28996
+29567 29425 29332
+28997 29099 29229
+29294 29231 29332
+28410 28551 28411
+28094 28093 28255
+28547 28406 28605
+28755 28558 28754
+25937 26393 25938
+28560 28619 28756
+28004 28099 28005
+29007 28962 28895
+28102 28196 28197
+27975 28008 27976
+27432 27392 27391
+27553 27645 27685
+28766 29125 28767
+28430 28112 28111
+27561 27830 27562
+26520 26400 26582
+27434 27435 27293
+27719 27682 27681
+27687 27686 27822
+27433 27552 27458
+25316 25461 25462
+25943 26068 25807
+25709 25606 25605
+23472 23694 23561
+24271 24094 24270
+24266 24092 23883
+25206 24970 25205
+23471 23687 23688
+24973 24972 25099
+25460 25940 25700
+25455 25935 25456
+26580 26518 26579
+26754 26857 26903
+28255 28256 28095
+25922 26154 25923
+26390 26391 25935
+27545 27544 27811
+27430 27680 27549
+27539 27540 27279
+24956 25197 24701
+28087 27957 27956
+25086 24807 24941
+25796 25925 25926
+27273 27024 27165
+27020 27268 27269
+28230 28290 28383
+26895 26894 27021
+28532 28751 28599
+26151 26150 26381
+25691 25804 25692
+28092 28253 28093
+28541 28403 28540
+27537 27804 27805
+28090 28089 28250
+27028 27027 27277
+28530 28531 28398
+28401 28402 28248
+28231 28230 28383
+29082 28980 29081
+28398 28532 28299
+27275 27026 27274
+28232 28194 28231
+28380 28287 28286
+28380 28285 28379
+29209 28915 29069
+28229 28288 28289
+28652 28587 28651
+28369 28278 28508
+28214 28367 28277
+28283 28284 28223
+28377 28284 28376
+27792 27791 28071
+28068 28221 28069
+27527 27526 27791
+27677 27530 27676
+27454 27519 27423
+26571 26376 26732
+26723 26722 27012
+25900 25899 26058
+26723 27012 27013
+27519 27455 27423
+27160 27010 27159
+24448 24675 24449
+25436 25174 25435
+24605 24678 24679
+26062 26148 26149
+24930 24801 24679
+22865 22864 23257
+24245 24683 24455
+23858 23857 23961
+22449 22868 22672
+23861 23802 23657
+23262 23065 23261
+24348 24609 24454
+21305 21029 21151
+20017 20203 20018
+26061 26146 26147
+24244 24243 24348
+21705 21704 21961
+23404 23460 23461
+22457 22876 22458
+20354 20622 20623
+21969 22130 22235
+23165 23273 23074
+18807 18662 18661
+22877 22458 22876
+25182 25449 25450
+24069 23967 24068
+21847 21970 21971
+24251 24351 24252
+25442 25911 25912
+23555 23462 23665
+24066 24067 23965
+24690 24807 24691
+26147 26250 26251
+24691 24807 24942
+25447 25683 25181
+27025 26737 27024
+25796 25795 25925
+27539 27538 27806
+24472 24075 24471
+21972 21848 21971
+25695 25932 25933
+24260 24355 24356
+24073 24470 24074
+24474 24473 24695
+25087 24950 24949
+24694 24473 24257
+25090 25091 24951
+25698 25699 25454
+26745 27033 26746
+25937 25936 26392
+24079 24477 24478
+24699 24615 24698
+25461 25700 25462
+22780 22689 22688
+24080 23676 23675
+24703 24485 24617
+23468 23467 23558
+21985 22132 21849
+20038 20216 20371
+18067 18066 18276
+18825 19391 19098
+20040 20219 20220
+17045 17044 17373
+19096 18824 19390
+19392 19391 19702
+21466 21321 21465
+20900 20901 20774
+20630 20365 20364
+17279 17195 17194
+20359 20208 20358
+20888 21453 20889
+18815 18816 18672
+24466 24070 24069
+21451 21725 21452
+22887 22468 22886
+21456 21978 21457
+20889 21453 21454
+24075 23672 24074
+20513 20356 20355
+18156 18266 18267
+17514 17875 17691
+20514 20357 20625
+18518 18261 18517
+19087 18519 18518
+18665 18666 18522
+18822 18536 18535
+19390 20036 19700
+18537 18280 18536
+19097 19700 19701
+18279 18536 18280
+19388 19387 19542
+17532 17711 17533
+18537 18824 19096
+17888 17706 17705
+17370 17285 17284
+17804 17891 17892
+18392 18283 18391
+17051 17052 16884
+17622 17805 17717
+17053 17383 17054
+16957 17051 16883
+16335 16424 16533
+16421 16328 16327
+17047 17046 17209
+16721 16802 16531
+16332 16530 16531
+16622 16721 16530
+16510 16316 16315
+17885 17703 17884
+18281 18539 18540
+16523 16524 16326
+17894 18075 17971
+16529 16622 16530
+17195 17196 17127
+16216 16307 16308
+16506 16312 16505
+17359 17193 17192
+17025 16695 16694
+17186 17124 17275
+17684 17683 18047
+17686 17792 17687
+17347 17275 17346
+17608 17687 17688
+17791 17686 17790
+19372 19074 19371
+17794 17688 17687
+17507 17606 17508
+19384 19385 19241
+17512 17513 17445
+18260 18515 18516
+18946 19091 18813
+18258 18514 18515
+19076 19680 19077
+19689 19688 19869
+19530 19371 19529
+20613 20510 20341
+17336 17180 17335
+18798 18655 18496
+18257 18380 18381
+18049 17870 17869
+18251 18376 18499
+20201 20014 20013
+18799 19070 18800
+19670 19863 19671
+21838 21696 21432
+20008 20198 20009
+18796 18795 19068
+18797 18796 19069
+18373 18247 18246
+18375 18498 18376
+19525 19524 19671
+18151 18036 18150
+18497 18655 18656
+18377 18252 18251
+18249 18248 18375
+17680 17339 17338
+18378 18377 18500
+17964 17867 17866
+18254 18253 18502
+17330 17329 17443
+16847 17009 17010
+18037 18249 18038
+17178 17123 17274
+17000 17169 17170
+19065 18939 19233
+18242 18148 18241
+18795 18494 18493
+18026 17956 17855
+18489 18235 18370
+17857 17668 17856
+17955 18025 18145
+16268 16083 16082
+17666 17595 17665
+16831 16931 16832
+16079 16080 15891
+17160 17161 16988
+16257 16650 16258
+17664 17594 17593
+15690 15818 15891
+18140 18139 18226
+17163 17266 17267
+17955 17854 18025
+19361 19517 19518
+18936 18782 18935
+18018 17658 17657
+18013 18014 17948
+17656 17844 17657
+17587 17653 17480
+17843 18015 18016
+17655 18016 17844
+18139 18779 18479
+19988 20181 20182
+19362 19519 19520
+18021 18022 17950
+18651 18790 18231
+20324 19999 19998
+20000 19855 19999
+19992 19993 19849
+20325 20187 20001
+18488 18652 18489
+18244 18243 18372
+18239 18238 18491
+19067 18941 19066
+21138 21295 21139
+20332 20196 20331
+22445 22671 22222
+20326 20188 20002
+18013 17947 18779
+17311 17480 17312
+19841 19842 19648
+19649 19650 19509
+19839 19985 19647
+23064 23450 23256
+23651 24053 24054
+23399 23449 23255
+23650 24053 23651
+21682 21945 21683
+24672 24921 24673
+26569 26365 26514
+22214 22117 21943
+23959 24048 24235
+21016 20852 20851
+20315 20181 19987
+21127 21017 21016
+20312 20180 20179
+18473 18474 18364
+22765 22654 22843
+22844 22656 22655
+24039 24430 24431
+23051 23050 23238
+20842 21010 21117
+24031 24032 23625
+23049 23237 23157
+23243 23242 23629
+21281 21404 21673
+17776 17947 17841
+21121 21014 21013
+21825 21824 22113
+21403 21280 21579
+22111 22201 22202
+20309 20485 20590
+20286 19620 20285
+19968 19617 19616
+24015 24408 24409
+20743 20825 20744
+23229 23392 23045
+23394 23619 23620
+25405 24897 25404
+23844 23954 23955
+24340 24341 24227
+23397 23437 23438
+21103 21104 20820
+21381 21906 21664
+22195 21919 21918
+22583 22327 22582
+25656 25377 25154
+22995 22808 23034
+23997 23836 23949
+22803 22802 22991
+23786 23540 23588
+22172 22171 22325
+23948 23835 23947
+22387 22386 22626
+23144 23145 23027
+23145 23144 23196
+22176 22389 21891
+21890 22175 22176
+22389 22390 21892
+21098 21007 21097
+20283 20577 20818
+20569 20568 20809
+21893 22390 22391
+20570 20476 20569
+21004 21003 21092
+22991 23027 22992
+18739 18912 19010
+18911 19009 18912
+21656 21657 21366
+19316 19208 19315
+19607 19826 19827
+20473 20567 20474
+21573 21653 21654
+19499 19614 19615
+19609 19830 19610
+19619 19618 20284
+20820 21104 21105
+19624 19623 19972
+21107 20821 21106
+19630 19631 19505
+19221 19334 19335
+18923 19043 18765
+18639 18759 18760
+17943 17944 17828
+22648 22999 22838
+18753 19028 18754
+18452 18753 18754
+17584 17470 17583
+4709 4747 4748
+19331 19975 19629
+18215 18136 17998
+19034 19337 19222
+18766 19043 18924
+15277 15078 15077
+17773 17641 17772
+17836 17644 17774
+18004 18003 18459
+18638 18450 18352
+18448 18349 18447
+18748 18635 18447
+19024 18748 18747
+18636 18350 18349
+20174 19969 19968
+20577 20281 20817
+18739 18738 18912
+19499 19318 19611
+19317 19316 19498
+15397 15398 15279
+13036 12967 13035
+15883 15681 15680
+16014 16067 15879
+15086 15085 15480
+15880 15879 16067
+15679 15475 15474
+13243 13242 13597
+15079 15080 15012
+15282 15213 15281
+13373 13372 13432
+15079 15208 15209
+15281 15212 15280
+17645 17583 17582
+14891 15078 15010
+14649 14648 14719
+14713 14641 14838
+14133 14134 14082
+13892 13957 13958
+13962 14138 13963
+14891 14713 14890
+14720 14721 14651
+15682 15478 15477
+15610 15684 15479
+15081 15212 15082
+14533 14328 14327
+14452 14451 14530
+14534 14535 14328
+14649 14531 14530
+15215 15014 15088
+14721 14722 14532
+16267 16459 16082
+16194 16263 16195
+16016 15894 16082
+15686 15889 15687
+15817 15687 15889
+16261 16262 16076
+15686 15482 15481
+16260 16261 16076
+16452 16453 16261
+17116 16992 17163
+16077 16015 15889
+16662 16782 16663
+16664 16663 16832
+17503 17502 17603
+15487 15291 15290
+16198 16080 16197
+16834 16666 16665
+16779 16658 16657
+16596 16669 16670
+17000 16934 16999
+16836 16784 16835
+17000 16935 16934
+16272 16087 16465
+17270 17271 17170
+17334 17178 17274
+17336 17678 17337
+17182 17010 17181
+15711 15710 15909
+18045 18046 17682
+16856 16793 16688
+16481 16480 16680
+16293 16487 16488
+15904 15903 16089
+16285 16480 16286
+16203 16280 16204
+16676 16282 16675
+15709 15620 15708
+16204 16281 16092
+14922 15112 14744
+16093 16281 16478
+15911 15826 15910
+16679 16480 16285
+15515 15516 15319
+15723 15518 15517
+15498 15497 15617
+15708 15707 15907
+14755 14754 15123
+15516 15721 15722
+15706 15705 15823
+15903 15822 15902
+15703 15494 15702
+16786 16591 16667
+15703 15904 15823
+15906 15907 15824
+16273 15900 16272
+16087 16271 16465
+15821 15694 15898
+15488 15291 15487
+15099 14912 14911
+15095 15023 15022
+14462 14461 14548
+15304 15225 15224
+11967 11968 11882
+13808 13985 13986
+12160 12099 12159
+13985 13621 13984
+14923 14744 15112
+15625 15713 15714
+15629 15628 15715
+15123 15512 15124
+14747 14925 14926
+13996 13633 13995
+14852 14851 14928
+12603 12490 12693
+14756 14361 14360
+12312 12311 12400
+12984 13073 12985
+12985 13073 13074
+12299 12158 12010
+12021 12107 12022
+13271 13177 13270
+11269 11268 11403
+12020 12021 11898
+11669 11542 11541
+11403 11539 11270
+11853 11907 11908
+12027 11971 11970
+11666 11665 11899
+11141 11221 11222
+12025 12313 12172
+10719 10804 10868
+8370 8462 8463
+11894 11774 11658
+10571 10656 10657
+11886 11887 11651
+11894 12015 12016
+12154 12155 11889
+10719 10656 10718
+11259 11258 11345
+11214 11257 11258
+11124 11079 11078
+11002 10961 11078
+11000 10957 10999
+11385 11652 11386
+11127 11081 11080
+9377 9507 9461
+12467 12293 12149
+11118 11209 11249
+11652 11887 11888
+13067 13261 13262
+14155 14259 14342
+12680 12296 12471
+13976 13977 13802
+12472 12296 12680
+12674 12292 12466
+12981 12982 12859
+14731 14335 14334
+14914 14736 15101
+13061 13173 13385
+14849 14740 14739
+14157 14261 14262
+14910 14733 14909
+12793 12859 12860
+13798 13974 13898
+12392 12393 12290
+13449 13542 13543
+13067 13068 12862
+13800 13613 13732
+14329 14141 14328
+13789 13601 13788
+14328 14141 13965
+14717 14527 14716
+10960 10961 10864
+17580 17643 17774
+14131 13957 13956
+13596 13787 13597
+14325 14324 14450
+14139 14325 14326
+13247 13248 13048
+13244 13043 13243
+12289 12245 12288
+13379 13440 13380
+13445 13606 13607
+12855 12856 12790
+19017 19206 19207
+13959 13958 14081
+13594 13783 13784
+11480 11380 11379
+5844 5775 5879
+12287 12243 12143
+9500 9590 9456
+5295 5423 5424
+6019 6094 6095
+9643 9642 9714
+12004 12005 11967
+8111 8078 8110
+9504 9592 9593
+8881 8880 8934
+6142 6245 6143
+8179 8212 8180
+8277 8303 8206
+6397 6447 6448
+8007 8080 8008
+5262 5304 5263
+6015 6145 6016
+5674 5637 5571
+5977 6017 6018
+6157 6312 6158
+4987 5040 5041
+4989 4893 4988
+5629 5562 5628
+5666 5750 5667
+5167 5269 5168
+5564 5563 5631
+5302 5162 5301
+5167 5168 5116
+5169 5118 5117
+5529 5528 5561
+5302 5163 5162
+5657 5656 5777
+5526 5430 5381
+6014 6142 6143
+5745 5783 5746
+5848 5887 5849
+5156 5028 5027
+5519 5520 5424
+12581 12656 12774
+5377 5296 5425
+5026 4880 4975
+4882 4831 4977
+4877 4878 4827
+4504 4368 4453
+4368 4319 4245
+4831 4750 4749
+4035 4121 4122
+4586 4455 4506
+4502 4618 4619
+4366 4502 4453
+4713 4755 4756
+4318 4368 4245
+3443 3538 3505
+3638 3702 3606
+3606 3639 3539
+1366 1365 1455
+3341 3418 3359
+3417 3443 3418
+3915 3987 4040
+4038 4037 4100
+3641 3703 3741
+3827 3880 3917
+1783 1782 1827
+2810 2851 2852
+1652 1688 1689
+1655 1693 1694
+1193 1192 1245
+1572 1653 1690
+1655 1577 1576
+1827 1782 1826
+3204 3106 3105
+3542 3507 3642
+3750 3651 3650
+3649 3648 3709
+3105 3074 3073
+3541 3642 3507
+4106 4043 4105
+4186 4126 4185
+4190 4189 4250
+4585 4623 4506
+4249 4250 4189
+4104 4041 4103
+4587 4511 4510
+4626 4757 4888
+5042 5172 5120
+4781 4646 4780
+5444 5398 5314
+4775 4850 4851
+2991 2922 2951
+3263 3210 3209
+3545 3451 3544
+3511 3460 3459
+3081 3117 3118
+3367 3456 3457
+3372 3461 3419
+2881 2880 2948
+2688 2700 2689
+1451 1452 1362
+1139 1105 1138
+1582 1456 1581
+3211 3166 3210
+1969 2039 2076
+3212 3297 3298
+3422 3374 3421
+1369 1370 1251
+1252 1370 1371
+1590 1465 1589
+1588 1587 1708
+1374 1373 1460
+3039 3129 3130
+2183 2231 2147
+2154 2086 2048
+4050 4051 3929
+5801 5678 5677
+3652 3711 3653
+3620 3621 3554
+4597 4642 4643
+4387 4465 4388
+5455 5327 5454
+4463 4464 4386
+4643 4523 4597
+4329 4262 4261
+5573 5449 5448
+4461 4462 4385
+6827 6826 6946
+6604 6718 6458
+6274 6321 6322
+5807 5683 5758
+7894 7893 7970
+7889 7746 7602
+5571 5673 5674
+6320 6271 6270
+5321 5450 5322
+4900 4994 4848
+5175 5174 5271
+5571 5572 5535
+5795 5896 5673
+7478 7418 7477
+5636 5567 5635
+5897 6032 6033
+6314 6160 6159
+6542 6447 6446
+6263 6314 6315
+6542 6448 6447
+6823 6716 6822
+6311 6262 6402
+8466 8438 8373
+9340 9339 9384
+7895 7831 7894
+8013 8014 7969
+10570 10656 10571
+8577 8578 8531
+9228 9268 9158
+8877 8933 8878
+8876 8875 8932
+9026 9027 8971
+8877 8878 8843
+8971 8932 8931
+8842 8877 8768
+9115 9114 9161
+7688 7755 7756
+8213 8279 8309
+9159 9269 9229
+9273 9387 9388
+9465 9382 9381
+9467 9468 9386
+9598 9647 9648
+9514 9469 9387
+9386 9387 9272
+10278 10337 10279
+8694 8775 8776
+8124 8216 8125
+9819 9818 9884
+11088 11087 11137
+8886 8940 8941
+9740 9739 9819
+10527 10466 10465
+10182 10279 10183
+10335 10274 10334
+10528 10469 10468
+10335 10334 10366
+8776 8775 8849
+8746 8697 8745
+9918 9917 10018
+9402 9525 9471
+8946 8889 8945
+6322 6321 6459
+4996 5054 4997
+8387 8441 8388
+8379 8215 8378
+7905 7842 7841
+6613 6466 6328
+7231 7171 7170
+6273 6274 6167
+6169 6327 6170
+6045 6118 6046
+6464 6553 6414
+6413 6414 6326
+8085 8127 8021
+7480 7423 7422
+7758 7689 7613
+6552 6610 6611
+7482 7483 7352
+7080 7081 6948
+5802 5904 5855
+5909 5995 6046
+7158 7080 7157
+6723 6612 6611
+5319 5272 5318
+5681 5680 5757
+5802 5803 5756
+6044 6043 6117
+5191 5190 5334
+4998 4909 4908
+4149 4271 4272
+4524 4388 4465
+3426 3427 3380
+3460 3461 3372
+5459 5539 5540
+5188 5060 5059
+3380 3381 3346
+3089 3127 3038
+1464 1434 1463
+1587 1588 1463
+2563 2524 2514
+1977 1845 1976
+1470 1387 1386
+3562 3561 3661
+2823 2822 2888
+3623 3669 3570
+3090 3132 3133
+3349 3385 3386
+4060 3998 4059
+2158 2192 2241
+1661 1589 1588
+2997 3041 3090
+3046 3231 3139
+2190 2189 2238
+3666 3665 3763
+3479 3389 3388
+4272 4271 4393
+3230 3317 3318
+3932 3840 3931
+4333 4332 4390
+3760 3838 3761
+4268 4267 4334
+3839 3840 3763
+4148 4147 4203
+4467 4531 4395
+4398 4397 4468
+4339 4276 4275
+4271 4335 4393
+4911 4910 5063
+4391 4646 4527
+4055 3934 4054
+3944 3848 3893
+4061 4110 4062
+4536 4537 4469
+3673 3723 3674
+2926 2892 2861
+3672 3671 3767
+3669 3721 3766
+2962 2893 2826
+2585 2656 2708
+2528 2529 2490
+2962 2961 3045
+1376 1432 1377
+1473 1539 1540
+1543 1609 1483
+2658 2657 2710
+1941 1796 1860
+2694 2711 2659
+1664 1720 1596
+2528 2656 2529
+1994 2061 1995
+1750 1749 1895
+1472 1390 1389
+1397 1398 1344
+1338 1260 1337
+1219 1280 1220
+1392 1393 1340
+1153 1282 1154
+484 485 473
+1406 1405 1486
+1438 1409 1491
+1491 1551 1552
+1487 1407 1406
+3680 3774 3681
+1541 1542 1480
+2383 2322 2382
+1546 1485 1545
+1610 1736 1880
+2496 2448 2532
+2893 2964 2894
+1881 1737 1880
+1737 1611 1610
+3576 3483 3575
+6556 6474 6473
+5197 5136 5196
+5541 5469 5468
+5074 5075 4919
+5689 5690 5465
+5692 5585 5467
+5461 5334 5460
+5692 5815 5693
+5071 5006 4917
+5918 6057 5919
+4731 4657 4656
+6179 6472 6335
+5462 5336 5335
+4397 4396 4533
+5067 5135 5195
+5337 5197 5196
+4857 4856 4914
+6955 6834 6954
+6948 6949 6830
+7092 7032 7091
+7090 7171 7172
+5997 5914 5996
+6789 6724 6788
+7499 7432 7365
+7769 7624 7623
+7309 7232 7231
+7310 7309 7361
+7910 7909 7978
+8316 8315 8385
+8780 8746 8779
+8699 8660 8698
+8036 7986 7985
+7918 7984 7919
+7851 7628 7775
+7770 7624 7769
+7851 7922 7986
+7775 7698 7774
+9125 9071 9070
+8595 8484 8594
+10086 10087 10028
+10155 10154 10193
+10442 10443 10379
+12333 12332 12418
+13561 13495 13671
+12255 12419 12334
+12521 12626 12728
+13309 13198 13308
+13490 13406 13489
+13748 13840 13666
+13749 13842 13843
+12913 12724 12912
+13314 13313 13492
+14034 13847 13846
+13494 13316 13315
+13838 13837 13915
+14107 14028 14027
+14106 14107 14027
+15356 15557 15558
+14023 13914 14022
+14867 14786 14866
+14024 14023 14104
+12901 12902 12807
+14278 14277 14390
+14786 14583 14785
+11283 11353 11417
+13306 13484 13105
+12254 12414 12415
+13307 13106 13105
+12416 12415 12511
+15148 15247 15248
+12902 12809 12808
+12808 12712 12711
+12613 12712 12614
+12715 12714 12904
+11415 11279 11278
+11554 11415 11553
+11017 11142 11090
+11489 11488 11555
+10475 10540 10541
+10885 10974 10886
+10374 10375 10340
+10535 10675 10582
+10579 10671 10672
+10251 10188 10187
+11093 11144 11145
+10670 10734 10735
+10736 10816 10817
+10825 10890 10826
+13186 13093 13092
+10876 11089 11016
+10730 10573 10462
+10735 10816 10671
+12109 12030 12029
+11545 11485 11484
+11272 11271 11404
+11544 11408 11543
+11668 11540 11539
+12035 12034 12178
+11674 11736 11617
+11734 11789 11790
+12180 12112 12111
+12889 12992 12993
+11792 11910 11793
+13087 13088 12995
+13195 13301 13302
+12988 12885 12884
+14758 14363 14362
+12891 12705 12890
+13463 13390 13283
+14175 14369 14176
+13634 13460 13279
+14475 14374 14474
+13395 13288 13394
+13552 13739 13648
+12998 13090 12999
+13554 13476 13475
+14177 14178 14007
+13000 13092 13001
+13188 13096 13295
+12893 12892 12998
+14009 14096 14097
+14564 14469 14563
+14573 14381 14572
+15150 15346 15249
+15143 15142 15339
+15643 15644 15541
+14766 14668 14667
+16114 16113 16218
+15637 15534 15533
+15524 15726 15525
+15038 14947 14946
+15730 15530 15729
+14772 14570 14771
+14565 14566 14473
+15320 15417 15321
+15723 15722 15922
+14932 15129 15032
+15129 15128 15324
+15328 15327 15423
+15523 15524 15422
+15522 15421 15420
+15427 15332 15331
+15522 15523 15421
+15733 15638 15732
+16860 16694 16496
+16503 16607 16504
+15634 15729 15530
+16305 16214 16110
+15519 15323 15322
+17126 17191 17031
+16408 16305 16498
+16705 16611 16704
+16506 16505 16610
+16703 16866 16704
+16116 16115 16219
+16504 16608 16609
+16609 16703 16610
+15642 15641 15739
+15736 15735 15836
+16312 16311 16505
+16867 16951 16868
+16800 16869 16870
+16123 16222 16316
+16708 16707 16801
+15253 15156 15252
+16874 16711 16873
+15755 15754 15949
+16515 16712 16618
+16329 16328 16422
+15647 15547 15646
+16321 16320 16415
+15750 15550 15549
+15941 15743 15842
+15151 15347 15348
+15843 15844 15747
+14864 14781 14863
+14577 14676 14578
+14948 14776 14775
+15041 15148 15149
+14776 14574 14775
+14863 14954 14864
+14677 14780 14678
+14281 14280 14392
+14956 14955 15152
+15648 15649 15548
+15044 15045 14959
+15154 14958 15153
+15250 15251 15154
+14580 14581 14480
+14487 14392 14486
+14961 14962 14789
+14791 14964 14792
+14198 14108 14107
+14587 14683 14588
+13846 13670 13845
+13849 14036 13850
+15558 15952 15953
+14969 15163 14970
+15360 15164 15359
+15953 15758 15559
+16322 16418 16323
+15949 16129 16130
+16132 16324 16325
+15352 15252 15351
+16417 16322 16321
+16415 16516 16517
+16714 16620 16713
+15950 16131 16132
+17045 16879 17044
+16530 16141 16331
+15759 15560 15758
+12823 12822 12923
+12741 12742 12534
+12534 12632 12741
+14980 14808 14807
+12345 12438 12534
+13120 13319 13121
+12342 12341 12434
+13019 13125 13126
+13119 12918 12917
+10351 10295 10260
+10293 10380 10381
+11226 11285 11227
+12117 12116 12188
+9077 9078 8993
+11096 11095 11152
+12531 12630 12738
+11290 11156 11289
+11354 11285 11284
+11916 11857 11915
+11153 11031 11096
+11288 11228 11287
+11679 11680 11624
+11422 11356 11421
+9281 9407 9282
+10896 10831 10895
+10594 10549 10548
+11492 11421 11420
+10598 10597 10687
+11919 12054 11920
+12053 12197 12054
+11915 11857 11914
+12262 12345 12189
+12635 12634 12745
+12263 12192 12347
+14041 13927 14040
+12347 12348 12263
+13330 13331 13220
+12641 12640 12748
+12830 12755 12829
+12748 12749 12642
+12267 12199 12266
+12053 11918 12052
+12752 12751 12931
+12198 12266 12199
+11926 11925 11988
+11498 11435 11568
+11802 11928 11803
+13224 13135 13223
+13340 12939 13339
+12201 12128 12127
+11806 11742 11805
+11628 11629 11567
+11805 11742 11691
+11932 12211 12212
+11436 11298 11359
+10771 10772 10695
+11566 11496 11495
+10763 10692 10691
+10165 10214 10166
+11568 11629 11691
+11807 11862 11931
+9358 9420 9421
+10389 10390 10203
+10353 10397 10354
+10394 10489 10300
+9686 9764 9687
+10691 10608 10690
+9004 9089 9194
+10120 10210 10162
+9481 9416 9480
+9751 9796 9722
+9089 9193 9194
+10091 9998 10044
+9415 9416 9353
+10036 10037 9838
+9542 9543 9484
+9609 9537 9536
+9195 9194 9301
+9994 10041 9936
+9189 9238 9239
+9537 9414 9413
+8802 8801 8860
+9609 9536 9673
+9287 9288 9239
+8411 8504 8505
+9243 9134 9242
+7634 7782 7635
+8153 8245 8154
+8618 8507 8617
+8801 8717 8716
+8716 8613 8612
+9354 9416 9417
+9088 9136 9192
+8415 8620 8416
+8916 9016 8917
+9194 9300 9301
+10167 10125 10124
+9013 9095 9096
+9216 9215 9319
+7941 7940 8056
+7945 7800 7799
+8155 8156 8047
+6854 6905 6855
+8095 8050 8049
+8195 8095 8158
+7262 7263 6990
+7575 7574 7708
+6078 6208 6131
+6081 6009 6136
+6760 6991 6761
+5371 5419 5496
+6077 6207 6208
+6496 6497 6356
+6209 6133 6132
+5953 6009 6081
+6075 6206 6076
+6989 7261 7262
+7519 7788 7520
+8047 8048 7788
+7519 7520 7262
+7788 7933 7789
+6988 6989 6759
+6983 7114 7115
+6350 6349 6491
+6195 6346 6196
+6128 6129 6069
+6126 6125 6199
+6000 6001 5938
+4936 5092 5221
+6348 6198 6197
+6477 6341 6340
+6851 6792 6744
+6562 6563 6490
+6901 6849 6848
+6344 6343 6417
+6481 6739 6482
+6488 6625 6626
+7704 7781 7633
+7044 6981 6980
+7381 7382 7255
+8239 8148 8238
+7931 8149 8044
+7785 7786 7517
+8993 8903 8952
+9081 9131 9132
+7779 7702 7701
+8793 8904 8794
+8546 8610 8547
+7436 7505 7371
+8790 9037 8749
+9129 9183 9184
+9282 9233 9281
+9670 9608 9669
+7505 7436 7504
+7244 7243 7372
+8324 8445 8540
+7503 7504 7435
+7506 7505 7570
+7505 7504 7568
+8036 8140 8090
+7370 7436 7371
+7443 7444 7376
+5928 5704 5703
+7110 6974 7109
+8605 8490 8604
+6973 6847 6741
+4933 5090 5091
+6733 6475 6183
+6280 6339 6281
+6618 6735 6619
+7369 7315 7368
+5138 5077 5201
+5140 5139 5205
+4473 4472 4541
+5350 5211 5349
+5345 5205 5344
+5476 5477 5349
+4869 4870 4803
+5479 5702 5480
+4800 4801 4661
+4662 4543 4661
+4741 4668 4740
+4286 4285 4349
+5602 5650 5603
+4939 4940 4809
+3860 3861 3783
+4411 4349 4410
+4475 4407 4406
+4542 4541 4605
+4477 4410 4409
+4072 4006 3945
+4349 4285 4348
+4669 4668 4741
+4011 4076 4077
+4477 4478 4411
+4012 4078 3950
+4944 5097 5019
+2904 2969 2970
+2453 2435 2415
+2696 2714 2662
+3728 3681 3774
+1895 1958 1896
+3946 3945 4006
+3849 3772 3848
+4475 4406 4474
+4346 4407 4408
+3948 3895 3894
+4660 4605 4604
+2713 2695 2712
+3944 4071 3945
+4213 4212 4284
+3946 3851 3850
+4005 3942 3941
+2765 2766 2715
+1741 1674 1673
+2203 2168 2202
+2662 2714 2715
+2272 2271 2333
+1897 2011 1898
+2114 2166 2167
+1750 1628 1749
+1615 1674 1550
+1741 1740 1809
+2592 2591 2662
+1414 1496 1497
+716 675 715
+357 350 319
+474 439 438
+551 563 521
+1622 1499 1498
+1071 912 911
+1288 1225 1287
+1548 1489 1488
+906 992 907
+1813 1747 1892
+959 995 996
+493 528 448
+443 442 489
+653 678 615
+380 417 381
+384 422 448
+719 679 718
+766 714 829
+615 571 570
+717 678 677
+767 677 676
+1300 1168 1299
+1296 1295 1354
+1750 1751 1628
+1422 1298 1421
+1069 995 1068
+832 770 769
+3728 3682 3681
+2840 2808 2868
+2899 2833 2768
+2456 2455 2539
+2333 2332 2387
+2665 2664 2767
+2118 2207 2119
+1170 1171 1125
+2015 2119 2120
+2339 2279 2309
+211 194 193
+422 421 433
+2015 1755 2014
+1073 1303 1074
+914 1000 960
+875 876 838
+100 99 122
+264 263 294
+1151 1115 1114
+89 97 98
+98 99 89
+78 77 104
+90 99 91
+267 225 266
+131 153 154
+225 212 199
+133 167 134
+451 387 450
+1305 1075 1304
+75 74 103
+269 268 329
+332 392 333
+142 141 176
+173 172 230
+214 200 213
+964 965 921
+723 722 783
+780 806 781
+847 927 882
+1010 1040 1081
+844 845 780
+684 683 775
+1564 1631 1632
+2017 2122 2069
+2277 2276 2337
+2676 2637 2675
+2018 2124 2125
+2211 2019 2125
+1899 1756 2016
+2340 2459 2341
+1011 1173 1082
+2569 2568 2598
+2553 2552 2607
+2546 2547 2505
+3283 3284 3249
+2916 2941 2917
+2905 2928 2906
+3777 3731 3776
+2972 2929 2971
+3146 3147 3096
+2634 2633 2674
+2911 2938 2912
+2544 2504 2503
+2506 2549 2550
+2414 2452 2453
+3142 3052 2967
+2541 2540 2595
+2901 2864 2835
+2767 2899 2768
+3059 3146 3096
+2744 2745 2719
+2902 2866 2865
+2724 2673 2672
+2905 2868 2904
+3784 3783 3862
+3187 3186 3439
+4078 4077 4119
+4413 4553 4414
+5284 5363 5285
+5229 5228 5365
+5418 5494 5495
+4415 4673 4416
+5098 4945 5019
+3789 3863 3864
+5097 5230 5231
+3243 3324 3244
+3004 3005 2971
+4087 4174 4175
+4427 4426 4682
+2976 2937 2936
+3438 3437 3493
+3494 3530 3438
+5718 5499 5717
+5497 5498 5234
+7992 7991 8054
+7794 7861 7940
+6635 6636 6502
+6993 6861 6763
+6084 6220 5955
+4682 4681 4948
+5954 6082 6083
+6568 6503 6636
+6364 6427 6365
+6291 6362 6363
+7541 7400 7399
+8425 8508 8426
+7121 7122 7049
+6432 6375 6374
+6692 6766 6693
+7816 7664 7663
+5960 6225 6226
+6221 6085 6220
+6220 6084 6219
+7272 7191 7124
+6865 6799 6771
+3634 3596 3692
+3980 3874 3873
+6699 6646 6645
+5249 4962 5248
+3331 3252 3330
+3191 3159 3249
+3596 3537 3499
+2350 2466 2467
+3246 3282 3247
+2849 2919 2850
+3632 3631 3690
+3593 3688 3689
+4426 4176 4297
+2943 2917 2942
+2639 2677 2640
+2942 2917 2941
+2679 2727 2680
+2644 2645 2607
+2848 2874 2875
+2645 2644 2679
+2913 2914 2781
+1901 1902 1763
+1013 1014 972
+1311 1312 1085
+887 851 850
+691 654 690
+499 498 543
+932 889 888
+887 886 930
+539 459 458
+233 234 176
+139 138 173
+172 229 230
+82 108 109
+179 144 178
+30 55 40
+234 276 235
+66 67 58
+143 177 178
+179 178 236
+460 494 461
+465 464 500
+181 205 189
+110 124 111
+238 204 237
+241 240 254
+146 145 155
+397 396 461
+496 542 513
+733 697 696
+603 581 580
+1522 1641 1523
+945 865 864
+815 788 814
+1314 1087 1313
+1644 1645 1565
+1085 1086 1018
+2348 2285 2284
+2727 2781 2680
+2353 2428 2291
+1314 1522 1315
+2467 2466 2556
+2556 2466 2555
+2357 2313 2356
+1041 1091 1042
+4484 4485 4436
+1019 1090 1041
+799 798 864
+1320 1357 1321
+792 859 793
+1527 1427 1426
+2174 2131 2223
+936 937 859
+794 737 754
+632 697 633
+1023 974 1022
+129 145 146
+279 280 252
+207 215 216
+426 402 425
+698 708 699
+939 938 973
+208 207 216
+236 178 235
+1044 1024 1023
+1128 1091 1090
+586 557 585
+634 657 699
+1044 1023 1094
+1180 1237 1181
+241 254 257
+4314 4313 4448
+639 588 638
+799 758 757
+2482 2472 2481
+2136 2034 2135
+1776 1777 1685
+2176 2224 2225
+2031 1960 2030
+2136 2177 2178
+1913 1775 1822
+4019 4092 4020
+5242 4954 5241
+3332 3254 3253
+3695 3598 3694
+4970 5020 5021
+5292 5291 5375
+6537 6438 6389
+6535 6596 6536
+6526 6381 6380
+5967 5968 5839
+6932 6879 6878
+3799 3874 3875
+5720 5721 5502
+5253 4966 4965
+4823 4703 4968
+4445 4446 4309
+4022 4023 3975
+3869 3908 3972
+4955 4688 4687
+5511 5512 5249
+6865 6771 6798
+6374 6518 6519
+6923 6922 7009
+6227 6228 5962
+6529 6530 6383
+6377 6378 6231
+6660 6592 6659
+7127 7193 7128
+8072 8071 8104
+7952 7995 7871
+6375 6521 6433
+7459 7407 7458
+7402 7401 7450
+7669 7670 7594
+6780 6781 6708
+6593 6662 6706
+7883 7882 7967
+8731 8757 8732
+6663 6707 6708
+6235 6384 6236
+7206 7207 7065
+7023 7153 7068
+7412 7338 7411
+7339 7413 7298
+7213 7067 7152
+7454 7455 7405
+8367 8347 8366
+8173 8198 8199
+7966 7881 7880
+8556 8516 8555
+8367 8433 8434
+7472 7415 7414
+8368 8349 8435
+9366 9326 9450
+9454 9588 9637
+10989 10988 11326
+11114 11198 10987
+9710 9711 9637
+10147 10243 10148
+9634 9584 9583
+9779 9704 9579
+9368 9367 9452
+9109 9220 9110
+9327 9366 9328
+8554 8516 8515
+9221 9111 9110
+8728 8729 8671
+10513 10561 10632
+9970 9872 9775
+9318 9319 9215
+9148 9218 9106
+8822 8925 8865
+9105 9147 9217
+8263 8427 8343
+8513 8429 8451
+8199 8269 8270
+8293 8266 8344
+8075 8106 8173
+7736 7735 7821
+8175 8200 8201
+8269 8346 8270
+8198 8172 8267
+8175 8201 8202
+8100 8068 8167
+8072 8105 8073
+7963 7879 7878
+7276 7194 7193
+7999 8069 7958
+7539 7448 7396
+9437 9361 9436
+8924 8923 9021
+8754 8825 8755
+8165 8066 8065
+7713 7799 7800
+8163 8063 8062
+7713 7648 7647
+8631 8632 8551
+8260 8062 8061
+7004 7128 7129
+8062 7949 8061
+8811 8810 9008
+7801 7715 7800
+7947 8060 8061
+7951 7952 7870
+8417 8418 8254
+9196 9090 9006
+7944 8058 8059
+8256 8420 8257
+8623 8418 8622
+8919 8963 8964
+9009 9010 8812
+9848 9900 9901
+9203 9250 9251
+9250 9203 9202
+9807 9765 9764
+9429 9304 9428
+10169 10218 10128
+9560 9766 9688
+9562 9309 9433
+9963 9962 10064
+9867 9774 9866
+9437 9436 9494
+9308 9206 9205
+9968 9969 9871
+9695 9728 9773
+9774 9867 9697
+9497 9440 9439
+10322 10323 10231
+10140 10069 10068
+10781 10782 10624
+10097 10064 10063
+10009 9957 10059
+9961 9906 9960
+10134 10135 10096
+10229 10320 10411
+9908 9963 9863
+10269 10319 10227
+9955 9903 9854
+10172 10225 10226
+10170 10223 10224
+10266 10315 10316
+10453 10452 10501
+9852 9952 9853
+10358 10315 10406
+10619 10618 10774
+11109 11181 11182
+13346 13225 13345
+11453 11589 11454
+11577 11578 11502
+10612 10613 10498
+11306 11305 11365
+10500 10554 10501
+13873 13874 13700
+12760 12944 12831
+13344 13516 13517
+15875 15874 15998
+13348 13347 13521
+12452 12561 12453
+14436 14435 14519
+11592 11511 11510
+12833 12764 12832
+13352 13709 13710
+11048 10984 10983
+10621 10622 10505
+12076 11996 11995
+11057 11058 10927
+11586 11509 11508
+14073 14442 14443
+11317 11186 11316
+11707 11708 11590
+14067 13707 13706
+15008 15075 15009
+13585 13720 13586
+13358 13715 13359
+12576 12382 12381
+12957 12572 12956
+12283 12382 12237
+13357 12955 12954
+11239 11315 11240
+12370 12452 12371
+12230 12136 12135
+11755 11756 11711
+11315 11453 11454
+12227 12226 12570
+10931 11189 10932
+11314 11453 11315
+11188 11321 11189
+10790 10932 10791
+10632 10706 10633
+10236 10071 10235
+10420 10635 10636
+10631 10559 10630
+12083 11999 12082
+11832 11758 11831
+11190 11191 10933
+12233 12232 12279
+11723 11602 11722
+10649 10648 10948
+10520 10564 10565
+11241 11326 10988
+10272 10248 10331
+10082 9982 9981
+12001 11878 11965
+11514 11469 11372
+12454 12579 12655
+11068 11201 11202
+13032 13155 13156
+11758 11719 11718
+11963 12088 11964
+12085 12086 11961
+12090 12239 12142
+11196 11324 11197
+13030 13152 13153
+13031 13154 13155
+13155 13154 13233
+13031 12961 12960
+16446 16580 16819
+11325 11241 11197
+20548 20549 20136
+19290 19177 19176
+19926 19586 19799
+18611 18989 18895
+19802 19929 19803
+18186 18333 18334
+24320 23934 24165
+18897 19167 18898
+18344 18437 18205
+19273 18979 19148
+18716 18876 18877
+20108 20430 19916
+18977 19272 19148
+20428 20241 20427
+18978 18977 19148
+19772 19771 20104
+19272 19445 19148
+20431 19917 20109
+19793 20125 20126
+18598 18597 18880
+18726 18896 18612
+21233 21064 21349
+22953 22952 23119
+19777 19778 19447
+18989 19164 19165
+22083 22304 22305
+22074 21800 21877
+21549 21243 21242
+19472 19473 19288
+19287 19172 18901
+19289 19175 19174
+19178 18905 18904
+20139 20459 20140
+20460 20461 20141
+21561 21260 21560
+19949 19818 19599
+19486 19600 19487
+21360 21359 21570
+21879 21878 22086
+20557 20556 20723
+19816 19948 19817
+21259 21079 20795
+20142 19937 19809
+20999 21358 21266
+19945 19946 19814
+20151 20262 20152
+22987 23024 22988
+19932 20138 19933
+21882 22095 22096
+22093 22318 22167
+22168 22095 22319
+22310 22570 22311
+19474 19589 19475
+22309 22161 22160
+20793 20989 21074
+23421 23385 23193
+19791 19584 19790
+22549 22302 22301
+21878 22161 22086
+23527 23757 23758
+22548 22549 22301
+22063 22158 22301
+21533 21639 21796
+21534 21533 21796
+20130 19800 19926
+19803 19930 19931
+20982 21068 20983
+19162 18985 19281
+18714 18417 18595
+18972 18868 18710
+19568 19756 19905
+19576 19433 19432
+19770 20426 19771
+18973 18869 19143
+19441 19771 19442
+20103 19769 19768
+21222 21223 20953
+20106 20699 20107
+21227 21226 21526
+19771 19441 19770
+23746 23745 23825
+19913 20102 19768
+24141 23743 24140
+20959 21228 20699
+26228 26229 26010
+22947 23111 23112
+20949 20950 20692
+20422 20951 20952
+20422 20952 20423
+21788 21225 21524
+22523 22722 22723
+24532 24299 24753
+23103 23104 22935
+23097 23015 22931
+22045 21779 21778
+24130 24535 24301
+23716 23717 23490
+24750 24528 25008
+22036 22522 22523
+23325 23412 23174
+23499 23725 23500
+23101 22933 23100
+22524 22724 22933
+23103 23102 23176
+23112 23182 23342
+19749 19565 19564
+20094 20095 19906
+19574 19761 19431
+20093 19904 20092
+18857 18699 18963
+18967 18861 18966
+18583 18858 18859
+20414 20084 20681
+16568 16915 16760
+18570 18405 18569
+17249 17307 17418
+16567 16568 16370
+17097 17251 17252
+16976 17096 16977
+17421 17309 17420
+17637 17570 17569
+18325 18587 18588
+17467 17420 17466
+17756 17822 17930
+18864 18863 18968
+19431 19260 19430
+15201 15068 15268
+17824 17764 17938
+16923 16980 17100
+17763 17575 17429
+16247 16184 16183
+17931 17757 17756
+16771 16381 16380
+16920 16818 16817
+15269 15389 15270
+15805 15597 15804
+15391 15392 15274
+15807 15806 16008
+15673 15811 15812
+13359 13715 13716
+15269 15204 15072
+13773 13947 13882
+14072 13711 14071
+15802 15596 15383
+12569 12225 12568
+14831 15002 15003
+14826 14635 14825
+16001 15798 15593
+16249 16186 16248
+16001 16063 16002
+16377 16378 16249
+15389 15269 15388
+13701 13702 13581
+13699 13343 13698
+14825 14634 14633
+15067 15000 14999
+13706 13879 14066
+13582 13520 13519
+13944 14065 13878
+13344 13422 13345
+13939 13940 13872
+13770 13875 13876
+17745 17410 17409
+15193 15067 15192
+15382 15381 15589
+13938 14058 14059
+15997 16062 16178
+17242 17301 17243
+17093 17092 17248
+16061 15995 16060
+16178 16245 16369
+15586 15587 15460
+16177 16062 15996
+14231 14307 14232
+14621 14622 14515
+16061 16177 15996
+15795 15794 15874
+15583 15582 15665
+15665 15780 15781
+15860 15980 15981
+18406 18571 18407
+16551 16744 16552
+15665 15778 15779
+15982 16047 16048
+14986 14987 14875
+14506 14617 14507
+14220 14120 14119
+14615 14698 14699
+14615 14699 14616
+13866 13768 13691
+14509 14618 14510
+13342 13698 13343
+14220 14121 14120
+13937 13867 13936
+14048 13861 14047
+14817 14700 14816
+13861 13862 13687
+12644 12546 12752
+14044 13934 13933
+13328 13219 13218
+13688 13576 13687
+13420 13510 13511
+13502 13571 13503
+13854 13762 13761
+13326 13327 13130
+14410 14496 14607
+14493 14405 14492
+13327 13218 13131
+13498 13567 13499
+12629 12733 12734
+13853 13760 13678
+13849 13850 13756
+13759 13677 13676
+15956 15848 15847
+13925 13924 14038
+14797 14972 14973
+15169 15450 15451
+14491 14600 14601
+15962 15856 15855
+15171 15256 15367
+15570 15571 15453
+17053 17054 16724
+15961 15854 15960
+16885 16722 16884
+15770 15769 15967
+16884 16883 17051
+16155 16156 15974
+17215 17052 17051
+16806 16734 16733
+15579 15977 15978
+14601 14600 14805
+16348 16236 16347
+16628 16629 16542
+14412 14413 14298
+14211 14112 14111
+16959 17062 16960
+15174 15577 15578
+16350 16349 16548
+16962 16896 16961
+17727 17728 17550
+18302 18301 18403
+17399 17232 17555
+18556 18839 18688
+21625 21753 21488
+18083 18548 18084
+20914 21186 20915
+20653 20387 20652
+20052 20385 20386
+16535 16339 16338
+16894 16893 16958
+17054 17055 16725
+15567 15450 15566
+18550 18291 18549
+17386 17456 17387
+19710 19711 19399
+17626 17725 17726
+17392 17730 17551
+17391 17221 17220
+17387 17287 17386
+21622 21477 21476
+20643 20775 20644
+21178 21327 21179
+17216 17546 17386
+21175 21324 21042
+22700 22493 22253
+20775 20776 20644
+22253 22254 22004
+20909 21179 21180
+22704 22496 22495
+21481 21746 21482
+20383 20912 20650
+22261 22149 22260
+22009 21745 22008
+20918 20919 20654
+20656 20780 20657
+22259 22359 22360
+21624 21487 21623
+22702 22701 22912
+22366 22264 22504
+22506 22507 22267
+23313 22922 22921
+19115 19252 18958
+22508 22507 22711
+23710 23709 23824
+24114 24517 24288
+18095 18170 18096
+20061 20394 20395
+18559 18401 18558
+18841 18840 18955
+18301 18300 18402
+18847 19116 19407
+17135 17066 17065
+18172 18171 18305
+17290 17225 17224
+17059 17060 16892
+17075 17140 17141
+17140 17074 17073
+18572 18573 18314
+19739 19738 19894
+19738 19419 19737
+17915 18102 17916
+21202 20935 21201
+17743 18108 18109
+17086 16909 17085
+18573 18696 18851
+18851 18697 18573
+20079 19895 20078
+18854 18578 18577
+17245 17246 17147
+20675 20408 20535
+21203 21505 21334
+18570 18693 18694
+21195 21196 21048
+19734 19733 20070
+21199 21500 21200
+20671 20404 20403
+18309 18308 18566
+18849 18693 18848
+19728 19119 19409
+21201 21502 21332
+20930 21049 21197
+23178 23179 23105
+23327 23101 23500
+24533 24755 24637
+23174 23326 23100
+24528 24527 25008
+26661 26611 26537
+24535 24758 24759
+23728 23915 24128
+25252 25345 25253
+25134 25015 25014
+25251 25250 25342
+25505 25008 25007
+25748 25747 25993
+25507 25747 25748
+25255 25348 25512
+25993 26206 25994
+25132 25005 25004
+26437 26198 26279
+23489 23488 23716
+25247 25132 25246
+25508 25507 25748
+26201 26202 25989
+23824 23904 23905
+25822 25729 25821
+25231 25341 25493
+25235 25495 25236
+25630 25333 25332
+24505 24506 24282
+25632 25633 25336
+24733 24839 24840
+24990 24991 24842
+24633 24734 24634
+24117 23985 23984
+22713 22788 22714
+23095 23494 23321
+22515 22718 22613
+24120 23912 24119
+22520 22284 22033
+23911 23720 23494
+22925 22926 22719
+23984 23909 23983
+23095 23094 23320
+23718 23566 23717
+23721 23321 23720
+22709 22504 22503
+24993 24738 24992
+23708 23709 23564
+24987 24837 24836
+23712 23312 23311
+24735 24634 24734
+24721 24625 24827
+22697 22604 22696
+23898 23899 23705
+23170 23085 23169
+22915 22705 22914
+24282 24506 24106
+23892 23976 24100
+21735 21618 21734
+23298 23081 23297
+22698 22490 22697
+24269 24093 24268
+22694 22782 22603
+24207 24206 24276
+23693 23694 23472
+24367 24277 24366
+24826 24719 24718
+23813 23887 23814
+25106 24979 24826
+24101 24277 24278
+27562 27830 27831
+25106 25216 24979
+25107 24827 24979
+31191 30690 31190
+25715 25957 25958
+25820 25819 25967
+24370 24280 24279
+23893 24100 24101
+25484 25485 25330
+25817 25726 25725
+24632 24732 24733
+25727 25819 25728
+25968 26074 25969
+25730 25822 25823
+25820 25728 25819
+25967 26072 25820
+27177 27319 27402
+27176 27318 27401
+27174 27201 27175
+26421 26422 26258
+27836 27837 27568
+26259 26258 26422
+25968 25969 25822
+27840 27571 27839
+25965 25966 25816
+25211 25210 25320
+26765 26409 26408
+26416 26585 26254
+26164 25952 26409
+28115 27829 28114
+25482 25328 25327
+29133 28775 28774
+27570 27309 27569
+28118 28119 27833
+31170 31803 31804
+28115 28114 28433
+29443 29129 29128
+29699 29447 29446
+31183 31184 30687
+28433 28774 28434
+30692 31193 31194
+30690 30371 31189
+30109 29907 29906
+28437 28119 28118
+31204 31837 31205
+27565 27566 27305
+29139 28781 28780
+27057 27308 27058
+29707 29455 29454
+29137 28779 28778
+31235 31234 31868
+31880 31879 31878
+31874 31875 31241
+31878 31882 31880
+31863 31861 31860
+30405 31257 30725
+31861 31862 31228
+30129 29926 30128
+31276 31910 31277
+31246 31879 31880
+30398 30119 30397
+31249 31881 31882
+30396 30397 30119
+31876 31875 31877
+29461 29460 29713
+27857 27585 27856
+28789 28448 28788
+26188 26090 26187
+26188 26268 26189
+26189 26092 26188
+26194 26275 26276
+24376 24524 24525
+25739 25499 25738
+26095 26194 26195
+26428 26267 26266
+26649 26784 26650
+26431 26522 26594
+26652 26601 26651
+26195 26096 25984
+26652 26529 26601
+26863 26949 26917
+26602 26529 26652
+25744 25745 25636
+26604 26441 26655
+27073 26912 26911
+26532 26606 26444
+26796 26661 26795
+27587 27328 27586
+29476 29475 29728
+27079 27330 27180
+28138 27858 27857
+26949 27076 26950
+28139 27858 28138
+30124 29922 29921
+31272 31271 31905
+30410 30729 31267
+29474 29159 29473
+29928 29723 29927
+31912 31911 31907
+29482 29734 29735
+30748 30428 31303
+31289 30741 30421
+30438 30140 30139
+27871 27872 27600
+31333 31334 30763
+31339 31972 31973
+30494 31435 30814
+31362 31361 31994
+32049 32050 31417
+30783 30464 30463
+31373 32006 31374
+32006 31373 32005
+31425 31424 32057
+29747 29493 29746
+31375 31376 30784
+29572 29601 29740
+31364 31996 31997
+31361 30777 30457
+30150 30458 30459
+30441 30761 30442
+31339 31338 31971
+27869 27868 28149
+29738 29485 29570
+27886 28166 28167
+30145 30448 30449
+29492 29745 29746
+25053 24569 25052
+28815 28474 28814
+28474 28473 28814
+27348 27347 27606
+22157 22158 22063
+29933 29932 30135
+30137 29934 30136
+30755 30754 31317
+30761 30760 31329
+28813 28472 28812
+29792 29736 29940
+30429 30135 30428
+30134 29932 29931
+30748 31304 31305
+28147 28148 27867
+29160 28801 29159
+26616 26800 26617
+27331 27080 27180
+25515 25350 25259
+26617 26801 26618
+26626 26463 26805
+26620 26457 26544
+26215 26214 26458
+26545 26546 26459
+26003 26109 25759
+25757 25520 25756
+25516 25517 25260
+24845 24757 24844
+25999 26100 25836
+25262 25263 25020
+25265 25138 25137
+25258 25015 25134
+23341 23111 23181
+24132 23920 23919
+25027 25026 25139
+24857 25034 25035
+24136 23737 23921
+25032 24772 25031
+22955 23348 23121
+23925 24143 24144
+28822 28481 28821
+24550 24141 24310
+27348 27097 27347
+23578 23746 23747
+24651 24555 24781
+24649 24553 24648
+27349 27607 27608
+25274 25273 25356
+25365 25279 25364
+24313 24210 24145
+24312 24311 24551
+26467 26466 26807
+25273 25272 25530
+26470 26809 26810
+25535 25536 25363
+25144 25279 25034
+26490 26491 26034
+25557 26035 25558
+27107 26824 27106
+24149 24150 23930
+22301 22064 22063
+27349 27350 27099
+19789 20121 19790
+23132 22966 23131
+23529 23361 23528
+23767 23766 23935
+29971 29981 29982
+24319 24573 24574
+29967 29767 29766
+22749 22577 22576
+23781 23583 23534
+23536 23585 23422
+23420 23583 23584
+23783 23832 23945
+23383 23140 23382
+24171 24580 24172
+26038 26495 26039
+24168 24167 24321
+26632 26500 26840
+28839 28499 28498
+25070 25147 25148
+26048 26115 26049
+24589 24654 24590
+27182 27202 27203
+24328 23939 23938
+27705 27653 27652
+25563 25060 25562
+27405 27377 27376
+27990 27905 27923
+27371 27120 27370
+28567 28630 28316
+27632 27703 27633
+26868 26841 26840
+25568 25065 25567
+27620 27891 27892
+27620 27621 27362
+27106 26823 27105
+27359 27360 27109
+29575 29752 29576
+29189 29506 29190
+27620 27892 27621
+26032 26489 26033
+28174 28493 28175
+27368 27627 27369
+28828 28488 28487
+31428 31427 32060
+31411 30802 30801
+30155 30470 30156
+30802 30483 30482
+29758 29506 29505
+31413 30483 30802
+32052 31419 32051
+32017 32016 32018
+32065 31432 31431
+30789 31387 30790
+30795 31399 30796
+31431 32064 32065
+29981 29970 29996
+29585 29762 29763
+30496 30815 31439
+30165 30490 30166
+31431 32063 32064
+30503 30823 30504
+29339 29242 29311
+27906 27732 27731
+30823 30822 31452
+27924 27635 27705
+29818 29614 29791
+30018 30006 29993
+29613 29805 29790
+29790 29805 29980
+29994 30006 30019
+29980 29805 29993
+29612 29550 29599
+29778 29789 29816
+29816 29993 29805
+28906 29017 29250
+29318 29249 29016
+29347 29550 29319
+28208 28321 28209
+29551 29348 29600
+30507 30508 30188
+29600 29789 29778
+29993 29816 30018
+29350 29349 29614
+29790 29817 29791
+29980 30006 29994
+29980 29993 30006
+31465 31466 30836
+30019 29995 29994
+29995 30020 29818
+30848 31481 30849
+30520 30201 30849
+30853 30852 31485
+30846 30845 31478
+30196 30018 30515
+30199 30200 30021
+30518 30846 30200
+30847 30846 31479
+30847 30200 30846
+30841 30516 30197
+30849 31481 31482
+30848 30847 31480
+31507 31508 30875
+31495 31492 31498
+30527 30864 30209
+31496 31495 31497
+30211 30529 30868
+29625 29361 29624
+30220 30538 30886
+31504 31502 31506
+30875 30874 31507
+31508 31507 31510
+30539 30887 30888
+30888 31520 31521
+30221 30888 30889
+31519 30886 31518
+30887 31520 30888
+31523 31526 31524
+29626 29362 29625
+30537 30218 30883
+30879 31511 31512
+30878 30877 31510
+30221 30539 30888
+30221 30031 30539
+30026 30212 30027
+30872 31505 30873
+29624 29623 29827
+30217 30880 30881
+30884 30219 30537
+29829 29626 29625
+29824 30026 29825
+30214 30874 30875
+28688 28687 29029
+29827 29623 29826
+30208 30862 30863
+30865 31497 31498
+30861 31493 31494
+30863 30864 30527
+30864 30865 30209
+30211 30868 30869
+30204 30203 30522
+29021 29353 29022
+30524 30858 30206
+29617 29353 29616
+30831 30830 31460
+30189 30508 30829
+30178 30188 30508
+30829 31458 31459
+30015 29991 29990
+30190 30509 30831
+30832 31462 30833
+30835 31465 30836
+30838 31468 30839
+28329 28328 28683
+29821 29822 29618
+28688 28333 28687
+29026 28685 28684
+30513 30836 30837
+28025 27746 28024
+29024 29023 29355
+28025 28327 28328
+29023 29354 29355
+28027 28329 28330
+29027 29358 29359
+27149 26970 26969
+27637 27660 27741
+27452 27637 27479
+29788 29813 29988
+29991 29979 29990
+29988 29977 30003
+28676 28571 28321
+30013 30179 30003
+27452 27660 27637
+29247 29315 29316
+27451 27478 27660
+29607 29608 29594
+29594 29546 29593
+29608 29595 29594
+29811 29976 29803
+29596 29610 29597
+29611 29598 29610
+27660 27452 27451
+30002 30001 30012
+30011 30010 30175
+30508 30507 30827
+30505 30506 30187
+30186 30187 30176
+30178 30177 30188
+29017 28973 29249
+29525 29346 29318
+28318 28207 28206
+28675 28319 28570
+28209 28210 28019
+28845 28673 28631
+27925 28187 28013
+27733 27706 27654
+27657 27658 27473
+27736 27658 27928
+28015 28188 28206
+28204 28273 28205
+27656 27655 27706
+27654 27706 27655
+29593 29606 29607
+27212 27211 27475
+28319 28017 28016
+27208 26962 26961
+27187 27145 26960
+27738 27476 27475
+27658 27735 27927
+26875 26874 26959
+27407 27450 27470
+27143 26959 27142
+27145 27207 27146
+27473 27210 27209
+26673 26315 26314
+27145 27187 27207
+27379 27206 27406
+27449 27450 27407
+26960 26672 26671
+26964 26963 27210
+27208 26961 27146
+27212 26965 27211
+26322 25860 26321
+26678 26677 26966
+27474 27211 27210
+29314 29315 29246
+26678 26321 26320
+26123 26318 26124
+26673 26672 26961
+26968 27147 27215
+26679 26322 26321
+26316 26674 26675
+25859 26321 25860
+25855 25658 25854
+26122 26317 26239
+25385 25386 24879
+26962 26673 26961
+26847 26872 26848
+26849 26873 26932
+26933 26959 26874
+25150 25151 25074
+26872 26873 26849
+23150 23210 23211
+24221 24222 23999
+25294 25375 25295
+25292 25151 25150
+25294 25374 25375
+24866 24791 24790
+24793 24868 24869
+24591 24389 24388
+24591 24655 24592
+24655 24789 24656
+24183 24334 24217
+24219 24336 24186
+23949 23948 23996
+24217 24334 24218
+23949 23996 24185
+24185 24184 24218
+23995 24183 24184
+24334 24388 24335
+24336 24220 24186
+24390 24592 24593
+24337 24593 24391
+24658 24792 24868
+24396 24003 24002
+24000 23999 24393
+24394 24393 24870
+24394 24000 24393
+24395 24001 24394
+22811 22634 22633
+22333 22407 22408
+25387 24880 25386
+24882 25389 24883
+22181 22397 22182
+25292 25293 25151
+25152 25294 25295
+24870 24871 24394
+25373 25574 25374
+25376 25576 25656
+26319 25858 25857
+25866 26129 26130
+25395 25577 25155
+25578 25579 25156
+25868 26054 26130
+25777 25868 25778
+25391 25863 25392
+26129 26242 26130
+26053 26128 26129
+25395 25155 24888
+26322 26323 25861
+25863 26325 26125
+25296 25157 25156
+25870 26135 25871
+23789 23616 23842
+23840 24023 24188
+24223 24596 24416
+26979 26886 26978
+25403 25874 25404
+24342 24341 24418
+25666 25581 25665
+26135 26136 25871
+25876 25875 26340
+26336 26136 26135
+26134 26133 26245
+26562 26690 26691
+26334 26132 26244
+26332 26331 26561
+26564 26336 26335
+26246 26056 26134
+26563 26691 26564
+26135 26056 26246
+26331 26510 26561
+26689 26688 26978
+26979 26691 26690
+26334 26133 26132
+26982 27229 27230
+26692 26337 26336
+26852 26883 26853
+26940 26976 27157
+26636 26884 26637
+25297 25158 24890
+26558 26638 26688
+26973 26937 27132
+26680 26322 26679
+26556 26508 26507
+26240 26127 26126
+27661 27742 27709
+26553 26850 26683
+26556 26507 26555
+26241 26329 26242
+27133 26973 27132
+27156 27224 27157
+26972 26934 26971
+26968 26680 26679
+26681 26324 26323
+26879 26682 26936
+27188 27218 27189
+27412 27216 27380
+26970 26876 26969
+26877 26970 27130
+26878 26682 26877
+27664 27639 27453
+28326 28023 28325
+27415 27482 27665
+26983 27231 26984
+26980 26691 26979
+27157 27225 26977
+27226 26979 26978
+27486 27750 27487
+27226 27488 27227
+28338 28339 28036
+30898 30226 30544
+27492 27756 27493
+28694 29036 28695
+27759 28037 28038
+26985 26986 26697
+29036 29035 29367
+28341 28695 28696
+29367 29366 29630
+29369 29038 29037
+28038 28037 28340
+29037 28695 29036
+30245 30563 30936
+29377 29045 29376
+28044 28346 28347
+29837 29634 29633
+28044 28043 28346
+28344 28699 28345
+29042 29043 28701
+29043 29044 28702
+27499 27498 27762
+29371 29039 29370
+26698 26342 26697
+28040 28342 28343
+28041 27762 28040
+28697 28342 28696
+27244 27243 27505
+27504 27767 27768
+26987 27234 27235
+28039 28038 28341
+25880 25881 25410
+27237 27236 27498
+27757 27493 27756
+26693 26694 26338
+26699 26698 26987
+27759 28038 27760
+27497 27760 27761
+27496 27759 27760
+27755 28034 27756
+29033 28691 29032
+28032 28334 28335
+28031 28333 28334
+27756 27492 27755
+26983 26984 26695
+25669 25873 25874
+26694 26693 26982
+27494 27758 27495
+25406 25877 25407
+26697 26986 26698
+27494 27493 27757
+25667 25872 25873
+26693 26981 26982
+25298 25400 25583
+25872 26136 26337
+25401 25583 25668
+25161 25301 25078
+24025 23951 24024
+24418 24341 24666
+25403 25402 25669
+24667 24419 24342
+24189 24227 24228
+24898 24420 24897
+24897 24419 24667
+24228 24227 24342
+22764 22654 22653
+25879 25878 26343
+24899 24900 24422
+23053 22846 22845
+24900 24901 24423
+23242 22847 23053
+24901 24902 24424
+23242 23053 23241
+24903 24426 24425
+24904 25411 25412
+26348 25883 26347
+24427 24426 24904
+26352 25887 26351
+24906 24905 25413
+26988 26989 26700
+25880 26345 25881
+25413 25884 25414
+24904 24426 24903
+26990 26989 27237
+26700 26699 26988
+26703 26702 26991
+25882 25881 26346
+26352 26351 26707
+26350 26349 26705
+26709 26708 26997
+26353 26354 25889
+23852 23853 23642
+25892 25421 25891
+24913 24912 25420
+26359 25894 26358
+23055 23056 23003
+23958 24048 23959
+24193 24235 24048
+23641 23640 23851
+25423 25894 25424
+25670 25165 25164
+24440 24234 24439
+25425 25164 24917
+24441 24344 24343
+24343 24236 24235
+26137 25896 26361
+25424 24917 24916
+26138 25898 25897
+26565 26362 26138
+27454 27423 27422
+26565 26138 26137
+25897 25672 25671
+26057 26138 26139
+26137 26361 26565
+26717 26565 26361
+27420 27256 27517
+26887 26718 26566
+26138 26247 26139
+27667 27421 27420
+26567 26641 26889
+27005 27006 26717
+27006 26887 26717
+27258 27159 27136
+26719 26718 26888
+27249 27511 27250
+27253 27514 27515
+27003 27002 27250
+26355 25890 26354
+27002 27003 26714
+27251 27512 27513
+27000 27001 26712
+27002 26714 26713
+27244 26997 26996
+26708 26707 26996
+26998 26710 26709
+26711 26355 26710
+27509 27773 27510
+26999 26711 26710
+27247 27509 27248
+27249 27250 27002
+27773 27774 27510
+27775 27512 27511
+27770 28049 27771
+28708 29050 28709
+28352 28351 28706
+28705 28706 28351
+27507 27245 27506
+27506 27769 27770
+29382 29051 29050
+28353 28352 28707
+28356 28054 28053
+28051 27772 28050
+29646 29647 29383
+29385 29386 29054
+27776 27775 28054
+30986 31618 31619
+29851 29852 29648
+28054 28055 27776
+27776 27777 27513
+28715 28714 29056
+27256 27158 27255
+29062 29393 29394
+29057 28715 29056
+27517 27780 27781
+28719 28718 29060
+29651 29855 29652
+29651 29650 29854
+29056 29387 29388
+30270 30055 30269
+29853 30055 29854
+30054 30267 30268
+30591 30273 30057
+30280 30279 30598
+29652 29388 29651
+31004 30279 30597
+30281 31008 31009
+29857 29653 29856
+30274 30057 30273
+31006 31007 30280
+30599 31008 30281
+30589 30271 30056
+30984 30587 30983
+30264 30974 30975
+30982 30983 30268
+30985 30588 30269
+30585 30054 30266
+30970 31603 30971
+30977 31610 30978
+30978 31610 31611
+30586 30268 30267
+30971 30972 30581
+31604 31605 30972
+30254 30954 30955
+29047 29048 28706
+30968 31601 30969
+30957 31590 30958
+29047 28706 28705
+30963 31596 30964
+30260 30967 30579
+30265 30584 30266
+29851 30053 29852
+30049 30575 30257
+30050 29849 29848
+30581 30263 30052
+30974 31606 31607
+29044 29043 29375
+29844 29845 29641
+29639 29376 29375
+29844 30046 29845
+30250 30947 30569
+29632 29368 29631
+29367 29035 29366
+30041 29840 29839
+28042 28344 28345
+29631 29367 29630
+29630 29833 29834
+29832 29628 29831
+29364 29627 29628
+29365 29629 29366
+30899 30898 31531
+30545 30226 30899
+29833 30035 29834
+30903 30902 31535
+30035 30228 30547
+29629 29832 29833
+30541 30032 30222
+30892 31524 31525
+30891 30222 30890
+30544 30226 30225
+30901 30902 30546
+30550 30231 30909
+30903 30228 30902
+29843 30045 29844
+30247 30044 30565
+29838 29634 29837
+29633 29370 29369
+29839 29838 30040
+30919 30918 31551
+30566 30247 30941
+31576 31577 30944
+29639 29640 29376
+29639 29843 29640
+30245 30936 30937
+30246 30939 30565
+30565 30939 30940
+30939 31571 31572
+30937 30936 31569
+30248 30942 30943
+30928 30559 30927
+30242 30930 30931
+31563 30930 31562
+30557 30239 30040
+30561 30932 30243
+30937 31570 30938
+30911 30232 30910
+30908 30231 30549
+30900 30545 30899
+30545 30034 30226
+30903 30904 30547
+30548 30230 30229
+30227 30545 30900
+30900 31533 30901
+30557 30238 30923
+31553 30921 30920
+30926 30240 30558
+30558 30240 30239
+30929 30928 31561
+31537 31540 31539
+31541 31540 31542
+30902 31534 31535
+31543 31544 30911
+31518 31517 31515
+31525 30893 30892
+31521 31520 31523
+30556 30238 30237
+31550 31552 31551
+31549 31544 31552
+30888 31521 30889
+30923 31555 31556
+30926 31559 30927
+30560 30241 30929
+31556 30924 30923
+30934 31567 30935
+31570 31569 31571
+31562 30930 30929
+30242 30560 30930
+30241 30559 30928
+30945 31577 31578
+30947 31579 31580
+31574 31571 31579
+30948 31580 31581
+31576 31574 31579
+30255 30956 30957
+30955 30573 30254
+30953 31585 31586
+30947 31580 30948
+30954 31586 31587
+31588 31587 31589
+30943 30944 30567
+30568 30250 30249
+30569 30947 30948
+30250 30568 30946
+30251 30948 30949
+31579 30946 31578
+31605 31606 30973
+30264 30583 30053
+30964 31596 31597
+30984 31617 30985
+31603 31605 31604
+30266 30584 30978
+31596 31595 31597
+30981 30980 31613
+31605 31607 31606
+30976 30583 30975
+30270 30986 30987
+30588 30985 30986
+31635 31003 31002
+30597 30279 30060
+30986 31619 30987
+30989 30590 30271
+31621 30988 31620
+30274 30593 30058
+30273 30992 30993
+30991 31624 30992
+31608 31610 31609
+30267 30585 30980
+30983 31615 31616
+30983 31616 30984
+31614 31610 31615
+31630 31629 31631
+30997 31630 30998
+31627 31626 31628
+31647 31015 31014
+31642 31010 31009
+30282 31011 30601
+30603 30284 31015
+31643 31010 31642
+31008 31641 31009
+29392 29655 29656
+31017 31650 31018
+31645 31012 31644
+30285 31017 30604
+31023 31656 31024
+31031 31663 31664
+31667 31035 31034
+31036 31668 31669
+31054 31686 31687
+31042 31041 31674
+30625 31060 31061
+31648 31016 31015
+31018 31019 30286
+31657 31658 31025
+31659 31660 31027
+31044 31043 31676
+30620 30301 31049
+31675 31676 31043
+31685 31680 31686
+30299 30617 31044
+31045 30299 31044
+30070 30617 30299
+31050 31683 31051
+29559 29558 29664
+31042 31674 31675
+30300 30299 30618
+30298 31043 30617
+31030 31662 31663
+31666 31667 31034
+30609 31028 30291
+31661 31662 31029
+30298 30616 31043
+31674 31677 31675
+31016 30603 31015
+31016 31017 30285
+29656 29655 29859
+30599 31007 31008
+30602 31014 31015
+29656 29657 29393
+30286 30604 31018
+30287 30605 31020
+30290 31026 31027
+29324 29400 29325
+30294 30612 31034
+29864 29863 30065
+29397 29660 29661
+28364 28363 28718
+29391 29392 29060
+29062 29394 29063
+28907 28908 28722
+28846 28908 28909
+29396 29659 29660
+28723 28847 28635
+29064 28908 28907
+28852 28851 28912
+28852 28727 28726
+28854 28913 29068
+28856 28729 28728
+28639 28727 28640
+28852 29067 28913
+29069 29208 29209
+28859 28730 28916
+28858 28974 28916
+28584 28377 28376
+28731 28861 28649
+28651 28587 28586
+29074 28918 28975
+29075 29076 28919
+29073 29074 28975
+28918 28732 28975
+29325 29259 29205
+28854 28855 28728
+29258 29325 29205
+29207 28914 29068
+29556 29555 29662
+30069 30615 30297
+29262 29263 29073
+29403 29529 29530
+28920 28977 28978
+29410 29267 29564
+28923 28863 28862
+29269 29080 29268
+28513 28512 28591
+28922 29079 28923
+28976 29077 28977
+28920 28921 28589
+29666 29869 29870
+29266 29267 29078
+28918 28733 28732
+28289 28290 28229
+28736 28862 28863
+28983 28982 29085
+27909 27942 27796
+28592 28737 28515
+27797 27798 27679
+28981 28925 28980
+28738 28865 28866
+28594 28867 28739
+28926 28867 28981
+28927 28869 28926
+28925 28866 28865
+28740 28654 28869
+28868 28926 28869
+28983 28929 28928
+28870 28930 28742
+27536 27275 27535
+28871 28931 28932
+28983 28984 28929
+28932 28988 29088
+28986 29086 29214
+29219 29278 29279
+29418 29674 29566
+28747 28658 28935
+28985 29086 28986
+29088 28988 29216
+29087 29215 29216
+29275 29214 29274
+29413 29669 29670
+29672 29671 29875
+28989 28934 28875
+29876 29673 29672
+29092 29091 29220
+29275 29274 29413
+29278 29415 29416
+29874 29670 29873
+31077 30633 31076
+29872 30074 29873
+31067 30310 30628
+29412 29668 29669
+29081 28923 29080
+29328 29275 29414
+29668 29872 29669
+29668 29411 29667
+30302 30071 30301
+30305 31056 31057
+29407 29534 29535
+29869 30071 29870
+30300 30619 30071
+31046 30618 31045
+30072 30303 30304
+31052 31684 31685
+31053 30621 31052
+31680 31678 31674
+30622 31053 31054
+30619 31048 30301
+31678 31045 31677
+30072 30302 30621
+30302 30620 31051
+31683 31682 31685
+31668 31667 31663
+30623 30304 31055
+31691 31690 31692
+31057 31690 31058
+31687 31686 31690
+31071 30312 30630
+30075 30309 30310
+31062 30626 31061
+31696 31697 31064
+31066 30628 31065
+29673 29417 29672
+30631 31073 30313
+30634 31078 31079
+30314 31075 30633
+31697 31698 31065
+31079 31711 31712
+29675 29878 29879
+31072 31071 31704
+31720 31087 31719
+31746 31742 31735
+31101 31102 30646
+31099 31732 31100
+31730 31097 31729
+31729 31731 31730
+31733 31100 31732
+31714 31715 31082
+31084 31717 31085
+30635 30317 30079
+29094 29282 29283
+30320 30319 30638
+31104 31737 31105
+30332 30651 30087
+31086 31087 30638
+31721 31722 31089
+31722 31090 31089
+30642 31093 31094
+30649 31108 31109
+30648 31107 30330
+31108 31740 31741
+31108 31107 31740
+30333 30087 30651
+30653 30335 30088
+30334 31115 30653
+30652 30334 30333
+30335 30654 30336
+30336 31119 30655
+31123 30657 30338
+31103 31736 31104
+31739 31740 31107
+31735 31742 31737
+31110 31743 31111
+31699 31698 31701
+31750 31749 31748
+31115 31116 30653
+31748 31749 31116
+31128 31761 31129
+31139 31138 31771
+31124 31756 31757
+31140 31139 31773
+30661 31132 31133
+31130 31763 31764
+31134 31133 31766
+31132 31765 31766
+31141 30665 31140
+31147 31780 31781
+31781 31778 31786
+31777 31778 31144
+31146 31780 31147
+31787 31786 31789
+31765 31763 31770
+31155 31788 31789
+31131 31132 30661
+31159 31792 31793
+31139 31771 31772
+30099 30675 30357
+31157 31790 31791
+31162 31796 31163
+30350 31147 30669
+30350 30095 30668
+30355 30674 30098
+31157 31156 31790
+30673 31155 31156
+30673 30354 31155
+31160 31794 31161
+29897 30100 29898
+31161 31794 31795
+28429 28428 28769
+30359 30100 30358
+26905 26947 26906
+30677 30359 30358
+31167 31800 31801
+31151 31152 30671
+28764 29123 28765
+30350 30669 30096
+31153 31786 31787
+30671 30097 30352
+29688 29687 29892
+30662 30343 31133
+29888 30090 29889
+30342 31131 30661
+30344 30662 31135
+30087 29886 29885
+28892 28891 28958
+29236 29297 29298
+29887 29886 30088
+29113 29301 29237
+29113 29112 29301
+29338 29569 29430
+29237 29301 29302
+29338 29337 29429
+29121 29436 29122
+29688 29892 29893
+29688 29689 29436
+29438 29690 29691
+29694 29898 29899
+30680 30361 31169
+29441 29442 29127
+30101 30100 30360
+28312 28311 28421
+29434 29686 29687
+29689 29690 29437
+29693 29897 29898
+28964 29010 29119
+28964 29119 28965
+29690 29895 29691
+28429 28770 28430
+29126 29441 29127
+29128 28770 28769
+28426 28767 28427
+29125 29440 29126
+28664 28622 28759
+28962 28758 28757
+28104 28103 28199
+28898 28965 28966
+29115 28961 29114
+29237 29006 29113
+28892 29004 28959
+29115 29114 29239
+28960 28893 29006
+29005 29004 29113
+29004 29112 29113
+29003 29236 29110
+29299 29337 29338
+29005 28959 29004
+28957 28888 29110
+29234 29296 29235
+28941 29097 28994
+28950 29001 28951
+29231 29293 29332
+29420 29329 29566
+29677 29422 29676
+29291 28946 29101
+29234 29235 29108
+29232 29231 29294
+29428 29568 29681
+29428 29298 29335
+29235 29296 29333
+29105 28949 29000
+29233 29296 29234
+29424 29567 29332
+29426 29568 29427
+29288 29421 29289
+30327 30645 31101
+29291 29290 29422
+29289 29230 29100
+29882 29883 29679
+29330 29293 29292
+28937 29093 29282
+30079 29878 29877
+29419 29329 29284
+30080 29879 29878
+31093 31725 31726
+29220 29416 29280
+29877 29674 29673
+29673 29674 29418
+29284 29222 29418
+28938 28877 28876
+28600 28535 28534
+28941 28940 28993
+29099 29098 29227
+28994 29097 29225
+29229 29099 29228
+28748 28937 28876
+29224 29223 29284
+28878 28877 28938
+28541 28540 28603
+28611 28612 28551
+28543 28544 28404
+29099 28943 28996
+28538 28402 28401
+28879 28751 28750
+28402 28539 28540
+28539 28538 28602
+28250 28404 28405
+28249 28089 28088
+28085 28086 27955
+28089 28090 27959
+28091 27999 27998
+28404 28249 28403
+27962 28092 27963
+28251 28405 28406
+28404 28544 28405
+29103 29102 29293
+28545 28546 28405
+28947 28946 29102
+28552 28413 28412
+28093 28094 27964
+28412 28258 28257
+27964 27810 27809
+28255 28095 28094
+27036 27037 26749
+28414 28301 28300
+28002 28003 27969
+28260 28302 28303
+28301 28414 28302
+28260 28303 28304
+28415 28302 28414
+28415 28414 28556
+28557 28618 28558
+28753 28959 28893
+28412 28256 28411
+28261 28304 28305
+28303 28415 28304
+28953 29108 28954
+28891 28890 28958
+28554 28555 28414
+28415 28558 28304
+28894 28960 29114
+28561 28562 28417
+29010 28963 29117
+28306 28560 28417
+28895 28962 28757
+28261 28305 28306
+28418 28562 28563
+27976 28008 28009
+28263 28262 28308
+28307 28308 28262
+28760 28896 28897
+28564 28621 28622
+28963 28962 29009
+28624 28421 28623
+28420 28265 28419
+28625 28626 28423
+28267 28199 28312
+28763 29122 28764
+27818 27914 27915
+28765 29123 29124
+28768 29126 29127
+27977 27978 27915
+27914 27818 27817
+27916 27979 27821
+29123 29437 29438
+28200 28105 28009
+27721 27683 27720
+27819 27978 27916
+27978 27977 28105
+27685 27645 27821
+27980 27685 27821
+27718 27817 27719
+27720 27683 27644
+27821 27820 27916
+28262 28100 28099
+27977 27915 27914
+27974 28103 28008
+28104 28200 28009
+27974 27973 28102
+28103 28104 28008
+28263 28264 28101
+28198 28266 28199
+27969 28003 28004
+28098 28261 28099
+28103 27974 28102
+27971 28006 28007
+27646 27554 27459
+27554 27646 27686
+27293 27292 27393
+27167 27197 27042
+27551 27550 27643
+26946 26905 26904
+26906 26858 26905
+26947 26946 27043
+28767 28768 28427
+27298 27299 27048
+27823 28109 27824
+25947 26404 26405
+28428 28768 28769
+27564 27303 27563
+24814 24709 24708
+27046 27296 27297
+26584 26402 26163
+25943 26067 26161
+26401 26584 26163
+26582 26647 26756
+25203 24967 24707
+25202 24966 25098
+25945 25946 25466
+23685 23805 23806
+25946 25467 25466
+24815 24711 24710
+25206 24971 24819
+24708 24618 24707
+24707 24618 24489
+23808 23877 23687
+24708 24707 24967
+24706 24487 24705
+25602 25807 25703
+26068 26162 25944
+25318 25463 25464
+25465 25704 25203
+25464 25463 25601
+25806 25943 25702
+27813 27969 27970
+25098 24965 25201
+26578 26518 26397
+26580 26579 26646
+26578 26397 26396
+26754 26580 26646
+26518 26398 26397
+26901 26857 26753
+26646 26579 26578
+26901 26902 26857
+26943 26901 26900
+26903 26857 26902
+26754 26646 26857
+26904 26755 26647
+27137 26945 27041
+26751 26395 26750
+27166 27137 27041
+26903 26902 26945
+27643 27550 27549
+27550 27457 27549
+26900 26753 26752
+27040 27288 27289
+27391 27457 27432
+27809 27810 27543
+28095 28257 28096
+27808 27542 27541
+28087 28088 27957
+27548 27814 27815
+27971 28007 27972
+27539 27278 27538
+27280 27540 27541
+27805 27538 27537
+27808 27961 27962
+27805 27806 27538
+27958 28089 27959
+27030 27029 27279
+26384 26155 25924
+26746 27033 27034
+27544 27543 27810
+27283 27284 27035
+25458 25937 25938
+25934 26390 25935
+26748 27036 26749
+25926 26155 26385
+25788 25921 25922
+26388 26744 26389
+26746 26391 26390
+26380 26577 26149
+25445 25679 25587
+26381 26577 26737
+26381 26149 26577
+26251 26379 26517
+26517 26379 26575
+26250 26379 26251
+26516 26574 26575
+25782 25678 25913
+24934 24935 24457
+26378 26515 26516
+26378 26379 26250
+27161 27021 27020
+26516 26575 26379
+26643 26574 26573
+26643 26733 26734
+27271 27270 27390
+26572 26573 26516
+24936 24458 24935
+25908 25909 25439
+26894 26733 26732
+26895 26856 26733
+27270 27271 27162
+26942 26896 26895
+27426 27390 27270
+27020 27021 26893
+27428 27429 27271
+27162 27022 27021
+27674 27528 27673
+27674 27793 27716
+27677 27796 27797
+27269 27426 27270
+27677 27531 27530
+27531 27679 27532
+28395 28242 28241
+27164 27165 27023
+27390 27428 27271
+27165 27024 26898
+27271 27429 27163
+27533 27800 27801
+26898 26736 26735
+26734 26644 26643
+27272 27532 27533
+27277 27276 27537
+26384 26154 26383
+26151 26381 26382
+27802 27951 27952
+28085 28247 28086
+28079 27946 27945
+28526 28395 28525
+27803 27535 27802
+28084 28245 28085
+28240 28393 28394
+27797 27679 27678
+27950 27997 27951
+28657 28523 28656
+28399 28400 28246
+28088 28089 27958
+27952 27951 28083
+28297 28397 28298
+28534 28399 28533
+28530 28298 28397
+28995 28942 28994
+28536 28400 28535
+28934 28935 28746
+28396 28528 28296
+28934 28656 28745
+28394 28395 28241
+28297 28244 28296
+28082 28081 28241
+27943 27797 27796
+28653 28739 28869
+28930 28985 28931
+28862 28591 28735
+28384 28231 28383
+27941 27940 27995
+27995 27940 28073
+28738 28593 28865
+28233 28078 28077
+28193 28231 28194
+28078 27944 27943
+28078 28079 27945
+27910 27798 27797
+28235 28295 28236
+27948 27801 27800
+27799 27800 27532
+27801 27534 27533
+27530 27529 27676
+28229 28228 28288
+27945 27912 27911
+27912 27799 27798
+27940 27939 28073
+27790 27791 27525
+28069 27789 27788
+26142 26141 26365
+28283 28376 28284
+28375 28376 28282
+28377 28378 28224
+27790 28070 28071
+28284 28377 28224
+28072 27939 27792
+28647 28648 28585
+28378 28379 28226
+28586 28585 28649
+28915 28856 29069
+28647 28585 28584
+28379 28285 28226
+28372 28373 28219
+28578 28577 28635
+28645 28644 28729
+28583 28582 28643
+28374 28375 28221
+28583 28584 28376
+28576 28633 28634
+28639 28640 28581
+28572 28573 28367
+28574 28907 28722
+28277 28367 28506
+28506 28721 28574
+28364 28061 28363
+28060 28059 28362
+27933 27932 28062
+27713 27714 27669
+27782 28060 28061
+27993 28062 28063
+27421 27387 27420
+27640 27669 27714
+27640 27518 27668
+27786 27936 27937
+28579 28638 28580
+27522 27788 27523
+26722 26892 27011
+27257 27421 27196
+27672 27671 27785
+27672 27520 27671
+27259 27159 27258
+26889 26641 26719
+26721 26855 26891
+27010 27009 27136
+27786 27787 27521
+27160 26892 27010
+27933 28062 27993
+27670 27642 27641
+27642 27455 27519
+27423 27388 27422
+27455 27424 27389
+27264 27263 27524
+27672 27425 27520
+27423 27259 27388
+27522 27787 27788
+28224 28223 28284
+27013 26724 26723
+27523 27788 27789
+27425 27521 27261
+27016 27265 27266
+27013 27263 27014
+27523 27524 27263
+26727 26726 27016
+25904 25435 25434
+26727 27016 27017
+27015 27265 27016
+26727 27017 26728
+27266 27526 27267
+27262 27013 27012
+26372 26727 26728
+26722 26366 26570
+26720 26642 26568
+26367 25903 25902
+25430 25901 25431
+26142 26365 26570
+26249 26248 26364
+26721 26570 26569
+26570 26365 26569
+26142 26570 26366
+26721 26720 26855
+26365 26141 26249
+26364 26514 26249
+26141 26140 26249
+26058 26248 26140
+23446 23547 23644
+25428 25429 25303
+24237 24602 24443
+24671 24796 24672
+24923 25430 25431
+24447 24674 24448
+25167 25080 25303
+26248 25899 25781
+25903 25676 25432
+25170 24925 24674
+24924 25431 25432
+24448 24449 24240
+27015 27016 26726
+24924 25170 24674
+27018 26730 26729
+25436 24932 24931
+25436 24931 25174
+25436 25437 24932
+24925 24675 24674
+24676 24927 24677
+24926 24927 24797
+24801 24931 24680
+24603 24450 24449
+24606 24801 24680
+24449 24450 24241
+25172 24927 25081
+24933 24683 24932
+24058 23861 23860
+24680 24608 24607
+24453 24347 24452
+24195 24056 24055
+22869 22868 23260
+23797 23646 23854
+24050 24239 23856
+24922 25430 24923
+24055 24056 23857
+22775 22870 22871
+24053 24447 24054
+24237 24194 24049
+24444 24672 24673
+23960 24194 24050
+22443 22119 22343
+24049 24194 23960
+21948 21949 21834
+22594 22442 22441
+22863 23064 22864
+23648 24051 23649
+23651 23259 23650
+23649 24051 24052
+21693 21427 21952
+20327 20188 20326
+23257 22864 23256
+22865 22446 22671
+21687 21835 21688
+21950 22221 22222
+21834 21949 21687
+21688 21589 21687
+21835 21689 21688
+21835 22122 21950
+20189 19661 20003
+21952 22446 22447
+21692 21426 21691
+21296 21139 21426
+21693 21428 21427
+21297 21296 21427
+22869 23260 23261
+23962 24243 24244
+21298 21428 21299
+22672 22868 22869
+22867 22866 23258
+21304 21432 21433
+20871 21028 20872
+23010 23070 22874
+22455 22454 22598
+23009 23068 23069
+23400 23453 23454
+23861 23801 23860
+23265 23069 23163
+23452 23261 23451
+22868 22867 23259
+23451 23261 23260
+23453 23400 23262
+23652 23451 23260
+23550 23551 23453
+23162 23067 23066
+23453 23551 23454
+23859 23860 23800
+22873 22872 23009
+23068 23163 23069
+22455 22678 22456
+22455 22598 22677
+21601 21707 21602
+22777 22873 22874
+23164 23265 23403
+22777 22874 22677
+23071 23266 23458
+23268 22876 22875
+22878 23269 23270
+21439 21597 21598
+21438 21307 21437
+21440 21154 21439
+21597 21704 21705
+21603 21602 21843
+21707 21706 21962
+21599 21705 21706
+21843 21964 21844
+21961 22456 21962
+22681 22680 22878
+22230 21964 22229
+21843 21602 21707
+19376 19684 19377
+21844 21964 21965
+21605 21443 21604
+19381 19380 19687
+21964 22126 21965
+20881 21035 21036
+21965 21709 21844
+22231 22230 22458
+21968 22129 22130
+21714 21967 21715
+22681 22878 22879
+22679 22877 22878
+23269 23268 23660
+22879 22878 23072
+24064 24063 24196
+22599 22683 22684
+22234 22130 22129
+22462 22599 22684
+23661 23269 23660
+24252 24351 24352
+24071 24070 24468
+23966 24067 24068
+24255 24353 24465
+24934 24457 24456
+23663 23662 23803
+24352 24351 24462
+23270 23269 23661
+23864 24063 23865
+25439 24935 24934
+22875 23267 23268
+23071 22874 23070
+24061 24060 24457
+23659 23267 23458
+24459 24248 24458
+24060 24059 24457
+24459 24460 24349
+24062 23864 23661
+24197 24196 24252
+24063 24249 24250
+24460 24686 24610
+24803 24938 24804
+24689 24690 24613
+24460 24610 24461
+24688 24611 24687
+25441 25911 25442
+26145 26144 26250
+26145 26146 26061
+24937 24802 24685
+25178 25305 25179
+26060 26059 26145
+24461 24462 24351
+24687 24804 24805
+24254 24255 24067
+24610 24687 24463
+25179 25085 25178
+25306 25446 25588
+25085 25086 24941
+25684 25786 25589
+25448 25181 25683
+26380 26148 26251
+25920 25786 25684
+25923 25790 25922
+25307 25184 25452
+25792 25791 25923
+25787 25921 25788
+23967 24069 23870
+25921 26153 25922
+25922 25790 25789
+25786 25787 25685
+25686 25790 25687
+25684 25448 25683
+25449 25590 25591
+24946 24945 25185
+25687 25790 25791
+25187 24947 24946
+22778 22684 22683
+25184 25451 25594
+24947 24948 24471
+24469 24945 24946
+25087 25088 24950
+24947 25188 25189
+24077 24258 24259
+25190 25191 24949
+24471 24693 24472
+24614 24356 24474
+24952 24473 24694
+25088 25089 24950
+25089 24951 24950
+24473 24354 24258
+25093 25094 24953
+24697 24696 24808
+25187 25186 25311
+24946 25185 25186
+25800 25928 25801
+26386 26385 26741
+24948 25190 24949
+25696 25597 25695
+25932 26158 26388
+25934 25935 25699
+26748 26747 27035
+25093 25314 25094
+25454 25195 25194
+25314 25453 25315
+25697 25933 25934
+26391 25936 25935
+25939 25940 25460
+26159 25941 25700
+24704 24964 24812
+24816 24817 24711
+24820 24971 24972
+23471 23470 23687
+23808 23876 23877
+23467 23290 23466
+23292 23471 23293
+23468 23683 23559
+23558 23682 23683
+25096 25317 24703
+23078 23167 23079
+23466 23556 23467
+22244 22243 22481
+22243 22242 22481
+24083 24082 24480
+24478 24957 24479
+24481 24480 24959
+25457 24958 25456
+24081 23678 23677
+23675 23676 23283
+25196 25455 25197
+25196 25197 24956
+24701 24957 24478
+25196 24955 25195
+25314 25193 25094
+24954 25195 24955
+23676 23677 23285
+24260 24199 24259
+24809 24699 24698
+24261 24356 24475
+23289 23077 23288
+24082 24479 24480
+22687 22895 22896
+23288 23287 23679
+24083 24481 24084
+24483 24617 24484
+23874 23873 24084
+23681 23680 23874
+22480 22241 22352
+24085 24086 23969
+22136 21987 22242
+21170 21171 21041
+21466 21732 21467
+21172 21322 21467
+21988 21730 21729
+21988 22243 22244
+21732 21989 21990
+21322 21172 21041
+18285 18284 18392
+21172 21173 20899
+20376 20641 20522
+20038 20217 20039
+20216 20370 20371
+22601 22132 22239
+19699 20036 19390
+19700 20038 19701
+20371 20518 20372
+21984 21985 21849
+20369 20370 20216
+20368 20369 20215
+23286 23287 22895
+22478 22601 22239
+24083 23873 23679
+20891 21455 21456
+20517 20516 20633
+21728 21849 21617
+23679 24082 24083
+22893 23285 22894
+20032 20363 20033
+20208 20207 20358
+21165 21453 20888
+21974 22467 21975
+20360 20889 20361
+21976 22468 22469
+23670 23278 23669
+21975 21976 21454
+22888 22887 23279
+21976 22469 21977
+21979 21980 21458
+22888 22470 22469
+21978 21977 22470
+24078 24079 23674
+22893 23284 23285
+22470 22471 21978
+22894 22475 22893
+23279 23670 23671
+24693 24949 24950
+24470 24073 24469
+24074 23671 24073
+23278 22887 22886
+22887 22888 22469
+22467 22886 22468
+22466 22467 21974
+23666 23869 23870
+23871 23667 23464
+23462 23461 23554
+24692 24466 24256
+23666 23665 23869
+24691 24465 24613
+21973 22466 21974
+23012 22881 23074
+23405 23273 23462
+23074 23073 23165
+23273 23166 23074
+21721 21848 21722
+22351 22235 22234
+22685 22600 22779
+22237 22464 22465
+22466 22885 22467
+21971 22237 21972
+21451 21452 21316
+21970 21969 22236
+21715 21610 21714
+21161 21313 21314
+21613 21721 21722
+20770 20886 20887
+20360 20359 20629
+20627 20771 20515
+20888 20629 20628
+20629 20359 20628
+19871 19872 19691
+20512 20624 20513
+20026 20208 20359
+20626 20514 20625
+20515 20771 20628
+20206 20023 20205
+20355 20022 20354
+18257 18381 18258
+20205 20022 20355
+19686 19687 19380
+20022 20023 19688
+19690 19535 19534
+18064 18065 17885
+18948 19092 19243
+17883 18063 17884
+18674 18673 18816
+18065 18158 18275
+18063 17883 18062
+18065 18275 18066
+18529 18271 18388
+18677 18531 18530
+20516 20632 20633
+19536 19691 19692
+19694 19541 19540
+19537 19536 19692
+20030 20029 20362
+19697 19874 19698
+19873 20030 19696
+20033 20363 20364
+20031 19874 19697
+20633 20632 20894
+18948 19243 19093
+20212 20035 20211
+19543 19388 19542
+21459 20894 21458
+18825 18538 19097
+18070 17892 17891
+19097 19096 19700
+19095 19094 19245
+18537 19096 18538
+19544 19704 19705
+19701 19391 19097
+19702 20039 20040
+19098 19392 19099
+19392 19702 19703
+18393 18682 18544
+19393 19545 19246
+17715 17896 17716
+19246 19247 19100
+17373 17372 17535
+18828 18949 18542
+18161 18284 18285
+18539 18281 18072
+18391 18543 18392
+18073 18074 17714
+17972 17896 17895
+17971 18075 18076
+17537 17713 17714
+18163 18162 18285
+17972 18077 18078
+18285 18162 18161
+17891 17890 18069
+18068 18160 18069
+17710 17892 17893
+17891 18069 18280
+18071 17893 18070
+17451 17530 17531
+17890 18068 18069
+18535 18534 18821
+17802 17707 17801
+18066 18275 18276
+17889 17888 18067
+18532 18275 18390
+17801 17706 17889
+17890 17889 18068
+17617 17528 17707
+17200 17201 17039
+18072 17712 17711
+16956 17043 16876
+17620 17709 17710
+17533 17372 17371
+17534 17535 17372
+17712 17713 17535
+17538 17715 17716
+17895 17971 18077
+17972 17973 17896
+17716 17896 17805
+17623 17622 17717
+17622 17538 17716
+17537 17536 17713
+17535 17713 17536
+18391 18542 18543
+17715 17714 17894
+17715 17538 17376
+17534 17372 17533
+17375 17374 17537
+17715 17376 17714
+17046 16717 16716
+17623 17717 17540
+17376 17538 17377
+17377 17378 17286
+17128 17203 17284
+17205 17206 17043
+16716 16521 16879
+17047 17211 17048
+17128 17284 17204
+16713 16876 16714
+17368 17530 17451
+17452 17532 17371
+17203 17202 17368
+17531 17452 17451
+17529 17528 17617
+17036 16953 16952
+17367 17201 17283
+17202 17040 17039
+17041 16955 17040
+16872 17039 16873
+16872 16709 16871
+16614 16511 16510
+16952 16951 17036
+17359 17192 17358
+16708 16801 16871
+16513 16514 16318
+17613 17698 17614
+18264 18265 18155
+17127 17035 17195
+17193 17359 17360
+17526 17365 17364
+17038 17039 16872
+17705 17800 17888
+17886 17969 17887
+17887 17888 17800
+17970 18067 17888
+17803 17802 17890
+17706 17888 17889
+17886 17887 17800
+17970 17888 17887
+17881 17700 17699
+17524 17523 17702
+18272 18063 18271
+17449 17523 17524
+17880 17699 17698
+17616 17521 17520
+18156 18267 18157
+17519 17614 17520
+18267 18523 18386
+18269 18270 18062
+18518 18811 19087
+19242 19091 19090
+18520 18519 18812
+18946 18812 19089
+18267 18268 18157
+17697 17612 17696
+18260 18516 18261
+19383 19689 19534
+18520 18262 18519
+18262 18054 18519
+18521 18383 18382
+17514 17350 17513
+17519 17358 17447
+18050 18257 17873
+18052 18053 17692
+18052 17692 17691
+17351 17026 17025
+17510 17509 17609
+17689 17796 17797
+17514 17690 17875
+18051 17873 18257
+17796 17872 17873
+18510 18049 18509
+17610 17609 17688
+17444 17445 17348
+17688 17609 17608
+17511 17445 17444
+17871 17872 17794
+17607 17508 17606
+17604 17605 17507
+17507 17508 17345
+17686 17606 17605
+17687 17608 17607
+18040 18154 18041
+17013 17339 17014
+18506 18045 18505
+18043 17678 18042
+17680 17681 17340
+16854 16855 16684
+18047 18507 18508
+19378 19083 19377
+18802 18803 18659
+19679 19076 19075
+19679 20347 20348
+18044 17680 17679
+19071 18801 18500
+19237 19528 19370
+20346 19678 20020
+19075 18504 19074
+20349 19681 20348
+21710 21606 21605
+19083 19084 18809
+20353 19686 20021
+18381 18380 18513
+19686 19380 19379
+18379 18512 18513
+18664 18809 18514
+18051 18258 18259
+18381 18514 18258
+19085 18810 19084
+18514 18381 18513
+18052 18259 18260
+18514 18809 18515
+19532 19531 19685
+19681 19079 19078
+20874 20875 20347
+19078 18509 18508
+20883 20768 20767
+20353 20354 19687
+20872 20765 20871
+20874 21153 21154
+20346 20347 19678
+20618 20873 20874
+20021 20620 20353
+20622 20354 20353
+20352 19684 20351
+21607 21444 21606
+20878 20351 20877
+21706 21600 21440
+21031 21152 21307
+21307 21152 21306
+21436 21151 21150
+20875 20876 20348
+21156 21443 21444
+20866 21025 20759
+21029 21305 21152
+21030 21029 21152
+20617 20618 20346
+21031 21030 21152
+21031 20874 20873
+21596 21699 21700
+19530 19677 19372
+21595 21596 21434
+20617 20872 20873
+21149 21435 21150
+20870 21027 20871
+20865 21024 20866
+20342 20204 20018
+19370 19528 19675
+20763 20869 21026
+20615 20762 20869
+21148 21433 21434
+20020 19678 19373
+19679 20348 19680
+19367 19235 19071
+20203 20202 20341
+19676 19867 20017
+20203 20342 20018
+18251 18250 18376
+18035 18034 18150
+18374 18247 18373
+18036 17963 17865
+18246 18495 18373
+18797 18798 18496
+18498 18497 18656
+18496 18655 18497
+18805 18804 19073
+19864 19526 19671
+19237 19369 19528
+20864 20758 20610
+19672 19864 20013
+19671 19863 20011
+20017 20016 20203
+20201 20013 20338
+20010 20335 20336
+21144 21022 21143
+19070 19069 19366
+21298 21141 21297
+18943 18798 18942
+18798 18797 18942
+20006 20005 20192
+21140 21139 21296
+21021 21022 20861
+19069 19666 19366
+20333 20198 20332
+20335 20506 20336
+20190 20328 20329
+19363 19521 19364
+19066 18941 18940
+18793 18491 18792
+19066 19234 19067
+18794 18793 18941
+18490 18236 18489
+17953 17852 17851
+18653 18652 18791
+18244 18372 18494
+18794 18941 19067
+18034 18244 18245
+18243 18371 18372
+18236 18026 18145
+18145 18235 18236
+18033 17961 17960
+18244 18034 18033
+18146 18026 18236
+18025 18235 18145
+17595 17594 17665
+17954 18024 18144
+18237 18146 18236
+17785 17854 17955
+17331 17330 17504
+17598 17599 17497
+18028 18146 18237
+18026 18027 17956
+18147 18029 17957
+17856 17668 17667
+17962 18034 18035
+18151 18246 18247
+18250 18249 18376
+18152 18038 18249
+18502 18253 18501
+17678 17677 18042
+17867 17964 18039
+17859 17671 17670
+18240 18492 18371
+17860 17960 17861
+18149 18243 18244
+17673 17787 17788
+17961 18034 17962
+17505 17674 17675
+17865 17963 17866
+17963 18038 17866
+18039 18040 17867
+17335 17677 17336
+17868 18040 18041
+17786 17672 17860
+17789 17865 17675
+17866 17676 17675
+17867 17868 17676
+17671 17503 17603
+18029 17857 17957
+17857 17669 17668
+17496 17437 17324
+17501 17500 17602
+17500 17669 17602
+17667 17668 17599
+17601 17500 17499
+17324 17323 17496
+17781 17663 17780
+17438 17326 17325
+17119 17120 16998
+16993 16994 16829
+17324 17166 17323
+17590 17661 17662
+17663 17591 17492
+18024 18023 18143
+17850 17952 17851
+17666 17596 17595
+17494 17493 17592
+17597 17496 17596
+17495 17494 17594
+18144 18025 17954
+19657 19658 19517
+20002 20188 20003
+19518 19519 19362
+20322 20321 20604
+19999 19658 19854
+19356 19357 19061
+19656 19657 19517
+19064 19232 19362
+19518 19517 19659
+19515 19514 19653
+18789 18938 18790
+19651 19846 19847
+21132 21289 21133
+19231 19232 19064
+18486 18485 18787
+19845 19846 19650
+19515 19356 19355
+17848 18020 17949
+19848 19651 19847
+19352 19353 19059
+19060 18786 18484
+17848 17849 17778
+18022 18021 18142
+18485 18786 18787
+18487 18231 18368
+17658 17659 17487
+17953 18023 18024
+17589 17661 17491
+17265 17264 17319
+17161 17265 17320
+17320 17319 17434
+16654 16986 16987
+15887 16075 15888
+17845 18018 18019
+18479 18226 18139
+17848 17661 17660
+17318 17319 17264
+17657 17844 18017
+17655 17482 17654
+16652 16651 16984
+16451 16257 16256
+17655 17656 17483
+17485 17316 17484
+17314 17262 17261
+16073 16259 16074
+16982 16821 16927
+16649 16582 16581
+17586 17587 17479
+17777 17842 17654
+17652 17776 17653
+17948 17842 17841
+17842 17777 17841
+17777 17588 17653
+17588 17777 17654
+17653 17776 17777
+18930 18780 18649
+18228 18016 18141
+18779 18139 18013
+18140 18227 18015
+18227 18141 18015
+18366 18228 18141
+18221 18222 18010
+14712 14889 14838
+17946 17840 17839
+17775 17651 17650
+18011 17946 17839
+18931 18780 18930
+18781 18481 18480
+18781 18782 18481
+18229 17844 18016
+18937 19055 19056
+17848 17949 17849
+19989 19844 19228
+19651 19848 19652
+19651 19650 19846
+19352 19059 19230
+18362 18471 18645
+16252 16389 16253
+18777 18648 18647
+19645 19348 19347
+18359 18224 18223
+18761 18641 18760
+18469 18470 18225
+17649 17839 17650
+18470 18360 18225
+18361 18362 18225
+18224 18012 18223
+18009 18221 18010
+18357 18222 18467
+18223 18011 18222
+18642 18467 18466
+18011 17839 18010
+18467 18642 18765
+18762 18761 18922
+18358 18357 18468
+18222 18466 18467
+18467 18765 18643
+18642 18764 18765
+18644 18768 18469
+18466 18762 18763
+18768 18644 18925
+18643 18765 18766
+18763 18642 18466
+22649 22758 22759
+21668 21399 21398
+18925 19045 18768
+20485 20589 20590
+18925 19044 19045
+21279 21278 21401
+19046 18926 18771
+18774 18474 18473
+21823 21668 21822
+20175 20487 20176
+19344 19641 19642
+19347 19051 19050
+19984 19983 20180
+21121 21013 21282
+20316 20315 20597
+20602 20320 19991
+19843 19987 19988
+20595 20848 20596
+19839 19984 19985
+19983 20179 20180
+19225 19350 19226
+18776 18775 19052
+19053 18776 19052
+20600 21128 20751
+19992 19991 20320
+19847 19846 19991
+20184 19990 19989
+19844 19508 19228
+20854 20753 20602
+20854 20602 20752
+21288 21418 21289
+21129 21128 21284
+19992 20320 20321
+19991 19990 20319
+21131 20604 20855
+19994 19850 19993
+19660 19857 19661
+20187 20326 20002
+20606 20327 20495
+19853 19854 19656
+20325 20494 20187
+20606 20859 21137
+21588 21137 21422
+21136 21135 21421
+21584 21416 21415
+21421 21422 21292
+20858 21135 21136
+20324 20186 19999
+21414 21583 21415
+22212 22213 22116
+21417 21286 21416
+21678 21677 21830
+21288 21132 21131
+21291 21420 21134
+21945 21682 22216
+21831 21584 21678
+22666 22667 22594
+22214 22116 22213
+22115 21831 21941
+21829 21283 21413
+21943 21942 22116
+21831 21830 21941
+19842 19986 19987
+20595 20594 20848
+21406 21121 21282
+20311 20177 20491
+20594 20489 20847
+20845 20748 21012
+19507 19227 19350
+20491 20490 20594
+19054 18928 18778
+20596 20312 20595
+20848 20849 20596
+20599 20851 20750
+21671 21672 21580
+19979 20175 19980
+21672 21827 21581
+22204 21929 22113
+21673 21404 21581
+21931 22205 22429
+22850 23244 23245
+21675 21413 21412
+21582 21829 21413
+21675 21411 21938
+20316 20183 20182
+23004 23057 23058
+22212 21942 22115
+22439 22216 22215
+22769 22665 22439
+22215 21944 22117
+23060 22769 23547
+22770 22666 22769
+23398 23447 23061
+23797 23960 23855
+23060 23005 22769
+22859 22769 23005
+23446 23060 23547
+23061 23005 23060
+21941 21830 21677
+24671 24602 24237
+23061 23060 23160
+23549 23448 23646
+23061 23160 23398
+23795 23644 23643
+24045 24044 24436
+23546 23642 23853
+23445 23640 23641
+23252 23055 23251
+23058 23057 23158
+23546 23641 23642
+22849 22660 22848
+23632 23631 24038
+23244 23243 23630
+22659 22429 22205
+22660 22430 22429
+22844 22655 22765
+21933 22114 22207
+22848 22659 22847
+22845 22427 22656
+22203 21928 22112
+22113 22203 22204
+22429 22430 22206
+21127 21016 21126
+22210 21940 21939
+21828 21829 21676
+22428 22205 22204
+23635 23444 23634
+22590 22425 22589
+23237 23049 23156
+20588 20842 20843
+23622 23545 23544
+23957 23846 23790
+22762 23050 22841
+23436 23234 23233
+23051 22841 23050
+22763 22762 22841
+24033 24034 23627
+22842 22653 22652
+24032 24424 24033
+23002 23050 22840
+24424 24032 24423
+23624 23849 24031
+23625 23624 24031
+23002 23157 23050
+23396 23234 23436
+23435 23394 23620
+23439 23237 23438
+23154 23153 23235
+23395 23436 23233
+23545 23436 23395
+24231 24028 24230
+23792 23623 23545
+23621 23620 23846
+23047 22837 22836
+23790 23619 23845
+23395 23544 23545
+23392 23230 23045
+23434 23393 23230
+23048 23232 23000
+23791 23847 23622
+23153 23233 23234
+22839 22758 22838
+22337 22199 22336
+21667 21666 21924
+22649 22759 22422
+22336 22424 22337
+21398 21667 21668
+22336 22198 22423
+22425 22590 22426
+21925 22108 22109
+22200 22108 21924
+22200 22338 22109
+21668 21821 21822
+21401 21278 21400
+22657 22427 22845
+20747 20590 20589
+21400 21577 21578
+22762 22761 23050
+20841 21115 21278
+21115 20841 20840
+21577 21669 21670
+22761 22762 22651
+22112 22202 22427
+21117 21010 21116
+22201 22425 22426
+20591 20590 20747
+20843 21011 20844
+19349 19507 19350
+19979 19644 19643
+19980 19644 19979
+20309 20590 20591
+20588 20308 20307
+21577 21399 21669
+20588 20587 20842
+20307 20306 20587
+22198 21923 21922
+21394 21112 21393
+17836 17835 18005
+20824 20823 21109
+22193 22194 21912
+20295 19974 19973
+20818 20819 20284
+20573 20481 20480
+20577 20282 20281
+21376 20817 20816
+21377 21378 20818
+20482 20277 20169
+21660 21901 22185
+22183 22182 22330
+20818 21378 20819
+20818 20817 21377
+21277 21105 21276
+22181 22182 21899
+21658 21372 21371
+21664 21382 21381
+22184 21901 22106
+22335 22190 22334
+21911 22192 22193
+22192 22410 22193
+21385 21386 21111
+22825 22826 22645
+22418 22419 22195
+22408 22644 22409
+22410 22411 22193
+22998 22836 22835
+24025 23952 23951
+23209 23210 23042
+23042 23150 23043
+23042 23210 23150
+23150 23211 23043
+22332 22184 22331
+22816 23042 23043
+21380 21104 21379
+23044 22817 23043
+22189 22107 21909
+21902 21377 21376
+22586 22397 22396
+22631 22390 22630
+21895 22177 21896
+22995 22809 22808
+23147 23198 23389
+22636 22393 22635
+24001 23594 23593
+24220 24187 24186
+23788 23590 23589
+23837 23788 23836
+23390 23199 23389
+23947 23995 23948
+23786 23589 23540
+22627 22585 22388
+23994 23947 23946
+23836 23788 23589
+23391 23148 23199
+23146 23029 23028
+23539 23587 23588
+23588 23540 23539
+23785 23834 23786
+23786 23835 23787
+23388 23423 23424
+23586 23587 23538
+23425 23389 23424
+23199 23148 23029
+23587 23539 23538
+23391 23200 23148
+23424 23538 23425
+23145 23146 23028
+23147 23199 23029
+23390 23391 23199
+22585 22628 22629
+22386 22584 22625
+23030 23148 23200
+22802 22990 22991
+23030 23029 23148
+22993 23028 23029
+19495 19309 19606
+23026 22801 23144
+22101 21886 22100
+19493 19307 19306
+21818 21819 21652
+22583 22385 22327
+22382 22325 22324
+22582 22384 22581
+22580 22382 22752
+22386 22625 22626
+22582 22581 22622
+22803 22993 22804
+22176 22388 22389
+22175 22387 22176
+23031 23030 23200
+22394 22329 22178
+21370 21371 21098
+22396 22180 22639
+22180 21898 21897
+21573 21362 21572
+22174 22328 22386
+22386 22387 22175
+22626 22806 22627
+21009 21098 21099
+21097 21096 21370
+21895 21658 21370
+21274 21099 21098
+21008 20810 21007
+21098 21371 21274
+21660 21659 21901
+20809 21096 21097
+21574 21362 21573
+21892 22390 21893
+21094 21005 21093
+21892 21891 22389
+21890 21889 22175
+20165 19960 20164
+22173 22103 22327
+21656 21366 21365
+21819 21887 21888
+20805 20734 20733
+19009 19191 18912
+20566 20472 20735
+20735 20565 20734
+20267 20470 20471
+20270 20566 20567
+21885 21886 21818
+20736 20566 20735
+18741 19195 19012
+20471 20565 20472
+20471 20733 20565
+20468 20266 20265
+20267 20471 20268
+19493 19308 19307
+19011 19194 19195
+19307 19189 19188
+18736 18620 18619
+19187 19188 19008
+19307 19308 19189
+19011 19193 19194
+20162 20272 20273
+19191 19010 18912
+19192 19191 19494
+19016 19015 19309
+19496 19827 19608
+19829 19828 19961
+19609 19608 19829
+19201 19016 19200
+19609 19829 19830
+19828 19827 19961
+20280 20815 20816
+20810 20809 21007
+20169 20277 20170
+20741 20740 20813
+21009 20811 21008
+20807 20806 21006
+20169 20481 20482
+20572 20740 20573
+20276 20167 20480
+21373 21897 21898
+21102 20813 20812
+21101 21100 21372
+20278 20170 20277
+20741 20813 20814
+20291 20582 20583
+20286 19621 19620
+19968 20172 20173
+19967 19615 19834
+20281 20282 20172
+19617 19320 19319
+19032 19033 18756
+19626 19330 19029
+20289 20290 19971
+19028 19624 19625
+19835 19973 19974
+19029 19030 18455
+20296 19975 20295
+19339 19340 19036
+18760 19040 18761
+19638 19639 19342
+19632 19337 19336
+19336 19033 19335
+19505 19631 19335
+19035 19224 19036
+19039 19040 18760
+18217 18216 18456
+19975 19628 19974
+19634 19037 19340
+18462 18007 18461
+18756 19031 19032
+18455 18214 18454
+19622 19024 19328
+19619 19322 19618
+18750 18749 19025
+20293 20586 20828
+19964 20280 19965
+19966 20281 19967
+20169 20170 19962
+19213 19320 19214
+19970 19320 19617
+19319 19502 19617
+18214 17996 18134
+18351 18638 18352
+18134 17996 17995
+18133 18213 18134
+17941 17995 17996
+18351 18208 18350
+19628 19331 19330
+18455 18216 18215
+18458 18756 19033
+17769 17832 17770
+18459 18458 19033
+18218 18001 18217
+19038 18462 19037
+18640 18639 18760
+18761 18762 18641
+18009 18010 17649
+18004 18459 18460
+19037 18462 18461
+17834 17833 18004
+18002 18218 18458
+18219 18004 18460
+18003 18002 18458
+18007 17646 17837
+15076 15471 15276
+18462 18463 18008
+17647 17472 17838
+18008 18220 18009
+17648 17474 17647
+17837 17646 17645
+17581 17580 17644
+17645 17582 17644
+18138 17942 17999
+17646 17472 17471
+17470 17580 17581
+17943 17942 18000
+17832 17771 17770
+18001 17945 17829
+17833 17834 17773
+17941 17828 17995
+17945 17830 17829
+18003 17832 17831
+18003 17833 17832
+18132 18212 18356
+18210 18209 18354
+18350 18208 18349
+18451 18753 18452
+18211 18212 18131
+18745 18920 19023
+18634 18748 18447
+18749 18635 18748
+18636 18349 18448
+18749 18636 18448
+18637 18449 18636
+18353 18208 18352
+20292 20586 20293
+18636 18749 18750
+19026 19027 18921
+18752 19027 18753
+19329 19623 19624
+19022 19220 18920
+19621 20286 20287
+19327 19328 19023
+18748 18634 18747
+18750 18638 18637
+18752 18753 18451
+19315 19314 19498
+18918 18917 19020
+19321 19320 19618
+18919 19218 19022
+19325 19326 19219
+19008 18911 19007
+18739 19010 18740
+19187 19007 19006
+18908 18909 18736
+18910 18911 18738
+18446 18623 18624
+18629 18446 18628
+18740 19010 19011
+18348 18445 18446
+18628 18741 18913
+19022 18920 18744
+18632 18747 18633
+18207 18348 18446
+18622 18739 18446
+19217 19218 19021
+18916 18743 18915
+16014 16066 16067
+17479 17587 17480
+15882 15881 16070
+15677 15473 15609
+15680 15477 15476
+16068 15881 15880
+16449 16582 16583
+16070 16255 16256
+16068 16193 16069
+16822 16651 16650
+16984 17157 16985
+17317 17160 16987
+16194 16078 16077
+17435 17491 16988
+16391 16263 16454
+16779 16657 16265
+15287 15399 15485
+16262 16077 16076
+16078 16015 16077
+16194 16195 16078
+16264 16078 16195
+15885 16073 15886
+14531 14649 14650
+15816 15684 15683
+14840 14899 14841
+15480 15888 15481
+15888 16076 15889
+15610 15479 15478
+15685 15886 15887
+15478 15283 15282
+15280 15398 15476
+15477 15282 15281
+15083 15283 15084
+15474 15278 15277
+15279 15398 15280
+15880 15678 15677
+15077 14889 15276
+15882 15680 15679
+15477 15281 15476
+15675 15814 15676
+15677 15678 15473
+15471 15608 15472
+15609 15473 15472
+15676 15609 15608
+15814 15878 15815
+15279 15080 15209
+15010 15078 15207
+15213 15212 15281
+14894 14895 14716
+15280 15212 15211
+15082 14895 14894
+14717 14528 14527
+15013 15080 15081
+14712 14838 14640
+14889 15077 14890
+15010 14892 14891
+14644 14524 14643
+15080 15013 15012
+14642 14523 14641
+14888 14837 14711
+14523 14643 14524
+14084 14085 13961
+14319 14131 14318
+13962 14137 14138
+14321 14247 14320
+14132 14319 14320
+14250 14322 14323
+14526 14716 14527
+15012 14893 14892
+14324 14323 14529
+14529 14646 14647
+14451 14325 14450
+14249 14136 14135
+14530 14451 14450
+14452 14325 14451
+13535 13602 13536
+13964 14328 13965
+14535 14455 14329
+15015 14902 14657
+14536 14535 14656
+14724 14725 14654
+14656 14535 14655
+14450 14529 14530
+14895 15082 15083
+14652 14534 14533
+14651 14531 14650
+15685 15480 15479
+15481 15284 15086
+14724 14840 14841
+14722 14721 14898
+14900 14842 14841
+14842 14843 14725
+16265 16392 16196
+15613 15689 15690
+15894 15893 16082
+15486 15289 15288
+14908 14907 15023
+15091 15216 15287
+15289 15093 15092
+14142 14087 14141
+15288 15485 15691
+15288 15287 15485
+14538 14539 14457
+14253 14089 14144
+14844 14727 14657
+15017 15016 15091
+13791 13726 13790
+14728 14844 14903
+14904 15018 14846
+14848 14847 14905
+15016 15090 15091
+14907 15022 15023
+15020 15094 15021
+15489 15292 15488
+14907 14906 15022
+15217 15289 15290
+15025 15097 15026
+14732 14542 14335
+15098 14911 14910
+14543 14151 14337
+15096 15024 15023
+14909 14542 14732
+15297 15491 15400
+14733 14542 14909
+15096 15220 15221
+15294 15099 15098
+14848 15020 14906
+15093 15289 15217
+15094 15218 15219
+15897 15693 15896
+15289 15486 15290
+15486 15288 15691
+15896 15693 15819
+15692 15893 15894
+15490 15295 15294
+15222 15098 15097
+16839 16787 16838
+16831 16832 16782
+16785 16784 16836
+16783 16834 16835
+16837 16785 16836
+16594 16668 16595
+16087 16086 16271
+16083 16016 16082
+15696 15899 16087
+16199 16085 16084
+16470 16594 16595
+16273 16088 15901
+16664 16589 16663
+16018 16200 16086
+16196 16392 16266
+16082 16459 16268
+16456 16457 16392
+16198 16393 16267
+16586 16657 16658
+16929 16991 16827
+16266 16457 16393
+16658 16779 16826
+16663 16462 16662
+16460 16268 16459
+16661 16588 16660
+17323 17494 17495
+16827 16828 16659
+16825 16928 16826
+16831 16662 16830
+16458 16459 16267
+16928 16989 16929
+17590 17662 17779
+16781 16660 16829
+17267 17321 17322
+17323 17166 17165
+16834 16933 16934
+17167 17324 17268
+17326 17439 17327
+16997 17118 17119
+17271 17270 17327
+17171 17170 17271
+17269 17326 17270
+16786 16785 16837
+16835 16934 16935
+17327 17328 17271
+16836 16835 16935
+16936 16937 16837
+17327 17440 17441
+17173 17172 17330
+16837 16838 16786
+16841 16840 16939
+16938 17002 17003
+17004 16940 16939
+16939 16840 16938
+16842 16841 16939
+16839 16838 16937
+16790 16669 16789
+16787 16786 16838
+16788 16669 16668
+16466 16667 16467
+16842 16791 16790
+16275 16276 16089
+16471 16397 16396
+16467 16272 16466
+16791 16670 16790
+16597 16473 16596
+16671 16596 16670
+16277 16278 16203
+16278 16399 16279
+16089 16276 16201
+16399 16400 16279
+16091 16203 16204
+17009 17180 17010
+15910 16094 15911
+15710 15711 15623
+16280 16401 16204
+16474 16473 16598
+16849 16943 16944
+15914 15509 15913
+16280 16400 16401
+16672 16673 16598
+17176 17177 17122
+16940 16842 16939
+16941 17006 17007
+16845 16846 16674
+17175 17272 17273
+17674 17789 17675
+17121 17122 17005
+17334 17333 17505
+17273 17333 17274
+17675 17676 17334
+16681 16680 17014
+17341 17016 17340
+17011 17182 17012
+17340 17681 17341
+16679 16680 16480
+16853 17016 17017
+16491 16688 16600
+16288 16289 16209
+16853 16683 16682
+16485 16292 16291
+17342 17017 17016
+17343 17018 17017
+17184 17345 17508
+17506 17604 17507
+17021 17020 17124
+17346 17508 17509
+17125 17023 17022
+17275 17185 17346
+16685 16684 16855
+16687 16490 16489
+16691 16690 16794
+16686 16489 16488
+16301 16496 16302
+15827 15719 15718
+16406 16298 16405
+16101 16100 16291
+16489 16490 16296
+16491 16492 16407
+16302 16694 16303
+16405 16297 16296
+16023 16105 16106
+15512 15916 15917
+16292 16101 16291
+15718 15917 15918
+16296 16211 16104
+15918 15919 15827
+16284 16479 16678
+16483 16681 16682
+16403 16404 16290
+16098 15914 16097
+16486 16292 16485
+16100 16099 16291
+16481 16287 16480
+16679 16284 16678
+16205 16286 16287
+15912 15715 15911
+15914 15510 15509
+16095 16285 16286
+16285 15912 15911
+15117 15116 15233
+15308 15307 15407
+15714 15715 15627
+15717 15509 15508
+14662 14749 14750
+15627 15715 15628
+15913 15717 15912
+15314 15315 15236
+15917 16103 15918
+16103 16021 15918
+16106 16212 16213
+15415 15320 15319
+16407 16299 16213
+15829 15721 15828
+15517 15416 15415
+15417 15320 15416
+15510 15511 15121
+14350 14746 14551
+15513 15317 15124
+15917 15718 15513
+15512 15122 15511
+15120 15031 15119
+15514 15318 15317
+15122 15121 15511
+14755 14756 14360
+15126 14757 15125
+13456 13455 13625
+14752 14852 14929
+14928 15121 14929
+14753 14557 14752
+14751 14851 14852
+15114 15231 15311
+14927 14928 14851
+15413 15414 15312
+15120 15316 15121
+15030 15031 14927
+15120 15315 15316
+15114 15311 15312
+15411 15410 15505
+14547 14546 14741
+15234 15235 15119
+14747 14746 14925
+15118 15234 15119
+14745 14349 14348
+15227 15109 15226
+14918 14917 15106
+14923 15112 15113
+15713 15504 15624
+15227 15226 15305
+15304 15303 15405
+15111 15228 15229
+15228 15110 15227
+15114 15312 15115
+15308 15112 15229
+15713 15712 15825
+15825 15909 15910
+15713 15825 15826
+15501 15709 15621
+16284 15911 16094
+15715 15714 15911
+15826 15825 15910
+15624 15503 15623
+15306 15406 15307
+15305 15502 15406
+16092 16093 15907
+15825 15712 15711
+15622 15623 15503
+15501 15305 15304
+15703 15702 15904
+16090 16202 16091
+15105 15106 15027
+15495 15703 15615
+15906 15905 16019
+15822 15700 15699
+15822 15699 15902
+14915 15104 15027
+15493 15702 15494
+15299 15300 15103
+15699 15492 15491
+15296 15100 15099
+14735 14338 14543
+15492 15699 15614
+15400 15492 15401
+15493 15494 15300
+15500 15304 15405
+15305 15226 15304
+14738 14737 14915
+15300 15494 15495
+14919 14920 14742
+15105 15104 15223
+13982 13983 13619
+15226 15225 15304
+14345 14462 14463
+14921 14920 15028
+14258 14257 14341
+14344 14461 14262
+14341 14259 14258
+13619 13620 13266
+14738 14660 14544
+13902 13901 13980
+12862 13068 13069
+14153 14340 14257
+12472 12297 12296
+12860 12677 12793
+13263 13069 13262
+12860 12678 12677
+10959 11001 10960
+12473 12474 12155
+14262 14345 14158
+14153 14152 14340
+12473 12155 12154
+13805 13901 13902
+14163 14164 14090
+14265 14264 14352
+12867 13266 13267
+12863 12472 12680
+13620 13621 13266
+13070 13270 13177
+12480 12682 12683
+12870 12869 13070
+13273 13272 13456
+13269 13070 12869
+13809 13626 13625
+13456 13389 13455
+13809 13624 13808
+14162 13984 14161
+14161 14348 14162
+14350 13986 13985
+13988 13989 13904
+14351 14352 14264
+14351 14464 14352
+14351 14350 14551
+14353 14265 14352
+13905 13904 13991
+14465 14553 14554
+13813 13812 13905
+14091 14092 13991
+13628 13545 13544
+12108 12247 12170
+14169 14168 14356
+12689 12690 12486
+14557 14356 14556
+13993 13814 13992
+13993 14169 14357
+13274 13275 13075
+14358 14359 13995
+14168 13992 14092
+14360 13996 14359
+12691 12879 12880
+13999 13816 13815
+13997 13996 14360
+12883 12987 12884
+12603 12491 12490
+13629 13813 13814
+13995 13633 13632
+13993 13994 13631
+13278 13279 12881
+13630 13631 13276
+13632 13633 13278
+12484 12687 12688
+13076 12881 13279
+12800 12884 12885
+12405 12315 12314
+12492 12491 12604
+12489 12490 12402
+12313 12402 12403
+12403 12404 12314
+12403 12490 12491
+12402 12401 12489
+12397 12396 12484
+12600 12601 12488
+12599 12685 12686
+12877 13275 12878
+12481 12596 12597
+12685 12798 12799
+12876 12798 12875
+12685 12597 12684
+12595 12596 12481
+12796 12683 12795
+12687 12483 12686
+12596 12684 12597
+11537 11664 11400
+12163 12304 12164
+11660 11775 11661
+11343 11389 11344
+12395 12483 12484
+10716 10717 10655
+12307 12167 12166
+11897 11896 12019
+12104 12166 12105
+12019 11896 12018
+12399 12400 12311
+12602 12691 12692
+12400 12401 12312
+12601 12600 12691
+12493 12407 12406
+12314 12313 12403
+12309 12247 12246
+12105 12020 12104
+12687 12484 12483
+12308 12167 12307
+12169 12107 12168
+11779 11665 11664
+12021 12106 12167
+11012 11134 11013
+11846 11781 11901
+11666 11538 11402
+11902 11846 11970
+12025 11900 12171
+10963 11015 11086
+11274 11273 11406
+10727 10664 10726
+11399 11537 11267
+11137 11268 11269
+11401 11665 11402
+11397 11483 11534
+11537 11536 11663
+11660 11534 11659
+11263 11215 11262
+11774 11895 11775
+11730 11775 11776
+11390 11256 11344
+12016 12103 12017
+12016 11774 11894
+11533 11534 11483
+11216 11264 11129
+11005 10867 10716
+11130 11006 11129
+11214 11258 11259
+10714 10652 10713
+11346 11260 11259
+11260 11214 11259
+11393 11347 11346
+11003 11004 10866
+11533 11483 11395
+11215 11127 11262
+11532 11531 11658
+11264 11217 11129
+12303 12161 12302
+11345 11258 11257
+12681 12303 12478
+12162 12163 12102
+12161 12100 12014
+12162 12304 12163
+12157 12299 12010
+11391 11530 11392
+12159 12300 12301
+11390 11391 11257
+11392 11531 11393
+11346 11261 11260
+11388 11389 11342
+11892 12011 12012
+12156 11891 11890
+12010 12011 11892
+12866 12867 12476
+12010 11891 12157
+11888 11887 12153
+11529 11655 11656
+11527 11650 11528
+11525 11382 11381
+12472 12863 12473
+12156 12157 11891
+11250 11528 11384
+10862 10956 10997
+11123 11387 11253
+11256 11257 11213
+11210 11254 11126
+11123 11253 11124
+11250 11384 11251
+10959 11000 11001
+11000 11123 11001
+11078 11001 11123
+11074 11117 11209
+11524 11649 11525
+11382 11383 11341
+12006 11969 11883
+12008 11885 11772
+11479 11523 11480
+11248 11382 11341
+11522 11523 11479
+11482 11339 11380
+11772 11884 12008
+11207 11247 11208
+11646 11610 12092
+12457 12458 12389
+11337 11336 11379
+11377 11477 11478
+11844 11769 11843
+11729 12092 11768
+11844 11882 11968
+11768 12002 12003
+11884 11771 11845
+11647 11646 11729
+12245 12093 12145
+12243 12287 12288
+12145 12243 12244
+11521 11520 11610
+13049 13048 13163
+12144 12143 12243
+12092 11610 11520
+12391 12287 12242
+12669 12670 12594
+12462 12463 12287
+12244 12243 12288
+12792 12675 12674
+11968 11883 11844
+12003 12002 12095
+11768 12092 12002
+12147 12148 12096
+11882 11768 12003
+12150 12294 12151
+11524 11482 11481
+12675 12467 12674
+11969 12007 11884
+12861 12862 12679
+12469 12294 12150
+12856 13059 13060
+12859 12982 12860
+13447 13446 13608
+12674 12467 12292
+12674 12790 12791
+13055 13056 12978
+12855 12854 13058
+13798 13797 13897
+13061 13385 13062
+13259 13387 13260
+13386 13259 13174
+13262 13616 13617
+14256 14337 14150
+13976 13802 13801
+14907 14732 14731
+14150 14151 13976
+14912 14735 14734
+14339 14152 13978
+13728 13607 13606
+14335 14254 14148
+13895 13794 13793
+13973 13972 14147
+13170 13058 13057
+13732 13799 13800
+13171 13058 13256
+13445 13444 13606
+13895 13970 13971
+14541 14730 14731
+13610 13609 13731
+13970 13895 13792
+13608 13607 13730
+13254 13255 13168
+13254 13253 13444
+13383 13443 13539
+13608 13446 13607
+13057 13169 13170
+12977 13053 13054
+13441 13440 13537
+12787 12853 12671
+12671 12672 12464
+13170 13169 13255
+13057 12854 12853
+12855 12789 12788
+12465 12393 12392
+12786 12669 12785
+12976 12975 13052
+12854 12671 12853
+12462 12287 12391
+13538 13605 13443
+13166 13252 13167
+13241 13435 13595
+13246 13245 13437
+13046 13246 13047
+13966 13965 14141
+13047 13247 13048
+13377 13439 13378
+13970 14089 14145
+13606 13444 13539
+14539 14658 14728
+13791 13969 13894
+14143 14088 14456
+14331 14456 14457
+14457 14539 14332
+13595 13785 13786
+13785 13958 13959
+13437 13599 13600
+13598 13597 13963
+13726 13791 13605
+13596 13242 13241
+13954 13889 13888
+14317 14318 14246
+13892 13785 13784
+14081 14132 14133
+13959 14082 13960
+14130 14246 14318
+13724 13780 13725
+13955 14078 14128
+13433 13594 13434
+13533 13431 13591
+13591 13725 13533
+13370 13431 13371
+13533 13725 13592
+13241 13240 13435
+13593 13592 13782
+13036 13159 13160
+13372 13371 13432
+13237 13371 13372
+13431 13533 13371
+13239 13161 13373
+13159 13237 13238
+13160 13159 13238
+13373 13161 13238
+12836 12774 12656
+12840 12776 12775
+12837 12658 12657
+13041 12841 13040
+12840 12775 12839
+13045 13046 12847
+12663 12662 12777
+13041 13042 12843
+13244 13598 13436
+12971 12847 13046
+13043 13042 13243
+12667 12593 12461
+13048 13248 13163
+13443 13383 13252
+12976 13166 13053
+12973 13048 12974
+12969 12844 12968
+13048 12973 13047
+12974 12847 12973
+12775 12776 12662
+12841 12842 12779
+12843 12782 12781
+12588 12660 12661
+12779 12780 12664
+12286 12390 12461
+13382 13442 13443
+12593 12668 12462
+13049 13163 13050
+12391 12242 12286
+13603 13537 13602
+12777 12662 12776
+12590 12589 12661
+12586 12659 12660
+13040 13241 13242
+12661 12662 12590
+12778 12779 12663
+12457 12583 12658
+12657 12581 12774
+13039 12839 12838
+12586 12458 12585
+12659 12586 12585
+12587 12459 12586
+9640 9502 9639
+9332 9333 9263
+11119 11120 11077
+10862 10954 10955
+6091 6243 6141
+6307 6396 6397
+6244 6297 6245
+9505 9506 9460
+8369 8302 8205
+9330 9331 9263
+5107 5152 5153
+9330 9263 9329
+6092 6141 6093
+6141 6092 6091
+6013 6142 6014
+5974 6012 6093
+6141 6243 6142
+6248 6144 6247
+6245 6297 6246
+6253 6146 6252
+6540 6440 6539
+6145 6251 6146
+6149 6302 6303
+6253 6252 6300
+6143 6247 6144
+5886 5977 5978
+6017 6147 6018
+6392 6440 6540
+6147 6148 6018
+6598 6441 6540
+10996 11121 10997
+6252 6391 6300
+7885 8006 8007
+6298 6299 6247
+10993 11076 10994
+10998 10999 10863
+11122 11385 11386
+10957 10958 10864
+10960 10864 10959
+8462 8527 8573
+8573 8528 8462
+8573 8647 8677
+8369 8437 8352
+8302 8352 8277
+8677 8678 8648
+8648 8574 8528
+10715 10652 10714
+11005 10866 11004
+10715 10653 10652
+11128 11005 11004
+10719 10868 10805
+10717 10570 10655
+10568 10652 10653
+8677 8648 8573
+8678 8734 8679
+10652 10568 10713
+8576 8683 8577
+8277 8206 8176
+8079 8007 8006
+8078 8079 8006
+8112 8080 8007
+8115 8081 8011
+8008 7886 8007
+5791 5892 5893
+6159 6158 6313
+7215 7342 7302
+6667 6668 6597
+7826 7743 7742
+7344 7343 7474
+5891 6023 6024
+6302 6441 6393
+6668 6598 6597
+6395 6445 6446
+6398 6308 6397
+6304 6303 6394
+6392 6254 6301
+5889 5851 5981
+6097 6151 6098
+6395 6307 6258
+6154 6259 6155
+5888 5980 5981
+5850 5887 5979
+5789 5747 5788
+5786 5662 5785
+6096 6149 6150
+5663 5561 5560
+5890 5889 5982
+5889 5981 6021
+5748 5789 5749
+6308 6398 6309
+5667 5750 5751
+6026 6156 6157
+5174 5175 5122
+5985 5892 6025
+5667 5668 5632
+5750 5791 5751
+5631 5665 5749
+5665 5563 5630
+5631 5666 5632
+5666 5749 5790
+5982 5983 5890
+5665 5748 5749
+5632 5564 5631
+5527 5435 5434
+5312 5394 5395
+5310 5436 5437
+5310 5170 5169
+5669 5633 5752
+5564 5438 5563
+5171 5312 5270
+5438 5439 5394
+5564 5632 5530
+4759 4889 4890
+5164 4888 5035
+5628 5529 5561
+5529 5436 5435
+5437 5436 5562
+5390 5391 5308
+5785 5662 5559
+5851 5889 5786
+5555 5556 5526
+5434 5388 5433
+5262 5263 5164
+5115 5162 5034
+5381 5301 5261
+5305 5263 5304
+5264 5165 5164
+5432 5558 5433
+5302 5301 5382
+5556 5626 5557
+5305 5387 5264
+5431 5432 5384
+5387 5306 5265
+5557 5627 5558
+5388 5434 5389
+5978 5979 5887
+5888 5981 5851
+6019 6095 6020
+6304 6149 6303
+5977 5976 6017
+5884 5847 5883
+5554 5624 5555
+5382 5301 5430
+5781 5743 5780
+6016 6146 6017
+5658 5625 5624
+5431 5384 5383
+5883 5882 6016
+6015 5881 6144
+5779 5780 5742
+5744 5782 5745
+5882 5778 5777
+5879 5974 6013
+6013 5880 5879
+5294 5423 5295
+5741 5656 5621
+5525 5524 5554
+5619 5879 5740
+5156 5296 5297
+5659 5626 5625
+5431 5430 5556
+5032 4886 4981
+4752 4884 4834
+5620 5655 5552
+5622 5656 5657
+5032 5160 5115
+4617 4746 4747
+5025 4878 4974
+5023 5107 5024
+4829 4880 4747
+5108 5153 5259
+5024 5108 4974
+5154 5294 5155
+5158 5113 5112
+4625 4756 4757
+5032 5033 4982
+5262 5302 5303
+4833 4832 4883
+5034 5033 5115
+4835 4886 4982
+4886 5032 4982
+4749 4619 4709
+5029 5112 5113
+4752 4833 4884
+4979 5029 5030
+4832 4750 4831
+4751 4620 4710
+4622 4621 4712
+4884 4980 4885
+4624 4713 4756
+4754 4886 4835
+4373 4507 4508
+4621 4505 4584
+4502 4619 4583
+4749 4748 4830
+4621 4622 4585
+4710 4583 4619
+4502 4501 4618
+5025 4975 4879
+4747 4880 4830
+5026 5110 5155
+4747 4830 4748
+4880 4976 4830
+4877 4876 4973
+4501 4364 4500
+4826 4876 4877
+4829 4746 4828
+4747 4618 4617
+4318 4243 4317
+4503 4502 4583
+4582 4499 4616
+4454 4505 4369
+4367 4366 4453
+4185 4125 4124
+4453 4368 4367
+4318 4244 4243
+4369 4505 4370
+4097 4034 4033
+3739 3819 3802
+3913 3984 3985
+3290 3203 3260
+3446 3540 3541
+3739 3802 3702
+3878 3914 3987
+3505 3606 3539
+3820 3819 3877
+3877 3913 3820
+3985 3986 3914
+3540 3607 3641
+3639 3702 3740
+3639 3607 3539
+3640 3703 3641
+1132 1182 1133
+1448 1533 1449
+1571 1652 1689
+3359 3418 3444
+3990 3916 3989
+4126 4040 4101
+4247 4185 4124
+4101 4038 4124
+4127 4102 4126
+4038 3985 4037
+4102 4040 4126
+4101 4124 4125
+4373 4372 4507
+4455 4370 4506
+4372 4373 4249
+4102 4041 3988
+3508 3447 3507
+3291 3204 3104
+3452 3292 3363
+3361 3360 3447
+1450 1360 1449
+1692 1693 1575
+1573 1572 1690
+1781 1825 1826
+3109 3079 3108
+2945 3024 2989
+1323 1239 1238
+1188 1187 1241
+1184 1134 1098
+1450 1449 1572
+1099 1135 1100
+1134 1184 1185
+1136 1239 1240
+1185 1184 1238
+1451 1361 1450
+1362 1239 1361
+3261 3209 3164
+2920 2987 2944
+1578 1579 1453
+1826 1782 1781
+1135 1239 1136
+1784 1694 1693
+1926 1835 1925
+2853 2810 2852
+3343 3295 3342
+3166 3114 3165
+3211 3116 3115
+3296 3297 3212
+3455 3365 3454
+3548 3547 3651
+3609 3546 3545
+3643 3543 3542
+3650 3610 3649
+3452 3364 3292
+3648 3708 3709
+3745 3644 3707
+3710 3709 3748
+4045 3995 3994
+3834 3749 3833
+3650 3649 3710
+3922 3834 3833
+3748 3709 3708
+3832 3921 3833
+4253 4252 4376
+4380 4254 4379
+4514 4377 4629
+4251 4191 4250
+3748 3747 3833
+3747 3646 3746
+3922 3921 4047
+3885 3884 3920
+3825 3879 3916
+3881 3917 3991
+4128 4103 4127
+4104 4042 3990
+3825 3824 3879
+3823 3878 3915
+4192 4132 4107
+4129 4042 4104
+4625 4509 4508
+4509 4626 4510
+4191 4130 4190
+3830 3745 3807
+5117 5168 5169
+5037 4983 4889
+4758 4626 4888
+4513 4628 4759
+4758 4888 5036
+5037 4889 5036
+4628 4627 4758
+4836 4759 4890
+5310 5311 5170
+4892 4836 4891
+5039 5119 5040
+5169 5168 5309
+5170 5040 5119
+4985 5039 5040
+4989 4838 4893
+4588 4589 4516
+4894 4762 4838
+4631 4515 4630
+5171 5041 5170
+4988 4987 5041
+5172 5042 5171
+4894 4838 4989
+3923 4135 3924
+4767 4768 4719
+3922 3835 3834
+5397 5314 5313
+4990 4895 4894
+5121 5043 5120
+5315 5398 5445
+5570 5571 5446
+5177 5316 5446
+5318 5317 5447
+4770 4844 4771
+4384 4323 4322
+4716 4766 4717
+4841 4842 4769
+4383 4384 4322
+3552 3617 3618
+4324 4258 4257
+3620 3554 3553
+4259 4260 4138
+4321 4381 4382
+4194 4193 4260
+3755 3716 3754
+3619 3620 3553
+3837 3754 3753
+3656 3755 3657
+3713 3753 3714
+3654 3655 3617
+4460 4382 4381
+4136 4256 4257
+4321 4322 4256
+4136 4137 3925
+4517 4458 4457
+4459 4460 4381
+3836 3752 3751
+3551 3617 3552
+4459 4381 4380
+4321 4383 4322
+3367 3368 3345
+3366 3342 3365
+3345 3368 3297
+3511 3554 3512
+3345 3297 3296
+3459 3458 3509
+3029 3116 3212
+3116 3211 3212
+2948 3027 3028
+3115 3166 3211
+2882 2816 2881
+3027 3026 3112
+2883 2856 2855
+2814 2788 2813
+1454 1453 1579
+1924 1835 1834
+1365 1245 1244
+1787 1837 1701
+2074 2038 2073
+1927 1928 1837
+3299 3298 3370
+3297 3368 3369
+2883 2884 2857
+2817 2816 2882
+1929 1838 1928
+1582 1457 1456
+1842 1841 1971
+1966 1928 1965
+2037 1967 1966
+2138 2076 2075
+3214 3299 3372
+3459 3369 3458
+3457 3456 3551
+3655 3654 3715
+3370 3459 3460
+3509 3552 3553
+3553 3618 3619
+3553 3552 3618
+3511 3553 3554
+3510 3509 3553
+3655 3716 3656
+3755 3837 3925
+3757 3926 3927
+3661 3560 3660
+3462 3419 3461
+3372 3419 3373
+3461 3512 3513
+3621 3555 3554
+3513 3514 3461
+3622 3555 3621
+3658 3659 3557
+3082 3032 3081
+3030 3029 3213
+1367 1368 1248
+1250 1249 1324
+2041 1971 2040
+2038 2074 2075
+1371 1372 1252
+3120 3033 3082
+2078 2077 2142
+2040 2078 2041
+1374 1254 1373
+1372 1253 1252
+1252 1253 1254
+1328 1327 1376
+1703 1841 1704
+1461 1586 1587
+2228 2181 2180
+1706 1707 1660
+1843 1930 1844
+2042 2041 2078
+2078 2040 2077
+3219 3304 3220
+3124 3085 3123
+3515 3463 3462
+3420 3421 3373
+3424 3375 3423
+4143 4050 4142
+3518 3559 3560
+4193 4138 4260
+4328 4329 4261
+4330 4201 4262
+4463 4462 4522
+4720 4721 4639
+4777 4905 4778
+4641 4597 4596
+4141 4142 4049
+3757 3659 3756
+4262 4200 4199
+4140 4048 4139
+4049 3928 3927
+4196 4140 4195
+3756 3755 3925
+4637 4594 4593
+4521 4522 4462
+4771 4846 4772
+4640 4722 4641
+4845 4844 4899
+4996 4995 5053
+4992 4991 5046
+5318 5447 5448
+5049 5050 4899
+5571 5447 5446
+5573 5637 5675
+5129 5048 5178
+5675 5797 5798
+5273 5320 5400
+5399 5449 5400
+5448 5535 5573
+5902 5989 5990
+4899 5050 4900
+5051 5052 4994
+4848 4774 4773
+4849 4850 4774
+5181 5273 5321
+5580 5537 5579
+5131 5130 5181
+5400 5449 5450
+5183 5133 5182
+5321 5400 5450
+5900 5899 6037
+6273 6114 6113
+5900 5800 5799
+6165 6111 6110
+5900 6037 6038
+6164 6109 6108
+6549 6460 6459
+6548 6603 6457
+6041 5990 6040
+6039 5989 6038
+6721 6675 6609
+6892 6826 6825
+7480 7481 7423
+7079 7080 6947
+7222 7079 7078
+6826 6827 6721
+6944 7076 6945
+6720 6607 6673
+6786 6719 6785
+6319 6457 6604
+6322 6275 6274
+6321 6272 6320
+6890 6825 6824
+6455 6547 6456
+7074 7347 7219
+7601 7474 7557
+7422 7349 7421
+7476 7345 7217
+7419 7418 7478
+7347 7074 7218
+6718 6605 6458
+6458 6459 6321
+7071 7344 7217
+6944 6824 6823
+6034 5897 6033
+6033 6032 6163
+6036 5988 6035
+5898 5853 5852
+6037 6036 6112
+6164 6108 6163
+5798 5799 5676
+5450 5449 5574
+6034 5898 5897
+5797 5675 5796
+5988 5898 6034
+5988 5854 5898
+5399 5448 5449
+5571 5637 5572
+6030 5895 6029
+6264 6265 6161
+6109 6034 6108
+5897 5796 6032
+6263 6160 6314
+6161 6162 6031
+6106 6105 6159
+6403 6312 6311
+5672 5755 5794
+5673 5571 5570
+5672 5671 5755
+6028 5894 6027
+5394 5439 5440
+5566 5565 5633
+5445 5534 5569
+5635 5634 5669
+6311 6312 6157
+5985 5893 5892
+5671 5670 5755
+5792 5791 5894
+6029 6104 6105
+5894 5793 5792
+7302 7216 7156
+6940 7070 6941
+6819 6820 6714
+6158 6104 6028
+6453 6312 6403
+6312 6313 6158
+7302 7342 7417
+7473 7556 7557
+7070 7156 7216
+7215 7155 7342
+7217 7218 7072
+6822 6716 6715
+6601 6715 6602
+6159 6160 6106
+6821 6822 6715
+6267 6316 6317
+6604 6716 6717
+7347 7218 7346
+7475 7344 7474
+6408 6456 6409
+6548 6602 6603
+8213 8180 8212
+8304 8207 8112
+8213 8212 8279
+8180 8119 8179
+8120 8083 8180
+7891 7828 7890
+7894 7748 7830
+7885 8007 7886
+7969 8014 7892
+7830 7748 7679
+7830 7679 7747
+7744 7676 7743
+8114 8208 8010
+7599 7600 7556
+7969 7890 8012
+7828 7746 7890
+8305 8372 8373
+7889 8012 7890
+8210 8278 8211
+7889 7890 7746
+8117 8178 8118
+7891 7892 7829
+8680 8735 8759
+8378 8214 8310
+8682 8683 8576
+8650 8578 8577
+8762 8682 8737
+8683 8650 8577
+8869 8833 8832
+10872 11012 10873
+10867 11005 11006
+10962 11009 11010
+10720 10721 10659
+10722 10723 10660
+11535 11399 11398
+8374 8438 8375
+8467 8438 8531
+8305 8306 8209
+8467 8375 8438
+10661 10660 10723
+9598 9597 9646
+8651 8650 8684
+8468 8439 8376
+11011 11133 11012
+10808 10873 10725
+10874 10727 10726
+9269 9268 9381
+9057 9056 9159
+9113 9055 9157
+8869 8834 8833
+9338 9379 9380
+8582 8581 8653
+8309 8310 8213
+8120 8015 8083
+7682 7608 7607
+7749 7680 7606
+8016 8121 8214
+7606 7680 7607
+8874 8930 8931
+7903 7902 7976
+7681 7680 7750
+7752 7684 7683
+7607 7680 7681
+7682 7683 7608
+7221 7222 7078
+7684 7609 7608
+7079 7157 7080
+7682 7752 7683
+7753 7685 7684
+7832 7895 7833
+7903 7838 7902
+8876 8932 8933
+9057 8969 9056
+8652 8685 8686
+8871 8928 8929
+8767 8766 8840
+8839 8873 8874
+9382 9270 9381
+9158 9268 9269
+9160 9114 9159
+9026 9058 9027
+9166 9388 9274
+8972 8879 8878
+8936 8973 8974
+8882 8938 8883
+8879 8769 8843
+8686 8581 8652
+8770 8584 8689
+8843 8878 8879
+8378 8470 8582
+8768 8769 8689
+7971 7896 8016
+8020 8084 8021
+7972 8017 8018
+8084 8124 8125
+7755 7754 7900
+7690 7616 7615
+7901 7902 7756
+7903 7904 7839
+7844 7760 7759
+7976 7902 7975
+8583 8584 8380
+8130 8220 8131
+7839 7840 7757
+7690 7615 7689
+7223 7158 7157
+7426 7303 7354
+7483 7482 7612
+7760 7690 7759
+7689 7758 7759
+7489 7560 7490
+7223 7159 7158
+8690 8585 8771
+9067 9066 9169
+8772 8771 8883
+8844 8769 8879
+8313 8314 8220
+8380 8216 8379
+8884 8939 8940
+9032 9065 9033
+8938 8975 8939
+8884 8940 8885
+8846 8773 8845
+8845 8884 8885
+8654 8692 8693
+8691 8690 8773
+8383 8382 8471
+8471 8381 8585
+8589 8474 8588
+8383 8357 8356
+8742 8693 8741
+8740 8773 8846
+8473 8472 8533
+8655 8693 8656
+8942 8943 8888
+8776 8777 8743
+9068 9069 8976
+8776 8695 8694
+8589 8588 8695
+8656 8587 8655
+8658 8657 8696
+8657 8589 8695
+8533 8587 8588
+8591 8534 8590
+7979 7911 7910
+7978 7909 8024
+7979 8026 7911
+7363 7497 7364
+7562 7493 7492
+7489 7490 7428
+7561 7491 7560
+7086 7165 7166
+7693 7694 7620
+7487 7488 7356
+7760 7761 7617
+7620 7694 7621
+7491 7490 7560
+7491 7492 7357
+8385 8359 8384
+8313 8312 8356
+8473 8440 8472
+8474 8475 8385
+8381 8382 8312
+8383 8358 8357
+6955 6954 7030
+8025 8132 8026
+6787 6788 6724
+7161 7160 7224
+6171 6118 6170
+6045 5994 6044
+5640 5682 5683
+5064 5192 5134
+7027 6951 6950
+6724 6725 6613
+6726 6468 6467
+6328 6465 6613
+6950 6893 6949
+6729 6728 6834
+6468 6331 6467
+6467 6466 6725
+7084 7164 7085
+6953 7087 6954
+5909 5857 5995
+6052 6051 6176
+5641 5583 5582
+6046 6118 6171
+6173 6330 6331
+6172 6047 6171
+5332 5331 5403
+5462 5461 5686
+4785 4786 4725
+5330 5276 5329
+5404 5460 5333
+5462 5686 5687
+4466 4529 4530
+4534 4533 4601
+4999 4910 4853
+4782 4647 4646
+4649 4650 4600
+4530 4467 4466
+4648 4647 4782
+4392 4527 4393
+5332 5277 5331
+5457 5538 5539
+5330 5457 5403
+5539 5582 5540
+5402 5329 5328
+5402 5457 5330
+5276 5277 5188
+4852 4853 4782
+5188 5277 5189
+5332 5403 5404
+4268 4392 4269
+4598 4523 4643
+5579 5638 5580
+5328 5275 5187
+5056 5183 5324
+4907 4852 4781
+5678 5577 5452
+5325 5274 5185
+5682 5757 5806
+5993 5905 5992
+5539 5538 5581
+5577 5578 5453
+5683 5682 5758
+5855 5803 5802
+6116 6117 6043
+6327 6465 6328
+5908 6045 5995
+6117 6170 6045
+7354 7224 7353
+7161 7225 7082
+5756 5803 5804
+5679 5678 5802
+6830 6787 6829
+7225 7224 7354
+6042 5992 5991
+6414 6327 6326
+6041 5991 5903
+6116 6043 5993
+6723 6611 6722
+6411 6412 6325
+5989 5902 5901
+5990 6041 5903
+6550 6551 6461
+6460 6323 6322
+5055 4997 5133
+4524 4598 4644
+5679 5577 5678
+5325 5401 5326
+4779 4905 4906
+4722 4723 4641
+4389 4388 4525
+4387 4263 4330
+4265 4144 4264
+4263 4201 4330
+4525 4526 4389
+4388 4331 4387
+3301 3300 3373
+3265 3306 3266
+3123 3122 3169
+3129 3173 3130
+3126 3219 3127
+3304 3377 3305
+4264 4144 4202
+3757 3758 3660
+4144 4051 4050
+3762 3839 3763
+3759 3661 3758
+3764 3840 3841
+3564 3565 3471
+3347 3384 3348
+3346 3381 3382
+3384 3383 3475
+3269 3270 3223
+2692 2691 2702
+3222 3267 3268
+3425 3379 3471
+3222 3269 3223
+3307 3306 3379
+3220 3221 3128
+2956 2957 2924
+2994 2953 2923
+3039 2955 2954
+3040 2956 3130
+2756 2822 2823
+2524 2484 2514
+2955 2888 2954
+2889 2955 2956
+2821 2820 2887
+2733 2689 2700
+2396 2433 2441
+2952 2994 2923
+2821 2888 2822
+2753 2754 2733
+2887 2954 2888
+2993 2952 2886
+2821 2887 2888
+2649 2688 2650
+2523 2514 2483
+1705 1706 1658
+2148 2082 2147
+2083 2082 2149
+1977 1978 1846
+1460 1459 1583
+1659 1660 1585
+1375 1461 1376
+1377 1434 1378
+1432 1462 1463
+1375 1326 1325
+1433 1432 1463
+1376 1462 1432
+1588 1589 1464
+1847 1788 1708
+2083 2149 2185
+1463 1588 1464
+1710 1789 1662
+1661 1710 1589
+1848 1847 1978
+1590 1589 1662
+1589 1710 1662
+1788 1848 1710
+1790 1850 1851
+2084 2152 2085
+2363 2319 2362
+2300 2319 2262
+2149 2082 2148
+2484 2476 2514
+2363 2397 2364
+2485 2397 2441
+2525 2582 2583
+2320 2364 2365
+3224 3223 3271
+3348 3385 3349
+2956 3039 3130
+2442 2399 2398
+2048 2085 2154
+2398 2321 2365
+2048 2086 2049
+1791 1713 1712
+1849 1790 1711
+1851 1791 1790
+1591 1590 1711
+2189 2087 2156
+2321 2398 2366
+2370 2401 2371
+1712 1713 1591
+1465 1464 1589
+1333 1332 1383
+1379 1378 1435
+1983 1984 1853
+1468 1383 1467
+1855 1987 1935
+2526 2515 2486
+2487 2488 2443
+3041 3040 3132
+2759 2825 2826
+2703 2702 2735
+2997 2996 3041
+3276 3226 3275
+3042 2997 3090
+3309 3310 3272
+3002 3001 3047
+3043 3092 3044
+3178 3134 3177
+3317 3316 3350
+3520 3477 3570
+3350 3387 3388
+3571 3624 3671
+3349 3315 3348
+3176 3225 3177
+3276 3313 3314
+3223 3270 3271
+3133 3132 3177
+3226 3177 3225
+3134 3092 3091
+3310 3383 3311
+3175 3132 3131
+3274 3225 3273
+3176 3132 3175
+3427 3473 3382
+3664 3663 3719
+3312 3347 3313
+3476 3519 3477
+3276 3275 3313
+3274 3311 3312
+3670 3624 3669
+3519 3569 3570
+3569 3623 3570
+3668 3669 3623
+3665 3666 3566
+3886 3933 3934
+3668 3667 3721
+3839 3761 3838
+4526 4646 4391
+4393 4528 4466
+4054 3933 3932
+3767 3844 3672
+4336 4337 4274
+3843 3887 3936
+3809 3766 3842
+3808 3765 3764
+3671 3722 3767
+3669 3766 3722
+3673 3573 3768
+3624 3570 3669
+3844 3843 3936
+3842 3808 3886
+3766 3809 3722
+3809 3843 3767
+3768 3844 3937
+3768 3672 3844
+3483 3430 3482
+3478 3429 3520
+3483 3484 3431
+2894 2827 2893
+2963 2962 3046
+2892 2926 2961
+3389 3481 3390
+3002 3048 3049
+4156 4155 4280
+4157 4064 4156
+3940 4001 4002
+1873 1872 1951
+3626 3675 3627
+5343 5342 5408
+1999 1949 1948
+3390 3481 3430
+3094 3049 3048
+2894 2862 2828
+2408 2449 2409
+2587 2586 2659
+2532 2495 2586
+2490 2489 2528
+2446 2492 2477
+2531 2585 2657
+2528 2655 2656
+2516 2491 2529
+2828 2760 2827
+2762 2800 2829
+2828 2829 2800
+2657 2709 2710
+2705 2737 2758
+2760 2656 2707
+2488 2527 2528
+2704 2693 2735
+2491 2490 2529
+2377 2376 2404
+2158 2157 2192
+1858 1939 1859
+2194 2193 2242
+1387 1337 1260
+2446 2445 2492
+1985 1986 1854
+2376 2375 2403
+1796 1941 1861
+1715 1470 1469
+2053 1986 1985
+2053 2054 1986
+2092 2157 2158
+1387 1260 1386
+1327 1326 1375
+1385 1469 1386
+1470 1593 1471
+1987 1988 1935
+1471 1389 1388
+1855 1716 1715
+1338 1261 1260
+1719 1595 1663
+1394 1475 1476
+1262 1199 1261
+1472 1473 1390
+1390 1391 1262
+1471 1537 1472
+1724 1601 1723
+2097 1993 1992
+1993 1994 1861
+1265 1340 1266
+1863 1862 1995
+1994 2099 2061
+2447 2405 2446
+2324 2408 2409
+2407 2495 2448
+1402 1436 1403
+1151 1113 1150
+1871 1804 1870
+1108 1147 1148
+1271 1346 1272
+1267 1202 1201
+1342 1269 1341
+1262 1261 1389
+1395 1341 1268
+1205 1270 1206
+1398 1399 1346
+1269 1203 1268
+1395 1268 1267
+1108 1145 1146
+1344 1271 1270
+1203 1204 1201
+1209 1210 1144
+1401 1479 1480
+1272 1399 1400
+1274 1401 1275
+1276 1401 1402
+1484 1483 1609
+1150 1219 1151
+1283 1409 1347
+1148 1218 1278
+1484 1403 1483
+1115 1151 1152
+1115 1152 1054
+1407 1488 1489
+1222 1223 1154
+370 405 376
+1152 1281 1153
+1407 1408 1282
+1279 1278 1404
+1613 1487 1547
+1219 1220 1151
+1280 1221 1220
+1612 1611 1670
+1612 1671 1672
+1672 1613 1612
+1405 1485 1486
+1408 1407 1489
+1545 1611 1546
+1549 1548 1615
+1739 1740 1613
+1487 1614 1488
+4405 4404 4473
+1809 1740 1884
+1612 1670 1671
+1737 1610 1880
+1738 1672 1671
+1614 1673 1615
+1482 1543 1483
+1213 1214 1144
+1668 1607 1606
+1274 1400 1401
+1727 1726 1802
+1808 1878 1879
+1724 1602 1601
+1476 1603 1477
+1542 1608 1543
+1807 1878 1735
+1606 1667 1734
+1877 1876 1878
+1727 1603 1726
+1725 1724 1799
+1863 1995 1797
+1801 1867 1726
+1865 1800 1799
+1803 1870 1804
+1951 2000 2001
+1479 1730 1605
+1730 1874 1731
+1884 1885 1809
+1805 1874 1875
+1883 1738 1882
+1738 1670 1737
+5465 5466 5199
+5200 5075 5199
+5338 5339 5201
+4923 4862 4922
+5693 5694 5586
+5760 5818 5761
+5011 5010 5078
+5201 5076 5200
+6555 6554 6615
+6337 6122 6182
+5339 5340 5279
+5342 5407 5408
+5862 5920 5863
+5468 5338 5467
+5200 5199 5466
+5813 5812 5917
+5816 5759 5693
+6335 6336 6180
+6121 6122 6058
+7174 7037 7097
+6181 6278 6279
+5861 5917 5812
+7364 7365 7235
+7032 7033 6956
+5860 5915 5916
+6120 6119 6177
+6897 6840 6962
+6614 6472 6471
+5463 5687 5688
+6054 6055 5998
+4470 4402 4401
+5810 5809 5858
+6335 6473 6336
+5197 5198 5137
+5008 5074 4919
+3939 4063 4064
+4208 4657 4158
+4154 4155 4110
+4341 4400 4401
+4402 4342 4401
+4206 4280 4281
+4155 4205 4279
+4729 4728 4790
+4789 4788 4856
+3938 3937 3998
+4342 4279 4341
+4398 4339 4397
+4277 4204 4276
+4150 4058 4057
+4394 4395 4273
+4059 3937 4058
+4341 4278 4277
+4109 4060 4059
+4151 4150 4274
+4399 4398 4535
+4337 4396 4338
+4652 4651 4726
+4276 4339 4340
+4338 4397 4339
+4652 4788 4727
+4854 4911 4912
+4726 4787 4788
+4782 4783 4648
+5066 4913 5065
+4788 4787 4855
+5193 5134 5192
+5461 5460 5584
+6049 6174 6175
+5463 5464 5196
+6052 5996 5913
+5583 5641 5685
+7032 6956 6955
+4789 4856 4857
+4788 4855 4856
+4916 4861 4860
+4856 4913 4914
+5913 5914 5809
+5811 5812 5690
+6790 6730 6837
+6469 6175 6333
+6958 6895 6894
+6836 6835 6894
+8134 8133 8224
+8481 8480 8538
+7912 7766 7765
+7847 7914 7915
+8133 8028 8027
+7230 7231 7169
+7089 7090 7030
+7234 7093 7233
+7091 7090 7172
+7167 7228 7229
+7309 7308 7360
+7494 7495 7431
+7494 7430 7493
+7431 7359 7430
+7846 7910 7911
+7978 8024 8025
+8476 8534 8477
+7980 7913 8029
+7363 7362 7496
+7621 7694 7765
+8657 8658 8590
+8698 8746 8780
+8851 8891 8892
+8387 8477 8478
+8977 8948 8947
+8776 8743 8695
+8976 8977 8947
+8853 8893 8894
+10277 10276 10368
+8481 8482 8443
+8698 8659 8697
+8387 8478 8441
+8316 8385 8386
+8226 8183 8182
+8225 8182 8224
+8592 8593 8538
+8661 8660 8699
+8782 8981 8783
+9069 9170 9171
+8897 8984 8985
+8599 8598 8703
+8229 8139 8138
+8231 8035 8034
+8230 8034 8139
+7919 7850 7918
+7980 7915 7914
+8087 7980 8029
+8034 8033 8139
+7624 7695 7625
+7847 7913 7914
+7236 7237 7173
+7364 7235 7234
+7915 7916 7769
+7771 7695 7770
+7238 7237 7312
+6960 6961 6838
+7236 7173 7096
+7563 7625 7564
+7921 7920 8035
+8596 8392 8595
+7173 7237 7238
+8035 7920 8034
+7698 7628 7627
+7985 8035 8036
+8140 8232 8186
+8282 8233 8323
+8394 8230 8393
+7501 7502 7434
+9177 8984 8983
+8986 8898 8985
+8394 8322 8231
+8897 8787 8786
+8392 8484 8595
+10104 10187 10188
+9919 9741 9828
+9922 9921 9986
+9036 8985 9070
+9178 9125 9070
+8985 8898 8897
+9073 9037 8987
+8789 8748 8705
+10197 10260 10261
+9605 9665 9666
+9524 9525 9401
+9341 9279 9278
+10189 10188 10286
+10194 10256 10257
+9470 9524 9401
+9662 9603 9661
+9922 9923 9886
+9987 10029 9923
+9277 9276 9401
+9792 9743 9831
+9177 9178 9070
+9276 9277 9178
+9176 9175 9275
+9400 9401 9276
+9520 9519 9659
+10108 10107 10154
+9470 9523 9524
+9603 9524 9523
+9522 9603 9523
+9743 9742 9791
+10254 10290 10255
+10291 10348 10292
+10287 10344 10288
+10255 10256 10193
+10190 10252 10253
+10347 10290 10346
+10346 10442 10379
+10379 10444 10348
+10748 10747 10830
+10479 10478 10586
+10346 10379 10347
+10443 10444 10379
+10193 10256 10194
+10348 10347 10379
+10086 10085 10108
+10192 10254 10255
+10109 10155 10156
+10293 10381 10349
+10157 10156 10194
+10380 10292 10348
+10380 10480 10381
+10382 10381 10481
+12516 12517 12421
+12912 12819 12911
+12427 12428 12335
+12817 12619 12722
+12621 12724 12516
+12516 12515 12621
+12909 12816 12908
+12726 12914 12727
+12621 12620 12723
+12728 12626 12727
+12819 12621 12723
+13013 13112 13014
+12722 12618 12617
+13014 13112 13015
+13017 12914 12913
+12915 12729 12728
+12914 13017 13114
+13486 13308 13485
+12420 12334 12419
+12911 12818 12817
+13310 13200 13309
+13110 13204 13111
+13311 13406 13407
+11027 11026 11148
+12419 12514 12420
+12333 12418 12419
+13103 13104 12901
+12720 12719 12816
+12418 12332 12417
+12811 12718 12810
+12415 12414 12511
+12716 12512 12511
+12332 12415 12416
+12615 12418 12512
+12332 12416 12417
+12256 12255 12334
+12333 12419 12255
+12420 12186 12334
+10745 10892 10746
+12334 12186 12256
+10679 10744 10680
+10547 10482 10592
+10828 10829 10747
+10479 10443 10442
+10480 10545 10481
+10890 10891 10827
+12254 12332 12333
+11026 10976 11025
+11282 11353 11283
+11149 11027 11148
+11416 11488 11489
+11027 10891 10890
+11027 11150 10891
+10681 10746 10586
+12712 12808 12809
+13304 13305 12903
+12510 12414 12509
+12510 12511 12414
+12715 12716 12511
+13483 13482 13655
+13913 14022 13914
+13102 13302 13483
+12513 12717 12616
+12713 12614 12809
+12712 12809 12614
+11353 11352 11417
+11352 11280 11416
+11415 11554 11488
+11416 11489 11417
+13740 13741 13650
+11412 11413 11277
+10812 10877 10813
+11553 11677 11619
+12806 12901 12807
+11486 11549 11412
+10971 11021 10972
+11023 11094 11024
+11279 11415 11416
+11149 11148 11224
+11352 11416 11417
+10823 10888 10889
+11025 11148 11026
+11022 10974 10973
+10821 10887 10888
+11023 11024 10974
+11024 11147 11025
+10969 10968 11020
+10579 10673 10532
+10530 10531 10470
+10187 10186 10283
+10468 10467 10576
+10881 10882 10816
+10471 10532 10533
+10580 10674 10534
+10535 10581 10675
+10975 10974 11024
+10821 10675 10738
+10737 10580 10673
+10827 10891 10744
+10826 10743 10742
+10891 10892 10745
+10479 10586 10587
+10746 10892 10893
+10474 10539 10475
+10538 10537 10583
+10536 10535 10582
+10536 10537 10473
+10583 10539 10538
+9986 10028 10087
+10345 10377 10378
+10284 10341 10285
+10477 10543 10585
+9521 9660 9399
+10439 10476 10543
+10191 10153 10190
+8979 8980 8781
+9829 9742 9741
+10105 10189 10106
+9827 9659 9826
+9399 9522 9400
+9172 8980 8979
+10374 10473 10474
+10286 10342 10343
+10376 10375 10438
+10023 10185 10024
+10580 10533 10532
+10372 10281 10371
+10369 10368 10465
+9657 9395 9394
+10021 10020 10183
+9822 9823 9654
+9825 9826 9658
+9655 9393 9392
+9389 9168 9274
+11485 11547 11410
+10733 10814 10880
+10812 10731 10730
+10338 10339 10279
+10466 10467 10369
+10577 10668 10669
+10878 10965 10879
+10966 10967 10880
+11090 11143 11091
+11486 11351 11411
+11414 11553 11278
+10965 10966 10879
+10667 10731 10575
+10813 10879 10814
+10876 11016 10964
+10965 11018 10966
+10275 10180 10274
+9715 9645 9736
+11673 11734 11791
+10367 10366 10435
+11222 11221 11273
+11673 11791 11674
+11977 12037 11978
+11734 11790 11791
+11615 11616 11546
+11614 11672 11615
+11673 11616 11615
+9914 9883 9985
+10017 9916 10016
+9739 9740 9651
+10103 10181 10019
+10152 10101 10179
+9035 9067 9068
+9067 9169 9170
+9518 9517 9651
+9789 9788 9817
+9170 9169 9390
+9065 9064 9168
+9063 9124 9031
+9065 9032 9064
+9516 9602 9517
+9517 9518 9389
+9650 9718 9602
+9518 9652 9390
+9602 9601 9650
+9598 9599 9514
+9468 9514 9387
+9600 9649 9650
+9598 9648 9599
+9601 9602 9516
+9387 9273 9272
+8973 8935 8934
+9231 9230 9271
+9270 9269 9381
+9271 9339 9340
+9270 9229 9269
+9466 9465 9510
+9465 9381 9464
+9386 9468 9387
+9513 9597 9598
+9715 9648 9647
+9380 9463 9464
+9649 9716 9717
+9715 9647 9646
+10728 10665 10727
+11139 11218 11270
+11219 11271 11140
+11538 11268 11402
+11784 11669 11668
+11404 11271 11270
+11669 11541 11668
+11405 11273 11272
+11974 11973 12029
+11669 11670 11543
+12249 12176 12248
+11672 11673 11615
+9737 9788 9738
+9737 9736 9787
+11407 11274 11406
+9915 9914 9985
+9915 9819 9884
+11545 11484 11544
+11409 11350 11408
+10016 9916 9915
+11853 11790 11789
+11854 11909 11791
+11788 11852 11789
+11909 11978 11910
+12317 12494 12495
+12882 12694 12881
+12318 12408 12319
+12409 12410 12321
+11785 11851 11905
+12179 12322 12323
+11972 12028 11973
+11905 12033 11906
+11903 11902 11972
+12172 12314 12315
+11784 11668 11783
+11781 11780 11901
+12315 12407 12316
+12406 12405 12493
+12173 12109 12028
+12248 12175 12174
+11905 11975 12032
+12248 12176 12175
+13079 13080 12987
+12989 12990 12888
+12881 13076 12882
+12884 12987 12988
+13078 13079 12987
+12988 13081 13082
+13178 13076 13280
+13634 13633 13996
+13285 13182 13181
+13460 13280 13279
+13080 13180 13081
+13462 13546 13463
+13083 13181 13182
+13283 13282 13463
+12888 12889 12703
+12607 12496 12495
+13182 13183 12990
+13391 13285 13390
+13086 13085 13184
+13184 13288 13185
+13816 13638 13637
+13086 13184 13185
+12891 12890 12995
+12705 12704 12890
+13088 13089 12997
+13087 12993 13086
+12706 12705 12892
+12036 12037 11977
+12183 12184 12115
+12114 12040 12039
+12504 12503 12705
+12250 12178 12177
+12705 12503 12704
+12181 12113 12112
+12501 12324 12323
+12325 12326 12182
+12033 12178 12034
+12112 12113 12039
+12038 11978 12037
+11910 11792 11909
+12040 11979 12039
+11793 11735 11792
+12114 12113 12181
+12038 12037 12112
+12182 12114 12181
+11911 11912 11793
+12326 12503 12504
+11793 11912 11736
+11981 12041 12042
+12506 12411 12505
+12183 12115 12041
+12252 12253 12184
+12251 12329 12252
+12412 12331 12330
+12896 12895 13000
+12706 12505 12504
+13821 13737 13643
+12893 12706 12892
+12894 12804 12803
+12803 12707 12706
+13092 13000 13091
+13001 12896 13000
+13646 13647 13551
+12710 12709 12805
+13653 13652 13829
+13009 13102 13010
+13187 13096 13095
+14379 14380 14185
+13478 13652 13653
+13299 13193 13100
+13654 13829 14013
+14188 14187 14272
+13828 13910 14012
+14944 14943 15036
+14945 14946 14858
+14378 14379 14271
+15145 14949 14948
+14777 14950 14778
+14377 14476 14570
+14476 14376 14569
+14009 14097 14010
+14185 14380 14381
+13742 13828 13652
+15530 15428 15529
+14376 14270 14181
+15635 15636 15532
+15242 15139 15336
+15431 15337 15430
+14764 14854 14936
+15528 15527 15632
+14767 14766 14939
+14176 14370 14177
+14856 14857 14772
+14474 14374 14373
+13469 13643 13470
+14562 14561 14764
+14668 14669 14564
+14376 14375 14568
+14472 14473 14372
+14567 14673 14568
+13397 13293 13292
+13823 14007 14008
+13738 13646 13645
+14568 14375 14475
+14370 14371 14177
+13289 13467 13468
+13285 13286 13182
+13641 14003 14004
+14364 14170 14363
+14365 14364 14558
+14666 14562 14765
+14002 14001 14171
+13736 13818 13639
+13819 13818 14001
+13637 13546 13636
+14004 14176 14005
+13640 13818 13819
+13736 13638 13816
+13393 13394 13287
+13998 13815 13635
+13635 13462 13461
+13815 13816 13637
+13548 13464 13463
+13999 13998 14362
+13906 13818 13817
+14558 14364 14363
+14001 13906 14000
+14760 14761 14664
+14761 14853 14762
+14759 14931 14760
+14665 14560 14664
+14562 14764 14765
+15522 15420 15419
+14761 14760 14853
+15521 15522 15419
+15326 15422 15237
+15324 15419 15325
+15325 15421 15326
+15134 15035 15034
+15130 15032 15129
+14854 14935 14936
+14855 14765 14937
+14765 14764 14936
+14937 14765 14936
+14467 14468 14369
+15033 15132 14936
+14765 14766 14666
+15035 15135 15136
+14940 14939 15136
+15730 15729 15832
+15930 15832 15929
+15931 15930 16027
+16304 16497 16109
+15425 15426 15331
+15425 15526 15426
+15138 15137 15333
+15528 15427 15527
+15525 15425 15424
+15519 15723 15923
+15927 16025 15928
+15136 15240 15331
+15525 15726 15631
+15520 15519 15923
+16213 16212 16298
+15524 15926 15726
+16303 16304 15926
+15726 15927 15830
+15926 16109 15927
+16692 16794 16858
+16858 16946 17021
+17024 16859 16947
+16947 17022 17023
+16494 16601 16692
+16693 16860 16496
+17346 17509 17444
+17510 17511 17444
+17349 17187 17276
+17125 17022 17186
+17275 17348 17276
+17025 17188 17351
+17027 17028 16697
+16302 16496 16694
+16495 16693 16496
+15924 16302 15925
+17028 17027 17353
+16699 16499 16604
+16861 16698 16697
+16699 16604 16698
+18054 18262 18055
+16950 16949 17032
+16797 17031 16863
+16412 16504 16311
+16220 16310 16311
+16501 16500 16605
+15937 15938 15838
+16112 15933 15932
+16111 16028 16027
+15832 15729 15831
+15931 15833 15832
+15530 15531 15333
+15930 15931 15832
+15430 15533 15431
+15731 15732 15637
+15730 15833 15731
+15639 15735 15640
+15430 15429 15532
+15731 15636 15635
+15637 15732 15638
+15638 15733 15734
+15732 15933 15834
+15739 15738 15838
+16031 15936 16030
+15339 15142 15244
+15738 15539 15737
+15640 15735 15736
+15434 15341 15541
+15541 15341 15540
+15740 15642 15739
+15540 15539 15641
+15540 15643 15541
+15740 15839 15840
+16313 16121 16120
+15839 15838 15938
+16118 16117 16311
+16116 16219 16220
+16311 16117 16220
+15936 15837 15836
+16701 16702 16607
+16702 16703 16609
+16314 16121 16313
+16119 16118 16312
+16509 16508 16613
+16313 16120 16312
+16222 16221 16315
+16032 16033 15938
+16222 16122 16221
+15939 15839 15938
+16222 16315 16316
+16314 16414 16509
+16951 16952 16868
+16870 16954 16871
+16314 16509 16315
+16509 16706 16510
+16871 16709 16708
+17038 17037 17198
+16319 16126 16318
+15943 15944 15843
+16955 16875 16874
+16516 16619 16517
+15751 15946 15947
+16515 16711 16712
+16034 15944 15943
+15436 15437 15344
+15947 15946 16127
+15844 15748 15747
+15647 15747 15748
+16124 16125 16034
+15845 15749 15844
+15648 15647 15748
+15550 15750 15751
+15649 15749 15750
+15155 15156 15045
+15044 14959 14958
+15551 15550 15751
+15151 15348 15152
+15157 15353 15158
+15349 15153 15152
+15150 15248 15346
+15149 15148 15248
+15844 15843 15944
+15545 15437 15544
+15438 15439 15349
+15150 15149 15248
+15248 15345 15346
+15343 15342 15435
+14947 15038 15144
+15542 15645 15543
+15343 15435 15436
+15434 15541 15542
+14948 14949 14776
+14777 14778 14576
+15043 15042 15150
+15040 15147 15148
+14677 14676 14780
+15041 14951 15040
+14679 14579 14678
+14580 14579 14679
+14189 14274 14385
+14781 14782 14678
+14782 14679 14678
+14386 14190 14385
+13654 13655 13481
+13303 13104 13103
+13299 13480 13300
+13480 13653 13654
+14015 13656 13655
+14480 14479 14580
+14014 14382 14186
+14015 14188 14016
+14272 14383 14384
+14577 14778 14779
+14579 14578 14678
+14384 14576 14577
+14581 14682 14582
+14021 14194 14022
+13657 13830 13658
+14189 14016 14188
+13657 13658 13304
+13830 13831 13658
+13911 13833 14020
+13832 13831 14018
+14958 14866 14785
+14580 14478 14579
+14278 14194 14277
+14580 14680 14681
+14959 14867 14866
+14584 14787 14585
+14958 14785 14957
+14582 14483 14482
+14784 14785 14682
+14585 14787 14788
+15440 15350 15349
+14956 14783 14865
+15154 15153 15250
+14957 15152 15153
+15153 14958 14957
+15154 15155 15044
+14390 14484 14391
+14195 14022 14194
+14196 14280 14281
+14196 14195 14279
+14196 14104 14195
+14105 14025 13915
+13913 13912 14021
+14191 14102 14101
+14279 14195 14278
+14104 14022 14195
+13835 13661 13745
+13834 13743 13833
+13663 13557 13746
+14021 13911 14020
+13835 13836 13662
+13307 13196 13106
+13487 13557 13488
+13559 13558 13663
+13747 13664 13663
+13557 13486 13662
+13837 13746 13836
+13490 13560 13666
+13838 13747 13746
+13838 14025 13916
+13559 13665 13560
+13747 13839 13748
+13560 13490 13489
+13404 13310 13309
+13115 13211 13212
+13314 13207 13313
+13312 13204 13311
+13311 13203 13202
+13844 13845 13669
+13667 13666 13841
+13666 13840 13841
+14034 13846 13845
+14024 13915 13914
+13838 13746 13837
+13748 13839 13840
+13842 13919 13920
+14106 14198 14107
+14488 14588 14489
+13842 13921 13843
+14593 14592 14796
+13845 13670 13669
+13922 13921 14032
+14032 14031 14201
+14793 14869 14967
+14967 14966 15050
+15444 15354 15556
+15162 14968 14967
+14968 14793 14967
+14869 14965 14966
+14587 14488 14586
+14683 14790 14684
+15355 15444 15557
+14964 15048 14965
+14282 14198 14106
+14684 14588 14683
+14589 14791 14590
+14487 14393 14392
+14280 14279 14392
+14488 14487 14586
+14392 14391 14485
+14584 14583 14786
+14866 14958 14959
+15443 15555 15556
+15156 15253 15157
+14868 14959 14960
+15045 15156 15046
+15651 15755 15556
+14962 14963 14790
+15251 15252 15155
+15753 15752 15947
+15351 15551 15352
+15948 15947 16128
+15755 15651 15754
+15650 15553 15552
+15756 15652 15755
+15949 15948 16129
+16132 16323 16324
+16519 16417 16518
+14790 14963 14791
+16133 16325 16134
+15556 15652 15444
+15951 15952 15757
+15954 16037 15955
+15162 15163 14968
+15956 15847 15846
+15759 15758 15955
+16802 16720 16881
+16137 16037 16036
+15955 16037 16138
+15955 15758 15954
+14400 14594 14401
+14204 14036 14035
+14033 14397 14034
+14284 14285 14204
+13499 13411 13410
+12337 12338 12257
+14399 14400 14284
+14205 14036 14204
+13757 13756 13850
+13673 13672 13752
+14287 14402 14288
+13567 13676 13568
+14038 14039 13926
+14109 13760 13853
+15659 15767 15768
+14686 14687 14598
+13853 13677 13852
+13572 13679 13760
+13496 13495 13561
+13759 13758 13851
+13851 13758 13850
+13414 13500 13501
+13571 13572 13503
+12740 12822 12823
+13217 13126 13125
+13127 13020 12923
+13127 13325 13128
+12631 12632 12533
+12823 12923 12924
+12534 12533 12632
+12631 12739 12740
+13323 13417 13324
+12340 12529 12433
+12922 12921 13019
+13416 13503 13417
+13320 13121 13319
+13214 13124 13123
+13125 13019 12921
+12916 12729 12915
+13672 13671 13752
+12521 12729 12522
+12915 13115 13116
+12335 12425 12426
+12523 12729 12730
+12523 12730 12524
+12734 12735 12528
+12335 12428 12429
+12734 12920 12735
+11982 11855 11795
+10978 10895 11095
+12339 12431 12528
+12340 12432 12529
+10111 10088 10158
+9402 9341 9278
+10295 10261 10260
+9989 9926 9925
+10030 10089 10031
+10261 10198 10197
+9988 9745 10088
+10296 10198 10261
+9931 10034 10035
+10295 10296 10261
+10200 10299 10201
+10112 10113 10090
+10089 10112 10090
+9834 9888 9835
+9925 9887 9924
+9927 9928 9888
+10032 10090 10113
+9721 9746 9666
+10032 9990 9989
+10386 10385 10447
+9931 10035 9837
+10595 10596 10487
+10749 10831 10896
+10295 10351 10296
+10112 10200 10113
+10593 10594 10548
+10389 10388 10599
+11227 11287 11228
+10897 10750 10896
+11913 11983 11984
+12190 12189 12346
+11418 11354 11284
+12045 12119 12046
+12048 12049 11986
+12192 12122 12048
+11919 11682 11681
+11426 11294 11425
+11423 11357 11422
+11490 11556 11491
+11418 11419 11355
+11491 11492 11420
+11624 11623 11679
+10549 10595 10486
+10753 10898 10899
+9927 9991 9928
+9928 9992 9929
+10386 10486 10487
+10488 10388 10387
+10832 10754 10753
+10598 10756 10599
+10898 10753 10752
+10597 10598 10488
+11561 11562 11425
+11158 11033 11157
+10599 10600 10389
+10203 10035 10202
+9530 9531 9475
+9534 9409 9408
+10038 9840 9839
+9751 9794 9795
+9750 9749 9840
+9346 9347 9291
+10391 10204 10390
+10037 10036 10204
+10037 10038 9839
+9840 9932 9841
+11430 11685 11686
+10303 10302 10352
+11680 11681 11562
+10599 10901 10902
+11681 11682 11427
+11682 11683 11428
+11918 11919 11681
+12050 12124 12051
+12539 12538 12635
+11923 11685 11798
+10907 10906 11166
+12642 12543 12542
+12050 12051 11917
+12639 12747 12929
+12446 12355 12445
+12266 12198 12265
+12541 12542 12442
+12635 12538 12634
+12637 12638 12540
+12125 12052 12051
+12441 12442 12351
+12264 12198 12197
+12635 12636 12539
+12345 12346 12189
+12046 11984 12045
+12192 12047 12191
+12047 12046 12121
+12928 13023 13024
+12743 12536 12535
+12742 12926 12743
+13509 13331 13330
+13681 13682 13574
+13506 13507 13327
+14291 14209 13854
+13505 13506 13327
+13131 13130 13327
+13129 13326 13130
+13573 13680 13681
+13504 13418 13680
+14210 14111 14110
+14041 14112 14042
+14041 13928 13927
+13683 13506 13575
+14293 14211 14111
+14606 14605 14692
+14112 14041 14111
+14112 14113 14042
+13218 13219 13132
+13506 13505 13575
+13685 13508 13507
+13512 13421 13511
+14046 13860 13859
+13508 13330 13419
+14416 14415 14501
+14045 13934 14044
+14048 14047 14121
+14218 14217 14297
+13862 13688 13687
+12129 12202 12203
+12544 12444 12443
+13223 13335 13224
+12934 13136 12935
+13336 13137 13136
+12355 12356 12270
+12354 12266 12353
+11564 11625 11565
+12355 12268 12354
+11798 11922 11923
+12269 12200 12268
+11800 11686 11799
+11921 11920 12055
+12129 12057 12202
+11921 11684 11920
+12203 12204 12129
+12057 12128 12202
+12754 12755 12549
+12755 12830 12756
+12356 12546 12547
+12359 12358 12549
+12548 12358 12357
+12549 12550 12359
+11923 11922 11987
+11625 11688 11689
+12359 12550 12360
+11858 11800 11799
+12204 12359 12205
+11802 11803 11689
+13137 12936 12935
+12756 12936 12757
+12548 12754 12549
+12829 12935 12830
+12936 12756 12830
+12935 12829 12934
+13868 13867 13937
+13865 13935 14051
+13336 13514 13515
+13768 13867 13769
+13865 13864 13935
+12647 12550 12549
+12649 12756 12757
+12935 12936 12830
+12550 12649 12551
+12204 12358 12359
+12649 12648 12756
+13694 13869 14054
+13871 13870 14058
+12650 12551 12649
+13139 13138 13337
+13693 13515 13692
+14227 14228 14053
+12942 12941 13342
+13140 13141 12943
+15064 15063 15187
+15380 15265 15379
+11930 12066 11931
+13340 13695 13696
+12131 12208 12132
+12448 12551 12650
+12759 12552 12758
+13139 12936 13138
+11803 11804 11690
+11630 11692 11569
+12064 12065 11929
+12209 12208 12363
+12064 12132 12065
+12213 12067 12212
+11041 10979 11040
+11691 11742 11630
+10758 10908 10759
+11566 11626 11627
+11690 11628 11627
+11629 11568 11497
+11038 11167 10909
+11686 11685 11799
+11925 11859 11800
+11625 11626 11565
+11802 11861 11928
+12207 12208 12130
+12060 12061 11925
+12063 12130 12064
+11859 11739 11800
+11563 11564 11432
+11928 12064 11803
+11801 11739 11859
+10979 10910 11039
+10835 10762 10690
+10605 10490 10489
+10837 10910 10979
+10493 10609 10551
+10356 10308 10307
+10837 10763 10836
+11932 11809 11693
+11234 11302 11303
+11570 11693 11571
+11570 11569 11692
+11041 10911 10979
+10451 10497 10402
+11299 11233 11232
+11041 10980 10911
+10766 10765 10839
+9356 9300 9299
+9941 9999 10000
+10692 10764 10838
+10312 10402 10313
+10610 10694 10552
+9427 9200 9426
+9680 9553 9424
+9359 9301 9358
+9485 9419 9546
+9680 9679 9755
+9800 9846 9847
+10215 10216 10168
+9798 9844 9845
+10448 10355 10354
+10214 10215 10167
+10356 10309 10308
+10051 9946 10005
+10305 10213 10263
+10212 10262 10303
+10353 10354 10305
+10124 10050 10094
+9799 9898 9846
+10046 10047 10001
+10050 10095 10005
+10120 10092 10045
+9892 9935 9842
+9620 9676 9549
+9612 9543 9542
+10091 10044 10118
+10394 10208 10393
+10162 10211 10163
+10122 10093 10046
+10212 10163 10211
+10164 10093 10122
+10353 10305 10304
+10213 10164 10263
+11295 11434 11167
+10303 10396 10353
+10304 10303 10353
+10043 10117 10118
+11162 11163 10903
+10689 10690 10607
+10395 10352 10301
+10161 10119 10160
+10122 10162 10163
+10303 10352 10396
+10039 10038 10206
+10160 10118 10159
+10116 10207 10208
+10903 10904 10601
+11432 11295 11166
+10757 10605 10489
+11162 11428 11429
+11684 11921 11798
+10391 10602 10392
+10207 10116 10041
+10392 10603 10393
+11165 11431 11432
+10117 10043 10042
+10205 10204 10391
+10042 9936 10041
+10115 10206 10207
+10159 10117 10208
+10044 9998 9938
+10042 10043 9995
+9539 9540 9481
+9842 9841 9891
+9993 9934 9933
+9842 9797 9796
+9794 9750 9840
+9672 9535 9411
+9538 9537 9674
+9479 9478 9538
+9674 9537 9609
+9352 9353 9296
+9413 9348 9412
+9239 9190 9189
+9348 9349 9293
+9000 8999 9045
+8611 8666 8715
+8802 8860 8861
+8496 8495 8608
+9287 9238 9237
+8241 8242 8150
+7702 7703 7632
+8498 8548 8448
+8614 8613 8717
+8715 8799 8752
+8800 8799 8859
+9046 9000 9045
+8803 8861 8910
+9246 9245 9294
+8285 8332 8333
+8716 8612 8667
+8244 8245 8153
+8450 8408 8449
+8337 8336 8412
+8409 8333 8364
+8501 8500 8550
+8500 8449 8499
+8718 8804 8805
+8910 8958 8959
+9003 9002 9048
+9089 9192 9193
+8860 8909 8861
+9001 9046 9047
+8912 8960 9001
+9415 9353 9352
+9539 9481 9480
+9481 9482 9417
+9544 9484 9543
+9297 9355 9298
+9615 9545 9614
+9545 9615 9616
+10048 10047 10093
+9421 9420 9487
+10000 9999 10046
+9423 9303 9422
+8807 9005 8808
+9420 9358 9357
+9301 9300 9358
+9546 9618 9547
+9488 9422 9421
+9897 9943 9944
+9754 9755 9679
+9754 9679 9678
+9755 9801 9756
+9760 9853 9761
+9423 9422 9550
+9553 9682 9425
+9007 8810 8809
+9421 9359 9358
+9196 9303 9423
+9678 9552 9551
+9197 9196 9423
+9359 9302 9301
+8807 8620 8619
+8161 8160 8252
+8620 8621 8416
+9304 9201 9200
+8622 8809 8810
+8249 8340 8341
+8342 8415 8251
+8415 8414 8619
+8505 8504 8615
+8250 8342 8251
+8249 8248 8340
+8807 8808 8620
+9003 8913 9002
+9356 9299 9298
+9299 9249 9298
+9355 9356 9298
+9300 9194 9249
+9191 9247 9192
+9248 9193 9192
+9086 9085 9135
+8413 8412 8507
+8338 8291 8290
+8195 8250 8251
+8190 8247 8248
+8159 8096 8095
+8094 8049 8093
+8099 8052 8098
+7789 7790 7521
+8050 8096 8097
+8195 8158 8194
+8097 8159 8160
+8252 8416 8253
+8161 8099 8160
+8252 8251 8415
+7636 7521 7790
+8052 8099 8053
+7521 7263 7262
+8054 8162 8055
+7636 7790 7791
+7860 7861 7793
+7935 7856 7790
+7789 7933 7934
+7638 7639 7523
+7637 7638 7522
+7858 7792 7791
+7522 7263 7521
+7637 7522 7636
+7524 7575 7576
+6137 6136 6215
+6423 6501 6502
+6359 6285 6284
+6210 6133 6209
+6358 6359 6284
+5716 5608 5607
+5716 5836 5609
+6357 6499 6500
+6284 6210 6358
+7262 6990 6989
+6500 6501 6359
+6077 6076 6207
+6207 6206 6497
+5835 5836 5716
+5949 5873 5948
+5945 5944 6074
+6129 6128 6201
+6205 6356 6206
+5946 5945 6075
+6074 6205 6206
+6283 6351 6201
+6204 6205 6073
+5943 5942 6072
+6203 6353 6354
+6075 6074 6206
+6494 6420 6353
+8049 8048 8093
+7933 7788 8048
+8193 8157 8249
+8157 8048 8156
+8157 8093 8048
+8158 8094 8093
+8188 8154 8246
+8046 8047 7787
+7517 7518 7260
+6422 6421 6495
+6759 6499 6498
+6206 6356 6497
+7780 7855 7781
+7259 7260 6988
+8045 7786 7785
+7786 8046 7787
+8331 8332 8241
+8152 8243 8244
+7254 7322 7255
+7258 7516 7259
+6855 6905 6906
+7115 6984 6983
+6686 6687 6629
+6684 6626 6749
+6283 6350 6351
+6857 6906 6984
+6686 6752 6687
+6352 6202 6351
+6984 6906 6983
+6988 7260 6989
+5226 5225 5284
+5938 5867 5937
+6282 6198 6349
+6622 6561 6560
+6282 6199 6198
+5864 5936 5865
+6125 6124 6198
+5763 5709 5825
+6753 6752 6858
+6681 6748 6682
+6749 6854 6795
+6746 6747 6680
+6347 6489 6348
+5409 5351 5350
+6680 6623 6745
+6347 6346 6488
+6419 6561 6487
+6194 6344 6345
+6487 6623 6624
+5928 5927 6190
+6344 6419 6345
+7041 7042 6976
+6621 6485 6620
+6902 6903 6849
+6622 6623 6561
+6850 6744 6743
+6792 6745 6744
+7511 7512 7446
+7185 7253 7254
+6850 6743 6849
+7512 7380 7379
+7509 7508 7571
+7778 7777 7854
+7041 7110 7111
+7925 7854 7924
+8143 8038 8092
+7779 7701 7778
+7630 7629 7700
+7446 7512 7379
+7255 7256 7115
+7321 7253 7320
+6903 6978 6850
+7186 7113 7185
+6982 6983 6905
+7044 7113 7114
+7854 7925 7926
+8148 8239 8240
+6982 7114 6983
+7186 7255 7114
+8240 8149 8148
+7776 7777 7700
+8238 8329 8239
+7776 7852 7853
+8143 8144 8039
+7926 7927 7780
+8711 8606 8710
+9134 9133 9190
+8402 8494 8495
+8954 8906 8953
+8908 8857 8856
+8666 8610 8609
+9293 9294 9245
+8955 8907 8906
+9411 9345 9288
+9291 9292 9244
+9290 9242 9289
+9244 9293 9245
+9838 9671 9670
+9535 9749 9673
+8905 8995 8953
+9186 9185 9235
+9234 9283 9235
+9344 9410 9286
+9184 9185 9130
+9184 9235 9185
+9409 9284 9283
+9236 9186 9235
+9410 9409 9534
+9283 9234 9282
+9669 9608 9607
+9281 9343 9406
+9532 9477 9476
+9234 9235 9184
+9408 9283 9282
+9409 9344 9284
+8544 8605 8606
+8664 8601 8707
+8493 8606 8607
+8711 8794 8795
+8401 8447 8493
+8236 8143 8142
+8040 8144 8145
+7924 7854 7853
+7923 7987 8038
+8398 8488 8489
+8494 8401 8493
+8541 8488 8601
+8326 8327 8235
+8399 8325 8398
+8707 8791 8792
+8708 8792 8793
+8605 8710 8606
+8855 8793 8792
+9043 9078 9079
+8664 8708 8665
+8793 8710 8709
+8900 8901 8854
+8994 8993 9078
+9342 9405 9343
+9406 9474 9475
+9529 9606 9530
+9477 9533 9408
+9473 9474 9405
+9076 9280 9182
+9404 9473 9405
+9474 9406 9405
+9406 9407 9281
+8990 8989 9039
+9473 9528 9474
+9666 9667 9527
+9836 9931 9837
+9667 9528 9527
+9530 9607 9531
+9833 9887 9834
+9666 9747 9667
+9472 9527 9473
+8488 8446 8601
+7506 7437 7372
+6971 6740 6739
+7567 7503 7502
+7504 7436 7435
+7373 7438 7439
+7508 7509 7439
+7242 7315 7369
+7502 7503 7435
+7502 7435 7434
+7433 7434 7368
+7433 7501 7434
+7244 7373 7245
+7441 7509 7510
+6971 7040 7104
+7440 7374 7439
+7106 7180 7248
+7245 7102 7244
+7249 7108 7107
+7376 7444 7445
+7106 7107 6972
+7377 7248 7376
+7987 7923 7852
+7109 6974 6847
+6901 6902 6849
+7105 7179 7180
+7317 7316 7378
+7316 7249 7248
+7179 7105 7178
+6481 6738 6739
+6970 7040 6971
+6482 6739 6740
+6846 6969 6970
+6484 6741 6742
+6849 6743 6620
+6483 6484 6192
+6620 6485 6342
+6190 6482 6191
+5706 5594 5705
+6482 6483 6191
+6417 6485 6559
+6557 6558 6476
+6477 6619 6478
+7368 7314 7367
+7040 7102 7103
+6966 7039 7100
+7243 7371 7372
+6899 6965 6900
+6475 6415 6183
+6281 6340 6185
+6478 6736 6479
+5819 5818 5921
+5819 5921 5922
+6185 6341 6186
+5644 5589 5588
+5924 6186 6187
+5348 5475 5476
+5696 5762 5697
+5696 5697 5644
+5590 5472 5589
+5408 5473 5344
+5701 5925 5926
+5471 5589 5472
+5472 5408 5407
+5145 5084 5144
+4796 5079 4864
+5473 5345 5344
+5475 5699 5700
+5344 5205 5204
+5083 5143 5144
+5207 5208 5143
+5147 5211 5212
+5205 5206 5141
+4604 4605 4540
+4927 4926 5014
+4926 4925 5013
+4068 4112 4113
+4864 5079 4925
+4927 5014 5015
+5015 4928 4927
+5474 5699 5475
+5215 5214 5353
+5345 5206 5205
+5210 5349 5211
+5345 5474 5346
+5474 5473 5698
+5590 5698 5473
+5820 5762 5819
+5926 5702 5701
+5480 5481 5354
+5350 5351 5282
+5479 5592 5702
+5357 5483 5358
+5088 5089 4932
+5089 5216 5217
+5087 5149 5215
+5214 5213 5352
+5358 5359 5221
+4608 4668 4609
+5089 5217 5090
+5219 5091 5090
+5704 5593 5481
+5355 5481 5482
+5358 5483 5484
+5596 5822 5707
+5221 5359 5360
+5596 5707 5597
+5823 5933 5934
+5825 5709 5824
+4288 4414 4167
+5596 5595 5706
+5219 5220 5091
+5219 5357 5358
+5358 5221 5220
+4412 4350 4349
+5092 4936 4935
+5221 5222 4937
+4669 4807 4670
+4808 4937 4671
+5221 4937 4936
+4416 4673 4674
+4552 4671 4553
+4478 4551 4479
+4549 4609 4550
+4078 4012 4077
+4935 4934 5091
+4669 4551 4550
+4346 4408 4347
+4476 4477 4408
+4933 4934 4871
+5091 5220 5092
+4606 4607 4546
+4871 4934 4805
+4802 4932 4869
+4930 5017 5087
+4734 4800 4661
+4734 4799 4800
+4607 4606 4665
+4010 4075 3948
+4348 4408 4409
+2661 2696 2662
+2715 2766 2663
+2661 2695 2713
+3142 3141 3181
+4116 4117 4076
+2696 2742 2714
+4217 4165 4164
+4288 4413 4414
+4117 4165 4166
+4673 4672 4938
+4077 4076 4117
+4011 4077 4012
+3578 3525 3577
+3679 3578 3577
+1814 1894 1749
+2386 2387 2332
+2112 2166 2113
+1753 2012 2013
+2270 2308 2271
+2117 2012 2116
+1507 1751 1752
+2111 2110 2165
+2114 2011 2068
+2114 2068 2113
+2111 2068 2010
+2114 2167 2115
+1897 1751 1896
+2068 2112 2113
+2626 2625 2661
+2566 2591 2535
+2591 2566 2590
+3180 3141 3140
+2306 2327 2268
+2010 2067 2111
+2010 1958 2009
+1895 1957 1958
+2008 1958 1957
+1743 1620 1676
+2450 2478 2451
+2109 2198 2199
+2109 2108 2198
+2106 2004 2065
+2660 2695 2661
+2246 2245 2306
+2269 2329 2330
+2306 2384 2327
+1886 1811 1742
+2626 2590 2625
+2535 2534 2566
+2450 2434 2411
+4070 4162 4071
+3579 3527 3578
+3676 3724 3725
+2248 2267 2268
+4540 4605 4541
+4160 4210 4211
+4405 4473 4542
+4472 4471 4540
+4604 4659 4660
+4282 4343 4344
+4403 4472 4404
+4160 4159 4210
+3942 4005 4069
+3773 3851 3774
+3846 3891 3892
+3944 3943 4070
+4005 3941 4004
+3811 3848 3771
+3892 3893 3847
+3944 3945 3849
+1742 1811 1743
+1887 1953 1888
+1414 1413 1496
+1120 1229 1160
+1619 1675 1676
+1619 1676 1558
+1889 1888 1954
+2105 1952 1886
+1888 1953 1954
+2002 1953 1952
+2105 2064 2002
+2006 2108 2109
+2002 2003 1953
+2064 2105 2065
+1621 1744 1622
+1889 2004 1890
+1742 1743 1676
+1743 1887 1888
+1743 1888 1744
+1743 1811 1887
+1497 1415 1414
+1157 1286 1287
+1119 1229 1120
+1118 1061 1117
+1228 1227 1289
+747 712 746
+1226 1225 1288
+988 952 903
+985 984 1031
+900 985 986
+1061 1062 1033
+1227 1226 1288
+1557 1618 1619
+1558 1496 1619
+1554 1493 1439
+1558 1497 1496
+562 563 551
+1492 1553 1554
+1441 1556 1495
+1616 1617 1553
+1158 1225 1226
+1495 1556 1557
+985 1059 1032
+983 984 948
+899 984 985
+983 1057 1058
+1059 985 1031
+985 900 899
+1033 987 986
+981 1030 982
+948 984 899
+1347 1284 1283
+1283 1282 1409
+820 821 801
+869 948 899
+519 550 551
+709 820 742
+428 411 436
+472 592 483
+1033 986 1061
+520 511 510
+483 592 509
+519 551 520
+474 440 439
+561 592 593
+356 355 370
+1283 1284 1223
+564 552 563
+593 592 608
+551 521 520
+522 553 523
+711 745 746
+521 563 552
+743 759 760
+523 567 524
+652 674 675
+824 899 900
+824 870 899
+872 900 949
+564 553 552
+512 487 486
+568 524 567
+442 416 415
+377 357 376
+484 483 509
+349 356 318
+414 440 441
+415 441 442
+437 436 473
+377 371 357
+319 318 356
+290 289 309
+309 289 308
+284 283 290
+308 319 309
+245 307 283
+307 289 283
+283 258 245
+255 245 258
+285 259 284
+255 258 259
+350 358 359
+243 218 242
+261 247 260
+221 222 197
+243 244 219
+121 120 132
+186 195 187
+195 186 194
+185 193 194
+194 186 185
+195 220 221
+408 421 383
+249 221 220
+360 359 378
+487 475 486
+432 433 420
+381 361 322
+488 442 441
+417 416 442
+443 489 490
+493 527 572
+614 615 570
+771 770 832
+653 677 678
+676 614 675
+829 828 904
+1063 1064 988
+716 830 767
+958 995 959
+994 995 958
+1034 1122 1065
+956 905 991
+828 829 765
+567 612 613
+712 748 713
+672 665 671
+673 713 674
+805 765 748
+673 674 652
+713 765 714
+827 805 764
+1288 1414 1415
+747 764 748
+953 952 988
+1298 1167 1297
+1415 1416 1289
+988 1034 989
+994 1068 995
+990 955 954
+1620 1621 1497
+1504 1444 1503
+1420 1443 1502
+1502 1560 1444
+1890 1891 1745
+1812 1745 1891
+1622 1745 1623
+1744 1890 1745
+1745 1812 1746
+1813 1955 1893
+1812 1747 1746
+1892 1891 1955
+1892 1747 1812
+1749 1678 1748
+2270 2330 2308
+2331 2386 2332
+2536 2663 2664
+1753 2013 1754
+2274 2206 2205
+2121 2208 2169
+2337 2275 2336
+2336 2206 2335
+2744 2771 2772
+2336 2457 2337
+2596 2597 2542
+2593 2538 2665
+2543 2520 2542
+2668 2627 2667
+2597 2598 2567
+2568 2567 2598
+2339 2280 2279
+2506 2548 2549
+2207 2336 2275
+2335 2418 2455
+2419 2339 2338
+2171 2210 2124
+2169 2209 2170
+2210 2280 2211
+2121 2122 2017
+2018 2125 2019
+2017 2069 2018
+2122 2170 2123
+1759 1635 1634
+840 916 1003
+1633 1513 1632
+1562 1511 1630
+1632 1513 1564
+1006 963 919
+1302 1509 1303
+919 918 1005
+1074 1002 1001
+841 919 920
+1512 1423 1511
+912 1072 999
+1754 1755 1510
+1629 1511 1510
+1074 1001 1073
+680 617 679
+1001 960 1000
+915 961 962
+1070 997 1035
+959 909 958
+450 449 529
+325 385 362
+774 682 773
+960 1001 961
+616 617 529
+299 328 267
+383 384 324
+222 262 263
+448 385 384
+385 449 386
+382 383 361
+444 433 432
+261 293 322
+197 166 165
+69 59 89
+1049 1048 1100
+89 90 69
+69 90 91
+89 99 90
+98 117 121
+310 325 326
+327 386 328
+227 214 226
+199 169 198
+61 72 73
+123 100 122
+63 74 64
+102 123 134
+44 45 33
+4 18 19
+46 45 76
+43 42 64
+269 227 268
+226 212 225
+330 270 269
+268 251 267
+268 328 329
+298 286 297
+682 681 773
+1003 1075 917
+876 915 877
+962 1002 916
+960 961 915
+1001 1002 962
+620 619 682
+838 876 877
+964 1038 965
+1039 1040 966
+1125 1080 1079
+1308 1307 1515
+1009 965 1038
+1079 1080 1039
+918 1004 1005
+1306 1305 1513
+1078 1169 1170
+1078 1079 1038
+777 776 841
+776 917 918
+172 171 229
+171 136 170
+49 48 80
+77 76 104
+106 80 105
+79 48 47
+532 533 453
+575 576 539
+920 921 842
+920 964 921
+228 269 229
+334 393 394
+34 35 16
+41 40 56
+37 50 51
+20 19 48
+270 331 332
+334 394 335
+921 966 922
+926 971 1013
+391 331 390
+687 624 686
+969 1011 1012
+1040 1080 1126
+843 922 923
+1010 1081 968
+923 1011 924
+845 806 780
+967 966 1040
+921 965 966
+1011 1081 1173
+1080 1125 1171
+925 969 970
+968 1081 1011
+1082 1173 1309
+1126 1080 1171
+2281 2212 2341
+2344 2390 2423
+2344 2310 2282
+2343 2421 2390
+2461 2460 2506
+2677 2639 2676
+1081 1126 1172
+1036 1037 1008
+1172 1126 1171
+1081 1040 1126
+1306 1307 1169
+1515 1760 1516
+1514 1635 1515
+1172 1308 1173
+1077 1078 1036
+1125 1079 1078
+1631 1899 1757
+2019 2020 1760
+2018 2019 1900
+2211 2280 2340
+2212 2213 2021
+2021 1761 2020
+2844 2911 2779
+2577 2550 2549
+2343 2342 2420
+2505 2548 2506
+2549 2576 2603
+2546 2505 2504
+2842 2843 2778
+2573 2574 2547
+2674 2633 2673
+2575 2548 2574
+2675 2603 2635
+2603 2576 2635
+2550 2638 2605
+2640 2641 2606
+2635 2674 2675
+2677 2726 2678
+2462 2550 2507
+2577 2603 2636
+2464 2507 2551
+2550 2604 2638
+2551 2605 2640
+2507 2550 2605
+2639 2640 2605
+2551 2552 2508
+2912 2940 2913
+2915 2914 2982
+2939 2912 2938
+2913 2979 2980
+2911 2937 2938
+2976 2936 2975
+2937 2976 2938
+3067 3066 3152
+2977 2939 2938
+2977 2978 2939
+3281 3325 3405
+2972 3007 2973
+3242 3243 3149
+3495 3532 3533
+3436 3405 3404
+3786 3965 3787
+3065 3150 3151
+3063 3007 3062
+3012 3011 3065
+2977 2938 2976
+3010 3011 2976
+3011 3012 2976
+2873 2908 2909
+2932 2973 2974
+3010 3009 3064
+2970 3004 2971
+2935 2975 2936
+3064 3065 3010
+3591 3492 3590
+3591 3493 3492
+2873 2872 2908
+2906 2928 2929
+3008 2974 3007
+2932 2908 2931
+2930 2907 2929
+2869 2905 2906
+2933 2909 2932
+2777 2841 2842
+2934 2935 2910
+2975 3009 3010
+2870 2907 2841
+2671 2599 2670
+2722 2671 2670
+2505 2547 2548
+2722 2749 2775
+2870 2840 2869
+2722 2775 2723
+2542 2567 2543
+2806 2747 2805
+2902 2968 2969
+2899 3054 3055
+3146 3145 3241
+2904 2867 2903
+3778 3732 3777
+2806 2774 2747
+2628 2596 2595
+2836 2835 2864
+2901 2835 2834
+2746 2773 2805
+2667 2627 2594
+2664 2663 2766
+2591 2626 2662
+2716 2665 2768
+2389 2417 2334
+2766 2898 2767
+3055 3238 3239
+2836 2804 2835
+2697 2718 2667
+2773 2804 2805
+2773 2772 2804
+3730 3896 3813
+3731 3777 3685
+3582 3489 3488
+3949 3896 3730
+3949 3950 3896
+3776 3813 3777
+3730 3776 3731
+3854 3897 3855
+3778 3777 3814
+3854 3896 3897
+3280 3322 3235
+3238 3399 3239
+3490 3491 3396
+3685 3582 3684
+3436 3493 3437
+3055 2900 2899
+3950 3949 4012
+4083 4082 4172
+3054 3237 3238
+4171 4082 3955
+4944 5019 4874
+4682 4426 4681
+5548 5547 5605
+4560 4680 4561
+4944 4873 4943
+5366 5229 5365
+4351 4420 4290
+5233 5099 5232
+5365 5364 5411
+4676 4814 4677
+4417 4416 4674
+4419 4480 4420
+3952 3951 4079
+4288 4166 4287
+3856 3855 3899
+3898 3897 3950
+5093 5225 5226
+5598 5597 5707
+5362 5489 5363
+5489 5544 5490
+5228 5229 5096
+4942 4813 4812
+5602 5361 5488
+6071 6130 6203
+5487 5598 5599
+5763 5825 5864
+5600 5599 5645
+5647 5710 5765
+6067 6126 6200
+5765 5826 5866
+5864 5826 5763
+5764 5763 5826
+5711 5766 5712
+5603 5604 5544
+5491 5546 5492
+5491 5364 5490
+5284 5362 5363
+5286 5364 5227
+5363 5490 5364
+5546 5545 5652
+5941 6003 6071
+6076 5946 6075
+5831 5830 5869
+5945 5946 5832
+5771 5833 5834
+5548 5496 5495
+5833 5832 5946
+5418 5493 5494
+5236 5499 5500
+5232 5231 5289
+5830 5767 5829
+5370 5495 5419
+5494 5547 5495
+4946 4817 4816
+4677 4557 4556
+4555 4556 4420
+4086 4087 3961
+4816 4945 5099
+4874 5019 4945
+3860 3903 3861
+4085 4084 4173
+4085 4173 4174
+4678 4557 4816
+5101 4818 4946
+4946 5099 5100
+4819 4679 4818
+4557 4421 4556
+4680 4559 4679
+4422 4421 4557
+4296 4175 4219
+4353 4219 4295
+3784 3962 3963
+4296 4219 4353
+5238 4951 5237
+4177 4427 4428
+4685 4684 4952
+4949 4950 4683
+4820 4561 4680
+5371 5496 5372
+4818 4679 4817
+5234 4947 5101
+4948 4681 4820
+5770 5769 5833
+4947 5235 4948
+5497 5372 5607
+5837 5838 5717
+5499 5235 5498
+7118 7187 7188
+7266 7265 7383
+7525 7578 7526
+6770 6798 6771
+6862 6861 6995
+6762 6501 6761
+6862 6765 6861
+6635 6501 6762
+7116 7265 7266
+7121 7189 7269
+6635 6502 6501
+6503 6426 6425
+6424 6423 6502
+6290 6291 6219
+6084 5954 6083
+5723 5957 5958
+4683 4684 4429
+6289 6290 6219
+6222 6293 6366
+6765 6766 6691
+6291 6363 6220
+6909 6910 6864
+6868 6911 7001
+6768 6769 6694
+5502 5503 5240
+4563 4562 4688
+6430 6506 6507
+5726 5725 5960
+6366 6293 6428
+6643 6698 6644
+6770 6771 6695
+7000 6865 6999
+6997 7049 6998
+7528 7527 7580
+7121 7120 7189
+6909 6998 6910
+7047 7046 7120
+7047 7048 6997
+7122 7123 7051
+7384 7267 7383
+7270 7271 7190
+7000 6911 6866
+7386 7529 7530
+7190 7123 7270
+7648 7714 7586
+7274 7192 7126
+7529 7585 7530
+7388 7389 7273
+7125 7001 7000
+6912 6913 6870
+7002 7126 7127
+7273 7274 7125
+7001 6911 7000
+7125 7274 7126
+8064 7995 8063
+7004 7003 7128
+7275 7274 7389
+7007 7006 7131
+7277 7278 7129
+7009 7052 7010
+6871 6915 6916
+7392 7536 7393
+6647 6648 6579
+7275 7276 7193
+7392 7325 7278
+7003 7004 6914
+7130 7278 7279
+6799 6800 6772
+6916 7004 7005
+6652 6515 6651
+7005 7129 7130
+6651 6515 6514
+6227 6514 6515
+5956 5957 5722
+6643 6510 6576
+6866 6867 6800
+6645 6577 6644
+6572 6571 6641
+6799 6696 6771
+6573 6508 6572
+6508 6431 6507
+6431 6430 6507
+4953 4954 4686
+5506 5242 5505
+4181 4221 4222
+4432 4687 4562
+3908 3907 3970
+4222 4221 4300
+4563 4435 4434
+4484 4565 4485
+4435 4482 4483
+4356 4435 4436
+4488 4567 4568
+4690 4566 4565
+4485 4566 4486
+4567 4690 4691
+3974 3870 3909
+3816 3792 3815
+4435 4483 4436
+4483 4565 4484
+3736 3792 3737
+3736 3791 3792
+3795 3869 3870
+3247 3282 3248
+3330 3251 3329
+3192 3161 3191
+2687 2579 2617
+3194 3193 3252
+3796 3795 3871
+3193 3163 3192
+3253 3195 3252
+2617 2616 2687
+2786 2731 2751
+3501 3500 3597
+3159 3191 3160
+3251 3250 3329
+3192 3163 3162
+3407 3408 3327
+3102 3189 3157
+3327 3283 3326
+3158 3249 3159
+3407 3441 3408
+3328 3250 3284
+2511 2559 2560
+2916 2846 2915
+2846 2783 2782
+2847 2848 2783
+2784 2684 2783
+2617 2559 2616
+2984 2941 2916
+2874 2848 2847
+3157 3190 3158
+3155 3156 3101
+3406 3187 3439
+3245 3281 3152
+4089 4179 4180
+4686 4687 4431
+3690 3733 3691
+3864 3863 3967
+3155 3100 3186
+2978 2940 2939
+3689 3787 3788
+3690 3691 3633
+4685 4430 4429
+3967 3968 3904
+4950 4951 4684
+5238 4952 4951
+4176 4177 3963
+4178 4429 4179
+3531 3592 3593
+3786 3590 3785
+3594 3631 3595
+3070 3016 3069
+2914 2915 2782
+3018 2982 3071
+2781 2782 2728
+2782 2683 2682
+2678 2679 2643
+2978 2979 2940
+2781 2728 2680
+2781 2914 2782
+2347 2284 2283
+2436 2422 2421
+2508 2465 2425
+2465 2508 2553
+2466 2350 2427
+2127 2128 2024
+2681 2680 2728
+2608 2553 2607
+2682 2681 2728
+2427 2426 2465
+2782 2783 2683
+2509 2465 2553
+2555 2611 2556
+2750 2785 2786
+2352 2468 2469
+2683 2783 2684
+2221 2028 2220
+2467 2351 2350
+2129 2025 2128
+2216 2172 2215
+2510 2468 2557
+2352 2290 2351
+2288 2219 2130
+1903 1904 1815
+2218 2288 2130
+885 929 1016
+2220 2219 2290
+2026 1906 1905
+2130 2026 1905
+1520 1639 1640
+1310 1311 1084
+1522 1314 1521
+1765 1766 1638
+1818 1906 1767
+2024 2025 1904
+1637 1638 1519
+2126 2023 1901
+2128 2025 2024
+2215 2284 2285
+2173 2129 2128
+1310 1518 1311
+1637 1765 1638
+1014 927 972
+782 848 809
+1013 1012 1082
+1016 1017 930
+807 881 847
+972 927 881
+1014 1015 928
+721 782 722
+929 885 849
+886 850 885
+536 535 623
+723 783 850
+457 538 458
+808 847 882
+457 456 537
+627 600 599
+53 52 82
+51 50 81
+8 9 1
+26 27 14
+66 65 85
+83 82 109
+65 58 57
+273 334 335
+460 459 540
+143 125 124
+108 52 51
+234 275 276
+395 394 459
+84 65 55
+84 111 85
+41 57 58
+56 65 57
+41 68 31
+109 141 142
+144 126 125
+94 114 95
+113 125 114
+629 628 692
+733 732 791
+852 811 810
+934 933 1086
+629 692 655
+812 785 811
+852 810 851
+811 785 810
+933 890 932
+725 692 691
+858 857 934
+728 729 705
+856 815 814
+707 753 732
+790 791 753
+935 936 792
+630 694 656
+706 730 731
+579 601 580
+707 695 731
+579 630 601
+693 692 727
+462 496 478
+495 542 496
+156 149 155
+126 144 145
+496 497 478
+497 513 498
+149 146 155
+130 128 129
+497 498 478
+500 583 545
+160 156 180
+145 144 179
+337 338 276
+257 282 288
+116 115 118
+115 114 126
+237 252 238
+181 160 180
+208 190 207
+205 181 188
+400 399 465
+583 657 634
+464 398 463
+346 353 354
+658 634 699
+583 500 544
+633 697 657
+698 697 735
+341 300 340
+583 544 633
+1088 1089 936
+1529 1528 1568
+1177 1235 1317
+1128 1177 1129
+1093 1130 1094
+794 816 795
+1128 1176 1177
+1913 1821 1912
+1819 1771 1770
+1772 1771 1819
+2032 1961 1912
+1909 1819 1770
+2032 1912 1960
+1088 1174 1089
+1644 1680 1773
+1642 1679 1643
+1820 1912 1773
+1642 1641 1770
+2027 1907 2026
+1174 1088 1315
+934 935 858
+1768 2027 1769
+2221 2220 2353
+1960 1910 2030
+1820 1772 1910
+2031 2030 2070
+2029 1908 2028
+2471 2470 2479
+2428 2353 2469
+2510 2469 2468
+2470 2428 2469
+2557 2614 2558
+2616 2648 2686
+2612 2683 2684
+2783 2848 2784
+2510 2558 2559
+2686 2685 2730
+2616 2559 2578
+2480 2513 2522
+2479 2512 2513
+2428 2470 2471
+2311 2355 2294
+2131 2029 2222
+2474 2475 2439
+2174 2070 2131
+2438 2393 2430
+4564 4481 4563
+4693 4611 4610
+3200 3199 3255
+3598 3409 3501
+3977 4027 4028
+3972 3973 3909
+3795 3796 3600
+4691 4568 4567
+4026 4093 4027
+4692 4569 4568
+3975 3976 3871
+3872 3977 3978
+3975 4024 3976
+3257 3286 3258
+2394 2316 2359
+3255 3254 3333
+3410 3409 3599
+3415 3442 3416
+3334 3285 3256
+2357 2432 2358
+2257 2258 2225
+2226 2227 2177
+2297 2296 2315
+2257 2296 2297
+2035 1964 1963
+1915 1777 1823
+1914 1823 1962
+1179 1320 1180
+1322 1181 1237
+798 799 757
+1095 1044 1131
+1023 941 974
+1236 1178 1092
+1426 1526 1527
+1684 1649 1648
+1445 1428 1427
+2431 2432 2357
+2033 2071 1913
+2359 2315 2358
+2315 2316 2297
+737 708 736
+754 735 793
+892 941 861
+667 702 703
+1181 1096 1180
+797 862 798
+863 942 943
+1045 1044 1095
+637 636 644
+585 584 604
+701 666 700
+435 470 471
+636 605 635
+501 500 545
+545 514 501
+516 504 547
+301 280 279
+287 303 304
+425 424 467
+303 342 343
+468 467 481
+466 467 424
+502 501 514
+402 403 366
+343 313 304
+401 425 402
+352 313 344
+482 470 469
+374 369 368
+374 367 404
+469 470 427
+435 471 374
+663 640 606
+481 467 504
+945 979 980
+945 980 946
+664 640 663
+588 547 587
+662 667 668
+658 644 635
+1026 1046 1096
+1095 1180 1096
+798 863 864
+942 1025 976
+1047 1027 978
+944 945 864
+3797 3602 3601
+3602 3697 3503
+3979 3980 3873
+3796 3871 3976
+741 703 702
+1824 1915 1964
+3415 3357 3356
+1028 980 979
+741 800 703
+800 741 758
+894 895 866
+639 606 588
+345 353 346
+369 471 348
+353 368 354
+316 347 317
+507 549 508
+590 640 641
+591 641 646
+663 668 669
+549 590 591
+640 559 589
+865 866 819
+3259 3258 3286
+3413 3412 3502
+3636 3604 3635
+3603 3503 3697
+3503 3504 3442
+3604 3416 3504
+3635 3604 3603
+4029 4093 4030
+3635 3699 3636
+3911 3876 3817
+3800 3699 3698
+4228 4227 4308
+3699 3800 3738
+4313 4237 4312
+1531 1447 1446
+4314 4448 4449
+4242 4451 4498
+4239 4314 4240
+4316 4363 4242
+4361 4305 4360
+4963 4964 4698
+4310 4311 4233
+4701 4966 4967
+4224 4223 4306
+4309 4310 4231
+4439 4494 4495
+5102 4968 4967
+4304 4357 4358
+4307 4306 4444
+4572 4696 4573
+4492 4438 4491
+4572 4695 4696
+4304 4359 4305
+4442 4577 4578
+4444 4700 4445
+4574 4697 4575
+5513 5514 5251
+4573 4696 4574
+4696 4697 4574
+4493 4494 4438
+4442 4359 4358
+4692 4691 4821
+4961 5248 4962
+4493 4573 4574
+5728 5509 5727
+4495 4575 4576
+4696 4961 4962
+4444 4306 4361
+4963 4697 4962
+4441 4496 4442
+4444 4699 4700
+4445 4700 4701
+4699 4964 4700
+4615 4498 4581
+4497 4451 4450
+4824 4875 4825
+4825 4706 4743
+4580 4450 4449
+4742 4704 4824
+4580 4705 4581
+4704 4705 4580
+4966 4700 4965
+4704 4579 4703
+4969 4968 5104
+4969 5020 4970
+5104 4968 5103
+5105 5104 5151
+4966 4701 4700
+5375 5254 5374
+5255 5256 5102
+6241 6140 6089
+4971 4875 4970
+6296 6295 6390
+6296 6241 6295
+5422 5843 5375
+5374 5420 5421
+6010 5972 6089
+6239 6139 6238
+6708 6707 6780
+6709 6782 6710
+6663 6708 6664
+6782 6709 6781
+6594 6532 6531
+6388 6534 6535
+6435 6436 6379
+6780 6707 6706
+6385 6236 6384
+5737 5969 5970
+6534 6533 6665
+6088 5971 6087
+5841 5970 6087
+6089 6140 6090
+5618 5653 5739
+5971 6088 5972
+5736 5840 5969
+5549 5422 5518
+5737 5841 5738
+5841 5971 5842
+5839 5968 5840
+5737 5736 5969
+6592 6528 6527
+6523 6524 6434
+5967 6086 5968
+6382 6383 6235
+6232 5967 5966
+6233 5967 6232
+4695 4961 4696
+5734 5733 5839
+4695 4822 4960
+6377 6376 6522
+5962 5728 5727
+6651 6514 6650
+5730 5731 5511
+5242 4955 4954
+4961 5247 5248
+6229 6228 6373
+5727 5726 5961
+6518 6373 6517
+6521 6432 6520
+5964 5963 6230
+5963 6228 6229
+6526 6380 6436
+6515 6653 6516
+6517 6228 6372
+6581 6517 6516
+6373 6228 6517
+6519 6520 6432
+6878 6804 6803
+7059 7058 7140
+6662 6778 6779
+6805 6804 6878
+7018 6932 7061
+6706 6707 6663
+7202 7144 7143
+6779 6815 6706
+7291 7333 7407
+7289 7288 7404
+7332 7406 7333
+7403 7287 7330
+7548 7594 7670
+7198 7287 7199
+7287 7403 7288
+7143 7142 7200
+7017 7061 6932
+7143 7144 7018
+7017 6878 6877
+7139 7197 7140
+6875 6876 6802
+7009 7010 6923
+6925 7010 7011
+7283 7284 7137
+7013 7053 7054
+6931 7016 6877
+7057 7056 7138
+7053 6929 7012
+7059 7141 7060
+7198 7199 7142
+7327 7281 7326
+8074 7962 8001
+7394 7132 7279
+7448 7539 7587
+7136 7053 7135
+7540 7588 7541
+7393 7537 7394
+7397 7448 7398
+7811 7956 7812
+7727 7813 7814
+7816 7961 7817
+7541 7399 7398
+7286 7196 7285
+7668 7592 7667
+7542 7543 7449
+7286 7330 7197
+7664 7590 7543
+7545 7592 7452
+7546 7592 7593
+7591 7666 7667
+7547 7593 7594
+7667 7666 7731
+7593 7668 7594
+7822 7882 7823
+7671 7733 7819
+8348 8297 8272
+7672 7734 7673
+7467 7411 7466
+7674 7673 7735
+7461 7552 7462
+7465 7410 7464
+7146 7292 7147
+7457 7407 7406
+6814 6886 6779
+6882 6936 6883
+7144 7203 7204
+7063 7146 7064
+7410 7334 7463
+7293 7206 7205
+7334 7409 7463
+7409 7334 7292
+7298 7211 7210
+7337 7296 7295
+7150 7149 7297
+7208 7207 7294
+7338 7297 7296
+7151 7066 7150
+7152 7022 7066
+6596 6595 6666
+7024 7023 7068
+6538 6537 6596
+7023 7067 7153
+7023 7022 7067
+7214 7154 7068
+4706 4615 4705
+7414 7415 7340
+7337 7336 7411
+7467 7466 7553
+7469 7555 7470
+7822 7738 7737
+7466 7465 7553
+7469 7412 7468
+7467 7553 7554
+8460 8459 8525
+8525 8570 8571
+8517 8518 8435
+8646 8564 8563
+8523 8522 8566
+7740 7824 7741
+7734 7735 7673
+7735 7820 7821
+8300 8349 8350
+8436 8351 8368
+7736 7881 7822
+7551 7458 7550
+8436 8435 8453
+8434 8433 8452
+8560 8561 8520
+8521 8458 8457
+8563 8562 8645
+8519 8455 8454
+8569 8524 8568
+8646 8563 8645
+8644 8676 8645
+8565 8566 8522
+8676 8646 8645
+9220 9321 9446
+9779 9579 9703
+9223 9224 9155
+9780 9877 9707
+9781 9708 9585
+9632 9633 9583
+9814 9880 9881
+9326 9325 9450
+9366 9451 9328
+9262 9327 9328
+9729 9708 9782
+9586 9585 9708
+10078 9978 10013
+9454 9453 9498
+9877 9781 9707
+9912 9881 9982
+9912 9882 9881
+9785 9814 9786
+9733 9786 9815
+9732 9785 9733
+10083 9982 10082
+10151 10084 10150
+10151 9984 10084
+10272 10249 10248
+10150 10083 10149
+9815 9786 9814
+9879 9783 9878
+10516 10562 10457
+10177 10247 10248
+10523 10649 10650
+10434 10365 10433
+10249 10178 10248
+10364 10328 10427
+10941 10856 10940
+10330 10428 10429
+10327 10363 10270
+10430 10330 10429
+9879 9981 9880
+10244 10080 10148
+10238 10422 10423
+10424 10423 10639
+11198 11197 11241
+10329 10271 10364
+10243 10242 10270
+10363 10425 10426
+10937 10638 10637
+10242 10176 10241
+10144 10241 10145
+10517 10458 10427
+10427 10363 10426
+10073 10074 9972
+9449 9579 9580
+10078 10077 10099
+10013 9977 10076
+10078 10013 10077
+9876 9705 9704
+9878 9782 9781
+9729 9709 9635
+9974 9911 9910
+9877 9978 9979
+9708 9781 9782
+9706 9633 9632
+8829 8830 8757
+8868 8827 8826
+8828 8757 8731
+9701 9775 9702
+9221 9222 9151
+9220 9446 9447
+9777 9577 9702
+9701 9702 9575
+9873 9972 9973
+9572 9571 9700
+9871 9970 9775
+9969 10072 9970
+10792 10707 10791
+9776 9872 9777
+9971 10073 9972
+10420 10236 10235
+10633 10706 10707
+9775 9701 9871
+10235 10419 10420
+9145 9104 9144
+9968 9870 10071
+9445 9571 9572
+9446 9575 9447
+9697 9868 9698
+9967 10071 9870
+9443 9699 9444
+9870 9968 9871
+10232 10233 10140
+10512 10561 10513
+10142 10069 10141
+9774 9697 9696
+9965 9868 10069
+9869 9699 9698
+9443 9444 9318
+9444 9571 9445
+9147 9216 9217
+9318 9444 9319
+8866 8867 8824
+8514 8638 8515
+9144 9214 9215
+8753 8824 8754
+8823 8927 8866
+8726 8753 8670
+8263 8343 8264
+8168 8169 8102
+8640 8554 8639
+8512 8553 8451
+8552 8635 8636
+8295 8345 8346
+8430 8515 8431
+8269 8295 8346
+8514 8513 8637
+8431 8346 8345
+8638 8671 8729
+8639 8554 8515
+8517 8557 8558
+8639 8730 8640
+8732 8733 8673
+8758 8733 8732
+8518 8453 8435
+8558 8673 8642
+8642 8559 8518
+8555 8516 8554
+8556 8517 8452
+8346 8431 8365
+8516 8452 8432
+8075 8004 8003
+8266 8292 8344
+8271 8201 8200
+8300 8301 8276
+8273 8203 8272
+8276 8204 8275
+8003 8004 7965
+8367 8348 8347
+7817 7730 7664
+7590 7544 7543
+8105 8072 8170
+8292 8264 8343
+8076 8075 8077
+8170 8171 8105
+8170 8197 8171
+8069 8100 8101
+8070 8000 7959
+7816 7817 7664
+7590 7664 7665
+7662 7661 7728
+7727 7726 7813
+7877 7729 7815
+7657 7812 7658
+7538 7657 7658
+7658 7812 7726
+7814 7959 7815
+7812 7813 7726
+7956 7955 7996
+7812 7874 7813
+8071 8000 8070
+8634 8724 8725
+8633 8668 8723
+9023 9022 9053
+8822 8924 8925
+8925 8924 8967
+8634 8510 8724
+8509 8551 8633
+7997 7956 8066
+7872 7954 7809
+7998 7997 8067
+8511 8510 8634
+8668 8631 8722
+9310 9435 9360
+9254 9211 9210
+9052 9021 9103
+9102 9020 9019
+9206 9309 9207
+8922 9020 8966
+8815 8627 8814
+9100 9141 9209
+9050 9099 9051
+9098 9140 9099
+7865 7720 7803
+7868 7867 7949
+8427 8426 8510
+8919 8920 8819
+8821 8723 8722
+8631 8551 8508
+7537 7657 7538
+7656 7537 7536
+7722 7723 7655
+7953 7871 7995
+7956 7811 7873
+7655 7656 7536
+7652 7533 7532
+7864 7803 7802
+8060 8259 8061
+7803 7720 7719
+7651 7719 7720
+7651 7718 7719
+7646 7645 7711
+7798 7944 7799
+7712 7713 7647
+7650 7717 7718
+7945 8060 7946
+7650 7651 7532
+7643 7580 7579
+7387 7530 7531
+7707 7861 7794
+7641 7578 7577
+7528 7581 7582
+7798 7799 7711
+7941 7794 7940
+7939 7938 8055
+7646 7711 7712
+7644 7643 7797
+7646 7712 7647
+7711 7799 7712
+8258 8257 8422
+8626 8813 8814
+7795 7941 7942
+8056 8055 8253
+7942 7943 7796
+7942 8057 7943
+9012 9011 9093
+8811 8623 8810
+9011 9201 9093
+9431 9492 9559
+9305 9250 9202
+9202 9201 9305
+9012 8814 9011
+8624 8625 8420
+8627 8422 8626
+8624 8419 8623
+8259 8422 8423
+8421 8626 8422
+9096 9014 9013
+8423 8422 8627
+9096 9095 9137
+9251 9250 9306
+9098 9049 9097
+9137 9205 9206
+9430 9306 9305
+9203 9012 9093
+9559 9432 9431
+9307 9204 9252
+9762 9804 9763
+9856 9857 9805
+9250 9305 9306
+9426 9200 9199
+9686 9763 9764
+9806 9857 9807
+9556 9428 9555
+10052 10129 10053
+9555 9428 9427
+9758 9757 9850
+9555 9427 9554
+9304 9200 9427
+9683 9554 9426
+9683 9426 9682
+9847 9899 9900
+9803 9804 9762
+9903 9904 9855
+9958 9957 10009
+10219 10220 10055
+10404 10403 10498
+10400 10449 10401
+9952 9953 9853
+10055 10056 10006
+10057 10131 10058
+10495 10494 10552
+10495 10611 10496
+10311 10400 10219
+10401 10402 10312
+10768 10611 10767
+10406 10405 10452
+10314 10313 10404
+10402 10497 10403
+10057 10221 10131
+10220 10312 10313
+9859 9959 9960
+10502 10556 10503
+10268 10226 10225
+10362 10361 10409
+10779 10923 10780
+10066 10231 10067
+10098 10064 10097
+10098 10065 10064
+10229 10411 10412
+10320 10410 10411
+9812 9770 9769
+9865 9813 9864
+9690 9625 9563
+9434 9310 9207
+9863 9864 9812
+9771 9772 9727
+9624 9562 9689
+9137 9206 9138
+9688 9562 9561
+9434 9563 9435
+9563 9625 9564
+9436 9311 9360
+9254 9210 9312
+9360 9435 9493
+9493 9564 9494
+9724 9769 9770
+9209 9310 9311
+9206 9139 9138
+9360 9493 9436
+9691 9725 9726
+9258 9317 9214
+9496 9568 9439
+9364 9442 9365
+9697 9569 9631
+9314 9441 9364
+9440 9497 9441
+9443 9442 9570
+9441 9569 9570
+9497 9439 9568
+10232 10231 10323
+9812 9864 9813
+9627 9628 9565
+9695 9694 9728
+9630 9631 9568
+9812 9813 9770
+9726 9727 9692
+10229 10228 10320
+10508 10507 10558
+10629 10628 10701
+10416 10415 10509
+10700 10628 10699
+10701 10702 10629
+10323 10414 10415
+10930 10929 11061
+10506 10412 10624
+10783 10852 10927
+10700 10785 10786
+10699 10784 10785
+10629 10510 10628
+11185 11058 11057
+11061 11187 11188
+12226 11954 11953
+11371 11370 11457
+11454 11589 11590
+11458 11457 11512
+11510 11591 11592
+11060 11059 11113
+11318 11317 11369
+11240 11186 11185
+10625 10626 10558
+11059 10928 10927
+10929 10785 10784
+11052 11179 11180
+11045 11046 10917
+11706 11707 11589
+11700 11582 11581
+12223 11950 12222
+11455 11591 11510
+11953 12225 12226
+11506 11507 11449
+11704 11639 11638
+11507 11450 11449
+11584 11585 11506
+11640 11586 11585
+10778 10922 10779
+11051 10920 11050
+11055 10985 11054
+11108 11181 11109
+11314 11368 11453
+11185 11111 11058
+10784 10783 10928
+10624 10780 10781
+10412 10411 10623
+10362 10318 10361
+10985 11055 11056
+10927 10928 10783
+10557 10556 10619
+11049 10984 11048
+10845 10774 10773
+10845 10918 10919
+10619 10775 10698
+10774 10845 10919
+11307 11306 11444
+10616 10554 10553
+10405 10500 10452
+10616 10695 10696
+10766 10694 10610
+10982 10981 11043
+10767 10841 10768
+11574 11441 11573
+10918 10983 10984
+11106 11105 11176
+12218 12372 12373
+11236 11173 11235
+11937 11696 11864
+10770 10916 11045
+11104 11103 11174
+11935 11864 11863
+11935 11934 12068
+11580 11581 11446
+11309 11177 11308
+11583 11637 11584
+11633 11577 11632
+11310 11448 11449
+11178 11179 11051
+11699 11700 11581
+11446 11445 11504
+11822 11873 11874
+11507 11585 11508
+11748 11702 11701
+11584 11638 11639
+12277 12278 12217
+11946 11996 12077
+11815 11698 11814
+12761 12831 12832
+12653 12764 12765
+13142 13143 12944
+13521 13583 13522
+12450 12559 12560
+12364 12214 12069
+11940 11993 11941
+12213 12364 12069
+13140 13516 13344
+13422 13519 13423
+12215 12216 12071
+12276 12215 12275
+12067 11934 11933
+13700 13516 13699
+13517 13518 13422
+13700 13517 13516
+13581 13518 13517
+13771 13772 13702
+13703 13582 13581
+14060 14230 14231
+14434 14433 14517
+13871 13938 13872
+13938 14059 13939
+14059 14230 14060
+14064 14063 14234
+14060 13874 13873
+14631 14516 14630
+14632 14633 14518
+14518 14517 14632
+14516 14631 14517
+14065 14235 14236
+14433 14516 14517
+13879 14065 14066
+13877 13772 13771
+13706 13583 13705
+13704 13582 13703
+13879 13878 14065
+13879 13705 13704
+14519 14633 14634
+15067 14999 15192
+13523 13583 13706
+13705 13879 13706
+13349 13424 13523
+13347 13143 13226
+13350 13349 13524
+12945 12944 13143
+12949 12950 12564
+12653 12562 12561
+12944 12945 12831
+12766 12947 12948
+13144 13145 12946
+13351 13350 13708
+12450 12560 12451
+12653 12765 12562
+12562 12372 12453
+12276 12367 12368
+12219 12373 12374
+12072 12216 12217
+11817 11818 11746
+11700 11701 11582
+11699 11581 11580
+11941 12073 11942
+11867 11943 11944
+12074 12073 12133
+12568 12225 12224
+12077 12078 11946
+11870 11869 11946
+11994 11995 11942
+12222 12079 12221
+11948 11872 11947
+12226 12225 12569
+11953 11708 11707
+12952 13355 12953
+11824 11951 11706
+12952 12953 12567
+12954 12569 12568
+13713 13356 13712
+12955 12569 12954
+13353 13711 13354
+14441 14440 14829
+14444 14240 14239
+13356 12953 13355
+13524 13707 13350
+14070 14071 13710
+14833 14636 14832
+14238 14066 14237
+12950 12949 13352
+13708 14068 14069
+13714 13357 13713
+14444 14833 14834
+14074 14239 14240
+13716 13880 13881
+14075 14242 14076
+13425 13525 13526
+14311 14241 14240
+14311 14444 14445
+14076 14077 13945
+14315 14243 14314
+14077 13946 13945
+13719 13774 13775
+14077 14126 13946
+14315 14126 14243
+13885 13884 13951
+13883 13882 13948
+13777 13887 13778
+13777 13721 13776
+13775 13884 13885
+13883 13950 13884
+13777 13886 13887
+13884 13950 13951
+13776 13775 13885
+13527 13426 13362
+13776 13720 13775
+13234 13156 13155
+13153 13152 13232
+13529 13427 13528
+12964 13033 13034
+13227 13148 13359
+12575 12576 12381
+12768 12959 12960
+13153 13232 13233
+12768 12575 12767
+13362 13426 13363
+13717 13882 13718
+13947 13948 13882
+13883 13774 13882
+13946 13881 13945
+13946 13947 13881
+13425 13229 13360
+13358 12956 13357
+13150 13229 13361
+13150 13149 13229
+11758 11717 11831
+11955 11954 12227
+11826 11827 11756
+11958 11999 11959
+12376 12228 12571
+12081 12135 12082
+11594 11460 11459
+11512 11511 11592
+11592 11593 11512
+11594 11459 11593
+11825 11709 11954
+11710 11594 11709
+11709 11594 11593
+11711 11756 11712
+11371 11457 11458
+11596 11711 11712
+11459 11321 11320
+11595 11594 11710
+11190 11461 11462
+10633 10513 10632
+11958 11998 11999
+10790 10706 10705
+10791 10933 10792
+11757 11756 11827
+11193 10935 11192
+10636 10637 10421
+10935 10934 11192
+10634 10419 10514
+11322 11194 11193
+10938 11195 10939
+11465 11466 11322
+10939 11196 11062
+11465 11322 11464
+11463 11191 11462
+11466 11194 11322
+11464 11463 11716
+12281 12380 12282
+11831 11716 11961
+12080 11956 12228
+12082 11999 11998
+11829 11830 11714
+12234 12141 12140
+13149 13150 12958
+11997 12080 12081
+12085 11960 12084
+12083 12082 12136
+12283 12236 12381
+11875 11832 11831
+10858 10944 10859
+10986 11062 11063
+10799 10711 10798
+10458 10428 10364
+10987 10941 10986
+11195 11194 11466
+10796 10795 10939
+10457 10426 10425
+10987 10942 10941
+10517 10427 10457
+10708 10641 10640
+10517 10642 10563
+10640 10515 10794
+10076 10144 10099
+10708 10640 10795
+10515 10516 10425
+10641 10562 10640
+10642 10796 10709
+10645 10564 10644
+10518 10428 10458
+10990 10945 10859
+10521 10460 10520
+10948 11069 10949
+10647 10432 10431
+10564 10645 10565
+10247 10177 10150
+10799 10646 10711
+10646 10800 10647
+10950 11070 11071
+10649 10523 10433
+10247 10432 10331
+11065 11064 11199
+19005 18734 19004
+10951 10992 11073
+11070 11069 11203
+10801 10650 10649
+11065 10945 11064
+11073 10992 11072
+10649 10949 10801
+11070 11204 11071
+11200 11199 11242
+11069 11202 11203
+18205 18438 18439
+11072 11071 11204
+11245 11206 11205
+11205 11204 11332
+11725 11764 11726
+11842 11766 11841
+19790 19456 19583
+11332 11333 11245
+19183 19003 19002
+11473 11204 11203
+11878 11966 11879
+10940 10796 10939
+11373 11326 11325
+10947 10800 10946
+11518 11605 11644
+11601 11468 11323
+11469 11373 11372
+11599 11600 11466
+11062 11197 11114
+11600 11721 11467
+11833 11759 11719
+11836 11877 11965
+11721 11836 11722
+12578 12577 12770
+11602 11601 11722
+11601 11467 11721
+11836 11760 11877
+12239 12238 12383
+11877 12089 11965
+11963 11876 11833
+12284 12239 12384
+12090 12089 12238
+13722 13778 13723
+13778 13589 13723
+12962 12770 12576
+13429 13369 13368
+12771 12578 12770
+12142 12091 12090
+12090 11965 12089
+11965 12090 12001
+11966 12001 12091
+11966 11878 12001
+19283 18986 19162
+11837 11722 11836
+13033 13157 13236
+11881 11841 11880
+18439 18440 18205
+11376 11476 11245
+18900 18899 18995
+18340 18341 18196
+18897 18991 19166
+19171 18900 19170
+18615 18616 18439
+18728 18902 18616
+18203 18609 18430
+18437 18901 18615
+18902 19175 19176
+18907 18734 18733
+19162 18893 18985
+19160 18983 18889
+18608 18429 18341
+18726 18432 18895
+18727 18613 18612
+18341 18429 18342
+19457 19456 19790
+18893 18724 18985
+18719 18885 18981
+18724 18609 18723
+18606 18885 18607
+19787 20118 20119
+18719 18720 18608
+18338 18605 18606
+18198 18341 18342
+18335 18188 18419
+18610 18431 18430
+18895 18432 18611
+18195 18340 18196
+18428 18338 18191
+18337 18428 18190
+19443 19444 19272
+19447 19778 19448
+21531 21346 21530
+19151 19448 19276
+19778 19449 19448
+20106 19914 20105
+19274 19446 19275
+19150 19275 19447
+18877 18977 18878
+18877 19147 18977
+18716 18417 18596
+18716 18877 18878
+18876 18976 18877
+20104 20427 20241
+19147 19443 19272
+20699 20106 20428
+19149 19274 19275
+19776 19775 20108
+20110 20431 20432
+20241 20105 20104
+19914 19772 20104
+20961 20962 20701
+19775 19776 19446
+21227 20958 21226
+20693 20694 20103
+20958 21227 20959
+21231 21345 21062
+20961 21229 21230
+20963 21062 21063
+18599 18419 18718
+18334 18333 18419
+19449 19779 19780
+20543 20243 20704
+18186 18185 18333
+18419 18188 18187
+18424 18336 18423
+18336 18601 18423
+18419 18598 18718
+18892 18723 18891
+19283 19284 19163
+18988 18611 18725
+19161 18983 19280
+19160 18888 19279
+19280 19160 19279
+18721 18888 18722
+19280 18983 19160
+18721 18342 18429
+18982 19159 19457
+18981 19158 19277
+20709 20441 20440
+18601 18422 18600
+20709 20708 20970
+19278 19159 18981
+21527 21228 21526
+21228 20960 20699
+21527 21229 20960
+21344 21345 21231
+21345 21529 21530
+19459 19458 19791
+21531 21347 21346
+21543 21799 21800
+19456 19159 19278
+19158 19157 19454
+19456 19455 19583
+19455 19454 19789
+19584 19457 19790
+19279 19458 19459
+19459 19460 19279
+19281 19461 19162
+19285 19467 19286
+19286 19468 19171
+18998 19174 18902
+19172 18997 18901
+19285 19170 19466
+19798 19799 19468
+19796 19465 19795
+19587 19470 19469
+19926 19799 19925
+19174 18998 19173
+19469 19586 19587
+19806 19594 19805
+19478 19291 19477
+19296 19481 19594
+20251 20137 20456
+19804 19478 19803
+19291 19292 19178
+19182 19001 19181
+20455 20250 19931
+19471 19288 19173
+19288 19473 19174
+19173 18997 19172
+18728 18615 18901
+19289 19176 19175
+19805 19593 19592
+19475 19290 19474
+19475 19476 19177
+19182 19181 19296
+19179 19292 19479
+20140 19934 20139
+19819 19601 19818
+19602 19821 19489
+19949 20145 19950
+4615 4581 4705
+19603 19489 19821
+19822 19604 19603
+19488 19489 19302
+19302 19303 19305
+19597 19812 19813
+19817 19948 19949
+19297 19298 19182
+19934 19933 20139
+19596 19812 19597
+19942 20144 19943
+19936 19808 19807
+19809 19810 19299
+19943 19944 19598
+20557 20253 20463
+20467 20262 20261
+19951 19820 19488
+19951 20147 20259
+20999 21265 21357
+20259 20260 20148
+19952 19820 20148
+19822 19953 20151
+22099 22323 21884
+19947 19946 20464
+19950 20146 19819
+19939 19940 19596
+20143 19941 19940
+20464 20726 20797
+20990 21078 20991
+20140 20141 19936
+19812 19941 19813
+20993 20724 21079
+20145 20254 20255
+21085 21263 21264
+20459 20720 20460
+19808 20142 19809
+19940 19939 20462
+21079 21259 21260
+20135 20136 19929
+20990 21076 21077
+20720 20792 20988
+20991 20992 20722
+20558 20253 20557
+20995 21080 21081
+20464 19948 19947
+20797 20726 20725
+20261 20466 20467
+20799 20800 20727
+20727 20800 20998
+22095 21644 21812
+20466 20465 20729
+20560 20727 20728
+21090 21089 21269
+22323 22099 22169
+21268 21360 21361
+21087 21088 20802
+21267 20802 21001
+22322 22380 22381
+20998 20800 20799
+21812 21881 22094
+20999 20729 20728
+21268 21089 21088
+21359 21267 21569
+22097 22168 22320
+22381 22169 22322
+21814 21645 21883
+21359 21569 21650
+21001 20802 20801
+22169 22097 22321
+22168 22319 22320
+21357 21566 21567
+21566 21356 21565
+21567 21358 21357
+21569 21816 21649
+22166 22318 22093
+21882 22096 22168
+22167 22095 22094
+21565 21813 21566
+22168 22096 22095
+22168 22097 21882
+23534 23383 23781
+21262 21562 21263
+23141 23383 23191
+22092 22093 21881
+21642 21881 21812
+22093 22094 21881
+20458 20138 20457
+22086 22310 22311
+21085 20799 20997
+21263 21083 21262
+21265 21264 21564
+21643 21642 21812
+20558 20724 20993
+20724 20795 21079
+21558 21255 21557
+21808 22087 21880
+20992 21259 20795
+21560 21260 21259
+20713 21067 20982
+20982 20983 20714
+21066 20981 21246
+20128 19799 19798
+21247 21248 21067
+21248 21552 21249
+21552 21553 21353
+22308 22160 22085
+22308 22569 22309
+22084 22306 22307
+21247 21551 21248
+22306 22305 22567
+20125 19923 20124
+21798 22069 22070
+21877 21799 22073
+23186 23185 23350
+23348 22955 23347
+23417 23522 23418
+21350 21237 21539
+20965 20705 20704
+18604 18337 18427
+21350 21351 21238
+21238 21352 21239
+20445 20125 20124
+21543 21800 21544
+20965 21065 20790
+19453 19153 19452
+20790 20705 20965
+20964 21064 20965
+21793 21637 21792
+21529 21344 21343
+20544 20434 20705
+19152 19450 19451
+21236 21538 21539
+21246 21550 21551
+20981 21067 20713
+20456 20455 20551
+21071 20791 21070
+20983 20715 20714
+20450 20247 20129
+20452 20133 20132
+19592 19591 20137
+20458 20552 20459
+19806 19805 19932
+20251 20457 20138
+19295 19294 19481
+20251 20138 19932
+19472 19288 19471
+19932 20137 20251
+19932 19805 20137
+20129 20128 20450
+19797 19585 19467
+20545 20708 20709
+19789 19790 19583
+21875 21792 21874
+21638 21348 21532
+20114 20113 20243
+20114 19921 20113
+18713 18594 18869
+19269 19441 19442
+18974 18973 19144
+19144 19267 19145
+18974 18870 18973
+18867 18710 18866
+19438 19769 19439
+17639 17768 17640
+18872 18595 18871
+18974 19144 19145
+18866 18969 18970
+19434 19139 19262
+19575 19260 19431
+17765 17939 17825
+18970 18971 18866
+19570 19571 19569
+19572 19430 19571
+19759 19907 19572
+20951 20950 21061
+19141 19436 19437
+19139 18969 19138
+20097 20098 19761
+19431 19430 19574
+19906 19758 19757
+20095 19907 19759
+19571 19759 19572
+20421 20949 20692
+20948 21216 21057
+23342 23416 23516
+19574 19760 19761
+20096 20095 20421
+19910 19764 19909
+19576 19432 19763
+21519 21520 21221
+20696 20958 20697
+19909 19764 19576
+19434 19433 19764
+21223 21224 20954
+20696 20697 20426
+20424 20693 20103
+19266 19144 18973
+20956 20695 20694
+20426 20427 20104
+21225 20957 20956
+21226 20958 20957
+20693 20953 20954
+22539 22055 22054
+21341 21340 21523
+21521 21520 21785
+21340 21522 21523
+21784 21519 21783
+22050 22291 22292
+22052 22294 22053
+21523 21635 21786
+22052 21784 22051
+22952 23118 23119
+23117 23344 23345
+22540 22055 22539
+23118 23345 23119
+22948 22535 22734
+23741 23740 24138
+22540 22539 22954
+23346 23742 23347
+23115 23184 23116
+23517 23739 23740
+23183 23114 23113
+22536 22537 22293
+22735 22736 22536
+23184 23344 23116
+23183 23113 23112
+23020 23115 23116
+22949 23020 22950
+22943 23337 23109
+23342 23517 23343
+23343 23184 23114
+23734 24133 24134
+23576 23738 23515
+23111 22947 23110
+23341 23416 23182
+23414 23513 23339
+23513 23575 23737
+23112 23111 23182
+23181 23340 23341
+21782 22290 22050
+21516 20947 21215
+22292 22291 22535
+22051 21783 22050
+21519 21782 21783
+22290 22291 22050
+21518 21782 21220
+20948 20691 20947
+21220 21219 21518
+21060 21059 21218
+20417 20687 20418
+23504 23505 23413
+20945 21056 20946
+20937 20938 20678
+22734 22733 22947
+22042 21777 21511
+21777 21872 21778
+21777 21210 21511
+22049 21518 21517
+21780 21781 21514
+22941 23335 23336
+24135 24134 24540
+22728 22727 22789
+23510 23920 23733
+23414 23338 23511
+22946 23110 22947
+23334 22939 22938
+23101 23102 22934
+22531 22289 22530
+22287 22043 22042
+22154 22043 22287
+23108 23335 22941
+22937 22938 22527
+21053 20937 21052
+23729 23504 23728
+23328 23175 23327
+23504 23413 23330
+23106 22937 22936
+23728 23574 23727
+23328 23502 23503
+23501 23327 23500
+23501 23502 23327
+23178 23104 23329
+22934 23102 23103
+23177 23104 23103
+21777 22042 22043
+23178 23105 23104
+23331 23413 23332
+23105 22936 22935
+23508 23333 23507
+21209 21510 21511
+22726 22939 22940
+21206 21335 21507
+22524 22523 22724
+21506 21776 21507
+21510 22041 22042
+20936 20935 21051
+21334 21506 21204
+20083 20082 20413
+20680 20413 20082
+19258 19424 19425
+20414 20538 20415
+20686 20943 20944
+21210 20942 21511
+20940 20681 20939
+20942 20787 20941
+21056 21213 21339
+21777 21778 21512
+21514 21214 21339
+21054 21212 21213
+21513 21339 21338
+20419 20092 20091
+20945 21055 21056
+21211 20943 21210
+21056 21339 21214
+20942 20943 20685
+21337 21512 21513
+20420 20093 20690
+19904 19756 19755
+20417 20418 20240
+20685 20787 20942
+20094 20093 20420
+20690 20419 20689
+19758 19569 19757
+19756 20093 19905
+19757 19568 19905
+19136 18965 18859
+19137 19428 19429
+19749 19899 19750
+19429 19564 19565
+19898 19747 20084
+19745 19746 19563
+19563 19425 19562
+20415 20087 20086
+19564 19428 19748
+20680 20082 20412
+20082 19745 19744
+19563 19426 19425
+18581 18856 18318
+18964 18858 18857
+18320 18411 18321
+17818 17819 17754
+17305 17306 17248
+17753 17636 17752
+17636 17635 17752
+17753 17638 17637
+16973 16915 17092
+17418 17307 17417
+17418 17308 17249
+16919 16977 17097
+16974 16814 16916
+17152 17250 17251
+17250 17150 17249
+17152 17151 17250
+17150 17149 17249
+18864 18589 18588
+17098 16920 17097
+16977 17096 17097
+17638 17572 17637
+16921 16922 16766
+17422 17574 17756
+17988 18118 18119
+17930 18120 18121
+18120 18181 18324
+18325 18120 18324
+17925 17926 17816
+17925 17987 17926
+18321 18178 18320
+18413 18586 18324
+18411 18410 18583
+18700 18857 18858
+18116 18177 18178
+18178 18177 18320
+18963 18964 18857
+19428 19564 19429
+18327 18123 18122
+18326 18327 18122
+17100 17255 17101
+19752 19903 20090
+18591 18329 18328
+18127 18183 18184
+18125 17759 18124
+18332 18184 18183
+18329 18330 18125
+18332 18182 18331
+18182 18126 18331
+17991 17935 17934
+17992 18129 17993
+17765 17575 17764
+17577 17767 17639
+17826 17940 17827
+17765 17766 17576
+16008 16381 16382
+17767 17577 17576
+17994 17936 17993
+17432 17256 17431
+17766 17765 17825
+17578 17639 17640
+17257 17432 17433
+17110 17256 17257
+17468 17578 17579
+17578 17432 17431
+16382 16381 16772
+16383 16009 16382
+17935 17993 17936
+16981 17109 17110
+18124 17759 17758
+17763 17762 17935
+17935 17762 17934
+17428 17104 17427
+17757 17423 17422
+17252 17251 17421
+17759 17760 17425
+17100 17099 17254
+17104 16772 16771
+17255 17423 17424
+16771 16772 16381
+16774 17106 17107
+16011 16384 16385
+15467 15392 15391
+16774 16773 17106
+16387 16250 16386
+16010 16011 15810
+16013 15877 16012
+16385 16775 16578
+16010 16383 16384
+17108 17109 16925
+16011 16385 16012
+16776 17107 17108
+16387 16445 16388
+16925 17109 16981
+16189 16385 16386
+16386 16385 16578
+16384 16383 16774
+16388 16251 16387
+16012 15811 16011
+16010 15809 16009
+16010 15810 15603
+15391 15602 15467
+15809 16010 15603
+14446 14313 14445
+15270 15204 15269
+15007 14834 14833
+15395 15469 15470
+14311 14240 14444
+15008 15205 15075
+15272 15273 15206
+15464 15390 15389
+15390 15391 15272
+15601 15465 15464
+15601 15602 15466
+15464 15465 15390
+15464 15600 15601
+15808 15601 15600
+15388 15600 15389
+15386 15202 15201
+14831 15003 14883
+15806 15599 15598
+15004 15070 15005
+14883 15003 15004
+14830 15198 15199
+14829 15198 14830
+14827 14828 14438
+15200 15199 15267
+16064 16002 16063
+15387 15202 15386
+15384 15199 15383
+15068 15201 15069
+15202 15070 15201
+15805 15598 15597
+15386 15201 15268
+15462 15461 15598
+16379 16188 16378
+15386 15385 15597
+15267 15199 15384
+16379 16770 16380
+17101 17255 17424
+16980 16979 17099
+16647 16573 16572
+16188 16006 16005
+15800 15595 15594
+16377 16376 16444
+16923 17100 16924
+16443 16442 16574
+16918 16917 16976
+16818 16765 16817
+16647 16572 16646
+16767 16923 16768
+16574 16573 16648
+16065 16183 16184
+16646 16764 16647
+16644 16570 16569
+15198 15594 15595
+16570 16441 16372
+16184 16185 16065
+16246 16183 16182
+16002 15799 15798
+16064 16065 16002
+16003 16186 16004
+16005 16006 15802
+14828 14829 14440
+15594 15798 15799
+16001 16002 15798
+15001 14824 15000
+16246 16372 16441
+15593 15197 15196
+14437 14238 14436
+14826 14825 15195
+14633 14632 14824
+14633 14824 15001
+14708 14630 14707
+15588 15672 15589
+15996 16062 15997
+15382 15191 15381
+14881 14823 14822
+14882 14823 14881
+14709 14632 14631
+15264 15378 15379
+14881 14999 14882
+14227 14053 14124
+15866 15989 15785
+14430 14629 14431
+15065 15191 15066
+15586 15460 15585
+15064 15188 15189
+15587 15379 15460
+15587 15671 15588
+15191 15266 15381
+15191 15190 15266
+14878 14991 14992
+16366 16367 16243
+14701 14817 14702
+15260 15259 15375
+15666 15667 15583
+16560 16362 16168
+15866 15988 16055
+15992 15872 15789
+16055 15989 15866
+16173 16057 16056
+16180 16181 16001
+15592 15195 15194
+17083 17409 17410
+16175 16242 16243
+15999 15876 15998
+15590 15193 15382
+16914 16759 16813
+16440 16368 16564
+16811 16910 17087
+16564 16565 16440
+16642 16758 16566
+17145 17088 17087
+17463 17567 17414
+16914 16913 16972
+17305 17247 17416
+16912 16913 16813
+19257 19256 19423
+17416 17247 17304
+17923 17815 17749
+17463 17566 17567
+20235 19894 20074
+17302 17414 17464
+17302 17301 17414
+17922 17923 17749
+17415 17304 17303
+18110 18109 18575
+17086 17242 17087
+18851 18696 18850
+16910 17086 17087
+17085 17411 17412
+17564 17741 17919
+17296 17236 17295
+16360 16361 16241
+18112 17922 17747
+16752 17084 16753
+17241 17407 17081
+15991 16363 16171
+17742 17564 17919
+16640 16755 16756
+16562 16561 16754
+17084 17411 17085
+16562 16563 16438
+16753 16364 16752
+16909 16910 16810
+16355 16430 16431
+15980 16160 16046
+16354 16353 16429
+16745 16744 16902
+17918 17981 17982
+17561 17631 17562
+18313 18106 18105
+17237 17141 17236
+17743 17408 17407
+17737 17738 17558
+18313 18406 18407
+17557 17459 17400
+17402 17296 17295
+16968 16967 17075
+17140 17235 17236
+17233 17234 17139
+17235 17295 17236
+17735 17398 17397
+17070 17138 17230
+17072 17232 17233
+17400 17459 17401
+17229 17228 17292
+17134 17065 17064
+17226 17136 17225
+16965 17068 17069
+17070 16901 16900
+16965 16898 16964
+17137 17229 17138
+16739 16897 16898
+17136 17067 17066
+16737 16738 16547
+16744 16743 17072
+17140 17236 17141
+16966 17070 16900
+16741 16740 16899
+17067 16965 16964
+16739 16548 16547
+17068 16965 17067
+16899 16898 16965
+16744 16551 16743
+15979 15978 16352
+16159 16160 15980
+15860 15982 15861
+16360 16435 16436
+15374 15456 15259
+16161 16047 16046
+16357 16162 16239
+15861 15862 15781
+15667 15782 15783
+15982 15981 16047
+16361 16560 16168
+16168 16362 16169
+15457 15584 15668
+15182 15374 15259
+15261 15375 15458
+15259 15456 15375
+14814 14875 14815
+14618 14702 14703
+14986 14873 14985
+14987 15182 15056
+14699 14700 14616
+14817 14989 14877
+14506 14616 14617
+14505 14615 14616
+14418 14303 14417
+14412 14297 14296
+14983 15055 14984
+14696 14813 14697
+14218 14299 14219
+14300 14414 14301
+14216 14296 14217
+14296 14411 14412
+14981 15177 14982
+15581 15777 15373
+14981 14809 15176
+15370 15580 15371
+14496 14495 14606
+14408 14407 14604
+14411 14296 14295
+14215 14116 14115
+14409 14494 14495
+14408 14409 14211
+14603 14604 14407
+14293 14111 14210
+14691 14805 14600
+14292 14291 14406
+14291 14405 14406
+14604 14807 14692
+14692 14693 14606
+14805 15173 15174
+14806 14601 14805
+14806 15174 15175
+14979 14805 14804
+14805 15174 14806
+15576 15172 15575
+15574 15774 15575
+15974 15975 15576
+14803 14978 15172
+15368 15575 15172
+15974 15576 15776
+15577 15174 15173
+15969 15771 15968
+16426 16342 16425
+15574 15455 15573
+15575 15775 15776
+15971 16152 15972
+15569 15662 15570
+15765 15960 15854
+15770 15569 15568
+15451 15452 15169
+15452 15453 15365
+15453 15571 15454
+15172 14978 15368
+15367 15368 15171
+14872 15052 14976
+15169 15255 15170
+15170 15053 15052
+15455 15366 15454
+14686 14802 14687
+14803 15172 14979
+14977 14976 15053
+15052 15053 14976
+14801 14978 14802
+14977 15053 15171
+14490 14404 14403
+14799 14798 14974
+14974 14798 14973
+14594 14400 14399
+14685 14596 14800
+14595 14798 14799
+15853 15765 15764
+16040 15958 15957
+15166 15165 15362
+15762 15761 15850
+14594 14797 14798
+14973 15166 15167
+14971 15164 14972
+15361 15362 15165
+15561 15358 15560
+15165 14973 14972
+14203 14399 14284
+14593 14796 14797
+15164 14970 15163
+15846 15759 15955
+15851 15762 15850
+15561 15560 15760
+15654 15563 15653
+15361 15165 15360
+15763 15762 15851
+16332 16225 16142
+15956 15957 15848
+15761 15848 15849
+15764 15763 15851
+15761 15849 15850
+15850 15958 15851
+15957 15849 15848
+15851 15852 15764
+15851 15958 15959
+15564 15449 15448
+16041 15958 16040
+16143 15960 16142
+15564 15448 15563
+15768 15767 15966
+15363 15254 15362
+15364 15254 15363
+15662 15569 15770
+15767 15858 15965
+15973 15775 15774
+15663 15573 15572
+16343 16232 16231
+15771 15662 15770
+16537 16150 16339
+16045 15970 15969
+15964 16147 16044
+15767 15658 15657
+15965 15966 15767
+15769 15661 15768
+15858 15657 15766
+15850 15957 15958
+16139 16330 16331
+16332 16142 16141
+15960 15853 15959
+16228 16146 16227
+15657 15858 15767
+16337 16338 16149
+16044 15965 15858
+16532 16533 16424
+16330 16528 16331
+17048 17211 17212
+16226 16333 16334
+16423 16332 16531
+16529 16528 16720
+17131 17214 17051
+16533 16532 16623
+16723 16724 16534
+18083 18289 18547
+16425 16538 16624
+16337 16149 16148
+16147 16146 16228
+17055 17384 17385
+15772 15969 15859
+16342 16231 16230
+16230 16151 16340
+16889 17057 16890
+16890 16891 16732
+16426 16425 16539
+17057 17216 17058
+17384 17545 17385
+17288 17218 17388
+17057 17058 16890
+17388 17387 17456
+17217 17287 17218
+16892 16805 16804
+16542 16541 16628
+16544 16633 16545
+16626 16730 16627
+16803 16890 16731
+16427 16542 16428
+16630 16631 16543
+16232 16344 16345
+16628 16731 16732
+15972 16152 16153
+16155 16234 16235
+16345 16233 16232
+16428 16543 16346
+15973 15974 15776
+16156 15975 15974
+16345 16346 16233
+16346 16347 16235
+16233 16346 16234
+16544 16631 16632
+16629 16733 16630
+16958 17060 17061
+16733 16631 16630
+16733 16734 16631
+16235 16347 16236
+16346 16543 16544
+16351 15977 16350
+16236 16156 16235
+16895 16737 16736
+16546 16348 16545
+17066 16963 17065
+16740 16898 16899
+16964 16963 17066
+16964 16897 16963
+16804 16805 16733
+16804 16891 16892
+17062 17061 17132
+17391 17729 17730
+17224 17225 17135
+17065 17134 17135
+17223 17289 17224
+17221 17391 17222
+18095 17978 18094
+17458 17393 17552
+18092 18091 18167
+17911 17910 17978
+17812 17731 17909
+20051 19718 19717
+19251 19114 19113
+18842 18689 18841
+17909 17908 17977
+18171 18304 18305
+20660 20531 20782
+20920 21190 20921
+19404 19553 19721
+20654 20919 20920
+21189 21488 21190
+22269 22270 22020
+21188 21330 21189
+21749 22015 21863
+20387 20654 20388
+20653 20918 20654
+20916 21046 20917
+21747 21482 21746
+21487 21486 21623
+21483 21328 21482
+21187 21046 21186
+21182 21181 21481
+21749 21748 21862
+20912 21182 21183
+20051 20385 20052
+21747 21484 21483
+21046 20916 20915
+18555 18556 18399
+18834 18951 18685
+18837 18953 19110
+18842 18841 18955
+18688 18400 18556
+17809 17808 17902
+18089 18297 17907
+17976 17904 18088
+17628 17549 17457
+17905 17811 17904
+17729 17391 17550
+18086 17901 17725
+18685 18552 18834
+19104 19711 19712
+20047 20046 20224
+19716 19715 20050
+18088 18294 18295
+17383 17722 17723
+18289 18082 18288
+17382 17721 17722
+18830 18546 18684
+17722 18083 18084
+18085 18290 18291
+17544 17720 17721
+18287 18165 18394
+17805 17896 17897
+17720 17900 17721
+17380 17455 17381
+17807 17899 17720
+18394 18286 18393
+17898 17806 17718
+18546 18396 18545
+18164 18080 18079
+18289 18288 18546
+18081 17900 17899
+22005 21742 22004
+20777 20646 20908
+19546 19706 19707
+21477 21741 21742
+20645 20644 20776
+20635 20519 20373
+19882 19707 19706
+19883 19547 19707
+21476 21327 21326
+22259 22146 22258
+20225 20048 20047
+19715 19716 19400
+19713 19712 20049
+20048 20380 20049
+18293 18833 18552
+18296 18089 18295
+20909 21044 21179
+20914 21045 21185
+21480 21479 21744
+21482 21328 21183
+22003 21741 21859
+22003 21859 22002
+23891 23976 23892
+21324 21474 21325
+21996 21852 21995
+21176 21043 20906
+21475 21476 21326
+21176 21177 21043
+20044 19882 20043
+20376 20044 20043
+19882 19881 20043
+21173 20901 20900
+20044 20222 20045
+20521 20375 20221
+21174 21471 21472
+22139 21996 22138
+20639 20902 20640
+20641 20904 20642
+22487 22603 22488
+21853 21735 21734
+22137 21994 22245
+21734 21471 21733
+22355 22489 22604
+22783 22695 22782
+22250 22251 22001
+21472 21323 21174
+22001 22000 22250
+22249 22489 22355
+22492 22251 22491
+22355 22604 22490
+22911 22786 22910
+22911 22912 22700
+22701 22700 22912
+23087 23303 23088
+22361 22500 22261
+22913 23305 22914
+22606 22607 22494
+23086 22911 23085
+22490 22604 22697
+22605 22493 22701
+22492 22491 22699
+22702 22605 22701
+22494 22607 22356
+21740 21859 21622
+22007 22142 22143
+22253 22004 22003
+21479 21180 21478
+21746 21745 22009
+22257 22144 22143
+22007 22143 22144
+22257 22256 22357
+22147 22009 22146
+22258 22144 22257
+22016 21864 21863
+21748 21485 21484
+22011 22148 22012
+22260 22361 22261
+21865 21752 21864
+21750 21749 21863
+22266 22019 21754
+21625 21330 21487
+22264 22017 22151
+22018 21753 21865
+22152 21865 22017
+21624 21625 21487
+21865 22152 22018
+22708 22503 22610
+22360 22359 22497
+22703 22702 22913
+22263 22151 22262
+22151 22016 22015
+22913 23304 23305
+23309 23308 23408
+22363 22502 22610
+22501 22500 22609
+22363 22503 22364
+22708 22707 22916
+22920 22787 22919
+23089 22918 22917
+22152 22366 22265
+22510 22715 22716
+22367 22368 22272
+21755 22020 21756
+22508 22611 22509
+23090 22919 23311
+22512 22369 22511
+22272 22273 22153
+22512 22513 22275
+21192 21491 21492
+24514 24736 24737
+22278 22717 22515
+22923 22513 22512
+22369 22368 22511
+21764 21765 21497
+22274 22273 22369
+22276 22026 22025
+20531 20660 20394
+22279 22029 22028
+20929 21049 20930
+22274 22024 22153
+20068 20067 20400
+21047 21195 21048
+20929 20930 20668
+21764 21870 21871
+20932 21498 21499
+20663 20662 20924
+20928 21048 20929
+20660 20661 20395
+20664 20783 20665
+20664 20532 20398
+19731 20068 19732
+20922 21191 20923
+22153 22273 22274
+22267 22019 22266
+22022 22271 22272
+21191 21490 21192
+22367 22271 22510
+20782 20922 20923
+21754 21753 22018
+20390 20528 20391
+21190 21488 21754
+20660 20782 20923
+20920 20780 20655
+19403 19553 19404
+20527 20654 20655
+20062 19726 20061
+20393 20530 20531
+20662 20396 20395
+19409 19119 19118
+20230 20398 20065
+20400 20533 20667
+19727 19409 19726
+20062 20061 20395
+19725 19724 20060
+19724 19117 19407
+18562 18303 18403
+18302 18303 18168
+18562 18691 18845
+17912 17913 17734
+17912 17979 18096
+17399 17556 17557
+17555 17232 17398
+19120 18568 19119
+17914 17736 17555
+17559 17558 17738
+17557 17556 17736
+17916 18102 18103
+18306 18098 18173
+17738 17915 17916
+18106 18107 17983
+18315 18314 18573
+18311 18568 18569
+18311 18310 18568
+18573 18572 18696
+18572 18571 18695
+18848 19122 18849
+18569 18848 18693
+20065 19729 19728
+19121 19122 18848
+19120 19119 19410
+20063 20397 20230
+20066 20399 20400
+20666 20533 20532
+20063 19889 19727
+19411 19410 19730
+20400 20399 20533
+20674 20535 20534
+19734 19554 19733
+20074 20234 20235
+20077 20409 20236
+18576 18110 18575
+19738 20074 19894
+20073 20234 20074
+20235 20234 20406
+18961 18960 19124
+19557 19556 19736
+18961 18852 18697
+18574 18108 18315
+19417 19418 19126
+18575 18109 18108
+19126 18575 18853
+19128 19739 19740
+18853 18852 19125
+18853 18574 18852
+19254 19416 19125
+19126 19127 18576
+18580 18408 18579
+18855 18579 18578
+18854 19130 18578
+19256 19131 19130
+18962 18698 18855
+18576 18111 18110
+17749 17567 17633
+18316 18112 18578
+18855 19130 19131
+17635 17636 17569
+21200 21500 21501
+19560 19422 19559
+19255 19130 19129
+19133 19258 19134
+19422 19256 19130
+20537 20409 20536
+20407 20406 20534
+20237 20078 20236
+19895 19741 20078
+19896 19895 20079
+21203 21051 21050
+20412 20679 20680
+21504 21332 21634
+22037 21773 22036
+21201 21332 21504
+21627 21502 21501
+21629 21630 21502
+20934 20933 21199
+21769 22034 22035
+21770 21771 21629
+21629 21502 21628
+20670 20069 20401
+20071 19890 20070
+19734 19555 19554
+20231 20404 20232
+21198 20931 20930
+20069 20670 20402
+21764 21198 21496
+20672 20933 20673
+21500 21199 21767
+22032 21767 22031
+23910 23985 24118
+22280 22030 21766
+22519 22283 22031
+22517 22280 22370
+22922 23313 23314
+23410 23491 23566
+23092 23318 23093
+23567 23718 23568
+23319 23411 23320
+23492 23410 23566
+23093 23320 23094
+23910 23718 23909
+23721 23720 23912
+22932 23015 23016
+22928 22520 22519
+22034 21769 21768
+22520 22033 22283
+21199 21200 20934
+21631 21771 21772
+21770 21627 21769
+22033 22284 22034
+22722 23096 22931
+23495 23324 23096
+23496 23569 23497
+23572 23573 23502
+23328 23503 23329
+24531 24298 24377
+23726 23572 23501
+24751 24636 24750
+23914 23725 23724
+23569 23570 23497
+23499 23500 23326
+23724 23725 23571
+24126 24298 24299
+23719 23568 23718
+24119 24208 24120
+23494 23493 23719
+23567 23566 23718
+23320 23494 23095
+23320 23411 23493
+24124 24296 24527
+24118 23985 24117
+24748 25005 24749
+23912 23720 23911
+24124 24528 24125
+23322 22929 22928
+25009 25133 25010
+25009 25008 25249
+26096 25985 25984
+24291 24119 24290
+24526 24122 24295
+26277 26096 26195
+25992 26204 26205
+25006 25005 25248
+25506 25505 25747
+25007 25006 25248
+25343 25251 25342
+25133 25009 25249
+25344 25343 25508
+25342 25249 25506
+24753 25010 25252
+25510 25637 25749
+25346 25345 25509
+25344 25508 25345
+24844 24755 25013
+25252 25010 25251
+25255 25013 25254
+25011 25252 25253
+25257 25258 25134
+23575 23512 23511
+26450 26208 25995
+26449 26541 26450
+26204 25991 26203
+25743 25989 25990
+25753 25638 25515
+25512 25511 25750
+26200 25988 26199
+26603 26286 26530
+26201 25989 26200
+26443 26605 26532
+26202 25990 25989
+26540 26449 26539
+27179 27078 27077
+26539 26448 26538
+26792 26607 26656
+26663 26540 26613
+25995 25751 25750
+26204 26443 26444
+26441 26287 26286
+26285 26440 26530
+26285 26284 26440
+26658 26533 26657
+26204 26203 26443
+26281 26199 26280
+25503 25502 25743
+26439 26283 26282
+26783 26598 26782
+26601 26439 26528
+26284 26285 26201
+26525 26279 26524
+26277 26196 26096
+26435 26436 26278
+26279 26198 26197
+26524 26279 26436
+26198 25987 25986
+25240 25241 25001
+26193 26194 26095
+26193 26275 26194
+26097 25834 25985
+25500 25242 25499
+25245 25246 25131
+25738 25498 25737
+25242 25241 25499
+25001 24521 25000
+25833 25740 25739
+25740 25834 25741
+25983 25635 25736
+25130 25237 24999
+25232 25231 25493
+26181 26085 26084
+26088 26087 26184
+25738 25499 25240
+26426 26263 26262
+26427 26592 26428
+26428 26429 26267
+26190 26093 26189
+26426 26425 26590
+26424 26590 26425
+26264 26186 26263
+26086 25977 26085
+25981 26090 26091
+26186 26185 26263
+26179 26081 26256
+25733 25633 25632
+26079 26177 26178
+25828 25974 25829
+26179 26257 26258
+27314 27437 27460
+26076 25970 25969
+26072 26073 25968
+26074 25968 26073
+26174 26074 26073
+26076 26077 25970
+26079 26080 25972
+24989 24990 24841
+26182 26086 26085
+26258 26083 26179
+26087 26086 26183
+26087 25978 26086
+25491 25490 25734
+25332 25225 25331
+25226 24988 24987
+24989 25228 24990
+25732 25632 25489
+25336 25228 25227
+24837 24988 24838
+24987 25225 25226
+24731 24836 24837
+24988 25226 25227
+24839 24988 24989
+24990 25229 24991
+26083 26082 26179
+25491 25337 25490
+25118 25339 25230
+25337 25338 25229
+25974 26081 26082
+25340 25735 25492
+25832 25977 25978
+25239 25240 25000
+24999 25238 25000
+24745 25000 24520
+25124 25234 25125
+24999 25237 25238
+24994 24739 24993
+24735 24635 24634
+25125 25126 24996
+25128 25236 25129
+24737 24736 24991
+24737 24738 24515
+25120 25121 24993
+23711 24111 23712
+25498 25239 25238
+24291 24523 24375
+23910 23909 23985
+23718 23717 23909
+24739 24516 24515
+23312 23090 23311
+24289 24117 24116
+23909 23717 23908
+23904 23981 23982
+24728 24506 24727
+24109 23982 24108
+24841 24734 24733
+24735 24736 24635
+24284 24109 24108
+24107 24106 24506
+23824 23709 23823
+23706 23307 23306
+23906 23487 23710
+23565 23409 23485
+22914 23306 22915
+23902 23901 24107
+23821 23704 23703
+23705 23706 23306
+23896 23979 23897
+24104 24105 23980
+24104 23980 23979
+23704 23822 23705
+24108 23981 24107
+23564 23709 23565
+24507 24107 24506
+23483 23564 23484
+24829 24830 24725
+24727 24506 24505
+24981 24982 24832
+24731 24835 24836
+24502 24503 24370
+24831 24832 24726
+23899 24105 24106
+24372 24280 24371
+24727 24505 24726
+24282 24281 24505
+24626 24366 24499
+24369 24279 24278
+25478 25479 25325
+24205 24275 24364
+24502 24723 24724
+24501 24628 24629
+24623 24718 24719
+24979 25217 25107
+24717 24718 24622
+24979 24827 24720
+24497 24718 24623
+23889 23888 23974
+23975 23976 23890
+23171 23172 23086
+23896 23820 23819
+24366 24365 24499
+24100 24206 24207
+23304 23088 23303
+23302 23171 23170
+23172 23087 23086
+23699 23818 23700
+24099 24098 24203
+23300 23169 23168
+22785 22786 22698
+23889 23815 23888
+23696 23473 23561
+23698 23817 23699
+23170 23169 23301
+22909 23083 23084
+23562 23697 23563
+23300 23301 23169
+22353 22487 22488
+22138 22137 22246
+22246 22245 22487
+22138 22246 22247
+22137 21995 21994
+22907 22782 22906
+23882 23971 24091
+23687 23809 23688
+25101 24974 25100
+24973 25207 25100
+24268 24490 24491
+24092 24267 24268
+24268 24491 24269
+25603 25707 25708
+24093 24270 24094
+24271 24363 24494
+24271 24272 24094
+23885 23886 23812
+23811 23812 23696
+23813 23814 23697
+24095 24495 24273
+23695 23561 23694
+23972 23887 23886
+23887 23888 23814
+25104 25214 25105
+25321 25216 25106
+25476 25215 25475
+25808 25711 25710
+25605 25604 25708
+24825 24716 24976
+23973 24097 23974
+24976 25104 24977
+25105 25215 25106
+24091 24265 24266
+25951 26408 26409
+25102 25101 25208
+25100 25207 25469
+26405 26761 26762
+27558 27297 27557
+25209 25320 25210
+25470 25208 25469
+25474 25473 25603
+25471 25320 25470
+24712 24494 24621
+25708 25707 25951
+25810 25954 26165
+25473 25706 25707
+25605 25708 25952
+25603 25473 25707
+25209 25102 25470
+27301 27050 27300
+27053 27304 27054
+27567 27566 27835
+26164 25954 25953
+25607 25709 25953
+25811 25810 25955
+25710 25607 25953
+25809 25711 25808
+24975 24715 24823
+26165 25956 25812
+25956 25713 25712
+25954 25809 25808
+25812 25955 26165
+25477 25610 25611
+27835 27566 27834
+25719 25482 25718
+25616 25480 25615
+25108 25219 25109
+25326 25224 25223
+25109 24980 25108
+25609 25713 25475
+25610 25477 25322
+25324 25323 25478
+25476 25321 25215
+25476 25610 25322
+25477 25323 25218
+25222 25480 25326
+25220 25110 25109
+25108 24827 25107
+25220 25221 25110
+25222 25111 25221
+25617 25720 25618
+25818 25967 25819
+25482 25327 25481
+24832 24727 24726
+25113 24984 25112
+25817 25816 25966
+26172 26173 26070
+26071 26072 25967
+25965 25964 26069
+26070 25967 25818
+25726 25624 25623
+25966 26070 25818
+25816 25815 25965
+25963 25722 25721
+25965 26171 25966
+26254 26417 26173
+26069 26170 26416
+26174 26175 26074
+27175 27201 27176
+28445 28446 28127
+25827 25973 25974
+27396 27576 27438
+27399 27201 27317
+27201 27399 27400
+27396 27316 27395
+27318 27201 27400
+28129 27983 27846
+28785 28784 29143
+27842 28127 27981
+27317 27398 27399
+27844 28128 27982
+27573 27690 27460
+27460 27574 27461
+28786 28446 28445
+27981 27722 27842
+27842 27722 27691
+29141 29456 29142
+28126 28127 27841
+28445 28127 28126
+27572 27688 27436
+27841 27690 27689
+27460 27437 27573
+27647 27575 27461
+27648 27576 27575
+27691 27692 27648
+26588 26256 26420
+26176 26076 26419
+27394 27437 27314
+27315 27314 27461
+29138 29139 28780
+28125 28443 28444
+27313 27312 27436
+29135 28776 29134
+27836 28122 27837
+27055 26766 27054
+25813 25717 25716
+27051 26762 27050
+25705 25469 25948
+27298 27297 27558
+27300 27050 27049
+27052 26764 26763
+27565 27833 27834
+27566 27565 27834
+29133 28774 29132
+27304 27564 27565
+31835 31201 31834
+27833 27564 27832
+28433 28773 28774
+28117 27831 28116
+28115 27830 27829
+29695 29443 29442
+28772 28432 28431
+29698 29699 29446
+29448 29134 29133
+28436 28117 28435
+31212 30701 31211
+28119 28120 27834
+28436 28437 28118
+28778 29136 29137
+28778 28779 28438
+28780 28440 28439
+28440 28122 28121
+28123 27837 28122
+31222 30706 31221
+28441 28123 28122
+29453 29454 29139
+28125 28444 28126
+29449 29448 29701
+31199 31833 31200
+30377 30695 31201
+30376 31199 30695
+30694 31197 31198
+31198 31831 31832
+31190 31824 31191
+31195 31196 30693
+31197 30693 31196
+29700 29905 29701
+28775 29133 29134
+29902 29697 29901
+29697 29444 29696
+29698 29446 29445
+29131 29132 28773
+30367 30686 30104
+31188 31189 30689
+31187 30689 30370
+31191 30372 30690
+31822 31823 31189
+29900 29695 29899
+31802 31803 31169
+31167 31166 31800
+31801 31168 31167
+29900 29696 29695
+30361 30679 31169
+31798 31165 31164
+31806 31808 31807
+31805 31172 31171
+31804 31803 31805
+31173 30682 30363
+31177 30683 31176
+31806 31805 31803
+31809 31815 31811
+31821 31822 31188
+31182 31183 30686
+31182 31815 31816
+31817 31183 31816
+31817 31184 31183
+31190 31189 31823
+31194 31827 31828
+31828 31830 31829
+31195 31829 31196
+31217 31216 31850
+31834 31833 31835
+31217 31850 31851
+31205 31839 31206
+30384 30385 30113
+29705 29453 29452
+31215 30384 30702
+31201 31835 31202
+30109 30377 30696
+31201 31200 31834
+31844 31210 31843
+29910 29705 29909
+28777 29136 28778
+30695 30377 30376
+30379 30698 30110
+29908 29704 29703
+29138 28780 28779
+31856 31223 31222
+29140 29139 29454
+29706 29453 29705
+31214 31215 30702
+30113 29911 29910
+31856 31222 31855
+29456 29709 29457
+29706 29707 29454
+29911 29912 29707
+31219 31218 31852
+31223 31856 31857
+29710 29711 29458
+30712 30393 31233
+30714 31238 31239
+29917 29916 30119
+29144 29459 29145
+31224 31223 31857
+31236 31237 30713
+31852 31851 31850
+31221 31854 31855
+31855 31222 31221
+30709 31228 31229
+31855 31854 31852
+29711 29916 29712
+31855 31852 31857
+30706 30114 30387
+31798 31800 31799
+31888 31255 31254
+31252 31251 31885
+31248 31247 31881
+31245 30718 31244
+30404 30723 31255
+30123 30405 30406
+31257 31889 31890
+31256 31889 31257
+31260 31259 31892
+28788 29147 28789
+31886 31888 31887
+31895 31896 31263
+31894 31261 31893
+31892 31258 31891
+30408 31263 30728
+31264 31263 31897
+30727 31262 31263
+31261 31894 31895
+31261 30727 30407
+30127 30126 30412
+31261 31260 31893
+31261 31262 30727
+31259 30725 31258
+31259 31260 30726
+30407 30727 30408
+30409 30729 30410
+29922 30124 30125
+30727 31263 30408
+27728 27851 27696
+30408 30728 30409
+31251 31252 30722
+30407 30726 31261
+30123 30406 30124
+29923 30126 29924
+30121 29919 29918
+27986 27850 27849
+31247 30719 31246
+30398 30120 30119
+30400 30719 31247
+30400 30399 30719
+31243 31242 31876
+31240 31239 31873
+31238 31872 31239
+30715 31241 30397
+30717 30716 31243
+30716 30397 31241
+28789 28449 28448
+30120 29918 29917
+29710 29915 29711
+29462 29715 29463
+29924 29719 29923
+27177 27402 27320
+27846 27726 27725
+27917 27984 27918
+27400 27439 27401
+27176 27319 27177
+27440 27402 27319
+27442 27465 27466
+26266 26427 26428
+27462 27463 27402
+27848 27917 27918
+27442 27464 27465
+27443 27321 27442
+26596 26595 26781
+26273 26193 26192
+26593 26592 26779
+26527 26438 26280
+26524 26598 26599
+26597 26434 26596
+27649 27579 27696
+27327 27328 27074
+27324 27323 27582
+29153 29152 29467
+29718 29922 29923
+27649 27697 27580
+27323 27070 27069
+27850 27986 27987
+29716 29920 29921
+29149 28791 28790
+29719 29467 29466
+29466 29718 29719
+29154 28795 29153
+29156 29157 28798
+27858 27587 27586
+26787 26786 26913
+27327 27586 27328
+27857 27858 27586
+26601 26528 26651
+26528 26600 26651
+27584 27325 27583
+26787 26654 26653
+26530 26653 26654
+26602 26652 26653
+26654 26655 26603
+26789 26862 26790
+26787 26914 26788
+26916 27075 26949
+26951 27077 26918
+26864 26793 26657
+26657 26445 26607
+26863 26916 26949
+26659 26534 26608
+26794 26793 26919
+26865 26795 26660
+26661 26537 26610
+26922 26953 26867
+26797 26612 26662
+26616 26542 26666
+26922 26797 26866
+28139 27859 27858
+27079 27180 26952
+26864 26951 26918
+28797 29155 29156
+29158 29472 29473
+27333 27083 27082
+27083 26800 27082
+29474 29473 29726
+29725 29726 29473
+30423 30742 31293
+30131 30132 29929
+31297 30425 30744
+30132 29930 29929
+30132 30131 30422
+31289 31288 31922
+28797 28796 29155
+29722 29926 29927
+29472 29724 29725
+31286 31285 31919
+29155 29469 29470
+30416 30128 30415
+31263 31896 31897
+31263 31262 31895
+30127 30413 30414
+31901 31267 31900
+31265 31264 31898
+30413 30733 30414
+31272 31906 31273
+31275 30414 30733
+31274 30733 31273
+31275 30734 30414
+31281 30737 30417
+31277 30415 30734
+31274 31275 30733
+31277 30735 30415
+31275 31909 31276
+31278 30735 31277
+31914 31913 31916
+31910 31911 31278
+31909 31911 31910
+30417 30418 30129
+31913 31912 31916
+31283 30418 30737
+31283 31917 31284
+30420 31287 30740
+31915 31282 31281
+31283 31916 31917
+31915 31916 31282
+31284 30738 31283
+31291 31292 30742
+30134 30427 30428
+31904 31902 31907
+31926 31927 31294
+31287 31920 31921
+31302 31303 30747
+31939 31938 31941
+31165 31798 31799
+31305 30429 30748
+31306 31305 31938
+31937 31936 31938
+31861 31863 31862
+31923 31920 31925
+30427 30747 30428
+31930 31933 31931
+31303 31304 30748
+31928 31927 31929
+31301 31934 31302
+31300 31299 31933
+30428 30135 30134
+30746 30427 30426
+30135 30136 29933
+30431 30136 30430
+30430 30429 30749
+31305 30749 30429
+31307 31940 31308
+31941 31308 31940
+31309 30751 30431
+31321 31954 31322
+29733 29937 29938
+31320 31319 31952
+31311 30752 30751
+31323 30758 30438
+29731 29732 29479
+30759 31326 31327
+31330 31331 30761
+31325 31958 31959
+30759 31327 30440
+31327 31960 31328
+31329 30760 31328
+31960 31326 31959
+31329 31962 31963
+30439 31325 30759
+31323 31322 31956
+30760 31327 31328
+30760 30440 31327
+31941 31942 31309
+31945 31946 31312
+31956 31957 31323
+31961 31962 31329
+31956 31955 31957
+31964 31965 31331
+31963 31964 31330
+31965 31332 31331
+31966 31965 31964
+31966 31333 31965
+31993 31992 31990
+31364 31997 31365
+31991 31990 31992
+31372 32004 32005
+30780 30461 30460
+32006 32013 32008
+31380 31379 32012
+32011 32013 32012
+32007 32006 32008
+31450 32082 32083
+31402 32035 32036
+29957 30160 29958
+31378 31377 32010
+32010 31376 32009
+32004 31371 32003
+29176 29492 29177
+31998 31997 31999
+31980 31348 31347
+31349 31348 31981
+31974 31341 31340
+31363 30777 31362
+30454 30455 30148
+31372 30782 31371
+30783 30463 31373
+30777 31363 30458
+31353 30453 30772
+30145 30450 30146
+30147 29945 29944
+29172 29173 28814
+29943 30145 30146
+31333 31967 31334
+31345 30449 30768
+31975 31342 31341
+31344 30768 31343
+30447 30144 30446
+30442 31331 30762
+31330 31964 31331
+30443 30762 31333
+31331 31332 30762
+30445 30444 30764
+29939 30141 30142
+29742 29945 29743
+29537 29486 29572
+29601 29572 29571
+29171 28813 28812
+28156 27875 28155
+27874 28154 28155
+30773 31355 30454
+29174 28815 29173
+28160 28478 28479
+29175 28817 28816
+28817 29176 28818
+31368 31367 32001
+29491 29745 29492
+29744 29946 29947
+30462 30781 31371
+30783 31374 31375
+28163 28482 28164
+28817 28818 28477
+27610 27881 27882
+28478 28819 28479
+27612 27353 27611
+28163 28164 27883
+25547 26025 25548
+28825 29184 28826
+28167 28168 27887
+26820 26481 26480
+28160 27880 27879
+26478 26021 26477
+25036 24778 24858
+27100 27350 27351
+27350 27349 27608
+24314 24382 24315
+25282 25283 25037
+28155 27875 27874
+28155 28474 28156
+27878 27606 27877
+27605 27604 27876
+27341 27600 27342
+27604 27875 27876
+26812 26811 27094
+27602 27874 27603
+25536 26015 25766
+27344 27602 27603
+27091 26808 27090
+28152 28470 28471
+26465 26464 26806
+26294 26460 26295
+26468 26306 26305
+29939 30142 29940
+27601 27600 27872
+27868 27869 27597
+27342 27601 27343
+27602 27344 27343
+28153 27873 27872
+27602 27343 27601
+28812 28472 28471
+27873 27602 27601
+28150 27870 27869
+27597 27339 27338
+28470 28811 28471
+28810 28809 29168
+27599 27871 27600
+29481 29733 29734
+28809 28808 29167
+28465 28146 28464
+29168 28809 29167
+28469 28468 28809
+29731 29936 29732
+28150 28469 28151
+29477 29162 29476
+29933 30136 29934
+30439 30758 31325
+29731 29730 29935
+29478 29163 29477
+29932 30134 30135
+29729 29477 29476
+30133 30425 30426
+29729 29934 29730
+28145 27865 27864
+28143 27862 28142
+28462 28144 28143
+26457 26621 26458
+28467 28148 28466
+28147 28146 28465
+27596 27338 27337
+26453 26452 26542
+26666 26615 26799
+26454 26618 26543
+26215 26292 26216
+26211 26455 26290
+25997 26210 25998
+26456 26544 26291
+26211 26212 26098
+26456 26455 26543
+26543 26619 26456
+26544 26619 26802
+27085 27086 26803
+26621 26457 26620
+26462 26296 26461
+26459 26546 26547
+26110 26004 26109
+26461 26548 26624
+26466 26303 26302
+26300 26226 26225
+26112 26008 26007
+26460 26294 26293
+26292 26458 26545
+26296 26219 26461
+26293 26218 26217
+26224 26110 26223
+26222 26298 26223
+26225 26226 26111
+26467 26228 26303
+26231 26230 26306
+25032 24853 24773
+25141 25028 25027
+26222 26297 26463
+26110 25760 26004
+24640 24543 24639
+26217 26218 26104
+25263 25262 25520
+25836 25755 25999
+26101 26214 26215
+26219 26107 26106
+26216 26103 26215
+26618 26454 26617
+25997 25754 25753
+25639 25518 25754
+25260 25018 25017
+26098 25999 25998
+25757 25838 25839
+25017 25018 24760
+25019 25020 24761
+25643 25523 25522
+25354 25526 25527
+24848 24847 25025
+25024 25023 25266
+24542 24136 24541
+24849 25026 25027
+24537 24301 24536
+24131 23918 23917
+23921 23736 23735
+25024 25266 25267
+24302 24133 23920
+23506 23507 23333
+23919 23918 24131
+23509 23334 23508
+24302 24539 24133
+23732 23509 23508
+23576 23513 23737
+22943 22942 23337
+25022 24764 24763
+24133 23734 23733
+24135 23735 23734
+24539 24302 24538
+24848 24849 24767
+24544 24303 24543
+23922 23738 23737
+23576 23514 23513
+23740 23739 24138
+23516 23416 23577
+24306 24139 24138
+23344 23184 23343
+24769 24770 24644
+24545 24304 24544
+24771 24546 24770
+24545 24544 24643
+24774 24855 24775
+24769 24644 24643
+25272 25029 25028
+24849 24768 24767
+25274 25031 25030
+24769 24643 24768
+25027 25139 25140
+25026 25025 25268
+26113 26009 26008
+25273 25030 25029
+24850 25028 24851
+25272 25273 25029
+24645 24550 24775
+25365 25536 25766
+27098 26815 27097
+24857 24856 25034
+24649 24778 24859
+24649 24648 24778
+24380 24379 24548
+25274 25030 25273
+24778 24777 24858
+24645 24551 24550
+24142 24311 24143
+24771 24770 25030
+24139 24306 24307
+24305 24304 24545
+24308 24379 24380
+24547 24546 24771
+23522 23417 23521
+23347 23120 23346
+24853 24774 24773
+24549 24548 24772
+24775 24550 24774
+23743 24141 23923
+26816 26817 26477
+23987 24147 23988
+24212 24316 24146
+23747 23520 23578
+23581 23750 23523
+23524 23523 23750
+22300 22299 22547
+23525 23352 23524
+24782 24556 24651
+24316 24212 24383
+24382 24555 24315
+24651 24383 24555
+24383 24211 24315
+25036 24859 24778
+25039 24782 24781
+24554 24382 24314
+24556 24383 24651
+25035 25281 25036
+25145 25037 25283
+25038 24861 25145
+25540 25367 25539
+25036 25281 25282
+25036 24858 25035
+25035 25280 25281
+25366 25281 25280
+24777 24857 24858
+25034 25279 25035
+24855 25033 25034
+25362 25535 25363
+25532 25648 25533
+25031 24771 25030
+25650 25534 25359
+25361 25278 25143
+25761 25532 25358
+25358 25274 25357
+25361 25362 25278
+25361 25360 25534
+25364 25363 25536
+25278 25362 25363
+26811 26810 27093
+27095 26812 27094
+26470 26014 26013
+25649 25533 25648
+25763 25764 25650
+25765 25535 25534
+26013 25842 26232
+25356 25530 25531
+26229 26306 26230
+25841 26012 25842
+26231 26306 26469
+25281 25538 25539
+27096 27095 27346
+25535 26015 25536
+25762 25649 25648
+26021 25544 25543
+25039 24783 24782
+25546 25547 25044
+27350 27100 27099
+27611 27610 27882
+26480 26819 26820
+25547 25548 25045
+27614 27355 27613
+28165 27885 27884
+28164 27884 27883
+26821 26822 26482
+27359 27618 27360
+25053 25555 25556
+28169 28488 28170
+28171 28172 27891
+28173 27893 27892
+27622 27894 27623
+28499 28500 28181
+27623 27364 27622
+27902 27630 27901
+26499 26838 26839
+27988 27903 28184
+28182 27901 28181
+27373 27372 27631
+27121 27181 27122
+27895 28176 27896
+26831 26491 26830
+27372 27630 27631
+27121 27371 27181
+26495 26834 26835
+27372 27371 27630
+27374 27124 27373
+26837 27119 27120
+26488 26630 26631
+27622 27621 27893
+26040 26496 26497
+26835 27118 26836
+26827 27109 27110
+27112 27111 27362
+27108 26825 27107
+26028 25551 25550
+26826 27108 27109
+26489 26488 26631
+26821 26482 26481
+26026 25549 25548
+26025 26026 25548
+25549 25046 25548
+25549 25550 25047
+26483 26484 26027
+25551 26029 25552
+25049 25552 25050
+24159 24568 24160
+26031 26487 26488
+26024 26025 25547
+25548 25046 25045
+23759 23529 23758
+23129 23128 23358
+23129 23358 23359
+24318 24319 23932
+23933 23934 23765
+26042 26043 25565
+26667 26504 26633
+24572 25055 25056
+25560 26037 26038
+25060 25563 25061
+24213 24323 24169
+26035 26491 26492
+26495 26494 26834
+24321 24576 24384
+24320 24165 24319
+25768 25567 25566
+23381 23139 23138
+24329 24174 24328
+23134 23133 23376
+23531 23530 23582
+23774 23938 23775
+23134 23189 23135
+22305 22377 22567
+22161 22309 22310
+22572 22314 22313
+23137 23136 23379
+22983 23137 23138
+22317 22575 22318
+23535 23584 23585
+22984 23139 22985
+22319 22576 22320
+22319 22167 22318
+22381 22323 22169
+22577 22321 22320
+23195 22989 23025
+22618 22619 22577
+22989 22751 22800
+22578 22380 22379
+23584 23783 23585
+21361 21269 21268
+23782 23783 23584
+23583 23782 23584
+23384 23191 23383
+22315 22316 22163
+24589 24386 24385
+24215 23991 24180
+24180 24331 24214
+23991 23943 24180
+24181 23991 24215
+23583 23831 23782
+24386 24589 24590
+25146 25069 25288
+25289 25290 25147
+24863 24652 24786
+25070 24862 25147
+26957 26956 27128
+25370 25371 25288
+25289 25146 25371
+24862 24786 25069
+24863 24786 24862
+24652 24588 24786
+25652 25572 25370
+23941 24177 24178
+25067 25286 25287
+26501 26632 26841
+25770 25569 25769
+25370 25288 25369
+25368 25570 25571
+27468 27469 27447
+27125 27124 27374
+27632 27374 27373
+26955 27126 27140
+27375 27182 27125
+28011 27989 27922
+27634 27635 27468
+27652 27634 27467
+27403 27375 27446
+26238 26116 25844
+25651 25652 25571
+26049 26237 25844
+27375 27202 27182
+27376 27377 27203
+27184 27141 27140
+27203 27202 27376
+25772 25652 25651
+26503 26234 26502
+26929 26955 26869
+26870 26869 26930
+26844 26929 26869
+27904 27922 27730
+27633 27446 27374
+28185 28011 28010
+27923 27905 27730
+28182 28501 28183
+28183 27903 27902
+28201 28202 28184
+28011 27922 27988
+28202 28203 28185
+28201 28270 28314
+28670 28671 28628
+28314 28566 28503
+28186 28272 28012
+29313 29341 29202
+28671 28565 28628
+28842 28899 28900
+28182 28183 27902
+28900 28670 28628
+28671 28672 28629
+29011 29242 29243
+29768 29515 29514
+29517 29199 29516
+29313 29243 29312
+28900 28970 28901
+29983 29972 29971
+29515 29198 29197
+29779 29797 29806
+27626 27898 27627
+29518 29519 29340
+28899 28842 28968
+29765 29588 29764
+28837 29196 28838
+29515 29197 29514
+28838 28497 28837
+28840 28841 28500
+28839 28838 29197
+29201 29011 29243
+28501 28502 28183
+29199 29200 28841
+28841 28842 28501
+28840 29199 28841
+28899 29011 29012
+29583 29761 29584
+29511 29510 29587
+29191 29192 28833
+28835 29194 28836
+29583 29582 29760
+30167 29965 30166
+28491 28172 28490
+29582 29759 29760
+29756 29504 29503
+28490 28172 28171
+28832 28833 28492
+27613 27884 27885
+27354 27612 27613
+28825 28824 29183
+27358 27107 27357
+28483 28164 28482
+29497 29182 29181
+28824 28823 29182
+29186 28827 29185
+29755 29503 29502
+29186 28828 28827
+30162 30482 30483
+29539 29538 29577
+29749 29952 29750
+29497 29181 29496
+32033 31401 31400
+30788 30469 30468
+29954 29751 29953
+30472 30791 31391
+29538 29499 29576
+29506 29758 29580
+29795 29963 29762
+29962 29961 30164
+29582 29581 29759
+29580 29759 29581
+28492 28491 28832
+29509 29585 29586
+29762 29963 29796
+29762 29761 29795
+29760 29795 29761
+29192 29191 29508
+30804 30485 30484
+30161 30482 30162
+31415 30804 30803
+30163 30162 30484
+31414 30803 31413
+30484 30483 30803
+29959 30161 29960
+29504 29188 29187
+30481 30482 30161
+29961 30163 30164
+30796 30477 30476
+30478 30479 30160
+31384 32017 31385
+30791 31389 31390
+31385 32017 32018
+30159 29957 29956
+30796 30476 30795
+32027 32025 32024
+30793 30792 31393
+30472 30473 30157
+31394 31395 30793
+32023 31390 32022
+30479 30480 30160
+30796 31400 31401
+32048 32047 32046
+30476 30475 30795
+31392 31391 32024
+32031 32032 31398
+31407 32040 31408
+31393 31392 32025
+30481 30800 31409
+32043 32045 32044
+32042 31410 31409
+32038 32033 32039
+32048 31415 31414
+32041 32043 32042
+31412 31413 30802
+32049 31415 32048
+31418 32051 31419
+30805 31419 30486
+31418 31417 32051
+32046 32049 32048
+31417 30805 30804
+32056 32051 32050
+31444 31443 32077
+32060 32056 32066
+32066 32068 32067
+32066 32065 32064
+30814 31437 30815
+30492 30491 30811
+32052 31420 31419
+32061 32060 32063
+32056 32050 32046
+31427 30809 31426
+32056 31422 32055
+31419 30806 30486
+31420 32052 32053
+32055 31421 32054
+30807 30487 31421
+29588 29587 29764
+31433 32065 32066
+30814 31436 31437
+32068 32069 31436
+29512 29588 29765
+30813 31434 31435
+32072 32071 32074
+30821 31449 31450
+30495 30814 30815
+30816 31440 31441
+31440 31439 32073
+31443 32076 32077
+28844 28901 28630
+29981 29996 30007
+31447 30820 30500
+31449 32082 31450
+30007 30173 30008
+30184 30503 30185
+31451 31450 32084
+31453 32085 32086
+30819 31447 30500
+31446 32079 31447
+30821 30501 31449
+32080 32079 32082
+32080 31447 32079
+32071 31438 32070
+32074 32082 32079
+31453 32087 31454
+29778 29816 29805
+29613 29551 29778
+29791 29994 29995
+29791 29817 29994
+30006 30018 30182
+30196 30197 30019
+29995 29818 29791
+30198 30020 29995
+30845 30844 31477
+30515 30018 31473
+31473 30841 30515
+30844 30845 30199
+30182 30196 30019
+30515 30841 30197
+30197 30196 30515
+30182 30018 30196
+30197 29995 30019
+30197 30198 29995
+29600 29612 29789
+29600 29348 29526
+29613 29778 29805
+29551 29600 29778
+29552 29613 29790
+29791 29552 29790
+29526 29550 29612
+29526 29250 29319
+29600 29526 29612
+29348 29250 29526
+29549 29550 29347
+29549 29347 29525
+29319 29250 29017
+29789 29612 29599
+29347 29346 29525
+29347 29319 29249
+29549 29525 29318
+29346 29347 29249
+28972 29015 29248
+28902 29248 29015
+29346 29249 29318
+29551 29251 29348
+28905 28675 28973
+29249 29319 29017
+28904 28971 28972
+28902 29015 28971
+29248 29016 28972
+29248 29318 29016
+28973 28904 29016
+28904 28903 28971
+28320 28017 28319
+28902 28971 28903
+29016 28904 28972
+28320 28018 28017
+30828 30827 31457
+29249 28973 29016
+28321 28208 28320
+30189 30829 30509
+29553 29320 29350
+30833 31463 30834
+31460 30830 31459
+31467 31468 30838
+29614 29553 29350
+30198 30843 30517
+30517 30199 30198
+30841 30842 30516
+30518 30200 30199
+30198 30199 30020
+30517 30844 30199
+30516 30198 30197
+30516 30842 30198
+30020 29819 29818
+31470 30840 31469
+30839 30195 30838
+30513 30838 30195
+31469 30840 30839
+30840 30514 30839
+31468 31469 30839
+29818 29819 29615
+30201 30519 30848
+29820 29617 29616
+29617 29820 29821
+29616 29819 29820
+29618 29617 29821
+29354 29353 29617
+29820 30022 29821
+29820 30021 30022
+29819 30021 29820
+30200 30519 30201
+30021 30201 30022
+30021 30200 30201
+30845 30518 30199
+30845 30846 30518
+30520 30202 30201
+30022 30201 30202
+30022 30203 30204
+30022 30202 30203
+30203 30521 30852
+30203 30202 30521
+30521 30851 30852
+30521 30202 30851
+30855 30523 30204
+30203 30852 30853
+30848 31480 31481
+30851 30202 30850
+30201 30848 30849
+30519 30847 30848
+30850 30520 30849
+30850 30202 30520
+30198 30842 30843
+30843 30842 31475
+31473 31474 30841
+30843 30844 30517
+30841 31474 30842
+30842 31474 31475
+31479 31478 31476
+31476 30844 30843
+31480 30847 31479
+30519 30200 30847
+31477 31478 30845
+31479 30846 31478
+31474 31476 31475
+31474 31479 31476
+31476 31477 30844
+31476 31478 31477
+31482 31483 30850
+30849 31482 30850
+31488 31484 31479
+31480 31479 31481
+31484 30851 31483
+31483 30851 30850
+30205 30524 30206
+31484 31481 31479
+31481 31484 31482
+31484 30852 30851
+30852 31484 31485
+31483 31482 31484
+30854 30853 31486
+30522 30203 30853
+31488 31486 31485
+30853 31485 31486
+31489 30856 31488
+30522 30853 30854
+29619 29822 29823
+31492 31495 31493
+30862 31494 31495
+31493 31495 31494
+31493 30860 31492
+31487 31486 31488
+31491 31488 31492
+31485 31484 31488
+31491 31490 31488
+31491 30859 30858
+31490 31489 31488
+30206 30859 30525
+30856 30855 31488
+30854 31486 31487
+31492 30859 31491
+30526 30208 30207
+30025 29824 29823
+30859 31492 30860
+30527 30209 30208
+30860 31493 30861
+30209 30025 30208
+30861 31494 30862
+30210 30866 30867
+30867 30866 31499
+30208 30863 30527
+30862 31495 30863
+30210 30528 30866
+30864 31497 30865
+30210 30529 30211
+30870 31502 31503
+30210 30867 30529
+30866 30865 31498
+30867 30868 30529
+31499 30866 31498
+30211 30869 30530
+31500 30867 31499
+30864 31496 31497
+30863 31495 31496
+31499 31498 31500
+31497 31495 31498
+31501 30868 31500
+31500 30868 30867
+31501 31500 31502
+30869 31501 31502
+30869 30868 31501
+31503 31502 31504
+31500 31498 31502
+30872 30871 31504
+30870 30869 31502
+30873 31505 31506
+31504 31506 31505
+30878 30879 30216
+31510 30877 31509
+31510 31507 31506
+30874 31506 31507
+30876 31508 31509
+30876 30875 31508
+31528 31533 31530
+30218 30536 30882
+31512 31513 30880
+31515 31514 31513
+31511 31510 31512
+31515 30882 31514
+30882 30536 30881
+30534 30877 30878
+30876 31509 30877
+30879 30878 31511
+30879 30535 30216
+30877 30215 30876
+30876 30533 30875
+30215 30534 30216
+30215 30877 30534
+31512 30880 30879
+30881 30536 30217
+30216 30535 30029
+30879 30880 30535
+30213 30531 30872
+30213 30872 30873
+30215 30533 30876
+30214 30875 30533
+30214 30027 30213
+30871 31503 31504
+30871 30872 30531
+31504 31505 30872
+30874 30873 31506
+30532 30213 30873
+30212 30871 30531
+30212 30530 30870
+30871 30212 30870
+30212 30211 30530
+30871 30870 31503
+30530 30869 30870
+30026 30210 30211
+30528 30865 30866
+29824 30025 30026
+30209 30210 30026
+29827 29826 30028
+29825 30026 30027
+29622 29825 29826
+30212 30531 30027
+30214 30213 30532
+30027 30531 30213
+30214 30532 30874
+30534 30878 30216
+30535 30217 30029
+30535 30880 30217
+29828 29624 29827
+29623 29622 29826
+30028 30214 30533
+29624 29360 29623
+29360 29359 29623
+29361 29360 29624
+29359 29622 29623
+30029 29828 29827
+29362 29030 29361
+29031 28689 29030
+28687 29028 29029
+29029 29028 29360
+28685 28686 28331
+29360 29028 29359
+28687 28332 28686
+29028 29027 29359
+29028 28687 28686
+29826 29825 30027
+29622 29358 29621
+29359 29358 29622
+29027 29026 29358
+29621 29357 29620
+29619 29355 29618
+29825 29621 29824
+29358 29026 29357
+29622 29621 29825
+29358 29357 29621
+29621 29620 29824
+29357 29025 29356
+30205 30523 30856
+29024 29025 28683
+29620 29356 29619
+29620 29357 29356
+30525 30207 30206
+30526 30861 30862
+29620 29823 29824
+29620 29619 29823
+30026 30025 30209
+29823 30024 30025
+30862 30208 30526
+30025 30024 30207
+30207 30525 30860
+30207 30861 30526
+30209 30528 30210
+30209 30865 30528
+30860 30525 30859
+30860 30861 30207
+30858 30859 30206
+30023 29821 30022
+30025 30207 30208
+30024 30206 30207
+31490 30858 30857
+30855 30204 30854
+31489 30857 30856
+31489 31490 30857
+30857 30858 30524
+31490 31491 30858
+30855 30856 30523
+30857 30524 30856
+31487 30855 30854
+31487 31488 30855
+30524 30205 30856
+30206 30024 30023
+30022 30204 30023
+30522 30854 30204
+30523 30205 30204
+29822 29619 29618
+30023 30205 30206
+30023 30204 30205
+29024 29355 29356
+29822 29821 30023
+29354 29618 29355
+29354 29617 29618
+30024 29822 30023
+30024 29823 29822
+30508 30828 30829
+31457 31458 30828
+31458 30829 30828
+31459 30830 30829
+30178 30508 30189
+30188 30506 30507
+30826 30507 30506
+30827 30828 30508
+30826 30827 30507
+30177 30176 30187
+30002 30012 30178
+29987 30002 30013
+29987 30013 30003
+30002 30178 30013
+30191 30014 30190
+30014 30003 30179
+30192 30015 30191
+29990 30014 30191
+29989 30014 29990
+29988 30003 30014
+30191 30190 30510
+30014 30179 30190
+30015 29990 30191
+29978 29815 29814
+30511 30192 30191
+29979 29815 29978
+30511 30834 30835
+30830 30509 30829
+30830 30831 30509
+30831 30832 30510
+31462 31463 30833
+30190 30831 30510
+31460 31461 30831
+30831 31461 30832
+30511 30833 30834
+30512 30835 30836
+30192 30511 30835
+30016 30192 30193
+30192 30835 30512
+30016 30193 30180
+30512 30836 30513
+30194 30513 30195
+30512 30513 30193
+30195 30839 30514
+28328 28682 28683
+28682 29023 29024
+29357 29026 29025
+29027 28685 29026
+28681 29022 29023
+29022 29354 29023
+28679 29021 28680
+29352 29353 29021
+28682 28681 29023
+28680 29021 29022
+28329 28684 28330
+28683 29025 28684
+28684 28685 28330
+28686 28332 28331
+29027 28686 28685
+29027 29028 28686
+28683 28682 29024
+28325 28679 28680
+28328 28327 28682
+27931 27712 27744
+30016 30180 30005
+30005 30180 30017
+30193 30513 30181
+30180 30181 30017
+30180 30193 30181
+30005 30004 30016
+30005 29992 30004
+28326 28325 28680
+27930 27710 27709
+28681 28326 28680
+27748 28026 28027
+27386 27418 27221
+28682 28327 28681
+28681 28327 28326
+28328 28026 28025
+28028 28027 28330
+28026 28328 28329
+28330 28331 28028
+28330 28685 28331
+27754 28033 27755
+28030 28332 28333
+27751 28029 28030
+27750 27749 28028
+27748 28027 27749
+28026 28329 28027
+28029 28028 28331
+28029 27751 27750
+27747 28025 28026
+27385 27220 27191
+28029 27750 28028
+27487 27225 27486
+27750 27751 27487
+28030 28333 28031
+27486 27485 27749
+27665 27639 27664
+27748 27747 28026
+27192 27386 27193
+27664 27481 27638
+27745 27712 27931
+28327 28024 28326
+28327 28025 28024
+27931 27744 28023
+27712 27662 27744
+27743 27744 27711
+27743 27711 27710
+26972 26936 26935
+27930 27709 27742
+27710 27711 27662
+27411 27412 27380
+27381 27217 27148
+27479 27637 27661
+27661 27741 27742
+27661 27637 27741
+27743 27710 27930
+29978 29814 29990
+29813 29786 29804
+29990 29979 29978
+29992 29979 29991
+29814 29989 29990
+29611 29610 29786
+29977 29987 30003
+29785 29804 29777
+29988 29813 29977
+29787 29611 29786
+29977 29804 29812
+29785 29812 29804
+29802 29803 29776
+29804 29786 29777
+29813 29787 29786
+29788 29787 29813
+27478 27659 27660
+27478 27410 27659
+29786 29610 29777
+29598 29597 29610
+29523 29547 29524
+29610 29596 29609
+29776 29609 29775
+29777 29610 29609
+29546 29594 29523
+29595 29596 29547
+29523 29524 29345
+29523 29522 29546
+29544 29592 29545
+29545 29592 29593
+27738 27929 28018
+29775 29784 29776
+29773 29607 29606
+29774 29608 29607
+29607 29594 29593
+29595 29547 29594
+29782 29800 29783
+28018 28189 28019
+29782 29783 29774
+29773 29774 29607
+29801 29800 29809
+29773 29782 29774
+29809 29973 29810
+29812 29803 29976
+29784 29783 29801
+29784 29801 29802
+29783 29800 29801
+29774 29775 29608
+29802 29776 29784
+29777 29609 29776
+29776 29803 29785
+29802 29811 29803
+29776 29785 29777
+29803 29812 29785
+29811 29975 29976
+29801 29810 29802
+29986 30000 30001
+29974 29985 29975
+29985 29986 29975
+29974 29973 29984
+29984 29999 29985
+30177 30012 30176
+29985 30000 29986
+30178 30012 30177
+30188 30187 30506
+30188 30177 30187
+30825 30826 30506
+31455 31456 30826
+31455 30826 30825
+30506 30505 30825
+30186 30176 30175
+30012 30011 30176
+30012 30001 30011
+30000 29985 29999
+30176 30011 30175
+30505 30187 30186
+28905 29017 28906
+28321 28275 28209
+30000 29999 30010
+28209 28189 28208
+28275 28210 28209
+29985 29974 29984
+29810 29801 29809
+29811 29974 29975
+29811 29802 29810
+28209 28019 28189
+29974 29810 29973
+29974 29811 29810
+28189 28018 28208
+27737 27474 27736
+28207 28569 28570
+28018 28019 27738
+28505 28318 28274
+28017 27929 27737
+28207 28319 28016
+28570 28904 28675
+28208 28018 28320
+28673 28674 28569
+28674 28903 28570
+28973 28675 28904
+28320 28319 28675
+29017 28905 28973
+28903 28674 28902
+28673 28632 28631
+28674 28673 28845
+28632 28569 28631
+28902 28674 28845
+28570 28569 28674
+28631 28569 28505
+28207 28570 28319
+28845 28631 28902
+28505 28569 28318
+28632 28673 28569
+28317 28505 28274
+28568 28631 28505
+28274 28273 28317
+28205 28188 28014
+28204 28317 28273
+28568 28505 28317
+28568 28317 28204
+28318 28206 28274
+27992 27927 27926
+28206 28207 28016
+28318 28569 28207
+28016 27928 28206
+27473 27474 27210
+27926 27925 27991
+28204 28205 28014
+28273 28188 28205
+28273 28274 28188
+28014 27992 28013
+27707 27656 27706
+28204 28187 27925
+27734 27926 27735
+28013 28187 28014
+27657 27735 27658
+27926 27927 27735
+27991 28013 27926
+27991 27925 28013
+28204 28014 28187
+28188 28015 27992
+28013 27992 27926
+28014 28188 27992
+28015 27928 27927
+28015 28206 27928
+28018 27929 28017
+28016 27736 27928
+28016 27737 27736
+28017 27737 28016
+27656 27734 27708
+27925 27926 27734
+27656 27708 27657
+27734 27735 27708
+27656 27657 27472
+27708 27735 27657
+27737 27475 27474
+27474 27473 27736
+27736 27473 27658
+27210 26963 27209
+27408 27656 27472
+27706 27733 27707
+27925 27733 27654
+27925 27734 27707
+27925 27707 27733
+27734 27656 27707
+27449 27636 27470
+27654 27655 27471
+27407 27470 27471
+27636 27471 27470
+27636 27654 27471
+27185 27143 27142
+27143 26960 26875
+27144 27185 27186
+27449 27654 27636
+26933 27129 26959
+27142 26959 27129
+26847 26958 26872
+26932 26933 26874
+26958 27129 26933
+26958 26932 26872
+26932 26874 26849
+26634 26847 26668
+26669 26848 26872
+26669 26847 26848
+26669 26872 26849
+26872 26932 26873
+26958 26933 26932
+27143 26875 26959
+26313 26314 25852
+27185 27205 27186
+27185 27378 27205
+27143 27144 26960
+27186 27205 27144
+27205 27206 27144
+26960 27144 27187
+27206 27187 27144
+27379 27207 27187
+27408 27146 27407
+26961 27145 27146
+27206 27379 27187
+27406 27449 27379
+27142 27378 27185
+27378 27206 27205
+27378 27406 27206
+27378 27449 27406
+27379 27449 27407
+27449 27470 27450
+27408 27407 27471
+27146 27207 27407
+27146 27408 27208
+27471 27655 27408
+29520 29343 29342
+29522 29521 29545
+29342 29315 29314
+29522 29545 29546
+29342 29343 29315
+29520 29544 29521
+29520 29521 29343
+29544 29545 29521
+29343 29344 29316
+29343 29521 29344
+29345 29522 29523
+29344 29521 29522
+29343 29316 29315
+29344 29522 29317
+29316 29344 29317
+29204 29245 29246
+29246 29315 29247
+26966 27213 26967
+29203 29245 29204
+27211 26964 27210
+29314 29246 29245
+26677 26319 26676
+27475 27211 27474
+26965 26964 27211
+26674 26962 26963
+27208 27472 27209
+27472 27208 27408
+26962 26674 26673
+27209 26962 27208
+27209 26963 26962
+26315 26673 26674
+25382 25383 24876
+25852 26314 25853
+26672 26673 26314
+26552 26317 26675
+26121 25855 26316
+26315 26316 25854
+26674 26963 26675
+26317 26316 26675
+26677 26676 26965
+26124 25857 26123
+26967 26678 26966
+26967 26679 26678
+26678 26679 26321
+26968 27216 27148
+25858 26320 25859
+26319 26677 26320
+26676 26319 26318
+26552 26318 26317
+26552 26676 26318
+26122 26239 26123
+26317 26318 26239
+26122 26123 25856
+26239 26318 26123
+26319 26124 26318
+26319 25857 26124
+26321 25859 26320
+26052 26121 26122
+26121 26317 26122
+25857 25858 25386
+26319 26320 25858
+26316 25855 25854
+25856 25384 25855
+26317 26121 26316
+26122 25856 26052
+25855 26052 25856
+25855 26121 26052
+26316 26315 26674
+25854 25383 25853
+26313 26672 26314
+26315 25853 26314
+26315 25854 25853
+25380 25851 25381
+26671 26874 26875
+26550 26120 26310
+26120 26311 25849
+26311 26669 26670
+26847 26669 26551
+25850 25849 26311
+26671 26672 26313
+26312 26671 26313
+26875 26960 26671
+26670 26669 26849
+26311 26551 26669
+26311 26670 26312
+26849 26874 26670
+26551 26550 26668
+26668 26550 26634
+26311 26120 26550
+26847 26551 26668
+26311 26550 26551
+26549 26310 26506
+26119 25848 26118
+26505 26506 26310
+26549 26550 26310
+26505 26549 26506
+26634 26550 26549
+26117 26505 26309
+26634 26549 26505
+25848 26117 26118
+26309 26119 26118
+25848 25657 26117
+26505 26310 26119
+25374 25293 25373
+26118 26117 26309
+26051 25846 26117
+26505 26119 26309
+26120 25849 26119
+25377 25656 25657
+26051 26117 25847
+25847 25846 26051
+25774 25654 25846
+25656 25775 25847
+25774 25846 25775
+25292 25150 25291
+25073 25150 25074
+25149 25291 25150
+25373 25292 25291
+25373 25293 25292
+25574 25373 25291
+25656 25774 25775
+25575 25374 25574
+24660 24870 24393
+25575 25375 25374
+25375 25654 25576
+25576 25295 25375
+25375 25575 25654
+25153 25076 25295
+25075 25293 25152
+25293 25294 25152
+25293 25374 25294
+25076 25152 25295
+25076 25075 25152
+24791 24866 24867
+25151 25293 25075
+24868 25074 25075
+25074 25151 25075
+24222 24392 24659
+24869 24868 25076
+24660 24659 24869
+24392 24338 24391
+24658 24391 24594
+24867 24866 25073
+24658 24868 24793
+24792 25074 24868
+25072 24866 24865
+24867 25074 24792
+25072 25073 24866
+25149 25150 25073
+24791 24867 24792
+25073 25074 24867
+24789 25072 24865
+25149 25073 25072
+25072 24789 25149
+24865 24790 24789
+24594 24593 24657
+24656 24789 24790
+24592 24655 24656
+24591 24789 24655
+24593 24592 24656
+24389 24591 24592
+24790 24657 24656
+24391 24220 24337
+24336 24337 24220
+24336 24389 24390
+24390 24389 24592
+24336 24335 24389
+24337 24390 24593
+24337 24336 24390
+23994 24183 23995
+24183 24388 24334
+24184 24183 24217
+23994 23946 24183
+24218 24184 24217
+23996 23995 24184
+24184 24185 23996
+24218 24335 24219
+24334 24335 24218
+24388 24389 24335
+24185 24219 24186
+24335 24336 24219
+24792 24658 24791
+24338 24220 24391
+24338 24221 24220
+23997 23950 23836
+24220 24221 24187
+24393 23999 24222
+24000 23592 23999
+24187 24221 23998
+24338 24392 24221
+24659 24392 24595
+24222 24221 24392
+24659 24595 24658
+24392 24391 24595
+24658 24594 24791
+24593 24656 24657
+24791 24594 24657
+24391 24593 24594
+24659 24658 24793
+24595 24391 24658
+24869 24659 24793
+24393 24222 24659
+25153 24660 24869
+24393 24659 24660
+25383 24877 24876
+25658 25384 25383
+25386 25385 25857
+24871 24872 24395
+23595 24003 23596
+24394 24001 24000
+24395 24396 24002
+23595 24002 24003
+24001 24395 24002
+23597 24004 24005
+25384 25658 25855
+24007 24008 23600
+25385 24878 25384
+24404 24405 24011
+24405 24012 24011
+24010 24404 24011
+25388 25860 25389
+25388 25387 25859
+25384 25856 25385
+24880 24879 25386
+25386 25858 25387
+25389 25861 25390
+25859 25860 25388
+24877 25384 24878
+24877 25383 25384
+24879 24878 25385
+25849 25379 25378
+24395 24394 24871
+25378 24872 24871
+25379 25850 25380
+24660 25153 24870
+24869 25076 25153
+25153 25154 24870
+25153 25295 25376
+24396 24873 24397
+25379 25849 25850
+25774 25656 25576
+25154 25153 25376
+25574 25654 25575
+25574 25846 25654
+25295 25576 25376
+25655 25774 25576
+25654 25655 25576
+25654 25774 25655
+25657 25656 25847
+25154 25376 25656
+26117 25657 25847
+25377 24870 25154
+24872 25379 24873
+24872 25378 25379
+24871 24870 25377
+25377 25378 24871
+25851 25852 25381
+25850 25851 25380
+25859 25387 25858
+24881 24880 25387
+26680 26323 26322
+26507 26126 26326
+26328 26508 26329
+26326 26126 26125
+26325 26326 26125
+26507 26327 26126
+26507 26508 26327
+26327 26240 26126
+26327 26508 26328
+26127 26328 26329
+26240 26327 26328
+25865 26127 26241
+26127 26329 26241
+26240 26328 26127
+26128 26241 26242
+26128 25865 26241
+25867 25660 26054
+26128 26242 26129
+27417 27192 27220
+25776 25660 25867
+25866 26130 26054
+25662 25395 25778
+25867 26054 25868
+25393 25865 25659
+26053 26129 25866
+25660 25776 25661
+25867 25868 25776
+25659 25865 26053
+26125 26126 25864
+25659 26053 25866
+25865 26128 26053
+25390 25862 25391
+26323 26324 25862
+24883 25389 25390
+25860 26322 25861
+25393 25392 25864
+25862 26324 25863
+25388 25389 24882
+25860 25861 25389
+24883 25390 24884
+25861 25862 25390
+24886 25392 25393
+24407 24883 24884
+25862 25863 25391
+24014 24408 24015
+25392 24886 24885
+24886 24887 24410
+24887 24411 24410
+24017 24411 24018
+25777 25776 25868
+25394 25395 24888
+25661 25777 25395
+25662 25577 25395
+25396 25155 25577
+25394 25661 25395
+25394 25660 25661
+25663 25662 25778
+25663 25577 25662
+25660 25659 25866
+25659 25660 25394
+25866 26054 25660
+25395 25777 25778
+25661 25776 25777
+25577 25663 25578
+25397 25579 25580
+25578 25663 25579
+25398 25397 25580
+25578 25396 25577
+25156 25579 25397
+25398 25399 25157
+25156 24889 25155
+25398 25296 25397
+25156 25155 25396
+25578 25156 25396
+25397 25296 25156
+25398 25157 25296
+25297 24890 25157
+24416 24597 24224
+24415 24596 24223
+24223 24416 24224
+24596 24662 24597
+25399 25297 25157
+24892 24891 25159
+24892 24661 24891
+25580 25399 25398
+26330 26510 26331
+25159 25158 25297
+26244 26132 26131
+25870 25664 25869
+26134 26055 26133
+26334 26244 26512
+25869 26132 26133
+25869 26131 26132
+26335 26334 26563
+26640 26510 26560
+26512 26562 26563
+26512 26244 26333
+26333 26511 26562
+26333 26244 26243
+26512 26333 26562
+26244 26131 26243
+26333 26243 26332
+26131 26331 26243
+26333 26332 26511
+26243 26331 26332
+26558 26509 26330
+26559 26639 26560
+26509 26510 26330
+26690 26561 26640
+26511 26332 26561
+26638 26687 26885
+26637 26687 26638
+26557 26638 26558
+26557 26637 26638
+26882 26883 26852
+26852 26686 26636
+26852 26853 26686
+26636 26637 26557
+26636 26686 26884
+26689 26560 26639
+26559 26558 26688
+26689 26639 26688
+26559 26688 26639
+26509 26560 26510
+26509 26559 26560
+26690 26640 26689
+26561 26510 26640
+26690 26689 26886
+26640 26560 26689
+26979 26690 26886
+26562 26511 26690
+27225 26978 26977
+26688 26638 26885
+26885 26884 26977
+26687 26637 26884
+26939 26882 26975
+27157 26976 27156
+26940 26853 26883
+26884 26940 26977
+26884 26853 26940
+26977 26978 26885
+27225 27487 27226
+27225 27157 27224
+26977 26940 27157
+27228 27490 27229
+26136 26336 26337
+27156 27135 27155
+26881 26882 26852
+26975 26882 26881
+26939 27156 26976
+26975 27135 27156
+27223 27154 27195
+26881 26938 26975
+27133 27132 27195
+27222 27418 27419
+27485 27223 27419
+27155 27134 27223
+27132 27153 27195
+27221 27152 27193
+27154 27133 27195
+27134 26973 27133
+27154 27134 27133
+26974 26938 26937
+27223 27134 27154
+27155 27135 26974
+27134 26974 26973
+27134 27155 26974
+26938 27135 26975
+26973 26974 26937
+26937 26938 26881
+26974 27135 26938
+27417 27220 27385
+26880 26851 26850
+26685 26555 26554
+26556 26555 26685
+26507 26326 26555
+26635 26683 26684
+26880 26685 26851
+26553 26635 26325
+26684 26685 26554
+26684 26554 26635
+26326 26325 26554
+26851 26683 26850
+26851 26684 26683
+26324 26682 26553
+26878 26935 26682
+26850 26553 26682
+26683 26635 26553
+26877 26876 26970
+26878 26877 26934
+26681 26876 26877
+26682 26879 26850
+26936 26880 26879
+26682 26935 26936
+26878 26934 26935
+27480 27712 27663
+26934 26877 26971
+27131 26972 26971
+27131 26936 26972
+27410 27214 27409
+26876 26680 26969
+27219 27385 27191
+27152 27192 27193
+27191 27220 27192
+27222 27153 27194
+27194 27153 27152
+27195 27153 27222
+27132 27152 27153
+27192 27417 27386
+27418 27222 27194
+27221 27194 27152
+27221 27418 27194
+26970 27190 27150
+27480 27662 27712
+27131 26971 27130
+27150 27130 26970
+27151 27150 27190
+27130 26971 26877
+27151 27130 27150
+27151 27131 27130
+27148 27188 26969
+27381 27216 27413
+27216 27412 27413
+26969 27188 27149
+27189 27149 27188
+27190 27189 27218
+27190 26970 27189
+26968 27215 27216
+27215 27410 27451
+26967 27214 27147
+27216 27215 27380
+27147 27214 27215
+27451 27410 27478
+27215 27214 27410
+27411 27451 27452
+27411 27215 27451
+27412 27411 27452
+27380 27215 27411
+27479 27412 27452
+27217 27218 27188
+27479 27413 27412
+27216 27381 27148
+27148 27217 27188
+27381 27382 27217
+27217 27382 27218
+27381 27413 27382
+27711 27744 27662
+27745 27663 27712
+27416 27219 27384
+27416 27415 27665
+27638 27481 27480
+27638 27480 27663
+27481 27453 27480
+27745 27638 27663
+27745 27664 27638
+27639 27482 27414
+27639 27665 27482
+27481 27664 27453
+27453 27639 27414
+27383 27219 27191
+27666 27665 27746
+27414 27415 27383
+27414 27482 27415
+27383 27384 27219
+27383 27415 27384
+27415 27416 27384
+27416 27385 27219
+27416 27665 27666
+27416 27483 27385
+27225 27226 26978
+27487 27751 27488
+27193 27386 27221
+27417 27418 27386
+27223 27195 27419
+27749 27485 27748
+27385 27483 27417
+27666 27747 27483
+27748 27484 27747
+27419 27418 27484
+27416 27666 27483
+27750 27486 27749
+27225 27224 27486
+27487 27488 27226
+27751 28030 27752
+29030 28688 29029
+28335 28690 28336
+29030 28689 28688
+29031 28690 28689
+28033 28336 28034
+28033 28335 28336
+28688 28334 28333
+28689 28335 28334
+27754 28032 28033
+28689 28690 28335
+28032 28031 28334
+27752 28030 28031
+27490 27489 27753
+27488 27751 27752
+27490 27753 27754
+27752 28031 27753
+27229 27490 27491
+27753 28032 27754
+28033 28032 28335
+27753 28031 28032
+27754 27755 27491
+28033 28034 27755
+28034 28337 28035
+29365 29033 29364
+28035 27756 28034
+28035 27757 27756
+28036 27757 28035
+27758 27759 27495
+28036 27758 27757
+27759 27496 27495
+28337 28338 28035
+27233 27495 27234
+28037 27758 28036
+28037 27759 27758
+28036 28339 28037
+28036 28035 28338
+28691 28692 28337
+28693 28339 28338
+28337 28692 28338
+29035 28694 28693
+28336 28691 28337
+28336 28690 28691
+28693 28692 29034
+28693 28338 28692
+28340 28694 28695
+28339 28693 28694
+29038 28696 29037
+28341 28038 28340
+28341 28340 28695
+28037 28339 28340
+28342 28341 28696
+28342 28039 28341
+28698 28343 28697
+27762 27761 28040
+29634 29371 29370
+28343 28342 28697
+29040 28698 29039
+27765 28043 28044
+29637 29841 29638
+28345 28346 28043
+29373 29636 29637
+28701 28346 28700
+28348 28702 28703
+28347 28701 28702
+29044 28703 28702
+28348 28349 28046
+28344 28698 28699
+28699 28700 28345
+28702 28348 28347
+28350 28705 28351
+28041 28042 27763
+28345 28043 28042
+28348 28045 28347
+27501 27502 27240
+28347 28045 28044
+28348 28046 28045
+28045 27766 28044
+28045 27767 27766
+26991 27238 27239
+28042 28043 27764
+27502 27501 27765
+27501 27500 27764
+27500 27238 27499
+27499 27762 27763
+27762 28041 27763
+28343 28698 28344
+28041 28344 28042
+28041 28343 28344
+28041 28040 28343
+27761 28039 28040
+27760 28039 27761
+27760 28038 28039
+27498 27497 27761
+27235 27496 27497
+27762 27498 27761
+27237 26989 27236
+27497 27236 27235
+27497 27498 27236
+27764 27500 27763
+26991 26990 27238
+27500 27499 27763
+27237 27498 27499
+27765 27501 27764
+27239 27238 27500
+27766 27502 27765
+27240 27239 27501
+27767 27503 27766
+27240 26992 27239
+26995 26706 26994
+27241 27502 27503
+27242 26994 27241
+26993 27240 27241
+27501 27239 27500
+26992 26703 26991
+27241 27240 27502
+26993 26992 27240
+26993 26704 26992
+26347 26702 26703
+26992 26704 26703
+26705 26994 26706
+27503 27242 27241
+26706 26351 26350
+26706 26350 26705
+24907 24429 24906
+25885 25415 25414
+25883 25882 26347
+26704 26705 26349
+26993 26994 26705
+26990 26702 26701
+26702 26347 26346
+26992 26991 27239
+26702 26990 26991
+26704 26348 26703
+25882 26346 26347
+27238 26990 27237
+26702 26346 26701
+26701 26700 26989
+25408 24901 24900
+26990 26701 26989
+26346 25881 26345
+26341 25876 26340
+26696 26985 26697
+26983 27230 27231
+25877 26341 26342
+26984 26696 26695
+26984 26985 26696
+27232 27494 27233
+27233 26986 26985
+26987 26698 26986
+26343 25878 26342
+27234 26987 26986
+27235 26988 26987
+27236 26988 27235
+27236 26989 26988
+26984 27232 26985
+27494 27495 27233
+27235 27234 27496
+26986 27233 27234
+27758 27494 27757
+27233 26985 27232
+27493 27231 27492
+27493 27232 27231
+27231 27232 26984
+27493 27494 27232
+27492 27230 27491
+27228 26981 26980
+27491 27490 27754
+27229 26981 27228
+27491 27230 27229
+27492 27231 27230
+27228 27489 27490
+27488 27752 27489
+27226 27227 26979
+27488 27489 27227
+26692 26980 26981
+27227 27489 27228
+27227 26980 26979
+27227 27228 26980
+26694 26982 26983
+26981 27229 26982
+26694 26983 26695
+26982 27230 26983
+26339 26338 26694
+26338 25873 26337
+26562 26691 26563
+26980 26692 26691
+26337 26693 26338
+26692 26981 26693
+26563 26334 26512
+26245 26133 26334
+25870 26055 26056
+25869 26133 26055
+26055 25870 25869
+26056 26135 25870
+26335 26245 26334
+26335 26246 26134
+26335 26134 26245
+26056 26055 26134
+26563 26564 26335
+26691 26692 26564
+26693 26337 26692
+25873 25668 25667
+26695 26339 26694
+25874 25873 26338
+25779 25871 26136
+26135 26246 26336
+26335 26336 26246
+26564 26692 26336
+25872 25779 26136
+25664 25870 25871
+25583 25667 25668
+25582 25666 25872
+25402 25300 25668
+25583 25400 25667
+25403 25669 25874
+25668 25873 25669
+25160 25300 25161
+25668 25669 25402
+25401 25299 25583
+25077 24894 24893
+25160 25077 25299
+25160 24894 25077
+25667 25400 25582
+24597 24416 24596
+25400 25581 25582
+25665 25871 25779
+25873 25872 26337
+25667 25582 25872
+25666 25779 25872
+25665 25664 25871
+25666 25665 25779
+25666 25582 25581
+25664 25665 25581
+25299 25077 25298
+24894 24663 24893
+25583 25299 25298
+25161 25402 25301
+25401 25300 25299
+25161 24894 25160
+24024 24226 24025
+24894 24794 24663
+25298 25077 24893
+24225 24224 24597
+24022 24223 24224
+23840 23839 24023
+24022 24224 24023
+24226 24024 24188
+24023 24224 24225
+23840 24024 23951
+24023 24225 24188
+24226 24188 24225
+24024 23840 24188
+23953 23842 23616
+24598 24895 24599
+24417 24666 24340
+25078 24895 24664
+24599 24339 24598
+24664 24895 24598
+24340 24666 24341
+23617 23843 23618
+24599 24665 24600
+24599 24600 24339
+24665 24666 24600
+24600 24417 24339
+24600 24666 24417
+24895 25078 25162
+24664 24794 25078
+24664 24663 24794
+24665 24599 24895
+25299 25300 25160
+25401 25668 25300
+24794 25161 25078
+25300 25402 25161
+25403 25301 25402
+25162 25078 25301
+24897 24667 24896
+25163 25162 25403
+25876 25405 25875
+25404 25874 25875
+24421 24898 24899
+23790 23846 23620
+25163 25403 25404
+25162 25301 25403
+24896 25163 25404
+24896 24667 24666
+24342 24227 24341
+24339 24417 24340
+24667 24342 24418
+24419 24229 24190
+24421 24420 24898
+23956 23845 23844
+24666 24667 24418
+24896 25404 24897
+24898 24897 25405
+24031 24422 24423
+24899 25407 24900
+24029 24421 24030
+24029 24231 24421
+24423 24422 24900
+24031 24030 24422
+23629 24036 23630
+24428 24427 24905
+24036 24037 23630
+24428 24429 24037
+24428 24905 24906
+24424 24902 24425
+25411 25882 25412
+24423 24901 24424
+25878 25407 25877
+24425 24902 24903
+24901 25409 24902
+24427 24904 24905
+24903 25411 24904
+25885 25886 25415
+24429 24428 24906
+25414 24907 24906
+25417 25887 25888
+25883 25413 25412
+24905 24904 25412
+25412 25413 24905
+25412 25882 25883
+25413 25414 24906
+25885 26350 25886
+25410 25411 24903
+25881 25882 25411
+26344 25880 25879
+25410 24902 25409
+25880 25410 25409
+25881 25411 25410
+24901 25408 25409
+24900 25407 25408
+26340 25875 26339
+25405 25404 25875
+24899 25406 25407
+24898 25405 25406
+25877 25876 26341
+25406 25405 25876
+25878 25877 26342
+25406 25876 25877
+26698 26343 26342
+25408 25407 25878
+26344 25879 26343
+25409 25408 25879
+26340 26339 26695
+25874 26338 26339
+26696 26340 26695
+26696 26341 26340
+26697 26341 26696
+26697 26342 26341
+26699 26343 26698
+26699 26344 26343
+26700 26344 26699
+26700 26701 26345
+26700 26345 26344
+26701 26346 26345
+25879 25880 25409
+26344 26345 25880
+26703 26348 26347
+26348 26349 25884
+25885 25884 26349
+25413 25883 25884
+26349 26348 26704
+25884 25883 26348
+25884 25885 25414
+26349 26350 25885
+27242 26995 26994
+26351 25886 26350
+26707 26351 26706
+26707 26708 26352
+26354 26353 26709
+25888 26352 26353
+26353 26352 26708
+25887 25886 26351
+26708 26709 26353
+26998 27246 26999
+26999 27247 27000
+24913 25421 24914
+27000 26712 26711
+27001 27002 26713
+26356 26712 26357
+26712 27001 26713
+25422 25892 25893
+26713 26714 26358
+26355 26354 26710
+26712 26356 26711
+26356 25891 26355
+26711 26356 26355
+26712 26713 26357
+26358 26357 26713
+25422 24915 24914
+25425 25424 25895
+26358 26714 26359
+25893 25894 25423
+25895 25896 25425
+26357 25892 26356
+26357 26358 25893
+26357 25893 25892
+26358 25894 25893
+25889 26354 25890
+25418 25417 25888
+25888 26353 25889
+26355 25891 25890
+26356 25892 25891
+25888 25887 26352
+25414 25415 24907
+25886 25887 25416
+25415 25886 25416
+25887 25417 25416
+25888 25889 25418
+24911 24433 24910
+25419 24911 25418
+24432 24909 24910
+24431 24908 24909
+24430 24907 24908
+24432 24431 24909
+24039 23850 23633
+24907 24430 24429
+24908 24431 24430
+23631 24037 24038
+24037 24429 24038
+24430 24039 24038
+24432 24910 24433
+25418 24911 24910
+25892 25422 25421
+24437 24045 24436
+24912 24434 24911
+24232 24046 24438
+25424 25425 24917
+25420 25421 24913
+24912 24911 25419
+24434 24433 24911
+25890 25420 25419
+25421 25420 25891
+24912 25419 25420
+25421 25422 24914
+25893 25423 25422
+24917 24668 24440
+25896 25670 25425
+24669 24441 24668
+24668 24441 24343
+24440 24343 24235
+24440 24668 24343
+24439 24233 24232
+24439 24234 24192
+24233 24047 24232
+24233 24192 24047
+23958 24192 24048
+24233 24439 24192
+24192 24193 24048
+24192 24234 24193
+23959 24235 24236
+24193 24234 24235
+24442 24344 24441
+24442 24236 24344
+25165 25079 24919
+24601 24442 24441
+24669 24601 24441
+24601 24670 24442
+24670 24601 24669
+24918 24795 24670
+24669 24918 24670
+24918 24919 24795
+24918 25165 24919
+25166 25302 25079
+25165 25166 25079
+25164 25165 24918
+25164 25425 25670
+26137 25671 25670
+25671 25584 25426
+25166 25426 25302
+25302 25426 25427
+25780 25897 25898
+25898 26138 26057
+26362 26363 26247
+26566 26718 26567
+26363 26362 26566
+26247 26138 26362
+25427 25426 25584
+25671 25672 25584
+25670 25671 25426
+25897 25780 25672
+25423 25424 24916
+25894 26359 25895
+25165 25670 25426
+25896 26137 25670
+25894 25895 25424
+26359 26360 25895
+25896 26360 26361
+27004 27003 27251
+26137 25897 25671
+26137 26138 25897
+26513 26566 26567
+26567 26718 26641
+26566 26565 26887
+26363 26566 26513
+26359 26715 26360
+26359 26714 26715
+26361 26716 26717
+26360 26715 26716
+26717 26887 26565
+27420 27517 27667
+27158 27008 27255
+26888 26887 27007
+26854 26888 27007
+26718 26887 26888
+26889 26719 26854
+26641 26718 26719
+26889 26854 27007
+26719 26888 26854
+26889 27007 27008
+27008 27158 27196
+27008 27007 27255
+27254 27516 27255
+28056 27778 27777
+27257 27256 27420
+27196 27158 27256
+27257 27420 27387
+27256 27255 27517
+27421 27257 27387
+27196 27256 27257
+27667 27518 27421
+27640 27421 27518
+27516 27517 27255
+27781 27667 27517
+27668 27518 27667
+27781 28059 28060
+28058 28360 28361
+27779 27516 27515
+27515 27514 27778
+27781 27780 28059
+27517 27516 27780
+27254 27515 27516
+27005 26716 27004
+27780 27779 28058
+27780 27516 27779
+27780 28058 28059
+27779 27778 28057
+28714 28360 28359
+28058 27779 28057
+27775 27776 27512
+28055 27777 27776
+27252 27513 27514
+27777 27514 27513
+27250 27251 27003
+27512 27776 27513
+27004 27252 27005
+27251 27513 27252
+27514 27253 27252
+27515 27254 27253
+27006 27253 27254
+27003 27004 26715
+27251 27252 27004
+27253 27005 27252
+27253 27006 27005
+27508 27772 27509
+27248 27001 27000
+27247 27248 27000
+27510 27249 27248
+27248 27249 27001
+27510 27511 27249
+26711 26999 27000
+27772 27771 28050
+26997 26998 26709
+26997 27245 26998
+26998 26999 26710
+27246 27247 26999
+27771 27507 27770
+27246 26998 27245
+26996 26995 27243
+26707 26706 26995
+26708 26996 26997
+26707 26995 26996
+27767 27504 27503
+27243 26995 27242
+27245 27244 27506
+27245 26997 27244
+27508 27507 27771
+27246 27245 27507
+27246 27508 27247
+27246 27507 27508
+27506 27505 27769
+27243 27242 27504
+27507 27506 27770
+27244 27505 27506
+27243 27504 27505
+27242 27503 27504
+28048 27769 28047
+27505 27504 27768
+28047 27769 27768
+28048 27770 27769
+28051 27773 27772
+27510 27248 27509
+27771 27772 27508
+28354 28709 28355
+27508 27509 27247
+27772 27773 27509
+27250 27512 27251
+27250 27511 27512
+28710 28356 28355
+27511 27510 27774
+27774 27775 27511
+29053 28711 29052
+27774 28053 27775
+27774 27773 28052
+29383 29052 29051
+28053 27774 28052
+28052 28354 28355
+28050 28352 28353
+28353 28051 28050
+28354 28052 28051
+28053 28052 28355
+27773 28051 28052
+27771 28049 28050
+27770 28048 28049
+28703 28349 28348
+27768 27767 28046
+28046 28047 27768
+28350 28351 28048
+28350 28048 28047
+28351 28049 28048
+28049 28352 28050
+28049 28351 28352
+28708 28353 28707
+28354 28051 28353
+28708 28707 29049
+28352 28706 28707
+28046 28349 28047
+28703 29045 28704
+28349 28350 28047
+28349 28704 28350
+29377 29046 29045
+28703 29044 29045
+28350 28704 28705
+28349 28703 28704
+29643 29380 29379
+29380 29644 29381
+29048 29049 28707
+29644 29847 29848
+28353 28708 28354
+29381 29645 29382
+28709 29050 29051
+28708 29049 29050
+28709 28710 28355
+28710 29052 28711
+28710 28709 29051
+28354 28708 28709
+29051 29052 28710
+29385 29648 29649
+29384 29053 29052
+28357 28055 28054
+29385 29054 29053
+29386 29650 29387
+28056 28358 28359
+29054 29386 29055
+28358 28713 28359
+28358 28712 28713
+28357 28711 28712
+29053 29054 28712
+29053 28712 28711
+29054 28713 28712
+28355 28356 28053
+28710 28711 28356
+28053 28054 27775
+28356 28711 28357
+28356 28357 28054
+28712 28358 28357
+27778 28056 28057
+27777 28055 28056
+28055 28358 28056
+28055 28357 28358
+28056 28359 28057
+28713 29055 28714
+29389 29057 29388
+28360 28057 28359
+28360 28714 28715
+28359 28713 28714
+28361 28360 28715
+28058 28057 28360
+28716 28361 28715
+28059 28058 28361
+29058 29059 28717
+28362 28059 28361
+28717 28362 28716
+28363 28060 28362
+28362 28717 28363
+29653 29390 29389
+29057 29056 29388
+28714 29055 29056
+29058 28717 28716
+28718 28363 28717
+29058 29057 29389
+28716 28715 29057
+29057 29058 28716
+29858 30060 29859
+29390 29059 29058
+28718 28717 29059
+29390 29391 29059
+29392 29656 29393
+30279 30280 30060
+29859 29860 29656
+29391 29654 29655
+30276 30058 30275
+29390 29653 29654
+29389 29388 29652
+29389 29390 29058
+29654 29391 29390
+29388 29387 29651
+29056 29055 29387
+29384 29648 29385
+29384 29647 29648
+29384 29385 29053
+29648 29852 29649
+29385 29649 29386
+29852 30054 29853
+29387 29650 29651
+29386 29649 29650
+30057 29856 29855
+29653 29389 29652
+29651 29854 29855
+29650 29853 29854
+29647 29851 29648
+29647 29850 29851
+29649 29853 29650
+29649 29852 29853
+30262 30581 30052
+30972 31605 30973
+30973 31606 30974
+30272 30056 30271
+31629 31630 30997
+29857 29856 30058
+29653 29652 29856
+29858 29857 30059
+29654 29653 29857
+29654 29858 29655
+30061 29860 29859
+29655 29858 29859
+29654 29857 29858
+30278 30597 30060
+30598 31006 30280
+30276 30595 30059
+30595 31000 30277
+30597 30278 31003
+30994 30274 30592
+30272 30590 30990
+30592 30274 30273
+30994 30995 30274
+30998 31630 31631
+30059 30595 30277
+30276 30594 30998
+30275 30594 30276
+30275 30997 30594
+31002 30596 31001
+30278 30277 30596
+30058 30593 30275
+30996 31629 30997
+30991 30591 30272
+30992 30273 30591
+30993 30592 30273
+30993 31626 30994
+30057 30272 30591
+30053 30265 30266
+30265 30976 30977
+30054 30585 30267
+30266 30978 30979
+30975 30974 31607
+30582 30263 30973
+30582 30973 30974
+30263 30972 30973
+31608 30975 31607
+30583 30264 30975
+30264 30582 30974
+30264 30263 30582
+30988 30589 30987
+30272 30271 30590
+30056 30270 30589
+30270 30269 30588
+30055 30587 30269
+30583 30265 30053
+30583 30976 30265
+30982 30268 30586
+30587 30055 30268
+30260 30578 30966
+31601 31600 31598
+30964 30965 30259
+30966 30967 30260
+30050 30577 30259
+31591 31590 31587
+30261 30969 30580
+30579 30967 30968
+30971 30581 30262
+30972 30263 30581
+30970 30971 30262
+31603 31604 30971
+30261 30968 30969
+30967 30966 31599
+30969 30970 30580
+30969 31602 30970
+30965 30964 31597
+30577 30963 30964
+30966 30965 31598
+30578 30259 30965
+30965 30966 30578
+31599 31600 30967
+30959 30575 30256
+30256 30048 30255
+30255 30574 30256
+31590 31591 30958
+30258 30576 30962
+30962 31595 30963
+30951 30571 30252
+30952 30953 30253
+30953 30572 30253
+30953 31586 30954
+30254 30573 30048
+30954 30572 30953
+30951 30252 30950
+30571 30253 30047
+30952 30253 30571
+30577 30258 30963
+30257 30575 30960
+30258 30049 30257
+30575 30049 30256
+30573 30255 30048
+30957 31589 31590
+30958 30256 30574
+30049 29848 29847
+30253 30254 30047
+30047 29846 29845
+30048 29847 29846
+29644 29645 29381
+30259 30578 30260
+30257 30576 30258
+30050 30258 30577
+30261 30051 30579
+30050 30259 30260
+30968 30261 30579
+30580 30970 30262
+29849 29850 29646
+30052 29851 29850
+29848 29849 29645
+30260 30579 30051
+30261 30262 30051
+29048 29380 29049
+29048 29047 29379
+29643 29644 29380
+29848 29645 29644
+29849 29646 29645
+29850 29647 29646
+29382 29383 29051
+29647 29384 29383
+29049 29381 29050
+29049 29380 29381
+29381 29382 29050
+29646 29383 29382
+28704 29046 28705
+29379 29380 29048
+29378 29379 29047
+29846 29847 29643
+29642 29643 29379
+29847 29644 29643
+28705 29046 29047
+29845 29846 29642
+29047 29046 29378
+28704 29045 29046
+29642 29378 29641
+29642 29379 29378
+28701 29043 28702
+29376 29045 29044
+28700 29042 28701
+29375 29376 29044
+29041 29372 29373
+30933 30243 30932
+29374 29375 29043
+30246 30043 30245
+29641 29377 29640
+29378 29046 29377
+29844 29641 29640
+29845 29642 29641
+29374 29638 29375
+29842 30044 29843
+29843 29844 29640
+29375 29638 29639
+30561 30242 30931
+29638 29841 29842
+29041 28700 28699
+29639 29638 29842
+29374 29637 29638
+28698 29040 28699
+30559 30240 30927
+29635 29636 29372
+29840 29841 29637
+29042 29373 29374
+30042 30242 30561
+29635 29839 29636
+29635 29838 29839
+30039 29838 29837
+29039 28698 28697
+29635 29634 29838
+29635 29371 29634
+29635 29372 29371
+29636 29373 29372
+29637 29374 29373
+29043 29042 29374
+28700 29041 29042
+29040 29041 28699
+29373 29042 29041
+29038 29039 28697
+29371 29040 29039
+29372 29040 29371
+29372 29041 29040
+29369 29037 29368
+28696 28695 29037
+29632 29369 29368
+29370 29038 29369
+29039 29038 29370
+28697 28696 29038
+29835 29631 29834
+29036 28694 29035
+29035 29034 29366
+29365 29364 29628
+29368 29036 29367
+29368 29037 29036
+28692 29033 29034
+28692 28691 29033
+29361 29030 29029
+29362 29031 29030
+29363 29032 29031
+29364 29033 29032
+29360 29361 29029
+29624 29828 29625
+29627 29363 29626
+29364 29032 29363
+29034 29365 29366
+29034 29033 29365
+29630 29629 29833
+29365 29628 29629
+29829 29625 29828
+29362 29361 29625
+29831 29627 29830
+29364 29363 29627
+29363 29362 29626
+30225 30543 30896
+29629 29628 29832
+29631 29630 29834
+29366 29629 29630
+29632 29631 29835
+29368 29367 29631
+30037 29836 29835
+29836 29633 29632
+30234 30553 30038
+29634 29370 29633
+29835 29836 29632
+30235 30554 30236
+29836 29837 29633
+30236 30555 30039
+30232 30551 30037
+30912 30913 30233
+30550 30232 30231
+29835 29834 30036
+30911 30551 30232
+29626 29830 29627
+29626 29829 29830
+30030 29829 29828
+30031 29830 29829
+29831 30033 29832
+30224 30543 30033
+29833 29832 30034
+30904 30905 30229
+30549 30231 30036
+30033 30543 30225
+30539 30220 30887
+30892 30223 30541
+30217 30536 30218
+30218 30537 30030
+30538 30220 30219
+31532 30900 30899
+30901 30546 30227
+30229 30547 30904
+30229 30035 30547
+30228 30227 30546
+30034 30545 30227
+30905 30548 30229
+30906 30907 30230
+30907 30549 30230
+30907 30908 30549
+30910 30550 30909
+30910 30232 30550
+30233 30551 30912
+30233 30037 30551
+30914 30552 30913
+30234 30233 30552
+30041 30240 30559
+30563 30043 30244
+30925 30239 30924
+30038 30235 30236
+30234 30914 30915
+30555 30237 30039
+30921 30556 30237
+30557 30040 30238
+30239 30240 30040
+29836 30038 29837
+30237 30238 30039
+29636 29840 29637
+29636 29839 29840
+30242 30041 30241
+30244 30042 30243
+29841 29840 30042
+29841 30043 29842
+30941 30940 31573
+29842 29843 29639
+30570 30251 30949
+30046 30250 30569
+30566 30248 30247
+30567 30249 30045
+30567 30944 30249
+30940 30247 30565
+30246 30245 30564
+30043 30563 30245
+30938 30246 30564
+30565 30044 30246
+30935 30244 30934
+30944 30945 30249
+30945 31578 30946
+30251 30570 30252
+30949 30950 30570
+30930 30560 30929
+30242 30241 30560
+30924 30557 30923
+30924 30239 30557
+30925 30558 30239
+30926 30927 30240
+31560 30928 30927
+30241 30041 30559
+30932 30561 30931
+30243 30042 30561
+30244 30562 30934
+30244 30243 30562
+30933 31566 30934
+30936 30563 30935
+30245 30937 30564
+30936 30935 31568
+31564 30932 30931
+30933 30562 30243
+30925 30926 30558
+30925 31558 30926
+31565 30933 30932
+31565 31566 30933
+30918 30919 30236
+30919 31552 30920
+30920 30921 30237
+31554 30922 30921
+31555 30922 31554
+30923 30238 30922
+30235 30917 30554
+31549 31550 30917
+30914 30913 31546
+30552 30233 30913
+30917 30916 31549
+30553 30234 30915
+30915 30914 31547
+30234 30552 30914
+31548 30915 31547
+30916 30235 30553
+30555 30920 30237
+30919 31551 31552
+30922 30556 30921
+30922 30238 30556
+30916 30553 30915
+30235 30038 30553
+30919 30555 30236
+30919 30920 30555
+30548 30906 30230
+30908 30909 30231
+31539 31540 30907
+30907 31540 30908
+30551 30911 30912
+31541 30909 30908
+31530 30898 30897
+30899 30226 30898
+31537 30905 30904
+30906 30548 30905
+31538 30906 30905
+31539 30907 30906
+30897 30544 30225
+30897 30898 30544
+30032 30541 30223
+30222 30540 30890
+30224 30542 30894
+30224 30223 30542
+30884 30537 30883
+30219 30030 30537
+30884 30885 30219
+30885 30886 30538
+30890 30540 30889
+30222 30221 30540
+30223 30892 30893
+30541 30891 30892
+31523 30890 31522
+30891 30541 30222
+31523 30891 30890
+31524 30892 30891
+31516 30884 30883
+30885 30538 30219
+31517 30885 30884
+30886 30887 30220
+31517 31518 30885
+30885 31518 30886
+30542 30893 30894
+30542 30223 30893
+31525 31526 30893
+30895 30224 30894
+30543 30895 30896
+30543 30224 30895
+30228 30903 30547
+31535 31536 30903
+30225 30896 30897
+31526 30894 30893
+31533 30900 31532
+30901 30227 30900
+31536 31537 30904
+31539 30906 31538
+31537 31534 31540
+31543 30911 30910
+31519 31523 31520
+31553 31554 30921
+31534 31536 31535
+31537 31538 30905
+31538 31537 31539
+31536 31534 31537
+30899 31531 31532
+31526 31525 31524
+31513 30881 30880
+30882 30883 30218
+31513 31514 30881
+31516 31517 30884
+30896 30895 31528
+31526 31527 30894
+31528 31529 30896
+31530 30897 31529
+31531 31530 31532
+31531 30898 31530
+31515 31519 31518
+31523 31524 30891
+30881 31514 30882
+30883 30882 31515
+30887 30886 31519
+31517 31516 31515
+31510 31515 31512
+31515 31516 30883
+31533 31534 30901
+30887 31519 31520
+31528 31527 31533
+31515 31523 31519
+31522 31521 31523
+31522 30889 31521
+30895 30894 31527
+31530 31533 31532
+31529 31528 31530
+30895 31527 31528
+31523 31527 31526
+31523 31533 31527
+31555 31554 31552
+31547 31544 31549
+31560 31555 31552
+31556 31557 30924
+31558 31557 31556
+31557 30925 30924
+31552 31553 30920
+31552 31554 31553
+31534 31544 31540
+31545 30913 30912
+30918 31550 31551
+31549 31552 31550
+30909 31542 30910
+31540 31544 31542
+30909 31541 31542
+30908 31540 31541
+31542 31543 30910
+31542 31544 31543
+31547 31545 31544
+31546 30913 31545
+31547 31546 31545
+31547 30914 31546
+31549 31548 31547
+31549 30916 31548
+31558 31559 30926
+31560 30927 31559
+31555 31558 31556
+31558 30925 31557
+31561 30928 31560
+30929 30241 30928
+30935 31567 31568
+31568 31569 30936
+31561 31562 30929
+31563 30931 30930
+31561 31563 31562
+31564 30931 31563
+31571 31569 31579
+31560 31558 31555
+31560 31559 31558
+30934 31566 31567
+31567 31566 31568
+30824 31454 30504
+31560 31552 31561
+31565 31564 31561
+31565 30932 31564
+31568 31566 31569
+31565 31561 31566
+31573 31571 31574
+30939 30246 30938
+30938 31570 31571
+30937 31569 31570
+31576 31575 31574
+30943 30567 30248
+30940 31572 31573
+30940 30939 31572
+30941 31573 31574
+31572 31571 31573
+31576 31579 31577
+31625 31624 31626
+31577 31579 31578
+31583 31580 31579
+31582 31583 30950
+31615 31610 31617
+31586 31585 31584
+30948 31581 30949
+31580 31583 31581
+31584 30951 31583
+30956 31588 31589
+31586 31584 31587
+31592 31591 31595
+30959 30256 30958
+31593 31592 31595
+30960 30575 30959
+30963 31595 31596
+31594 31593 31595
+30961 30257 30960
+30962 31594 31595
+30961 30960 31593
+31576 30943 31575
+31576 30944 30943
+31581 31582 30949
+31581 31583 31582
+31590 31589 31587
+30939 30938 31571
+30564 30937 30938
+31575 30942 31574
+30247 30940 30941
+31574 30942 30941
+31575 30943 30942
+30249 30945 30568
+30944 31577 30945
+30945 30946 30568
+31579 30947 30946
+31583 30951 30950
+31584 30952 30951
+30573 30956 30255
+30573 30955 30956
+31588 30955 31587
+30254 30572 30954
+31587 30955 30954
+31588 30956 30955
+30255 30957 30574
+30956 31589 30957
+30942 30566 30941
+30942 30248 30566
+30251 30569 30948
+30251 30046 30569
+30957 30958 30574
+31591 31592 30959
+31591 30959 30958
+31592 30960 30959
+31593 30960 31592
+31593 31594 30961
+30967 31600 30968
+31598 31602 31601
+30962 30961 31594
+30576 30257 30961
+30258 30962 30963
+30576 30961 30962
+31608 30976 30975
+31609 31610 30977
+30971 31604 30972
+31603 31602 31605
+30265 30977 30584
+30976 31609 30977
+30970 31602 31603
+31598 31597 31605
+31598 31599 30966
+31598 31600 31599
+30969 31601 31602
+30968 31600 31601
+30965 31597 31598
+31598 31605 31602
+31610 31607 31605
+31610 31608 31607
+31609 30976 31608
+30987 31619 31620
+30990 30590 30989
+30990 30991 30272
+30992 30591 30991
+30986 30985 31618
+30269 30587 30984
+30267 30980 30981
+30981 31614 30982
+31617 30984 31616
+30985 30269 30984
+30979 30978 31611
+30584 30977 30978
+31612 30979 31611
+30585 30266 30979
+30586 30267 30981
+30585 30979 30980
+30987 30589 30270
+30988 30271 30589
+30586 30981 30982
+31612 31611 31610
+30268 30983 30587
+30982 31615 30983
+30993 30994 30592
+30995 30593 30274
+31627 30995 30994
+30995 31628 30996
+31000 30999 31632
+30595 30276 30999
+31636 31004 31003
+31004 31005 30279
+31001 31000 31633
+30595 30999 31000
+31002 31001 31634
+30596 30277 31001
+31638 31006 31005
+30598 30279 31005
+30593 30996 30275
+30593 30995 30996
+30276 30998 30999
+30594 30997 30998
+30275 30996 30997
+30995 31627 31628
+31635 31002 31634
+31003 30278 31002
+31003 31004 30597
+31637 31005 31004
+31637 31638 31005
+31639 31007 31006
+31637 31635 31634
+31636 31003 31635
+31637 31636 31635
+31637 31004 31636
+31633 31632 31634
+30999 30998 31631
+31623 30990 31622
+31620 30988 30987
+31001 31633 31634
+31000 31632 31633
+30982 31614 31615
+31612 31610 31614
+31613 31612 31614
+30980 30979 31612
+30981 31613 31614
+30980 31612 31613
+31616 31615 31617
+31618 31617 31619
+31618 30985 31617
+31621 30989 30988
+30993 31625 31626
+30991 30990 31623
+31621 31620 31622
+31619 31617 31620
+30990 30989 31622
+31622 30989 31621
+32082 32074 32083
+31623 31624 30991
+31624 31623 31622
+31624 31625 30992
+31626 31627 30994
+31629 31628 31626
+31628 31629 30996
+31624 31629 31626
+31631 31634 31632
+31637 31634 31631
+31639 31638 31637
+31639 31006 31638
+30999 31631 31632
+31629 31637 31631
+31640 31639 31637
+31640 31007 31639
+31013 31646 31014
+31647 31648 31015
+31020 31652 31653
+31642 31641 31640
+31642 31009 31641
+31644 31643 31642
+31644 31011 31643
+31643 31011 31010
+31644 31012 31011
+30061 30599 30281
+30280 31007 30599
+31009 30600 30281
+31010 31011 30282
+30283 31013 30602
+31012 31645 31013
+31646 31645 31644
+31646 31013 31645
+31646 31647 31014
+31646 31648 31647
+31653 31021 31020
+30290 30065 30289
+31648 31649 31016
+31018 31650 31651
+31017 31018 30604
+31017 31016 31649
+31654 31022 31021
+31656 31023 31655
+31023 31024 30607
+31019 31651 31652
+31651 31646 31652
+31022 31654 31655
+31650 31649 31651
+31017 31649 31650
+31648 31646 31651
+31019 31018 31651
+31649 31648 31651
+31653 31654 31021
+31652 31020 31019
+31656 31655 31654
+31656 31653 31652
+31656 31654 31653
+31659 31656 31652
+31657 31024 31656
+31659 31657 31656
+31658 31026 31025
+31659 31658 31657
+31659 31026 31658
+31662 31661 31660
+31030 31663 31031
+31662 31660 31659
+31661 31028 31660
+30293 30611 31033
+31665 31663 31667
+31662 31659 31663
+31032 31664 31665
+31663 31665 31664
+31666 31665 31667
+31666 31033 31665
+30296 31038 31039
+31669 31668 31671
+31671 31672 31039
+31673 31672 31671
+31038 31670 31671
+31669 31671 31670
+31675 31677 31676
+31048 31047 31680
+31674 31678 31677
+31674 31673 31680
+31669 31037 31036
+31034 31033 31666
+31033 31032 31665
+30611 31031 31032
+30294 31034 31035
+30612 31033 31034
+31032 31031 31664
+31030 30610 31029
+31030 31029 31662
+31028 31661 31029
+30611 30292 31031
+31031 30292 31030
+31655 31023 31022
+30607 30289 30065
+30608 31025 31026
+31024 31657 31025
+31659 31027 31026
+31660 31028 31027
+31033 30611 31032
+30067 30292 30611
+30613 30294 31035
+30294 30293 30612
+31668 31036 31035
+29554 29662 29555
+31670 31037 31669
+30613 31035 31036
+30614 31037 31038
+30295 31036 31037
+30614 31038 30296
+31037 31670 31038
+30616 31041 31042
+31040 31039 31672
+31043 31042 31675
+30616 30297 31041
+31046 31045 31678
+30618 30299 31045
+30297 31040 31041
+30615 31039 31040
+31045 31044 31677
+30617 31043 31044
+30297 30615 31040
+30296 31039 30615
+30069 30296 30615
+31043 30616 31042
+30298 30297 30616
+30070 30298 30617
+30298 30069 30297
+29663 29528 29557
+30300 30070 30299
+31036 30295 30613
+30068 30295 30296
+30068 30613 30295
+30295 30614 30296
+30295 31037 30614
+30610 30292 30291
+29864 29661 29660
+30612 30293 31033
+30067 30611 30293
+30067 30293 30294
+30066 30290 30609
+30064 30287 30288
+30287 30606 30288
+30292 30066 30291
+29660 29659 29863
+31022 30288 30606
+31022 31023 30288
+30288 30607 30065
+30607 31025 30289
+30608 31026 30290
+31029 30610 30291
+31030 30292 30610
+30289 30608 30290
+30289 31025 30608
+30066 30609 30291
+30290 31027 30609
+31022 30606 31021
+30605 30287 30064
+31020 31021 30287
+31023 30607 30288
+31024 31025 30607
+31015 30284 30602
+30603 30285 30063
+31014 30602 31013
+30284 30062 30283
+31019 30605 30286
+31019 31020 30605
+30282 30601 30062
+31011 31012 30601
+30600 30282 30281
+30600 31010 30282
+31012 30283 30601
+30602 30284 30283
+30281 30282 30061
+30284 30603 30063
+30603 31016 30285
+30063 30285 30286
+30285 30604 30286
+29862 30064 29863
+30286 30605 30064
+29658 29862 29659
+29861 30063 29862
+29658 29861 29862
+29657 29860 29861
+29657 29656 29860
+29393 29061 29392
+29398 29554 29527
+28850 29066 28912
+29861 29658 29657
+29063 28907 28721
+30066 29865 29864
+29864 29865 29661
+29403 29260 29402
+29865 30067 29866
+29399 29527 29400
+29527 29554 29555
+29257 29066 29065
+29400 29527 29555
+29399 29398 29527
+29256 29321 29257
+29397 29554 29398
+29397 29398 29321
+29399 29400 29324
+29323 29398 29399
+29322 29321 29398
+29555 29401 29400
+29260 29208 29207
+29258 29323 29324
+29322 29398 29323
+29258 29324 29325
+29323 29399 29324
+29066 28911 29065
+28633 28846 28723
+29064 28909 28908
+29661 29554 29397
+29060 29392 29061
+29391 29655 29392
+29657 29394 29393
+29658 29659 29395
+29658 29395 29394
+29659 29396 29395
+28719 29060 29061
+28718 29059 29060
+29061 29393 29062
+29062 29063 28721
+29394 29395 29063
+29065 28909 29255
+28847 28723 28909
+29255 28909 29064
+28909 28723 28846
+29396 29064 29395
+29396 29255 29064
+29062 28720 29061
+28364 28718 28719
+28212 28365 28366
+28719 29061 28720
+28633 28722 28846
+28575 28574 28722
+28910 28724 28847
+28636 28579 28578
+28634 28633 28723
+28722 28908 28846
+28909 28910 28847
+29065 29256 29257
+28725 28636 28848
+28848 29065 28911
+28849 28848 28911
+28724 28910 28848
+29066 28850 28911
+28850 28638 28725
+28639 28726 28727
+29068 29206 29207
+28911 28850 28849
+28851 28726 28850
+29067 28852 28912
+28853 28727 28852
+28852 28913 28853
+29205 29206 29068
+28909 29065 28910
+29256 29397 29321
+28913 29067 29205
+28912 29066 29067
+29255 29256 29065
+29255 29397 29256
+29322 29257 29321
+29322 29323 29257
+29067 29258 29205
+29067 29066 29258
+29205 29259 29206
+29069 28856 28914
+29259 29326 29207
+28915 29070 28974
+29405 29560 29406
+28858 28730 28729
+29207 29069 28914
+29207 29208 29069
+29260 29209 29208
+29261 29070 29209
+28855 28854 28914
+28913 29205 29068
+28853 28854 28727
+28853 28913 28854
+28858 28857 28915
+28729 28856 28857
+28974 28858 28915
+28730 28646 28645
+28856 28915 28857
+29209 29070 28915
+29261 29071 29070
+28647 28859 28731
+29071 29072 28916
+28647 28731 28648
+28917 28860 28859
+28648 28649 28585
+28860 28861 28731
+28861 28732 28649
+28859 28860 28731
+28975 28732 28861
+28916 29072 28859
+28917 28861 28860
+29072 28917 28859
+29073 28861 28917
+28861 29073 28975
+29211 29075 29074
+28974 29071 28916
+29559 29530 29558
+29072 29073 28917
+29262 29210 29261
+29070 29071 28974
+29210 29072 29071
+29261 29210 29071
+29262 29403 29404
+29263 29404 29405
+29264 29076 29075
+29406 29327 29405
+29264 29211 29327
+29263 29262 29404
+29404 29531 29532
+29533 29406 29560
+29533 29561 29534
+29327 29263 29405
+29262 29261 29403
+29072 29262 29073
+29072 29210 29262
+29211 29263 29327
+29211 29073 29263
+29400 29401 29325
+29403 29261 29260
+29206 29259 29207
+29325 29401 29259
+29402 29326 29401
+29260 29207 29326
+29556 29402 29401
+29326 29259 29401
+29555 29556 29401
+29528 29403 29402
+29528 29529 29403
+29558 29530 29529
+29866 30068 29867
+29558 29529 29528
+29557 29402 29556
+29663 29557 29556
+29528 29402 29557
+29865 29866 29662
+29558 29528 29663
+29866 29867 29663
+30069 29868 29867
+29532 29405 29404
+29559 29531 29530
+29404 29530 29531
+29560 29532 29664
+29560 29405 29532
+29406 29407 29327
+29559 29532 29531
+29559 29664 29532
+29535 29534 29561
+29533 29560 29561
+29533 29534 29407
+29561 29665 29535
+29408 29562 29536
+29535 29665 29562
+29560 29665 29561
+29868 30070 29869
+29665 29868 29869
+29667 29870 29871
+29668 29667 29871
+29563 29536 29562
+29871 29872 29668
+29871 30073 29872
+29410 29564 29667
+28979 29079 28922
+29666 29563 29562
+29267 29268 29079
+29564 29563 29666
+29268 29267 29410
+29213 28981 29083
+29212 29411 29271
+28982 29084 29085
+29411 29270 29269
+29411 29212 29270
+29266 29078 29077
+29410 29269 29268
+28924 28864 29081
+29076 29265 29077
+29267 29563 29564
+29536 29409 29266
+29536 29563 29409
+29409 29267 29266
+29409 29563 29267
+29408 29535 29562
+29408 29265 29407
+29408 29407 29535
+29264 29327 29407
+29266 29408 29536
+29266 29077 29265
+28918 29075 28919
+29265 29408 29266
+29264 29265 29076
+29264 29407 29265
+29077 29078 28978
+29267 29079 29078
+29079 28979 29078
+28589 28590 28383
+29074 29075 28918
+29211 29264 29075
+28919 28976 28734
+29076 29077 28976
+28918 28919 28733
+29076 28976 28919
+28919 28734 28652
+28920 28978 28921
+28976 28920 28734
+28976 28977 28920
+28513 28514 28385
+28862 28922 28923
+28922 28735 28979
+28589 28383 28382
+29080 28923 29079
+29081 29270 29212
+29083 28981 28980
+28925 28865 28980
+28737 28864 28924
+28863 28923 28864
+28923 29081 28864
+28980 28865 28924
+29082 29083 28980
+28867 28866 28925
+29272 29084 29213
+28926 28868 28867
+29084 28926 28981
+28982 28927 28926
+29085 29084 29272
+28982 28926 29084
+29268 29080 29079
+29269 29270 29081
+28924 29081 28980
+29080 29269 29081
+29212 29082 29081
+29212 29271 29083
+29212 29083 29082
+29213 29084 28981
+29271 29213 29083
+29271 29272 29213
+29273 29086 29085
+28986 29087 28987
+29085 29086 28984
+29214 29087 28986
+28742 28930 28743
+29087 28988 28987
+28927 28983 28928
+29085 28984 28983
+28931 28986 28987
+28985 28984 29086
+28931 28985 28986
+28929 28984 28985
+28983 28927 28982
+28928 28869 28927
+28741 28870 28742
+28929 28985 28930
+28932 29088 29089
+28988 28932 28987
+28743 28930 28931
+28872 28744 28871
+28931 28987 28932
+29091 28991 29090
+28934 28745 28875
+28990 28934 28989
+28990 28991 28934
+29090 28990 28989
+28657 28658 28524
+28749 28876 28877
+28992 28935 29092
+28991 28935 28934
+29282 29281 29417
+28748 28936 28937
+28747 28935 28936
+29221 29093 28992
+28936 28935 28992
+29089 29219 28989
+29091 29092 28991
+29090 28991 28990
+29092 28935 28991
+29219 29089 29278
+28989 28933 29089
+29279 29220 29090
+29220 29280 29092
+28936 29093 28937
+28992 29092 29221
+29280 29221 29092
+29280 29417 29281
+29280 29281 29221
+29283 29282 29418
+29093 29281 29282
+29090 29220 29091
+29279 29416 29220
+29089 29218 29278
+29089 29088 29218
+29090 29219 29279
+29090 28989 29219
+29277 29217 29276
+29218 29088 29217
+29276 29216 29275
+29087 29214 29215
+29275 29216 29215
+29217 29088 29216
+29086 29274 29214
+29273 29272 29412
+29277 29276 29328
+29217 29216 29276
+29415 29277 29328
+29278 29218 29277
+29276 29275 29328
+29215 29214 29275
+29086 29273 29274
+29085 29272 29273
+29414 29413 29565
+29274 29273 29413
+29271 29412 29272
+29873 29670 29669
+29565 29413 29670
+30628 30310 30309
+30077 30631 30313
+30632 30314 30313
+29671 29874 29875
+29328 29414 29565
+29275 29413 29414
+29565 29415 29328
+29671 29416 29415
+29278 29416 29279
+29673 29876 29877
+29671 29672 29416
+29876 30078 29877
+29875 29876 29672
+30077 30313 30314
+30636 30317 31081
+31082 31083 30636
+30316 30635 30079
+30078 30315 30316
+30633 31075 31076
+30634 31079 30316
+31080 31081 30635
+30637 30318 31083
+30079 30317 30636
+31081 31082 30636
+31081 31714 31082
+31077 31078 30634
+31712 31713 31080
+30316 31079 30635
+31078 31711 31079
+31698 31066 31065
+31700 31699 31701
+30633 31077 30315
+31076 31709 31077
+30315 30634 30316
+30315 31077 30634
+30078 30633 30315
+30077 29876 29875
+31066 31698 31699
+31697 31065 31064
+31073 30632 30313
+31073 31074 30632
+31065 30628 30309
+31067 31699 31700
+31068 30629 31067
+31067 30628 31066
+30077 30312 30631
+31702 31701 31703
+30311 30076 30629
+29874 29873 30075
+30312 30311 30630
+30076 30310 30629
+29874 30076 29875
+31070 31703 31071
+31075 30314 30632
+30312 30076 30311
+29872 29873 29669
+30075 30308 30627
+31064 31063 31696
+30074 30307 30308
+31059 30624 31058
+30623 30305 30073
+30624 30306 30305
+30074 30306 30625
+30623 30073 30304
+30305 30306 30073
+30621 30302 31051
+29870 30072 29871
+30071 30619 30301
+30300 30618 31046
+31050 30620 31049
+30302 30301 30620
+31684 31052 31051
+30303 30072 30621
+30301 31048 31049
+31047 30300 31046
+31679 31046 31678
+31047 30619 30300
+31679 31047 31046
+31048 30619 31047
+30620 31050 31051
+31049 31681 31682
+31053 31052 31685
+30621 31051 31052
+31054 31053 31686
+30303 30621 31053
+31055 31054 31687
+30622 30303 31053
+31055 30622 31054
+30304 30303 30622
+30622 31055 30304
+31056 30305 30623
+31060 30625 31059
+30307 30074 30625
+30307 30626 30308
+31061 31694 31062
+30309 30627 31065
+30308 30626 31063
+30627 31064 31065
+30627 30308 31063
+31695 31063 31062
+31064 30627 31063
+31695 31062 31694
+31063 30626 31062
+31693 31060 31692
+31693 31061 31060
+30307 31061 30626
+30307 30625 31061
+31060 31059 31692
+30625 30306 31059
+31688 31055 31687
+31056 30623 31055
+31057 31058 30624
+31691 31059 31058
+31049 31048 31681
+31680 31047 31679
+31050 31049 31682
+31679 31678 31680
+31055 31688 31056
+31689 31690 31057
+31051 31683 31684
+31681 31048 31680
+31682 31681 31680
+31685 31682 31680
+31683 31050 31682
+31053 31685 31686
+31684 31683 31685
+31056 31688 31689
+31688 31690 31689
+31056 31689 31057
+31688 31687 31690
+31694 31693 31692
+31694 31061 31693
+31692 31690 31694
+31059 31691 31692
+31058 31690 31691
+31068 31069 30629
+31753 31752 31755
+31063 31695 31696
+31120 31752 31753
+31695 31697 31696
+31695 31694 31698
+31695 31698 31697
+31710 31704 31703
+31072 30631 31071
+31703 31701 31698
+31075 31074 31707
+31713 31710 31703
+31075 31708 31076
+31068 31067 31700
+30629 30310 31067
+31070 31069 31702
+30630 30311 31069
+31699 31067 31066
+31700 31701 31068
+31702 31069 31701
+31069 30311 30629
+31701 31069 31068
+31702 31703 31070
+31704 31071 31703
+30631 30312 31071
+30630 31070 31071
+30630 31069 31070
+31752 31751 31750
+31710 31078 31077
+31713 31711 31710
+31713 31081 31080
+31705 31072 31704
+31073 30631 31072
+30632 31074 31075
+31707 31704 31709
+31723 31718 31714
+31086 31719 31087
+31079 31712 31080
+31711 31713 31712
+31750 31748 31752
+31714 31081 31713
+31078 31710 31711
+31709 31704 31710
+31076 31708 31709
+31706 31073 31705
+31077 31709 31710
+31708 31075 31707
+31707 31705 31704
+31073 31072 31705
+31074 31706 31707
+31074 31073 31706
+31708 31707 31709
+31706 31705 31707
+31718 31715 31714
+31716 31083 31715
+31718 31716 31715
+31084 31085 30637
+31723 31720 31718
+31721 31088 31720
+31718 31717 31716
+31085 30638 30319
+31720 31719 31718
+31723 31722 31721
+31723 31090 31722
+31724 31091 31723
+31727 31726 31723
+31091 30641 30322
+31096 31097 30643
+31725 31724 31723
+31725 31092 31724
+31723 31726 31725
+30642 31094 31095
+31737 31736 31735
+31105 31738 31106
+31742 31743 31110
+31740 31739 31738
+31737 31742 31740
+31111 31744 31112
+30648 31105 31106
+31737 31740 31738
+31735 31734 31732
+31100 30645 31099
+31732 31734 31733
+31735 31102 31734
+31720 31088 31087
+31089 30640 30321
+31728 31731 31729
+31731 31098 31730
+31727 31731 31728
+31735 31732 31731
+31716 31084 31083
+31717 31718 31085
+30637 31085 30319
+31718 31719 31086
+31085 31086 30638
+31085 31718 31086
+31721 31089 31088
+31090 30640 31089
+30641 31091 31092
+31090 31723 31091
+31724 31092 31091
+31094 31727 31095
+29881 29677 29880
+31727 31728 31095
+31725 31093 31092
+31726 31727 31094
+30643 30324 31095
+31093 31726 31094
+31084 30637 31083
+29878 29674 29877
+31088 30639 31087
+31088 31089 30639
+30081 30640 30322
+31090 31091 30640
+30324 30643 30083
+31095 31728 31096
+30322 30641 30082
+31092 31093 30641
+30323 30641 31093
+30323 31093 30642
+31730 31098 31097
+31731 31732 31099
+31734 31101 31733
+31733 31101 31100
+31100 31101 30645
+31735 31736 31103
+30647 31105 30329
+31737 31738 31105
+30328 30646 31103
+31101 31734 31102
+30328 31103 30647
+31736 31737 31104
+30647 31103 31104
+31102 31735 31103
+31095 31096 30643
+31729 31097 31096
+30326 31099 30645
+31098 31731 31099
+30330 31107 30649
+31106 31739 31107
+31109 31108 31741
+30649 31107 31108
+31742 31109 31741
+30331 30086 30649
+31740 31742 31741
+31111 30651 30332
+31746 31744 31743
+31745 31746 31113
+30652 31114 31115
+31113 30651 31112
+31746 31743 31742
+31113 31114 30652
+31747 31115 31114
+30650 31111 30332
+31743 31744 31111
+31109 31742 31110
+30650 31110 31111
+30650 31109 31110
+30334 30652 31115
+30333 30651 31113
+31111 31112 30651
+31113 31746 31114
+30333 31113 30652
+31112 31744 31745
+30654 31119 30336
+31123 31756 31124
+30653 31117 30335
+31117 31118 30654
+30336 30655 30089
+30655 31120 31121
+30091 30659 30341
+30657 30339 30090
+30340 30659 30091
+30658 30340 30339
+30659 31129 30341
+30658 31127 30340
+31129 31762 31763
+30656 31122 31123
+31125 30339 30657
+31125 30658 30339
+31126 31127 30658
+30335 31117 30654
+31749 31750 31117
+30654 31118 31119
+31754 31121 31753
+30655 31119 31120
+31118 31117 31750
+31127 31128 30659
+31128 31760 31761
+30340 31127 30659
+31128 31129 30659
+31126 31759 31127
+31127 31760 31128
+31125 31126 30658
+31758 31759 31126
+30337 31121 30656
+31758 31125 31124
+31124 31125 30657
+31758 31126 31125
+30338 30656 31123
+31752 31120 31119
+31112 31745 31113
+31744 31746 31745
+30337 30655 31121
+31119 31118 31751
+31747 31114 31746
+30656 31121 31122
+31752 31119 31751
+30657 31123 31124
+31753 31121 31120
+31750 31751 31118
+31748 31747 31746
+31748 31115 31747
+31121 31754 31122
+31754 31753 31755
+31123 31122 31755
+31755 31122 31754
+31970 31977 31974
+31123 31755 31756
+31124 31757 31758
+31127 31759 31760
+31757 31759 31758
+31757 31756 31759
+31761 31760 31762
+31762 31760 31759
+31763 31130 31129
+31762 31129 31761
+31789 31788 31787
+31772 31770 31763
+30667 30348 31143
+31765 31764 31763
+31765 31132 31764
+31767 31766 31765
+31133 31132 31766
+31769 31135 31768
+31134 31766 31767
+31131 31130 31764
+30660 31129 31130
+31130 31131 30660
+31764 31132 31131
+31768 31134 31767
+31765 31768 31767
+31135 30663 30344
+31770 31769 31768
+31770 31137 31769
+31144 30667 31143
+31774 31773 31772
+30345 31137 30664
+31770 31771 31137
+31144 31778 31145
+31145 31778 31779
+31147 31781 31148
+31782 31786 31784
+31148 31781 31782
+31142 30666 31141
+31150 31149 31783
+31781 31786 31782
+31780 31778 31781
+31780 31779 31778
+31771 31770 31772
+31777 31144 31143
+30665 30347 30094
+31791 31789 31786
+31778 31776 31772
+31776 31775 31774
+31772 31776 31774
+31778 31777 31776
+31157 31791 31158
+31151 31784 31785
+31784 31786 31785
+31155 31154 31788
+31154 31153 31787
+31791 31790 31789
+31158 31792 31159
+31159 31160 30675
+31794 31792 31791
+31793 31160 31159
+31941 31940 31939
+30676 30358 30099
+31347 31979 31980
+31310 31943 31944
+31860 31859 31857
+31797 31796 31794
+31163 30358 30676
+31794 31793 31792
+31794 31160 31793
+31161 31795 31162
+31794 31796 31795
+31797 31163 31796
+31797 31164 31163
+31163 31164 30677
+31797 31798 31164
+31166 31165 31799
+30359 30677 31165
+30678 31166 31167
+31801 31802 31168
+31165 31166 30678
+31799 31800 31166
+30679 30360 31167
+30100 30359 30678
+30675 31161 30357
+30675 31160 31161
+30356 31159 30675
+31158 31791 31792
+31161 31162 30676
+31795 31796 31162
+31151 31150 31784
+31783 31782 31784
+30355 31157 30674
+30355 30673 31157
+30674 31158 31159
+30674 31157 31158
+31149 31148 31782
+30669 31147 31148
+30351 31149 30670
+30669 31148 31149
+31149 31150 30670
+31783 31784 31150
+31152 31151 31785
+30352 30670 31151
+31786 31152 31785
+30353 31153 30672
+31152 31786 31153
+31156 31155 31789
+31154 31787 31788
+31790 31156 31789
+30355 30098 30673
+31163 30677 30358
+31164 31165 30677
+30672 31154 31155
+30672 31153 31154
+31161 30676 30357
+31162 31163 30676
+31157 30673 31156
+30354 30672 31155
+31168 30679 31167
+30359 31165 30678
+30360 30679 30361
+31168 31169 30679
+30678 30360 30100
+30678 31167 30360
+30098 30354 30673
+30098 29896 29895
+30674 30356 30098
+30674 31159 30356
+31153 30671 31152
+30353 30671 31153
+30352 31151 30671
+30671 30353 30097
+30672 30354 30097
+31151 30670 31150
+30352 30096 30670
+29894 29893 30096
+31146 31145 31779
+30669 30351 30096
+30669 31149 30351
+31145 30349 30667
+31141 31775 31142
+30666 30348 30094
+30667 30349 30095
+30094 30346 30665
+30664 31137 31138
+31139 31140 30665
+31140 31774 31141
+31141 30666 30347
+31142 31776 31143
+31147 30668 31146
+31147 30350 30668
+31777 31143 31776
+30348 30666 31143
+31780 31146 31779
+30668 31145 31146
+30346 31139 30665
+31773 31774 31140
+31775 31141 31774
+30347 30665 31141
+31776 31142 31775
+31143 30666 31142
+30664 31138 31139
+31137 31771 31138
+31769 31136 31135
+31769 31137 31136
+30664 31139 30346
+31772 31773 31139
+31768 31135 31134
+30663 30093 30344
+31134 30662 31133
+30342 30660 31131
+31135 30662 31134
+29890 29891 29687
+31133 30343 30661
+30091 30341 30660
+31136 30663 31135
+31136 31137 30663
+30093 30664 30346
+30345 30663 31137
+30093 30345 30664
+30093 30663 30345
+30092 30343 30662
+30092 30661 30343
+30092 30662 30344
+29429 29428 29569
+29425 29426 29295
+30088 30334 30653
+29683 29431 29682
+29301 29300 29430
+29569 29428 29681
+29334 29297 29333
+29680 29568 29426
+29298 29428 29336
+29335 29568 29428
+29568 29335 29427
+29297 29235 29333
+29334 29335 29297
+29334 29427 29335
+29298 29336 29299
+29428 29429 29336
+29112 29111 29299
+29336 29429 29337
+29300 29338 29430
+29300 29112 29299
+29431 29430 29682
+29886 29682 29885
+29430 29569 29682
+29302 29431 29303
+29301 29430 29431
+29304 29432 29305
+30089 30337 30338
+29685 29684 29888
+29432 29683 29684
+29685 29433 29684
+29685 29888 29889
+29684 29683 29887
+29683 29682 29886
+29684 29887 29888
+29683 29886 29887
+30335 30336 30088
+30655 30337 30089
+30340 30090 30339
+29889 29890 29686
+30342 30661 30092
+29689 29893 29894
+29689 29688 29893
+30666 30094 30347
+30672 30097 30353
+29896 29692 29691
+30357 30676 30099
+30099 29897 29896
+29690 29689 29894
+29437 29436 29689
+29437 29690 29438
+29894 29895 29690
+29439 29692 29440
+29896 29897 29692
+29441 29693 29694
+29692 29897 29693
+29441 29694 29442
+29693 29898 29694
+29126 29440 29441
+29440 29693 29441
+29124 29439 29125
+29691 29692 29439
+29439 29440 29125
+29692 29693 29440
+29124 29438 29439
+29124 29123 29438
+29687 29435 29434
+29687 29688 29435
+29438 29691 29439
+29895 29896 29691
+29890 29687 29686
+29891 29892 29687
+29686 29685 29889
+29120 29434 29435
+29307 29119 29306
+29241 29118 29117
+29116 29117 29009
+29116 29304 29117
+28759 28963 28964
+29117 29118 29010
+29433 29306 29305
+29305 29306 29241
+29241 29119 29118
+29306 29433 29307
+29241 29306 29119
+29120 29307 29434
+28965 28897 28896
+28967 29120 29121
+28898 28897 28965
+29128 28769 29127
+28767 29125 29126
+28627 28763 28764
+29436 29437 29122
+28766 28765 29124
+29122 29437 29123
+28763 28967 29121
+28966 29120 28967
+29122 28763 29121
+28668 28624 28667
+29442 29128 29127
+29442 29443 29128
+28764 29122 29123
+28669 28763 28626
+28762 28967 28763
+28425 28424 28765
+28313 28268 28200
+28964 28965 28896
+29119 29307 28965
+29120 28965 29307
+29120 28966 28965
+28762 28966 28967
+28761 28898 28966
+29008 29009 28962
+29008 29116 29009
+28663 28963 28759
+29009 29117 28963
+28759 28964 28896
+28963 29010 28964
+28961 28894 29114
+28755 28619 28558
+28893 28959 29006
+28753 28556 28617
+29006 29005 29113
+29006 28959 29005
+28890 29112 28958
+29300 29301 29112
+29302 29303 29239
+29116 29008 29007
+28962 29007 29008
+28961 29115 29007
+29007 29240 29116
+29115 29239 29303
+29304 29303 29432
+29240 29115 29303
+29240 29304 29116
+29240 29303 29304
+29114 29237 29238
+29301 29431 29302
+29238 29237 29302
+29114 29006 29237
+29239 29238 29302
+29239 29114 29238
+29110 29298 29111
+29336 29337 29299
+29110 29236 29298
+29297 29335 29298
+29300 29299 29338
+29111 29298 29299
+29003 29109 29236
+29235 29297 29236
+28954 29109 29003
+29235 29236 29109
+28957 29110 29111
+28956 28887 28955
+28956 28955 29003
+28956 29003 29110
+28955 28954 29003
+28888 28956 29110
+28660 28613 28612
+28553 28552 28615
+29112 29004 28958
+28953 28952 29002
+29112 28890 29111
+28890 28891 28616
+29001 29107 28951
+29108 29109 28954
+29107 29233 29002
+29235 29109 29108
+28951 29107 29002
+29001 29105 29106
+29001 29106 29107
+29105 29231 29232
+28952 28951 29002
+28886 28950 28951
+28949 29105 28950
+29101 29100 29230
+28886 28659 28950
+29104 29103 29231
+29231 29103 29293
+28948 28947 29102
+29000 29104 29105
+29000 29103 29104
+29425 29294 29332
+29105 29104 29231
+29293 29102 29292
+29103 29000 28948
+29330 29292 29423
+29102 28946 29291
+29292 29102 29291
+29567 29424 29423
+29331 29293 29330
+29423 29424 29330
+29332 29293 29331
+29106 29232 29107
+29426 29679 29680
+29295 29294 29425
+29232 29106 29105
+29295 29232 29294
+29295 29107 29232
+29002 29233 29108
+29233 29295 29296
+29108 29233 29234
+29107 29295 29233
+29295 29426 29296
+29426 29427 29333
+29296 29426 29333
+29425 29679 29426
+29677 29881 29678
+29679 29425 29567
+29883 29680 29679
+30085 29884 29883
+29884 30086 29885
+29883 29884 29680
+30086 30331 30332
+30649 31109 30331
+30086 30330 30649
+30329 31105 30648
+31107 30648 31106
+30330 30085 30329
+30650 30331 31109
+30650 30332 30331
+31105 30647 31104
+30085 30328 30647
+29678 29567 29423
+30330 30329 30648
+30085 30647 30329
+30084 30326 30645
+30644 31097 31098
+29883 29882 30084
+30084 30645 30327
+30084 30646 30328
+30327 31101 30646
+30083 30644 30326
+30325 31097 30644
+30643 31097 30325
+30083 30325 30644
+30083 30643 30325
+30083 29882 29881
+30646 30084 30327
+29331 29424 29332
+29331 29330 29424
+29882 29678 29881
+29677 29678 29423
+29290 29289 29422
+28944 28999 28945
+29421 29288 29287
+29289 29229 29288
+29228 29227 29288
+29225 29097 29286
+29879 29676 29675
+29677 29676 29880
+29421 29675 29676
+30324 30082 30642
+29880 29879 30081
+30082 30323 30642
+30082 30641 30323
+30642 31095 30324
+30081 30321 30640
+30639 31089 30321
+31091 30322 30640
+29881 29880 30082
+29676 29879 29880
+29675 29420 29566
+31087 30320 30638
+30639 30321 30081
+30320 30639 30081
+30319 30080 30637
+30079 30636 30318
+30637 30080 30318
+30319 30320 30080
+29419 29284 29418
+29222 29094 29283
+29566 29419 29418
+29566 29329 29419
+29287 29226 29225
+29420 29286 29329
+29420 29287 29286
+29285 29284 29329
+28879 28939 28880
+29286 29285 29329
+29286 29097 29096
+29094 29222 29095
+29283 29418 29222
+28937 29094 28938
+28937 29282 29094
+29223 29095 29222
+28993 28940 28939
+29223 29096 29095
+29224 29286 29096
+29284 29223 29222
+29284 29285 29224
+29286 29224 29285
+29096 29223 29224
+29288 29227 29287
+29098 28994 29225
+29226 29227 29098
+29226 29287 29227
+29290 29230 29289
+29101 28946 28945
+28998 29100 28999
+29230 29290 29101
+29287 29225 29286
+29226 29098 29225
+29288 29229 29228
+29289 29100 29229
+29098 29099 28996
+29229 29100 28997
+28945 28999 29101
+29100 29101 28999
+29290 29291 29101
+28884 28943 28885
+28997 29100 28998
+28944 28885 28997
+28884 28996 28943
+28944 28997 28998
+28943 29099 28997
+28879 28878 28939
+28993 29097 28941
+28881 28752 28941
+28752 28880 28941
+29098 28995 28994
+29096 28993 29095
+29096 29097 28993
+29095 28939 29094
+28939 28940 28880
+29094 28939 28938
+29095 28993 28939
+28999 28944 28998
+27999 28091 28000
+29103 28948 29102
+28951 28952 28886
+29002 29108 28953
+28888 28887 28956
+28887 28661 28660
+28887 28660 28955
+28887 28888 28661
+28410 28411 28255
+28411 28256 28255
+28609 28608 28659
+28548 28606 28607
+28886 28609 28659
+28409 28254 28253
+28254 28409 28410
+28612 28613 28551
+28550 28609 28610
+28659 28608 28607
+28550 28610 28409
+28405 28544 28545
+28542 28541 28603
+28542 28543 28404
+28540 28539 28602
+28538 28401 28537
+28604 28542 28603
+28403 28402 28540
+28543 28542 28604
+28404 28403 28542
+28542 28403 28541
+28404 28250 28249
+28605 28406 28546
+28549 28548 28607
+28606 28547 28605
+28549 28607 28608
+28405 28251 28250
+28407 28547 28606
+28401 28248 28247
+28402 28403 28248
+28403 28249 28248
+28250 28089 28249
+27957 28088 27958
+28248 28249 28088
+28251 28090 28250
+27959 27806 27958
+28251 28091 28090
+27960 27807 27959
+27998 27999 27961
+27998 28090 28091
+28252 28091 28251
+28092 28000 28091
+27962 28000 28092
+27961 27999 28000
+28253 28252 28408
+28407 28406 28547
+28252 28407 28408
+28251 28406 28407
+28091 28252 28092
+28251 28407 28252
+28095 28001 28094
+28095 27966 27965
+28093 28253 28254
+28092 28252 28253
+28255 28093 28254
+28094 28001 27964
+28613 28411 28551
+28661 28888 28662
+28549 28550 28408
+28610 28611 28410
+28254 28410 28255
+28409 28610 28410
+28407 28548 28408
+28407 28606 28548
+28609 28550 28608
+28408 28548 28549
+28408 28550 28409
+28549 28608 28550
+28554 28414 28413
+28413 28258 28412
+28558 28415 28557
+28303 28302 28415
+28553 28554 28413
+28555 28556 28414
+28613 28661 28411
+28413 28300 28258
+28414 28300 28413
+28301 28302 28259
+28257 28258 28096
+28300 28301 28259
+28256 28257 28095
+28256 28412 28257
+28095 28096 27966
+28258 28300 28259
+27812 27967 27968
+28096 28259 28097
+28097 28259 28260
+28096 28258 28259
+28097 28260 28098
+28259 28302 28260
+28003 28002 28098
+27967 28096 28097
+27546 27286 27545
+27967 28097 27968
+28097 28002 27968
+28097 28098 28002
+27812 27545 27811
+27968 28002 27969
+28098 28004 28003
+28005 27971 27970
+27547 27813 27814
+27969 28004 27970
+28098 28099 28004
+28262 28263 28100
+28099 28261 28262
+28304 28558 28416
+28260 28261 28098
+28260 28304 28261
+28261 28306 28262
+28559 28558 28619
+28306 28307 28262
+28306 28417 28307
+28263 28308 28418
+28307 28417 28308
+28417 28560 28561
+28306 28305 28416
+28756 28619 28755
+28560 28306 28416
+28560 28620 28561
+28556 28618 28557
+28893 28960 28754
+28560 28416 28559
+28305 28304 28416
+28560 28559 28619
+28416 28558 28559
+28415 28556 28557
+28555 28617 28556
+28413 28552 28553
+28889 28888 28957
+28616 28554 28553
+28892 28958 29004
+28412 28614 28552
+28412 28411 28661
+28553 28615 28616
+28614 28662 28615
+28554 28617 28555
+28616 28891 28892
+28616 28615 28890
+28412 28661 28614
+28613 28660 28661
+28889 28662 28888
+28614 28661 28662
+28890 28889 28957
+28615 28662 28889
+28889 28890 28615
+28957 29111 28890
+28753 28892 28959
+28617 28892 28753
+28618 28754 28558
+28618 28893 28754
+28960 28894 28754
+28894 28756 28755
+28962 28963 28758
+28756 28894 28961
+28755 28754 28894
+28895 28756 28961
+28664 28759 28896
+28663 28758 28963
+28310 28266 28197
+28622 28621 28663
+28622 28663 28759
+28621 28758 28663
+28623 28420 28664
+28419 28564 28622
+28564 28563 28621
+28263 28418 28309
+28308 28562 28418
+28264 28263 28309
+28100 28006 28005
+28195 28264 28265
+28419 28622 28664
+28418 28564 28309
+28418 28563 28564
+28309 28419 28264
+28309 28564 28419
+28310 28265 28420
+28664 28896 28760
+28196 28265 28197
+28264 28419 28265
+28664 28420 28419
+28623 28421 28310
+28623 28310 28420
+28311 28266 28310
+28421 28311 28310
+28421 28624 28312
+28313 28267 28422
+28266 28311 28312
+28668 28625 28624
+28422 28312 28624
+28760 28665 28664
+28623 28664 28665
+28761 28666 28898
+28667 28624 28666
+28898 28760 28897
+28666 28665 28760
+28761 28667 28666
+28761 28762 28668
+28761 28668 28667
+28762 28669 28625
+28625 28669 28626
+28762 28763 28669
+28624 28625 28422
+28668 28762 28625
+28627 28626 28763
+28423 28313 28625
+28765 28424 28764
+27819 27916 27820
+28627 28423 28626
+27978 28106 27979
+28424 28627 28764
+28424 28269 28627
+29125 28766 29124
+28426 28425 28766
+28110 28109 28428
+28767 29126 28768
+28429 28769 28770
+28768 29127 28769
+28112 27827 27826
+28766 28425 28765
+27980 27979 28106
+27826 27825 28111
+28428 28427 28768
+28767 28426 28766
+28108 28107 28426
+28108 28427 28109
+28108 28426 28427
+28110 28428 28429
+27687 27823 27555
+28431 28112 28430
+28431 28113 28112
+28111 28110 28429
+27556 27296 27295
+28430 28111 28429
+27556 27557 27296
+28267 28313 28200
+28106 28424 28425
+28200 28268 28105
+28423 28627 28269
+28268 28269 28105
+28268 28423 28269
+28625 28313 28422
+28423 28268 28313
+28197 28198 28103
+28266 28312 28199
+28104 28267 28200
+28312 28422 28267
+27822 27646 27685
+27821 27645 27684
+27684 27683 27721
+27822 27685 27980
+27646 27459 27553
+28426 28107 28425
+27822 27980 28107
+27554 27435 27434
+28428 28109 28427
+27555 27556 27295
+28110 27824 28109
+28110 27825 27824
+28112 27826 28111
+27827 27559 27558
+28111 27825 28110
+27557 27297 27296
+27555 27435 27687
+28109 27823 28108
+26907 26948 27045
+27824 27555 27823
+27824 27556 27555
+27825 27556 27824
+27825 27557 27556
+27826 27557 27825
+27826 27558 27557
+28112 28113 27827
+26404 26761 26405
+27393 27434 27293
+27555 27295 27435
+27827 27558 27826
+27049 27050 26761
+27459 27434 27393
+27554 27687 27435
+27458 27553 27459
+27553 27685 27646
+27459 27554 27434
+27686 27687 27554
+27393 27433 27459
+27552 27645 27553
+27292 27433 27393
+27552 27553 27458
+27459 27433 27458
+27552 27644 27645
+27816 27913 27817
+27975 27976 27913
+27913 27914 27817
+27819 27820 27721
+27976 27914 27913
+27976 27977 27914
+27818 27915 27819
+27644 27684 27645
+27644 27683 27684
+27818 27819 27720
+27820 27821 27721
+27916 27978 27979
+28269 28424 28106
+27980 27821 27979
+27684 27721 27821
+28269 27978 28105
+28269 28106 27978
+28009 27977 27976
+28009 28105 27977
+27720 27819 27721
+27915 27978 27819
+28267 28104 28199
+28009 28008 28104
+28102 28197 28103
+28265 28310 28197
+28103 28198 28199
+28197 28266 28198
+28101 28195 28102
+28195 28265 28196
+27973 28101 28102
+28007 28006 28100
+28102 28195 28196
+28101 28264 28195
+28101 28100 28263
+28101 28007 28100
+27815 27973 27974
+27973 27972 28101
+27816 27975 27913
+27974 28008 27975
+27816 27815 27974
+27972 28007 28101
+28004 28005 27970
+28099 28100 28005
+27814 27972 27973
+27814 27971 27972
+27435 27294 27293
+27044 27169 27170
+27293 27294 27199
+27435 27295 27294
+26519 26581 26582
+26756 26858 26906
+26946 26947 26905
+27200 27294 27295
+26904 26858 26755
+26904 26905 26858
+26756 26647 26755
+26582 26581 26647
+27137 27042 26945
+26161 26068 25943
+26161 26067 26160
+26582 26400 26519
+27042 26903 26945
+26400 26252 26399
+26400 26161 26252
+26648 26756 26859
+26755 26858 26756
+26519 26400 26399
+26758 26584 26908
+26252 26161 26160
+26253 26162 26068
+25702 25943 25807
+25942 26067 25943
+26582 26648 26520
+26582 26756 26648
+26757 26583 26648
+26583 26401 26520
+26648 26859 26757
+27171 27295 27296
+26756 26906 26859
+27044 27043 27169
+26906 26948 26859
+26906 26947 27044
+27170 27169 27200
+27199 27294 27169
+26906 27044 26948
+26947 27043 27044
+27170 27200 27295
+27169 27294 27200
+27171 27170 27295
+27045 27044 27170
+27171 27045 27170
+26907 26859 26948
+26908 26907 27045
+26757 26859 26907
+26758 26908 27046
+26757 26907 26908
+27046 27171 27296
+26908 27045 27171
+27047 27046 27297
+26908 27171 27046
+26760 26759 27048
+26759 26758 27047
+27297 27298 27047
+27558 27559 27298
+27559 27299 27298
+27559 27560 27299
+27299 27049 27048
+27299 27300 27049
+26402 26758 26759
+26402 26584 26758
+27298 27048 27047
+27049 26761 26760
+25946 25945 26403
+26253 26068 26161
+27048 26759 27047
+26403 26402 26759
+26759 26760 26403
+27048 27049 26760
+25207 25468 25469
+25205 24970 24969
+25945 26163 26402
+25944 25807 26068
+26760 26404 26403
+26760 26761 26404
+25704 25944 26163
+25704 25703 25944
+26520 26401 26253
+26163 25944 26162
+26162 26401 26163
+26757 26908 26584
+26648 26583 26520
+26757 26584 26583
+26400 26253 26161
+26400 26520 26253
+26253 26401 26162
+26583 26584 26401
+26404 25946 26403
+25205 24969 25467
+25945 25466 25704
+25204 24967 25466
+25467 24969 25204
+24970 24818 24817
+25466 25467 25204
+25946 26404 25947
+25946 25947 25467
+25468 25947 25948
+25468 25467 25947
+25099 25206 25207
+25205 25467 25468
+25468 25206 25205
+25468 25207 25206
+25101 25100 25208
+24974 24973 25100
+24970 25206 24819
+25206 25099 24971
+24973 25099 25207
+24972 24971 25099
+24970 24817 24969
+24818 24970 24819
+24819 24971 24820
+23882 23881 23971
+24968 24815 24710
+24815 24816 24711
+24969 24817 24816
+25204 24968 24967
+24969 24968 25204
+24710 24709 24814
+24969 24815 24968
+24969 24816 24815
+24968 24814 24967
+24968 24710 24814
+24814 24708 24967
+24709 24619 24708
+24708 24619 24618
+24488 24706 24707
+24813 24706 24705
+24488 24707 24489
+24966 25203 24707
+25202 25098 25319
+24966 24813 25098
+25098 24813 24965
+24706 24488 24487
+24966 24706 24813
+24966 24707 24706
+25466 25203 25704
+25466 24967 25203
+25465 25202 25319
+25203 24966 25202
+26163 25945 25704
+26402 26403 25945
+25602 25703 25465
+25807 25944 25703
+25201 25318 25464
+25702 25807 25602
+25602 25465 25319
+25703 25704 25465
+24965 25097 25201
+25806 25942 25943
+25702 25602 25464
+25319 25464 25602
+25319 25201 25464
+25702 25701 25806
+25702 25464 25601
+25701 25702 25601
+25201 25200 25318
+24705 24487 24486
+25201 25097 25200
+24964 24704 25097
+24965 24964 25097
+25462 25317 25316
+24965 24705 24812
+24965 24813 24705
+24965 24812 24964
+24705 24486 24704
+25700 25940 26159
+24812 24705 24704
+26395 26396 25940
+26397 26398 26159
+26159 26398 25941
+26518 26580 26398
+26396 26397 26159
+26578 26579 26518
+25939 26395 25940
+27040 26899 27039
+25940 26396 26159
+26395 26751 26396
+26394 26750 26395
+27289 27288 27430
+27038 26751 26750
+26752 26578 26396
+26751 26752 26396
+26753 26646 26578
+26899 26752 26751
+26753 26578 26752
+27038 27039 26751
+27040 27041 26943
+26943 26900 27040
+26752 26899 26900
+27037 27038 26750
+27287 27286 27546
+26751 27039 26899
+27038 27287 27039
+26899 27040 26900
+27039 27288 27040
+27040 27166 27041
+26945 26944 27041
+26944 26902 26901
+27041 26944 26943
+26945 26902 26944
+26900 26901 26753
+26943 26944 26901
+27290 27197 27166
+27167 27042 27137
+27166 27167 27137
+27290 27392 27291
+27197 27290 27291
+27167 27166 27197
+27431 27457 27391
+27550 27551 27457
+27166 27289 27290
+27430 27548 27680
+27291 27392 27432
+27198 27293 27199
+27199 27168 27198
+27199 27169 27168
+27168 27043 27292
+27168 27169 27043
+27292 27198 27168
+27292 27293 27198
+27681 27682 27643
+27457 27551 27432
+27643 27682 27551
+27431 27549 27457
+27680 27681 27549
+27549 27681 27643
+27719 27817 27682
+27680 27718 27681
+27718 27816 27817
+27815 27816 27680
+27974 27975 27816
+27548 27815 27680
+27814 27973 27815
+27681 27718 27719
+27680 27816 27718
+27287 27547 27288
+27286 27037 27285
+27547 27548 27288
+27547 27814 27548
+27289 27431 27391
+27430 27549 27431
+27290 27289 27391
+27166 27040 27289
+27039 27287 27288
+27038 27037 27286
+27289 27430 27431
+27288 27548 27430
+27036 27285 27037
+27284 27544 27285
+27034 27283 27035
+27811 27810 27966
+27283 27543 27284
+27964 27963 28093
+27967 27812 27811
+27284 27543 27544
+27545 27286 27285
+27287 27038 27286
+27544 27545 27285
+27812 27969 27813
+27971 27813 27970
+27547 27546 27813
+27812 27546 27545
+27547 27287 27546
+27965 27966 27810
+28096 27967 27966
+27810 27811 27544
+27966 27967 27811
+27969 27812 27968
+27813 27546 27812
+27542 27809 27543
+27963 27808 27962
+27963 27964 27809
+28001 27965 27964
+27964 27965 27810
+28001 28095 27965
+27998 27960 28090
+27998 27961 27960
+28090 27960 27959
+27961 27807 27960
+27809 27808 27963
+27961 28000 27962
+27959 27807 27806
+27032 27033 26745
+27540 27807 27808
+27539 27806 27807
+27961 27808 27807
+27809 27542 27808
+27283 27542 27543
+27540 27539 27807
+27541 27540 27808
+27281 27282 27033
+27282 27541 27542
+27281 27033 27032
+27280 27279 27540
+27278 27539 27279
+26743 26742 27031
+27029 27278 27279
+26743 27031 27032
+27030 27279 27280
+26743 27032 26744
+27031 27280 27281
+27281 27280 27541
+27031 27030 27280
+27031 27281 27032
+27541 27282 27281
+27282 27283 27034
+27282 27542 27283
+27034 27035 26747
+27284 27285 27036
+27035 27036 26748
+27035 27284 27036
+26391 26747 26392
+27037 26750 26749
+26746 27034 26747
+27033 27282 27034
+26393 26748 26749
+26392 26747 26748
+26389 26745 26390
+26744 27032 26745
+26391 26746 26747
+26390 26745 26746
+25939 26394 26395
+26749 26750 26394
+26392 26393 25937
+26749 26394 26393
+25934 26389 26390
+25933 26388 26389
+26391 26392 25936
+26748 26393 26392
+26742 26743 26387
+26158 25931 25930
+26387 26743 26388
+26386 25928 26156
+26389 26744 26745
+26388 26743 26744
+26741 26742 26386
+27030 27031 26742
+26386 26156 26385
+25926 25925 26155
+26387 26386 26742
+25690 25803 25691
+26156 25926 26385
+25925 25794 25924
+26740 27027 27028
+25307 25452 25688
+26739 26383 26738
+26383 25922 26153
+26740 26741 26385
+26154 25922 26383
+27026 27027 26739
+26385 26155 26384
+26742 26741 27030
+26385 26384 26740
+26739 27027 26740
+27278 27029 27028
+26741 27029 27030
+26741 27028 27029
+27274 27534 27535
+27276 27275 27536
+26383 26739 26384
+26383 26153 26382
+26739 26740 26384
+27028 26741 26740
+26382 26738 26383
+27026 26739 26738
+26736 26737 26577
+27025 26738 26737
+27026 27025 27274
+27026 26738 27025
+26574 26643 26644
+27024 26737 26736
+26645 26576 26517
+26736 26577 26576
+26738 26382 26737
+25785 25682 25588
+26150 26149 26381
+26147 26146 26250
+26382 26152 26151
+25918 25682 25785
+25921 25920 26153
+26381 26737 26382
+25919 26151 26066
+26382 26153 26152
+25917 25916 26062
+26066 26151 26152
+26065 25918 26064
+26517 26380 26251
+26062 26061 26147
+26645 26517 26575
+26380 26149 26148
+26576 26380 26517
+26576 26577 26380
+26378 26516 26379
+26573 26574 26516
+26572 26516 26515
+26143 26144 25912
+26148 26147 26251
+26148 26062 26147
+26571 26515 26377
+26571 26733 26643
+26376 26571 26377
+26732 26733 26571
+26376 26377 26143
+26515 26378 26377
+27017 27018 26729
+26893 26732 26731
+26572 26643 26573
+26733 26856 26734
+26571 26572 26515
+26571 26643 26572
+26897 26896 26942
+26856 26895 26896
+26731 27020 26893
+27018 27017 27266
+26733 26894 26895
+26732 26893 26894
+27021 27161 27162
+27020 27269 27161
+26942 27021 27022
+26894 26893 27021
+27023 26942 27022
+27023 26897 26942
+27165 26898 27023
+26644 26575 26574
+26897 26734 26856
+26735 26736 26645
+26897 26735 26734
+26735 26575 26644
+26735 26645 26575
+26736 26576 26645
+26734 26735 26644
+26898 27024 26736
+26897 26898 26735
+26897 27023 26898
+27163 27272 27164
+27273 27272 27533
+27429 27272 27163
+27429 27531 27532
+27428 27531 27429
+27678 27679 27531
+27022 27162 27163
+27161 27270 27162
+27163 27164 27023
+27272 27165 27164
+27162 27271 27163
+27390 27427 27428
+27161 27269 27270
+27266 27017 27016
+27390 27426 27427
+27269 27528 27529
+27426 27529 27530
+27426 27269 27529
+27426 27456 27427
+27530 27531 27456
+27456 27428 27427
+27456 27531 27428
+27677 27797 27678
+27910 27911 27798
+27528 27674 27675
+27717 27795 27796
+27531 27677 27678
+27676 27796 27677
+27908 27793 27940
+28233 28292 28293
+27942 27943 27796
+27942 27996 28077
+27944 27910 27797
+27944 27945 27910
+27945 27946 27912
+27910 27945 27911
+27944 28078 27945
+27911 27912 27798
+27946 27947 27799
+27429 27532 27272
+27679 27798 27799
+27679 27799 27532
+27912 27946 27799
+28239 28080 28238
+27800 27799 27947
+27947 27948 27800
+28081 27949 27948
+28083 27997 28082
+27950 27801 27949
+28245 28084 28244
+27953 27952 28084
+27803 27802 27952
+27951 27997 28083
+27948 27949 27801
+27949 28082 27950
+27802 27950 27951
+27949 28081 28082
+27273 27533 27534
+27532 27800 27533
+27025 27273 27274
+27165 27272 27273
+27273 27534 27274
+27801 27950 27802
+27802 27535 27534
+27276 27026 27275
+27801 27802 27534
+27952 27953 27803
+27954 27804 27803
+27275 27274 27535
+27804 27537 27536
+27277 27278 27028
+27027 27276 27277
+27027 27026 27276
+27536 27537 27276
+27538 27278 27277
+27277 27537 27538
+27803 27953 27954
+27955 27804 27954
+27956 27805 27804
+27957 27805 27956
+27958 27806 27805
+27805 27957 27958
+28087 28247 28248
+27536 27803 27804
+27536 27535 27803
+28084 28085 27954
+27956 27804 27955
+27954 28085 27955
+28246 28247 28085
+27956 28086 28087
+27956 27955 28086
+28247 28087 28086
+28248 28088 28087
+28400 28401 28247
+28401 28400 28536
+28247 28246 28400
+28246 28299 28399
+28245 28244 28298
+28299 28245 28298
+28084 27952 28083
+28246 28245 28299
+28246 28085 28245
+28396 28243 28242
+28244 28084 28243
+28083 28082 28242
+27997 27950 28082
+28243 28083 28242
+28243 28084 28083
+28082 28241 28242
+28871 28743 28931
+28397 28297 28296
+28244 28243 28296
+28528 28397 28296
+28298 28244 28297
+28527 28396 28526
+28296 28243 28396
+28525 28395 28524
+28746 28656 28934
+28658 28525 28524
+28396 28242 28395
+28395 28394 28524
+28394 28522 28523
+28526 28396 28395
+28747 28936 28748
+28299 28532 28399
+28531 28598 28532
+28529 28397 28528
+28530 28398 28298
+28532 28398 28531
+28299 28298 28398
+28534 28533 28599
+28399 28532 28533
+28536 28537 28401
+28536 28601 28537
+28402 28538 28539
+28537 28601 28538
+28536 28535 28600
+28400 28399 28534
+28533 28532 28599
+28535 28400 28534
+28532 28750 28751
+28751 28752 28599
+28941 28994 28881
+28997 28885 28943
+28996 28883 28942
+28996 28884 28883
+28942 28883 28882
+28881 28942 28882
+28995 28996 28942
+28941 28880 28940
+28752 28751 28880
+28751 28879 28880
+28750 28878 28879
+28942 28881 28994
+28937 28938 28876
+28939 28878 28938
+28598 28531 28530
+28396 28527 28528
+28596 28747 28748
+28656 28746 28657
+28935 28658 28746
+28748 28528 28596
+28658 28657 28746
+28524 28523 28657
+28750 28598 28878
+28750 28532 28598
+28529 28530 28397
+28596 28527 28526
+28596 28528 28527
+28597 28529 28528
+28597 28530 28529
+28656 28522 28655
+28656 28523 28522
+28394 28393 28522
+28079 27947 27946
+28928 28929 28870
+28933 28873 28932
+28080 28239 28081
+28656 28655 28745
+28522 28521 28655
+28989 28875 28933
+28745 28655 28875
+28874 28873 28933
+28875 28874 28933
+28740 28870 28741
+28929 28930 28870
+28872 28871 28932
+28744 28743 28871
+28873 28872 28932
+28869 28654 28653
+28869 28928 28740
+28389 28295 28388
+28595 28594 28739
+28870 28740 28928
+28981 28867 28925
+28868 28739 28867
+28593 28516 28515
+28514 28515 28385
+28517 28593 28738
+28515 28516 28386
+28653 28595 28739
+28517 28516 28593
+28654 28519 28653
+28518 28594 28595
+28653 28519 28595
+28387 28517 28594
+28291 28385 28292
+28518 28387 28594
+28293 28294 28233
+28388 28235 28518
+28293 28292 28386
+28515 28386 28292
+28516 28517 28386
+28517 28294 28386
+28387 28234 28294
+28387 28518 28235
+28390 28237 28236
+28235 28388 28295
+28518 28595 28388
+28388 28519 28389
+28388 28595 28519
+28654 28389 28519
+28390 28295 28389
+28237 28080 28079
+28240 28241 28081
+28524 28394 28523
+28241 28240 28394
+28520 28393 28392
+28521 28393 28520
+28521 28522 28393
+28391 28392 28238
+28391 28238 28237
+28080 28081 27948
+28392 28239 28238
+28392 28393 28239
+28239 28240 28081
+28239 28393 28240
+28236 28079 28235
+28237 28238 28080
+27947 28080 27948
+27947 28079 28080
+27942 28077 27943
+28234 28235 28078
+28078 28235 28079
+28234 28387 28235
+28390 28236 28295
+28237 28079 28236
+28294 28293 28386
+28294 28234 28233
+27943 28077 28078
+28076 28075 28193
+28078 28233 28234
+28077 28194 28232
+28233 28077 28232
+28077 27996 28076
+28291 28232 28231
+28194 28076 28193
+28230 28229 28290
+28651 28586 28650
+28193 28229 28230
+28073 27939 28072
+28074 28193 28075
+28230 28231 28193
+28228 28287 28288
+28227 28226 28285
+28380 28286 28285
+28226 28225 28378
+28227 28286 28287
+28227 28285 28286
+28582 28375 28581
+28221 28220 28374
+28581 28375 28374
+28583 28376 28375
+28585 28378 28377
+28585 28586 28379
+28590 28735 28591
+28288 28287 28381
+28585 28379 28378
+28586 28587 28380
+28586 28380 28379
+28381 28287 28380
+28580 28639 28581
+28728 28855 28856
+28640 28641 28581
+28583 28375 28582
+28645 28584 28583
+28585 28377 28584
+28382 28383 28290
+28511 28384 28383
+28381 28289 28288
+28381 28382 28289
+28587 28588 28381
+28590 28921 28735
+28384 28291 28231
+28292 28233 28232
+28385 28291 28384
+28292 28232 28291
+28513 28385 28384
+28515 28292 28385
+28511 28512 28384
+28736 28864 28592
+28734 28588 28652
+28381 28380 28587
+28384 28512 28513
+28511 28590 28591
+28920 28589 28734
+28382 28381 28588
+28736 28592 28513
+28592 28515 28514
+28513 28592 28514
+28864 28737 28592
+28736 28591 28862
+28512 28511 28591
+28979 28735 28921
+28922 28862 28735
+28864 28736 28863
+28513 28591 28736
+28919 28652 28733
+28588 28587 28652
+28588 28589 28382
+28588 28734 28589
+28383 28590 28511
+28589 28921 28590
+28730 28859 28647
+28731 28649 28648
+28649 28650 28586
+28649 28732 28650
+28732 28651 28650
+28733 28652 28651
+28645 28729 28730
+28858 28916 28730
+28642 28728 28643
+28641 28727 28854
+28858 28729 28857
+28644 28643 28729
+28374 28580 28581
+28726 28851 28852
+28584 28645 28646
+28583 28644 28645
+28646 28647 28584
+28646 28730 28647
+28583 28643 28644
+28582 28641 28642
+28581 28641 28582
+28640 28727 28641
+28582 28642 28643
+28641 28728 28642
+28373 28579 28580
+28638 28639 28580
+28374 28373 28580
+28635 28634 28723
+28510 28509 28577
+28509 28371 28370
+28636 28578 28724
+28578 28372 28510
+28848 28849 28725
+28638 28579 28637
+28848 28636 28724
+28637 28579 28636
+28850 28725 28849
+28637 28636 28725
+28638 28726 28639
+28638 28850 28726
+28577 28509 28634
+28576 28575 28633
+28278 28368 28508
+28575 28722 28633
+28578 28635 28724
+28577 28634 28635
+28369 28508 28575
+28507 28506 28574
+28368 28507 28508
+28721 28907 28574
+28369 28575 28576
+28508 28574 28575
+28720 28572 28366
+28367 28573 28506
+28572 28721 28573
+28508 28507 28574
+28368 28506 28507
+28365 28364 28719
+28364 28365 28062
+28719 28720 28365
+28572 28367 28276
+28506 28368 28277
+28276 28366 28572
+28213 28212 28276
+28062 28365 28212
+28214 28276 28367
+28212 28366 28276
+28191 28064 28190
+27936 27935 28065
+28212 28063 28062
+28215 28277 28368
+28212 28190 28063
+28214 28277 28215
+28213 28214 28190
+28216 28192 28065
+28190 28214 28191
+28213 28276 28214
+28191 28214 28215
+28634 28509 28576
+28278 28215 28368
+28578 28510 28577
+28370 28279 28216
+28579 28372 28578
+28372 28371 28510
+28510 28371 28509
+28279 28217 28216
+28370 28278 28369
+28509 28370 28369
+28371 28280 28279
+28190 28064 28063
+28220 28219 28373
+28281 28371 28372
+28220 28373 28374
+28372 28579 28373
+28281 28280 28371
+28218 28067 28066
+28370 28216 28278
+27642 27671 27520
+28371 28279 28370
+28280 28217 28279
+27783 27933 27714
+27994 27993 28063
+27934 27933 27993
+27993 27994 27934
+28063 28064 27994
+27714 27933 27934
+27783 27782 28061
+27669 27640 27668
+27783 27932 27933
+27783 28061 27932
+27782 27668 27667
+27782 27669 27668
+27782 27713 27669
+27782 27783 27713
+28217 28192 28216
+28218 28280 28281
+27935 27936 27785
+27936 27672 27785
+27907 27784 27641
+27907 27935 27785
+27784 27715 27641
+27784 27785 27715
+27715 27670 27641
+27715 27671 27670
+27715 27785 27671
+27784 27907 27785
+28192 28066 28065
+28192 28217 28066
+28065 28066 27936
+28067 28220 28068
+27936 27786 27672
+27937 27938 27786
+28066 27938 27937
+27938 28067 27787
+27524 27789 27790
+27788 28068 28069
+27263 27262 27523
+27786 27938 27787
+28222 28069 28221
+28223 28224 28070
+27787 28068 27788
+28220 28221 28068
+27936 28066 27937
+28217 28280 28218
+27787 28067 28068
+27938 28066 28067
+28217 28218 28066
+28281 28219 28218
+28218 28219 28067
+28281 28372 28219
+28375 28222 28221
+28223 28069 28222
+28222 28282 28223
+28222 28375 28282
+28282 28283 28223
+28282 28376 28283
+28225 28224 28378
+28070 28069 28223
+28071 28070 28225
+27789 28069 28070
+28071 28225 28226
+28070 28224 28225
+28227 28071 28226
+27939 27793 27792
+28287 28228 28227
+28229 28074 28073
+28193 28074 28229
+28075 28076 27995
+28077 28076 28194
+27996 27995 28076
+28075 27995 28074
+27996 27942 27941
+28227 28072 28071
+28227 28228 28072
+28228 28073 28072
+28074 27995 28073
+27795 27908 27909
+27995 27996 27941
+27676 27717 27796
+27908 27940 27941
+27795 27909 27796
+27941 27942 27909
+27675 27716 27717
+27794 27795 27717
+27717 27716 27794
+27717 27676 27675
+27529 27675 27676
+27529 27528 27675
+27716 27793 27794
+27673 27792 27793
+27909 27908 27941
+27793 27939 27940
+27794 27908 27795
+27794 27793 27908
+28072 27792 28071
+27525 27265 27264
+28070 27790 27789
+27791 27526 27525
+28071 27791 27790
+27792 27673 27527
+27260 27424 27425
+27672 27786 27521
+27011 27261 27012
+27521 27787 27522
+27261 27262 27012
+27261 27521 27522
+27262 27522 27523
+27262 27261 27522
+27264 27524 27525
+27523 27789 27524
+27792 27527 27791
+27673 27528 27527
+27269 27268 27528
+27267 27526 27527
+27793 27674 27673
+27716 27675 27674
+27528 27268 27527
+27019 26731 26730
+27790 27525 27524
+27526 27266 27525
+27268 27267 27527
+27268 27020 27019
+27525 27266 27265
+27267 27018 27266
+27268 27019 27267
+26372 26373 25908
+27267 27019 27018
+27020 26731 27019
+27019 26730 27018
+26730 26375 26374
+26371 25907 25906
+25173 25082 25172
+27017 26729 26728
+26729 26374 26373
+26368 26725 26369
+26725 27014 27015
+27264 27014 27263
+27015 26726 26725
+27015 27264 27265
+27015 27014 27264
+27263 27013 27262
+27014 26724 27013
+26724 26368 26367
+26369 26726 26370
+26724 26725 26368
+26724 27014 26725
+26367 26723 26724
+26367 26366 26723
+26941 27010 26891
+27011 27012 26722
+26366 26722 26723
+26570 26892 26722
+27259 27160 27159
+26890 26855 26568
+27260 27160 27259
+27260 27011 27160
+27160 27011 26892
+27260 27261 27011
+27260 27389 27424
+27260 27259 27389
+27521 27425 27672
+27424 27455 27520
+27260 27425 27261
+27424 27520 27425
+27671 27642 27670
+27520 27455 27642
+27388 27258 27422
+27389 27423 27455
+27389 27259 27423
+26892 26891 27010
+26892 26570 26721
+27010 27136 27159
+27454 27422 27258
+27010 26941 27009
+26890 26568 26941
+26642 26720 26721
+26568 26855 26720
+26891 26890 26941
+26891 26855 26890
+26514 26364 26568
+26514 26642 26569
+26514 26568 26642
+26892 26721 26891
+26569 26642 26721
+26142 25675 25900
+26058 26140 26141
+25900 26058 26141
+25899 26248 26058
+26365 26249 26514
+26140 26248 26249
+26367 25902 25901
+25429 25675 25169
+25902 25903 25432
+26368 26369 25903
+25904 25434 25676
+24676 24603 24449
+25432 25431 25902
+24924 24674 24447
+25676 25433 25432
+25676 25434 25433
+24447 24923 24924
+24446 24445 24922
+24052 24446 24053
+24445 24673 24922
+24446 24447 24053
+24446 24923 24447
+25431 24924 24923
+25432 25433 25170
+25432 25170 24924
+25433 25434 25171
+25170 25171 24925
+25170 25433 25171
+25081 24927 24926
+24798 24799 24604
+24925 24797 24675
+24925 25171 25081
+24675 24676 24449
+24797 24927 24676
+24603 24677 24604
+24603 24676 24677
+24929 24799 24928
+24677 24927 24798
+24800 24678 24799
+24798 24927 24928
+24929 25082 25173
+24928 24927 25082
+24925 24926 24797
+24925 25081 24926
+25434 25081 25171
+25172 25082 24927
+25903 25904 25676
+26370 26727 26371
+25903 26369 25904
+26725 26726 26369
+25434 25172 25081
+25435 25904 25905
+25435 25905 25436
+25904 26369 26370
+25434 25435 25172
+25174 24930 25173
+25173 25435 25174
+25173 25172 25435
+26370 26371 25905
+24682 24683 24454
+25904 26370 25905
+26726 26727 26370
+26372 25907 26371
+25436 25905 25906
+26372 26371 26727
+25906 25905 26371
+26729 26373 26728
+25907 25437 25906
+26728 26373 26372
+26729 26730 26374
+25437 25907 25438
+26373 25909 25908
+25906 25437 25436
+25438 24933 24932
+25908 25907 26372
+25908 25438 25907
+24678 24800 24679
+25174 24931 24930
+24606 24679 24801
+24930 24931 24801
+24681 24932 24682
+25437 25438 24932
+25908 25439 25438
+24934 24455 24933
+24929 24928 25082
+24606 24680 24607
+24931 24932 24681
+24605 24451 24678
+24799 24798 24928
+24930 24929 25173
+24604 24450 24603
+24930 24800 24929
+24930 24679 24800
+24800 24799 24929
+24799 24451 24604
+24798 24604 24677
+24799 24678 24451
+24450 24604 24451
+24607 24608 24452
+24680 24931 24681
+24608 24453 24452
+24609 24348 24453
+24683 24245 24454
+24453 24681 24609
+24608 24680 24681
+24347 24348 24243
+24347 24453 24348
+24348 24454 24244
+24609 24682 24454
+24681 24682 24609
+24932 24683 24682
+24933 24455 24683
+24058 23860 23963
+24456 24247 24455
+24456 24457 24059
+24454 24245 24244
+24455 24247 24246
+24455 24246 24245
+24247 23861 24058
+24057 23963 23962
+24057 24246 24058
+24057 24058 23963
+24246 24247 24058
+24059 23862 23861
+23657 23553 23456
+24247 24059 23861
+23658 23458 23457
+23801 23800 23860
+23065 22870 22869
+23801 23656 23800
+23801 23861 23657
+23860 23859 23963
+24057 23962 24244
+23963 23859 23962
+24245 24057 24244
+24245 24246 24057
+23401 23263 23400
+23262 23066 23065
+23454 23401 23400
+23066 23067 23008
+23452 23550 23453
+23262 23452 23453
+23858 23961 23799
+23452 23262 23261
+23400 23263 23262
+23451 23653 23452
+23654 23550 23452
+23654 23655 23550
+23550 23655 23551
+23654 23799 23655
+23653 23451 23652
+24606 24605 24679
+24056 24195 24242
+24452 24606 24607
+23654 23798 23799
+23798 23857 23858
+23961 23857 24056
+23857 23652 24055
+23799 23798 23858
+23654 23452 23653
+24055 24240 24241
+24241 24242 24195
+24241 24450 24346
+24241 24346 24242
+24450 24451 24346
+24447 24448 24054
+24674 24675 24448
+24195 24055 24241
+24054 24448 24240
+23798 23653 23857
+24054 24240 24055
+23650 24052 24053
+24051 24445 24052
+23651 23652 23260
+24054 24055 23652
+23857 23653 23652
+23798 23654 23653
+23652 23651 24054
+23260 22868 23259
+23257 23649 23258
+23256 23450 23648
+23649 23650 23258
+23649 24052 23650
+23648 23257 23256
+23257 22866 22865
+23258 22866 23257
+22221 22122 22220
+21954 22448 22449
+23259 23258 23650
+22447 22866 22448
+22447 22865 22866
+22449 22867 22868
+22448 22866 22867
+23260 23259 23651
+22867 23258 23259
+22451 22672 22673
+22449 22448 22867
+22672 22869 22673
+23261 23065 22869
+22774 22775 22674
+22450 22449 22672
+21954 21955 21836
+22451 22450 22672
+21955 22123 21837
+22344 22224 22223
+22344 22345 22224
+22451 22344 22450
+22451 22345 22344
+22224 22345 22123
+22451 22673 22674
+22450 22223 22449
+22224 22123 22223
+21955 21954 22223
+21836 21955 21837
+22223 22123 21955
+21302 21144 21301
+21694 21953 21954
+21430 21429 21694
+22447 22448 21953
+22223 21954 22449
+21836 21695 21954
+22447 22446 22865
+21692 21427 21426
+21692 21951 21952
+21690 21950 22222
+22446 21952 21951
+22447 21953 21952
+21139 21295 21426
+21591 21690 21691
+21951 21692 21691
+21952 21427 21692
+21953 21693 21952
+21953 21694 21429
+21693 21429 21428
+21141 21020 20860
+21294 21295 21138
+21425 21426 21295
+21427 21296 21426
+21297 21140 21296
+21590 21589 21689
+21427 21298 21297
+20860 21139 21140
+21142 21141 21298
+20500 20607 20501
+21299 21021 21142
+21428 21298 21427
+21142 21020 21141
+21299 21142 21298
+21299 21300 21021
+21428 21300 21299
+20503 20504 20332
+21142 21021 21020
+21143 21300 21429
+21300 21143 21021
+21431 21695 21837
+21021 21143 21022
+21695 21694 21954
+21302 20754 21144
+21143 21301 21144
+21429 21693 21953
+21301 21430 21302
+21301 21429 21430
+21143 21429 21301
+21300 21428 21429
+21694 21592 21430
+21430 21431 21302
+21695 21592 21694
+21431 21430 21592
+21837 21695 21836
+21431 21592 21695
+22346 22347 22226
+22452 22675 22596
+22452 22346 22675
+22596 22453 22452
+22776 22675 22872
+22453 22347 22452
+21840 21958 21841
+22452 22347 22346
+22347 22453 22227
+22346 22226 22225
+21150 21435 21436
+21956 21697 21838
+22124 21956 22225
+22124 21957 21956
+21956 21957 21697
+22226 22347 22125
+22124 22226 21957
+22124 22225 22226
+22226 22125 21957
+22227 22453 22454
+22596 22597 22453
+22455 22677 22678
+22347 22227 22125
+22227 22228 21958
+22125 21958 21957
+22125 22227 21958
+21841 21959 21842
+22228 22455 21960
+21958 22228 21959
+22227 22454 22228
+22597 22598 22454
+22457 22456 22876
+22676 22777 22677
+22676 22776 22777
+22453 22597 22454
+22596 22675 22597
+22597 22676 22598
+22597 22675 22676
+23010 22873 23009
+22873 22776 22872
+22676 22675 22776
+22874 22873 23010
+22777 22776 22873
+23071 23070 23266
+23010 23069 23070
+23553 23403 23456
+23164 23070 23069
+23457 23266 23403
+23457 23458 23266
+23402 23265 23264
+23403 23266 23164
+23010 23009 23069
+22872 22675 23009
+23070 23164 23266
+23069 23265 23164
+23264 23265 23163
+22451 22674 22345
+22775 22871 22674
+22673 22774 22674
+22774 22870 22775
+22869 22774 22673
+22869 22870 22774
+23007 22871 22870
+23656 23552 23800
+23402 23456 23265
+23066 23008 23007
+23263 23066 23262
+23007 22870 23065
+23066 23007 23065
+23008 22871 23007
+23401 23162 23263
+23263 23162 23066
+23456 23552 23657
+23658 23802 23862
+23455 23456 23402
+23265 23456 23403
+23455 23552 23456
+23656 23657 23552
+23656 23801 23657
+23403 23553 23457
+23657 23802 23553
+24456 24059 24247
+24060 23863 24059
+24063 23864 24062
+23660 24060 24061
+23662 23864 23865
+23661 24061 24062
+24063 24062 24249
+24061 24457 24458
+24248 24062 24061
+24248 24249 24062
+24063 24250 24196
+24249 24349 24250
+24065 24064 24197
+23964 24064 24065
+23273 23272 23404
+23865 24063 24064
+24197 24064 24196
+23964 23865 24064
+23865 23964 23866
+23662 23661 23864
+23271 23072 23270
+23866 23803 23865
+23459 23270 23662
+23865 23803 23662
+23404 23462 23273
+23662 23270 23661
+22878 22680 22679
+23661 23660 24061
+23268 23267 23659
+23072 22878 23270
+22877 23268 23269
+23553 23802 23658
+23659 23660 23268
+23658 23863 23458
+24060 23660 23659
+23863 23659 23458
+23863 24060 23659
+23861 23862 23802
+24059 23863 23862
+23553 23658 23457
+23862 23863 23658
+22875 23071 23267
+22875 22874 23071
+22676 22677 22598
+22874 22875 22678
+22456 22678 22875
+22677 22874 22678
+22460 22348 22459
+22876 23268 22877
+22231 22126 22230
+22229 22457 22458
+21960 22455 22456
+22228 22454 22455
+21962 22457 22229
+22456 22875 22876
+21962 22456 22457
+21961 21960 22456
+21437 21436 21702
+21959 22228 21960
+21705 21961 21962
+21704 21703 21961
+22229 21963 21962
+22229 21964 21963
+22458 22230 22229
+22348 22460 22349
+21966 21709 21965
+21964 22230 22126
+22231 22127 22126
+22127 21966 22126
+21966 21710 21709
+22126 21966 21965
+21608 21711 21712
+21607 21445 21444
+22348 22232 22231
+21713 21608 21712
+21309 21158 21308
+22459 22348 22231
+22232 22127 22231
+22232 22348 22349
+22231 22458 22459
+22460 22679 22680
+22458 22877 22679
+22679 22459 22458
+22679 22460 22459
+23269 22878 22877
+22350 22461 22462
+22682 22683 22599
+22234 22235 22130
+22599 22462 22461
+22233 22234 22129
+21967 21714 21845
+21609 21608 21713
+21968 22130 21969
+21714 21609 21713
+21310 21311 21159
+21845 21714 21713
+21967 21968 21715
+22128 22129 21967
+22128 22233 22129
+21716 21715 21846
+21967 22129 21968
+21714 21610 21609
+21846 21715 21968
+21716 21611 21715
+21715 21611 21610
+21969 21846 21968
+21969 21717 21846
+21717 21716 21846
+21717 21611 21716
+22462 22463 22351
+22236 21969 22235
+22350 22234 22233
+22350 22462 22351
+22350 22351 22234
+23012 22779 22881
+22462 22600 22463
+22462 22684 22600
+22464 22236 22463
+22235 22351 22463
+23076 22686 22882
+22463 22600 22685
+23274 23464 23076
+22685 22779 22882
+23275 23276 22884
+23012 23074 23166
+23463 23274 23405
+23166 23273 23405
+23075 23166 23274
+23075 23012 23166
+23074 22881 23011
+22779 22684 22881
+22882 23012 23075
+22882 22779 23012
+22881 22684 22778
+23074 23011 23073
+22881 22778 22880
+23011 22881 22880
+23271 23270 23459
+23804 23803 23866
+23460 23404 23272
+23273 23165 23272
+23459 23662 23663
+23803 23804 23663
+23866 23964 23867
+23964 24065 23867
+23867 23804 23866
+23554 23664 23665
+23555 23665 23666
+23404 23461 23462
+23462 23554 23665
+23463 23405 23555
+23274 23166 23405
+23463 23555 23666
+23405 23462 23555
+23667 24070 23668
+22883 22884 22465
+23870 23869 23967
+23665 23664 23868
+23869 23665 23868
+24066 23965 23868
+24067 23966 23965
+23869 23966 24068
+23869 23868 23966
+23869 24068 23967
+24067 24198 24254
+24067 24255 24068
+24468 24469 24072
+24465 24256 24255
+24069 24068 24256
+25448 25449 25182
+24466 24069 24256
+25086 24942 24807
+24692 24465 24691
+24068 24255 24256
+24255 24254 24353
+24613 24465 24464
+24692 24256 24465
+24464 24465 24353
+25304 25175 25443
+24690 24691 24613
+24689 24806 24690
+24806 24807 24690
+25084 25176 25177
+24941 24807 24806
+24464 24612 24613
+24805 24939 24940
+24689 24613 24612
+24463 24687 24611
+24610 24686 24687
+24610 24463 24462
+24198 24067 24066
+24197 24252 24253
+24251 24250 24350
+24252 24352 24253
+24462 24463 24352
+24196 24251 24252
+24196 24250 24251
+24251 24350 24351
+24460 24459 24685
+24350 24460 24351
+24610 24462 24461
+24938 24803 24802
+24804 24687 24686
+24803 24686 24802
+24803 24804 24686
+24351 24460 24461
+24459 24249 24248
+24350 24349 24460
+24350 24250 24349
+24459 24458 24684
+24248 24061 24458
+24686 24460 24685
+24349 24249 24459
+25912 26059 25913
+24458 24457 24935
+25443 25586 25444
+24685 24459 24684
+24937 24685 24684
+24802 24686 24685
+24802 24937 24938
+25440 24935 25439
+24455 24934 24456
+24933 25438 24934
+24684 24936 24937
+24684 24458 24936
+25438 25439 24934
+25909 25440 25439
+24937 25175 24938
+24937 24936 25441
+24938 24939 24804
+24938 25175 25083
+25176 25304 25177
+25083 25175 25176
+24940 25083 25084
+24939 24938 25083
+24687 24805 24688
+24804 24939 24805
+25083 25176 25084
+24939 25083 24940
+25177 25304 25444
+25176 25175 25304
+25442 25175 24937
+25586 25677 25678
+25442 25677 25443
+25912 25913 25677
+25586 25443 25677
+25444 25304 25443
+25175 25442 25443
+25441 25440 25910
+25910 25440 25909
+24936 24935 25440
+24937 25441 25442
+24936 25440 25441
+26374 25910 25909
+25911 25441 25910
+26375 25911 25910
+26144 26145 26059
+25442 25912 25677
+26144 26377 26378
+26378 26250 26144
+26250 26146 26145
+25911 26143 25912
+25911 26375 26376
+25912 26144 26059
+26143 26377 26144
+26373 26374 25909
+26730 26731 26375
+26374 26375 25910
+26731 26732 26376
+25911 26376 26143
+26375 26731 26376
+25916 25681 25784
+26060 26145 26061
+25914 25782 25913
+25913 26059 26060
+26061 25914 26060
+25678 25677 25913
+26060 25914 25913
+25446 25587 25681
+26062 25916 26061
+25679 25782 25914
+25783 25679 25914
+25445 25179 25305
+26061 25915 25783
+25916 25917 25681
+26061 25916 25915
+26062 26149 25917
+26150 26064 26063
+25915 25680 25783
+25785 25681 25917
+25446 25179 25445
+26061 25783 25914
+25680 25681 25587
+25915 25784 25680
+25915 25916 25784
+25783 25680 25587
+25784 25681 25680
+25783 25587 25679
+25447 25682 25683
+25178 25085 24941
+25179 25446 25306
+25587 25446 25445
+25447 25181 25180
+25179 25086 25085
+24942 24692 24691
+26149 26063 25917
+26063 25918 25785
+25447 25306 25588
+25086 25179 25306
+25681 25588 25446
+25681 25785 25588
+25180 24942 25086
+25181 24692 24942
+24942 25180 25181
+25086 25306 25180
+25306 25447 25180
+25588 25682 25447
+26153 25920 26152
+25684 25683 25919
+26064 25918 26063
+25683 25682 25918
+25684 25919 26066
+25683 25918 26065
+25917 26063 25785
+26149 26150 26063
+26151 26065 26150
+26065 25919 25683
+26150 26065 26064
+26151 25919 26065
+26066 25920 25684
+26066 26152 25920
+25685 25787 25591
+25786 25920 25921
+25924 25792 25923
+25594 25687 25791
+25789 25788 25922
+25787 25786 25921
+25592 25788 25789
+25591 25787 25788
+25924 25923 26154
+25791 25790 25923
+26384 25924 26154
+26155 25925 25924
+25927 25926 26156
+25689 25800 25801
+25927 25928 25800
+25929 26157 25930
+25793 25688 25792
+25594 25791 25792
+25928 25927 26156
+25794 25925 25795
+25926 25797 25796
+25926 25927 25798
+25930 26157 26387
+25927 25799 25798
+25927 25800 25799
+25926 25798 25797
+25792 25688 25594
+25792 25924 25793
+25451 25450 25593
+25686 25789 25790
+25794 25793 25924
+25794 25688 25793
+25590 25685 25591
+25590 25786 25685
+25449 25448 25589
+25589 25786 25590
+25594 25451 25687
+25593 25789 25686
+25589 25448 25684
+25589 25590 25449
+25788 25592 25591
+25183 25451 25184
+25789 25593 25592
+25686 25687 25593
+24467 24466 24943
+25593 25687 25451
+25592 25450 25591
+25182 24943 25448
+25591 25450 25449
+25592 25593 25450
+25451 25183 25450
+24943 25181 25448
+24943 24466 24692
+24944 24945 24467
+24944 24943 25182
+24692 25181 24943
+24469 24468 24945
+24070 24466 24467
+24943 24944 24467
+25182 25450 24944
+24944 25183 24945
+24944 25450 25183
+25183 25184 24945
+24071 24468 24072
+24467 24945 24468
+25186 25185 25309
+24945 25184 25185
+24946 24470 24469
+24471 24074 24470
+25186 25187 24946
+24946 24947 24470
+25187 25188 24947
+25187 25313 25188
+25186 25310 25311
+25186 25309 25310
+25187 25312 25313
+25187 25311 25312
+25594 25452 25184
+25594 25688 25452
+25185 25184 25307
+25185 25308 25309
+25185 25307 25308
+24947 25189 24948
+25189 25190 24948
+25696 25599 25598
+25092 24952 25091
+25087 25191 25192
+25805 25804 25931
+25089 25090 24951
+25595 25694 25695
+25191 25087 24949
+25192 25088 25087
+24947 24471 24470
+24948 24949 24693
+24951 24694 24950
+24471 24948 24693
+24950 24472 24693
+23872 24077 24078
+24950 24694 24472
+24951 25091 24952
+24952 24695 24473
+24953 25094 25095
+25095 24808 24953
+24474 24354 24473
+24356 24355 24474
+24356 24261 24260
+24614 24475 24356
+24355 24354 24474
+24695 24614 24474
+24615 24476 24475
+24696 24614 24695
+24697 24475 24614
+24808 24696 24695
+24808 24954 24697
+24953 24808 24695
+25095 25194 24954
+24951 24952 24694
+24952 25093 24953
+24952 24953 24695
+24952 25092 25093
+25314 25315 25193
+25453 25600 25315
+25094 25193 25095
+25315 25454 25194
+25600 25698 25454
+25697 25698 25600
+25599 25697 25453
+25599 25696 25697
+25932 25695 25694
+25695 25597 25596
+25692 25804 25693
+25801 25928 25802
+25689 25801 25802
+25690 25802 25929
+25932 25931 26158
+25804 25691 25930
+25689 25802 25690
+26157 26386 26387
+25691 25803 25930
+25802 25928 25929
+25690 25929 25803
+25928 26386 26157
+26158 25930 26387
+25929 25928 26157
+25804 25930 25931
+25803 25929 25930
+26388 26158 26387
+25932 25694 25805
+25693 25805 25694
+25693 25804 25805
+25931 25932 25805
+26388 25933 25932
+25696 25695 25933
+25596 25595 25695
+25697 25696 25933
+25598 25597 25696
+25453 25697 25600
+25933 26389 25934
+24959 24958 25457
+26393 26394 25938
+25458 25938 25459
+25938 26394 25939
+24961 25460 25198
+25459 25939 25460
+25698 25934 25699
+25698 25697 25934
+25458 25457 25937
+25457 25936 25937
+25600 25454 25315
+25699 25455 25195
+25935 25455 25699
+25935 25936 25456
+25457 25456 25936
+25197 25455 25456
+24479 24958 24480
+24958 24957 25456
+25939 25459 25938
+24960 24481 24959
+24961 25459 25460
+24960 25458 25459
+25199 25198 25316
+25460 25700 25461
+24961 25198 24962
+25460 25461 25198
+25199 25316 25317
+25198 25461 25316
+25096 25198 25199
+23558 23557 23682
+23467 23556 23557
+23683 23468 23558
+23683 23684 23559
+25941 25462 25700
+24487 24359 24486
+24486 24359 24358
+24487 24360 24359
+24487 24488 24361
+24487 24361 24360
+23807 23876 23808
+23560 23806 23686
+23686 23808 23687
+23686 23807 23808
+23688 23809 23878
+23687 23877 23809
+23879 23878 24087
+23809 23877 23878
+23970 23880 24088
+23970 24088 24089
+24201 24090 24089
+23880 23689 23879
+24202 24090 24201
+23970 24089 24090
+24090 23881 23970
+24088 23879 24087
+23970 23881 23880
+24088 23880 23879
+23881 23690 23689
+23686 23806 23807
+23879 23688 23878
+23879 23689 23688
+23881 23689 23880
+23292 23470 23471
+23470 23469 23560
+23559 23684 23685
+23686 23687 23470
+23291 23469 23292
+23560 23686 23470
+23685 23684 23805
+23560 23685 23806
+23469 23685 23560
+23469 23559 23685
+23469 23468 23559
+23467 23557 23558
+23291 23468 23469
+23291 23467 23468
+23079 23167 23290
+24963 24703 24811
+23079 22899 23013
+22781 22691 22690
+22899 23079 23080
+23013 23078 23079
+23470 23292 23469
+23080 23079 23290
+22691 22899 22692
+22898 23013 22899
+22242 22241 22480
+22480 22602 22691
+22781 22899 22691
+22690 22691 22602
+24084 24263 24085
+24357 24485 24264
+22898 22899 22781
+24484 24617 24485
+24702 24811 24617
+24264 24263 24357
+24961 24482 24960
+24263 24482 24483
+24484 24485 24357
+24357 24483 24484
+24482 24481 24960
+24961 24702 24482
+24083 24480 24481
+24357 24263 24483
+24084 24481 24482
+24477 24701 24478
+24700 24810 24956
+25458 24959 25457
+24479 24957 24958
+24811 24702 24962
+24483 24482 24702
+25198 25096 24962
+24703 24617 24811
+24963 25096 24703
+25199 25317 25096
+24962 24963 24811
+24962 25096 24963
+24957 25197 25456
+24957 24701 25197
+24960 24959 25458
+24480 24958 24959
+25459 24961 24960
+24962 24702 24961
+24700 24956 24701
+24810 24955 24956
+24954 25194 25195
+25454 25699 25195
+24955 25196 24956
+25195 25455 25196
+25193 25194 25095
+25193 25315 25194
+24809 24954 24955
+24808 25095 24954
+24810 24699 24955
+24615 24475 24697
+24698 24697 24809
+24614 24696 24697
+24955 24699 24809
+24615 24697 24698
+24700 24616 24810
+24810 24616 24699
+24477 24700 24701
+24616 24476 24699
+24475 24476 24261
+24615 24699 24476
+24477 24616 24700
+24477 24476 24616
+24200 24263 24264
+24084 24482 24263
+23969 23968 24085
+24263 24200 24085
+23875 23968 23969
+24084 23873 24083
+23874 23875 23681
+24085 23968 24084
+23875 23874 23968
+23679 23678 24082
+23678 24081 24082
+23285 23286 22894
+23285 23677 23286
+23678 23287 23286
+23680 23465 23288
+23289 23288 23465
+22896 23287 23288
+23680 23679 23873
+23287 23678 23679
+23679 23680 23288
+23873 23874 23680
+22241 22242 22135
+23465 23680 23681
+22243 22136 22242
+21986 22133 22134
+21987 22135 22242
+21987 21986 22135
+21851 21850 21987
+22241 22134 22133
+22135 21986 22134
+22241 22240 22352
+22241 22133 22240
+22479 22480 22352
+22135 22134 22241
+24085 24200 24086
+23969 24086 23875
+22602 22480 22479
+22691 22692 22480
+21988 22136 22243
+21988 21851 22136
+21987 21850 21986
+21851 21729 21850
+21851 21988 21729
+21732 21731 21989
+22244 22481 22482
+21322 21466 21467
+21470 21733 21471
+21321 21320 21465
+21730 21989 21731
+21322 21171 21466
+21170 21321 21171
+21465 21732 21466
+21173 21172 21467
+20899 21041 21172
+21467 21468 21173
+21733 21993 21994
+21322 21041 21171
+21173 20900 20899
+20774 20637 20636
+21319 21320 21170
+21465 21319 21464
+21465 21464 21731
+21464 21730 21731
+21171 21321 21466
+21170 21320 21321
+22780 22896 22897
+21729 21730 21464
+21732 21465 21731
+21320 21319 21465
+22687 22896 22688
+22896 22780 22688
+22687 22478 22477
+22688 22689 22601
+22238 22239 22131
+22478 22688 22601
+23288 23077 22896
+22780 22897 22689
+20040 20041 19878
+22896 23077 22897
+20900 20635 20899
+20900 20774 20635
+20901 20637 20774
+20636 20519 20635
+20520 20638 20374
+22601 22689 22897
+20774 20636 20635
+20637 20519 20636
+20369 20216 20037
+20038 20371 20217
+20370 20518 20371
+20219 20372 20220
+20217 20371 20372
+20217 20218 20039
+20217 20372 20218
+20040 20039 20219
+20218 20372 20219
+20215 20036 20214
+22131 22239 22132
+20518 20370 20369
+21985 22131 22132
+21984 22238 22131
+21462 21727 21616
+20368 20215 20214
+21983 21728 21727
+21727 21728 21616
+21463 21616 21617
+22476 21983 22475
+22474 21982 21981
+21167 21168 21039
+21983 21727 21726
+21616 21463 21462
+21982 21983 21726
+22131 21985 21984
+21616 21728 21617
+21983 21984 21728
+21728 21984 21849
+22238 22477 22239
+22895 22687 22476
+22478 22239 22477
+21983 22238 21984
+21983 22476 22238
+23286 22895 22894
+23287 22896 22895
+22895 22476 22894
+22477 22238 22476
+22478 22687 22688
+22477 22476 22687
+21318 21040 21169
+21460 21168 21167
+21462 21726 21727
+21460 21459 21981
+21318 21462 21463
+21318 21317 21462
+22476 22475 22894
+22474 21981 22473
+21983 21982 22475
+21726 21461 21460
+21462 21461 21726
+21317 21169 21168
+21461 21317 21168
+21462 21317 21461
+21318 21169 21317
+20897 20896 21039
+21168 21169 21040
+20896 21166 21167
+21168 21040 20898
+21039 21168 20898
+20772 20895 20896
+20896 20773 20772
+21726 21460 21982
+21461 21168 21460
+21981 21459 21980
+21460 21167 21166
+21459 21458 21980
+20365 20893 20631
+21459 21166 20894
+21459 21460 21166
+20890 21455 20891
+21978 22471 21979
+21976 21455 21454
+21977 21978 21456
+20892 21456 21457
+21455 21977 21456
+21453 21975 21454
+21453 21974 21975
+21455 21976 21977
+21975 22468 21976
+21978 21979 21457
+22472 21980 21979
+21979 22471 22472
+22470 22889 22471
+21977 22469 22470
+22468 22887 22469
+23280 23281 22889
+22889 22470 22888
+23671 24074 23672
+23672 23673 23281
+22471 22890 22891
+22471 22889 22890
+22471 22891 22472
+24078 23674 23872
+22893 22475 22474
+23675 23282 23674
+22472 22473 21980
+22472 22891 22473
+22891 22892 22473
+22891 23284 22892
+22473 21981 21980
+21982 21460 21981
+22892 22474 22473
+22475 21982 22474
+22892 22893 22474
+22892 23284 22893
+23286 23677 23678
+23285 23284 23676
+22890 23282 23283
+22890 22889 23281
+22891 23283 23284
+22891 22890 23283
+24478 24080 24079
+23283 23282 23675
+23283 23676 23284
+24079 24262 24477
+24082 24081 24479
+23677 23676 24080
+24479 24080 24478
+24081 23677 24080
+24476 24262 24261
+24476 24477 24262
+23675 24079 24080
+23675 23674 24079
+24262 24078 24261
+24259 24354 24355
+24261 24199 24260
+24078 24077 24199
+24261 24078 24199
+24262 24079 24078
+24077 23872 24076
+24257 24472 24694
+24473 24258 24257
+24354 24259 24258
+24260 24259 24355
+24199 24077 24259
+24077 24076 24258
+24075 24472 24257
+24471 24075 24074
+24257 24258 24076
+23673 23672 24075
+24075 24257 24076
+23279 23671 23280
+24075 24076 23673
+23282 23673 23674
+23280 22889 22888
+23673 23872 23674
+23673 24076 23872
+23282 23281 23673
+23282 22890 23281
+23280 23671 23672
+23279 23278 23670
+23279 23280 22888
+23672 23281 23280
+21975 22467 22468
+21974 21725 21973
+22464 22463 22686
+22885 22886 22467
+22883 23275 22884
+22885 22466 22884
+23464 23667 23275
+23277 22885 23276
+23276 22885 22884
+23277 22886 22885
+22887 23278 23279
+22886 23277 23278
+24073 24072 24469
+23669 23278 23277
+24073 23670 24072
+24073 23671 23670
+23669 23668 24071
+23871 23666 23870
+24072 23669 24071
+23276 23275 23667
+23670 23669 24072
+23277 23668 23669
+23463 23464 23274
+23464 23666 23871
+24069 24070 23871
+23668 23276 23667
+24468 24070 24467
+24071 23668 24070
+24069 23871 23870
+24070 23667 23871
+23075 23076 22882
+23075 23274 23076
+23076 23464 23275
+23463 23666 23464
+22685 22686 22463
+22685 22882 22686
+23076 22883 22686
+23076 23275 22883
+22237 22465 21972
+22884 22466 22465
+21970 22237 21971
+22464 22883 22465
+21970 22236 22237
+22235 22463 22236
+22883 22464 22686
+22237 22236 22464
+21848 21721 21847
+21718 21969 21970
+21035 21034 21312
+21717 21969 21718
+21718 21719 21446
+21718 21970 21719
+21719 21720 21612
+21719 21970 21847
+21848 21847 21971
+21720 21719 21847
+21720 21721 21612
+21720 21847 21721
+22466 21973 22465
+21724 21615 21723
+21723 21973 21724
+21972 22465 21973
+21973 21725 21724
+21974 21452 21725
+21449 21615 21450
+21314 21315 21161
+21972 21722 21848
+21614 21615 21449
+21972 21723 21722
+21972 21973 21723
+21724 21450 21615
+21724 21725 21451
+21315 21451 21316
+21450 21724 21451
+21315 21316 21163
+20887 20888 20771
+21452 21165 21164
+21452 21453 21165
+21449 21314 21313
+21450 21315 21314
+21161 21315 21162
+21450 21451 21315
+21447 21614 21448
+21614 21723 21615
+21447 21613 21614
+21722 21723 21614
+21448 21449 21313
+21448 21614 21449
+21612 21613 21446
+21722 21614 21613
+21719 21612 21446
+21721 21613 21612
+21613 21447 21446
+21448 21313 21447
+21315 21163 21162
+20887 21164 21165
+21037 21161 21162
+20624 20623 20768
+21163 21038 21037
+21164 21316 21452
+21163 21037 21162
+20885 20769 20884
+21037 21038 20885
+21163 21316 21164
+20887 20886 21164
+21038 21163 21164
+20888 20889 20629
+21454 21455 20890
+20361 20890 20362
+20889 21454 20890
+20625 20769 20626
+20888 20628 20771
+20627 20770 20887
+20885 21038 20886
+20888 20887 21165
+20771 20627 20887
+20889 20360 20629
+20209 20026 20359
+20890 20361 20889
+20027 19691 19872
+20030 19873 20029
+20028 20027 20360
+20360 20209 20359
+20027 19692 19691
+20358 20628 20359
+20357 20358 20207
+20357 20515 20358
+20515 20357 20514
+20626 20627 20514
+20626 20769 20770
+20627 20515 20514
+20628 20358 20515
+21037 20885 20884
+20884 20769 20625
+20885 20886 20769
+20626 20770 20627
+20769 20886 20770
+20354 20512 20355
+20621 20622 20353
+20512 20513 20355
+20356 20206 20205
+19869 20024 19870
+20023 20206 20024
+20624 20356 20513
+20356 20205 20355
+20022 19687 20354
+20023 20022 20205
+20023 20024 19869
+19383 19688 19689
+19687 20022 19688
+19689 19869 19870
+19688 20023 19869
+19383 19534 19384
+19689 19870 19690
+19689 19690 19534
+19384 19535 19385
+19692 19538 19537
+19692 20028 19693
+18522 18385 18384
+18385 18523 18267
+19538 19692 19693
+19540 19693 19694
+19539 19538 19693
+20026 19872 19871
+20209 20027 19872
+20207 20208 20025
+20025 20208 20026
+19872 20026 20209
+19871 20025 20026
+20360 20027 20209
+20360 20361 20028
+19693 20028 20361
+19692 20027 20028
+18524 18669 18670
+19541 19695 19696
+18269 18268 18524
+18524 18668 18669
+19540 19539 19693
+18522 18666 18385
+18666 18667 18523
+18666 18523 18385
+18667 18668 18523
+18267 18266 18385
+18523 18668 18386
+18061 18268 18269
+18386 18668 18524
+18061 17881 18060
+18062 18061 18269
+18525 18524 18670
+18268 18386 18524
+18673 18527 18816
+18269 18524 18525
+18527 18270 18387
+18387 18269 18525
+18527 18388 18270
+18270 18269 18387
+18526 18527 18387
+18271 18063 18062
+18677 18678 18531
+18273 18064 18272
+18529 18388 18528
+18271 18270 18388
+18272 18389 18530
+18272 18271 18389
+18674 18529 18673
+18389 18271 18529
+18672 18527 18526
+18528 18388 18527
+18673 18528 18527
+18673 18529 18528
+18672 18671 18815
+18526 18525 18671
+18527 18672 18816
+18526 18671 18672
+18677 18530 18676
+18389 18529 18675
+20034 20035 19877
+18675 18529 18674
+18530 18389 18675
+18678 18677 18817
+18530 18675 18676
+19875 19876 19698
+20030 20031 19697
+19874 19875 19698
+20031 20032 19874
+20032 19876 19875
+18670 18815 18671
+19541 19694 19695
+19693 20361 20029
+19694 19873 19695
+20029 20361 20362
+19695 19873 19696
+19696 20030 19697
+19874 20032 19875
+20362 20891 20363
+19694 20029 19873
+19694 19693 20029
+20362 20031 20030
+20362 20363 20031
+20892 20891 21456
+20362 20890 20891
+20031 20363 20032
+20365 20035 20210
+20891 20892 20363
+21457 21458 20893
+20034 20033 20210
+20363 20892 20630
+20033 19877 19876
+20032 20033 19876
+20364 20210 20033
+20033 20034 19877
+20365 20630 20893
+20893 20630 20892
+20364 20363 20630
+20034 20210 20035
+20894 20893 21458
+20894 20632 20631
+20894 20631 20893
+20632 20367 20631
+20894 20895 20633
+20213 20212 20366
+20366 20365 20631
+20367 20632 20516
+20364 20365 20210
+20366 20367 20213
+20366 20211 20365
+20035 20365 20211
+18534 18277 18533
+20211 20366 20212
+20631 20367 20366
+19243 19386 19093
+19244 19386 19387
+19388 19244 19387
+19093 19386 19244
+18823 19094 19095
+19093 19244 19094
+19543 19245 19388
+19094 19244 19388
+19095 19245 19389
+19094 19388 19245
+20896 20895 21166
+20517 20633 20634
+20634 20772 20773
+20634 20633 20772
+20633 20895 20772
+20894 21166 20895
+21039 20896 21167
+21039 20898 20897
+20773 20897 20898
+20773 20896 20897
+20036 20037 19700
+20215 20369 20037
+19390 19389 19699
+19389 19245 19543
+20037 20038 19700
+20037 20216 20038
+20038 20039 19701
+20218 20219 20039
+19702 20040 19878
+20220 20041 20040
+19704 19879 19705
+19702 19391 19701
+19879 19878 20041
+19703 19544 19392
+19705 19879 20041
+19704 19544 19703
+19880 19881 19706
+20039 19702 19701
+19878 19879 19703
+19878 19703 19702
+19879 19704 19703
+19393 19246 19099
+19545 19394 19246
+18540 18539 18826
+19100 19247 19101
+19246 19394 19247
+19247 19394 19101
+18828 19100 18949
+19099 19246 19100
+18949 19100 19101
+18827 19098 19099
+18826 18825 19098
+19393 19392 19544
+19098 19391 19392
+19392 19393 19099
+19544 19705 19393
+19699 19389 19543
+19390 18824 19095
+19390 19095 19389
+18824 18823 19095
+19700 19096 19390
+19097 18538 19096
+18536 18823 18824
+18823 18536 18822
+18537 18536 18824
+18279 18278 18535
+18071 18070 18538
+18279 18069 18160
+19391 18825 19097
+18826 19098 18827
+18825 18539 18538
+18825 18826 18539
+18828 18541 18827
+18541 18281 18540
+18826 18827 18540
+19099 19100 18828
+18541 18828 18542
+18827 19099 18828
+18073 17713 17712
+18391 18282 18542
+18540 18827 18541
+18284 18161 18283
+18282 18541 18542
+18075 18161 18162
+17894 18074 18075
+18283 18392 18284
+18163 18076 18075
+17971 18076 18077
+18075 18162 18163
+18075 18074 18161
+17714 17713 18073
+18078 18163 18285
+18077 18076 18163
+18539 18072 18538
+17711 17893 18071
+18541 18282 18073
+18391 18283 18282
+18074 18283 18161
+18074 18282 18283
+18538 18070 18537
+18070 17891 18280
+18069 18279 18280
+18160 18278 18279
+18537 18070 18280
+17893 17892 18070
+18068 18159 18160
+18948 18821 18681
+18159 18277 18278
+18276 18275 18532
+18160 18159 18278
+18067 17970 18066
+18276 18533 18277
+18947 19092 18948
+18822 18535 18821
+18278 18277 18534
+18279 18535 18536
+18278 18534 18535
+19094 18822 19093
+18681 18533 18820
+18821 18948 19093
+18681 18534 18533
+19093 18822 18821
+19094 18823 18822
+18820 18947 18948
+18819 19092 18947
+18680 18820 18533
+18819 18818 19092
+18948 18681 18820
+18821 18534 18681
+18276 18532 18533
+18819 18947 18820
+18532 18818 18680
+18680 18819 18820
+18680 18818 18819
+18818 18679 18817
+18531 18390 18273
+18274 18390 18275
+18679 18678 18817
+18274 18275 18158
+18530 18531 18273
+18678 18679 18531
+18679 18390 18531
+18679 18818 18532
+18679 18532 18390
+18680 18533 18532
+18159 18067 18277
+18066 17968 18065
+18064 18273 18158
+18272 18530 18273
+18273 18274 18158
+18273 18390 18274
+18277 18067 18276
+17970 17969 18066
+18068 18067 18159
+18068 17889 18067
+17968 17886 17885
+17969 17970 17887
+17885 18065 17968
+18064 18158 18065
+17968 17969 17886
+17968 18066 17969
+18064 17885 17884
+17886 17800 17704
+17363 17450 17364
+17704 17800 17705
+17450 17524 17525
+17885 17886 17704
+17283 17200 17282
+17525 17703 17526
+17703 17704 17526
+17703 17885 17704
+17528 17527 17706
+17526 17704 17705
+17708 17618 17617
+17528 17706 17707
+17529 17367 17528
+17365 17705 17527
+17803 17708 17707
+17618 17529 17617
+17530 17529 17619
+17367 17283 17366
+17707 17708 17617
+17619 17529 17618
+17709 17620 17619
+17368 17284 17203
+17710 17709 17892
+17804 17803 17891
+17890 17801 17889
+17707 17706 17801
+17619 17708 17709
+17619 17618 17708
+17890 17802 17801
+17803 17707 17802
+17709 17804 17892
+17803 17890 17891
+17708 17804 17709
+17708 17803 17804
+18071 18072 17711
+18281 18073 18072
+17711 17710 17893
+17621 17532 17452
+17711 17712 17533
+18072 18073 17712
+17895 17894 17971
+17714 18074 17894
+18541 18073 18281
+18282 18074 18073
+17715 17895 17896
+17715 17894 17895
+18163 18078 18077
+18077 17972 17895
+18078 17973 17972
+17974 17898 18079
+17897 17896 17973
+17377 17538 17539
+17622 17716 17805
+17717 17805 17897
+17539 17622 17623
+17377 17211 17376
+17539 17538 17622
+17211 17210 17376
+17540 17539 17623
+17453 17377 17539
+17453 17539 17540
+17377 17453 17378
+17375 17537 17714
+17374 17207 17373
+17375 17376 17209
+17375 17714 17376
+17285 17371 17205
+17532 17533 17371
+17285 17370 17371
+17531 17530 17620
+17712 17534 17533
+17712 17535 17534
+17711 17621 17710
+17711 17532 17621
+17621 17531 17710
+17530 17619 17620
+17710 17531 17620
+17621 17452 17531
+17371 17372 17206
+17535 17536 17373
+17204 17285 17129
+17371 17206 17205
+17208 17207 17374
+16420 16522 16324
+17537 17374 17536
+17207 17045 17373
+17536 17374 17373
+17375 17208 17374
+17130 17212 17213
+17211 17377 17212
+17212 17377 17286
+17213 17212 17286
+17049 17048 17130
+17048 17212 17130
+17209 17208 17375
+17209 17210 17047
+17047 17210 17211
+17209 17376 17210
+17372 17373 17044
+17207 17208 17046
+17207 17046 17045
+17208 17209 17046
+17049 16880 17048
+16880 16719 17048
+16720 16528 16880
+16528 16330 16719
+16719 17047 17048
+16717 17046 17047
+17213 17049 17130
+16881 16880 17049
+16520 16715 16521
+16716 16717 16523
+16877 17044 16878
+17206 17372 17044
+16877 17043 17044
+17044 16879 16878
+17129 17043 17042
+17129 17205 17043
+16714 16876 16877
+16955 17042 16956
+16621 16519 16518
+16876 17043 16877
+16713 16875 16876
+17042 17043 16956
+17202 17039 17201
+17040 16955 16874
+17203 17128 17040
+17042 16955 17041
+17202 17203 17040
+17368 17529 17530
+17041 17128 17042
+17041 17040 17128
+17042 17204 17129
+17284 17369 17370
+17129 17285 17205
+17204 17284 17285
+17451 17369 17368
+17451 17452 17370
+17451 17370 17369
+17452 17371 17370
+17284 17368 17369
+17202 17367 17368
+17366 17527 17367
+17527 17528 17367
+17368 17367 17529
+17202 17201 17367
+17281 17282 17200
+17283 17201 17200
+17282 17366 17283
+17365 17527 17366
+17200 17199 17281
+17281 17366 17282
+17199 17365 17281
+17526 17705 17365
+17526 17364 17525
+17127 17036 17035
+17199 17198 17365
+17365 17366 17281
+17365 17198 17364
+17037 16953 17036
+17197 17198 17037
+17197 17364 17198
+17038 17199 17200
+17038 17198 17199
+17039 17038 17200
+16954 17037 17038
+17035 17036 16951
+17197 17037 17036
+16871 16954 17038
+16871 16801 16870
+16867 16866 17034
+17034 17193 17194
+17036 17127 17197
+17035 17194 17195
+17361 17362 17279
+17196 17197 17127
+17035 17034 17194
+17033 17192 17193
+16951 16867 17035
+16866 17033 17034
+17034 17033 17193
+16864 16798 16797
+16950 17033 16865
+17191 17032 17031
+17192 17033 17032
+18056 18263 18264
+17358 17520 17359
+17190 17191 17126
+17192 17191 17358
+17192 17032 17191
+17278 17357 17358
+17698 17613 17799
+17518 17447 17446
+17358 17191 17278
+17190 17278 17191
+17190 17277 17278
+17357 17447 17358
+17518 17612 17613
+17615 17616 17520
+17360 17194 17193
+17521 17360 17359
+17361 17448 17449
+17363 17279 17362
+17884 17703 17524
+17360 17361 17194
+17701 17522 17700
+17361 17279 17194
+17195 17279 17280
+17279 17363 17280
+17280 17197 17196
+17280 17363 17364
+17450 17525 17364
+17197 17280 17364
+17196 17195 17280
+17362 17449 17363
+17362 17361 17449
+17360 17448 17361
+17360 17521 17522
+17363 17449 17524
+17448 17522 17523
+17520 17521 17359
+17522 17448 17360
+17700 17522 17521
+17701 17883 17702
+17701 17523 17522
+17449 17448 17523
+17525 17524 17703
+17450 17363 17524
+18064 18063 18272
+18064 17884 18063
+17884 17702 17883
+17884 17524 17702
+18271 18062 18270
+17882 17881 18061
+17883 17882 18062
+17883 17701 17882
+17523 17701 17702
+17700 17882 17701
+17699 17880 17881
+17967 17879 18059
+17880 18060 17881
+17967 17799 17879
+18268 18061 18060
+18062 17882 18061
+18060 18157 18268
+18059 17966 18058
+18060 18059 18157
+18060 17880 17967
+18060 17967 18059
+17880 17799 17967
+17880 17698 17799
+17699 17615 17614
+17614 17615 17520
+17699 17700 17616
+17699 17616 17615
+17700 17521 17616
+17358 17519 17520
+17698 17699 17614
+17518 17613 17519
+17612 17697 17613
+17518 17519 17447
+17613 17614 17519
+17879 17697 17798
+17799 17613 17697
+17798 17697 17696
+18521 18520 18813
+18155 18056 18264
+19091 18814 18813
+17879 17799 17697
+17878 17879 17798
+17966 18059 17879
+18384 18266 18156
+18268 18267 18386
+18157 18059 18156
+18058 18156 18059
+18521 18813 18814
+17966 17879 17878
+18946 19090 19091
+19089 19241 19242
+19384 19534 19535
+19089 19242 19090
+19241 19385 19242
+19088 19384 19241
+19088 19383 19384
+18811 19086 19087
+19687 19688 19382
+18519 19087 19088
+19382 19688 19383
+19383 19087 19382
+19383 19088 19087
+18946 19089 19090
+19088 19241 19089
+18812 18946 18813
+18812 19088 19089
+18520 18812 18813
+18519 19088 18812
+18516 18811 18517
+18810 19085 19086
+18811 18518 18517
+18519 18054 18518
+18520 18263 18262
+17694 17355 17354
+18263 18055 18262
+17351 17516 17352
+17965 17876 18056
+17876 17694 18055
+18382 18264 18263
+18383 18521 18265
+18520 18382 18263
+18520 18521 18382
+18382 18383 18264
+18264 18383 18265
+17694 17695 17355
+17357 17446 17447
+17517 17612 17518
+17518 17446 17517
+17357 17278 17277
+17877 17876 17965
+18055 18263 18056
+18056 18155 18057
+18057 17965 18056
+17357 17356 17446
+17357 17277 17356
+17877 17695 17876
+17694 17876 17695
+18055 18056 17876
+18057 17877 17965
+17693 17692 18053
+17693 17353 17692
+18055 17694 18054
+17354 17353 17693
+17693 17694 17354
+17693 18054 17694
+18518 18053 18261
+18054 17693 18053
+18052 17691 17875
+17692 17516 17691
+18051 18052 17875
+18261 18053 18052
+17611 17689 17797
+17690 17611 17797
+17688 17689 17610
+17688 17795 17796
+18051 18257 18258
+18050 18256 18257
+17690 17874 17875
+17797 17873 17874
+17874 18051 17875
+17874 17873 18051
+18051 18259 18052
+18258 18515 18259
+18261 18516 18517
+18515 18809 18810
+18052 18260 18261
+18259 18515 18260
+18513 18664 18514
+18808 18809 18664
+18664 18663 18808
+18255 18050 17871
+18664 18513 18663
+18380 18257 18379
+18256 18379 18257
+18513 18380 18379
+19082 19377 19083
+18662 18513 18512
+18808 18662 18807
+18663 18513 18662
+18806 18807 18660
+18662 18512 18661
+18510 18255 18049
+18512 18379 18256
+19240 19239 19376
+18661 18512 18660
+17794 17872 17795
+18050 17873 17872
+18255 18256 18050
+18255 18512 18256
+17797 17796 17873
+17689 17688 17796
+17794 17795 17688
+17872 17796 17795
+17606 17686 17687
+17871 18050 17872
+17793 17794 17687
+17793 17871 17794
+17604 17686 17605
+17792 17793 17687
+17791 17792 17686
+17870 17871 17792
+17792 17871 17793
+17870 18049 17871
+17685 17790 17686
+17870 17792 17791
+17343 17342 17684
+17790 17870 17791
+17684 17869 17685
+17869 17870 17790
+17869 17684 18048
+17685 17506 17684
+18507 18047 18046
+17683 17342 17682
+18046 17683 17682
+17684 17506 17343
+18503 18504 18042
+17182 17337 17012
+18043 18044 17679
+17681 17682 17341
+18044 17681 17680
+18045 17682 17681
+19076 19077 18507
+18046 18045 18506
+17678 18043 17679
+18504 19075 18505
+18504 18505 18043
+18045 17681 18044
+18042 18504 18043
+19074 19373 19075
+18044 18505 18045
+18044 18043 18505
+19075 19076 18505
+18507 18046 18506
+18048 18508 18509
+18047 17683 18046
+18048 18047 18508
+18048 17684 18047
+17685 17869 17790
+18049 18255 17871
+18048 18049 17869
+18048 18509 18049
+19079 18510 18509
+18511 18255 18510
+18806 18511 18510
+18660 18512 18511
+19375 19080 19374
+19076 18507 18506
+19682 19374 19079
+19375 19238 19080
+19681 19680 20348
+19078 18508 19077
+19681 19078 19680
+18508 18507 19077
+19680 19078 19077
+19079 18509 19078
+18505 19076 18506
+19075 19678 19679
+19373 19372 19677
+19373 19074 19372
+18805 19074 18504
+18805 19371 19074
+19073 19370 19371
+19866 19674 20015
+19867 19676 19529
+19372 19371 19530
+20347 19679 19678
+19680 19076 19679
+20204 20019 20018
+19677 19530 19676
+19868 19676 20017
+19675 19528 19866
+19677 19676 19868
+19530 19529 19676
+19868 20017 20018
+19867 19529 19675
+20016 20202 20203
+20761 20868 20762
+20345 20204 20344
+20511 20762 20615
+20019 20204 20345
+20618 20347 20346
+19677 20019 20020
+19868 20018 20019
+20019 19677 19868
+20020 19373 19677
+20876 20349 20348
+19682 19079 19681
+20877 20350 20876
+19683 19375 19374
+20349 19682 19681
+20351 20619 20352
+20350 19683 19682
+20352 20021 19684
+19685 19684 20021
+19378 19379 19084
+19082 19081 19240
+19376 19683 19684
+18807 18806 19081
+19375 19683 19376
+19080 19238 19081
+19375 19376 19238
+19240 19376 19377
+19239 19238 19376
+18806 19080 19081
+19238 19239 19081
+19079 19080 18510
+19079 19374 19080
+18511 18806 18660
+18510 19080 18806
+18808 18807 19082
+18661 18660 18807
+19082 19240 19377
+19081 19239 19240
+18808 19082 19083
+18807 19081 19082
+19382 19086 19381
+19084 19083 19378
+19531 19378 19377
+19532 19533 19378
+18809 18808 19083
+18663 18662 18808
+18516 18810 18811
+18516 18515 18810
+19379 19085 19084
+19086 18811 18810
+19380 19086 19085
+19382 19087 19086
+19380 19381 19086
+19687 19382 19381
+19684 19531 19377
+19684 19685 19531
+19379 19380 19085
+19379 19533 19686
+19533 19532 19685
+19378 19531 19532
+20021 19686 19685
+19379 19378 19533
+19685 19686 19533
+20353 19687 19686
+20512 20623 20624
+20512 20354 20623
+20623 20622 20768
+20768 20622 20767
+20622 20621 20766
+20620 20021 20352
+20622 20766 20767
+20621 20881 20882
+19683 20351 19684
+20880 20879 21032
+20349 20350 19682
+20349 20876 20350
+20350 20351 19683
+20350 20877 20351
+20347 20875 20348
+21440 21439 21599
+21156 20877 20876
+20878 20619 20351
+20353 20620 20621
+20352 20619 20620
+20880 20619 20879
+21160 20878 21159
+21157 21158 20877
+21160 21032 20879
+21033 20880 21032
+20619 20878 20879
+21154 21440 21155
+21442 21603 21604
+21155 21156 20876
+21443 21606 21444
+21312 21033 21160
+21032 21160 21033
+20881 20880 21034
+21035 20881 21034
+21034 20880 21033
+20620 20619 20880
+20620 20881 20621
+20620 20880 20881
+20766 20882 20883
+20766 20621 20882
+20882 20881 21036
+21036 20883 20882
+20878 21160 20879
+21444 21157 21156
+20877 21156 21157
+21159 21158 21309
+20878 20877 21158
+21158 21157 21308
+21445 21309 21308
+21159 20878 21158
+21310 21159 21309
+21311 21160 21159
+21311 21312 21160
+21444 21445 21308
+21445 21310 21309
+21711 21710 21966
+21711 21607 21710
+21157 21444 21308
+21606 21710 21607
+21608 21607 21711
+21608 21445 21607
+21709 21604 21708
+21605 21606 21443
+21708 21844 21709
+21708 21843 21844
+21709 21605 21604
+21709 21710 21605
+21964 21843 21963
+21708 21603 21843
+21598 21705 21599
+21962 21963 21707
+21843 21707 21963
+21441 21155 21440
+21440 21600 21441
+21706 21707 21600
+21442 21441 21602
+21600 21707 21601
+21604 21603 21708
+21604 21443 21442
+21155 21442 21156
+21155 21441 21442
+20875 21154 21155
+21599 21706 21440
+21601 21441 21600
+21601 21602 21441
+20874 21154 20875
+21153 21438 21154
+21150 21151 21028
+21029 20872 21151
+21702 21703 21437
+21305 21151 21436
+21437 21305 21436
+21306 21152 21305
+21597 21438 21704
+21153 21031 21307
+21306 21437 21307
+21597 21439 21438
+21599 21439 21598
+21154 21438 21439
+21706 21705 21962
+21598 21597 21705
+21961 21703 21960
+21704 21438 21703
+21842 21702 21701
+21960 21703 21702
+21438 21437 21703
+21306 21305 21437
+21697 21957 21698
+21958 21959 21841
+21700 21841 21701
+21840 21839 21958
+21841 21842 21701
+21959 21960 21842
+21957 21839 21698
+21957 21958 21839
+21697 21698 21595
+21839 21840 21699
+21700 21840 21841
+21700 21699 21840
+21594 21595 21433
+21436 21435 21701
+21698 21699 21596
+21698 21839 21699
+21435 21596 21700
+21595 21698 21596
+21026 21149 21150
+21435 21700 21701
+20762 20868 20869
+21433 21595 21434
+21149 21148 21434
+21434 21596 21435
+21435 21149 21434
+20868 20867 21147
+21148 21147 21433
+21148 20868 21147
+20869 20868 21148
+20761 20511 20614
+20020 20019 20345
+20763 21026 20764
+21027 21026 21150
+20869 21148 21149
+20764 21026 20870
+20869 21149 21026
+21026 21027 20870
+21150 21028 21027
+21030 20873 21029
+21030 21031 20873
+20618 20874 20347
+21031 21153 20874
+21151 20872 21028
+20873 20618 20617
+20616 20765 20617
+20764 20870 20765
+20870 20871 20765
+21027 21028 20871
+20616 20615 20763
+20345 20511 20615
+20616 20763 20764
+20615 20869 20763
+20765 20616 20764
+20346 20020 20345
+20616 20617 20346
+20765 20872 20617
+20344 20511 20345
+20761 20760 20868
+20616 20345 20615
+20616 20346 20345
+20342 20510 20343
+20343 20510 20614
+20344 20614 20511
+20760 20867 20868
+20511 20761 20762
+20614 20760 20761
+20510 20613 20614
+20610 20611 20508
+20344 20343 20614
+20509 20202 20340
+20204 20343 20344
+20204 20342 20343
+19867 20016 20017
+20340 20339 20508
+19866 20015 20202
+20013 19864 20012
+20339 20201 20338
+20015 19674 19865
+20340 20015 20201
+19865 19672 20013
+20201 20015 20014
+20202 20016 19866
+20015 19865 20014
+19072 19369 19237
+19672 19526 19864
+19524 19670 19671
+19072 19237 18945
+19236 19527 19369
+20200 20338 20013
+19670 19524 19523
+19671 20011 19864
+20609 20336 20506
+20200 20013 20012
+20014 19865 20013
+20339 20338 20508
+20012 20011 20200
+19864 20011 20012
+20336 20200 20011
+20336 20337 20200
+19863 20010 20011
+20609 20757 20507
+20507 20337 20336
+20338 20200 20337
+20864 20610 20757
+20338 20337 20507
+20760 20613 20867
+20510 20342 20341
+20612 20340 20508
+20340 20201 20339
+20613 20341 20509
+20202 20015 20340
+20509 20341 20202
+20342 20203 20341
+20612 20509 20340
+20759 20867 20613
+20612 20759 20509
+20760 20614 20613
+20509 20759 20613
+21145 21303 21146
+20612 20758 20866
+20610 20508 20338
+21025 20866 21146
+20759 20612 20866
+21147 21025 21146
+20866 20758 20865
+21023 21432 21145
+20863 20757 20756
+20867 21025 21147
+20867 20759 21025
+21147 21304 21433
+21147 21146 21304
+21696 21593 21432
+21697 21595 21594
+21593 21594 21433
+21593 21697 21594
+21697 21696 21838
+21697 21593 21696
+20863 21432 21023
+21593 21433 21432
+21024 21145 21146
+21432 21304 21303
+21024 20864 21023
+20865 20758 20864
+21023 21145 21024
+21432 21303 21145
+20866 21024 21146
+20865 20864 21024
+20757 20863 20864
+20863 20755 21432
+20010 20336 20011
+20864 20863 21023
+20756 20755 20863
+19667 20008 20009
+20755 20756 20608
+20755 20608 20505
+20609 20507 20336
+20756 20609 20608
+20756 20757 20609
+20612 20611 20758
+20612 20508 20611
+20608 20506 20505
+20608 20609 20506
+20757 20610 20507
+20758 20611 20610
+20007 20195 20196
+20196 20008 20007
+20193 20330 20194
+20330 20500 20501
+20331 20196 20195
+20332 20197 20196
+20196 20197 20008
+20332 20198 20197
+20332 20504 20333
+20862 21144 20754
+20331 20503 20332
+21022 20862 20861
+21022 21144 20862
+20501 20502 20331
+20607 20503 20502
+20194 20331 20195
+20502 20503 20331
+20330 20501 20331
+20607 20502 20501
+20860 20861 20754
+21021 20861 21020
+20862 20754 20861
+21141 20860 21140
+21020 20861 20860
+20330 20191 20329
+20499 20500 20330
+20499 20607 20500
+19233 19662 19363
+20329 20497 20498
+20329 20328 20497
+20498 20499 20329
+20498 20607 20499
+20192 20191 20330
+20329 20499 20330
+20497 20328 20496
+20004 19859 19662
+19860 20004 20005
+19859 19860 19663
+20190 20191 20005
+20190 20329 20191
+20190 20004 20328
+20190 20005 20004
+20193 20192 20330
+20005 20191 20192
+19860 19861 19664
+20006 20007 19665
+20006 20193 20194
+20006 20192 20193
+20005 20006 19861
+20194 20195 20007
+20007 20008 19666
+20197 20198 20008
+20198 20333 20009
+19669 20010 19863
+20505 20335 20334
+20505 20506 20335
+19665 20007 19666
+20006 20194 20007
+19667 20009 19862
+20334 20335 20199
+19666 19667 19366
+19666 20008 19667
+19668 19862 19669
+20199 20335 20010
+19670 19669 19863
+19862 20199 20010
+19862 20010 19669
+19667 19522 19366
+19667 19668 19522
+19667 19862 19668
+19662 19663 19521
+18494 18796 18495
+19663 19365 19364
+19664 19861 19665
+19664 19665 19365
+19861 20006 19665
+19860 19859 20004
+19663 19664 19365
+20328 20004 19662
+19859 19663 19662
+19860 19664 19663
+19233 19363 19234
+19662 19521 19363
+19364 19234 19363
+19364 19365 19067
+18795 19067 19068
+19365 19665 19068
+19065 19066 18940
+19233 19234 19066
+19364 19067 19234
+19365 19068 19067
+18371 18492 18493
+18793 18940 18941
+18492 18793 18794
+18492 18239 18793
+18493 18492 18794
+18030 18240 18031
+18795 18493 18794
+18372 18371 18493
+19067 18795 18794
+18495 18797 18496
+18244 18494 18245
+18372 18493 18494
+18795 18796 18494
+19068 19069 18796
+18245 18495 18246
+18796 18797 18495
+18496 18373 18495
+18374 18248 18247
+18249 18375 18376
+18248 18374 18375
+18496 18374 18373
+18496 18497 18374
+18657 18498 18656
+18656 18655 18800
+18943 18799 18798
+18799 18655 18798
+19070 18799 18943
+18800 18655 18799
+18797 19069 18942
+19068 19665 19069
+19069 19070 18942
+18942 19070 18943
+19366 19522 19070
+19669 19670 19523
+19368 19235 19367
+18657 18499 18498
+19526 19367 19525
+19071 18944 18801
+19526 19368 19367
+18944 19072 18802
+19671 19526 19525
+19672 19368 19526
+19865 19673 19672
+19369 19674 19528
+19672 19673 19527
+19865 19674 19673
+19867 19675 20016
+19528 19674 19866
+20016 19675 19866
+19529 19370 19675
+19371 19370 19529
+19073 19237 19370
+19672 19527 19368
+19673 19674 19527
+19368 19527 19236
+19527 19674 19369
+18802 18801 18944
+19235 19368 19236
+18803 18802 18945
+18944 19071 19236
+18802 19072 18945
+19236 19369 19072
+19073 18804 18945
+18503 18042 18254
+18804 18803 18945
+18804 18805 18503
+18804 18659 18803
+18502 18501 18658
+18659 18502 18802
+18802 18502 18658
+18658 18801 18802
+18658 18501 18801
+19072 18944 19236
+18801 18501 18500
+19235 19236 19071
+18376 18498 18499
+18375 18497 18498
+18800 18657 18656
+18245 18150 18034
+18245 18246 18150
+18246 18151 18150
+17962 17865 17864
+18153 18039 18250
+18152 18249 18250
+18248 18151 18247
+18248 18249 18151
+18252 18377 18378
+18251 18499 18377
+18378 18500 18501
+18377 18499 18500
+18503 18502 18659
+18154 18040 18252
+18804 18503 18659
+18805 18504 18503
+18503 18254 18502
+18042 17677 18041
+18253 18154 18378
+18040 18153 18252
+18501 18253 18378
+18041 17677 17868
+18251 18153 18250
+18038 17963 18037
+18039 18153 18040
+18251 18252 18153
+18378 18154 18252
+18253 18254 18041
+18253 18041 18154
+18254 18042 18041
+18152 18039 17964
+18152 18250 18039
+17676 17868 17677
+17867 18040 17868
+17864 17865 17789
+17962 18035 18036
+18036 18037 17963
+18151 18249 18037
+17964 18038 18152
+17964 17866 18038
+18150 18036 18035
+18151 18037 18036
+17332 17504 17505
+17861 17786 17860
+17865 17962 18036
+17864 17961 17962
+17505 17673 17674
+17505 17504 17673
+17862 17788 17787
+17673 17672 17786
+17862 17787 17861
+17673 17786 17787
+17670 17602 17669
+17859 18032 17860
+17862 17861 17960
+17787 17786 17861
+17789 17788 17864
+17674 17673 17788
+17961 17862 17960
+17863 17788 17862
+17863 17961 17864
+17960 18032 18033
+17788 17863 17864
+17862 17961 17863
+18032 18149 18033
+18242 18241 18371
+17860 18032 17960
+18031 18148 18032
+18244 18033 18149
+18034 17961 18033
+18032 18148 18149
+18240 18239 18492
+18371 18241 18240
+18371 18243 18242
+18149 18242 18243
+18149 18148 18242
+18030 18239 18240
+18147 18028 18237
+17959 18030 18031
+17958 18029 18030
+18148 18240 18241
+18148 18031 18240
+17959 17858 18030
+17670 17669 17858
+18032 17859 18031
+18031 17859 17959
+17959 17859 17858
+17860 17672 17671
+17602 17670 17502
+17859 17860 17671
+17859 17670 17858
+17603 17502 17670
+17671 17603 17670
+17504 17672 17673
+17502 17501 17602
+17327 17270 17326
+17601 17499 17498
+17440 17327 17439
+17669 17601 17668
+17439 17326 17438
+17601 17498 17600
+17499 17440 17439
+17668 17601 17600
+17669 17500 17601
+17597 17497 17496
+17599 17498 17497
+17664 17782 17665
+17595 17495 17594
+17437 17496 17497
+17495 17595 17596
+17597 17596 17666
+17496 17495 17596
+17667 17598 17597
+17599 17600 17498
+17667 17599 17598
+17668 17600 17599
+17667 17597 17666
+17598 17497 17597
+17664 17665 17594
+17784 17785 17666
+17783 17666 17665
+17785 17667 17666
+17852 17853 17782
+17783 17665 17782
+17851 17852 17782
+17854 17784 17783
+17783 17784 17666
+17854 17785 17784
+17855 17956 17856
+18028 17957 17856
+17955 17855 17785
+17955 18026 17855
+17855 17667 17785
+17855 17856 17667
+18029 17958 17857
+17858 17669 17857
+18028 17856 17956
+17957 17857 17856
+17858 17958 18030
+17858 17857 17958
+18028 18147 17957
+18239 18030 18029
+18028 18027 18146
+18028 17956 18027
+18490 18491 18237
+18238 18029 18147
+18491 18238 18237
+18237 18236 18490
+18653 18654 18490
+18239 18029 18238
+18792 18491 18654
+18793 18239 18491
+18939 18792 18791
+18940 18793 18792
+18652 19233 18939
+18792 18939 18940
+19233 19066 19065
+18652 18939 18791
+19065 18940 18939
+18654 18653 18791
+18490 18652 18653
+18792 18654 18791
+18491 18490 18654
+18489 18370 18488
+18234 18025 18144
+18369 18488 18370
+18490 18489 18652
+18236 18235 18489
+18235 18234 18370
+18369 18233 18232
+18234 18235 18025
+18369 18234 18233
+18369 18370 18234
+18233 18144 18232
+17954 17854 17853
+18143 18144 18024
+18233 18234 18144
+18145 18026 17955
+18146 18027 18026
+17783 17853 17854
+17783 17782 17853
+17952 17953 17851
+17953 17954 17852
+17854 17954 18025
+17853 17852 17954
+19062 18788 18787
+18651 18789 18790
+19360 19359 19516
+18651 18788 18789
+18486 18368 18367
+19517 19360 19516
+18789 18788 18938
+18790 18938 19063
+19659 19517 19658
+19361 19360 19517
+19062 18938 18788
+19232 19361 19362
+19232 19360 19361
+19358 19359 19231
+19231 19064 19063
+19360 19231 19359
+19064 18790 19063
+19358 19231 19063
+19360 19232 19231
+18787 19061 19062
+18485 18486 18367
+19357 19356 19654
+19062 19063 18938
+19996 19997 19655
+19358 19063 19062
+19513 19514 19354
+19356 19061 19355
+19059 19353 19060
+19355 19061 19060
+19229 19228 19508
+19354 19355 19060
+18142 18021 18230
+19060 19061 18786
+18651 18650 18788
+18786 19061 18787
+19357 19062 19061
+19357 19358 19062
+18788 18650 18787
+18651 18487 18650
+17949 18020 18021
+18482 18018 18481
+18231 18142 18367
+18484 18786 18485
+18483 18020 18019
+18484 18230 18020
+17661 17848 17778
+17847 18020 17848
+17662 17661 17778
+17490 17435 17489
+17849 17779 17778
+17949 17950 17849
+17949 18021 17950
+18020 18230 18021
+18484 18485 18230
+18231 18367 18368
+18230 18485 18367
+18650 18486 18787
+18650 18487 18486
+18486 18487 18368
+18651 18231 18487
+18367 18142 18230
+18022 17779 17849
+17778 17779 17662
+17849 17950 18022
+18231 18022 18142
+18231 17779 18022
+17781 17780 17850
+17850 17951 17952
+18144 18143 18232
+18023 17953 17952
+18024 17954 17953
+17592 17664 17593
+17663 17781 17664
+17782 17781 17851
+17782 17664 17781
+17664 17592 17663
+17593 17494 17592
+17592 17591 17663
+17592 17493 17591
+17851 17781 17850
+17663 17492 17780
+17951 18023 17952
+17491 17661 17590
+16988 17161 17320
+17490 17589 17491
+16653 16654 16452
+16454 16453 16654
+17319 17487 17488
+17265 17161 17264
+17488 17434 17319
+17435 17320 17434
+16988 17320 17435
+17265 17319 17320
+17435 17490 17491
+17435 17434 17489
+17660 17589 17489
+17589 17490 17489
+17434 17488 17489
+17660 17661 17589
+17846 17847 17659
+17659 17847 17660
+17846 17659 17845
+17660 17489 17488
+17318 17487 17319
+17659 17660 17488
+17658 17487 17486
+16824 16988 17491
+17160 17318 17264
+17487 17659 17488
+17317 17487 17318
+17486 17485 17657
+17842 17843 17654
+17484 17316 17315
+17486 17316 17485
+17317 16987 17316
+17317 17486 17487
+17317 17316 17486
+17484 17315 17483
+17156 16984 17113
+17316 17159 17315
+17316 16986 17159
+17318 17160 17317
+17264 17161 17160
+17316 16987 16986
+17160 16988 16987
+17159 17158 17315
+17159 16986 16985
+16984 16985 16652
+17158 17159 16985
+17261 17262 17157
+17262 17263 17157
+17315 17263 17314
+17263 17158 17157
+17314 17263 17262
+17315 17158 17263
+17155 17260 17156
+17313 17481 17482
+17112 17111 17153
+17260 17261 17156
+17155 17156 17113
+17261 17157 17156
+16984 16983 17113
+16984 16651 16822
+16450 16584 16649
+16820 17258 17153
+16821 16982 16983
+16927 17153 17111
+16982 17111 17112
+16982 16927 17111
+16983 17112 17113
+16983 16982 17112
+17260 17154 17259
+17155 17113 17154
+17312 17259 17311
+17154 17153 17259
+17479 17480 17311
+17311 17259 17258
+16581 16447 16389
+17776 17841 17777
+17587 17652 17653
+17586 17776 17652
+17653 17588 17480
+17654 17482 17481
+17588 17481 17480
+17260 17259 17312
+17154 17260 17155
+17312 17480 17481
+17260 17313 17261
+17482 17483 17314
+17312 17481 17313
+17588 17654 17481
+17261 17313 17314
+17260 17312 17313
+17845 17658 18018
+17485 17484 17657
+18228 18229 18016
+17656 17484 17483
+18014 18015 17843
+18141 18016 18015
+17482 17655 17483
+17843 18016 17655
+17484 17656 17657
+17655 17844 17656
+17654 17843 17655
+17842 18014 17843
+17947 18013 17948
+17947 17948 17841
+18013 18139 18014
+17948 18014 17842
+18139 18140 18014
+18227 18140 18226
+18015 18014 18140
+18480 18228 18366
+18017 18018 17657
+18366 18365 18479
+18366 18141 18227
+18365 18227 18226
+18365 18366 18227
+18649 18479 18779
+18365 18226 18479
+18930 18649 18779
+18780 18480 18649
+18479 18480 18366
+18780 18932 18781
+18931 18932 18780
+18933 18934 18781
+18780 18781 18480
+18932 18933 18781
+18480 18229 18228
+18481 18783 18482
+18934 18782 18781
+18935 18782 18934
+18933 19055 18934
+18482 18785 18483
+19228 19056 19055
+18785 18784 19058
+18483 19059 18484
+19057 19058 18784
+18783 18782 18936
+19055 18935 18934
+19055 18937 18783
+19055 18936 18935
+19055 18783 18936
+18784 18783 18937
+18018 18017 18481
+18229 18017 17844
+18229 18480 18481
+18229 18481 18017
+18782 18783 18481
+17657 17658 17486
+17845 17659 17658
+19056 19057 18937
+18019 18018 18482
+18785 18482 18784
+18482 18783 18784
+18937 19057 18784
+19511 19650 19651
+19228 19057 19056
+19228 19229 19057
+19059 18785 19058
+18483 18019 18482
+18019 17846 17845
+18019 18020 17847
+19059 18483 18785
+18484 18020 18483
+17660 17847 17848
+17846 18019 17847
+19230 19059 19058
+19060 18484 19059
+19351 19229 19508
+19058 19057 19229
+19229 19230 19058
+19509 19650 19510
+19509 19351 19508
+19230 19229 19351
+19351 19509 19230
+19353 19354 19060
+19511 19353 19352
+19651 19652 19512
+19510 19511 19352
+19651 19512 19511
+19230 19509 19352
+19650 19511 19510
+20184 20319 19990
+19991 19846 19990
+19990 19845 19844
+19990 19846 19845
+19991 19848 19847
+19512 19354 19353
+20601 20752 20602
+20753 20603 20602
+20319 20601 20602
+20853 20854 20752
+21018 20854 20853
+21019 20753 20854
+21284 21128 20600
+20853 20752 20751
+20493 20601 20319
+20602 19991 20319
+20318 20493 20319
+20751 20752 20601
+18478 18648 18778
+18647 18776 18777
+19054 18778 18777
+18778 18648 18777
+19053 19227 19054
+18477 18775 18776
+18477 18476 18775
+18478 18647 18648
+18477 18776 18647
+18477 18647 18478
+20319 20184 20318
+20600 20601 20493
+20751 20601 20600
+19352 19509 19510
+19508 19649 19509
+19990 19844 19989
+19845 19650 19649
+19844 19649 19508
+19844 19845 19649
+18471 18770 18645
+18362 18645 18472
+18470 18471 18360
+18471 18362 18361
+18358 18359 18223
+17840 17775 17839
+18359 18469 18224
+18360 18361 18225
+18223 18012 18011
+18012 18225 18362
+17585 17651 17478
+18012 17840 17946
+18012 17775 17840
+18359 18358 18468
+18223 18357 18358
+18767 18644 18468
+18469 18225 18224
+18011 18012 17946
+18224 18225 18012
+18360 18471 18361
+18472 18645 18772
+18468 18644 18359
+18768 18470 18469
+18769 18470 18768
+18769 18471 18470
+18359 18644 18469
+18767 18925 18644
+18769 18770 18471
+18772 18645 18771
+18772 18926 19047
+18472 18646 18364
+18927 19047 19048
+18363 18472 18364
+18363 18362 18472
+18646 18473 18364
+18773 18927 19048
+18646 18773 18473
+19646 19506 19348
+19053 19052 19225
+18775 19051 19052
+18473 18773 18774
+18646 18772 18927
+18773 19048 18774
+19345 19642 19346
+18646 18927 18773
+19047 19344 19048
+18770 18771 18645
+18770 19046 18771
+18472 18772 18646
+18771 18926 18772
+18767 18924 19044
+18766 18765 19043
+18769 19046 18770
+18769 19045 19046
+18772 19047 18927
+18926 19046 19047
+18925 18767 19044
+19639 19640 19343
+18769 18768 19045
+19045 19044 19343
+19344 19345 19048
+19344 19642 19345
+19981 19982 19645
+19348 19051 19347
+19645 19644 19836
+19644 19645 19347
+19646 19348 19645
+19052 19051 19348
+19836 19981 19645
+21280 21403 21404
+19348 19506 19349
+21281 21119 21280
+19646 19507 19506
+19225 19226 19053
+19838 19983 19984
+19838 20178 19983
+20312 20313 20180
+19839 19838 19984
+19985 19840 19648
+19647 19838 19839
+19348 19349 19052
+19506 19507 19349
+19349 19225 19052
+19349 19350 19225
+19227 19053 19226
+18777 18776 19053
+19053 19054 18777
+18929 18778 18928
+19350 19227 19226
+18929 18928 19054
+19647 19985 19648
+19987 20181 19988
+21415 21284 21414
+21415 21416 21285
+20751 21128 21018
+21129 21285 21019
+20855 21019 21130
+20854 21018 21129
+20751 21018 20853
+21128 21129 21018
+20854 21129 21019
+21284 21415 21285
+21284 20600 21414
+19840 19841 19648
+19840 19985 19986
+19648 19842 19843
+19841 19840 19986
+20180 20313 19984
+19986 19842 19841
+20313 20314 19985
+20314 20315 19987
+19842 19987 19843
+19986 20314 19987
+21285 21416 21286
+21418 21587 21681
+21019 21285 21130
+21129 21284 21285
+21285 21286 21130
+21585 21679 21680
+21416 21585 21417
+21679 21942 21943
+21587 21417 21586
+21418 21288 21417
+21681 21587 21680
+21586 21680 21587
+21587 21418 21417
+20856 21133 20857
+21683 21420 21419
+21684 21421 21420
+21419 21289 21418
+21290 21419 21291
+21286 21287 21131
+21286 21417 21287
+21131 21130 21286
+21287 21417 21288
+20856 21132 21133
+21289 21419 21290
+21289 21290 21133
+21419 21420 21291
+21290 21291 21133
+21420 21135 21134
+20857 21134 21135
+21133 21291 21134
+20855 21130 21131
+21288 21289 21132
+20856 20323 20322
+21133 21134 20857
+20322 20604 20856
+20603 20753 20855
+21288 21131 21287
+21132 20856 21131
+19995 19654 19851
+20604 21131 20856
+20603 20855 20604
+20753 21019 20855
+20320 20603 20604
+20320 20602 20603
+19992 20321 19993
+20320 20604 20321
+19850 19849 19993
+19848 19991 19992
+19851 19994 19995
+19993 20321 20185
+20323 19997 19996
+19994 19993 20185
+20322 19995 20185
+19996 19655 19654
+19992 19849 19848
+19514 19355 19354
+19515 19653 19654
+19850 19994 19851
+19849 19652 19848
+19849 19850 19653
+19511 19512 19353
+19652 19513 19512
+19512 19513 19354
+19652 19849 19653
+19652 19514 19513
+19653 19851 19654
+19652 19653 19514
+19850 19851 19653
+19514 19515 19355
+19654 19356 19515
+19656 19852 19853
+19516 19359 19358
+19654 19655 19357
+19852 19656 19655
+19655 19358 19357
+19655 19516 19358
+19656 19516 19655
+19656 19517 19516
+19997 19998 19852
+19998 19854 19853
+19854 19657 19656
+19854 19658 19657
+19852 19998 19853
+19857 19856 20001
+19998 19997 20323
+19852 19655 19997
+20324 19998 20323
+19999 19854 19998
+20321 20322 20185
+20856 20857 20323
+19995 19996 19654
+19995 20322 19996
+20322 20323 19996
+20857 20324 20323
+21135 20858 20857
+20494 20326 20187
+20858 20859 20605
+21137 21292 21422
+19857 20187 20002
+20001 20186 20325
+20186 20000 19999
+20186 20001 20000
+20324 20325 20186
+20605 20859 20606
+19999 19855 19658
+20000 20001 19855
+19855 19659 19658
+19857 20001 20187
+19361 19518 19362
+19659 19660 19518
+19518 19660 19519
+19659 19855 19856
+19659 19856 19660
+19855 20001 19856
+19858 19857 20002
+19660 19856 19857
+19857 19858 19661
+19661 19520 19660
+20002 20003 19858
+19858 20003 19661
+20188 20327 20189
+20494 20495 20326
+20003 20188 20189
+21424 21591 21293
+21425 21295 21294
+20326 20495 20327
+20494 20325 20605
+21423 21590 21424
+21591 21691 21425
+20495 20494 20606
+21690 21591 21424
+21293 21425 21294
+21691 21426 21425
+21293 21591 21425
+21424 21590 21690
+21950 21690 21689
+21689 21690 21590
+21951 21691 21690
+21835 21950 21689
+22122 22221 21950
+21688 21689 21589
+21590 21423 21589
+21424 21293 21423
+20494 20605 20606
+21136 21292 21137
+20857 20858 20324
+21136 21137 20858
+20324 20605 20325
+20324 20858 20605
+21948 21834 22120
+22219 22220 22121
+21949 21835 21687
+22121 22220 21949
+22122 21835 21949
+22220 22122 21949
+21292 21136 21421
+20859 20858 21137
+21420 21421 21135
+21684 21832 21685
+21422 21421 21588
+22772 22669 22668
+22669 22445 22220
+22444 22220 22219
+22669 22773 22670
+22120 22121 21948
+22120 22219 22121
+22671 22446 22222
+22222 21951 21690
+22445 22222 22221
+22446 21951 22222
+22220 22445 22221
+22670 22864 22671
+22670 22671 22445
+22864 22865 22671
+22669 22670 22445
+22773 22864 22670
+22444 22669 22220
+22444 22668 22669
+22444 22861 22668
+22668 22771 22772
+22668 22861 22771
+22862 23063 23064
+22863 22669 22772
+22773 22863 22864
+22772 22771 22862
+23255 23063 23161
+22863 22772 22862
+23255 23064 23063
+23256 22864 23064
+23161 23062 23448
+23063 23006 23062
+23063 22862 23006
+22861 22862 22771
+22861 23006 22862
+21832 21684 21946
+22218 22118 22217
+22118 21832 21946
+22119 22118 22218
+22593 22441 22440
+21683 21684 21420
+22441 21945 22216
+22217 22118 21946
+22217 21946 21945
+22118 22119 21947
+21947 21832 22118
+21685 21421 21684
+21947 21833 21832
+21686 21588 21685
+21686 21833 21947
+21421 21685 21588
+21947 22119 21686
+21682 21683 21419
+21945 21684 21683
+21833 21685 21832
+21833 21686 21685
+21418 21682 21419
+21944 22216 21682
+21681 21680 21944
+21586 21585 21680
+21682 21681 21944
+21682 21418 21681
+21831 21678 21830
+21584 21415 21583
+21678 21583 21677
+21678 21584 21583
+21417 21585 21586
+21416 21584 21585
+19988 20182 20183
+20181 20315 20316
+20178 20595 20312
+20596 20313 20312
+19984 20313 19985
+20596 20849 20313
+19985 20314 19986
+20599 20750 20492
+20598 20316 20597
+20182 20181 20316
+21017 20492 20750
+20317 20316 20492
+20314 20597 20315
+20850 21125 20597
+20183 20316 20317
+20314 20850 20597
+20316 20598 20492
+20597 20851 20598
+20598 20599 20492
+20598 20851 20599
+22212 22116 21942
+22857 22858 22768
+22115 21942 21831
+21679 21831 21942
+21679 21584 21831
+21680 21943 21944
+21680 21679 21943
+22342 22117 22214
+21944 21943 22117
+22439 22440 22216
+22216 21944 22215
+22342 22439 22215
+22441 22217 21945
+22665 22440 22439
+22117 22342 22215
+22341 22439 22342
+22341 22213 22212
+22341 22214 22213
+22341 22342 22214
+21126 20851 21125
+20750 20852 21017
+20750 20851 20852
+21126 21016 20851
+21017 20852 21016
+20597 21125 20851
+20850 21410 21125
+21410 21411 21125
+21411 21127 21126
+21283 21017 21127
+21125 21411 21126
+21582 21676 21829
+22431 22849 22432
+23245 23440 23441
+21283 21412 21413
+21283 21127 21412
+22438 22340 22437
+21828 21676 21939
+21411 21675 21412
+21938 21939 21675
+21675 21582 21413
+21675 21676 21582
+21940 21829 21828
+21939 21940 21828
+22437 22340 22211
+22340 22592 22664
+22860 22859 23005
+22860 22770 22859
+22859 22770 22769
+22441 22442 22217
+22860 23005 23061
+22860 22667 22770
+23797 23854 23960
+22665 22593 22440
+22665 22666 22593
+22769 22666 22665
+22770 22667 22666
+22666 22594 22593
+22442 22343 22217
+22440 22441 22216
+22593 22594 22441
+22667 22595 22594
+22595 22443 22442
+22218 22343 22119
+22218 22217 22343
+22594 22595 22442
+22667 22443 22595
+22343 22442 22443
+23399 23448 23549
+23254 23161 23448
+23255 23161 23254
+23063 23062 23161
+23448 23399 23254
+23449 23450 23255
+23399 23255 23254
+23450 23064 23255
+23549 23449 23399
+23647 23855 23856
+23257 23648 23649
+23450 23647 23856
+23549 23647 23449
+23549 23646 23797
+23647 23797 23855
+23647 23549 23797
+23960 23854 24049
+23960 24050 23855
+24194 24238 24050
+24050 23856 23855
+24051 23648 23856
+24052 24445 24446
+24051 24239 24445
+24239 24238 24444
+24602 24671 24672
+24796 24920 24921
+24345 24444 24238
+24444 24673 24239
+24194 24237 24345
+24602 24672 24444
+24345 24443 24444
+24602 24444 24443
+24194 24345 24238
+24237 24443 24345
+23160 23446 23398
+23398 23446 23447
+23447 23446 23548
+23547 23643 23644
+23056 23004 23003
+23004 23058 23059
+23056 23057 23004
+23253 23445 23159
+23055 23252 23056
+23158 23057 23056
+23253 23058 23158
+23159 23059 23253
+24237 24796 24671
+24921 25168 25169
+23446 23644 23548
+23643 23794 23795
+23548 23644 23645
+24446 24922 24923
+24673 24921 25169
+25080 25168 24921
+24796 24921 24672
+24920 25080 24921
+25169 25430 24922
+25901 25902 25431
+25080 25167 25168
+25303 25168 25167
+24673 25169 24922
+25585 25429 25428
+25168 25429 25169
+25168 25303 25429
+25169 25675 25430
+25674 25585 25673
+25675 25901 25430
+26366 26367 25901
+26142 25900 26141
+25674 25429 25585
+25901 26142 26366
+25901 25675 26142
+25900 25781 25899
+25781 25674 25673
+25781 25673 26248
+25781 25900 25674
+25675 25674 25900
+25675 25429 25674
+23793 23852 23642
+24047 23958 23852
+23852 23958 23853
+24047 24192 23958
+23853 23958 23959
+23641 23851 23793
+23546 23445 23641
+23641 23793 23642
+23851 23852 23793
+23158 23056 23252
+23058 23253 23059
+23158 23252 23253
+23645 23644 23795
+23796 23645 23795
+22855 22663 22662
+23055 23003 22858
+23444 23247 23246
+23443 23246 23442
+23632 24038 24039
+23633 23634 23443
+23850 24040 23634
+23443 23634 23444
+23633 23850 23634
+24039 24040 23850
+23245 23244 23440
+23440 23631 23632
+23442 23633 23443
+23632 24039 23633
+23441 23440 23632
+23244 23630 23631
+23633 23442 23632
+23246 23245 23442
+23441 23632 23442
+23442 23245 23441
+22849 22431 22660
+23444 23246 23443
+23246 22851 23245
+22209 21934 21933
+23245 22851 22850
+22854 22855 22661
+23250 23054 22856
+22857 22768 22767
+23054 22857 22856
+23003 23004 22858
+22664 22766 22767
+22856 22857 22766
+22663 22856 22664
+22766 22857 22767
+22855 22662 22661
+22855 22856 22663
+22591 22663 22592
+22856 22766 22664
+22767 22768 22664
+22591 22592 22438
+22663 22664 22592
+22211 22340 21940
+22438 22592 22340
+22662 22591 22438
+22662 22663 22591
+22210 22211 21940
+22661 22436 22854
+22661 22662 22437
+22339 22430 22431
+22205 21930 22204
+22658 22659 22205
+22847 23242 22848
+22204 22657 22428
+22847 22659 22658
+21674 21673 21931
+22659 22848 22429
+22590 22655 22426
+22589 22654 22590
+22652 22653 22425
+22425 22653 22589
+22653 22654 22589
+22763 22842 22652
+22763 22841 23051
+22658 22657 22846
+22658 22428 22657
+22843 22764 22842
+22843 22654 22764
+22652 22651 22763
+22763 22651 22762
+22652 22425 22651
+22761 22840 23050
+22761 23001 22840
+23626 23627 23240
+22764 22653 22842
+23051 23239 22842
+22765 22590 22654
+23053 22847 22846
+22846 22657 22845
+22844 22765 22843
+22655 22590 22765
+23052 22844 22843
+22845 22656 22844
+23244 22849 23243
+22431 22430 22660
+23240 23241 22845
+22847 22658 22846
+22849 22848 23243
+22660 22429 22848
+22850 22849 23244
+22850 22432 22849
+24033 23627 23626
+22845 22844 23240
+23627 23241 23240
+24036 24427 24428
+22844 23052 23240
+24035 24427 24036
+22845 23241 23053
+24035 24426 24427
+23627 24034 23628
+23243 22848 23242
+23243 23629 23630
+23242 23241 23628
+24037 24036 24428
+23629 24035 24036
+23244 23631 23440
+23630 24037 23631
+23628 24035 23629
+23628 24034 24035
+24426 24034 24425
+24426 24035 24034
+23242 23628 23629
+23241 23627 23628
+23439 23624 23625
+24033 24424 24425
+23625 24032 23626
+24031 24423 24032
+24032 24033 23626
+24425 24034 24033
+23239 23625 23626
+23238 23439 23625
+23397 23235 23437
+23624 23439 23438
+23438 23237 23156
+23439 23238 23157
+23002 23049 23157
+23001 23156 23049
+23439 23157 23237
+23238 23050 23157
+23240 23239 23626
+22843 22842 23239
+23239 23052 22843
+23239 23240 23052
+23001 23002 22840
+23001 23049 23002
+23239 23051 23238
+22842 22763 23051
+23622 23792 23545
+23621 23622 23544
+23791 24029 23847
+23622 23621 23791
+23544 23435 23621
+24030 23848 23847
+23847 23848 23792
+23792 23848 23623
+23849 23624 23438
+23622 23847 23792
+24029 24030 23847
+23791 23846 24029
+23791 23621 23846
+24030 23849 23848
+24030 24031 23849
+24421 24231 24420
+24029 23846 23957
+24027 24191 24230
+24231 24029 23957
+24028 23957 23845
+24028 24231 23957
+24420 24230 24229
+23956 24028 23845
+24191 23954 24026
+24229 24230 24191
+24420 24231 24230
+24419 24228 24342
+24190 24189 24228
+24419 24190 24228
+24229 24191 24026
+24190 24026 24189
+24190 24229 24026
+23956 23955 24027
+23954 24191 23955
+24191 24027 23955
+24230 24028 23956
+23957 23790 23845
+23620 23619 23790
+23619 23844 23845
+23955 23956 23844
+24027 24230 23956
+23621 23435 23620
+22838 23000 22839
+22999 23048 23000
+23395 23394 23435
+22839 22759 22758
+22338 22337 22424
+23394 23395 23233
+23435 23544 23395
+23623 23436 23545
+23396 23235 23234
+23623 23396 23436
+23236 23438 23156
+23623 23437 23396
+23155 23154 23397
+23235 23396 23437
+23001 23154 23155
+23397 23438 23236
+23236 23155 23397
+23153 23234 23235
+23397 23154 23235
+22650 22423 22422
+22650 22424 22423
+21923 22336 22199
+22423 22424 22336
+23156 23155 23236
+23156 23001 23155
+22200 22109 22108
+21926 21822 21821
+22338 21924 22337
+22200 21924 22338
+22423 22198 22422
+22760 22422 22759
+22650 22422 22760
+22649 22648 22758
+22999 23000 22838
+22422 22421 22649
+22760 22759 22839
+22336 21923 22198
+22199 22337 21924
+22199 21924 21923
+22108 21925 21667
+21926 21925 22109
+21821 21668 21667
+21924 21666 21923
+21667 21925 21821
+21666 21398 21397
+21668 21823 21399
+21666 21667 21398
+21924 22108 21667
+21399 21823 21669
+21822 21926 21823
+21670 21402 21578
+21279 21117 21116
+21279 21116 21278
+20841 21278 21116
+21011 20842 21118
+21010 20841 21116
+21402 21279 21401
+21402 21117 21279
+21117 21402 21118
+21401 21578 21402
+21577 21670 21578
+21669 21823 21670
+21401 21400 21578
+21115 21399 21577
+21115 21400 21278
+21115 21577 21400
+21927 22110 22111
+20487 20486 20591
+22112 22111 22202
+22110 22201 22111
+22113 21928 22203
+21824 21927 21928
+21927 22112 21928
+21927 22111 22112
+22113 21929 21825
+22204 21930 21826
+22658 22205 22428
+22429 21932 21931
+22339 22206 22430
+21932 22429 22206
+22209 22208 22431
+22207 22114 22206
+22431 22208 22339
+22114 21932 22206
+22432 22209 22431
+22432 21934 22209
+22209 21933 22208
+20749 20847 20593
+22339 22207 22206
+21933 21932 22114
+22208 22207 22339
+22208 21933 22207
+22205 21931 21930
+21012 21120 21282
+21931 21673 21827
+21674 21406 21405
+21674 21931 21932
+21827 21930 21931
+21581 21404 21403
+21012 21282 21013
+21673 21405 21281
+21673 21674 21405
+21580 21581 21403
+21827 21673 21581
+21671 21826 21672
+21929 22204 21826
+21580 21672 21581
+21826 21930 21672
+22113 21824 21928
+21825 21826 21671
+21825 21579 21824
+21580 21403 21579
+21579 21671 21580
+21579 21825 21671
+21120 21119 21281
+19507 19646 19837
+21405 21282 21120
+20845 21012 21013
+21405 21120 21281
+21012 21119 21120
+21405 21406 21282
+21122 21123 21015
+21407 21123 21122
+20748 20846 20749
+21407 21124 21123
+21407 21408 21124
+21406 21122 21014
+20489 20594 20490
+21406 21014 21121
+20846 20748 20845
+20846 21122 21015
+21406 21407 21122
+21123 20847 21015
+20595 20178 20311
+20593 20488 20592
+20179 20178 20312
+20491 20594 20595
+19983 20178 20179
+20177 20490 20491
+19838 20177 20178
+20595 20311 20491
+20178 20177 20311
+20177 20489 20490
+20749 20592 20748
+20489 20593 20847
+20489 20488 20593
+21014 20845 21013
+21014 20846 20845
+21122 20846 21014
+20749 20593 20592
+21015 20749 20846
+21015 20847 20749
+19646 19645 19837
+19980 19981 19836
+20176 19982 19981
+19837 19645 19982
+20310 19979 20309
+19980 20176 19981
+20310 20175 19979
+20310 20487 20175
+19644 19980 19836
+20175 20176 19980
+20310 20486 20487
+20310 20309 20486
+20486 20309 20591
+21281 21280 21404
+21118 20844 21011
+20746 20747 20589
+20844 20591 20747
+20308 20485 20309
+20308 20589 20485
+20746 20843 20844
+20589 20308 20588
+21118 20842 21117
+20842 20841 21010
+20843 20842 21011
+20587 20841 20842
+19978 20307 20308
+20587 20588 20307
+20843 20746 20588
+20747 20746 20844
+20589 20588 20746
+20835 20834 21112
+21113 20835 21112
+20836 20835 21113
+21113 21114 20836
+21920 21919 22196
+21114 21394 21395
+21113 21394 21114
+21113 21112 21394
+20586 20292 20585
+22409 22191 22335
+21111 20827 20826
+20584 20744 20745
+20826 20827 20745
+20585 20745 20827
+20744 20826 20745
+20483 20581 20582
+20825 20826 20744
+20824 20825 20742
+20583 20743 20744
+20582 20825 20743
+20581 20824 20742
+21110 20825 20824
+21107 20822 20821
+20289 19971 20288
+20288 20579 20289
+20822 21107 21383
+21105 20821 20820
+19622 19971 19623
+21378 21379 20819
+20286 20820 20821
+20819 21103 20820
+21275 21105 21104
+21106 20821 21105
+21277 21381 21382
+21382 21107 21106
+21108 20823 20579
+21103 21379 21104
+21380 21381 21276
+20815 21375 20816
+21900 21899 22182
+21375 21376 20816
+21376 21377 20817
+21376 21660 21902
+20819 21379 21103
+21104 21380 21275
+21379 21663 21905
+21106 21277 21382
+21380 21906 21381
+21275 21276 21105
+21275 21380 21276
+21105 21277 21106
+21276 21381 21277
+21383 21108 20822
+21384 21110 21109
+21109 21110 20824
+21382 21383 21107
+21909 22107 21910
+21907 21664 21906
+21378 21662 21663
+21378 21377 21661
+21378 21663 21379
+21662 21661 21903
+21662 21378 21661
+20815 21374 21375
+21374 21373 21898
+21375 21660 21376
+21375 21659 21660
+21659 21900 21901
+21659 21899 21900
+21377 21902 21903
+22399 22331 22398
+21377 21903 21661
+21902 22186 22401
+22185 22184 22332
+22106 21900 22183
+22184 22183 22331
+21900 22182 22183
+22184 22106 22183
+21901 21900 22106
+22331 22330 22398
+22331 22183 22330
+22185 21901 22184
+22400 22185 22332
+22186 21660 22185
+21660 22186 21902
+21662 21904 21663
+21662 21903 21904
+21904 21905 21663
+22187 21908 21907
+22334 22408 22335
+22187 22188 21908
+22187 22406 22188
+22189 22333 22334
+22189 22334 22190
+22333 22408 22334
+22410 22645 22411
+22411 22194 22193
+22107 22189 22190
+22188 22333 22189
+22335 22191 22190
+22191 21910 22190
+21908 21909 21665
+22188 22189 21909
+22107 22190 21910
+21384 21385 21110
+21910 22191 21911
+21912 21911 22193
+21911 22191 22192
+22419 22197 22196
+22197 21920 22196
+22196 21919 22195
+22647 22648 22421
+22648 22649 22421
+22758 22648 22838
+22648 22647 22837
+23046 23047 22836
+22999 22648 22837
+22834 22835 22646
+23617 23542 23431
+22837 22647 22836
+22421 22420 22647
+22195 22419 22196
+23045 22998 22835
+23046 23151 23047
+23151 23046 23230
+22998 23046 22836
+23230 23393 23151
+23045 23046 22998
+23045 23230 23046
+23393 23231 23151
+23152 23232 23048
+22837 23048 22999
+22837 23047 23152
+23152 23231 23232
+23393 23232 23231
+22837 23152 23048
+23047 23231 23152
+23543 23433 23432
+23434 23230 23433
+23543 23432 23618
+23433 23230 23392
+23432 23392 23229
+23432 23433 23392
+23229 23542 23432
+23431 23616 23789
+23434 23433 23543
+23789 23617 23431
+23618 23542 23617
+23843 23789 23842
+23843 23617 23789
+23953 23843 23842
+23952 23616 23841
+23953 23616 23952
+24025 23953 23952
+23951 23952 23841
+23615 23839 23840
+24022 24023 23839
+23841 23840 23951
+22644 22824 22825
+23430 23598 23599
+22642 22588 22641
+23211 23210 23430
+22587 22586 22640
+23212 23044 23211
+22814 22640 22639
+22181 21898 22396
+22815 22641 22640
+22588 22398 22397
+22399 22398 22642
+22398 22182 22397
+22641 22815 22642
+22587 22641 22588
+22587 22640 22641
+22332 22399 22400
+22399 22642 22643
+22186 22400 22401
+22191 22409 22192
+22335 22408 22409
+22411 22412 22194
+22409 22410 22192
+22188 22407 22333
+22188 22406 22407
+22186 22185 22400
+22642 22398 22588
+22330 22182 22398
+22587 22397 22586
+22587 22588 22397
+22400 22399 22643
+22332 22331 22399
+22814 22639 22638
+22640 22586 22396
+21374 21899 21659
+22636 22637 22394
+22813 22638 22637
+22393 22392 22635
+22812 22636 22635
+22813 22637 22636
+22389 22630 22390
+22808 22629 22757
+22387 22626 22627
+22808 22630 22629
+22389 22629 22630
+22389 22585 22629
+22997 23036 22810
+21094 21369 21095
+22810 23037 22631
+22633 22634 22392
+22811 22633 22632
+21370 21894 21895
+22757 22807 22808
+22806 23032 22807
+23033 22808 22807
+22628 22757 22629
+22628 22627 22757
+23033 23034 22808
+23202 23035 22996
+22809 22630 22808
+22996 22997 22810
+22810 22630 22809
+23203 23036 23202
+22809 22995 22996
+23034 22996 22995
+23034 23202 22996
+22630 22810 22631
+22809 22996 22810
+22631 23037 22632
+23039 23040 22812
+22635 22634 22812
+22813 22814 22638
+23036 23149 23037
+23038 22632 23037
+23204 23038 23037
+22811 22632 23038
+23205 23038 23204
+23040 23039 23205
+23206 23041 23040
+23206 23207 23041
+24002 23594 24001
+24002 23595 23594
+24004 23596 24003
+24004 23597 23596
+23593 23429 23592
+23036 23037 22810
+23838 23591 23837
+23999 23592 23591
+23838 23837 23998
+24221 23838 23998
+23999 23591 23838
+24187 23997 24186
+23950 23837 23836
+23837 23590 23788
+23426 23541 23427
+23998 23950 23997
+23998 23837 23950
+23427 23200 23391
+23429 23204 23203
+23204 23149 23203
+23204 23037 23149
+23035 23036 22997
+23203 23149 23036
+23032 23033 22807
+23201 23034 23033
+22996 23035 22997
+23202 23036 23035
+22627 22807 22757
+23539 23426 23390
+23426 23589 23541
+23836 23589 23787
+23590 23428 23427
+23391 23426 23427
+23589 23590 23541
+23590 23427 23541
+23201 23033 23032
+23786 23787 23589
+23835 23948 23787
+23996 23948 23995
+23836 23787 23948
+23997 23949 24185
+23836 23948 23949
+23834 23947 23835
+23994 23995 23947
+23587 23784 23785
+23946 23947 23834
+23785 23786 23588
+23834 23835 23786
+23426 23539 23540
+23390 23425 23539
+23946 23833 23784
+23946 23834 23833
+23587 23785 23588
+23833 23834 23785
+23833 23785 23784
+23424 23537 23538
+23586 23538 23537
+23784 23587 23586
+23586 23423 23387
+23586 23537 23423
+23388 23424 23389
+23423 23537 23424
+23539 23425 23538
+23390 23389 23425
+23390 23426 23391
+23540 23589 23426
+23423 23388 23387
+23198 23388 23389
+23198 23197 23388
+23197 23146 23145
+22991 23026 23027
+22990 22801 23026
+22992 23027 23028
+23026 23144 23027
+23028 22993 22992
+23029 22994 22993
+23027 23145 23028
+23196 23387 23197
+23196 23197 23145
+23387 23388 23197
+23199 23147 23389
+23146 23197 23198
+23146 23147 23029
+23146 23198 23147
+22805 23030 23031
+22805 22994 23030
+22805 22804 22994
+22806 22805 23031
+22994 23029 23030
+22755 22804 22756
+22993 22994 22804
+22625 22805 22626
+22625 22756 22805
+22805 22806 22626
+23031 23032 22806
+22624 22756 22625
+22804 22805 22756
+22802 22803 22754
+22992 22993 22803
+22754 22755 22623
+22803 22804 22755
+22622 22752 22753
+22803 22755 22754
+22622 22621 22752
+22753 22752 22801
+22803 22991 22992
+22990 23026 22991
+22802 22801 22990
+22802 22753 22801
+22621 22580 22752
+22754 22753 22802
+22754 22623 22753
+22581 22580 22621
+22382 22100 21885
+22622 22581 22621
+22384 22327 22326
+22581 22383 22580
+22325 22171 22324
+22382 22324 22100
+22170 22100 22324
+22383 22382 22580
+22383 22325 22382
+22171 22170 22324
+22171 22102 22101
+22170 22101 22100
+22170 22171 22101
+22103 21887 22102
+21887 22101 22102
+22172 22103 22102
+21819 21818 21887
+22326 22325 22383
+22172 22102 22171
+22326 22172 22325
+22326 22103 22172
+22384 22326 22383
+22327 22103 22326
+22173 21888 22103
+21888 21887 22103
+21889 21820 22104
+21820 21819 21888
+21889 22104 22174
+21889 21652 21820
+22385 22173 22327
+22104 21888 22173
+21890 21654 21889
+22104 22173 22328
+22104 22328 22174
+22584 22583 22624
+22581 22384 22383
+22582 22327 22384
+22173 22385 22328
+22582 22623 22583
+22623 22622 22753
+22623 22582 22622
+22755 22624 22623
+22624 22625 22584
+22623 22624 22583
+22755 22756 22624
+22387 22627 22388
+22806 22807 22627
+22385 22584 22386
+22385 22583 22584
+22174 22386 22175
+22328 22385 22386
+22631 22391 22390
+22632 22633 22391
+22388 22585 22389
+22627 22628 22585
+22633 22392 22391
+22634 22635 22392
+22636 22394 22393
+22637 22638 22395
+22179 22395 22180
+22394 22637 22395
+22638 22639 22180
+22639 22640 22396
+21898 22181 21899
+22396 22397 22181
+22179 22329 22395
+22394 22395 22329
+22105 22179 21897
+22395 22638 22180
+22394 22177 22393
+21897 21372 21658
+22105 22178 22179
+22177 22394 22178
+21897 22179 22180
+22178 22329 22179
+21374 21898 21899
+22180 22396 21898
+22393 22177 21895
+22105 21897 21896
+22177 22105 21896
+22177 22178 22105
+21093 21092 21368
+22391 22392 21894
+22391 21894 21893
+21658 21896 21897
+22392 21895 21894
+22392 22393 21895
+21655 21890 21891
+22387 22388 22176
+21891 21890 22176
+21575 21364 21363
+21368 21892 21893
+21657 21891 21892
+21367 21657 21892
+21367 21273 21366
+21366 21273 21272
+19497 19498 19314
+21368 21367 21892
+21092 21091 21367
+21369 21368 21893
+21093 21004 21092
+21095 21369 21096
+21893 21894 21369
+21370 21658 21371
+21895 21896 21658
+20740 20812 20813
+21372 21897 21373
+21375 21374 21659
+20814 21102 21374
+21374 21102 21373
+20814 20813 21102
+21369 21370 21096
+21369 21894 21370
+21372 21274 21371
+21372 21100 21274
+21098 21097 21370
+21007 20809 21097
+21373 21101 21372
+20276 20481 20169
+21102 21101 21373
+20479 20275 20478
+21100 21009 21099
+20812 21101 21102
+20809 20568 20739
+21094 21368 21369
+21098 21008 21007
+21098 21009 21008
+20738 20568 20737
+21094 21093 21368
+21005 21004 21093
+21006 21094 21095
+21006 20806 21094
+21367 21091 21273
+21368 21092 21367
+21003 21091 21092
+20806 21004 21005
+21271 21272 21091
+21273 21091 21272
+21364 21365 21270
+21365 21366 21272
+21575 21363 21574
+21270 21362 21363
+21576 21364 21575
+21270 21363 21364
+21271 21365 21272
+21657 21367 21366
+21270 21365 21271
+21576 21656 21365
+21364 21576 21365
+21655 21891 21656
+21655 21656 21576
+21891 21657 21656
+21889 21654 21653
+21890 21655 21654
+21655 21575 21654
+21363 21362 21574
+21654 21575 21574
+21655 21576 21575
+21652 21653 21572
+22175 21889 22174
+21653 21652 21889
+21653 21573 21572
+21654 21574 21573
+22100 21886 21885
+22101 21887 21818
+21886 22101 21818
+22104 21820 21888
+21652 21819 21820
+20563 20731 20732
+20804 20805 20732
+20735 20734 20805
+20472 20269 20158
+20804 20732 20731
+20805 20733 20732
+20734 20565 20733
+20731 20562 20265
+20563 20732 20564
+20562 20468 20265
+20469 20470 20267
+20468 20469 20266
+20564 20733 20471
+20562 20469 20468
+20562 20563 20469
+20469 20563 20470
+20562 20731 20563
+20563 20564 20470
+20732 20733 20564
+20567 20566 20736
+20567 20473 20270
+20272 20161 20271
+20270 20159 20269
+20159 20158 20269
+20470 20564 20471
+20735 20472 20565
+20566 20269 20472
+19956 19955 20161
+20271 20473 20474
+20474 20273 20272
+20274 20163 19958
+19825 19959 20164
+19958 19823 19957
+19957 19956 20272
+20161 20160 20271
+20272 20162 19957
+20273 20274 20162
+20158 20159 19954
+20269 20566 20270
+20271 20270 20473
+20160 20159 20270
+20272 20271 20474
+20161 19955 20160
+20472 20268 20471
+20266 20469 20267
+20268 20472 20158
+19306 19187 19006
+19308 19493 19494
+18741 19012 18913
+20266 20267 20156
+19009 19190 19191
+19308 19494 19191
+19010 19192 19193
+19010 19191 19192
+19308 19190 19189
+19308 19191 19190
+19188 19187 19306
+19007 18910 18909
+19307 19188 19306
+19189 19008 19188
+18740 19011 18741
+19010 19193 19011
+20157 20268 20158
+19012 19197 19013
+19012 19196 19197
+20160 20270 20271
+19013 19197 19198
+19958 19824 19823
+19199 19015 19014
+19824 19605 19823
+19959 19824 19958
+19959 19605 19824
+19825 19606 19605
+20274 19958 20162
+20163 19959 19958
+20272 19956 20161
+19958 19957 20162
+19823 19956 19957
+20267 20268 20156
+20268 20157 20156
+19954 20160 19955
+19954 20159 20160
+19607 19606 19826
+19825 19960 19606
+19608 19828 19829
+19608 19827 19828
+19497 19313 19610
+19313 19312 19609
+19309 19495 19310
+19309 19605 19606
+19496 19607 19827
+19496 19495 19607
+19312 19202 19311
+19311 19310 19496
+19200 19309 19310
+19311 19200 19310
+19016 19309 19200
+19311 19201 19200
+19313 19497 19206
+19608 19311 19496
+19608 19312 19311
+19609 19312 19608
+19313 19206 19205
+19207 19206 19314
+19313 19609 19610
+19204 19203 19312
+19315 19207 19314
+18745 18744 18920
+19022 18744 18919
+19208 19017 19207
+21004 20806 21003
+19211 19017 19210
+19316 19315 19498
+19316 19209 19208
+19206 19497 19314
+19610 19498 19497
+20167 20275 20480
+20570 20477 20476
+20167 20166 20275
+20810 20569 20809
+19962 20167 20168
+19962 20166 20167
+21100 21101 20811
+20275 20166 20478
+20570 20571 20478
+20573 20574 20481
+20479 20572 20275
+20479 20571 20572
+20166 20477 20478
+20166 20475 20476
+20166 20476 20477
+20475 20569 20476
+19826 19961 19827
+20164 19959 20163
+20274 20164 20163
+19825 19605 19959
+19826 19960 19961
+19826 19606 19960
+20165 20164 20274
+19960 19825 20164
+19961 19960 20165
+20807 20808 20738
+20569 20475 20568
+20808 20739 20738
+20808 20809 20739
+21095 20808 20807
+19212 19017 19211
+20807 20738 20737
+20739 20568 20738
+21094 20806 21005
+21095 20807 21006
+20737 20806 20807
+21096 20808 21095
+21096 20809 20808
+20477 20570 20478
+21009 21100 20811
+20811 20810 21008
+20570 20569 20810
+20811 20570 20810
+20811 20571 20570
+20478 20571 20479
+20811 21101 20812
+20275 20572 20480
+20571 20811 20812
+20572 20812 20740
+20572 20571 20812
+20576 20575 20814
+20482 20481 20574
+20280 20279 20815
+20814 21374 20815
+20277 20575 20278
+20814 20815 20576
+20741 20574 20740
+20741 20575 20482
+20814 20575 20741
+20576 20278 20575
+20572 20573 20480
+20740 20574 20573
+20167 20276 20168
+20480 20481 20276
+20741 20482 20574
+20575 20277 20482
+20279 20278 20576
+20171 19963 19962
+19963 20279 19964
+20576 20815 20279
+20281 20280 20816
+19965 19612 19833
+20283 20174 20282
+20173 20172 20282
+20817 20281 20816
+20172 19967 20281
+20282 20174 20173
+19970 20284 19618
+20284 20283 20818
+19321 19215 19214
+19324 19217 19020
+20284 20819 20285
+20820 20286 20285
+20821 20822 20287
+20578 20288 20287
+20580 20823 20824
+20818 20577 20817
+20283 20282 20577
+20821 20287 20286
+20288 19971 19622
+20822 20578 20287
+20822 21108 20578
+20578 20579 20288
+20578 21108 20579
+20579 20580 20289
+20579 20823 20580
+20289 20483 20290
+20742 20825 20582
+20580 20483 20289
+20581 20742 20582
+20580 20581 20483
+20580 20824 20581
+20291 20484 20292
+20584 20745 20585
+20291 20583 20484
+20582 20743 20583
+20583 20584 20484
+20583 20744 20584
+20292 19972 20291
+20484 20584 20585
+19973 19626 20294
+20585 20827 20586
+19630 20296 19976
+19633 19634 19340
+20302 20303 19977
+19638 19637 19977
+19341 19636 19637
+18006 18461 18007
+19338 19337 19632
+19629 19975 20296
+19974 20295 19975
+19835 19627 19973
+19624 19972 20292
+19630 19976 19631
+20296 20297 19976
+20585 20292 20484
+18453 18454 18356
+19971 20290 19972
+20483 20582 20290
+20290 20291 19972
+20290 20582 20291
+20293 19625 20292
+19027 19329 19624
+19972 19623 19971
+19025 18749 18748
+20292 19625 19624
+20293 20294 19626
+20293 19626 19625
+19627 19628 19330
+19973 19627 19626
+19835 19628 19627
+19504 19503 19630
+19332 19331 19629
+19504 19630 19505
+19629 20296 19630
+19334 19333 19504
+19503 19629 19630
+19974 19628 19835
+19331 19030 19330
+19505 19334 19504
+19333 19332 19503
+19633 19338 19632
+19222 19035 19034
+19340 19339 19633
+19036 19037 18461
+19633 19339 19338
+19340 19037 19036
+19035 19223 19224
+19338 19339 19224
+19034 19336 19337
+19337 19338 19222
+19338 19223 19222
+19338 19224 19223
+19332 19333 19032
+19503 19504 19333
+19335 19334 19505
+19335 19033 19221
+19631 19336 19335
+19631 19632 19336
+19503 19332 19629
+19031 19030 19331
+19029 19330 19030
+19626 19627 19330
+19975 19331 19628
+19332 19031 19331
+19616 19617 19502
+19969 20283 19970
+19834 19615 19614
+19967 20172 19968
+19501 19616 19502
+19501 19615 19616
+19969 19970 19617
+20284 20285 19619
+19620 19619 20285
+19019 18915 19018
+19326 19621 19327
+20287 20288 19622
+19025 19622 19623
+19621 20287 19622
+19968 19969 19617
+20174 20283 19969
+19320 19970 19618
+20283 20284 19970
+19967 19968 19616
+20173 20174 19968
+19614 19613 19966
+20280 20281 19966
+19615 19967 19616
+19834 19966 19967
+19833 19964 19965
+20279 20280 19964
+19832 19963 19964
+19962 20278 20171
+19966 19965 20280
+19966 19834 19614
+20279 20171 20278
+20279 19963 20171
+20276 20169 20168
+20170 20278 19962
+20169 19962 20168
+19831 19611 19962
+19963 19831 19962
+19611 19832 19833
+19831 19963 19832
+19611 19833 19612
+19832 19964 19833
+19965 19966 19613
+19615 19501 19500
+19832 19611 19831
+19499 19613 19614
+19965 19613 19612
+19499 19615 19500
+19027 19028 18753
+19625 19626 19029
+18754 19029 18454
+19028 19625 19029
+18355 18452 18453
+19028 19029 18754
+18453 18452 18754
+18355 18211 18452
+18454 18453 18754
+18356 18212 18453
+18212 18355 18453
+18211 18210 18452
+18452 18210 18354
+18211 18131 18210
+18212 18211 18355
+18212 18132 18131
+18454 18213 18356
+18454 18214 18213
+18455 18456 18216
+17999 18136 18137
+18455 18215 18214
+18135 18215 17997
+18755 18456 18455
+18755 18756 18457
+19029 18455 18454
+19030 18755 18455
+17944 18000 18001
+18457 18756 18458
+18001 18218 18002
+18217 18457 18218
+18456 18457 18217
+18456 18755 18457
+18003 18458 18459
+18218 18457 18458
+19033 19034 18459
+19036 18461 18460
+19031 18755 19030
+19031 18756 18755
+19332 19032 19031
+19333 19334 19221
+19032 19221 19033
+19032 19333 19221
+18459 19034 18757
+19033 19336 19034
+19034 19035 18757
+19222 19223 19035
+19035 19036 18757
+19224 19339 19036
+19038 18758 18462
+18465 18464 18641
+18758 19038 19039
+18640 18760 18641
+18759 19039 18760
+18758 19039 18759
+18922 18761 19040
+18762 18465 18641
+19341 19041 19040
+18763 18764 18642
+18764 18763 19042
+18922 19040 19041
+19043 19042 19342
+18923 18764 19042
+18767 18766 18924
+18767 18468 18643
+19041 18762 18922
+18466 18465 18762
+19041 18763 18762
+19041 19042 18763
+18221 18220 18465
+18463 18462 18758
+18643 18357 18467
+18223 18222 18357
+18767 18643 18766
+18468 18357 18643
+17648 18009 17649
+18222 18011 18010
+17838 18008 17647
+18465 18466 18221
+18220 18221 18009
+18466 18222 18221
+18465 18220 18464
+18009 17648 18008
+18464 18639 18640
+18464 18463 18639
+18641 18464 18640
+18220 18463 18464
+18759 18463 18758
+18220 18008 18463
+18757 18460 18459
+18757 19036 18460
+17643 17834 17835
+18460 18461 18219
+18005 18004 18219
+17772 17641 17771
+17835 17834 18004
+17643 17642 17834
+17836 17837 17645
+17644 17580 17774
+18005 17835 18004
+17774 17643 17835
+18461 18006 18219
+18006 17836 18005
+18219 18006 18005
+17836 17645 17644
+18007 17837 18006
+18007 17838 17646
+18007 18008 17838
+18007 18462 18008
+17585 17650 17651
+17839 17775 17650
+17835 17836 17774
+18006 17837 17836
+17476 17648 17649
+18010 17839 17649
+17477 17476 17649
+17647 18008 17648
+17649 17585 17477
+17477 17585 17478
+17649 17650 17585
+17647 17474 17473
+17648 17475 17474
+17648 17476 17475
+17584 17646 17471
+17645 17646 17584
+17838 17472 17646
+17647 17473 17472
+17584 17583 17645
+17582 17581 17644
+17470 17582 17583
+17470 17581 17582
+17584 17471 17470
+17580 17642 17643
+17580 17641 17642
+17831 17832 17769
+17771 17641 17770
+17832 17833 17771
+17773 17642 17641
+17829 17769 17828
+17770 17641 17769
+17771 17833 17772
+17834 17642 17773
+17944 18001 17829
+18002 17831 17830
+17830 17831 17769
+18002 18003 17831
+17772 17833 17773
+18003 18004 17833
+18138 18000 17942
+18217 18001 18000
+17944 17829 17828
+17830 17769 17829
+18002 17945 18001
+18002 17830 17945
+18216 18136 18215
+17999 17942 17941
+18216 18137 18136
+18216 18138 18137
+18217 18138 18216
+18217 18000 18138
+18214 18135 17996
+18214 18215 18135
+18132 18133 17995
+18132 18356 18133
+18133 18134 17995
+18213 18214 18134
+17995 18131 18132
+17995 18208 18131
+17941 17998 17999
+17997 18215 17998
+18136 17999 17998
+18137 18138 17999
+17944 17943 18000
+17828 17942 17943
+17941 17997 17998
+17996 18135 17997
+17997 17941 17996
+17942 17828 17941
+18131 18209 18210
+18131 18208 18209
+18209 18451 18354
+18450 18638 18752
+18751 18752 18638
+18451 18209 18353
+18449 18638 18351
+18450 18353 18352
+18451 18353 18450
+18209 18208 18353
+18449 18351 18350
+18352 18208 18351
+18631 18447 18630
+18633 18634 18447
+18635 18448 18447
+18635 18749 18448
+18349 18630 18447
+19322 19216 19018
+18745 18746 18630
+18632 18447 18631
+18636 18449 18350
+18637 18638 18449
+19023 18746 18745
+19021 18919 18918
+19322 19018 19215
+18630 18744 18745
+18630 18743 18744
+19499 19611 19612
+19019 18916 18915
+18917 18743 18916
+19020 18917 18916
+18918 18743 18917
+19024 19025 18748
+19025 19026 18750
+18630 18746 18631
+19023 19328 18746
+18746 18632 18631
+18633 18447 18632
+18751 18750 18921
+18637 18636 18750
+18750 18751 18638
+18921 19027 18752
+18450 18752 18451
+18751 18921 18752
+18919 19021 19218
+19219 19326 19022
+19020 19217 18918
+19324 19323 19619
+18743 18919 18744
+18743 18918 18919
+19220 19023 18920
+19326 19620 19621
+18746 19024 18747
+19622 19025 19024
+19329 19025 19623
+19026 18921 18750
+19329 19026 19025
+19329 19027 19026
+19220 19327 19023
+19328 19024 18746
+19621 19328 19327
+19621 19622 19328
+19220 19326 19327
+19220 19022 19326
+19219 19218 19325
+19219 19022 19218
+19620 19325 19324
+19620 19326 19325
+19321 19322 19215
+19019 19020 18916
+19619 19323 19322
+19619 19620 19324
+19218 19217 19325
+19020 19323 19324
+19502 19319 19318
+19213 19018 19318
+19500 19501 19318
+19318 19501 19502
+19320 19321 19214
+19618 19322 19321
+19319 19320 19213
+19323 19216 19322
+19323 19020 19019
+18918 19217 19021
+19324 19325 19217
+19216 19019 19018
+19216 19323 19019
+19319 19213 19318
+19214 19018 19213
+19214 19215 19018
+19211 19317 19212
+19309 19015 19199
+19205 19204 19313
+19202 19201 19311
+19017 19205 19206
+19017 19204 19205
+19613 19499 19612
+19500 19318 19499
+19317 19210 19209
+19317 19211 19210
+19317 19209 19316
+19210 19017 19209
+19203 19202 19312
+19016 19201 19202
+19016 19203 19204
+19016 19202 19203
+19315 19208 19207
+19209 19017 19208
+18738 18911 18912
+19189 19190 19009
+18914 19013 19198
+18913 19012 19013
+19187 19008 19007
+19189 19009 18911
+19306 19006 19493
+18621 18910 18738
+19008 19189 18911
+18909 18910 18737
+19007 18911 18910
+18914 18913 19013
+18628 18627 18741
+18629 18742 18914
+18626 18740 18741
+19011 19195 18741
+19006 18908 18735
+19006 18909 18908
+18736 18909 18737
+19006 19007 18909
+18908 18736 18735
+18443 18348 18347
+18347 18442 18443
+18735 18736 18619
+18737 18620 18736
+18737 18910 18621
+18620 18621 18444
+18620 18737 18621
+18444 18622 18445
+18621 18738 18622
+18446 18739 18623
+18622 18738 18739
+18627 18626 18741
+18624 18739 18740
+18742 18628 18913
+18446 18130 18207
+18914 18742 18913
+18629 18628 18742
+18628 18446 18627
+18625 18740 18626
+18625 18624 18740
+18623 18739 18624
+18627 18446 18626
+18446 18624 18625
+18442 18618 18619
+18735 18619 18618
+18626 18446 18625
+18444 18621 18622
+18622 18446 18445
+18348 18444 18445
+18348 18620 18444
+18207 18347 18348
+18442 18619 18443
+18620 18443 18619
+18620 18348 18443
+18207 18346 18347
+18441 18442 18346
+18345 18441 18346
+18345 18618 18441
+18346 18442 18347
+18441 18618 18442
+18618 18345 18735
+18345 18206 18130
+18345 18346 18207
+18206 18207 18130
+18206 18345 18207
+16390 16254 16253
+16254 16255 16069
+16254 16193 16253
+16191 16067 16066
+16389 16390 16253
+16069 15881 16068
+16253 16192 16252
+16253 16193 16192
+16191 16252 16192
+15815 15878 15879
+15814 16066 15878
+15878 16014 15879
+15878 16066 16014
+16192 16068 16067
+15678 15679 15474
+16067 16191 16192
+16067 16068 15880
+16192 16193 16068
+16448 16255 16254
+16447 16390 16389
+16448 16582 16449
+16447 16448 16390
+16255 16070 16069
+16256 15882 16070
+16256 16257 15883
+16254 16069 16193
+16070 15881 16069
+16390 16448 16254
+16447 16581 16448
+16650 16451 16820
+16256 16255 16450
+16582 16448 16581
+16255 16449 16450
+16255 16448 16449
+16649 16583 16582
+16584 16449 16583
+16820 16451 16649
+16450 16449 16584
+16820 16649 16581
+16584 16583 16649
+16821 16820 16927
+16821 16650 16820
+16450 16451 16256
+16450 16649 16451
+15883 16257 16071
+16451 16650 16257
+16073 16258 16259
+16651 16652 16259
+16822 16650 16821
+16651 16258 16650
+16983 16822 16821
+16983 16984 16822
+16986 16653 16985
+16653 16452 16260
+16261 16260 16452
+16652 16985 16653
+16986 16654 16653
+16655 16823 16778
+16453 16262 16261
+16262 16454 16263
+16651 16259 16258
+16652 16653 16260
+16259 16260 16075
+16259 16652 16260
+15887 16074 16075
+16259 16075 16074
+16260 16076 16075
+16077 15889 16076
+16262 16194 16077
+16263 16264 16195
+15685 15684 15886
+16075 16076 15888
+15816 15885 15684
+15885 16072 16073
+15480 15887 15888
+15886 16074 15887
+15684 15885 15886
+16071 16257 16258
+15816 15884 15885
+16071 16258 16072
+15886 16073 16074
+16072 16258 16073
+15885 15884 16072
+15883 15882 16256
+15884 15883 16071
+15884 15816 15682
+16072 15884 16071
+15816 15683 15682
+15680 15681 15477
+15883 15884 15681
+15679 15680 15476
+15882 15883 15680
+15681 15682 15477
+15282 15083 15213
+15884 15682 15681
+15683 15610 15682
+15682 15610 15478
+15683 15684 15610
+15480 15685 15887
+15479 15684 15685
+15888 15686 15481
+15888 15889 15686
+15890 15817 15889
+15284 15481 15482
+15086 15480 15481
+15085 15479 15480
+15284 15482 15285
+15686 15687 15482
+15214 15284 15285
+14901 15014 15215
+15215 15214 15285
+15087 15086 15284
+15611 15215 15285
+14726 14843 15215
+15215 15088 15214
+15087 15014 14900
+15214 15087 15284
+14899 14898 15086
+15088 15087 15214
+15088 15014 15087
+14896 14718 14717
+14896 14717 14895
+15479 15283 15478
+15479 15085 15084
+15479 15084 15283
+14897 14721 14720
+15478 15282 15477
+15283 15083 15282
+15210 15081 15080
+15211 15212 15081
+15213 15082 15212
+15213 15083 15082
+15082 14894 15081
+14644 14715 14525
+15207 15079 15010
+15397 15396 15475
+15079 15011 15010
+14715 14892 14893
+15207 15208 15079
+15207 15278 15208
+15079 15209 15080
+15208 15278 15209
+15280 15210 15279
+15211 15081 15210
+15281 15280 15476
+15211 15210 15280
+15882 15679 15881
+15476 15398 15475
+15080 15279 15210
+15209 15396 15279
+15474 15475 15396
+15679 15476 15475
+15881 15679 15678
+15278 15207 15277
+15398 15397 15475
+15279 15396 15397
+15881 15678 15880
+15474 15473 15678
+15880 15677 15879
+15609 15676 15815
+15815 15677 15609
+15815 15879 15677
+15675 15676 15608
+15814 15815 15676
+15471 15675 15608
+15471 15814 15675
+15609 15472 15608
+15473 15277 15077
+13888 13779 13954
+15472 15276 15471
+15472 15473 15276
+15396 15278 15474
+15396 15209 15278
+15474 15277 15473
+15207 15078 15277
+14888 15076 14889
+15473 15077 15276
+15078 14890 15077
+14639 14711 14712
+14888 14889 14837
+14639 14712 14640
+14837 14889 14712
+14712 14711 14837
+14127 14244 14128
+14891 14890 15078
+14838 14889 14890
+15011 14892 15010
+14714 14713 14891
+15079 15012 15011
+15013 14894 14893
+14893 14894 14716
+15013 15081 14894
+14526 14715 14716
+15012 15013 14893
+14890 14713 14838
+14319 14524 14525
+14891 14892 14714
+15011 15012 14892
+14714 14643 14713
+14714 14644 14643
+14524 14644 14525
+14714 14892 14715
+14716 14715 14893
+14644 14714 14715
+14321 14527 14322
+14716 14895 14717
+14318 14523 14524
+14642 14713 14643
+14133 14132 14320
+14525 14715 14526
+14448 14449 14317
+14522 14641 14523
+14449 14522 14523
+14640 14838 14641
+14713 14642 14641
+14643 14523 14642
+14641 14522 14640
+13779 13888 13780
+14316 14521 14448
+14639 14640 14521
+14448 14522 14449
+14521 14640 14522
+14128 14244 14245
+14521 14522 14448
+14316 14317 14245
+14449 14318 14317
+14319 14318 14524
+14449 14523 14318
+13956 13955 14129
+14245 14317 14246
+14448 14317 14316
+14316 14245 14244
+14639 14521 14316
+14246 14129 14245
+14078 14127 14128
+14316 14244 14127
+14129 13955 14128
+13955 13954 14078
+13781 13782 13592
+14128 14245 14129
+13890 13783 13956
+14129 14246 14130
+14318 14131 14130
+14079 13958 13957
+14320 14247 14133
+14132 14081 14080
+14131 14079 13957
+14131 14132 14079
+14079 14080 13958
+14079 14132 14080
+14081 14082 13959
+14134 14247 14248
+14080 14081 13958
+14133 14082 14081
+14248 14135 14134
+14083 14082 14135
+14322 14249 14321
+14136 14084 14135
+14082 14134 14135
+14133 14247 14134
+14249 14248 14321
+14249 14135 14248
+14526 14319 14525
+14132 14131 14319
+14526 14320 14319
+14526 14527 14321
+14247 14321 14248
+14320 14526 14321
+14529 14528 14645
+14250 14137 14136
+14647 14530 14529
+14450 14324 14529
+14326 14325 14452
+14138 14324 14325
+14528 14322 14527
+14323 14324 14137
+14528 14323 14322
+14528 14529 14323
+14322 14250 14249
+14137 14086 14136
+13961 13960 14084
+14083 14135 14084
+13961 14085 14086
+14084 14136 14085
+13787 13961 13962
+14085 14136 14086
+14137 14250 14323
+14136 14249 14250
+13963 14138 14139
+14137 14324 14138
+14454 14326 14453
+14139 14138 14325
+14140 14139 14326
+13963 13597 13962
+14454 14327 14326
+13964 13963 14140
+14535 14329 14328
+14455 14330 14329
+14531 14454 14453
+14532 14533 14327
+14326 14327 14140
+14454 14532 14327
+14455 14535 14536
+14531 14452 14530
+14453 14326 14452
+14653 14654 14534
+14654 14535 14534
+14452 14531 14453
+14651 14721 14532
+14533 14532 14722
+14454 14531 14532
+14724 14652 14723
+14534 14328 14533
+14842 14725 14841
+14655 14535 14654
+14843 14726 14725
+14726 14655 14725
+14656 14655 14726
+14840 14724 14723
+14841 14725 14724
+14722 14652 14533
+14724 14654 14653
+14652 14653 14534
+14652 14724 14653
+14531 14651 14532
+14720 14649 14719
+14718 14645 14717
+14646 14529 14645
+14718 14646 14645
+14647 14648 14530
+15083 14896 14895
+14645 14528 14717
+14718 14647 14646
+14648 14649 14530
+14718 14719 14647
+14897 15084 15085
+14650 14720 14651
+14839 14840 14723
+14647 14719 14648
+14718 14896 14719
+14649 14720 14650
+14719 14896 14897
+15084 14896 15083
+15084 14897 14896
+14898 14897 15085
+14720 14719 14897
+14897 14898 14721
+15085 15086 14898
+15087 14900 15086
+14840 14839 14899
+14839 14722 14898
+14723 14652 14722
+14722 14839 14723
+14898 14899 14839
+14900 14901 14842
+14901 15215 14843
+14899 14900 14841
+14899 15086 14900
+14842 14901 14843
+14900 15014 14901
+15484 15483 15613
+15285 15482 15611
+15015 15483 15286
+15612 15613 15483
+15485 15484 15613
+15485 15399 15484
+16196 16080 16079
+15612 15689 15613
+15612 15818 15689
+16081 15892 16080
+15690 15485 15613
+16080 15892 15891
+15691 15485 15690
+15893 16081 16082
+15893 15892 16081
+15895 15894 16016
+15819 15692 15894
+15892 15690 15891
+15892 15691 15690
+15893 15691 15892
+15893 15692 15691
+15216 15091 15090
+15092 15018 15017
+15692 15486 15691
+15290 15218 15217
+15094 15217 15218
+15093 15019 15092
+15094 15093 15217
+15019 15018 15092
+14904 14845 15016
+15091 15288 15092
+15091 15092 15017
+15288 15289 15092
+14845 14728 14903
+14903 15015 15089
+15016 14903 15089
+15286 15399 15216
+15091 15287 15288
+15216 15399 15287
+15484 15286 15483
+15089 15090 15016
+15286 15216 15089
+15286 15089 15015
+15216 15090 15089
+14329 14330 14251
+14903 14902 15015
+14844 14657 14902
+15017 14904 15016
+14844 14902 14903
+14658 14727 14728
+14658 14657 14727
+14329 14251 14141
+14657 14658 14537
+14251 14142 14141
+14251 14330 13967
+13789 13966 13967
+14142 14251 13967
+14537 14658 14538
+14144 14088 14143
+14456 14537 14538
+14539 14538 14658
+14457 14456 14538
+14458 14539 14659
+14458 14332 14539
+14539 14728 14659
+14727 14844 14728
+14333 14540 14541
+14458 14659 14540
+14659 14729 14540
+14659 14728 14845
+14145 14333 14146
+14540 14729 14730
+14540 14730 14541
+14846 15018 14905
+14730 14848 14731
+14905 15018 15019
+14730 14847 14848
+14730 14729 14846
+15016 14845 14903
+14729 14659 14845
+14730 14846 14847
+14729 14845 14904
+15018 14904 15017
+14846 14729 14904
+14848 14905 15020
+14847 14846 14905
+15020 15019 15093
+15020 14905 15019
+15095 15094 15219
+15218 15290 15219
+15024 14908 15023
+15693 15487 15692
+15291 15292 15221
+15293 15294 15098
+15021 15094 15095
+15020 15093 15094
+15096 15095 15220
+15022 15021 15095
+14906 15021 15022
+14906 15020 15021
+14147 14334 14335
+14848 14906 14731
+14732 14907 14908
+14731 14906 14907
+14909 14732 14908
+14335 14731 14732
+15095 15096 15023
+15025 14909 14908
+15221 15097 15096
+15025 14908 15024
+15026 14910 14909
+14911 14733 14910
+14734 14733 14911
+14543 14337 14733
+14912 14734 14911
+14735 14543 14734
+14734 14543 14733
+14338 14151 14543
+15098 15099 14911
+14914 15101 15102
+15100 14913 14912
+14913 14736 14735
+15295 15099 15294
+15299 15298 15402
+15096 15025 15024
+15097 15098 15026
+15025 15026 14909
+15098 14910 15026
+15096 15097 15025
+15222 15293 15098
+15221 15222 15097
+15489 15488 15695
+15293 15489 15294
+15296 15697 15491
+15221 15292 15222
+15489 15696 15294
+15899 15696 15695
+15491 15698 15699
+15900 15490 15696
+15101 15297 15298
+15899 15821 16018
+15695 15694 15821
+15222 15292 15293
+15221 15220 15291
+15696 15489 15695
+15293 15292 15489
+15219 15291 15220
+15694 15695 15488
+15692 15290 15486
+15692 15819 15693
+15292 15291 15488
+15219 15290 15291
+15896 16017 15897
+15694 15488 15487
+15692 15487 15290
+15693 15820 15487
+15694 15820 15898
+15694 15487 15820
+16199 16084 16083
+15897 15820 15693
+15894 15895 15819
+16016 16083 15896
+15895 15896 15819
+15895 16016 15896
+16199 16083 16268
+16084 15896 16083
+16462 16269 16394
+16085 16200 16018
+15896 16084 16017
+16199 16269 16085
+16462 16463 16395
+16271 16086 16200
+15898 15897 16017
+15898 15820 15897
+16017 16085 15898
+16017 16084 16085
+16087 15900 15696
+16087 16272 15900
+15899 16018 16086
+15821 15898 16018
+16087 15899 16086
+15695 15821 15899
+16783 16784 16667
+16272 16465 16466
+16270 16271 16200
+16464 16465 16271
+16834 16665 16833
+16465 16464 16665
+16466 16590 16666
+16466 16465 16590
+16667 16591 16467
+16590 16665 16666
+16933 16833 16932
+16395 16464 16271
+16999 16933 16998
+16934 16835 16834
+16666 16834 16783
+16833 16933 16834
+16998 16932 16997
+16831 16782 16662
+16833 16832 16932
+16833 16665 16664
+16833 16664 16832
+16665 16464 16664
+16462 16663 16589
+16664 16464 16589
+16994 16995 16930
+16996 17118 16997
+16832 16663 16782
+16462 16394 16461
+16830 16662 16781
+16460 16461 16268
+16662 16461 16588
+16267 16082 16081
+16661 16662 16588
+16661 16781 16662
+16394 16268 16461
+16394 16199 16268
+16662 16462 16461
+16589 16464 16463
+16269 16462 16395
+16462 16589 16463
+16269 16395 16270
+16463 16464 16395
+16085 16269 16200
+16199 16394 16269
+16269 16270 16200
+16395 16271 16270
+16198 16267 16081
+16460 16660 16588
+16393 16458 16267
+16990 16991 16929
+16660 16460 16459
+16588 16461 16460
+16198 16266 16393
+16659 16587 16780
+16196 16266 16197
+16392 16457 16266
+16080 16198 16081
+16197 16266 16198
+16080 16196 16197
+15891 15818 16079
+16265 16196 16079
+15688 15817 16078
+15890 16078 15817
+15687 15688 15611
+15687 15817 15688
+15818 16265 16079
+16265 16586 16456
+16265 16657 16586
+16015 15890 15889
+16015 16078 15890
+16265 16456 16392
+16586 16457 16456
+16825 16826 16779
+16780 16587 16658
+16457 16586 16658
+16587 16457 16658
+16658 16826 16780
+16827 16659 16780
+16828 16459 16659
+16459 16458 16659
+16393 16457 16587
+16587 16458 16393
+16587 16659 16458
+16828 16660 16459
+16781 16661 16660
+16993 16828 16992
+16829 16660 16828
+16994 16830 16829
+16830 16781 16829
+16827 16992 16828
+17115 17162 17163
+16991 17115 16992
+17322 17321 17436
+17492 17162 16989
+17162 17266 17163
+16780 16929 16827
+17114 17115 16991
+16826 16929 16780
+16991 16992 16827
+16928 16929 16826
+16989 16990 16929
+16262 16263 16194
+16262 16453 16454
+16391 16455 16824
+16655 16454 16654
+16455 16391 16454
+16263 16391 16264
+16455 16585 16824
+17114 16990 16989
+17114 16991 16990
+16585 16656 16824
+16823 16987 16988
+16585 16655 16656
+16654 16987 16823
+16454 16585 16455
+16454 16655 16585
+16824 16823 16988
+16655 16654 16823
+16824 16778 16823
+16656 16655 16778
+16656 16778 16824
+17114 17162 17115
+17322 17493 17494
+16989 17162 17114
+17492 17266 17162
+17164 17163 17267
+16992 17115 17163
+17164 17267 17322
+17436 17492 17493
+17266 17436 17321
+17266 17492 17436
+17266 17321 17267
+17436 17493 17322
+17323 17322 17494
+17165 17164 17322
+16993 17116 17164
+17116 17163 17164
+17322 17323 17165
+17495 17496 17323
+17166 17118 17117
+17167 17168 17119
+17165 16993 17164
+16993 16992 17116
+17165 17166 17117
+17166 17324 17167
+17117 16994 17165
+16829 16828 16993
+17165 16994 16993
+16930 16831 16830
+17117 16995 16994
+17117 17118 16996
+16832 16931 16932
+16831 16930 16931
+16994 16930 16830
+16995 17117 16996
+16930 16996 16931
+16930 16995 16996
+16997 17119 16998
+17118 17167 17119
+16931 16997 16932
+16931 16996 16997
+16999 16998 17120
+16933 16932 16998
+16933 16999 16934
+17120 17169 16999
+17119 17168 17120
+17269 17270 17169
+17168 17169 17120
+17168 17268 17269
+17168 17269 17169
+17268 17325 17326
+17168 17167 17268
+17118 17166 17167
+17268 17326 17269
+17325 17437 17438
+17325 17324 17437
+17325 17268 17324
+17497 17438 17437
+17497 17498 17439
+17497 17439 17438
+17498 17499 17439
+17500 17440 17499
+17500 17441 17440
+17172 17171 17328
+17001 17002 16937
+17442 17441 17501
+17328 17327 17441
+17442 17501 17502
+17441 17500 17501
+17443 17442 17502
+17329 17328 17442
+17504 17330 17503
+17329 17442 17443
+17502 17503 17443
+17671 17672 17503
+17331 17504 17332
+17503 17672 17504
+17272 17331 17332
+17006 17005 17122
+17503 17330 17443
+17172 17328 17329
+17173 17003 17172
+17172 17329 17330
+17331 17173 17330
+16939 16938 17003
+17272 17173 17331
+17121 17005 17004
+17003 17004 16939
+17173 17121 17004
+16842 16940 16843
+17004 17005 16940
+17003 17002 17172
+16938 16839 17002
+16938 16840 16839
+16790 16670 16669
+16936 17001 16937
+17002 16839 16937
+17328 17171 17271
+17172 17002 17001
+17000 17001 16936
+17171 17172 17001
+17270 17170 17169
+17171 17001 17170
+17169 17000 16999
+17170 17001 17000
+16935 16936 16836
+16935 17000 16936
+16936 16837 16836
+16937 16838 16837
+16840 16788 16839
+16788 16668 16787
+16839 16788 16787
+16789 16669 16788
+16666 16667 16466
+16835 16784 16783
+16785 16786 16667
+16783 16667 16666
+16784 16785 16667
+16273 16467 16468
+16591 16786 16592
+16592 16468 16591
+15901 16088 15902
+16591 16468 16467
+16471 16595 16472
+16467 16273 16272
+16469 16593 16594
+16592 16593 16468
+16469 16594 16470
+16668 16669 16596
+16397 16275 16396
+16469 16468 16593
+16396 16469 16470
+16273 16468 16469
+16273 16274 16088
+16273 16469 16274
+16088 16275 16089
+16471 16470 16595
+16274 16396 16275
+16274 16469 16396
+16276 16275 16397
+16791 16671 16670
+16593 16668 16594
+16397 16471 16472
+16396 16470 16471
+16840 16789 16788
+16840 16841 16790
+16840 16790 16789
+16841 16842 16790
+16843 16941 16844
+16597 16596 16671
+16791 16843 16672
+16598 16473 16597
+16671 16791 16672
+16477 16478 16281
+16475 16400 16474
+16280 16279 16400
+16672 16598 16597
+16476 16477 16401
+16673 16475 16598
+16400 16473 16474
+16398 16399 16278
+16398 16472 16399
+16397 16398 16276
+16397 16472 16398
+16276 16277 16201
+16276 16398 16277
+16091 16202 16203
+16201 16277 16202
+16203 16278 16279
+16277 16398 16278
+16277 16203 16202
+16279 16280 16203
+16674 16478 16477
+16281 16204 16401
+16092 16091 16204
+16019 16090 16091
+16093 16092 16281
+15907 15906 16020
+15909 15825 15711
+15710 15623 15622
+16282 16478 16675
+16281 16401 16477
+16283 16282 16676
+16093 16478 16282
+16400 16475 16401
+16476 16599 16477
+16598 16475 16474
+16846 16845 17008
+16475 16476 16401
+16475 16673 16599
+16475 16599 16476
+16673 16845 16674
+16599 16674 16477
+16599 16673 16674
+16847 16675 17009
+16478 16674 16846
+16943 16848 17010
+16848 16676 16847
+16942 17008 16845
+17178 17008 17123
+16675 16846 17009
+16675 16478 16846
+16942 17123 17008
+17177 17273 17274
+17007 17123 16942
+16845 16673 16844
+16844 16942 16845
+16844 16941 17007
+16673 16672 16844
+16843 17005 16941
+16842 16843 16791
+16940 17005 16843
+16671 16672 16597
+16843 16844 16672
+17174 17121 17173
+17175 17122 17121
+17123 17007 17122
+16941 17005 17006
+16844 17007 16942
+17006 17122 17007
+17122 17177 17123
+17176 17273 17177
+17273 17272 17332
+17175 17174 17272
+17272 17174 17173
+17175 17121 17174
+17175 17273 17176
+17332 17333 17273
+17334 17505 17675
+17333 17332 17505
+17334 17274 17333
+17123 17177 17274
+17335 17179 17334
+17179 17009 16846
+17676 17335 17334
+17179 17008 17178
+17334 17179 17178
+17335 17009 17179
+17337 17182 17336
+17010 17180 17181
+17677 17335 17676
+17180 17009 17335
+17678 17336 17677
+17181 17180 17336
+17336 17182 17181
+16679 17013 16680
+17679 17337 17678
+17338 17339 17013
+16851 16850 16945
+17338 17679 17680
+17182 17011 17010
+16677 16792 16678
+16945 17011 17012
+16943 17010 17011
+16792 16677 16849
+16943 17011 16944
+16676 16848 16849
+16847 17010 16848
+16943 16849 16848
+16944 17011 16945
+16479 16677 16678
+16851 16945 17012
+16852 16851 17012
+16849 16944 16945
+16849 16850 16792
+16849 16945 16850
+16792 16851 16678
+17012 17013 16852
+16678 16851 16852
+16792 16850 16851
+16852 16679 16678
+16852 17013 16679
+17015 16681 17014
+16402 16403 16290
+16483 16404 16403
+16681 17015 16682
+16683 16854 16684
+17017 16855 16854
+16854 16853 17017
+16682 17015 17016
+16680 17013 17014
+17012 17337 17338
+17339 17015 17014
+17016 16853 16682
+17012 17338 17013
+17337 17679 17338
+17339 17340 17015
+17339 17680 17340
+17340 17016 17015
+17341 17342 17016
+17682 17342 17341
+17683 17684 17342
+17344 17183 17343
+17017 17342 17343
+17017 17018 16855
+17343 17506 17344
+17018 17183 17019
+17018 17343 17183
+17507 17344 17506
+17345 17183 17344
+17685 17604 17506
+17685 17686 17604
+17344 17507 17345
+17605 17606 17507
+17687 17607 17606
+17608 17508 17607
+17609 17509 17608
+17444 17348 17347
+17185 17184 17346
+17184 17508 17346
+17020 17184 17185
+17019 17345 17184
+17124 17185 17275
+17124 17020 17185
+17021 16946 17020
+16689 16690 16600
+16947 16858 17022
+16794 16857 16946
+17022 17021 17124
+17022 16858 17021
+16692 16691 16794
+17020 16857 16856
+16601 16690 16691
+16689 16688 16793
+16946 16857 17020
+16794 16690 16857
+16687 16856 16688
+16857 16690 16793
+17020 16856 17184
+16688 16491 16687
+17184 16856 17019
+16857 16793 16856
+17018 16686 16855
+16488 16294 16293
+16855 16686 16685
+17018 17019 16687
+17018 16687 16686
+17019 16856 16687
+16488 16489 16295
+16686 16687 16489
+16686 16488 16487
+16295 16103 16294
+16296 16490 16405
+16406 16491 16407
+16491 16405 16490
+16210 16296 16104
+16405 16491 16406
+16490 16687 16491
+16601 16493 16690
+16492 16491 16600
+16688 16689 16600
+16793 16690 16689
+16300 16299 16493
+16493 16600 16690
+16494 16493 16601
+16492 16600 16493
+16406 16407 16298
+16492 16493 16407
+16107 16213 16299
+16407 16493 16299
+16298 16297 16405
+16023 16022 16104
+16298 16212 16297
+16298 16407 16213
+16108 16107 16299
+16107 16106 16213
+15922 16107 16108
+16024 16106 16107
+16105 16211 16106
+16297 16212 16211
+15828 15827 15919
+16211 16212 16106
+16103 16104 16021
+16210 16295 16296
+16211 16296 16297
+16295 16489 16296
+15920 15919 16022
+16104 16211 16105
+16295 16294 16488
+16102 16103 15917
+16487 16293 16292
+16294 16103 16102
+16103 16210 16104
+16103 16295 16210
+16685 16487 16486
+16293 16102 16292
+16099 15914 16098
+16288 16208 16207
+16098 16289 16290
+16207 16208 16097
+16289 16402 16290
+16289 16482 16402
+16482 16483 16402
+16404 16291 16290
+16483 16484 16404
+16484 16683 16485
+16486 16487 16292
+16685 16686 16487
+16404 16484 16291
+16683 16684 16485
+16684 16486 16485
+16684 16685 16486
+16683 16484 16682
+16485 16291 16484
+16681 16482 16481
+16681 16483 16482
+16484 16483 16682
+16403 16402 16483
+16288 16287 16481
+16286 16480 16287
+16681 16481 16680
+16482 16289 16481
+16289 16288 16481
+16207 16097 16096
+16283 16676 16479
+16675 16847 16676
+16284 16283 16479
+16094 15910 15909
+16676 16677 16479
+16676 16849 16677
+16285 16284 16679
+16094 16283 16284
+16205 16095 16286
+15911 16284 16285
+16209 16208 16288
+16209 16097 16208
+16206 16207 16096
+16287 16288 16207
+16207 16206 16287
+16095 15913 15912
+16205 16206 16096
+16205 16287 16206
+15625 15714 15626
+15826 15911 15714
+16095 15912 16285
+15716 15715 15912
+15508 15414 15507
+15506 15505 15627
+15627 15505 15626
+15629 15507 15628
+15626 15714 15627
+15626 15504 15625
+15407 15307 15406
+15626 15505 15504
+15627 15628 15506
+15507 15506 15628
+15412 15311 15411
+15716 15508 15629
+15312 15311 15412
+15508 15507 15629
+15413 15506 15507
+15507 15414 15413
+15508 15314 15414
+16097 15913 16096
+16097 15914 15913
+15717 15508 15716
+15912 15717 15716
+15913 15509 15717
+15121 15316 15510
+15315 15509 15316
+15509 15510 15316
+15915 16101 15916
+15914 15915 15510
+15718 15918 15827
+15915 15916 15511
+16101 16292 16102
+16209 16098 16097
+16099 15915 15914
+15510 15915 15511
+16100 16101 15915
+16096 16095 16205
+16096 15913 16095
+16289 16098 16209
+16099 16100 15915
+16290 16099 16098
+16290 16291 16099
+16101 16102 15916
+16293 16294 16102
+15630 15514 15718
+15916 16102 15917
+16021 15919 15918
+15828 15720 15827
+15828 15919 15920
+16023 16104 16105
+16021 16022 15919
+16021 16104 16022
+16106 16024 16023
+15921 15829 15828
+16024 15921 16023
+15920 16022 16023
+16023 15921 15920
+15922 15829 15921
+15922 16024 16107
+15922 15921 16024
+16108 15923 15922
+15518 15417 15517
+15921 15828 15920
+15720 15719 15827
+15722 15829 15922
+15722 15721 15829
+15318 15515 15319
+15630 15719 15720
+15415 15516 15517
+15515 15630 15516
+15722 15517 15516
+15722 15723 15517
+15517 15417 15416
+15322 15323 15127
+15125 15318 15319
+15125 15124 15317
+15320 15415 15416
+15319 15516 15415
+15515 15318 15514
+15318 15125 15317
+15515 15514 15630
+15513 15124 15512
+15721 15720 15828
+15721 15516 15720
+15630 15718 15719
+15514 15513 15718
+15123 15122 15512
+15511 15916 15512
+15917 15513 15512
+15514 15317 15513
+15030 15117 15031
+15236 15315 15120
+14748 14850 14749
+15031 15120 14927
+14927 15120 14928
+15119 15236 15120
+14929 15121 14930
+14928 15120 15121
+14752 14929 14930
+14852 14928 14929
+14930 15122 14753
+14930 15121 15122
+14755 15123 15124
+14754 15122 15123
+15127 14758 15126
+14758 14362 14757
+15125 14756 15124
+15125 14757 14756
+15124 14756 14755
+14757 14361 14756
+14752 14751 14852
+14753 14752 14930
+14556 14555 14663
+15122 14754 14753
+14755 14359 14754
+14752 14557 14556
+14753 14754 14358
+14663 14555 14662
+14466 14356 14355
+14752 14663 14751
+14752 14556 14663
+14663 14662 14751
+14751 14750 14851
+14751 14662 14750
+14553 14552 14661
+14747 14850 14748
+14661 14747 14748
+14925 14924 15116
+14552 14464 14551
+15029 15030 14926
+15029 15117 15030
+14551 14746 14747
+14924 14745 15114
+14926 14925 15029
+14746 14924 14925
+14925 15116 15029
+15232 15312 15313
+15031 15117 15118
+15029 15116 15117
+15031 15118 15119
+15117 15234 15118
+15233 15313 15234
+15509 15314 15508
+15509 15315 15314
+15235 15236 15119
+15235 15314 15236
+15233 15232 15313
+15312 15414 15313
+15115 15232 15116
+15115 15312 15232
+15117 15233 15234
+15116 15232 15233
+15410 15411 15311
+15412 15506 15413
+15231 15410 15311
+15505 15506 15411
+15506 15412 15411
+15413 15312 15412
+15409 15410 15310
+15409 15505 15410
+15408 15409 15309
+15504 15505 15409
+15230 15310 15113
+15309 15409 15310
+15310 15230 15309
+15113 15112 15230
+15310 15231 15113
+15310 15410 15231
+15116 14924 15115
+15113 15231 15114
+15115 14924 15114
+14746 14349 14745
+15114 14923 15113
+14349 14162 14348
+15114 14745 14923
+14924 14746 14745
+14745 14744 14923
+14549 14346 14463
+15112 14922 15111
+14550 14348 14347
+14922 15110 15111
+14547 14548 14461
+14548 14743 14549
+14922 14744 14550
+14922 14921 15110
+14922 14743 14921
+14743 14920 14921
+15107 15106 15302
+14919 14741 14918
+14342 14343 14156
+14743 14548 14920
+14547 14459 14546
+15108 15109 15028
+14917 14916 15027
+15107 14919 14918
+14919 15108 14920
+14921 15028 15110
+15108 14919 15107
+15028 15109 15110
+15028 14920 15108
+15106 15107 14918
+15224 15225 15108
+15224 15108 15107
+15225 15226 15108
+15107 15302 15303
+15223 15104 15300
+15303 15224 15107
+15303 15304 15224
+15306 15227 15305
+15109 15108 15226
+15228 15227 15306
+15305 15406 15306
+15307 15228 15306
+15110 15109 15227
+15229 15228 15307
+15111 15110 15228
+15230 15112 15308
+15112 15111 15229
+15409 15408 15504
+15308 15229 15307
+15309 15308 15408
+15309 15230 15308
+15503 15407 15406
+15408 15308 15407
+15501 15502 15305
+15622 15503 15502
+15502 15503 15406
+15623 15711 15624
+15620 15709 15501
+15708 16093 15908
+15620 15619 15708
+15908 16282 16283
+15712 15624 15711
+15712 15713 15624
+15714 15713 15826
+15625 15504 15713
+15621 15709 15710
+15908 16283 15909
+15908 15909 15710
+16283 16094 15909
+15709 15908 15710
+16093 16282 15908
+15622 15621 15710
+15501 15304 15500
+15502 15621 15622
+15502 15501 15621
+15500 15620 15501
+15708 15907 16093
+15500 15619 15620
+15707 15824 15907
+15709 15708 15908
+15619 15707 15708
+15618 15707 15619
+15706 15824 15707
+15499 15617 15618
+15616 15615 15705
+15499 15618 15619
+15617 15616 15705
+15404 15497 15405
+15705 15615 15704
+15498 15499 15405
+15498 15617 15499
+15499 15500 15405
+15499 15619 15500
+15403 15404 15303
+15405 15303 15404
+15405 15497 15498
+15496 15495 15615
+15496 15403 15302
+15497 15404 15403
+15497 15616 15617
+15497 15496 15616
+15616 15496 15615
+15302 15106 15301
+15905 15823 15904
+15702 15493 15701
+15615 15703 15704
+15495 15494 15703
+15618 15705 15706
+15618 15617 15705
+15618 15706 15707
+15705 15704 15823
+16091 16020 16019
+15905 15904 16019
+15907 16020 16092
+15906 16019 16020
+15904 16090 16019
+16201 16202 16090
+15824 15905 15906
+15823 15704 15703
+15824 15823 15905
+15824 15706 15823
+16088 15903 15902
+15903 15701 15822
+16089 15903 16088
+15904 15702 15903
+16090 16089 16201
+16090 15904 16089
+15698 15901 15902
+16274 16275 16088
+15900 15697 15490
+15900 16273 15901
+15697 15901 15698
+15697 15900 15901
+15902 15699 15698
+15700 15614 15699
+15492 15614 15402
+15700 15701 15614
+15822 15701 15700
+15903 15702 15701
+15614 15493 15402
+15614 15701 15493
+15490 15697 15296
+15697 15698 15491
+15401 15492 15402
+15400 15491 15492
+15295 15296 15099
+15295 15490 15296
+15099 15100 14912
+15297 15400 15298
+14736 14338 14735
+15100 15296 15297
+14737 14914 15103
+15101 15298 15102
+15100 15297 15101
+15296 15491 15297
+15298 15401 15402
+15298 15400 15401
+15298 15299 15102
+15402 15493 15299
+15103 15300 15104
+15299 15493 15300
+15403 15496 15497
+15302 15301 15496
+15495 15301 15300
+15495 15496 15301
+14915 15103 15104
+15102 15299 15103
+15301 15223 15300
+15301 15106 15223
+14917 15027 15106
+14916 14915 15027
+15106 15105 15223
+15027 15104 15105
+14741 14740 14918
+14849 14738 14915
+14918 14740 14917
+14546 14459 14343
+14917 14740 14849
+14545 14741 14546
+14739 14660 14738
+14739 14740 14660
+14544 14737 14738
+14340 14152 14339
+14849 14915 14916
+14737 15103 14915
+14917 14849 14916
+14739 14738 14849
+14912 14913 14735
+15100 15101 14913
+15101 14736 14913
+14737 14340 14339
+15103 14914 15102
+14737 14736 14914
+14737 14544 14340
+14544 14545 14341
+14544 14341 14340
+14544 14660 14545
+14341 14545 14342
+14459 14344 14260
+14740 14545 14660
+14740 14741 14545
+14341 14342 14259
+14545 14343 14342
+14545 14546 14343
+14741 14742 14547
+14548 14547 14742
+14460 14344 14459
+14462 14548 14463
+14742 14920 14548
+14345 14262 14461
+14345 14461 14462
+14260 14344 14261
+14459 14547 14460
+14461 14460 14547
+14461 14344 14460
+14343 14260 14156
+14343 14459 14260
+13982 13619 13807
+14261 14344 14262
+14346 14159 14263
+14263 14158 14345
+14463 14263 14345
+13983 13620 13619
+13981 14155 14156
+14260 14261 14157
+14262 14158 14157
+14159 14160 13983
+14156 14155 14342
+14154 14258 14259
+14155 14154 14259
+14257 14340 14341
+14157 14156 14260
+13982 14158 13983
+14154 13979 14153
+14153 13979 14152
+13803 14152 13979
+13977 14338 14339
+14258 14154 14257
+13979 13900 13804
+14257 14154 14153
+13804 13617 13803
+13980 14154 14155
+13980 13979 14154
+13981 13980 14155
+13901 13900 13980
+13981 13902 13980
+13805 13617 13804
+13263 13262 13617
+13978 14152 13803
+13980 13900 13979
+13900 13805 13804
+13263 12863 13069
+12680 12862 13069
+13069 12863 12680
+13265 13264 13618
+13068 13262 13069
+12474 12865 12475
+13805 13618 13617
+13617 13264 13263
+13979 13804 13803
+13900 13901 13805
+13981 13806 13902
+13806 13618 13805
+13263 13264 12864
+13265 13266 12866
+12298 12473 12154
+12863 13263 12864
+12865 12864 13264
+12473 12863 12864
+12156 12474 12475
+12473 12864 12474
+12866 12865 13265
+12474 12864 12865
+13264 13265 12865
+13619 13266 13265
+14157 13982 14156
+13618 13264 13617
+13902 13806 13805
+13807 13619 13618
+13807 13618 13806
+13619 13265 13618
+13982 13981 14156
+13807 13806 13981
+13981 13982 13807
+14157 14158 13982
+14263 14159 14158
+14160 13984 13983
+13267 13621 13622
+13620 13984 13621
+13987 13809 13986
+13268 13267 13622
+13622 13623 13454
+13808 13986 13809
+12867 13267 13268
+13266 13621 13267
+13622 13454 13268
+13456 13625 13626
+12868 12477 12867
+12476 12475 12866
+12865 12866 12475
+13266 12867 12866
+12477 12476 12867
+12157 12475 12476
+13268 12868 12867
+12478 12302 12301
+13454 13269 13268
+12478 12477 12868
+12868 12869 12478
+12868 13268 12869
+13071 13070 13177
+13269 13454 13624
+12479 12681 12682
+12478 12869 12681
+12681 12870 12682
+12681 12869 12870
+12870 12983 12871
+12870 13070 12983
+13455 13270 13269
+13389 13272 13271
+12983 13071 13072
+12983 13070 13071
+13456 13272 13389
+13072 13071 13177
+13070 13269 13270
+12869 13268 13269
+13389 13271 13270
+13272 13177 13271
+13623 13624 13454
+13623 13808 13624
+13270 13455 13389
+13624 13625 13455
+13544 13456 13626
+13544 13457 13456
+13809 13810 13626
+14169 13992 14168
+14091 14090 14164
+14090 13988 13987
+14164 14165 14091
+13990 13904 13989
+14350 14163 13986
+14351 14264 14163
+14163 14090 13987
+13988 13904 13903
+13987 13988 13903
+14090 13989 13988
+13809 13987 13903
+13986 14163 13987
+13622 13808 13623
+13985 13984 14162
+13810 13809 13903
+13625 13624 13809
+14160 14161 13984
+14348 14744 14745
+14350 13985 14349
+13985 13622 13621
+14349 13985 14162
+13808 13622 13985
+14160 14348 14161
+14160 14346 14347
+14158 14159 13983
+14263 14463 14346
+14548 14549 14463
+14160 14159 14346
+14922 14550 14743
+14347 14346 14549
+14550 14347 14549
+14348 14160 14347
+14743 14550 14549
+14744 14348 14550
+14661 14551 14747
+14464 14351 14551
+14746 14350 14349
+14351 14163 14350
+14167 14092 14091
+14164 14163 14264
+14091 14165 14166
+14164 14264 14165
+14661 14552 14551
+14265 14353 14354
+14352 14464 14353
+14555 14554 14662
+14465 14466 14355
+14555 14465 14554
+14264 14166 14165
+14092 13992 13991
+14355 14265 14354
+14166 14264 14265
+14090 14091 13989
+14166 14167 14091
+14091 13990 13989
+14091 13991 13990
+13273 13073 13272
+12684 12798 12685
+13903 13904 13810
+13990 13991 13904
+13627 13628 13544
+13457 13273 13456
+13810 13734 13626
+13810 13904 13811
+13810 13811 13734
+13905 13991 13992
+13626 13627 13544
+13734 13811 13812
+13734 13627 13626
+13734 13628 13627
+13458 13274 13457
+13074 13073 13273
+13074 12876 12875
+13545 13457 13544
+13274 13459 13275
+13628 13735 13629
+13628 13734 13735
+14265 14167 14166
+14167 14168 14092
+13734 13812 13735
+13811 13904 13812
+14355 14266 14265
+14266 14168 14167
+14266 14355 14356
+14354 14465 14355
+14556 14466 14555
+14556 14356 14466
+14168 14266 14356
+14167 14265 14266
+14557 14357 14356
+13994 14357 14358
+13813 13905 13992
+13812 13904 13905
+13629 13735 13813
+13735 13812 13813
+13629 13814 13630
+13813 13992 13814
+13992 14169 13993
+14557 14753 14357
+14356 14357 14169
+14754 14359 14358
+13994 13993 14357
+14357 14753 14358
+14755 14360 14359
+14361 13997 14360
+14362 13998 14361
+13460 13281 13280
+14359 13996 13995
+13997 13634 13996
+13995 13994 14358
+13630 13814 13993
+13632 13994 13995
+13632 13631 13994
+13993 13631 13630
+13632 13278 13277
+13076 13279 13280
+12881 12880 13278
+13633 13634 13279
+13997 13998 13635
+13277 13278 12880
+13633 13279 13278
+13275 13276 12878
+13631 13632 13277
+13276 13277 12879
+13276 13631 13277
+13274 13458 13459
+13630 13276 13275
+13275 13459 13630
+13545 13628 13629
+13629 13459 13458
+13629 13630 13459
+13545 13458 13457
+13545 13629 13458
+13457 13274 13273
+13075 12876 13074
+13074 13274 13075
+13074 13273 13274
+12686 12877 12687
+13276 12879 12878
+12799 12877 12686
+12308 12485 12309
+12878 12688 12687
+12878 12879 12689
+12485 12689 12486
+12688 12878 12689
+12487 12690 12600
+12689 12879 12690
+12692 12880 12693
+12879 13277 12880
+12488 12400 12399
+12880 12881 12693
+12491 12603 12604
+12693 12881 12694
+12694 12603 12693
+12492 12605 12493
+12690 12691 12600
+12690 12879 12691
+12880 12692 12691
+12693 12490 12692
+12490 12489 12692
+12489 12400 12488
+12400 12489 12401
+12602 12692 12489
+12694 12604 12603
+12694 12605 12604
+12403 12492 12404
+12604 12605 12492
+12398 12399 12311
+12488 12601 12602
+12490 12403 12402
+12491 12492 12403
+12310 12309 12486
+12487 12600 12488
+12602 12601 12691
+12602 12489 12488
+12398 12488 12399
+12398 12487 12488
+12310 12487 12398
+12486 12690 12487
+12689 12485 12688
+12599 12482 12598
+12484 12485 12397
+12484 12688 12485
+12396 12395 12484
+12306 12166 12165
+12685 12598 12597
+12164 12304 12481
+12481 12482 12305
+12481 12597 12482
+12304 12480 12481
+12795 12794 12872
+12599 12598 12685
+12482 12597 12598
+12483 12599 12686
+12483 12482 12599
+13275 12877 13075
+12686 12685 12799
+12877 12876 13075
+12799 12798 12876
+12687 12877 12878
+12799 12876 12877
+12796 12874 12797
+12985 13074 12875
+12795 12872 12873
+12875 12798 12797
+12595 12684 12596
+12797 12798 12684
+12796 12873 12874
+12983 13072 12984
+12874 12985 12875
+12984 13072 13073
+12797 12874 12875
+12873 12985 12874
+12873 12984 12985
+12873 12872 12984
+12870 12871 12682
+12983 12984 12871
+12871 12872 12794
+12871 12984 12872
+12683 12794 12795
+12682 12871 12794
+12684 12595 12683
+12796 12684 12683
+12684 12796 12797
+12795 12873 12796
+12480 12683 12595
+12682 12794 12683
+12162 12479 12304
+12303 12681 12479
+12682 12480 12479
+12595 12481 12480
+12103 12163 12164
+12102 12101 12162
+12481 12305 12164
+12482 12483 12306
+12305 12018 12164
+12165 12166 12104
+12018 12017 12164
+11774 11659 11658
+12164 12017 12103
+12018 11896 11895
+12163 12016 12102
+11777 11896 11897
+11773 11894 11658
+12016 12017 11895
+12016 11895 11774
+12017 12018 11895
+11776 11777 11663
+11267 11400 11133
+11661 11775 11730
+11895 11896 11775
+11661 11730 11662
+11775 11896 11776
+12305 12165 12018
+12020 11897 12019
+11730 11663 11662
+11778 11779 11664
+11777 11776 11896
+11663 11730 11776
+11778 11777 11897
+11778 11664 11777
+12019 12104 12020
+12019 12018 12165
+12167 12106 12166
+12166 12106 12105
+12105 12106 12020
+12167 12107 12021
+12019 12165 12104
+12305 12482 12306
+12307 12306 12395
+12165 12305 12306
+12307 12395 12396
+12306 12483 12395
+12306 12307 12166
+12396 12397 12307
+12308 12397 12485
+12308 12307 12397
+12486 12309 12485
+12246 12167 12308
+12168 12107 12167
+12023 11899 12022
+12246 12168 12167
+12246 12308 12309
+12023 12108 12170
+12168 12246 12169
+12487 12310 12486
+12170 12311 12024
+12170 12247 12310
+12169 12246 12247
+12309 12310 12247
+12398 12311 12310
+12311 12312 12171
+12401 12402 12312
+12171 12312 12313
+12312 12402 12313
+12026 12172 12027
+11900 11780 11666
+12311 12170 12310
+12024 12023 12170
+12025 12171 12313
+12024 12311 12171
+12108 12023 12022
+12024 11900 11899
+12026 12025 12172
+11901 11780 12025
+11970 12026 12027
+11901 12025 12026
+11970 11846 11901
+11781 11782 11667
+12171 11900 12024
+12025 11780 11900
+11848 11783 11782
+11269 11270 11218
+11898 12022 11779
+12023 12024 11899
+11898 12021 12022
+12107 12169 12022
+12169 12108 12022
+12169 12247 12108
+11899 11779 12022
+12020 12106 12021
+11897 11898 11778
+11897 12020 11898
+11898 11779 11778
+11899 11665 11779
+11777 11664 11537
+11664 11401 11400
+11132 11267 11133
+11664 11665 11401
+11135 11401 11402
+11134 11400 11401
+11538 11403 11268
+11135 11136 11085
+11781 11667 11780
+11402 11665 11666
+11780 11667 11666
+11539 11540 11404
+11667 11403 11538
+11539 11404 11270
+11666 11667 11538
+11782 11846 11847
+11219 11139 11270
+11138 11137 11218
+11088 11137 11138
+11136 11268 11137
+11270 11269 11403
+11218 11137 11269
+11087 11136 11137
+11086 11015 11085
+11139 11088 11138
+11086 11136 11087
+10875 10874 10963
+10875 10811 10810
+11135 11134 11401
+11087 10963 11086
+11014 11013 11135
+11086 11085 11136
+11015 11014 11085
+10811 10875 10963
+10874 11014 10963
+10963 11014 11015
+11013 11134 11135
+11268 11135 11402
+11085 11014 11135
+11132 11133 11084
+11400 11134 11133
+10726 10725 10873
+11133 11134 11012
+10874 11013 11014
+10874 10726 10873
+10722 10870 10871
+11010 11084 11011
+10868 11007 10869
+11084 11133 11011
+10962 10870 11009
+11009 11083 11010
+11009 11008 11082
+11007 11006 11130
+11009 11082 11083
+11008 11007 11131
+11083 11084 11010
+11083 11132 11084
+11082 11132 11083
+11264 11348 11217
+11082 11131 11132
+11399 11536 11537
+11267 11537 11400
+11663 11777 11537
+11535 11536 11399
+11611 11663 11536
+11132 11131 11267
+11082 11008 11131
+11131 11399 11267
+11265 11130 11217
+11660 11535 11534
+11611 11536 11535
+11774 11775 11660
+11662 11611 11661
+11661 11611 11535
+11662 11663 11611
+11774 11660 11659
+11661 11535 11660
+11395 11483 11396
+11534 11535 11398
+11266 11265 11397
+11265 11348 11397
+11263 11394 11264
+11483 11397 11396
+11398 11266 11397
+11266 11130 11265
+11534 11398 11397
+11399 11131 11266
+11399 11266 11398
+11131 11007 11266
+11129 11006 11005
+11130 11266 11007
+10869 11007 11008
+10868 11006 11007
+11263 11264 11216
+11217 11130 11129
+11347 11394 11263
+11348 11265 11217
+11128 11216 11129
+11215 11263 11216
+11129 11005 11128
+10866 10715 10714
+11215 11128 11127
+11215 11216 11128
+11214 11127 11080
+11128 11004 11081
+11081 11004 11003
+11260 11127 11214
+11081 11003 11080
+11255 11344 11213
+11256 11390 11257
+11345 11346 11259
+11261 11127 11260
+11262 11127 11261
+11128 11081 11127
+11391 11392 11345
+11261 11347 11262
+11213 11344 11256
+11389 11390 11344
+11529 11656 11390
+12014 11893 12013
+11257 11391 11345
+11390 11389 11529
+11390 11530 11391
+12014 12013 12160
+11345 11392 11346
+11395 11394 11532
+11530 11657 11392
+11657 11656 11892
+11261 11346 11347
+11346 11392 11393
+11262 11347 11263
+11393 11531 11394
+11394 11395 11264
+11396 11397 11348
+11532 11394 11531
+11347 11393 11394
+11348 11395 11396
+11348 11264 11395
+11659 11533 11658
+11659 11534 11533
+11531 11773 11658
+11531 11392 11657
+11533 11532 11658
+11533 11395 11532
+11657 11893 11773
+12012 12098 12099
+11893 12014 11773
+12015 12102 12016
+12014 12015 11894
+12101 12102 12015
+12100 12101 12015
+12100 12161 12162
+12160 12161 12014
+12303 12162 12161
+12100 12162 12101
+12303 12479 12162
+12160 12302 12161
+12478 12303 12302
+11893 12012 12013
+12301 12477 12478
+12015 12014 12100
+11894 11773 12014
+12099 12098 12159
+12300 12299 12477
+12160 12159 12301
+12097 12011 12158
+12160 12301 12302
+12159 12158 12300
+12476 12299 12157
+12476 12477 12299
+12098 12097 12159
+12011 12010 12158
+12301 12300 12477
+12158 12299 12300
+12159 12097 12158
+12098 12012 12097
+11892 12012 11893
+12011 12097 12012
+12013 12099 12160
+12013 12012 12099
+11531 11657 11773
+11530 11656 11657
+11390 11656 11530
+11891 12010 11892
+11657 11892 11893
+11656 11891 11892
+11255 11343 11344
+11342 11389 11343
+11254 11253 11388
+11123 11386 11387
+11385 11651 11652
+11890 11891 11655
+11653 11387 11386
+11253 11210 11124
+11388 11529 11389
+11655 11891 11656
+11388 11655 11529
+11388 11387 11654
+11654 11890 11655
+12156 12475 12157
+12155 12156 11890
+12155 12474 12156
+11890 11889 12155
+11889 11654 11653
+11385 11384 11651
+11889 11890 11654
+11388 11654 11655
+11387 11653 11654
+12471 12470 12678
+12297 12298 12153
+12296 12297 12153
+12472 12473 12298
+12153 12298 12154
+12297 12472 12298
+12009 12152 12153
+12471 12679 12680
+12154 11889 11888
+12150 12008 12293
+12295 12152 12151
+12296 12153 12152
+11650 11651 11528
+11888 12153 12154
+11650 11886 11651
+12009 12153 11887
+11653 11888 11889
+11652 11651 11887
+11653 11652 11888
+11653 11386 11652
+11251 11384 11252
+11528 11651 11384
+11122 11121 11385
+11252 11384 11385
+11120 11251 11252
+11250 11383 11528
+11121 10996 11252
+11119 10994 11076
+11385 11121 11252
+10996 10954 10995
+11124 11078 11123
+11079 11125 11002
+10998 11122 10999
+11386 11123 11122
+11388 11253 11387
+11255 11342 11343
+11211 11126 11254
+11125 11124 11210
+11253 11254 11210
+11388 11342 11254
+11212 11255 11213
+11211 11342 11255
+11255 11212 11211
+11210 11126 11125
+11342 11211 11254
+11212 11126 11211
+11122 11000 10999
+11122 11123 11000
+11001 11078 10961
+11078 11079 11002
+11124 11125 11079
+11001 10961 10960
+10999 10957 10863
+10958 10959 10864
+11000 10958 10957
+11000 10959 10958
+10996 10956 10955
+11122 10998 11121
+10998 10862 10997
+10862 10998 10863
+10997 11121 10998
+11252 10996 11120
+10997 10956 10996
+10862 10953 10954
+10995 11120 10996
+9507 9594 9644
+10954 10996 10955
+10953 10995 10954
+11077 10994 11119
+10952 10953 10862
+10952 10995 10953
+11118 11249 11119
+11076 10993 11075
+10952 10994 11077
+10952 10993 10994
+10995 11077 11120
+10995 10952 11077
+11120 11119 11250
+11076 11075 11118
+11249 11383 11250
+11527 11528 11383
+11120 11250 11251
+11118 11075 11074
+11247 11381 11340
+11382 11526 11383
+11209 11118 11074
+11119 11076 11118
+11383 11249 11341
+11250 11119 11249
+11117 11208 11248
+11525 11649 11526
+11885 11649 11772
+11650 11527 11526
+11650 11526 11649
+11527 11383 11526
+11382 11525 11526
+11482 11524 11525
+11482 11381 11339
+11482 11525 11381
+11248 11340 11382
+11381 11382 11340
+11116 11207 11208
+11246 11339 11247
+11116 11208 11117
+11247 11340 11208
+11249 11209 11341
+11208 11340 11248
+11248 11209 11117
+11248 11341 11209
+11335 11336 11207
+11207 11246 11247
+11117 11074 11116
+11075 10993 11074
+11334 11207 11116
+11380 11338 11337
+11336 11246 11207
+11336 11337 11246
+11247 11339 11381
+11246 11338 11339
+11482 11380 11481
+11339 11338 11380
+11335 11379 11336
+11380 11337 11379
+11338 11246 11337
+11334 11335 11207
+11378 11379 11335
+11335 11334 11378
+9373 9459 9374
+9712 9734 9735
+11377 11378 11334
+11520 11521 11477
+11378 11478 11522
+11378 11377 11478
+11378 11479 11379
+11647 11610 11646
+11845 11771 11770
+11479 11378 11522
+11478 11521 11522
+11478 11477 11521
+11729 11646 12092
+11647 11521 11610
+11769 11647 11729
+11647 11522 11521
+11768 11769 11729
+11770 11771 11648
+11648 11771 11772
+11770 11647 11769
+11480 11523 11524
+11522 11647 11770
+11523 11648 11524
+11523 11522 11648
+11380 11480 11481
+11379 11479 11480
+11480 11524 11481
+11648 11772 11524
+11524 11772 11649
+11771 11884 11772
+12290 12393 12394
+12148 12292 12006
+12394 12291 12290
+12292 12149 12006
+12003 12004 11882
+12005 12006 11968
+11843 11769 11768
+11844 11770 11769
+11882 11843 11768
+11882 11844 11843
+12095 12147 12003
+12148 12005 12096
+12002 12094 12095
+12145 12092 12144
+12096 12004 12003
+12096 12005 12004
+12002 12093 12094
+12002 12092 12093
+12290 12146 12289
+12094 12093 12146
+12003 12147 12096
+12095 12146 12147
+12290 12289 12392
+12245 12244 12288
+12245 12145 12244
+12093 12092 12145
+12146 12245 12289
+12146 12093 12245
+12671 12594 12670
+12464 12288 12463
+12787 12671 12670
+12465 12673 12466
+12288 12464 12289
+12594 12671 12464
+12854 12672 12671
+12788 12789 12673
+12464 12392 12289
+12464 12672 12465
+12464 12465 12392
+12672 12673 12465
+12147 12290 12148
+12147 12146 12290
+12466 12394 12465
+12291 12148 12290
+12790 12674 12673
+12292 12291 12466
+12673 12674 12466
+12791 12792 12674
+13059 13172 13060
+13064 12981 13063
+12979 12857 12792
+12676 12468 12467
+12468 12293 12467
+12468 12469 12293
+12466 12291 12394
+12292 12148 12291
+12467 12149 12292
+12293 12008 12149
+12148 12006 12005
+11969 11884 11845
+12005 11968 11967
+12006 11883 11968
+11522 11770 11648
+11844 11883 11770
+11883 11845 11770
+11883 11969 11845
+12149 12007 12006
+12007 12008 11884
+12006 12007 11969
+12149 12008 12007
+12151 12294 12295
+12150 12293 12469
+11886 11885 12150
+11650 11649 11885
+12151 11886 12150
+11885 12008 12150
+11887 11886 12009
+11650 11885 11886
+12009 12151 12152
+12009 11886 12151
+12152 12295 12296
+12294 12470 12295
+12295 12471 12296
+12295 12470 12471
+12675 12676 12467
+12469 12470 12294
+12676 12469 12468
+12677 12470 12469
+12857 12676 12675
+12677 12469 12676
+12676 12793 12677
+13062 12857 12979
+12471 12678 12679
+12470 12677 12678
+12679 12862 12680
+12679 12678 12861
+12860 13066 12861
+13450 13387 13386
+13065 13066 12982
+13175 13259 13260
+13066 12860 12982
+13066 13067 12861
+12860 12861 12678
+13067 12862 12861
+12676 12858 12793
+12858 12981 12859
+12792 12857 12675
+13063 13174 13064
+12793 12858 12859
+12676 12857 12858
+12791 12856 12792
+13061 13062 12979
+13175 13064 13174
+12858 12857 12980
+13063 12981 12980
+12858 12980 12981
+13065 13064 13175
+12982 12981 13064
+12857 13062 12980
+13385 13543 13450
+13062 13063 12980
+13062 13174 13063
+13062 13386 13174
+13616 13615 13978
+13174 13259 13175
+13452 13388 13451
+13386 13387 13259
+13386 13385 13450
+13451 13260 13387
+13176 13065 13175
+13064 13065 12982
+13175 13260 13176
+13066 13176 13261
+13066 13065 13176
+13066 13261 13067
+13176 13260 13388
+13616 13453 13615
+13261 13176 13388
+13067 13262 13068
+13261 13388 13452
+13262 13453 13616
+13262 13261 13453
+13260 13451 13388
+13802 13977 13615
+13450 13614 13451
+13453 13261 13452
+13613 13733 13543
+13451 13387 13450
+13452 13615 13453
+13452 13451 13615
+13977 13978 13615
+13803 13617 13616
+13451 13802 13615
+14255 14256 14149
+14736 14339 14338
+14736 14737 14339
+13616 13978 13803
+13977 14339 13978
+14256 14336 14337
+14338 13977 14151
+13614 13801 13802
+13800 13898 13975
+13451 13614 13802
+13450 13543 13614
+13977 13976 14151
+13899 13800 13975
+14150 14337 14151
+14542 14733 14337
+13975 14150 13976
+14148 13974 13973
+13975 14149 14150
+14255 14336 14256
+13899 13975 13976
+13898 13974 13975
+13801 13899 13976
+13733 13614 13543
+13801 13733 13899
+13540 13448 13447
+13899 13733 13800
+13543 13385 13449
+13800 13733 13613
+13801 13614 13733
+13062 13385 13386
+13258 13172 13257
+13061 13060 13173
+13542 13613 13543
+13542 13612 13613
+13611 13798 13732
+13797 13798 13731
+13609 13796 13731
+13897 13974 13798
+13799 13798 13898
+13611 13731 13798
+13800 13799 13898
+13732 13798 13799
+14150 14149 14256
+13975 13974 14149
+14254 14255 14149
+14336 14542 14337
+14254 14336 14255
+14335 14542 14336
+14336 14254 14335
+14149 13974 14148
+13796 13795 13972
+13973 13974 13897
+14335 14148 14147
+14254 14149 14148
+14148 13973 14147
+13897 13797 13796
+14334 13972 14146
+13973 13897 13796
+13972 14334 14147
+14146 14541 14334
+13972 13971 14146
+13793 13729 13728
+13896 13794 13971
+13729 13794 13730
+13972 13896 13971
+13256 13447 13448
+13896 13795 13730
+13794 13896 13730
+13972 13795 13896
+13972 13973 13796
+13731 13796 13797
+13609 13795 13796
+13611 13610 13731
+13541 13448 13540
+13729 13730 13607
+13795 13609 13608
+13447 13608 13609
+13730 13795 13608
+13254 13446 13255
+13445 13607 13446
+13253 13254 13055
+13255 13169 13168
+13446 13256 13255
+13058 12854 13057
+13384 13257 13448
+13059 12855 13058
+13257 13256 13448
+13170 13255 13256
+13610 13540 13609
+13256 13446 13447
+13609 13540 13447
+13610 13611 13541
+13610 13541 13540
+13732 13612 13611
+13732 13613 13612
+13257 13384 13258
+13448 13541 13384
+13171 13257 13059
+13171 13256 13257
+13172 13059 13257
+13173 13060 13172
+12856 12979 12792
+13258 13173 13172
+13061 12979 13060
+13449 13385 13173
+12790 12856 12791
+13060 12979 12856
+12673 12789 12790
+12673 12672 12788
+12856 12855 13059
+12790 12789 12855
+12854 12788 12672
+12854 12855 12788
+12978 13057 12853
+13168 13169 13057
+13256 13058 13170
+13171 13059 13058
+12852 13055 12978
+13168 13057 13056
+12851 13054 12852
+13056 13057 12978
+12669 12787 12670
+12978 12853 12787
+13538 13443 13442
+13539 13444 13383
+13605 13539 13443
+13605 13727 13539
+13164 13250 13381
+13604 13605 13538
+13378 13248 13377
+13381 13250 13380
+13164 13163 13249
+13164 13249 13250
+13163 13248 13249
+13246 13247 13047
+13375 13376 13247
+13247 13376 13377
+13375 13437 13438
+13247 13377 13248
+13376 13375 13438
+13379 13378 13440
+13249 13248 13378
+13249 13379 13250
+13249 13378 13379
+13442 13382 13165
+13726 13605 13604
+13250 13379 13380
+13440 13441 13380
+13600 13438 13437
+13377 13376 13438
+13378 13439 13440
+13377 13438 13534
+13381 13380 13441
+13969 13791 13893
+13727 13791 13894
+13790 13893 13791
+13606 13727 13792
+13605 13791 13727
+13727 13606 13539
+13792 13728 13606
+13793 13728 13792
+13729 13607 13728
+13895 13793 13792
+13794 13729 13793
+13894 13970 13792
+13971 13794 13895
+13727 13894 13792
+14253 14332 14458
+13969 14089 13894
+14145 13971 13970
+13968 14088 13969
+13894 14089 13970
+13969 14088 14144
+14458 14333 14253
+14146 13971 14145
+14253 14144 14332
+14089 13969 14144
+14540 14333 14458
+14145 14089 14253
+14146 14333 14541
+14145 14253 14333
+14332 14331 14457
+14252 14144 14143
+14331 14252 14456
+14252 14332 14144
+14456 14252 14143
+14331 14332 14252
+13893 13968 13969
+13535 13439 13534
+13601 13534 13600
+13789 13967 13603
+14087 14142 13967
+13788 13965 13789
+13964 14327 14328
+13788 13600 13599
+13534 13439 13377
+13967 13966 14087
+13789 13965 13966
+13788 13601 13600
+13536 13537 13440
+13789 13602 13601
+13789 13603 13602
+13537 13603 13441
+13439 13535 13440
+13602 13537 13536
+13600 13534 13438
+13601 13535 13534
+13602 13535 13601
+13536 13440 13535
+13598 13964 13599
+13964 13965 13788
+13242 13596 13597
+13960 14083 14084
+13783 13890 13784
+13956 14129 14130
+13957 13892 13891
+13785 13595 13784
+13891 13892 13784
+13958 13785 13892
+13787 13962 13597
+14086 14137 13962
+14140 13963 14139
+13599 13436 13598
+14327 13964 14140
+13788 13599 13964
+14083 13960 14082
+13786 13785 13959
+13786 13960 13787
+13786 13959 13960
+13962 13961 14086
+13787 13960 13961
+13594 13433 13593
+13889 13780 13888
+14131 13956 14130
+13957 13891 13890
+13957 13890 13956
+13891 13784 13890
+13782 13781 13955
+13889 13954 13955
+14127 14078 13954
+13781 13889 13955
+13781 13780 13889
+13724 13779 13780
+13725 13781 13592
+13955 13956 13782
+13783 13782 13956
+13783 13594 13593
+13724 13725 13591
+13780 13781 13725
+13532 13591 13431
+13590 13724 13591
+13532 13590 13591
+13532 13724 13590
+13532 13431 13430
+13430 13431 13370
+13162 13239 13374
+13432 13592 13593
+13432 13533 13592
+13432 13371 13533
+13783 13593 13782
+13433 13432 13593
+13595 13594 13784
+13374 13240 13162
+13241 13595 13596
+13786 13787 13596
+13964 13598 13963
+12970 13044 12846
+13246 13437 13375
+13436 13599 13437
+13435 13434 13594
+13435 13240 13434
+13596 13595 13786
+13435 13594 13595
+12841 12840 13040
+13039 13240 13241
+13041 13243 13042
+13597 13598 13243
+13245 13246 13046
+13375 13247 13246
+13244 13245 13044
+13436 13437 13245
+13038 13162 13240
+12657 12583 12582
+13598 13244 13243
+13436 13245 13244
+13238 13161 13160
+13162 13038 13037
+13434 13374 13433
+13162 13037 13239
+13433 13374 13239
+13434 13240 13374
+13433 13373 13432
+13238 13237 13372
+13035 13237 13159
+13370 13371 13237
+13239 13373 13433
+13238 13372 13373
+13161 13036 13160
+12966 13237 13035
+13159 13036 13035
+13161 13239 13037
+12660 12838 12839
+13038 13240 13039
+13035 12967 12966
+13036 13037 12837
+13161 13037 13036
+13038 12838 13037
+12966 12967 12836
+12837 12967 13036
+12835 12836 12773
+12835 12966 12836
+12657 12774 12837
+12836 12967 12774
+12967 12837 12774
+13037 12838 12658
+12584 12658 12659
+13038 13039 12838
+12661 12839 12775
+13039 13241 13040
+12663 12777 12778
+12776 12840 12777
+12841 12779 12778
+12664 12663 12779
+12842 12780 12779
+12842 13041 12843
+12664 12781 12782
+12780 12842 12843
+12843 12844 12782
+12285 12460 12390
+13045 12846 13044
+12783 12782 12844
+13039 13040 12839
+12841 12777 12840
+12780 12843 12781
+13042 12968 12843
+13041 13040 13242
+12840 12839 13040
+12841 13041 12842
+13242 13243 13041
+12970 12969 13043
+12844 12843 12968
+12973 12972 13047
+12847 12846 13045
+13042 13043 12968
+13244 13044 13043
+13245 13045 13044
+13245 13046 13045
+13047 12972 12971
+12973 12847 12972
+13048 13049 12974
+13163 13164 13050
+12974 13050 13051
+12974 13049 13050
+13050 13164 13051
+13253 13252 13383
+13251 13165 13382
+13444 13253 13383
+13444 13445 13254
+13446 13254 13445
+13168 13056 13055
+13166 13251 13252
+13382 13443 13252
+13382 13252 13251
+13167 13054 13053
+12848 13165 13052
+13053 13166 13167
+13165 13251 13166
+13253 13167 13252
+13253 13054 13167
+13253 13055 13054
+13254 13168 13055
+13055 12852 13054
+13052 13165 13166
+12668 12667 12851
+12850 12666 12849
+12976 13052 13166
+12975 12848 13052
+12783 12846 12847
+12783 12844 12845
+13047 12971 13046
+12972 12847 12971
+12845 12970 12846
+13043 13044 12970
+13043 12969 12968
+12970 12845 12969
+12783 12845 12846
+12844 12969 12845
+12666 12784 12849
+12849 12784 12848
+12976 12850 12849
+12591 12665 12666
+12977 12976 13053
+12849 12848 12975
+12850 12976 12977
+12849 12975 12976
+12851 12850 12977
+12851 12667 12850
+13054 12851 12977
+12785 12668 12851
+12787 12852 12978
+12785 12851 12852
+12463 12462 12669
+12668 12785 12669
+12593 12667 12668
+12592 12591 12666
+12852 12786 12785
+12852 12787 12786
+12669 12462 12668
+12592 12390 12460
+12593 12462 12391
+12669 12594 12463
+12464 12463 12594
+12288 12287 12463
+12145 12144 12243
+12092 12143 12144
+12241 12286 12242
+12592 12460 12591
+12242 12287 12143
+12143 12241 12242
+12241 12285 12286
+12286 12285 12390
+12391 12461 12593
+12391 12286 12461
+12667 12592 12666
+12460 12665 12591
+12461 12592 12667
+12461 12390 12592
+12666 12665 12784
+12586 12459 12458
+12656 12773 12836
+12389 12458 12459
+12458 12584 12585
+12658 12838 12659
+12587 12588 12459
+12587 12660 12588
+12782 12783 12664
+12459 12588 12589
+12664 12590 12663
+12459 12589 12590
+12662 12663 12590
+12780 12781 12664
+12662 12661 12775
+12589 12588 12661
+12584 12659 12585
+12838 12660 12659
+12661 12660 12839
+12587 12586 12660
+12457 12388 12387
+12582 12456 12581
+12581 12657 12582
+12837 13037 12658
+12457 12658 12584
+12583 12657 12658
+12455 12580 12581
+12455 12386 12580
+12773 12656 12580
+12456 12455 12581
+12580 12656 12581
+12583 12387 12456
+12583 12456 12582
+12583 12457 12387
+12458 12457 12584
+12389 12388 12457
+12386 12455 12456
+12387 12386 12456
+9501 9639 9502
+9500 9638 9590
+9713 9641 9712
+9639 9734 9640
+9714 9642 9713
+9640 9734 9712
+9374 9503 9375
+9712 9735 9713
+9643 9714 9644
+9713 9735 9714
+9593 9592 9643
+9591 9592 9504
+9712 9641 9640
+9503 9591 9504
+9713 9642 9641
+9643 9644 9593
+9643 9592 9642
+9505 9376 9504
+9594 9593 9644
+9505 9504 9593
+9593 9594 9505
+9507 9377 9460
+9335 9375 9376
+9459 9458 9502
+9594 9506 9505
+9594 9507 9506
+9457 9501 9502
+9640 9641 9503
+9640 9503 9502
+9641 9642 9591
+9641 9591 9503
+9642 9592 9591
+9456 9590 9501
+9638 9639 9590
+9455 9589 9500
+9639 9501 9590
+9502 9458 9457
+9638 9500 9589
+9370 9329 9455
+9330 9457 9372
+9502 9503 9459
+9374 9459 9503
+9332 9331 9372
+9372 9457 9458
+9330 9329 9371
+9500 9456 9455
+9501 9457 9371
+9459 9373 9458
+9331 9330 9372
+9456 9370 9455
+9456 9501 9371
+9370 9371 9329
+9370 9456 9371
+9458 9373 9372
+9333 9334 9263
+9333 9373 9374
+9332 9372 9373
+9335 9263 9334
+9332 9373 9333
+9375 9335 9334
+9376 9265 9264
+9331 9332 9263
+9335 9264 9263
+9335 9376 9264
+6092 6093 6012
+5879 5775 5740
+9376 9377 9265
+6091 6092 6011
+9377 9378 9336
+9504 9375 9503
+9334 9333 9374
+9265 9377 9336
+9460 9506 9507
+9374 9375 9334
+9504 9376 9375
+9376 9460 9377
+9376 9505 9460
+9377 9461 9378
+6243 6244 6142
+6243 6297 6244
+6245 6246 6143
+6251 6439 6391
+6015 6144 6145
+6143 6246 6247
+6297 6298 6246
+6299 6439 6250
+6246 6298 6247
+6249 6145 6144
+6013 6093 6142
+6141 6142 6093
+6011 6012 5973
+6011 6092 6012
+5973 5974 5879
+5973 6012 5974
+5880 6013 6014
+5974 6093 6013
+6143 6144 6014
+6248 6249 6144
+5975 5883 6016
+5881 5882 5777
+6017 5975 6016
+5885 5847 5884
+5781 5780 5847
+5846 5882 5883
+5975 5884 5883
+5975 5976 5884
+5782 5885 5848
+5885 5976 5977
+5884 5976 5885
+5975 6017 5976
+5978 5977 6018
+5886 5885 5977
+6020 6095 6096
+6094 6148 6149
+6019 5978 6018
+5887 5886 5978
+5978 6019 5979
+6018 6094 6019
+6146 6147 6017
+6301 6391 6440
+6018 6148 6094
+6254 6302 6148
+6094 6149 6095
+6148 6302 6149
+6147 6254 6148
+6147 6253 6301
+6598 6442 6441
+6597 6598 6540
+6394 6393 6442
+6303 6302 6393
+6302 6392 6441
+6391 6439 6440
+6147 6301 6254
+6300 6391 6301
+6254 6392 6302
+6301 6440 6392
+6252 6251 6391
+6252 6146 6251
+6251 6250 6439
+6250 6145 6249
+6299 6250 6249
+6251 6145 6250
+6248 6247 6299
+6248 6299 6249
+6298 6539 6299
+6301 6253 6300
+6147 6146 6253
+6392 6540 6441
+6440 6439 6539
+6299 6539 6439
+6539 6597 6540
+10955 10956 10862
+6597 6539 6667
+10957 10864 10863
+7069 7155 7215
+6599 6600 6541
+6712 6668 6667
+6712 6713 6668
+6668 6669 6598
+6442 6393 6441
+6668 6713 6669
+6541 6443 6442
+7026 7069 7156
+6598 6669 6599
+7676 7598 7742
+8277 8205 8302
+6306 6256 6305
+6669 6713 6670
+6598 6599 6442
+6669 6670 6599
+6599 6670 6600
+6443 6541 6600
+6442 6599 6541
+6444 6304 6443
+6303 6393 6394
+6305 6304 6444
+6394 6442 6443
+6306 6444 6445
+6443 6600 6444
+6396 6395 6446
+6444 6600 6445
+6397 6446 6447
+6445 6600 6446
+8527 8437 8461
+8369 8461 8437
+8176 8110 8205
+8176 8111 8110
+8369 8352 8302
+8206 8304 8112
+6450 6449 6542
+6398 6397 6448
+8205 8277 8176
+8303 8370 8304
+8437 8370 8352
+8463 8304 8370
+8463 8462 8528
+8370 8437 8462
+8527 8572 8573
+8461 8647 8572
+8437 8527 8462
+8461 8572 8527
+11003 10866 10714
+8678 8677 8734
+8647 8573 8572
+8648 8528 8573
+10865 10714 10713
+10865 11003 10714
+8678 8679 8648
+8761 8736 8760
+8528 8574 8529
+8649 8735 8680
+8734 8735 8679
+8762 8737 8761
+10716 10569 10654
+10715 10654 10653
+10716 10654 10715
+10654 10568 10653
+10569 10568 10654
+10866 10716 10715
+10655 10570 10569
+8734 8759 8735
+8575 8649 8680
+8649 8679 8735
+8574 8649 8530
+8574 8679 8649
+8531 8466 8577
+8529 8574 8530
+8463 8529 8530
+8463 8528 8529
+8371 8372 8207
+8113 8009 8008
+6940 6887 6939
+6452 6451 6544
+6452 6402 6451
+6399 6449 6400
+6544 6451 6401
+7025 6939 6819
+6544 6450 6543
+6448 6449 6398
+6448 6542 6449
+7025 7069 7026
+6543 6450 6542
+8112 8079 8111
+8112 8007 8079
+8352 8303 8277
+8352 8370 8303
+8110 8078 8006
+8111 8079 8078
+8176 8206 8111
+8303 8304 8206
+6307 6397 6308
+6396 6446 6397
+6154 6309 6259
+6398 6449 6399
+6102 6154 6155
+6398 6399 6309
+6449 6450 6400
+6156 6260 6261
+6544 6401 6450
+6401 6310 6400
+6027 6157 6103
+6450 6401 6400
+6451 6402 6401
+6157 6156 6262
+6260 6310 6261
+6025 6156 6026
+6261 6262 6156
+6149 6304 6150
+6155 6260 6156
+6027 6026 6157
+5986 5985 6026
+6028 5793 5894
+5791 5750 5790
+5987 5986 6026
+5892 5791 5790
+6026 5985 6025
+5986 5893 5985
+5987 5893 5986
+5987 5894 5893
+5892 6024 6025
+6153 6154 6102
+6102 6155 6025
+6259 6260 6155
+6024 6153 6102
+6024 6101 6153
+6258 6306 6395
+6025 6024 6102
+5789 5748 5747
+5892 5789 6024
+5788 5664 5787
+5984 5983 6022
+5788 5747 5664
+5984 5890 5983
+5787 5663 5786
+6023 5984 6099
+6022 5982 6097
+6100 6023 6099
+5891 5890 5984
+6024 6023 6101
+5891 5984 6023
+6101 6023 6100
+6307 6395 6396
+6306 6445 6395
+6100 6099 6152
+6306 6258 6257
+6257 6256 6306
+6150 6097 6021
+5984 6022 6099
+6256 6257 6152
+6152 6098 6151
+6152 6099 6098
+6306 6305 6444
+6097 6098 6022
+6256 6152 6151
+6443 6304 6394
+6255 6151 6097
+6096 6150 6021
+6304 6305 6255
+6304 6255 6150
+5980 6096 5981
+6095 6149 6096
+6021 6097 5982
+6150 6255 6097
+6099 6022 6098
+5983 5982 6022
+5889 6021 5982
+5981 6096 6021
+5979 6020 5980
+5979 6019 6020
+5785 5888 5851
+5979 5980 5888
+5745 5782 5783
+5847 5885 5782
+5782 5848 5783
+5886 5887 5848
+5558 5432 5557
+5659 5743 5744
+5782 5781 5847
+5744 5743 5781
+5782 5744 5781
+5659 5625 5658
+5745 5660 5744
+5660 5746 5627
+5625 5626 5556
+5659 5744 5660
+5382 5431 5383
+5559 5558 5661
+5556 5557 5431
+5660 5745 5746
+5626 5660 5557
+5626 5659 5660
+5784 5661 5746
+5557 5660 5627
+5661 5558 5627
+5433 5386 5432
+5384 5432 5385
+5431 5557 5432
+5434 5433 5559
+5387 5386 5433
+5527 5434 5560
+5389 5307 5388
+5434 5559 5560
+5433 5558 5559
+5561 5527 5560
+5528 5435 5527
+5783 5784 5746
+5851 5786 5785
+5559 5661 5785
+5783 5848 5849
+5746 5661 5627
+5784 5785 5661
+5850 5849 5887
+5784 5783 5849
+5785 5850 5888
+5785 5784 5850
+5890 5787 5889
+5663 5664 5628
+5889 5787 5786
+5890 5891 5788
+5786 5663 5662
+5787 5664 5663
+5663 5628 5561
+5437 5563 5438
+5664 5629 5628
+5664 5747 5630
+5890 5788 5787
+5891 5789 5788
+5562 5630 5563
+5629 5664 5630
+6024 5789 5891
+5892 5790 5789
+5666 5790 5750
+5749 5789 5790
+5894 5791 5893
+5751 5668 5667
+5792 5752 5791
+5752 5668 5751
+5563 5665 5631
+5630 5747 5665
+5632 5666 5667
+5631 5749 5666
+5530 5439 5438
+5395 5313 5312
+5668 5565 5632
+5440 5395 5394
+5531 5440 5530
+5530 5632 5565
+5530 5440 5439
+5395 5442 5396
+5437 5438 5392
+5564 5530 5438
+5565 5531 5530
+5531 5532 5442
+5438 5393 5392
+5438 5394 5393
+5628 5562 5529
+5629 5630 5562
+5563 5437 5562
+5309 5168 5269
+5562 5436 5529
+5437 5392 5310
+5434 5435 5389
+5528 5529 5435
+5269 5308 5309
+5435 5436 5391
+5166 5269 5167
+5268 5308 5269
+5168 5117 5116
+5436 5309 5391
+5311 5393 5394
+5310 5169 5309
+5119 5118 5169
+5436 5310 5309
+5392 5393 5311
+5171 5311 5312
+5310 5392 5311
+5270 5312 5313
+5311 5394 5312
+5173 5172 5313
+5042 5041 5171
+5040 5170 5041
+5119 5169 5170
+5311 5171 5170
+5270 5172 5171
+5118 5039 5117
+5118 5119 5039
+5042 4989 5041
+4893 4987 4988
+5041 4989 4988
+4989 4990 4894
+4837 4987 4893
+4986 5040 4987
+4759 4836 4760
+4836 4892 4760
+4985 5040 4986
+4629 4759 4760
+4890 4891 4836
+5117 5038 5116
+4890 4889 4983
+4513 4759 4629
+4628 4889 4759
+4984 4890 4983
+4889 4758 5036
+5307 5267 5266
+5308 5391 5309
+5268 5269 5166
+5267 5268 5166
+5267 5307 5308
+5306 5307 5266
+5306 5388 5307
+5267 5308 5268
+5389 5390 5308
+5435 5390 5389
+5435 5391 5390
+5387 5388 5306
+5387 5433 5388
+5265 5264 5387
+5165 5036 5164
+5266 5265 5306
+5165 5264 5265
+5263 5305 5264
+5386 5387 5305
+5385 5304 5303
+5385 5386 5304
+5304 5386 5305
+5385 5432 5386
+5431 5382 5430
+5383 5302 5382
+5384 5302 5383
+5262 5164 5163
+5384 5303 5302
+5384 5385 5303
+5035 5163 5164
+5162 5161 5261
+5302 5262 5163
+5303 5304 5262
+5264 5164 5263
+5036 4888 5164
+4757 5035 4888
+4887 4982 5034
+5035 5162 5163
+5115 5161 5162
+5035 5034 5162
+5035 4887 5034
+4756 4755 4835
+4754 4834 4886
+5034 4982 5033
+4887 4835 4982
+4981 5031 5032
+4885 4981 4886
+4885 4980 4981
+4834 4885 4886
+4834 4884 4885
+5031 4980 5030
+5031 4981 4980
+4884 4883 4980
+4978 4977 5028
+4979 4883 4882
+4979 4980 4883
+5158 5112 5157
+5030 4980 4979
+4882 4978 4979
+5028 5157 5112
+5113 5030 5029
+5113 5031 5030
+5260 5159 5158
+5032 5115 5033
+5298 5158 5157
+5159 5114 5158
+5298 5260 5158
+5523 5621 5553
+5299 5260 5298
+5380 5299 5298
+5261 5301 5162
+5523 5426 5552
+5429 5526 5381
+5160 5300 5261
+5524 5553 5622
+5113 5114 5031
+5113 5158 5114
+5161 5115 5160
+5429 5381 5300
+5430 5301 5381
+5160 5261 5161
+5300 5381 5261
+5554 5555 5525
+5556 5430 5526
+5624 5554 5623
+5428 5380 5298
+5380 5429 5300
+5525 5526 5429
+5743 5658 5742
+5622 5554 5524
+5657 5624 5623
+5625 5556 5555
+5525 5555 5526
+5624 5625 5555
+5742 5658 5624
+5743 5659 5658
+5780 5779 5846
+5742 5624 5657
+5847 5780 5883
+5743 5742 5780
+5780 5846 5883
+5779 5778 5846
+5881 6015 5882
+5779 5742 5778
+5742 5657 5778
+5623 5622 5657
+5655 5741 5621
+5776 5844 5880
+5880 5881 5845
+5778 5657 5777
+6016 5882 6015
+5846 5778 5882
+5845 5881 5777
+6014 6144 5881
+5741 5845 5777
+5880 6014 5881
+5776 5741 5655
+5777 5656 5741
+5377 5297 5296
+5655 5740 5776
+5656 5553 5621
+5525 5429 5524
+5554 5622 5623
+5553 5656 5622
+5380 5524 5429
+5380 5428 5524
+5524 5428 5553
+5379 5378 5426
+5297 5379 5298
+5523 5553 5428
+5428 5379 5427
+5428 5298 5379
+5426 5378 5377
+5379 5297 5378
+5522 5426 5377
+5427 5379 5426
+5523 5552 5621
+5619 5550 5973
+5523 5427 5426
+5523 5428 5427
+5552 5655 5621
+5654 5620 5619
+5844 5776 5775
+5845 5741 5776
+5776 5880 5845
+5844 5879 5880
+5973 5879 5619
+5775 5776 5740
+5619 5620 5551
+5295 5425 5296
+5655 5654 5740
+5655 5620 5654
+5552 5522 5551
+5552 5426 5522
+5552 5551 5620
+5522 5425 5521
+5654 5619 5740
+5550 5519 5973
+5551 5550 5619
+5551 5522 5521
+5550 5520 5519
+5521 5425 5424
+5550 5521 5520
+5550 5551 5521
+5293 5376 5294
+5519 5424 5423
+5520 5521 5424
+5522 5377 5425
+5378 5297 5377
+5294 5295 5155
+5424 5425 5295
+5259 5293 5294
+5259 5294 5154
+5376 5423 5294
+5106 5258 5152
+5107 5106 5152
+5153 5152 5258
+5107 5023 5106
+5109 5108 5154
+5024 5107 5153
+5293 5259 5258
+5108 5024 5153
+5108 5259 5154
+5153 5258 5259
+5026 5155 5111
+5295 5296 5155
+4976 5026 5111
+5155 5296 5156
+5297 5157 5156
+5297 5298 5157
+5156 5111 5155
+5156 5157 5028
+5155 5110 5154
+5025 4879 4878
+5025 5110 4975
+5109 5154 5110
+5027 4976 5111
+4975 5110 5026
+5156 5027 5111
+4881 4830 4976
+4979 4978 5029
+4977 5027 5028
+5029 4978 5028
+4882 4977 4978
+4880 4829 4975
+4745 4708 4707
+4977 4881 5027
+4880 5026 4976
+4974 4878 4877
+4879 4828 4827
+5024 4974 4973
+5108 5109 5025
+5108 5025 4974
+5109 5110 5025
+5022 5023 4972
+5022 5106 5023
+4974 4877 4973
+4745 4746 4708
+4745 4826 4877
+4877 4827 4745
+4878 4879 4827
+4827 4828 4746
+4879 4975 4829
+4707 4744 4745
+4826 4745 4744
+4827 4746 4745
+4617 4500 4582
+4708 4616 4707
+4707 4616 4744
+4617 4618 4501
+4501 4500 4617
+4120 4243 4182
+4708 4617 4616
+4500 4499 4582
+4616 4617 4582
+4708 4746 4617
+4618 4709 4619
+4618 4747 4709
+4366 4452 4502
+4452 4365 4364
+4502 4452 4501
+4317 4243 4365
+4620 4504 4583
+4453 4502 4503
+4583 4504 4503
+4584 4505 4454
+4584 4620 4711
+4584 4504 4620
+4882 4832 4831
+4710 4619 4749
+4710 4749 4750
+4709 4748 4749
+4751 4710 4750
+4620 4583 4710
+4746 4829 4747
+4828 4879 4829
+5027 4881 4976
+4977 4831 4881
+4883 4832 4882
+4751 4750 4832
+4751 4833 4711
+4883 4884 4833
+4833 4751 4832
+4711 4620 4751
+4754 4623 4712
+4711 4833 4752
+4753 4754 4712
+4713 4624 4586
+4834 4753 4752
+4834 4754 4753
+4752 4712 4621
+4752 4753 4712
+4755 4754 4835
+4713 4623 4754
+4887 4756 4835
+4713 4754 4755
+4757 4756 4887
+4756 4625 4624
+4510 4626 4627
+4625 4757 4626
+4507 4624 4508
+4507 4586 4624
+4509 4625 4626
+4508 4624 4625
+4586 4506 4623
+4455 4371 4370
+4713 4586 4623
+4507 4455 4586
+4375 4251 4374
+4374 4508 4509
+4374 4373 4508
+4249 4187 4248
+4506 4370 4505
+4371 4320 4370
+4455 4372 4371
+4455 4507 4372
+4320 4247 4370
+4368 4504 4454
+4505 4621 4585
+4712 4623 4622
+4623 4585 4622
+4506 4505 4585
+4711 4621 4584
+4711 4752 4621
+4319 4368 4454
+4318 4367 4368
+4319 4454 4369
+4504 4584 4454
+4372 4320 4371
+4126 4125 4185
+4246 4247 4124
+4248 4187 4186
+4249 4188 4187
+4189 4129 4104
+4320 4248 4185
+4187 4127 4186
+4185 4248 4186
+4320 4372 4248
+4250 4249 4373
+4188 4128 4187
+4191 4190 4250
+4129 4189 4190
+4374 4251 4250
+4130 4105 4129
+4131 4107 4106
+4106 4107 4043
+4189 4188 4249
+4189 4128 4188
+4130 4129 4190
+4105 4042 4129
+4128 4104 4103
+4128 4189 4104
+4042 3991 3917
+4042 4105 3991
+4105 4043 3991
+3885 3920 3921
+3829 3806 3828
+3880 3916 3990
+4104 3990 4041
+4040 3987 4039
+3917 3990 4042
+3917 3880 3990
+3916 3988 3989
+3879 3823 3915
+4128 4127 4187
+4103 4041 4102
+4040 4102 3988
+4127 4103 4102
+4126 4101 4125
+4039 3986 4038
+3987 3986 4039
+3987 3914 3986
+3915 4040 3988
+4039 4101 4040
+4100 4037 4099
+3985 3914 3913
+4121 4183 4122
+4036 4099 3984
+4098 4099 4036
+4037 3985 3984
+4099 4098 4123
+4036 4035 4098
+4100 4099 4123
+4037 3984 4099
+4039 4038 4101
+3986 3985 4038
+4124 4100 4123
+4124 4038 4100
+4370 4247 4369
+4124 4123 4246
+4369 4247 4246
+4320 4185 4247
+4246 4319 4369
+4245 4244 4318
+4246 4184 4319
+4122 4123 4098
+4319 4184 4245
+4246 4123 4184
+4120 4182 4121
+4122 4184 4123
+4367 4318 4317
+4244 4183 4243
+4243 4183 4182
+4244 4245 4183
+4501 4452 4364
+4452 4366 4365
+4500 4364 4499
+4365 4243 4120
+4366 4317 4365
+4366 4367 4317
+4096 4120 4097
+4097 4121 4034
+4182 4183 4121
+4035 4122 4098
+4183 4245 4122
+4121 4035 4034
+4364 4096 4499
+4096 4097 4033
+4120 4121 4097
+3740 3802 3820
+3702 3638 3701
+3701 3739 3702
+3740 3820 3821
+3802 3819 3820
+3820 3913 3914
+3877 3984 3913
+3740 3821 3741
+3820 3914 3821
+3822 3878 3823
+3821 3914 3878
+3803 3821 3822
+3821 3878 3822
+3916 3879 3988
+3878 3987 3915
+3704 3741 3803
+3803 3823 3742
+3642 3608 3704
+3703 3740 3741
+3823 3803 3822
+3742 3704 3803
+3541 3608 3642
+3607 3640 3641
+3705 3704 3742
+3641 3741 3704
+3823 3804 3742
+3642 3704 3705
+3447 3446 3506
+3608 3641 3704
+3639 3640 3607
+3639 3703 3640
+3540 3608 3541
+3540 3641 3608
+3538 3606 3505
+3607 3540 3539
+3605 3638 3606
+3702 3639 3606
+3639 3740 3703
+3702 3802 3740
+3538 3605 3606
+3637 3701 3638
+3637 3605 3538
+3637 3638 3605
+3340 3417 3358
+3418 3443 3505
+3417 3538 3443
+3445 3444 3539
+3418 3505 3444
+3291 3104 3203
+3358 3417 3418
+3341 3358 3418
+3341 3340 3358
+3290 3289 3341
+3289 3260 3340
+3289 3340 3341
+3359 3290 3341
+3290 3260 3289
+3105 3104 3204
+3444 3445 3359
+3291 3203 3290
+3359 3291 3290
+3360 3361 3205
+3105 3072 3104
+1689 1653 1571
+1571 1448 1652
+1183 1133 1182
+1779 1689 1688
+1689 1780 1653
+1572 1533 1653
+1533 1448 1571
+3360 3204 3291
+3020 3077 3021
+3074 3075 3019
+3072 3105 3073
+3106 3205 3107
+3446 3445 3540
+3291 3359 3445
+3445 3360 3291
+3447 3448 3361
+3360 3446 3447
+3360 3445 3446
+3073 3074 3019
+1782 1691 1781
+1783 1692 1782
+1690 1781 1691
+1780 1689 1779
+1780 1781 1690
+1825 1780 1779
+1825 1781 1780
+1653 1533 1571
+1449 1360 1448
+1132 1133 1097
+1185 1238 1239
+1573 1690 1691
+1653 1780 1690
+1692 1654 1691
+1449 1533 1572
+1534 1450 1573
+1450 1572 1573
+1239 1323 1361
+1238 1448 1360
+1574 1534 1573
+1361 1360 1450
+1135 1185 1239
+1135 1134 1185
+1360 1323 1238
+1360 1361 1323
+1535 1451 1575
+1451 1450 1534
+1654 1692 1575
+1691 1782 1692
+1534 1574 1575
+1573 1691 1654
+1654 1574 1573
+1654 1575 1574
+1826 1825 1827
+1784 1783 1827
+1693 1692 1783
+3022 2985 3021
+2920 2877 2985
+3022 3021 3078
+3106 3074 3105
+3805 3827 3744
+3206 3109 3108
+3079 3078 3108
+3077 3020 3076
+3449 3361 3448
+3108 3107 3205
+3106 3107 3076
+3108 3078 3107
+3360 3205 3204
+3361 3362 3206
+2985 3020 3021
+3019 3072 3073
+3020 3019 3076
+3076 3019 3075
+2985 3019 3020
+3074 3106 3075
+3204 3205 3106
+3106 3076 3075
+3077 3078 3021
+3107 3077 3076
+3107 3078 3077
+3447 3506 3507
+3446 3541 3506
+3705 3743 3642
+3705 3742 3743
+3743 3804 3805
+3743 3742 3804
+3988 3879 3915
+3916 3880 3825
+3804 3824 3805
+3804 3823 3824
+3827 3826 3880
+3805 3824 3825
+3448 3508 3542
+3826 3825 3880
+3805 3826 3827
+3805 3825 3826
+3542 3508 3507
+3448 3447 3508
+3828 3744 3827
+3543 3450 3449
+3745 3746 3644
+3827 3917 3881
+3918 3882 3829
+3828 3827 3881
+3022 3023 2986
+2948 2880 2947
+3022 2986 2985
+3022 3078 3079
+2988 2987 3023
+3023 3022 3079
+3205 3206 3108
+3109 3023 3079
+3363 3207 3362
+3023 2987 2986
+3207 3111 3025
+3114 3080 3113
+3023 3024 2988
+3023 3109 3024
+2946 2989 3025
+3110 3109 3206
+2921 2945 2989
+2944 2988 2945
+2921 2920 2945
+2920 2986 2987
+2945 2988 3024
+2944 2987 2988
+1918 1832 1831
+2946 2921 2989
+2877 2920 2921
+2787 2810 2811
+2851 2877 2878
+1696 1786 1830
+1829 1695 1785
+1831 1697 1696
+1695 1694 1785
+1138 1187 1188
+1453 1363 1362
+1786 1829 1830
+2986 2920 2985
+2944 2945 2920
+2878 2877 2921
+2851 2985 2877
+1786 1695 1829
+1785 1784 1828
+1693 1783 1784
+1829 1785 1828
+1694 1784 1785
+1693 1655 1575
+1362 1240 1239
+1577 1536 1452
+1535 1575 1576
+1695 1577 1655
+1576 1575 1655
+1576 1577 1535
+1241 1242 1188
+1575 1451 1534
+1535 1452 1451
+1451 1362 1361
+1452 1453 1362
+1099 1100 1048
+1099 1134 1135
+1098 1099 1048
+1098 1134 1099
+1029 1098 1048
+89 59 97
+1048 1049 1029
+1100 1136 1101
+1186 1138 1137
+1100 1135 1136
+1049 1100 1101
+1101 1136 1102
+1049 1050 1029
+1050 1101 1102
+1050 1049 1101
+1102 1103 1050
+1186 1240 1241
+1102 1137 1103
+1102 1136 1137
+1138 1186 1187
+1137 1240 1186
+1535 1577 1452
+1366 1580 1456
+1694 1695 1655
+1536 1453 1452
+1656 1578 1577
+1577 1578 1536
+1696 1695 1786
+1656 1577 1695
+1696 1656 1695
+1578 1453 1536
+1696 1578 1656
+1696 1830 1831
+1696 1579 1578
+1244 1245 1191
+1919 1920 1832
+1697 1579 1696
+1186 1241 1187
+1142 1192 1193
+1362 1363 1240
+1240 1363 1241
+1454 1363 1453
+1242 1241 1363
+1139 1106 1105
+1103 1137 1138
+1103 1138 1104
+1104 1138 1105
+1107 1106 1139
+1139 1188 1242
+1139 1138 1188
+1243 1140 1242
+1242 1140 1139
+1363 1364 1242
+1699 1835 1787
+1139 1140 1107
+1191 1192 1141
+1140 1141 1107
+1140 1243 1189
+1140 1189 1141
+1243 1364 1244
+1189 1190 1141
+1189 1243 1244
+1242 1364 1243
+1698 1455 1697
+1697 1454 1579
+1364 1363 1454
+1832 1697 1831
+1698 1835 1699
+1921 1922 1833
+1833 1697 1832
+1920 1833 1832
+1923 1924 1834
+1923 1834 1922
+1920 1921 1833
+2790 2789 2814
+1830 1916 1831
+2815 2816 2792
+2787 2813 2788
+2854 2811 2853
+1916 1830 1829
+1919 1832 1918
+1829 1828 1916
+1831 1917 1918
+1831 1916 1917
+2878 2879 2853
+2812 2787 2811
+2787 2812 2813
+2811 2810 2853
+2880 2879 2947
+2854 2812 2811
+2851 2878 2852
+2921 2946 2878
+2878 2853 2852
+2879 2854 2853
+3024 3025 2989
+3112 3164 3113
+2947 2946 3025
+2879 2878 2946
+2946 2947 2879
+3111 3292 3208
+2854 2879 2880
+2947 3025 3111
+3026 2948 2947
+2813 2812 2854
+2813 2880 2814
+2813 2854 2880
+2793 2792 2816
+2789 2788 2814
+2881 2948 3028
+2881 2814 2880
+3080 3115 3028
+2948 3026 3027
+3261 3262 3209
+3210 3166 3165
+3261 3164 3208
+3165 3113 3164
+3293 3294 3261
+3209 3210 3165
+3294 3262 3261
+3294 3295 3263
+3164 3209 3165
+3262 3263 3209
+3293 3292 3364
+3342 3295 3294
+3293 3365 3294
+3342 3294 3365
+3834 3750 3749
+3751 3652 3750
+3750 3650 3749
+3651 3611 3548
+3548 3454 3453
+3548 3549 3454
+3650 3651 3547
+3611 3549 3548
+3547 3453 3546
+3454 3365 3364
+3650 3710 3749
+3649 3709 3710
+3650 3547 3610
+3548 3453 3547
+3749 3748 3833
+3749 3710 3748
+3547 3546 3610
+3453 3452 3546
+3610 3648 3649
+3610 3546 3609
+3545 3452 3451
+3293 3261 3208
+3453 3364 3452
+3453 3454 3364
+3292 3293 3208
+3364 3365 3293
+2947 3111 3026
+3208 3164 3112
+3112 3111 3208
+3451 3450 3544
+3026 3111 3112
+3025 3024 3110
+3206 3207 3110
+3292 3111 3207
+3646 3609 3545
+3546 3452 3545
+3645 3646 3545
+3646 3647 3609
+3643 3644 3543
+3645 3545 3544
+3207 3363 3292
+3362 3450 3363
+3363 3451 3452
+3363 3450 3451
+3025 3110 3207
+3024 3109 3110
+3362 3449 3450
+3362 3361 3449
+3361 3206 3205
+3362 3207 3206
+3744 3706 3542
+3542 3805 3744
+3544 3644 3645
+3543 3449 3542
+3544 3543 3644
+3544 3450 3543
+3806 3807 3744
+3644 3643 3707
+3881 3829 3828
+3706 3643 3542
+3707 3706 3744
+3707 3643 3706
+3918 3829 3881
+3807 3707 3744
+3828 3806 3744
+3829 3807 3806
+3882 3919 3830
+3747 3832 3833
+3829 3882 3807
+3831 3832 3747
+3807 3745 3707
+3831 3884 3885
+3644 3746 3645
+3745 3830 3746
+3746 3646 3645
+3647 3648 3609
+3646 3747 3708
+3746 3831 3747
+3708 3647 3646
+3708 3648 3647
+3830 3831 3746
+3883 3919 3920
+3993 3994 3919
+4045 4132 4253
+4043 4044 3993
+4045 4133 4046
+3993 3919 3882
+3994 3920 3919
+3830 3883 3831
+3830 3919 3883
+3991 4043 3992
+4044 3994 3993
+3991 3918 3881
+3992 3993 3918
+3807 3882 3830
+3918 3993 3882
+3992 4043 3993
+4105 4130 4106
+4191 4251 4131
+4107 4044 4043
+4131 4192 4107
+4132 4044 4107
+4251 4192 4131
+4251 4252 4192
+4509 4375 4374
+4375 4252 4251
+4130 4131 4106
+4130 4191 4131
+4510 4375 4509
+4456 4376 4375
+4587 4510 4627
+4253 4376 4513
+4628 4758 4889
+4627 4626 4758
+4628 4587 4627
+4628 4513 4512
+4510 4456 4375
+4456 4512 4376
+4510 4511 4456
+4512 4513 4376
+4192 4252 4132
+4253 4513 4377
+4375 4376 4252
+4456 4511 4512
+4587 4512 4511
+4587 4628 4512
+4377 4134 4133
+4253 4132 4252
+4630 4514 4629
+4457 4458 4380
+4760 4630 4629
+4986 4987 4837
+4378 4134 4377
+3995 3996 3920
+4133 4253 4377
+4133 4045 4253
+4047 4046 4133
+4047 3921 4046
+3996 3995 4045
+4044 4132 4045
+3883 3884 3831
+3883 3920 3884
+3994 3995 3920
+4045 4046 3996
+3921 3922 3833
+3835 3750 3834
+3832 3885 3921
+3832 3831 3885
+3921 3996 4046
+3921 3920 3996
+4515 4378 4514
+4257 4256 4322
+4134 3922 4047
+3923 3924 3836
+4133 4134 4047
+4379 4457 4380
+4378 4254 4134
+4380 4381 4255
+4630 4515 4514
+4516 4379 4515
+4378 4379 4254
+4378 4515 4379
+4588 4516 4515
+4631 4588 4515
+4838 4837 4893
+4838 4761 4837
+4762 4894 4839
+5442 5441 5531
+5395 5440 5441
+5440 5531 5441
+5635 5669 5754
+5396 5443 5397
+5533 5534 5444
+5395 5396 5313
+5395 5441 5442
+5443 5442 5532
+5443 5396 5442
+5313 5172 5270
+5120 5043 4990
+5042 4990 4989
+4895 4839 4894
+4840 4765 4764
+5120 4990 5042
+5396 5397 5313
+5443 5444 5397
+5173 5120 5172
+5173 5121 5120
+5313 5314 5173
+5397 5444 5314
+4895 4840 4839
+5122 5121 5173
+5122 5043 5121
+5314 5271 5173
+5123 5044 5122
+5173 5271 5174
+5314 5398 5271
+5173 5174 5122
+5271 5315 5175
+5567 5534 5533
+5568 5569 5534
+5532 5533 5443
+5534 5398 5444
+5443 5533 5444
+5672 5636 5671
+5532 5567 5533
+5566 5531 5565
+5567 5568 5534
+5567 5636 5568
+5445 5569 5570
+5568 5636 5569
+5534 5445 5398
+5570 5446 5316
+5398 5315 5271
+5445 5570 5316
+5316 5176 5175
+5123 5122 5175
+5124 5123 5175
+5044 5043 5122
+5044 5124 5045
+5175 5315 5316
+5445 5316 5315
+5446 5447 5317
+5126 5176 5177
+5124 5175 5176
+5128 5177 5178
+5176 5316 5177
+5272 5180 5179
+5177 5446 5317
+5048 5128 5178
+5177 5317 5178
+5045 5125 5126
+5124 5176 5125
+5045 5126 4991
+5125 5176 5126
+5048 5047 5128
+5046 4991 5126
+4898 4842 4897
+5046 5126 5127
+5179 5049 5129
+4898 4843 4842
+4769 4842 4770
+4992 5047 5048
+4770 4842 4843
+4897 4991 4992
+4993 4898 5048
+4842 4841 4897
+4898 4897 4992
+4841 4896 4897
+5047 5046 5128
+5126 5177 5127
+5128 5046 5127
+5047 4992 5046
+4896 5044 5045
+5124 5125 5045
+5124 5044 5123
+5045 4991 4896
+4897 4896 4991
+4841 4768 4896
+4766 4767 4717
+4767 4719 4718
+4460 4383 4382
+4718 4719 4633
+4717 4718 4633
+4717 4767 4718
+4719 4634 4633
+4719 4768 4769
+4719 4769 4634
+4768 4841 4769
+4590 4635 4636
+4634 4769 4635
+4259 4137 4258
+4384 4324 4323
+4258 4137 4257
+4325 4258 4324
+4325 4326 4258
+4323 4257 4322
+4323 4324 4257
+3657 3755 3756
+3754 3837 3755
+3924 3925 3837
+4137 4138 3926
+3618 3656 3619
+3656 3657 3620
+3618 3655 3656
+3655 3715 3716
+3619 3656 3620
+3716 3755 3656
+3551 3550 3615
+3712 3711 3752
+4137 4136 4257
+4255 4381 4321
+3754 3715 3753
+3754 3716 3715
+3924 4136 3925
+4135 3923 4134
+3713 3714 3654
+3753 3715 3714
+3753 3836 3837
+3923 3922 4134
+3653 3712 3713
+3714 3715 3654
+3613 3652 3653
+3654 3617 3616
+3458 3457 3552
+3615 3654 3616
+3654 3653 3713
+3654 3615 3653
+3835 3836 3751
+3836 3753 3752
+3752 3713 3712
+3752 3753 3713
+4383 4321 4382
+4256 4136 4255
+4765 4766 4716
+4715 4765 4716
+4840 4895 4766
+4764 4765 4715
+4840 4766 4765
+3922 3923 3835
+3924 3837 3836
+4256 4255 4321
+4136 3924 4135
+4764 4715 4714
+4839 4840 4764
+4763 4764 4714
+4763 4839 4764
+4839 4763 4762
+4516 4457 4379
+4516 4517 4457
+4516 4589 4517
+3835 3923 3836
+4134 4254 4135
+4255 4135 4254
+4255 4136 4135
+4459 4380 4458
+4255 4254 4380
+3613 3612 3652
+3711 3751 3752
+3615 3614 3653
+3611 3651 3652
+3653 3711 3712
+3652 3751 3711
+3611 3612 3549
+3611 3652 3612
+3344 3295 3343
+3296 3211 3295
+3295 3344 3296
+3366 3455 3456
+3343 3366 3344
+3343 3342 3366
+3614 3613 3653
+3549 3612 3613
+3549 3550 3455
+3615 3616 3551
+3550 3614 3615
+3550 3613 3614
+3617 3551 3616
+3458 3368 3457
+3344 3367 3296
+3367 3366 3456
+3550 3456 3455
+3550 3551 3456
+3296 3367 3345
+3344 3366 3367
+3029 3028 3116
+2882 2855 2817
+3263 3211 3210
+3296 3212 3211
+3028 3115 3116
+3080 3027 3113
+2884 2922 2885
+2794 2816 2817
+3029 2882 3028
+2815 2792 2791
+2814 2815 2790
+2814 2881 2815
+3165 3114 3113
+3166 3115 3114
+2790 2815 2791
+2881 2816 2815
+3294 3263 3262
+3295 3211 3263
+3115 3080 3114
+3028 3027 3080
+1833 1834 1698
+1833 1922 1834
+1925 1835 1924
+1927 1926 1924
+1926 1836 1835
+1454 1697 1455
+1366 1367 1246
+1833 1698 1697
+1834 1835 1698
+1700 1699 1787
+1580 1698 1699
+1454 1455 1364
+1698 1580 1455
+1189 1244 1190
+1364 1455 1365
+1364 1365 1244
+1455 1580 1366
+1190 1191 1141
+1190 1244 1191
+1193 1245 1246
+1192 1191 1245
+1367 1366 1456
+1245 1365 1366
+1194 1193 1246
+1245 1366 1246
+1367 1247 1246
+1194 1142 1193
+1195 1194 1246
+1195 1142 1194
+1197 1143 1196
+1247 1196 1195
+1699 1657 1580
+1839 1838 1929
+1580 1581 1456
+1701 1838 1702
+1581 1657 1701
+1581 1580 1657
+1837 1787 1836
+1700 1657 1699
+1701 1700 1787
+1701 1657 1700
+1924 1926 1925
+1836 1787 1835
+1927 1836 1926
+1927 1837 1836
+2817 2795 2794
+2817 2855 2818
+2038 2037 2073
+2073 2037 2036
+2038 1967 2037
+1839 1702 1838
+1702 1582 1701
+1966 1965 2036
+1928 1927 1965
+2037 1966 2036
+1929 1928 1966
+1368 1367 1457
+1247 1195 1246
+1248 1247 1367
+1196 1143 1142
+1142 1195 1196
+1367 1456 1457
+1581 1701 1582
+1248 1196 1247
+1248 1197 1196
+1967 1840 1839
+1368 1324 1249
+1702 1457 1582
+1702 1458 1457
+1249 1197 1248
+1198 1143 1197
+1249 1250 1198
+1324 1369 1251
+1197 1249 1198
+1248 1368 1249
+1458 1368 1457
+1458 1369 1368
+1968 1840 1967
+1458 1459 1370
+1967 1839 1929
+1840 1702 1839
+1966 1967 1929
+2038 1968 1967
+2137 2074 2073
+2075 2076 2039
+2075 2039 2038
+1458 1703 1459
+2137 2075 2074
+2137 2138 2075
+2885 2858 2884
+3031 3030 3117
+2922 2991 3033
+2990 2950 3030
+3030 2950 2949
+2951 2922 2950
+2818 2857 2858
+2857 2884 2858
+2950 2922 2884
+2795 2818 2858
+2856 2883 2857
+2817 2818 2795
+2856 2857 2818
+2855 2856 2818
+2855 2882 2883
+3028 2882 2881
+2949 2950 2883
+3029 2949 2882
+2950 2884 2883
+2882 2949 2883
+2990 3030 3031
+3029 3030 2949
+3029 3212 3213
+3297 3369 3298
+3368 3458 3369
+3299 3370 3371
+3298 3369 3370
+3552 3457 3551
+3368 3367 3457
+3459 3509 3510
+3458 3552 3509
+3511 3459 3510
+3370 3369 3459
+3460 3511 3512
+3510 3553 3511
+3299 3213 3298
+3117 3030 3213
+2951 2990 2991
+2951 2950 2990
+3032 3031 3081
+2991 2990 3031
+3460 3372 3371
+3117 3213 3299
+3461 3460 3512
+3371 3370 3460
+3214 3372 3300
+3299 3371 3372
+3167 3214 3215
+3421 3420 3462
+3372 3373 3300
+3514 3462 3461
+3419 3420 3373
+3419 3462 3420
+3464 3421 3463
+3421 3374 3373
+3464 3463 3515
+3421 3462 3463
+3558 3516 3515
+3516 3464 3515
+3659 3757 3660
+3467 3424 3466
+3517 3465 3464
+3374 3301 3373
+3303 3218 3264
+3301 3216 3215
+3517 3464 3516
+3422 3421 3464
+3119 3167 3168
+3214 3117 3299
+3168 3216 3169
+3215 3300 3301
+3302 3264 3217
+3264 3218 3217
+3122 3168 3169
+3217 3301 3302
+3120 3168 3121
+3215 3216 3168
+3083 3122 3084
+3170 3169 3217
+3168 3120 3119
+3119 3118 3167
+3119 3120 3082
+3168 3167 3215
+3118 3117 3214
+3215 3214 3300
+3167 3118 3214
+3082 3081 3118
+3031 3117 3081
+3119 3082 3118
+3033 3032 3082
+2991 3032 3033
+2991 3031 3032
+2076 2139 2140
+2076 2138 2139
+2142 2077 2141
+2140 2077 2076
+2140 2141 2077
+2038 2039 1968
+2076 2077 1970
+1968 1969 1840
+1969 2076 1970
+1840 1703 1702
+1841 1970 1971
+1250 1251 1198
+1250 1324 1251
+1368 1369 1324
+1458 1370 1369
+1702 1703 1458
+1840 1969 1841
+1841 1969 1970
+1968 2039 1969
+1583 1459 1704
+1703 1840 1841
+1970 2040 1971
+1970 2077 2040
+1251 1252 1198
+1251 1370 1252
+1460 1372 1459
+1371 1370 1459
+1253 1372 1373
+1371 1459 1372
+1705 1583 1704
+1459 1703 1704
+2142 2042 2078
+2042 1971 2041
+2043 2042 2142
+3083 3035 3034
+2752 2796 2753
+3034 3035 2992
+2993 3036 3037
+3122 3123 3084
+3121 3122 3083
+3121 3168 3122
+3083 3084 3035
+3170 3124 3169
+1971 1972 1842
+1971 2042 1972
+1658 1659 1585
+1842 1705 1704
+1460 1373 1372
+1841 1842 1704
+1844 1931 1932
+1584 1460 1583
+1585 1586 1461
+1585 1584 1658
+1585 1460 1584
+1583 1705 1584
+1844 1930 1931
+1842 1843 1705
+1373 1254 1253
+1705 1658 1584
+1705 1844 1706
+1931 1930 1975
+1974 1930 2046
+2181 2182 2145
+2229 2182 2228
+2229 2146 2182
+2047 1975 2080
+3087 3086 3125
+3088 3087 3125
+3169 3216 3217
+3038 2994 3089
+3126 3125 3218
+3169 3124 3123
+3126 3088 3125
+3036 2993 3087
+2182 2181 2228
+2993 3086 3087
+3085 3084 3123
+2993 3085 3086
+3035 3084 3085
+3086 3124 3125
+3086 3085 3124
+3170 3217 3218
+3216 3301 3217
+3125 3170 3218
+3125 3124 3170
+3374 3302 3301
+3302 3303 3264
+3422 3375 3374
+3303 3304 3219
+3374 3375 3302
+3422 3464 3465
+3558 3559 3517
+3423 3375 3422
+3465 3423 3422
+3467 3518 3560
+3559 3518 3517
+3377 3378 3305
+3517 3518 3465
+3468 3561 3469
+3465 3466 3423
+3424 3467 3376
+3423 3466 3424
+3465 3518 3466
+3375 3376 3302
+3375 3424 3376
+3303 3376 3377
+3303 3302 3376
+3518 3467 3466
+3560 3561 3468
+4141 4199 4142
+4200 4201 4142
+4142 4050 4049
+3929 3838 3759
+4385 4462 4386
+4261 4199 4198
+4261 4262 4199
+4199 4200 4142
+4262 4201 4200
+4385 4386 4328
+4330 4262 4329
+4329 4386 4330
+4329 4328 4386
+4464 4463 4522
+4462 4461 4521
+4595 4596 4521
+4641 4642 4597
+4327 4385 4328
+4327 4461 4385
+4523 4387 4464
+4386 4462 4463
+4520 4519 4595
+4639 4640 4595
+4596 4522 4521
+4595 4640 4596
+4721 4722 4640
+4461 4520 4521
+4594 4637 4638
+4141 4140 4197
+4519 4520 4461
+4595 4521 4520
+4197 4140 4196
+4049 4048 4140
+4141 4197 4198
+4140 4141 4049
+4198 4199 4141
+3756 3926 3757
+3758 3661 3660
+4049 3927 4048
+3928 3758 3757
+3516 3558 3517
+3660 3560 3559
+3557 3659 3558
+3660 3559 3558
+4140 4139 4195
+4138 4137 4259
+3928 3757 3927
+3660 3558 3659
+3515 3557 3558
+3658 3756 3659
+3622 3658 3556
+3515 3462 3514
+3514 3557 3515
+3556 3555 3622
+3555 3513 3512
+3555 3556 3513
+3657 3622 3621
+3658 3557 3556
+3514 3556 3557
+3514 3513 3556
+3622 3657 3658
+3621 3620 3657
+3657 3756 3658
+3926 4048 3927
+3925 3926 3756
+3925 4137 3926
+4637 4593 4592
+4594 4518 4593
+4326 4259 4258
+4048 4138 4139
+4048 3926 4138
+4591 4590 4636
+4637 4592 4636
+4636 4592 4591
+4593 4518 4592
+4638 4639 4594
+4139 4138 4193
+4139 4194 4195
+4139 4193 4194
+4594 4519 4518
+4594 4595 4519
+4775 4774 4850
+4594 4639 4595
+4638 4773 4720
+4638 4720 4639
+4773 4774 4720
+4847 4848 4773
+4901 4995 4902
+4847 4900 4848
+5050 5180 5130
+4899 4900 4846
+5050 4994 4900
+4772 4847 4773
+4846 4900 4847
+4846 4847 4772
+4770 4843 4844
+4771 4845 4846
+4844 4898 4993
+5048 4898 4992
+4993 4899 4844
+4771 4844 4845
+4843 4898 4844
+4845 4899 4846
+4993 5049 4899
+5048 5129 4993
+5180 5050 5049
+5317 5318 5178
+5049 4993 5129
+5049 5179 5180
+5129 5178 5179
+5573 5535 5572
+5447 5571 5535
+5320 5319 5399
+5179 5178 5318
+5318 5448 5399
+5447 5535 5448
+5399 5319 5318
+5320 5180 5272
+5318 5272 5179
+5319 5320 5272
+5050 5130 5051
+5180 5273 5130
+5050 5051 4994
+5130 5131 5052
+5322 5181 5321
+5180 5320 5273
+5273 5400 5321
+5320 5399 5400
+5132 5131 5181
+5130 5273 5181
+5576 5322 5450
+5451 5323 5322
+5322 5182 5181
+5322 5183 5182
+5182 5054 5132
+5052 5051 5130
+5182 5132 5181
+5053 4995 5052
+5133 5054 5182
+5053 5131 5132
+5053 5052 5131
+4995 4901 5052
+4848 4849 4774
+4848 4994 4901
+4848 4901 4849
+4994 5052 4901
+4639 4721 4640
+4720 4774 4721
+4902 4850 4901
+4849 4901 4850
+4721 4775 4722
+4721 4774 4775
+4850 4902 4851
+5055 5056 4903
+4996 4902 4995
+4997 4903 4902
+4722 4775 4776
+4776 4775 4851
+4640 4641 4596
+4722 4776 4723
+4902 4903 4851
+4723 4642 4641
+4904 4903 5056
+4776 4851 4903
+4997 5055 4903
+5133 5183 5055
+5054 4996 5053
+4997 4902 4996
+5132 5054 5053
+5133 4997 5054
+5576 5677 5451
+5678 5452 5451
+5323 5183 5322
+5056 5184 5057
+5452 5324 5451
+5324 5183 5323
+5451 5677 5678
+5451 5322 5576
+6276 6167 6275
+6036 6037 5899
+6038 6037 6114
+6115 6114 6167
+6039 6040 5989
+6115 6038 6114
+5989 5901 6038
+5574 5575 5450
+5799 5854 5899
+5677 5800 5901
+5575 5576 5450
+5901 5800 5900
+5677 5576 5800
+6165 6166 6112
+6113 6037 6112
+6113 6166 6273
+6112 6111 6165
+6037 6113 6114
+6112 6166 6113
+6167 6274 6275
+6167 6114 6273
+6274 6273 6321
+6166 6271 6272
+6272 6273 6166
+6272 6321 6273
+6269 6318 6319
+6604 6717 6718
+6891 6825 6890
+6719 6605 6718
+6606 6605 6673
+6459 6458 6605
+6606 6673 6607
+6605 6719 6673
+6608 6550 6607
+6459 6605 6549
+6549 6606 6607
+6549 6605 6606
+6460 6322 6459
+6719 6786 6673
+6722 6828 6723
+6607 6460 6549
+6461 6323 6460
+6673 6786 6720
+6892 6946 6826
+6825 6786 6785
+6826 6720 6786
+6786 6825 6826
+6891 6945 6892
+7682 7607 7681
+7077 6946 6945
+7077 6945 7076
+6946 6892 6945
+7076 7221 7077
+7350 7351 7221
+7611 7756 7757
+7419 7347 7418
+7684 7685 7609
+7901 7900 7973
+7753 7754 7685
+7753 7836 7837
+7684 7752 7753
+8016 7895 8121
+7350 7423 7481
+7349 7220 7219
+7610 7482 7481
+7221 7220 7350
+7421 7480 7422
+7423 7350 7349
+7421 7479 7480
+7608 7609 7480
+7684 7608 7683
+7480 7479 7608
+7751 7682 7681
+7751 7752 7682
+7607 7479 7478
+7607 7608 7479
+7349 7219 7348
+7348 7420 7421
+7348 7219 7347
+7074 6944 6943
+7423 7349 7422
+7220 7076 7075
+7350 7220 7349
+7221 7076 7220
+6824 6825 6785
+6891 6892 6825
+7220 7075 7219
+7076 6944 7075
+6890 6824 6944
+6783 6717 6823
+6785 6784 6824
+6785 6719 6718
+6783 6718 6717
+6784 6785 6718
+6944 6823 6943
+6824 6784 6783
+7073 7074 6943
+7219 7075 7074
+6824 6783 6823
+6784 6718 6783
+7419 7420 7347
+7421 7349 7348
+7750 7680 7749
+7607 7478 7606
+7832 7750 7749
+7751 7681 7750
+7832 7749 7831
+7606 7478 7477
+7479 7420 7478
+7420 7348 7347
+7478 7420 7419
+7479 7421 7420
+7604 7477 7345
+7418 7346 7477
+7829 7830 7747
+7831 7749 7748
+7605 7606 7477
+7748 7749 7606
+7893 7830 7892
+7893 7894 7830
+7678 7747 7604
+7748 7606 7605
+7604 7605 7477
+7679 7748 7605
+7072 7218 7073
+7346 7418 7347
+7345 7346 7218
+7345 7477 7346
+6822 7072 6943
+7218 7074 7073
+6319 6604 6458
+6603 6716 6604
+6943 7072 7073
+6942 7071 7217
+6457 6603 6604
+6548 6547 6602
+6163 6268 6269
+6317 6318 6268
+6266 6267 6162
+6317 6268 6267
+6033 6163 6108
+6162 6267 6163
+6110 6109 6164
+6035 5988 6034
+6319 6318 6457
+6409 6548 6457
+6268 6318 6269
+6409 6457 6318
+6320 6319 6458
+6320 6270 6319
+6319 6270 6269
+6271 6166 6165
+6321 6320 6458
+6272 6271 6320
+6110 6164 6165
+6270 6271 6165
+6270 6164 6269
+6270 6165 6164
+6036 6110 6111
+6035 6034 6110
+6110 6036 6035
+5899 5854 5988
+5853 5854 5798
+5899 5900 5799
+6112 6036 6111
+5899 5988 6036
+5574 5798 5676
+5676 5576 5575
+5676 5799 5800
+5798 5574 5675
+5576 5676 5800
+5575 5574 5676
+5852 5853 5798
+5854 5799 5798
+6108 6034 6033
+6109 6110 6034
+5797 5852 5798
+5898 5854 5853
+5897 5852 5797
+5897 5898 5852
+5449 5573 5574
+5572 5637 5573
+5573 5675 5574
+5637 5674 5675
+6030 6031 5896
+5897 5797 5796
+5796 5674 5673
+5796 5675 5674
+6161 6265 6162
+6265 6407 6316
+6265 6266 6162
+6316 6408 6317
+6162 6032 6031
+6162 6163 6032
+6317 6408 6409
+6456 6408 6455
+6602 6547 6546
+6455 6408 6316
+6548 6456 6547
+6548 6409 6456
+6545 6546 6455
+6601 6602 6546
+6546 6547 6455
+6265 6316 6266
+6265 6264 6407
+6263 6107 6160
+5896 5796 5673
+6107 6263 6161
+6315 6407 6264
+6405 6454 6406
+6601 6546 6545
+6406 6407 6315
+6406 6314 6405
+6406 6315 6314
+6264 6263 6315
+6264 6161 6263
+6107 6030 6160
+5793 5794 5755
+6160 6030 6106
+5896 6032 5796
+6107 6031 6030
+6107 6161 6031
+5795 5895 6030
+6031 6032 5896
+6029 5895 6028
+6030 5896 5795
+5570 5672 5673
+5794 5895 5795
+5569 5636 5672
+5636 5635 5670
+5673 5672 5795
+5570 5569 5672
+5672 5794 5795
+5755 5754 5793
+5753 5792 5754
+5895 5794 5793
+5670 5635 5754
+5567 5532 5566
+5755 5670 5754
+5671 5636 5670
+5567 5566 5635
+5633 5668 5752
+5566 5633 5634
+5565 5668 5633
+5635 5566 5634
+5532 5531 5566
+5791 5752 5751
+5753 5669 5752
+5754 5792 5793
+5753 5752 5792
+5754 5669 5753
+5634 5633 5669
+6157 6158 6103
+6312 6404 6313
+6026 6027 5987
+6103 6158 6028
+6027 5894 5987
+6027 6103 6028
+6262 6311 6157
+6402 6452 6403
+6402 6403 6311
+6452 6453 6403
+6404 6453 6454
+6313 6404 6454
+6029 6028 6104
+5895 5793 6028
+6405 6313 6454
+6312 6453 6404
+6106 6029 6105
+6106 6030 6029
+6314 6313 6405
+6159 6104 6158
+6314 6159 6313
+6105 6104 6159
+6941 7071 6942
+7070 6940 7026
+7070 7071 6941
+7070 7026 7156
+6940 6939 7026
+6887 6819 6939
+6889 6942 6821
+6939 7025 7026
+7825 7742 7598
+7155 7069 7025
+7677 7600 7599
+7417 7342 7473
+7598 7676 7599
+7156 7215 7302
+7156 7069 7215
+7677 7599 7744
+7886 7742 7825
+7556 7598 7599
+7556 7473 7598
+7744 7743 7826
+7676 7742 7743
+7886 7826 7742
+7887 7827 7744
+7887 7744 7826
+7599 7676 7744
+7745 7677 7827
+7677 7744 7827
+7888 7745 7827
+7600 7557 7556
+7745 7601 7677
+7557 7417 7473
+7601 7557 7600
+7343 7417 7474
+7889 7745 7888
+7889 7602 7745
+7677 7601 7600
+7217 7345 7218
+7557 7474 7417
+7601 7745 7602
+7601 7602 7474
+7829 7828 7891
+7602 7475 7474
+7678 7746 7828
+7216 7344 7071
+7475 7476 7344
+7070 7216 7071
+7302 7343 7216
+7216 7343 7344
+7302 7417 7343
+6887 6888 6819
+6887 6940 6888
+6672 6714 6715
+6819 6888 6820
+6671 6672 6601
+6671 6714 6672
+6714 6820 6715
+6888 6941 6820
+6889 6941 6942
+6888 6940 6941
+6820 6889 6821
+6820 6941 6889
+6671 6601 6545
+6672 6715 6601
+6820 6821 6715
+6942 7072 6822
+6716 6602 6715
+6716 6603 6602
+6942 7217 7072
+7344 7476 7217
+6942 6822 6821
+6943 6823 6822
+7476 7604 7345
+7679 7605 7604
+7602 7603 7475
+7602 7746 7603
+7603 7476 7475
+7603 7604 7476
+7603 7678 7604
+7603 7746 7678
+7604 7747 7679
+7678 7828 7747
+7830 7829 7892
+7747 7828 7829
+8013 7969 8012
+7892 8014 7970
+7969 7891 7890
+7969 7892 7891
+8117 8210 8178
+7894 8015 7895
+8082 8014 8013
+8083 8015 7970
+7892 7970 7893
+8014 8083 7970
+8308 8309 8279
+8376 8439 8355
+8532 8580 8469
+8376 8355 8308
+8377 8469 8470
+8578 8650 8651
+8532 8439 8468
+8119 8083 8014
+8119 8180 8083
+8209 8306 8210
+8178 8210 8211
+8306 8307 8278
+8354 8375 8307
+8578 8579 8531
+8353 8375 8354
+8353 8373 8374
+8354 8307 8306
+8209 8210 8177
+8306 8278 8210
+8117 8082 8012
+8014 8082 8119
+8117 8012 8081
+8012 8082 8013
+8115 8177 8116
+8117 8118 8082
+8116 8117 8081
+8177 8210 8117
+8011 7889 7888
+8011 8012 7889
+8010 8011 7888
+8081 8012 8011
+8115 8116 8081
+8177 8117 8116
+8010 8115 8011
+8209 8177 8115
+8114 8010 8009
+7888 7827 7887
+7887 8010 7888
+8207 8113 8112
+7887 8009 8010
+7887 7826 7886
+8112 8113 8080
+8009 7887 8008
+7885 7886 7825
+8008 7887 7886
+8463 8464 8371
+8114 8009 8113
+8080 8113 8008
+8207 8114 8113
+8372 8208 8207
+8208 8115 8010
+8304 8463 8371
+8465 8576 8372
+8530 8464 8463
+8530 8649 8575
+8304 8371 8207
+8464 8465 8371
+8736 8681 8680
+8464 8530 8575
+8371 8465 8372
+8464 8575 8465
+8466 8576 8577
+8465 8575 8681
+8576 8466 8372
+8531 8438 8466
+8115 8208 8209
+8114 8207 8208
+8306 8305 8353
+8372 8466 8373
+8208 8305 8209
+8208 8372 8305
+8353 8374 8375
+8373 8438 8374
+8306 8353 8354
+8305 8373 8353
+8683 8763 8764
+8683 8682 8763
+8869 8835 8834
+8836 8763 8835
+8763 8834 8835
+8763 8762 8834
+8682 8762 8763
+8833 8834 8762
+8465 8681 8576
+8762 8761 8832
+8681 8737 8682
+8760 8759 8831
+8681 8736 8761
+8680 8759 8736
+8576 8681 8682
+8575 8680 8681
+8761 8760 8831
+8736 8759 8760
+8832 8761 8831
+8737 8681 8761
+8832 8833 8762
+10717 10656 10570
+10659 10721 10572
+10717 10718 10656
+10717 10867 10804
+10569 10716 10655
+10866 11005 10716
+10716 10867 10717
+11006 10868 10867
+10717 10804 10718
+10867 10868 10804
+10804 10719 10718
+10805 10657 10719
+10571 10657 10658
+10656 10719 10657
+10657 10805 10720
+10658 10720 10659
+10657 10720 10658
+10805 10868 10869
+10805 10869 10720
+11008 11009 10870
+10658 10659 10571
+10720 10869 10721
+10572 10721 10660
+10869 11008 10870
+11011 11012 10872
+10721 10869 10870
+8836 8835 8869
+9380 9379 9462
+10571 10659 10572
+9337 9267 9266
+8870 8837 8869
+8837 8836 8869
+8764 8763 8836
+8764 8684 8683
+8683 8684 8650
+8764 8837 8684
+8467 8531 8579
+8579 8578 8651
+8836 8837 8764
+10726 10662 10725
+10722 10721 10870
+10721 10722 10660
+10806 10723 10722
+10807 10872 10808
+10660 10661 10572
+10662 10726 10663
+10723 10724 10661
+10872 10806 10871
+10724 10725 10661
+10873 11012 11013
+10724 10808 10725
+10724 10723 10807
+11011 10871 10962
+10806 10722 10871
+10724 10807 10808
+10723 10806 10807
+11011 10962 11010
+10871 10870 10962
+10806 10872 10807
+10871 11011 10872
+10874 10873 11013
+10808 10872 10873
+10726 10664 10663
+10661 10725 10662
+9228 9267 9338
+9054 9055 9024
+10727 10665 10664
+10728 10809 10729
+10727 10874 10809
+10809 10874 10875
+10875 10810 10809
+9818 9883 9884
+9464 9463 9508
+9381 9268 9380
+10665 10728 10729
+10727 10809 10728
+9338 9380 9268
+9462 9463 9380
+9157 9112 9156
+9228 9157 9267
+9228 9158 9113
+9228 9338 9268
+9337 9379 9338
+9025 9056 8969
+9113 9157 9228
+9025 9055 9113
+9056 9113 9158
+9056 9025 9113
+9157 9055 9112
+9267 9157 9227
+9338 9267 9337
+9157 9156 9227
+9337 9266 9379
+9267 9227 9266
+9055 9054 9112
+8738 8686 8685
+8581 8580 8652
+8838 8739 8765
+8652 8580 8685
+9025 8928 9024
+8872 8873 8838
+8378 8310 8470
+8377 8439 8469
+8532 8469 8439
+8580 8581 8470
+8309 8377 8310
+8355 8439 8377
+8355 8309 8308
+8355 8377 8309
+7748 7894 7831
+7970 8015 7894
+8310 8121 8213
+8122 8016 8214
+8120 8121 8015
+7833 7750 7832
+7831 7895 7832
+8122 8214 8215
+8015 8121 7895
+8120 8213 8121
+8765 8738 8685
+8839 8840 8766
+8377 8470 8310
+8469 8580 8470
+8765 8739 8738
+8739 8653 8686
+7751 7833 7834
+7751 7750 7833
+8687 8739 8766
+8686 8738 8739
+8582 8653 8687
+8581 8686 8653
+8838 8873 8839
+8874 8931 8875
+8838 8839 8766
+8871 8838 8765
+8871 8872 8838
+8929 9025 8969
+9024 9055 9025
+9025 8929 8928
+8969 8930 8929
+8929 8872 8871
+8929 8873 8872
+8767 8687 8766
+8739 8838 8766
+8739 8687 8653
+8767 8840 8841
+8379 8378 8582
+8470 8581 8582
+8017 7971 8016
+8121 8310 8214
+8583 8379 8582
+8215 8214 8378
+7898 7835 7897
+7896 7895 8016
+7751 7834 7835
+7833 7895 7896
+7834 7896 7835
+7834 7833 7896
+7836 7835 7898
+7752 7751 7835
+7900 7899 7972
+7897 7896 7971
+7898 7897 7971
+7835 7896 7897
+7972 7898 7971
+7836 7752 7835
+7837 7836 7898
+7753 7752 7836
+7754 7837 7900
+7754 7753 7837
+7974 7901 7973
+7837 7898 7899
+7972 7899 7898
+7900 7837 7899
+8018 7973 7972
+7973 7900 7972
+8583 8688 8768
+8583 8582 8688
+8018 8017 8122
+7972 7971 8017
+8123 8122 8215
+8017 8016 8122
+8767 8841 8842
+8874 8873 8930
+8688 8767 8768
+8688 8687 8767
+8767 8842 8768
+8875 8931 8932
+8877 8876 8933
+9060 9029 9028
+8970 8931 8930
+9059 9027 9058
+8933 8932 8971
+9163 9116 9115
+9162 9115 9161
+8970 8971 8931
+9027 8933 8971
+8842 8876 8877
+8842 8841 8876
+8841 8875 8876
+8841 8840 8875
+8929 8930 8873
+8969 9057 8970
+8840 8874 8875
+8840 8839 8874
+9158 9159 9056
+9114 9058 9057
+8969 8970 8930
+9057 9026 8970
+8970 9026 8971
+9057 9058 9026
+9466 9467 9384
+9463 9462 9508
+9465 9464 9509
+9381 9380 9464
+9057 9159 9114
+9158 9269 9159
+10729 10809 10810
+9509 9464 9508
+10729 10810 10811
+9510 9465 9509
+9466 9511 9467
+9161 9229 9230
+9160 9159 9229
+9161 9160 9229
+9161 9114 9160
+9271 9270 9339
+9230 9229 9270
+9466 9382 9465
+9339 9270 9382
+9595 9510 9509
+9467 9512 9513
+8768 8843 8769
+8768 8877 8843
+8689 8584 8583
+8380 8311 8216
+8770 8689 8769
+8583 8768 8689
+8844 8879 8880
+8972 8933 9027
+8881 8770 8880
+8770 8769 8844
+8935 8881 8934
+8973 8936 8935
+8771 8770 8881
+8882 8936 8937
+8881 8935 8936
+8585 8381 8380
+8380 8379 8583
+8880 8770 8844
+8771 8584 8770
+8585 8380 8584
+8085 8126 8127
+8216 8217 8125
+8181 8126 8125
+8381 8311 8380
+8312 8218 8311
+8218 8181 8217
+8128 8086 8022
+8085 8125 8126
+8217 8181 8125
+7977 7976 8021
+8123 8215 8216
+8084 8085 8021
+8084 8125 8085
+7975 8020 7976
+8019 8123 8020
+8020 8124 8084
+8123 8216 8124
+8379 8216 8215
+8311 8217 8216
+8020 8123 8124
+8019 8018 8123
+8123 8018 8122
+8019 7973 8018
+8019 7974 7973
+8019 8020 7975
+7687 7610 7686
+7686 7754 7755
+7975 7901 7974
+7755 7900 7901
+7901 7975 7902
+7974 8019 7975
+7482 7351 7481
+7755 7901 7756
+7685 7686 7609
+7685 7754 7686
+7609 7686 7610
+7687 7755 7688
+7755 7687 7686
+7610 7481 7609
+7688 7610 7687
+7613 7612 7758
+7481 7351 7350
+7610 7688 7611
+7351 7222 7221
+7351 7482 7352
+7612 7482 7611
+7486 7485 7559
+7610 7611 7482
+7688 7756 7611
+7757 7612 7611
+7558 7614 7615
+7613 7483 7612
+7352 7223 7222
+7222 7223 7157
+7159 7081 7080
+7351 7352 7222
+7224 7159 7223
+7487 7486 7559
+7353 7223 7352
+7757 7758 7612
+7558 7615 7559
+7840 7758 7757
+7842 7843 7759
+7840 7839 7904
+7757 7756 7838
+7905 7840 7904
+7841 7758 7840
+7757 7838 7839
+7756 7902 7838
+8021 7976 8020
+7903 7839 7838
+7977 7903 7976
+7977 7904 7903
+7689 7614 7613
+7558 7559 7485
+7689 7615 7614
+7689 7759 7690
+7353 7484 7424
+7352 7483 7484
+7613 7484 7483
+7613 7614 7558
+7484 7558 7485
+7484 7613 7558
+7354 7424 7425
+7484 7485 7424
+7223 7353 7224
+7352 7484 7353
+7159 7160 7081
+7159 7224 7160
+7226 7162 7225
+7081 7160 7161
+7354 7425 7426
+7424 7485 7425
+7225 7354 7303
+7353 7424 7354
+7226 7225 7303
+7161 7224 7225
+7083 7162 7163
+7304 7303 7355
+7226 7163 7162
+7426 7355 7303
+7303 7304 7226
+7355 7356 7305
+7615 7616 7559
+7427 7489 7428
+7355 7426 7487
+7425 7485 7486
+7486 7426 7425
+7486 7487 7426
+7843 7907 7844
+7616 7487 7559
+7760 7616 7690
+7618 7560 7489
+7618 7619 7560
+8022 7908 7907
+8181 8218 8127
+8086 8129 8023
+8127 8128 8022
+8129 8219 8130
+8218 8128 8127
+8312 8313 8219
+7908 7844 7907
+7843 7844 7759
+7908 7760 7844
+7758 7842 7759
+7842 7906 7843
+7841 7842 7758
+7905 7904 7977
+7907 7843 7906
+7842 7905 7906
+7841 7840 7905
+8126 8181 8127
+8311 8218 8217
+8312 8219 8218
+8772 8883 8845
+8882 8881 8936
+8771 8585 8584
+8312 8311 8381
+8772 8690 8771
+8472 8383 8586
+8771 8882 8883
+8936 8974 8937
+8938 8882 8937
+8771 8881 8882
+8974 8975 8937
+8939 8883 8938
+8773 8772 8845
+8773 8740 8691
+8471 8382 8381
+8356 8312 8382
+8690 8586 8585
+8472 8587 8533
+8383 8356 8382
+8357 8313 8356
+8773 8690 8772
+8691 8586 8690
+8883 8884 8845
+8883 8939 8884
+8887 8886 8941
+8846 8845 8885
+8942 8887 8941
+9034 9065 9066
+8886 8887 8846
+8887 8942 8847
+8885 8886 8846
+8885 8940 8886
+8847 8742 8774
+8887 8774 8846
+8654 8691 8692
+8654 8586 8691
+8585 8586 8471
+8654 8587 8586
+8586 8383 8471
+8383 8472 8384
+8384 8358 8383
+8314 8313 8358
+8692 8740 8693
+8692 8691 8740
+8740 8741 8693
+8740 8846 8774
+8654 8655 8587
+8654 8693 8655
+8385 8384 8440
+8359 8358 8384
+8384 8472 8440
+8586 8587 8472
+8474 8385 8440
+8132 8222 8026
+8588 8656 8694
+8588 8587 8656
+8474 8473 8533
+8474 8440 8473
+8693 8742 8656
+8774 8887 8847
+8741 8774 8742
+8741 8740 8774
+8848 8847 8888
+8775 8742 8847
+8848 8849 8775
+8944 8849 8888
+8942 8888 8847
+8943 8944 8888
+8889 8849 8944
+8847 8848 8775
+8888 8849 8848
+8889 8944 8945
+8889 8850 8849
+8892 8891 8947
+8890 8850 8889
+8849 8850 8776
+8889 8946 8890
+8947 8893 8892
+8779 8778 8852
+8852 8851 8892
+8892 8893 8852
+8850 8777 8776
+8851 8852 8778
+8852 8893 8853
+8778 8779 8744
+8853 8779 8852
+8746 8745 8779
+8744 8779 8745
+8658 8591 8590
+8590 8534 8476
+8477 8536 8478
+8475 8386 8385
+8477 8534 8535
+8696 8657 8695
+8590 8475 8589
+8475 8476 8386
+8475 8590 8476
+8695 8743 8696
+8588 8694 8695
+8656 8742 8694
+8590 8589 8657
+8475 8474 8589
+7845 7910 7764
+7764 7694 7693
+8025 7910 7978
+7911 7765 7846
+8131 8132 8025
+8222 8316 8386
+8024 8131 8025
+8359 8314 8358
+8387 8222 8386
+8221 8131 8220
+8025 7979 7910
+8025 8026 7979
+8027 8222 8223
+8132 8221 8222
+7764 7765 7694
+7766 8027 7767
+7764 7846 7765
+7764 7910 7846
+7622 7621 7765
+7492 7429 7357
+7494 7493 7621
+7430 7429 7493
+7430 7358 7429
+7307 7227 7358
+7167 7229 7168
+7167 7166 7228
+7227 7228 7166
+7227 7166 7165
+7087 7086 7166
+7164 7165 7086
+7358 7357 7429
+7358 7227 7357
+7621 7493 7562
+7562 7620 7621
+7619 7561 7560
+7562 7492 7561
+7164 7086 7085
+7561 7492 7491
+7493 7429 7492
+7084 6952 7029
+7356 7488 7427
+7490 7491 7428
+7427 7488 7489
+7691 7761 7762
+7691 7762 7692
+7763 7764 7693
+7488 7617 7489
+7617 7691 7618
+7618 7692 7619
+7845 7764 7763
+8222 8221 8316
+8221 8314 8315
+7909 7910 7845
+8315 8359 8385
+8315 8314 8359
+8023 8130 8024
+8220 8314 8221
+8316 8221 8315
+8132 8131 8221
+7908 7761 7760
+8358 8313 8357
+8219 8128 8218
+8024 8130 8131
+8129 8128 8219
+8220 8219 8313
+8220 8130 8219
+8022 8086 8023
+8023 8129 8130
+8086 8128 8129
+7616 7488 7487
+7616 7760 7617
+7489 7617 7618
+7488 7616 7617
+7618 7691 7692
+7617 7761 7691
+7306 7356 7428
+7356 7355 7487
+7355 7305 7304
+7428 7356 7427
+7306 7305 7356
+7083 7082 7162
+7081 7161 7082
+6830 6949 6893
+7081 7082 6949
+6789 6830 6831
+6788 6787 6830
+6171 6328 6466
+6170 6117 6169
+6553 6612 6465
+6724 6789 6725
+5805 5856 5806
+5907 5994 5908
+5640 5580 5639
+5454 5401 5453
+5758 5682 5806
+5639 5638 5681
+5580 5640 5581
+5639 5682 5640
+6171 6170 6328
+6118 6045 6170
+5581 5640 5683
+5806 5908 5857
+6046 6047 5909
+5995 6045 6046
+5806 5857 5758
+5908 5995 5857
+5581 5683 5582
+5758 5857 5807
+5909 5807 5857
+5807 5808 5684
+6329 6171 6466
+6329 6172 6171
+6172 6048 5910
+6047 6172 5910
+6830 6893 6831
+6725 6466 6613
+6830 6789 6788
+6832 6833 6725
+6832 6725 6789
+6833 6726 6725
+6831 6893 6832
+6950 7082 7083
+7027 7083 7163
+6950 6949 7082
+6832 6950 6833
+6832 6893 6950
+7028 7027 7163
+6950 7083 7027
+6467 6329 6466
+6330 6172 6329
+7029 6951 7028
+6833 6950 6951
+6952 6727 6726
+6331 6330 6467
+7029 7028 7084
+6951 7027 7028
+7085 6952 7084
+6952 6951 7029
+6951 6952 6833
+7085 7086 6953
+6726 6727 6468
+6952 7085 6953
+6728 6953 6954
+6727 6952 6953
+6728 6469 6727
+6332 6331 6468
+6725 6726 6467
+6833 6952 6726
+6333 6332 6468
+6174 6048 6173
+5910 6048 5911
+6174 6331 6332
+6172 6173 6048
+6172 6330 6173
+6333 6174 6332
+5912 5913 5688
+5686 5911 5687
+6048 6174 6049
+5686 5910 5911
+5808 5909 6047
+5540 5583 5460
+5584 5583 5685
+5460 5583 5584
+5582 5683 5684
+5684 5685 5641
+5685 5686 5584
+5684 5808 5685
+5910 5686 5685
+5808 6047 5910
+6046 6171 6047
+5909 5808 5807
+5910 5685 5808
+5582 5684 5641
+5683 5807 5684
+4909 5061 4999
+5190 5333 5334
+5063 4910 5062
+4911 4785 4784
+5064 5063 5191
+5062 5190 5063
+5189 5190 5062
+5278 5333 5190
+5191 5334 5335
+5333 5460 5334
+4912 4911 5064
+4854 4786 4785
+5192 5191 5335
+5063 5190 5191
+5334 5461 5335
+5584 5686 5461
+5000 4912 5064
+4855 4787 4854
+4855 4854 4912
+4785 4725 4650
+4787 4786 4854
+4787 4725 4786
+4649 4784 4650
+4725 4651 4650
+4910 4911 4784
+4911 4854 4785
+4650 4651 4531
+4725 4787 4726
+4467 4395 4394
+4337 4338 4274
+4783 4784 4649
+4650 4531 4600
+4466 4467 4394
+4600 4531 4467
+4599 4530 4529
+4600 4467 4530
+4910 4784 4783
+4785 4650 4784
+4530 4649 4600
+4599 4528 4648
+4649 4648 4783
+4599 4529 4528
+4648 4528 4647
+4529 4466 4528
+4649 4599 4648
+4649 4530 4599
+4999 4853 4909
+4910 4783 4853
+4909 4853 4852
+4853 4783 4782
+4647 4527 4646
+4647 4528 4527
+4998 5061 4909
+5189 5062 5061
+5062 4999 5061
+5062 4910 4999
+5189 5278 5190
+5189 5277 5278
+5278 5332 5333
+5403 5458 5459
+5404 5459 5460
+5458 5539 5459
+5459 5540 5460
+5582 5583 5540
+5457 5539 5458
+5581 5582 5539
+5276 5330 5277
+5330 5403 5331
+5333 5332 5404
+5278 5277 5332
+5061 5188 5189
+5275 5329 5276
+5402 5330 5329
+5331 5277 5330
+5403 5457 5458
+5538 5580 5581
+5456 5538 5457
+5456 5455 5537
+5454 5536 5455
+5456 5457 5402
+5060 5188 5061
+5275 5276 5188
+4907 5060 4998
+5056 5057 4904
+4852 4907 4908
+4780 5059 4907
+4907 4998 4908
+5060 5061 4998
+4909 4852 4908
+4782 4646 4781
+4646 4526 4645
+4390 4389 4526
+4907 4781 4780
+4852 4782 4781
+4907 5059 5060
+5186 5274 5327
+5188 5187 5275
+5057 5058 4905
+5275 5328 5329
+5328 5186 5327
+4524 4644 4525
+4780 4646 4645
+4332 4389 4390
+4265 4264 4388
+4780 4906 5059
+4780 4645 4779
+4524 4525 4388
+4645 4526 4525
+4780 4779 4906
+4645 4525 4644
+5327 5274 5326
+5057 4905 4904
+5454 5327 5401
+5328 5187 5186
+5059 5186 5187
+5059 4906 5186
+5536 5454 5578
+5455 5402 5328
+5325 5326 5274
+5401 5327 5326
+5453 5578 5454
+5679 5756 5680
+5680 5756 5804
+5679 5802 5756
+5681 5638 5680
+5578 5577 5680
+5757 5804 5805
+5757 5680 5804
+5580 5638 5639
+5578 5680 5638
+5538 5537 5580
+5456 5402 5455
+5578 5579 5536
+5578 5638 5579
+5327 5455 5328
+5537 5538 5456
+5682 5681 5757
+5682 5639 5681
+5536 5537 5455
+5536 5579 5537
+5806 5856 5908
+5856 5804 5906
+5757 5805 5806
+5856 5907 5908
+5804 5856 5805
+5906 5905 5993
+6116 6169 6117
+6277 6327 6169
+5908 5994 6045
+5907 5993 5994
+6045 6044 6117
+5994 6043 6044
+6613 6723 6724
+6829 6948 6830
+7080 6948 6828
+7081 6949 6948
+6723 6829 6787
+6828 6948 6829
+6829 6723 6828
+6787 6724 6723
+6613 6612 6723
+6613 6465 6612
+6170 6327 6328
+6411 6325 6410
+6277 6326 6327
+6277 6168 6326
+6465 6414 6553
+6326 6325 6412
+6464 6414 6413
+6465 6327 6414
+6947 7080 6828
+7158 7159 7080
+6722 6611 6610
+6612 6553 6611
+6552 6464 6463
+6611 6553 6464
+6168 6169 6116
+6326 6168 6325
+6277 6169 6168
+5994 5993 6043
+5907 5856 5906
+5907 5906 5993
+5804 5803 5855
+5992 5905 5904
+5906 5804 5855
+5905 5855 5904
+5905 5906 5855
+6463 6411 6462
+6412 6413 6326
+6461 6410 6323
+6461 6462 6410
+6410 6462 6411
+6461 6551 6462
+6551 6552 6462
+6464 6413 6412
+6463 6412 6411
+6463 6464 6412
+6464 6552 6611
+6463 6462 6552
+6675 6722 6610
+6827 6946 7078
+6722 6947 6828
+7078 7077 7221
+6827 7078 6947
+7222 7157 7079
+6551 6609 6610
+6608 6607 6674
+6552 6551 6610
+6550 6460 6607
+6674 6721 6609
+6675 6610 6609
+6722 6827 6947
+6722 6675 6721
+6826 6721 6720
+6827 6722 6721
+6947 7078 7079
+6946 7077 7078
+6720 6674 6607
+6720 6721 6674
+6609 6608 6674
+6609 6551 6550
+6609 6550 6608
+6461 6460 6550
+6322 6323 6276
+6410 6325 6324
+6323 6410 6324
+5990 5989 6040
+6115 6039 6038
+6115 6040 6039
+6322 6276 6275
+6323 6324 6276
+5901 5801 5677
+5902 5990 5903
+5451 5324 5323
+5452 5453 5325
+5183 5056 5055
+5185 5274 5186
+5324 5184 5056
+5324 5452 5184
+6042 5991 6041
+5902 5903 5801
+5991 5904 5903
+5991 5992 5904
+5903 5802 5678
+5903 5904 5802
+5452 5577 5453
+5679 5680 5577
+4906 5058 5186
+5184 5325 5185
+5185 5057 5184
+5058 4906 4905
+5452 5325 5184
+5453 5401 5325
+4642 4723 4643
+4778 4779 4644
+4777 4778 4724
+4905 4779 4778
+5185 5058 5057
+5185 5186 5058
+4523 4524 4465
+4644 4724 4778
+4724 4644 4643
+4524 4523 4598
+4645 4644 4779
+4598 4643 4644
+4263 4387 4331
+4330 4386 4464
+4643 4723 4724
+4776 4903 4904
+4777 4904 4905
+4777 4776 4904
+4777 4723 4776
+4777 4724 4723
+4597 4464 4522
+4387 4330 4464
+4464 4597 4523
+4522 4596 4597
+4264 4263 4331
+4202 4143 4263
+4201 4143 4142
+4202 4144 4143
+4263 4264 4202
+4265 4052 4144
+3758 3929 3759
+3562 3563 3470
+4049 4050 3928
+4143 4144 4050
+3377 3468 3378
+3560 3661 3561
+3303 3377 3304
+3376 3467 3468
+3376 3468 3377
+3467 3560 3468
+3304 3305 3220
+3172 3222 3173
+3378 3469 3470
+3378 3468 3469
+3662 3562 3661
+3469 3561 3562
+3565 3564 3663
+3470 3469 3562
+3564 3470 3563
+3379 3425 3380
+3378 3306 3305
+3378 3470 3306
+3663 3662 3717
+3563 3562 3662
+3717 3760 3761
+3662 3661 3759
+3718 3717 3761
+3662 3760 3717
+3930 3838 3929
+3760 3759 3838
+3928 3929 3758
+3760 3662 3759
+4050 3929 3928
+4051 4144 4052
+4388 4264 4331
+4388 4389 4265
+4266 4265 4389
+4145 4052 4265
+4146 3930 4145
+3930 3929 4052
+3718 3761 3719
+3838 3930 3839
+3664 3565 3663
+3563 3662 3663
+3663 3718 3719
+3663 3717 3718
+4145 3930 4052
+3839 3762 3761
+4267 4266 4332
+4145 4265 4266
+4333 4267 4332
+4266 4389 4332
+4268 4146 4267
+4145 4266 4267
+4526 4391 4390
+4334 4267 4333
+4390 4334 4333
+4268 4269 4146
+3472 3565 3566
+3719 3761 3762
+3720 3762 3763
+3720 3719 3762
+3931 3839 3930
+3931 3840 3839
+3666 3568 3567
+3472 3471 3565
+3720 3664 3719
+3720 3665 3664
+3380 3427 3381
+3472 3473 3427
+3427 3382 3381
+3473 3474 3383
+3309 3308 3346
+3269 3268 3307
+3380 3346 3308
+3310 3273 3272
+3307 3379 3380
+3426 3472 3427
+3308 3307 3380
+3471 3472 3425
+3425 3426 3380
+3425 3472 3426
+3470 3564 3471
+3563 3663 3564
+3470 3379 3306
+3470 3471 3379
+3269 3307 3308
+3268 3267 3307
+3266 3267 3221
+3306 3307 3267
+3128 3171 3129
+3221 3267 3222
+3128 3129 3039
+3171 3172 3129
+3129 3172 3173
+3171 3221 3222
+3269 3222 3268
+3172 3171 3222
+3308 3270 3269
+3173 3223 3130
+3308 3309 3270
+3174 3131 3130
+3270 3309 3271
+3346 3382 3310
+3272 3224 3271
+3273 3225 3224
+3131 3174 3224
+3173 3222 3223
+3223 3174 3130
+3223 3224 3174
+2888 2889 2823
+2823 2889 2860
+2924 2958 2890
+2889 2924 2890
+2955 3039 2956
+2581 2621 2582
+2651 2691 2652
+2582 2622 2623
+2756 2797 2822
+2622 2651 2623
+2654 2653 2693
+2651 2622 2621
+2860 2889 2890
+2888 2955 2889
+3131 3040 3130
+2924 2889 2956
+2753 2820 2754
+2887 2923 2953
+2689 2650 2688
+2582 2621 2622
+2581 2619 2620
+2797 2755 2754
+2797 2756 2755
+2732 2733 2700
+2754 2755 2734
+2690 2689 2701
+2733 2754 2734
+2754 2820 2821
+2796 2819 2820
+2859 2887 2820
+2953 2954 2887
+2797 2821 2822
+2797 2754 2821
+2954 3128 3039
+3127 3220 3128
+3128 3221 3171
+3265 3305 3306
+3220 3265 3221
+3306 3267 3266
+3221 3265 3266
+3220 3305 3265
+2954 3038 3128
+3089 3126 3127
+3128 3038 3127
+2954 2953 3038
+3037 2994 2952
+3038 2953 2994
+3219 3126 3218
+3126 3037 3088
+3303 3219 3218
+3220 3127 3219
+3089 3037 3126
+3036 3087 3088
+2887 2859 2923
+2993 3037 2952
+3088 3037 3036
+3089 2994 3037
+2923 2886 2952
+2923 2859 2886
+2752 2753 2732
+2819 2859 2820
+2819 2886 2859
+2732 2753 2733
+2796 2820 2753
+2649 2699 2688
+2819 2752 2732
+2819 2796 2752
+2732 2700 2699
+2734 2701 2733
+2563 2581 2524
+2650 2618 2649
+2733 2701 2689
+2689 2690 2650
+2562 2563 2523
+2483 2476 2440
+2395 2360 2317
+2317 2298 2260
+2184 2232 2233
+2232 2259 2233
+2232 2231 2259
+2151 2084 2150
+2233 2259 2260
+1848 1789 1710
+2185 2149 2233
+1976 1845 1932
+2233 2149 2148
+2084 2151 2152
+2146 2183 2081
+2232 2184 2147
+2081 2183 2147
+2230 2231 2183
+2147 2231 2232
+2146 2229 2183
+2230 2183 2229
+2080 2146 2047
+2080 2182 2146
+2047 2081 1976
+2082 2081 2147
+2047 2146 2081
+2047 1976 1932
+2081 2082 1976
+1587 1707 1846
+1660 1659 1706
+1845 1844 1932
+1705 1843 1844
+1658 1706 1659
+1844 1845 1706
+1586 1660 1707
+1586 1585 1660
+1585 1461 1460
+1325 1254 1374
+1375 1325 1374
+1326 1254 1325
+1329 1328 1376
+1254 1326 1327
+1460 1461 1374
+1376 1327 1375
+1376 1461 1462
+1375 1374 1461
+1257 1256 1380
+1255 1254 1327
+1255 1328 1329
+1255 1327 1328
+1377 1255 1329
+1376 1377 1329
+1432 1433 1377
+1462 1587 1463
+1708 1709 1661
+1434 1433 1463
+1434 1377 1433
+1587 1846 1708
+1977 2082 2083
+1708 1846 1847
+1707 1845 1846
+1461 1587 1462
+1586 1707 1587
+1845 1977 1846
+1976 2082 1977
+2084 2083 2150
+2150 2186 2151
+1846 1978 1847
+1977 2083 1978
+1979 2084 2085
+2151 2186 2152
+1979 2085 2048
+2152 2153 2085
+2185 2150 2083
+1848 2084 1979
+1978 2083 2084
+1847 1848 1788
+1978 2084 1848
+1788 1709 1708
+1788 1710 1709
+1708 1661 1588
+1709 1710 1661
+1466 1381 1380
+1255 1377 1378
+1379 1256 1378
+1435 1434 1464
+1379 1435 1465
+1378 1434 1435
+1466 1465 1591
+1435 1464 1465
+1378 1256 1255
+1201 1202 1203
+1466 1380 1465
+1380 1256 1379
+1711 1590 1662
+1591 1465 1590
+1591 1711 1712
+1662 1789 1711
+1711 1790 1712
+1711 1789 1849
+2048 1980 1979
+1850 1790 1849
+1934 1851 1981
+2301 2320 2365
+2154 2085 2153
+2153 2152 2187
+2298 2299 2261
+2433 2440 2476
+2299 2300 2261
+2318 2360 2361
+2299 2298 2318
+2361 2395 2433
+2360 2395 2361
+2396 2397 2363
+2441 2433 2476
+2396 2361 2433
+2440 2395 2317
+2440 2433 2395
+2523 2563 2514
+2580 2619 2581
+2563 2580 2581
+2563 2562 2580
+2581 2620 2621
+2582 2524 2581
+2582 2485 2524
+2484 2441 2476
+2484 2485 2441
+2397 2396 2441
+2362 2361 2396
+2396 2363 2362
+2364 2320 2363
+2524 2485 2484
+2301 2365 2321
+2364 2397 2365
+3040 2957 2956
+2958 2924 2957
+2702 2703 2692
+2584 2652 2653
+2623 2651 2652
+2653 2692 2703
+2652 2691 2692
+2958 2996 2997
+2995 2957 3040
+2738 2799 2759
+2693 2703 2735
+2655 2707 2656
+2527 2584 2654
+2704 2737 2705
+2525 2526 2486
+2652 2692 2653
+2654 2693 2704
+2653 2703 2693
+2623 2583 2582
+2583 2652 2584
+2525 2486 2442
+2488 2489 2444
+2526 2527 2515
+2654 2655 2527
+1984 1983 2052
+2368 2399 2400
+2397 2398 2365
+2400 2443 2401
+2399 2368 2367
+2367 2366 2399
+2366 2398 2399
+2397 2485 2442
+2654 2584 2653
+2527 2526 2584
+2652 2583 2623
+2584 2526 2583
+2582 2525 2485
+2583 2526 2525
+2399 2442 2486
+2398 2397 2442
+2302 2301 2321
+2263 2320 2301
+2264 2302 2321
+1982 1852 1934
+1982 1853 1852
+1592 1468 1467
+2302 2236 2301
+1852 1851 1934
+1933 1851 1850
+1852 1791 1851
+1465 1380 1379
+1330 1382 1331
+1790 1791 1712
+1713 1592 1591
+1331 1257 1330
+1260 1261 1199
+1380 1381 1257
+1466 1467 1382
+1852 1713 1791
+1855 1854 1986
+1381 1382 1330
+1381 1466 1382
+1381 1330 1257
+1382 1383 1332
+1332 1331 1382
+1332 1257 1331
+1591 1592 1466
+1715 1714 1854
+1466 1592 1467
+1713 1853 1714
+1852 1853 1713
+1853 1982 1983
+2052 2088 2089
+2052 2051 2088
+2443 2400 2399
+2400 2369 2368
+1984 2052 2089
+1983 2051 2052
+1714 1468 1592
+1384 1334 1383
+1468 1384 1383
+1333 1257 1332
+1334 1333 1383
+1258 1257 1333
+1335 1334 1384
+1335 1258 1334
+1713 1714 1592
+1853 1854 1714
+1854 1984 1985
+1854 1853 1984
+1469 1384 1468
+1385 1259 1336
+1336 1258 1335
+1336 1259 1258
+1334 1258 1333
+1260 1259 1386
+1260 1258 1259
+1384 1336 1335
+1384 1385 1336
+1714 1469 1468
+1386 1259 1385
+1986 2054 2055
+2053 1985 2090
+1386 1469 1470
+1385 1384 1469
+1470 1715 1716
+1469 1714 1715
+2371 2401 2372
+2404 2445 2446
+2403 2444 2445
+2444 2490 2445
+2372 2401 2402
+2489 2490 2444
+2736 2737 2704
+2758 2798 2799
+2401 2443 2444
+2487 2527 2488
+2527 2655 2528
+2706 2707 2655
+2402 2401 2444
+2370 2369 2400
+2486 2443 2399
+2401 2370 2400
+2515 2487 2486
+2488 2444 2443
+2486 2487 2443
+2515 2527 2487
+2655 2705 2706
+2654 2705 2655
+2654 2704 2705
+2705 2758 2738
+2737 2736 2757
+2737 2757 2758
+2736 2735 2757
+2757 2798 2758
+2960 2891 2925
+2824 2757 2925
+2959 2960 2925
+2861 2799 2824
+2891 2824 2925
+2826 2892 2962
+3000 2961 2926
+2961 2962 2892
+2891 2861 2824
+2891 2926 2861
+2759 2799 2825
+2798 2824 2799
+2705 2738 2706
+2758 2799 2738
+2760 2707 2826
+2799 2861 2825
+2706 2759 2707
+2706 2738 2759
+2960 3000 2926
+3045 3137 3138
+3093 3045 3000
+3136 3179 3093
+3228 3314 3315
+3179 3137 3093
+3179 3230 3137
+3000 3045 2961
+3093 3137 3045
+3138 3230 3318
+3229 3277 3230
+3179 3229 3230
+3179 3136 3228
+3389 3318 3388
+3230 3277 3317
+3317 3350 3388
+3477 3519 3570
+3315 3349 3316
+3386 3387 3350
+3317 3277 3316
+3229 3228 3277
+3179 3228 3229
+3276 3314 3228
+3277 3315 3316
+3277 3228 3315
+3387 3429 3388
+3387 3386 3477
+3387 3477 3429
+3476 3475 3519
+3316 3349 3350
+3385 3428 3386
+3350 3349 3386
+3315 3314 3348
+3134 3133 3177
+3044 3136 3093
+3000 3044 3093
+3000 2960 3044
+2891 2960 2926
+2999 3043 3044
+2960 2999 3044
+2959 2999 2960
+3178 3135 3134
+3226 3178 3177
+3227 3226 3276
+3274 3275 3225
+3227 3178 3226
+3092 3134 3135
+3091 3090 3134
+2997 3042 2998
+3090 3041 3132
+2995 2958 2957
+3132 3040 3131
+3041 2996 2995
+3041 2995 3040
+2996 2958 2995
+3224 3175 3131
+3224 3225 3175
+3225 3176 3175
+3177 3132 3176
+3134 3090 3133
+3091 3042 3090
+3310 3311 3273
+3275 3226 3225
+3309 3272 3271
+3273 3224 3272
+3346 3310 3309
+3382 3383 3310
+3383 3474 3475
+3473 3472 3566
+3311 3383 3347
+3382 3473 3383
+3312 3311 3347
+3274 3273 3311
+3384 3475 3428
+3474 3567 3475
+3312 3275 3274
+3312 3313 3275
+3348 3384 3385
+3347 3383 3384
+3313 3348 3314
+3313 3347 3348
+3386 3428 3477
+3385 3384 3428
+3428 3476 3477
+3428 3475 3476
+3475 3568 3519
+3568 3667 3623
+3669 3668 3721
+3764 3763 3840
+3808 3764 3841
+3840 3933 3841
+3623 3667 3668
+3623 3569 3568
+3667 3764 3721
+3667 3666 3764
+3519 3568 3569
+3665 3565 3664
+3665 3566 3565
+3567 3473 3566
+3475 3567 3568
+3474 3473 3567
+3763 3665 3720
+3763 3764 3666
+3568 3666 3667
+3567 3566 3666
+4146 4053 3931
+3933 3840 3932
+3930 4146 3931
+4270 4271 4203
+4053 4146 4147
+4145 4267 4146
+3932 4053 4054
+3932 3931 4053
+4390 4391 4334
+4392 4335 4269
+4391 4268 4334
+4269 4147 4146
+4391 4392 4268
+4335 4271 4270
+4527 4392 4391
+4527 4528 4393
+4269 4270 4203
+4269 4335 4270
+4053 4147 4054
+4147 4269 4203
+4271 4148 4203
+3936 4058 3844
+4149 4055 4148
+4054 4147 4148
+4272 4393 4394
+4335 4392 4393
+4148 4055 4054
+4148 4271 4149
+4272 4150 4149
+4108 4055 4149
+4272 4273 4150
+3997 3936 3935
+4054 3934 3933
+3935 3936 3887
+3933 3886 3841
+3934 3887 3842
+3765 3808 3766
+3886 3934 3842
+3722 3809 3767
+3842 3887 3809
+3721 3765 3766
+3721 3764 3765
+3886 3808 3841
+3842 3766 3808
+3478 3520 3571
+3429 3477 3520
+3671 3670 3722
+3624 3520 3570
+3671 3624 3670
+3671 3672 3571
+3934 3935 3887
+4056 4108 4057
+4055 3997 3934
+4055 4056 3997
+3767 3843 3844
+3809 3887 3843
+3522 3479 3521
+3388 3429 3478
+3521 3571 3572
+3520 3624 3571
+3573 3523 3572
+3478 3571 3521
+4150 4057 4108
+4058 3936 4057
+3936 3997 4057
+4055 4108 4056
+3934 3997 3935
+4056 4057 3997
+4394 4273 4272
+4274 4275 4151
+4149 4150 4108
+4275 4338 4339
+4395 4336 4273
+4395 4531 4532
+4273 4274 4150
+4273 4336 4274
+4395 4396 4336
+4396 4397 4338
+4277 4276 4340
+4151 4058 4150
+4204 4275 4276
+4274 4338 4275
+4204 4151 4275
+4152 4109 4151
+3937 3844 4058
+3573 3672 3768
+3572 3571 3672
+3998 3937 4059
+3998 3999 3938
+3672 3573 3572
+3390 3430 3391
+4204 4152 4151
+4204 4153 4152
+4151 4109 4059
+4152 4153 4109
+4061 3998 4060
+3998 4061 3999
+4060 4109 4061
+3845 3768 3937
+3769 3673 3768
+3674 3625 3673
+3888 3845 3938
+3939 3940 3890
+3845 3769 3768
+3889 3939 3890
+4401 4342 4341
+4155 4154 4205
+4061 4154 4110
+4279 4278 4341
+4153 4205 4154
+4153 4278 4205
+4400 4399 4469
+4340 4339 4399
+4341 4277 4340
+4401 4400 4469
+4341 4340 4400
+4155 4279 4280
+4205 4278 4279
+4155 4063 4110
+4063 4000 4062
+4000 4063 3939
+4062 4110 4063
+4469 4470 4401
+4280 4279 4342
+4731 4732 4657
+4538 4402 4470
+4281 4342 4402
+4065 4003 4002
+4156 4280 4206
+4207 4281 4208
+4280 4342 4281
+4066 4065 4158
+4206 4281 4207
+4065 4157 4158
+4206 4207 4157
+4065 4064 4157
+4063 4155 4156
+4157 4156 4206
+4064 4063 4156
+4065 4001 4064
+3940 4064 4001
+4003 3940 4002
+4003 4065 4066
+4002 4001 4065
+3939 4064 3940
+3625 3675 3626
+3625 3674 3675
+3673 3769 3723
+3674 3723 3675
+3938 3999 4000
+4000 3888 3938
+3575 3524 3574
+3574 3673 3625
+3574 3524 3481
+3625 3626 3575
+3524 3482 3481
+3524 3575 3482
+2740 2711 2710
+3390 3391 3352
+3047 3094 3048
+3627 3575 3626
+3483 3482 3575
+3576 3575 3627
+3484 3483 3576
+2862 2829 2828
+2709 2739 2710
+2709 2762 2739
+2694 2710 2711
+2739 2740 2710
+2624 2659 2711
+2624 2588 2587
+2494 2493 2518
+2530 2529 2585
+2658 2694 2659
+2658 2710 2694
+2531 2518 2530
+2761 2760 2828
+2585 2708 2657
+2762 2829 2763
+2739 2763 2740
+2829 2862 2763
+2708 2761 2762
+2761 2828 2800
+2657 2708 2709
+2656 2760 2708
+2739 2762 2763
+2709 2708 2762
+2762 2761 2800
+2708 2760 2761
+3001 3002 2964
+3047 3048 3002
+2828 2827 2894
+3138 3046 2962
+3046 3139 3047
+3319 3320 3231
+3232 3094 3139
+3046 3047 3001
+3139 3094 3047
+3231 3232 3139
+3351 3390 3352
+3481 3482 3430
+3231 3320 3232
+3673 3574 3573
+3625 3575 3574
+3319 3351 3320
+3352 3320 3351
+3351 3389 3390
+3480 3574 3481
+3478 3521 3479
+3480 3573 3574
+3389 3479 3480
+3522 3572 3523
+3573 3480 3523
+3481 3389 3480
+3480 3479 3523
+3521 3572 3522
+3478 3479 3388
+3522 3523 3479
+3388 3318 3317
+3389 3351 3319
+3045 3138 2962
+3137 3230 3138
+3318 3319 3231
+3318 3389 3319
+2963 3046 3001
+3138 3231 3046
+2964 2893 2963
+2826 2825 2892
+2827 2826 2893
+2827 2760 2826
+2964 2963 3001
+2893 2962 2963
+2516 2492 2491
+2158 2241 2193
+2402 2403 2374
+2402 2444 2403
+2517 2492 2516
+2445 2490 2491
+2658 2586 2657
+2529 2656 2585
+2531 2530 2585
+2516 2529 2530
+2492 2517 2518
+2516 2530 2517
+2493 2492 2518
+2445 2491 2492
+2494 2518 2531
+2517 2530 2518
+2407 2406 2447
+2406 2381 2380
+2405 2404 2446
+2477 2493 2494
+2477 2492 2493
+2403 2445 2404
+2477 2447 2446
+2379 2378 2405
+2379 2405 2380
+2241 2242 2193
+2192 2240 2241
+2404 2405 2378
+1986 2055 1987
+2377 2404 2378
+2375 2374 2403
+2376 2403 2404
+2056 1987 2055
+2191 2240 2192
+1792 1793 1717
+2159 2094 2193
+1716 1792 1717
+1938 1937 2059
+1856 1716 1855
+1855 1986 1987
+1856 1855 1935
+1715 1854 1855
+2057 1936 1935
+1593 1470 1716
+1936 1856 1935
+2094 2093 2158
+2160 2095 2195
+2158 2193 2094
+1856 1792 1716
+1387 1388 1337
+1339 1261 1338
+1470 1471 1387
+1389 1339 1388
+1387 1471 1388
+1593 1594 1537
+1989 1856 1936
+1663 1717 1718
+1593 1716 1717
+1792 1937 1793
+2095 2159 2195
+1792 1857 1937
+1792 1856 1857
+1989 2094 1990
+2094 2058 2093
+1857 1856 1989
+2059 2094 2159
+1989 2058 2094
+1794 1859 1940
+1858 1717 1793
+1939 1940 1859
+1992 1941 1860
+1794 1795 1719
+1940 1992 1860
+1663 1594 1593
+1795 1794 1940
+1719 1718 1794
+1717 1663 1593
+1537 1538 1472
+1388 1339 1338
+1389 1261 1339
+1593 1537 1471
+1538 1596 1597
+1471 1472 1389
+1537 1595 1538
+1719 1663 1718
+1719 1795 1664
+1594 1595 1537
+1594 1663 1595
+1472 1538 1473
+1597 1720 1665
+1264 1199 1263
+1391 1263 1262
+1389 1390 1262
+1473 1540 1474
+1538 1539 1473
+1722 1721 1861
+1597 1665 1540
+1392 1340 1264
+1539 1597 1540
+1993 1861 1941
+1595 1596 1538
+1595 1719 1664
+1538 1597 1539
+1596 1720 1597
+1595 1664 1596
+1795 1720 1664
+1795 1860 1720
+1795 1940 1860
+1720 1796 1665
+1720 1860 1796
+1940 1991 1992
+2096 2097 1992
+1940 1939 1991
+2161 2162 2096
+2160 2161 2096
+1858 1938 1939
+1937 1990 2059
+1992 1991 2096
+2095 1991 2059
+2095 2096 1991
+1991 1939 1938
+1718 1717 1858
+2159 2194 2195
+2159 2193 2194
+1938 2059 1991
+1990 2094 2059
+2096 2095 2160
+2059 2159 2095
+2406 2382 2381
+2405 2406 2380
+2447 2406 2405
+2407 2382 2406
+2586 2531 2657
+2586 2495 2531
+2495 2494 2531
+2495 2447 2494
+2494 2447 2477
+2495 2407 2447
+2659 2586 2658
+2587 2532 2586
+2407 2383 2382
+2383 2408 2324
+2324 2323 2383
+2322 2383 2323
+2407 2408 2383
+2564 2532 2587
+2533 2496 2532
+2407 2448 2408
+2495 2532 2448
+1473 1474 1390
+1540 1598 1474
+1475 1601 1476
+1601 1602 1476
+1266 1393 1267
+1395 1476 1396
+1394 1393 1475
+1475 1392 1474
+1267 1394 1395
+1267 1393 1394
+1477 1478 1398
+1730 1731 1605
+1478 1479 1400
+1478 1730 1479
+1482 1481 1543
+1481 1480 1542
+1402 1481 1436
+1542 1543 1481
+1395 1396 1341
+1343 1344 1270
+1605 1480 1479
+1606 1666 1667
+1477 1397 1396
+1477 1398 1397
+1478 1399 1398
+1478 1400 1399
+1479 1401 1400
+1480 1481 1402
+1146 1215 1216
+1401 1480 1402
+1344 1345 1271
+1344 1398 1345
+1208 1207 1271
+1345 1398 1346
+1393 1266 1340
+1265 1200 1264
+1396 1342 1341
+1396 1397 1343
+1269 1343 1270
+1342 1396 1343
+1262 1263 1199
+1391 1392 1263
+1392 1264 1263
+1265 1266 1200
+1340 1265 1264
+1266 1267 1201
+1267 1268 1203
+1342 1343 1269
+1204 1269 1270
+1268 1341 1269
+1270 1271 1206
+1345 1346 1271
+1209 1272 1210
+1346 1399 1272
+1199 1264 1200
+1204 1200 1201
+1200 1266 1201
+1204 1203 1269
+1202 1267 1203
+1209 1204 1205
+1108 1148 1109
+1207 1205 1206
+1204 1270 1205
+1207 1208 1205
+1210 1211 1144
+1271 1207 1206
+1271 1272 1208
+1209 1208 1272
+1209 1205 1208
+1211 1212 1144
+1214 1145 1144
+1274 1214 1213
+1277 1402 1403
+1108 1146 1147
+1214 1215 1145
+1217 1218 1147
+1145 1215 1146
+1275 1401 1276
+1146 1216 1217
+1215 1276 1216
+1277 1276 1402
+1215 1275 1276
+1272 1273 1210
+1212 1213 1144
+1273 1212 1211
+1273 1274 1212
+1210 1273 1211
+1272 1400 1273
+1212 1274 1213
+1273 1400 1274
+1214 1275 1215
+1214 1274 1275
+1149 1148 1278
+1218 1277 1278
+1279 1149 1278
+1218 1217 1277
+1110 1052 1109
+1147 1146 1217
+1148 1147 1218
+1109 1051 1108
+1149 1109 1148
+1150 1111 1149
+1110 1111 1052
+1109 1052 1051
+1113 1114 1053
+1149 1110 1109
+1111 1112 1052
+1149 1111 1110
+1112 1113 1052
+1150 1112 1111
+1150 1113 1112
+1054 1053 1115
+1115 1053 1114
+1054 1153 1055
+1281 1152 1221
+1153 1054 1152
+1410 1348 1347
+1154 1282 1222
+1153 1281 1282
+1221 1280 1281
+1149 1279 1150
+1279 1280 1219
+1221 1151 1220
+1114 1113 1151
+1406 1279 1405
+1219 1150 1279
+1281 1407 1282
+1281 1280 1406
+1437 1408 1489
+1409 1282 1408
+1490 1437 1489
+1409 1408 1437
+1615 1550 1549
+1551 1491 1490
+1550 1490 1489
+1489 1548 1549
+1614 1487 1613
+1407 1487 1488
+1407 1281 1406
+1489 1549 1550
+1548 1614 1615
+1487 1406 1486
+1280 1279 1406
+1216 1277 1217
+1216 1276 1277
+1279 1404 1405
+1403 1436 1483
+1278 1403 1404
+1278 1277 1403
+1404 1485 1405
+1404 1403 1484
+1739 1613 1672
+1487 1486 1547
+1484 1544 1485
+1544 1611 1545
+1436 1482 1483
+1436 1481 1482
+1544 1484 1610
+1485 1404 1484
+1808 1736 1669
+1736 1610 1609
+1484 1609 1610
+1543 1608 1669
+1611 1544 1610
+1545 1485 1544
+1486 1546 1547
+1546 1611 1612
+1547 1546 1612
+1486 1485 1546
+1612 1613 1547
+1740 1673 1614
+1740 1741 1673
+1488 1614 1548
+1613 1740 1614
+1673 1674 1615
+1809 1885 1810
+1810 1741 1809
+1808 1669 1735
+1609 1543 1669
+1608 1735 1669
+1734 1807 1735
+1670 1738 1671
+1883 1884 1739
+1738 1739 1672
+1884 1740 1739
+1886 1952 1887
+1873 2001 1874
+1882 1738 1737
+1738 1883 1739
+1878 1808 1735
+1879 1880 1736
+1669 1736 1609
+1808 1879 1736
+1882 1737 1881
+1670 1611 1737
+1731 1732 1666
+1806 1877 1807
+1805 1731 1874
+1876 1877 1806
+1666 1732 1733
+1731 1805 1732
+1667 1666 1733
+1605 1731 1666
+1734 1668 1606
+1735 1668 1734
+1606 1480 1605
+1877 1878 1807
+1541 1480 1606
+1541 1606 1607
+1605 1666 1606
+1608 1541 1607
+1608 1542 1541
+1477 1604 1478
+1477 1603 1604
+1396 1476 1477
+1602 1726 1603
+1604 1729 1478
+1872 1871 1950
+1474 1391 1390
+1600 1723 1601
+1599 1600 1475
+1599 1721 1722
+1394 1476 1395
+1602 1603 1476
+1392 1475 1393
+1600 1601 1475
+1665 1598 1540
+1665 1796 1721
+1599 1474 1598
+1392 1391 1474
+1665 1721 1598
+1796 1861 1721
+1723 1722 1862
+1600 1599 1722
+1474 1599 1475
+1598 1721 1599
+1798 1724 1797
+1725 1726 1602
+1724 1723 1797
+1600 1722 1723
+1995 1996 1797
+1864 1799 1798
+1995 1862 1994
+1722 1861 1862
+1723 1863 1797
+1723 1862 1863
+1798 1799 1724
+1727 1802 1868
+1867 1801 1866
+1724 1725 1602
+1728 1727 1803
+1604 1603 1727
+1478 1729 1730
+1604 1728 1729
+1728 1803 1804
+1729 1728 1804
+1604 1727 1728
+1864 1996 1942
+1799 1942 1865
+2496 2449 2448
+1797 1996 1864
+1995 2102 1996
+1799 1864 1942
+1798 1797 1864
+1861 1994 1862
+1992 1993 1941
+1993 2060 1994
+1993 2097 2060
+2101 2061 2100
+1995 2101 2102
+1995 2061 2101
+2097 2098 2060
+2659 2624 2587
+2533 2532 2564
+4157 4208 4158
+4537 4470 4469
+2588 2564 2587
+2533 2588 2624
+2533 2564 2588
+2448 2449 2408
+2324 2409 2325
+2266 2305 2325
+2305 2304 2325
+4158 4111 4066
+1946 1868 1945
+1868 1803 1727
+1869 1803 1868
+1945 1802 1867
+1801 1725 1800
+1866 1865 1943
+1800 1725 1799
+1866 1801 1865
+1801 1726 1725
+1865 1801 1800
+1802 1726 1867
+1945 1868 1802
+1869 1870 1803
+1947 1870 1869
+1948 1871 1870
+1946 1869 1868
+1946 1947 1869
+1729 1871 1872
+1729 1804 1871
+1730 1873 1874
+1730 1729 1872
+1730 1872 1873
+1871 1949 1950
+2001 1873 1951
+1951 1872 1950
+1999 1947 1946
+1948 1870 1947
+1999 1948 1947
+1949 1871 1948
+1950 1999 2000
+1950 1949 1999
+1951 1950 2000
+4863 4862 4923
+5010 5077 5078
+4924 5010 5011
+4924 4863 4923
+5076 5009 4921
+5009 5010 4923
+5009 4923 4922
+5010 4924 4923
+4862 4921 4922
+4920 5075 5076
+4920 4919 5075
+5008 5007 5073
+4862 4920 4921
+4918 5008 4919
+5199 5075 5074
+5009 5076 5077
+4921 4920 5076
+5010 5009 5077
+4922 4921 5009
+5279 5201 5339
+5077 5076 5201
+5338 5200 5467
+5076 5075 5200
+5585 5468 5467
+5201 5200 5338
+5200 5466 5467
+5199 5198 5465
+5586 5541 5468
+5585 5586 5468
+5468 5339 5338
+5468 5469 5405
+5405 5469 5078
+5405 5339 5468
+5340 5405 5078
+5340 5339 5405
+5202 5138 5201
+5078 5077 5138
+5078 5279 5340
+5078 5138 5202
+5279 5202 5201
+5279 5078 5202
+5586 5587 5541
+5692 5693 5585
+5919 6057 6058
+5693 5586 5585
+5642 5587 5586
+5815 5816 5693
+5759 5694 5693
+5862 5919 5920
+5694 5642 5586
+5816 5817 5759
+5817 5642 5694
+5759 5817 5694
+5863 5920 5817
+5816 5863 5817
+5816 5815 5862
+6121 6058 6057
+6122 5920 6058
+5814 5919 5815
+6058 5920 5919
+5816 5862 5863
+5815 5919 5862
+6121 6181 6182
+6278 6336 6337
+6337 6279 6278
+6182 6181 6279
+6182 6279 6337
+6474 6336 6473
+6337 6336 6474
+6057 6180 6181
+6057 5918 6180
+5692 5691 5814
+6056 6055 6178
+6278 6180 6336
+6278 6181 6180
+6181 6121 6057
+6182 6122 6121
+5466 5691 5467
+5814 5918 5919
+5467 5691 5692
+5466 5690 5691
+5692 5814 5815
+5691 5813 5814
+6179 6178 6471
+6554 6555 6473
+5917 5861 5916
+6472 6615 6554
+6791 6732 6676
+6615 6676 6677
+6335 6472 6473
+6615 6677 6555
+6556 6473 6555
+7037 7174 6963
+7174 6841 6897
+7174 7097 7173
+7037 6963 6962
+7311 7312 7236
+7097 7037 7096
+6961 7096 6962
+6897 6841 6840
+7037 6962 7096
+6963 6897 6962
+6838 6961 6839
+6962 6840 6839
+6791 6838 6839
+7036 6958 7035
+7036 7094 6960
+7235 7096 7095
+6676 6614 6731
+6470 6729 6471
+6729 6836 6730
+6791 6676 6731
+6615 6472 6614
+6676 6732 6677
+6791 6839 6732
+6473 6472 6554
+6334 6176 6470
+6334 6471 6178
+6614 6676 6615
+6730 6614 6471
+6730 6731 6614
+6472 6179 6471
+6120 6054 6119
+5915 5860 5859
+5915 6055 5916
+5688 5809 5689
+5860 5861 5811
+6056 5917 5916
+5812 5811 5861
+6179 5918 5917
+5861 5860 5916
+6180 5918 6179
+5916 6055 6056
+6179 5917 6056
+5918 5813 5917
+6180 6179 6335
+6056 6178 6179
+5814 5813 5918
+5691 5690 5813
+5464 5689 5465
+5812 5813 5690
+5465 5198 5337
+5199 5074 5073
+5464 5465 5337
+5690 5466 5465
+5136 5197 5137
+5337 5198 5197
+5136 5137 5071
+5198 5073 5072
+5072 5073 5006
+5198 5199 5073
+5007 5008 4918
+5073 5074 5008
+5071 5072 5006
+5137 5198 5072
+5006 5007 4918
+5006 5073 5007
+4208 4281 4657
+5069 5136 5070
+5068 5195 5196
+5136 5071 5070
+5137 5072 5071
+4730 4794 4731
+4794 4917 4795
+4158 4657 4732
+4538 4470 4537
+4730 4731 4656
+4795 4732 4731
+4537 4655 4538
+4657 4281 4538
+4792 4730 4655
+4793 4794 4730
+4860 4861 4792
+4917 5005 5071
+4792 4793 4730
+4859 4860 4791
+4731 4794 4795
+4793 4792 4861
+4793 4861 4794
+5005 5070 5071
+5004 5005 4917
+5069 5070 5005
+5004 5069 5005
+5068 5196 5069
+4794 4861 4917
+5068 5069 5004
+4917 4861 5003
+4858 4790 4789
+5004 5003 5068
+5004 4917 5003
+4858 4915 4859
+5002 5001 5067
+5003 5002 5068
+5193 5065 5134
+5068 5002 5067
+5003 4861 5002
+5195 5135 5194
+5066 4914 4913
+5067 5066 5135
+5001 5002 4916
+5001 4916 4915
+5002 4861 4916
+4791 4654 4729
+4655 4656 4538
+4792 4791 4860
+4792 4654 4791
+4860 4859 4916
+4791 4790 4858
+4792 4655 4654
+4730 4656 4655
+4399 4535 4469
+4654 4655 4537
+4657 4538 4656
+4281 4402 4538
+4653 4602 4535
+4602 4537 4536
+4537 4602 4654
+4535 4468 4534
+4602 4653 4654
+4654 4653 4729
+4534 4653 4535
+4728 4729 4653
+4535 4398 4468
+4399 4339 4398
+4536 4535 4602
+4536 4469 4535
+4397 4533 4468
+4601 4652 4727
+4336 4396 4337
+4531 4651 4532
+4468 4533 4534
+4532 4651 4652
+4396 4532 4533
+4396 4395 4532
+4653 4601 4727
+4533 4532 4652
+4534 4601 4653
+4533 4652 4601
+4652 4726 4788
+4651 4725 4726
+4913 5000 5065
+4913 4912 5000
+4913 4855 4912
+4913 4856 4855
+5000 5064 5065
+4911 5063 5064
+5336 5194 5193
+5064 5191 5192
+5193 5194 5066
+5193 5066 5065
+4915 4858 4857
+4789 4727 4788
+4727 4728 4653
+4727 4789 4728
+4858 4789 4857
+4790 4728 4789
+4914 4915 4857
+4859 4791 4858
+5066 5001 4914
+4916 4859 4915
+4914 5001 4915
+5066 5067 5001
+5912 5688 5687
+5915 5858 5914
+5911 6049 5912
+6177 6176 6334
+5912 6051 5913
+6175 6176 6051
+5463 5195 5336
+5068 5067 5195
+5462 5463 5336
+5688 5464 5463
+5195 5194 5336
+5135 5066 5194
+5335 5193 5192
+5335 5336 5193
+5461 5462 5335
+5687 5463 5462
+6048 6049 5911
+6175 6051 6050
+5911 5912 5687
+6050 6051 5912
+6049 6050 5912
+6049 6175 6050
+6953 6728 6727
+6729 6730 6471
+6727 6469 6468
+6175 6174 6333
+6175 6469 6176
+6333 6468 6469
+6955 7030 7031
+6954 7087 7088
+6729 6834 6835
+6728 6954 6834
+7091 7032 7031
+6835 6834 6955
+7031 7032 6955
+7232 7172 7171
+5996 6052 6053
+5913 6051 6052
+6957 6956 7034
+6956 6835 6955
+6469 6470 6176
+6469 6728 6470
+6728 6729 6470
+6835 6836 6729
+7034 6956 7033
+6894 6835 6956
+7092 7093 7034
+6957 6894 6956
+7035 6957 7034
+7035 6958 6957
+7233 7093 7092
+7035 7034 7093
+6957 6958 6894
+6837 6730 6836
+6959 6896 6895
+6895 6836 6894
+6177 6334 6178
+6470 6471 6334
+6053 6119 6054
+6052 6176 6119
+5997 5996 6053
+5914 5913 5996
+5997 6053 6054
+6052 6119 6053
+5913 5809 5688
+5689 5810 5811
+5998 5997 6054
+5998 5914 5997
+6055 6120 6178
+6119 6176 6177
+5914 5858 5809
+5914 5998 5915
+5337 5196 5464
+5136 5069 5196
+5690 5689 5811
+5464 5688 5689
+5811 5810 5860
+5689 5809 5810
+5810 5859 5860
+5810 5858 5859
+5858 5915 5859
+5998 6055 5915
+6960 6896 6959
+6837 6836 6896
+6959 6895 6958
+6896 6836 6895
+6178 6120 6177
+6055 6054 6120
+7093 7036 7035
+6960 6837 6896
+6958 7036 6959
+7093 7234 7094
+7036 6960 6959
+7095 6961 6960
+7498 7364 7497
+7094 7036 7093
+7095 7094 7234
+7095 6960 7094
+7623 7767 7768
+7983 7917 7982
+7770 7769 7916
+7363 7364 7234
+7498 7499 7364
+7980 7981 7915
+7916 7915 7981
+8185 8137 8184
+8138 8139 8032
+8031 8030 8088
+8031 7981 8030
+7769 7847 7915
+7623 7496 7767
+8087 8030 7980
+8030 7981 7980
+8224 8223 8317
+7980 7914 7913
+8136 8087 8135
+8087 8088 8030
+8135 8087 8029
+8136 8088 8087
+8135 8134 8182
+8029 7913 8028
+8026 8222 8027
+8134 8135 8028
+8136 8135 8183
+8029 8028 8135
+7622 7766 7495
+8028 7913 7767
+7623 7768 7769
+7767 7913 7768
+7768 7847 7769
+7768 7913 7847
+7362 7363 7233
+7496 7497 7363
+7172 7232 7233
+7496 7623 7497
+7361 7496 7362
+7495 7766 7496
+7032 7092 7033
+7091 7172 7092
+7031 7090 7091
+7031 7030 7090
+7234 7233 7363
+7092 7172 7233
+7231 7232 7171
+7310 7233 7232
+7308 7307 7359
+7088 7089 7030
+6954 7088 7030
+7169 7231 7170
+7088 7087 7168
+6953 7086 7087
+7168 7229 7230
+7307 7228 7227
+7307 7308 7228
+7087 7167 7168
+7087 7166 7167
+7168 7230 7169
+7229 7228 7308
+7360 7431 7495
+7359 7358 7430
+7360 7359 7431
+7307 7358 7359
+7360 7308 7359
+7230 7229 7308
+7430 7494 7431
+7621 7622 7494
+7911 7912 7765
+7495 7494 7622
+7766 7912 8027
+7911 8026 7912
+7767 8027 8028
+7912 8026 8027
+7361 7360 7495
+7309 7230 7308
+7496 7766 7767
+7622 7765 7766
+7230 7309 7231
+7360 7361 7309
+7496 7361 7495
+7362 7233 7310
+7309 7310 7232
+7361 7362 7310
+8390 8389 8443
+8317 8223 8387
+8594 8483 8482
+8538 8537 8592
+8481 8538 8593
+8480 8537 8538
+8028 8133 8134
+8027 8223 8133
+8482 8481 8593
+8442 8480 8481
+8318 8224 8317
+8222 8387 8223
+8477 8535 8536
+8591 8535 8534
+8386 8477 8387
+8386 8476 8477
+8478 8479 8441
+8781 8980 8782
+8894 8895 8780
+8746 8698 8697
+8780 8895 8781
+8947 8948 8893
+8780 8779 8853
+8893 8948 8894
+8894 8978 8895
+8853 8894 8780
+8948 8977 8978
+8781 8699 8780
+8894 8948 8978
+8698 8660 8659
+8698 8780 8699
+8781 8700 8699
+8661 8592 8660
+8593 8661 8700
+8593 8592 8661
+8701 8700 8781
+8661 8699 8700
+8979 8781 8895
+8782 8701 8781
+8977 9069 8978
+9392 9391 9654
+8701 8594 8593
+8225 8280 8226
+8700 8701 8593
+8594 8484 8483
+8483 8391 8444
+8391 8392 8321
+8443 8389 8442
+8481 8443 8442
+8482 8444 8443
+8388 8318 8317
+8389 8390 8360
+8223 8224 8133
+8318 8280 8224
+8182 8225 8226
+8224 8280 8225
+8135 8182 8183
+8134 8224 8182
+8361 8320 8319
+8390 8391 8361
+8320 8227 8281
+8229 8392 8393
+8320 8321 8227
+8228 8185 8184
+8227 8228 8184
+8321 8392 8229
+8227 8321 8228
+8320 8391 8321
+8444 8391 8390
+8484 8392 8391
+8361 8319 8360
+8320 8281 8319
+8390 8361 8360
+8391 8320 8361
+8443 8444 8390
+8483 8484 8391
+8482 8483 8444
+8482 8593 8594
+8782 8594 8701
+8782 8783 8594
+8321 8229 8228
+8138 8032 8089
+8185 8138 8137
+8137 8138 8089
+8185 8229 8138
+8139 8229 8230
+8185 8228 8229
+8783 8595 8594
+8784 8596 8595
+8980 8981 8782
+8784 8595 8783
+8783 8981 8982
+9396 9395 9658
+8785 8784 8983
+9397 9519 9520
+8982 8784 8783
+8982 8983 8784
+8597 8394 8393
+8230 8229 8393
+8392 8596 8393
+8784 8785 8596
+8139 8033 8032
+7918 7850 7849
+8034 7984 8033
+8034 7920 7919
+8230 8231 8034
+8140 8036 8035
+8034 7919 7984
+7920 7774 7773
+7983 7918 7917
+7850 7772 7849
+7983 7984 7918
+7918 7849 7917
+8032 8033 7983
+8032 7983 7982
+8033 7984 7983
+7916 7848 7770
+7848 7771 7770
+7624 7498 7497
+7623 7624 7497
+7770 7695 7624
+7624 7625 7563
+7919 7773 7850
+7695 7564 7625
+7432 7366 7365
+7499 7563 7564
+7498 7624 7563
+7364 7499 7365
+7498 7563 7499
+7564 7500 7499
+7234 7235 7095
+7365 7366 7311
+7365 7311 7235
+7312 7237 7236
+7235 7236 7096
+7235 7311 7236
+7432 7499 7500
+7366 7312 7311
+7366 7432 7312
+7174 7173 7238
+7097 7096 7173
+6963 7174 6897
+7565 7626 7627
+7696 7626 7565
+7627 7566 7565
+7696 7697 7626
+7628 7566 7627
+7921 7775 7774
+7921 7922 7851
+7773 7697 7696
+7697 7698 7627
+7772 7773 7696
+7774 7698 7697
+7850 7773 7772
+7919 7920 7773
+7773 7774 7697
+7920 7921 7774
+7851 7775 7921
+7628 7698 7775
+8596 8597 8393
+8231 8140 8035
+8703 8704 8662
+8141 8090 8140
+8395 8322 8394
+8396 8485 8486
+8394 8231 8230
+8232 8140 8231
+8485 8395 8394
+8539 8600 8540
+8322 8232 8231
+7922 7985 7986
+7922 7921 7985
+8234 8090 8187
+7986 8036 8090
+8322 8323 8232
+8186 8233 8187
+8186 8141 8140
+8186 8232 8233
+8232 8323 8233
+8322 8395 8396
+8141 8186 8187
+8282 8323 8324
+7098 7175 7099
+8090 8141 8187
+7175 7176 7099
+8187 8233 8234
+8233 8282 8234
+8396 8395 8485
+7175 7239 7176
+8234 8282 8324
+8323 8396 8397
+8487 8486 8539
+8397 8396 8486
+8323 8322 8396
+8324 8397 8445
+8324 8323 8397
+8397 8486 8445
+8662 8705 8600
+8486 8487 8445
+8487 8539 8540
+8445 8487 8540
+8540 8600 8663
+8663 8706 8749
+8706 8663 8705
+8749 8706 8748
+8663 8600 8705
+8704 8705 8662
+8748 8706 8705
+8599 8662 8600
+8703 8598 8702
+8599 8539 8486
+8599 8600 8539
+8485 8598 8486
+8485 8597 8598
+8394 8597 8485
+8596 8785 8597
+8486 8598 8599
+8597 8785 8702
+8787 8702 8786
+8598 8597 8702
+8747 8704 8703
+8662 8599 8703
+8788 8747 8703
+8747 8705 8704
+8789 8747 8788
+8703 8702 8787
+8788 8787 8898
+8702 8785 8786
+8896 8897 8786
+8788 8703 8787
+8785 8896 8786
+8983 8984 8896
+8787 8897 8898
+8896 8984 8897
+9070 8985 8984
+9036 8986 8985
+9072 8986 9036
+8790 8748 8789
+8898 8789 8788
+8789 8705 8747
+8986 8789 8898
+8986 8987 8899
+9037 8790 8899
+8749 8748 8790
+9073 8987 8986
+8899 8789 8986
+9037 8899 8987
+8790 8789 8899
+7567 7502 7501
+9180 9126 9073
+9721 9745 9746
+9178 9277 9179
+9744 9743 9792
+9180 9232 9181
+10382 10349 10381
+9922 9987 9923
+10196 10157 10195
+9831 9886 9832
+9742 9663 9662
+9662 9524 9603
+9719 9663 9743
+9525 9524 9663
+9525 9604 9526
+9525 9663 9604
+10087 10029 9986
+10029 10110 9923
+9792 9831 9832
+9885 9829 9920
+9831 9922 9886
+9831 9830 9885
+9402 9278 9277
+9073 9126 9074
+9279 9232 9278
+9402 9471 9403
+9525 9526 9471
+9180 9181 9126
+9179 9180 9072
+9278 9232 9180
+9180 9073 9072
+9074 9037 9073
+9179 9072 9125
+9073 8986 9072
+9664 9663 9719
+9664 9604 9663
+9341 9402 9403
+9401 9525 9402
+9524 9662 9663
+9791 9830 9831
+9402 9277 9401
+9278 9180 9179
+9178 9179 9125
+9277 9278 9179
+9072 9071 9125
+9072 9036 9071
+9178 9177 9276
+9398 9397 9520
+9177 9399 9276
+9522 9661 9603
+9276 9399 9400
+9176 8983 8982
+9470 9522 9523
+9399 9660 9522
+9400 9470 9401
+9400 9522 9470
+9661 9741 9662
+9661 9660 9741
+9828 9741 9660
+9661 9522 9660
+9829 9830 9791
+9742 9662 9741
+10025 10026 9828
+10026 10106 10027
+10026 9919 9828
+10027 10107 10085
+9919 9829 9741
+9919 10027 9920
+9986 9920 10028
+9829 9919 9920
+9743 9791 9831
+9742 9829 9791
+9831 9885 9922
+9830 9829 9885
+9719 9743 9744
+9663 9742 9743
+9885 9921 9922
+9885 9920 9921
+9922 9986 9987
+9921 9920 9986
+10085 10107 10108
+10154 10153 10192
+10192 10255 10193
+10290 10291 10255
+10107 10153 10154
+10191 10254 10192
+10109 10086 10108
+10153 10191 10192
+9920 10027 10028
+10027 10106 10107
+10028 10027 10085
+9919 10026 10027
+10025 10104 10105
+10105 10106 10026
+10106 10153 10107
+10106 10190 10153
+10106 10189 10190
+10189 10286 10287
+10190 10253 10191
+10288 10344 10345
+10253 10254 10191
+10253 10289 10254
+10253 10252 10288
+10253 10288 10289
+10252 10189 10287
+10289 10345 10346
+10289 10288 10345
+10681 10544 10585
+10377 10345 10344
+10478 10441 10544
+10378 10346 10345
+10586 10478 10544
+10442 10378 10478
+10746 10747 10587
+10546 10592 10482
+10478 10378 10441
+10442 10346 10378
+10478 10479 10442
+10589 10545 10588
+10255 10291 10256
+10290 10347 10291
+10479 10444 10443
+10479 10587 10480
+10347 10348 10291
+10292 10380 10293
+10479 10480 10444
+10587 10682 10588
+10480 10588 10545
+10382 10481 10482
+10381 10480 10481
+10195 10257 10293
+10195 10194 10257
+10444 10380 10348
+10444 10480 10380
+10256 10292 10257
+10256 10291 10292
+10156 10155 10193
+10154 10192 10193
+10087 10086 10109
+10028 10085 10086
+10194 10156 10193
+10109 10154 10155
+9986 10029 9987
+10087 10109 10110
+10195 10157 10194
+10110 10109 10156
+10157 10110 10156
+10029 10087 10110
+10258 10293 10349
+10257 10292 10293
+10293 10258 10195
+10195 10258 10196
+10294 10258 10349
+10196 10110 10157
+10294 10259 10258
+10383 10259 10294
+10350 10382 10383
+10483 10445 10482
+10445 10382 10482
+10383 10294 10350
+10349 10350 10294
+10349 10382 10350
+10481 10546 10482
+10481 10545 10590
+10445 10383 10382
+12625 12519 12624
+12423 12521 12424
+12915 12727 12914
+12422 12626 12521
+12624 12518 12623
+12422 12520 12626
+12422 12421 12520
+12518 12519 12421
+12624 12519 12518
+12520 12421 12519
+12517 12518 12421
+12915 12914 13115
+12517 12622 12518
+12517 12516 12725
+12726 12624 12623
+12625 12520 12519
+12726 12727 12624
+12626 12520 12625
+12515 12620 12621
+12722 12617 12721
+12619 12618 12722
+12515 12617 12618
+12515 12619 12620
+12515 12618 12619
+13108 13109 12909
+12817 13011 12911
+13109 13110 12910
+12817 12723 12619
+12819 12723 12818
+12620 12619 12723
+12914 12725 12913
+12725 12516 12724
+12726 12725 12914
+12913 13016 13017
+12518 12622 12623
+12517 12725 12622
+12622 12726 12623
+12622 12725 12726
+12625 12727 12626
+12625 12624 12727
+13212 13116 13115
+12729 12521 12728
+12724 12913 12725
+12724 12819 12912
+13012 13013 12911
+12724 12621 12819
+13013 12912 12911
+13014 13015 12912
+13112 13206 13207
+13015 12913 12912
+13112 13113 13015
+13016 12913 13015
+13113 13017 13016
+13114 13115 12914
+13015 13113 13016
+13208 13209 13113
+13113 13207 13208
+13409 13313 13312
+13113 13114 13017
+13208 13314 13209
+13314 13492 13493
+13207 13113 13112
+13111 13205 13112
+13312 13311 13408
+13013 13111 13112
+13205 13206 13112
+13011 13110 13111
+13203 13204 13110
+13202 13203 13110
+13202 13310 13311
+13011 13111 13012
+13204 13205 13111
+13109 13202 13110
+13201 13310 13202
+13309 13200 13199
+12909 12721 12720
+13201 13109 13200
+13201 13202 13109
+12721 12910 12722
+12721 13109 12910
+12911 13011 13012
+12910 13110 13011
+13111 13013 13012
+13014 12912 13013
+12817 12818 12723
+12911 12819 12818
+12617 12720 12721
+12719 12186 12420
+12910 12817 12722
+12910 13011 12817
+12186 12719 12720
+12719 12420 12814
+12719 12814 12815
+13197 13308 13198
+12815 12908 12816
+12814 12813 12907
+12719 12815 12816
+12814 12908 12815
+12721 12909 13109
+12720 12816 12909
+13107 13108 12908
+13200 13109 13108
+13107 13198 13108
+13308 13403 13309
+13108 13199 13200
+13108 13198 13199
+12908 12907 13107
+12905 12717 12716
+13197 13196 13308
+12907 12908 12814
+13197 13107 13196
+13197 13198 13107
+13107 12907 13106
+12718 12616 12717
+12812 12906 12907
+12907 12813 12812
+13107 13106 13196
+12907 12906 13106
+13658 13832 13659
+13106 12906 13105
+12903 12904 12714
+13305 13306 12905
+13305 12905 12904
+13105 12906 12905
+12905 12810 12717
+12905 12906 12810
+12906 12811 12810
+12616 12514 12513
+12906 12812 12811
+12813 12420 12812
+12810 12718 12717
+12811 12812 12616
+12714 12715 12510
+12904 12905 12716
+12615 12716 12717
+12715 12904 12716
+10977 10894 10893
+10830 10829 10977
+11029 10977 10893
+10977 10829 10894
+12512 12418 12417
+12513 12419 12418
+12416 12512 12417
+12416 12511 12512
+12513 12615 12717
+12512 12716 12615
+12419 12513 12514
+12418 12615 12513
+12811 12616 12718
+12812 12420 12616
+12616 12420 12514
+12813 12814 12420
+12256 12186 12185
+11151 11150 11225
+12254 12255 12185
+12254 12333 12255
+10588 10682 10683
+10747 10829 10830
+10748 10830 10683
+10546 10591 10592
+10546 10481 10590
+10591 10590 10683
+10591 10546 10590
+10589 10588 10683
+10480 10587 10588
+10590 10589 10683
+10590 10545 10589
+10587 10747 10682
+10587 10586 10746
+10746 10893 10828
+10894 10829 10828
+10682 10748 10683
+10682 10747 10748
+11028 10893 10892
+10894 10828 10893
+10544 10681 10586
+10744 10679 10743
+10747 10746 10828
+10681 10745 10746
+10742 10741 10826
+10676 10582 10675
+10826 10827 10743
+10826 10890 10827
+10825 10889 10890
+10739 10740 10677
+10825 10824 10889
+10739 10675 10821
+10889 10824 10823
+10888 10976 10889
+10739 10676 10675
+10581 10674 10738
+10885 10973 10974
+10819 10885 10886
+10822 10739 10821
+11025 10888 10975
+10887 10820 10886
+10820 10887 10821
+10886 10974 10975
+10821 10888 10822
+11147 11024 11094
+10889 11026 10890
+10889 10976 11026
+10887 10975 10888
+10887 10886 10975
+10888 11025 10976
+10975 11024 11025
+11025 11147 11280
+11094 11146 11147
+11225 11149 11283
+11148 11281 11224
+11224 11282 11283
+11224 11281 11282
+11028 10892 10891
+11150 11027 11149
+10890 11026 11027
+11283 11149 11224
+11225 11150 11149
+11150 11028 10891
+11029 10893 11028
+11283 11151 11225
+11151 11028 11150
+11029 11028 11151
+12713 12714 12509
+12715 12511 12510
+11282 11281 11353
+11148 11025 11280
+12509 12613 12614
+12614 12713 12509
+12713 12903 12714
+12509 12714 12510
+12713 12809 12903
+12613 12711 12712
+12711 12806 12807
+12807 12902 12808
+13104 12903 12902
+12902 12903 12809
+13833 13659 13832
+13009 13010 12900
+13103 12901 13010
+12900 13010 12901
+12808 12711 12807
+13007 13008 12806
+12806 13008 12900
+13100 13193 13007
+13300 13195 13194
+13010 13102 13103
+13008 13007 13101
+13009 13008 13102
+13482 13481 13655
+11488 11554 11555
+11619 11678 11620
+13102 13008 13101
+13009 12900 13008
+11619 11554 11553
+11488 11416 11415
+11620 11554 11619
+11620 11555 11554
+11281 11352 11353
+11148 11280 11281
+11280 11279 11416
+11146 11278 11147
+11278 11553 11415
+11281 11280 11352
+11147 11279 11280
+11147 11278 11279
+11146 11145 11278
+11276 11412 11277
+11022 10973 10972
+11145 11414 11278
+11413 11549 11550
+11487 11552 11414
+11677 11553 11552
+11678 11619 11677
+13007 13193 13194
+13100 13192 13299
+13007 13194 13101
+13193 13299 13300
+13194 13195 13101
+13300 13481 13402
+13191 13192 13099
+13401 13480 13299
+13099 13100 13007
+12899 13005 13098
+13192 13100 13099
+11487 11550 11551
+11676 11677 11551
+13099 13006 13191
+13191 13006 13190
+13400 13298 13190
+13401 13299 13192
+11618 11675 11737
+11737 11677 11676
+11548 11618 11486
+11487 11551 11552
+11676 11550 11549
+11676 11551 11550
+11413 11412 11549
+11351 11486 11412
+11145 11277 11414
+11223 11143 11090
+11413 11487 11414
+11413 11550 11487
+11414 11277 11413
+11145 11144 11277
+11412 11276 11351
+11277 11144 11276
+11276 11144 11143
+10883 10972 10884
+11090 11091 11018
+11143 11144 11092
+10880 10967 10968
+11018 11091 11019
+10966 11019 10967
+11092 11144 11093
+10882 10881 10969
+11019 11091 11092
+10968 11092 11020
+11091 11143 11092
+11146 11022 11145
+11020 11092 11093
+11093 11021 11020
+11093 11145 11021
+11145 11022 11021
+11146 11094 11022
+11022 11023 10974
+11022 11094 11023
+10971 10972 10883
+11021 11022 10972
+10969 11020 10970
+11020 11021 10970
+10970 10971 10883
+10970 11021 10971
+10882 10883 10817
+10972 10973 10884
+10819 10884 10885
+10818 10817 10883
+10820 10819 10886
+10884 10973 10885
+10738 10674 10819
+10737 10818 10819
+10882 10817 10816
+10883 10884 10818
+10819 10818 10884
+10673 10736 10818
+10735 10815 10881
+10970 10883 10882
+10815 10968 10881
+10968 11019 11092
+10882 10969 10970
+10968 10967 11019
+10881 10968 10969
+10815 10734 10733
+10733 10880 10815
+10814 10966 10880
+10968 10815 10880
+10881 10816 10735
+10669 10733 10670
+10668 10732 10814
+10578 10735 10671
+10734 10815 10735
+10816 10736 10671
+10736 10673 10672
+10577 10670 10578
+10733 10734 10670
+10577 10578 10528
+10670 10735 10578
+10578 10529 10528
+10578 10671 10530
+10369 10467 10370
+10528 10529 10469
+10371 10469 10372
+10529 10530 10469
+10578 10530 10529
+10531 10532 10470
+10671 10579 10530
+10579 10532 10531
+10673 10579 10672
+10531 10530 10579
+10473 10373 10472
+10532 10673 10580
+10373 10372 10471
+10469 10530 10470
+10373 10471 10472
+10470 10532 10471
+10374 10373 10473
+10471 10533 10534
+10472 10534 10581
+10472 10471 10534
+10472 10535 10473
+10472 10581 10535
+10537 10536 10582
+10473 10535 10536
+10533 10580 10534
+10673 10818 10737
+10820 10738 10819
+10581 10534 10674
+10818 10736 10817
+10672 10671 10736
+10674 10737 10819
+10674 10580 10737
+10821 10738 10820
+10675 10581 10738
+10823 10739 10822
+10823 10824 10740
+10677 10676 10739
+10677 10582 10676
+10823 10740 10739
+10583 10537 10677
+10677 10678 10583
+10741 10825 10826
+10677 10740 10678
+10824 10825 10741
+10740 10741 10678
+10740 10824 10741
+10745 10744 10891
+10743 10827 10744
+10585 10680 10745
+10585 10543 10680
+10585 10745 10681
+10680 10744 10745
+10477 10439 10543
+10584 10680 10543
+10542 10584 10543
+10584 10679 10680
+10584 10743 10679
+10477 10440 10439
+10476 10438 10541
+10441 10477 10544
+10376 10377 10343
+10441 10440 10477
+10441 10378 10377
+10343 10377 10344
+10440 10441 10377
+10377 10376 10439
+10438 10475 10541
+10377 10439 10440
+10376 10438 10439
+10342 10375 10376
+10283 10284 10187
+10542 10541 10584
+10542 10476 10541
+10543 10476 10542
+10439 10438 10476
+10677 10537 10582
+10538 10474 10537
+10537 10474 10473
+10538 10539 10474
+10375 10475 10438
+10539 10540 10475
+10475 10375 10474
+10341 10284 10340
+10373 10374 10282
+10375 10342 10341
+10026 10025 10105
+10283 10282 10374
+10375 10341 10340
+10342 10285 10341
+10251 10187 10284
+10104 10186 10187
+10286 10285 10342
+10251 10284 10285
+10344 10287 10343
+10251 10285 10286
+10252 10287 10288
+10286 10343 10287
+10190 10189 10252
+10188 10251 10286
+10105 10188 10189
+10105 10104 10188
+9827 10025 9828
+9827 10024 10025
+10024 9827 9826
+9828 9660 9827
+9658 9659 9519
+9827 9660 9659
+9660 9521 9659
+9399 9177 9176
+9398 9521 9399
+9520 9659 9521
+9521 9398 9520
+9177 8983 9176
+9175 9176 8982
+9398 9399 9176
+8981 9175 8982
+9174 8980 9173
+9176 9275 9398
+9396 9658 9519
+9275 9397 9398
+9275 9175 9396
+10025 10024 10104
+9826 9825 10023
+9659 9658 9826
+9519 9397 9396
+9275 9396 9397
+9174 8981 8980
+9657 9658 9395
+9396 9175 9174
+9172 9173 8980
+9395 9396 9174
+9395 9174 9173
+9175 8981 9174
+9173 9394 9395
+9173 9172 9393
+9656 9655 9824
+10185 10282 10186
+9824 9823 10022
+9825 9658 9657
+10024 10186 10104
+10024 10185 10186
+10375 10374 10474
+10340 10283 10374
+10284 10283 10340
+10186 10282 10283
+10185 10373 10282
+10185 10372 10373
+10022 10185 10023
+10281 10280 10371
+9826 10023 10024
+10281 10183 10280
+9825 9824 10023
+9822 9654 9653
+10471 10372 10470
+10185 10184 10372
+10022 10184 10185
+10022 10021 10184
+10468 10371 10370
+10468 10469 10371
+10184 10021 10183
+10022 9823 10021
+10184 10281 10372
+10184 10183 10281
+10023 9824 10022
+9824 9825 9656
+9393 9655 9656
+9654 9823 9655
+9657 9656 9825
+9655 9823 9824
+9394 9656 9657
+9394 9393 9656
+8978 9172 8979
+9171 9391 9392
+9173 9393 9394
+9171 9170 9391
+8895 8978 8979
+9069 9068 9170
+9655 9392 9654
+9393 9172 9392
+9823 9822 10021
+10181 10276 10277
+9821 9822 9653
+10020 10021 9822
+9172 9171 9392
+9172 8978 9171
+8978 9069 9171
+8977 8976 9069
+9391 9653 9654
+9652 9518 9740
+9035 9068 8976
+9822 9821 10020
+10181 10103 10180
+9652 9820 9821
+10019 10020 9821
+10020 10182 10183
+10020 10019 10182
+10337 10369 10370
+10277 10368 10369
+10019 10181 10182
+10018 9917 10017
+10278 10277 10369
+10182 10181 10277
+10437 10464 10368
+10466 10369 10465
+10525 10526 10465
+10573 10666 10574
+10526 10527 10465
+10467 10468 10370
+10575 10467 10466
+10576 10731 10732
+10337 10278 10369
+10182 10277 10278
+10338 10279 10337
+10279 10182 10278
+10370 10338 10337
+10280 10183 10279
+10371 10339 10370
+10339 10280 10279
+10370 10339 10338
+10371 10280 10339
+10468 10577 10528
+10576 10575 10731
+10468 10576 10577
+10814 10879 10966
+10577 10669 10670
+10668 10733 10669
+10576 10732 10668
+10813 10877 10878
+10668 10814 10733
+10732 10813 10814
+10965 11017 11018
+11018 11019 10966
+11017 11090 11018
+11142 11275 11223
+11351 11275 11411
+11351 11276 11223
+11351 11223 11275
+11276 11143 11223
+11090 11142 11223
+11089 11275 11142
+11089 11017 11016
+11089 11142 11017
+10878 10964 10965
+11016 11017 10965
+10731 10813 10732
+10731 10812 10813
+10876 10964 10877
+11016 10965 10964
+10813 10878 10879
+10877 10964 10878
+10876 10812 10730
+10876 10877 10812
+10527 10667 10575
+10730 10731 10667
+10367 10435 10436
+10574 10667 10527
+10730 10666 10573
+10730 10667 10666
+10577 10576 10668
+10467 10575 10576
+10574 10527 10526
+10575 10466 10527
+10464 10525 10465
+10573 10526 10525
+10573 10574 10526
+10666 10667 10574
+10367 10336 10335
+10276 10181 10275
+10250 10180 10179
+10275 10181 10180
+10367 10335 10366
+10275 10274 10335
+10368 10367 10437
+10336 10275 10335
+10368 10336 10367
+10368 10276 10336
+10525 10463 10573
+10366 10334 10435
+10462 10463 10437
+10462 10573 10463
+10368 10464 10465
+10463 10525 10464
+11735 11793 11736
+11910 11979 11911
+10436 10435 10462
+10437 10436 10462
+10437 10367 10436
+11673 11674 11616
+11735 11736 11674
+11674 11791 11792
+11790 11854 11791
+11674 11792 11735
+11791 11909 11792
+11733 11789 11734
+12178 12033 12177
+11545 11614 11615
+11733 11732 11787
+11672 11734 11673
+11672 11733 11734
+11545 11546 11485
+11616 11547 11546
+11616 11674 11617
+11547 11616 11617
+10180 10152 10179
+9917 9916 10017
+11484 11485 11410
+11546 11547 11485
+10274 10250 10334
+10179 10101 10250
+9915 9884 9914
+9818 9789 9817
+9917 9820 9916
+9651 9602 9718
+9740 9819 9916
+9790 9738 9789
+9918 9820 9917
+9390 9391 9170
+10016 9915 9985
+9916 9819 9915
+10101 10017 10016
+10101 10102 10018
+10250 10101 10016
+10152 10102 10101
+10180 10102 10152
+10103 9918 10018
+9918 10103 10019
+10102 10180 10103
+9821 9918 10019
+9820 9740 9916
+10101 10018 10017
+10102 10103 10018
+9821 9820 9918
+9821 9653 9652
+9820 9652 9740
+9653 9391 9390
+9168 9389 9390
+9652 9653 9390
+9068 9067 9170
+9065 9169 9066
+9064 9031 9124
+9065 9034 9033
+9168 9064 9124
+9032 9031 9064
+9740 9518 9651
+9515 9516 9388
+9516 9517 9389
+9602 9651 9517
+9390 9389 9518
+9390 9169 9168
+9065 9168 9169
+9124 9167 9168
+9121 9165 9166
+9063 9031 9030
+8938 8937 8975
+9167 9124 9063
+9167 9063 9123
+9062 9063 9030
+9062 9123 9063
+9166 9167 9123
+9274 9168 9167
+9274 9516 9389
+9600 9599 9649
+9515 9600 9516
+9649 9717 9650
+9600 9650 9601
+9717 9738 9650
+9274 9388 9516
+9469 9514 9515
+9516 9600 9601
+9515 9599 9600
+9469 9388 9387
+9469 9515 9388
+9513 9598 9514
+9599 9515 9514
+9646 9645 9715
+9649 9599 9648
+9512 9511 9596
+9737 9787 9788
+9647 9598 9646
+9514 9468 9513
+9166 9273 9388
+9165 9164 9273
+9122 9121 9166
+9119 9164 9165
+9062 9122 9123
+9165 9273 9166
+9123 9122 9166
+9164 9119 9118
+9165 9120 9119
+9165 9121 9120
+9116 9163 9117
+9118 9119 9061
+9272 9231 9271
+9164 9118 9117
+9061 9117 9118
+9231 9272 9164
+9116 9117 9060
+9163 9164 9117
+9116 9060 9059
+9117 9061 9060
+9027 9028 8972
+9060 9061 9029
+9115 9162 9163
+9163 9230 9231
+9059 9028 9027
+9059 9060 9028
+8878 8933 8972
+9059 9115 9116
+9161 9230 9162
+9058 9115 9059
+9058 9114 9115
+9230 9163 9162
+9231 9164 9163
+9340 9384 9385
+9339 9382 9383
+9466 9383 9382
+9384 9339 9383
+9272 9271 9340
+9230 9270 9271
+9383 9466 9384
+9510 9595 9511
+9508 9595 9509
+9645 9597 9596
+9510 9511 9466
+9596 9597 9512
+9646 9597 9645
+9595 9596 9511
+9595 9645 9596
+9384 9467 9385
+9511 9512 9467
+9386 9272 9340
+9273 9164 9272
+9385 9386 9340
+9385 9467 9386
+9467 9513 9468
+9512 9597 9513
+9717 9716 9737
+9649 9648 9716
+9716 9736 9737
+11220 11272 11273
+11405 11404 11540
+9716 9715 9736
+9716 9648 9715
+11140 11271 11141
+11218 11139 11138
+11139 11219 11140
+11270 11271 11219
+11541 11405 11540
+11541 11406 11405
+11221 11220 11273
+11141 11271 11272
+11141 11220 11221
+11141 11272 11220
+11783 11668 11782
+11541 11540 11668
+11667 11539 11403
+11667 11668 11539
+11667 11782 11668
+11781 11846 11782
+11902 11847 11846
+11848 11782 11847
+11849 11783 11848
+11849 11850 11783
+11903 11849 11848
+11784 11785 11669
+11903 11850 11849
+11904 11974 11975
+11273 11405 11406
+11272 11404 11405
+11850 11784 11783
+11973 11903 11972
+11407 11542 11543
+11406 11541 11542
+11784 11851 11785
+11784 11850 11851
+11786 11670 11785
+11543 11542 11669
+11612 11670 11671
+11669 11785 11670
+11787 11732 11731
+11671 11670 11731
+11614 11671 11672
+11613 11612 11671
+11408 11544 11484
+11543 11612 11544
+11544 11612 11613
+11543 11670 11612
+11409 11408 11484
+11274 11222 11273
+11408 11407 11543
+11408 11350 11349
+11349 11274 11407
+11350 11222 11274
+9788 9787 9816
+9736 9645 9816
+9883 9816 9985
+9787 9736 9816
+11408 11349 11407
+11350 11274 11349
+9816 9817 9788
+9816 9883 9817
+9790 9789 9818
+9817 9883 9818
+9718 9738 9790
+9717 9737 9738
+9819 9790 9818
+9738 9788 9789
+9651 9718 9739
+9650 9738 9718
+11410 11409 11484
+11410 11350 11409
+9739 9790 9819
+9739 9718 9790
+11671 11733 11672
+11787 11731 11786
+11671 11732 11733
+11671 11731 11732
+11544 11614 11545
+11613 11671 11614
+11906 11907 11852
+11788 11733 11787
+11852 11788 11787
+11789 11733 11788
+11853 11852 11907
+11787 11786 11906
+11908 11907 11976
+11852 11787 11906
+11905 11906 11786
+12033 12034 11906
+12032 12176 12033
+12499 12498 12608
+12035 11976 12034
+11976 11906 12034
+11908 11976 11977
+11907 11906 11976
+12035 12178 12179
+12496 12408 12495
+12609 12500 12499
+12179 12111 12035
+12321 12410 12322
+12500 12501 12323
+12322 12410 12500
+12322 12250 12321
+12249 12321 12250
+12408 12497 12409
+12249 12250 12177
+12322 12178 12250
+12608 12498 12497
+12499 12410 12409
+12801 12887 12701
+12608 12701 12499
+12700 12701 12608
+12500 12410 12499
+12607 12497 12496
+12320 12321 12249
+12494 12697 12495
+12497 12408 12496
+12498 12409 12497
+12498 12499 12409
+12174 12110 12109
+12408 12409 12319
+12033 12176 12177
+12319 12320 12249
+12409 12320 12319
+12409 12321 12320
+11785 11905 11786
+11975 12030 12031
+11905 12032 12033
+12174 12109 12173
+12177 12176 12249
+12110 12030 12109
+11851 11904 11905
+11851 11850 11904
+12032 12031 12110
+12032 11975 12031
+12032 12110 12176
+12031 12030 12110
+12316 12317 12174
+12175 12110 12174
+11905 11904 11975
+11850 11903 11904
+11975 11974 12030
+11904 11903 11973
+11848 11902 11903
+11971 12027 11972
+11902 11970 11971
+11901 12026 11970
+11972 11902 11971
+11848 11847 11902
+12173 12027 12172
+12173 12028 12027
+12029 11973 12028
+11974 11904 11973
+12109 12029 12028
+12030 11974 12029
+12172 12315 12173
+12314 12404 12405
+12492 12405 12404
+12406 12315 12405
+12492 12493 12405
+12407 12315 12406
+12695 12696 12606
+12606 12494 12493
+12494 12606 12696
+12493 12605 12606
+12408 12317 12495
+12407 12493 12494
+12173 12316 12174
+12316 12494 12317
+12315 12316 12173
+12407 12494 12316
+12317 12248 12174
+12176 12110 12175
+12318 12248 12317
+12319 12249 12248
+12697 12607 12495
+12608 12497 12607
+12408 12318 12317
+12319 12248 12318
+12699 12698 12800
+12699 12607 12698
+12886 12800 12885
+12697 12494 12696
+13081 12988 13080
+12886 12885 12988
+12698 12697 12800
+12696 12883 12884
+12800 12697 12884
+12698 12607 12697
+12697 12696 12884
+12606 12605 12695
+12694 12695 12605
+12882 12883 12695
+12695 12883 12696
+12986 12987 12883
+12883 12882 12986
+12695 12694 12882
+12986 13078 12987
+13179 13180 13080
+12987 13080 12988
+13079 13179 13080
+13076 13077 12986
+13178 13179 13078
+13178 13077 13076
+12986 12882 13076
+13078 13077 13178
+13078 12986 13077
+13635 13461 13460
+13461 13281 13460
+13281 13178 13280
+13281 13179 13178
+13634 13635 13460
+13636 13546 13462
+13282 13462 13463
+13281 13461 13462
+13078 13179 13079
+13281 13462 13282
+13179 13282 13180
+13179 13281 13282
+13283 13181 13180
+13180 13181 13082
+13547 13463 13546
+13390 13284 13283
+13181 13283 13284
+13180 13282 13283
+13464 13391 13390
+13182 13286 13183
+13463 13464 13390
+13287 13288 13184
+13547 13548 13463
+13465 13639 13466
+12990 12989 13182
+12887 12886 13082
+13285 13181 13284
+13082 13081 13180
+13390 13285 13284
+13083 13082 13181
+13083 12887 13082
+13082 12886 12988
+12700 12608 12699
+12886 12801 12800
+12608 12607 12699
+12800 12801 12699
+12701 12609 12499
+12699 12801 12700
+12886 12887 12801
+12801 12701 12700
+13084 12990 13183
+13083 12989 12887
+13083 13182 12989
+12887 12802 12701
+12501 12703 12502
+12701 12802 12609
+12887 12989 12802
+12609 12702 12500
+12802 12989 12888
+12992 12889 12991
+12702 12802 12888
+12990 12991 12888
+12889 12890 12704
+12992 13084 13085
+12991 12990 13084
+13391 13392 13285
+13391 13464 13392
+13392 13393 13286
+13466 13640 13641
+13285 13392 13286
+13549 13638 13639
+13286 13393 13287
+13392 13464 13465
+13287 13394 13288
+13393 13392 13465
+13819 14003 13641
+13289 13185 13288
+12994 12995 12890
+12993 12890 12889
+13185 13289 13087
+12996 12891 12995
+13466 13641 13467
+13092 13091 13291
+13185 13087 13086
+13289 13088 13087
+12995 13088 12996
+13292 13396 13397
+13289 13290 13088
+13467 13395 13466
+12997 13089 12998
+13088 13290 13089
+12999 13090 13091
+13089 13290 13090
+12891 12997 12892
+12996 13088 12997
+12997 12998 12892
+13089 13090 12998
+12997 12891 12996
+12892 12705 12891
+12803 12706 12893
+12610 12506 12505
+12706 12610 12505
+12505 12411 12327
+12252 12330 12253
+12503 12502 12704
+12503 12325 12502
+12706 12504 12705
+12505 12327 12504
+13084 12992 12991
+13085 13086 12993
+13085 12993 12992
+13087 12995 12994
+12993 12994 12890
+12993 13087 12994
+12703 12889 12704
+12888 12991 12889
+12502 12703 12704
+12702 12888 12703
+12702 12501 12500
+12502 12324 12501
+12500 12323 12322
+12324 12180 12323
+12179 12180 12111
+12324 12181 12180
+12325 12181 12324
+12325 12182 12181
+12114 12039 12113
+11979 11978 12039
+12322 12179 12178
+12323 12180 12179
+12111 12112 12037
+12180 12181 12112
+12037 12036 12111
+11977 11976 12035
+11790 11853 11854
+11789 11852 11853
+11854 11853 11908
+11977 11978 11909
+12035 12036 11977
+12035 12111 12036
+12039 12038 12112
+12039 11978 12038
+12182 12040 12114
+12041 11981 11980
+11978 11979 11910
+11980 11912 11911
+11910 11911 11793
+11979 12040 11980
+11979 11980 11911
+12040 12041 11980
+11980 11981 11912
+12115 12184 12042
+11912 11981 12042
+12041 12115 12042
+12041 12182 12183
+12327 12183 12326
+12041 12040 12182
+12326 12183 12182
+12251 12184 12183
+12502 12325 12324
+12503 12326 12325
+12504 12327 12326
+12328 12251 12327
+12327 12251 12183
+12328 12329 12251
+12895 12894 13000
+12893 12998 12999
+12507 12413 12412
+12893 12894 12803
+12895 12707 12804
+12999 12894 12893
+12804 12707 12803
+13000 12894 12999
+12895 12804 12894
+12707 12610 12706
+12707 12506 12610
+12411 12329 12328
+12411 12506 12329
+12251 12252 12184
+12329 12330 12252
+12330 12331 12253
+12412 12413 12331
+12708 12611 12507
+12508 12413 12507
+12611 12612 12508
+11618 11676 11549
+11486 11618 11549
+11548 11675 11618
+11675 11794 11737
+11618 11737 11676
+12709 12612 12611
+12507 12611 12508
+12708 12709 12611
+13003 12897 13002
+12897 12709 12708
+12710 12612 12709
+12710 12805 12899
+12709 12897 12898
+12805 12898 12899
+12899 12898 13004
+13189 13296 13098
+13097 13098 13005
+13097 13188 13189
+13005 13004 13097
+13294 13293 13398
+13004 12898 13003
+12805 12709 12898
+13188 13004 13096
+13005 12899 13004
+13003 13002 13094
+12999 13091 13000
+13090 13290 13291
+13291 13292 13092
+13093 13001 13092
+13003 13094 13095
+13004 13003 13096
+13096 13003 13095
+12898 12897 13003
+13643 13550 13470
+13091 13090 13291
+13186 13292 13293
+13186 13092 13292
+13473 13398 13472
+13292 13291 13396
+13396 13471 13397
+13474 13295 13294
+13552 13475 13474
+13475 13476 13296
+13474 13294 13398
+13187 13095 13094
+13295 13187 13294
+13295 13096 13187
+13296 13189 13188
+13097 13004 13188
+13097 13189 13098
+13188 13295 13296
+13475 13296 13295
+13191 13298 13192
+13480 13481 13300
+13298 13401 13192
+13479 13480 13401
+13556 13478 13477
+13400 13190 13297
+13479 13400 13478
+13479 13401 13298
+13190 13298 13191
+13400 13479 13298
+13477 13399 13297
+13478 13400 13399
+13556 13477 13555
+13478 13399 13477
+13399 13400 13297
+13740 13826 13741
+13651 13556 13555
+13742 13556 13651
+13652 13478 13556
+13649 13648 13740
+13826 13909 13741
+13908 13909 13826
+13825 13907 13908
+14009 13909 13908
+13827 14011 13910
+13742 13910 13828
+13827 13742 13651
+13827 13910 13742
+13742 13652 13556
+13828 13829 13652
+13479 13653 13480
+13479 13478 13653
+13828 14012 13829
+13910 14011 14099
+13480 13654 13481
+13653 13829 13654
+13654 14013 13655
+13829 14012 14013
+14183 14271 14184
+14773 14858 14774
+14012 14185 14013
+14184 14271 14379
+14675 14573 14572
+14380 14379 14571
+14774 14675 14572
+14014 14015 13655
+14775 14574 14573
+14013 14185 14381
+14859 14675 14774
+14859 14775 14675
+14858 14859 14774
+14775 14573 14675
+14947 14775 14859
+14947 14948 14775
+15142 15037 14945
+14774 14572 14674
+14774 14674 14773
+14571 14379 14477
+14944 15036 15141
+14571 14572 14380
+14674 14571 14773
+14942 15036 14943
+14572 14571 14674
+14856 14943 14857
+14569 14771 14570
+14944 14857 14943
+14476 14569 14570
+14857 14944 14772
+14185 14184 14379
+14183 14098 14271
+14477 14379 14378
+14012 14184 14185
+14099 14011 14098
+14012 14099 14184
+14099 14098 14183
+14184 14099 14183
+14012 13910 14099
+14007 14094 14008
+14181 14097 14096
+14008 14095 14096
+14269 14373 14374
+14095 14180 14096
+14094 14007 14178
+14180 14181 14096
+14182 14097 14181
+14270 14182 14181
+14377 14376 14476
+14770 14568 14673
+15139 15140 14942
+14771 14942 14856
+14942 14943 14856
+14772 14771 14856
+14770 14941 14942
+14376 14568 14569
+14671 14566 14565
+14270 14376 14377
+14375 14374 14475
+14569 14568 14770
+14475 14474 14567
+14672 14673 14567
+14568 14475 14567
+14771 14770 14942
+14771 14569 14770
+15241 15138 15334
+14770 14673 14769
+14939 15035 15136
+14941 14770 14769
+14672 14671 14768
+15138 15139 14941
+14566 14567 14474
+14566 14672 14567
+14473 14373 14372
+14269 14180 14179
+14181 14375 14376
+14180 14269 14375
+14095 14179 14180
+14007 14006 14177
+14269 14178 14268
+14179 14094 14178
+14375 14269 14374
+14179 14178 14269
+14007 13822 14006
+14007 13823 13822
+13822 13737 13821
+13822 13738 13737
+13823 13738 13822
+13823 13739 13647
+13474 13551 13647
+13648 13825 13740
+14095 14094 14179
+14095 14008 14094
+13823 13824 13739
+13823 14008 13907
+13823 13907 13824
+14008 14096 14009
+13825 13908 13826
+13907 14008 14009
+13909 14009 14010
+13908 13907 14009
+13649 13740 13650
+13739 13824 13825
+13740 13825 13826
+13824 13907 13825
+13476 13554 13650
+13648 13739 13825
+13645 13646 13551
+13738 13823 13647
+13552 13647 13739
+13646 13738 13647
+13554 13648 13649
+13553 13552 13648
+13648 13554 13553
+13649 13650 13554
+13475 13552 13553
+13474 13647 13552
+13554 13475 13553
+13295 13474 13475
+13471 13472 13397
+13473 13474 13398
+13737 13738 13645
+13551 13474 13473
+13468 13642 13469
+13737 13645 13644
+13291 13290 13469
+13644 13645 13550
+13291 13470 13396
+13550 13472 13471
+13471 13470 13550
+13471 13396 13470
+13643 13469 13642
+13470 13291 13469
+14093 14174 14003
+13643 13737 13644
+14005 13821 13820
+14006 13822 13821
+13821 13643 13820
+13644 13550 13643
+14372 14268 14371
+14373 14269 14268
+14472 14371 14471
+14005 14006 13821
+14472 14372 14371
+14373 14268 14372
+14268 14177 14371
+14268 14178 14177
+14469 14370 14369
+14177 14006 14176
+14003 14174 14175
+14176 14006 14005
+14267 14367 14174
+14370 14471 14371
+14468 14469 14369
+14468 14563 14469
+14369 14370 14176
+14469 14470 14370
+14367 14368 14174
+14367 14560 14561
+14173 14174 14093
+14368 14369 14175
+14004 14003 14175
+14174 14368 14175
+14176 14004 14175
+13819 14001 14002
+13819 13641 13640
+13468 13469 13290
+13820 14004 14005
+13820 13642 14004
+14004 13642 13641
+13820 13643 13642
+13642 13468 13641
+13289 13395 13467
+13289 13468 13290
+13467 13641 13468
+13393 13465 13394
+13549 13639 13465
+13640 13639 13818
+13640 13466 13639
+13394 13466 13395
+13394 13465 13466
+13999 14000 13816
+14001 13818 13906
+13817 13736 13816
+13639 13638 13736
+13906 13817 13816
+13818 13736 13817
+13464 13549 13465
+13464 13548 13549
+13637 13547 13546
+13637 13638 13548
+13637 13548 13547
+13638 13549 13548
+13997 13635 13634
+13636 13462 13635
+14361 13998 13997
+14363 14170 13999
+13636 13815 13637
+13636 13635 13815
+14002 14171 14172
+14001 14170 14171
+14000 13999 14170
+13815 13998 13999
+14001 14000 14170
+13906 13816 14000
+14757 14362 14361
+14363 13999 14362
+14559 14365 14558
+14171 14170 14364
+14171 14364 14365
+14760 14559 14558
+14093 14002 14172
+14003 13819 14002
+14002 14093 14003
+14172 14173 14093
+14366 14267 14172
+14172 14267 14173
+14173 14267 14174
+14366 14560 14367
+14366 14367 14267
+14560 14665 14561
+14367 14561 14368
+14665 14764 14561
+14665 14762 14763
+14934 14935 14854
+14934 14853 14933
+14763 14764 14665
+14854 14763 14762
+14854 14764 14763
+14559 14664 14560
+14559 14760 14664
+15129 14931 15128
+14759 14363 14758
+14363 14759 14558
+14758 15127 14759
+14932 14931 15129
+14759 15127 15128
+14759 14760 14558
+14931 14932 14760
+14853 14932 14933
+14853 14760 14932
+15131 15130 15237
+15320 15321 15126
+15128 14931 14759
+14933 15032 14934
+14933 14932 15032
+15126 15321 15127
+15417 15518 15418
+15321 15322 15127
+15321 15417 15418
+15323 15128 15127
+15323 15520 15324
+15132 15131 15237
+14936 14935 15033
+15325 15326 15130
+15131 15033 15130
+15131 15132 15033
+15133 15034 15132
+14937 14936 15034
+15238 15328 15239
+15034 14936 15132
+15237 15327 15132
+15240 15330 15331
+15238 15239 15134
+14938 14939 14855
+15239 15240 15135
+14768 15137 14941
+15240 15136 15135
+15332 15428 15333
+14937 14938 14855
+15136 15331 15332
+15034 15035 14937
+15035 14939 14938
+14937 15035 14938
+15134 15135 15035
+14855 14766 14765
+14563 14468 14467
+14563 14467 14562
+14368 14561 14562
+14562 14467 14368
+14562 14666 14563
+14667 14563 14666
+14668 14564 14563
+14939 14766 14855
+14668 14767 14669
+14766 14667 14666
+14668 14563 14667
+14565 14564 14670
+14668 14766 14767
+14670 14564 14669
+14470 14469 14564
+14471 14470 14564
+14471 14370 14470
+14564 14565 14471
+14473 14474 14373
+14471 14565 14472
+14671 14672 14566
+14565 14473 14472
+14566 14474 14473
+14767 14940 14768
+14769 14673 14672
+14768 14671 14670
+14670 14669 14767
+14670 14671 14565
+14670 14767 14768
+14769 14768 14941
+14767 14939 14940
+15137 14768 14940
+14769 14672 14768
+14941 15137 15138
+14940 15136 15137
+15334 15333 15531
+15137 15136 15332
+15137 15332 15333
+15331 15426 15427
+15427 15428 15332
+15633 15529 15632
+15633 15634 15529
+15635 15532 15531
+15333 15428 15530
+15929 15832 15831
+16027 15930 15929
+16028 15931 16027
+15932 15732 15731
+16109 16305 16110
+15831 15729 15728
+15729 15634 15728
+15530 15529 15634
+15927 15928 15830
+16025 16026 15928
+16110 16026 16025
+16109 16110 16025
+16214 16026 16110
+15927 16109 16025
+16696 16695 17026
+15927 15726 15926
+15631 15527 15526
+15830 15727 15726
+15631 15526 15525
+15527 15426 15526
+15727 15631 15726
+15529 15528 15632
+15529 15428 15427
+15527 15427 15426
+15528 15529 15427
+15134 15239 15135
+15330 15425 15331
+15239 15329 15240
+15424 15425 15330
+15133 15238 15134
+15329 15330 15240
+15328 15329 15239
+15423 15424 15329
+15329 15424 15330
+15423 15524 15525
+15132 15327 15238
+15423 15329 15328
+15422 15327 15237
+15422 15524 15327
+15132 15238 15133
+15327 15328 15238
+15422 15326 15421
+15237 15130 15326
+15323 15324 15128
+15419 15420 15325
+15324 15325 15129
+15420 15421 15325
+15322 15418 15519
+15322 15321 15418
+15323 15519 15520
+15418 15518 15519
+15520 15521 15324
+15521 15724 15522
+15324 15521 15419
+15520 15724 15521
+15923 15723 15922
+15519 15518 15723
+16301 15923 16108
+15924 15520 15923
+16301 16300 16494
+16108 16299 16300
+15520 15924 15724
+15924 16301 16302
+15925 16302 16303
+15924 15923 16301
+15924 15925 15724
+16303 15926 15925
+15925 15522 15724
+15523 15422 15421
+15925 15725 15522
+15725 15926 15524
+15327 15524 15423
+15523 15725 15524
+15522 15725 15523
+15925 15926 15725
+15425 15525 15526
+15424 15423 15525
+16860 17025 16694
+16695 16303 16694
+16859 16860 16693
+17187 17349 17188
+17125 17024 17023
+17187 17188 17024
+16300 16301 16108
+16495 16496 16301
+16692 16858 16795
+17024 16860 16859
+16691 16692 16601
+16693 16495 16602
+16495 16494 16602
+16300 16493 16494
+16602 16692 16795
+16602 16494 16692
+16795 16858 16947
+16794 16946 16858
+16693 16795 16859
+16693 16602 16795
+17024 16947 17023
+16859 16795 16947
+17349 17276 17348
+17276 17186 17275
+17610 17511 17609
+17444 17509 17510
+17444 17347 17346
+17348 17275 17347
+17609 17511 17510
+17610 17611 17512
+17513 17611 17690
+17610 17689 17611
+17511 17512 17445
+17511 17610 17512
+17349 17513 17350
+17512 17611 17513
+17187 17125 17186
+17187 17024 17125
+17445 17349 17348
+17187 17186 17276
+17024 17188 16860
+17351 17515 17516
+17513 17349 17445
+17350 17188 17349
+17690 17514 17513
+17691 17516 17515
+17514 17515 17351
+17514 17691 17515
+17692 17352 17516
+17353 17027 17352
+17692 17353 17352
+17354 17189 17028
+17354 17028 17353
+16603 16604 16499
+17026 17351 17352
+17188 17350 17351
+17027 17026 17352
+17027 16696 17026
+16695 17025 17026
+16860 17188 17025
+15926 16304 16109
+16303 16695 16304
+16498 16305 16497
+16304 16695 16696
+16497 16305 16109
+16408 16603 16499
+16696 16497 16304
+16603 16698 16604
+16696 16697 16497
+16408 16306 16305
+16497 16697 16498
+16696 17027 16697
+16214 16305 16306
+16603 16408 16498
+16499 16306 16408
+16308 16409 16410
+16697 16603 16498
+16697 16698 16603
+16862 16796 16861
+17189 17030 17029
+16948 16861 17029
+16796 16698 16861
+16948 16862 16861
+16861 17028 17029
+16861 16697 17028
+17028 17189 17029
+17354 17355 17189
+17029 17030 16948
+17189 17355 17030
+16219 16310 16220
+16605 16700 16606
+16308 16309 16217
+16112 16113 15933
+16605 16606 16501
+16606 16502 16501
+16797 16863 16864
+16950 17032 17033
+17031 16949 16863
+17031 17032 16949
+16949 16864 16863
+16798 16701 16797
+16503 16797 16701
+16502 16410 16501
+16502 16606 16411
+16410 16502 16411
+16216 16217 16112
+16410 16411 16309
+16218 16217 16309
+16114 16218 16309
+16113 16217 16218
+15835 15834 15934
+16029 16113 16114
+16029 15933 16113
+15934 15933 16029
+16215 16216 16111
+15932 15833 15931
+16216 16308 16217
+16410 16309 16308
+16111 16112 16028
+16217 16113 16112
+16500 16501 16409
+16409 16308 16307
+16111 16216 16112
+16215 16307 16216
+15832 15833 15730
+15931 16028 15932
+16112 15932 16028
+15933 15732 15932
+15932 15731 15833
+15637 15636 15731
+15430 15532 15533
+15636 15637 15533
+15334 15531 15429
+15530 15730 15531
+15730 15635 15531
+15730 15731 15635
+15334 15429 15335
+15531 15532 15429
+15241 15334 15335
+15138 15333 15334
+15336 15139 15241
+15139 15138 15241
+14941 15139 14942
+15241 15335 15336
+15242 15336 15337
+15335 15429 15336
+15141 15140 15243
+15140 15139 15242
+15431 15533 15534
+15532 15636 15533
+15336 15430 15337
+15336 15429 15430
+15638 15535 15534
+15535 15337 15431
+15243 15140 15242
+15036 14942 15140
+15337 15243 15242
+15140 15141 15036
+15243 15337 15141
+15733 15834 15734
+15537 15432 15536
+15534 15637 15638
+15431 15534 15535
+15732 15834 15733
+15933 15934 15834
+15734 15834 15835
+15737 15836 15837
+15838 15738 15837
+15538 15433 15537
+15539 15538 15737
+15537 15536 15639
+15538 15537 15640
+15737 15736 15836
+15737 15640 15736
+15640 15537 15639
+15339 15338 15433
+15433 15432 15537
+15433 15338 15432
+15338 15339 15244
+15737 15538 15640
+15539 15340 15538
+15538 15339 15433
+14858 14946 14859
+15340 15143 15339
+15340 15540 15341
+15143 15037 15142
+15037 15038 14946
+14946 14947 14859
+15037 14946 14945
+15037 15143 15038
+15340 15144 15143
+15144 15341 15145
+15143 15144 15038
+15145 15342 15245
+15540 15642 15643
+15540 15641 15642
+15837 15738 15737
+15739 15641 15738
+15538 15340 15339
+15539 15540 15340
+15937 15838 15837
+15839 15739 15838
+15742 15743 15645
+15741 15742 15644
+15841 15741 15840
+15643 15642 15740
+16031 15938 15937
+16033 15939 15938
+16413 16313 16312
+15939 15940 15841
+15839 15939 15840
+16033 16119 15939
+16312 16118 16311
+16119 16033 16118
+15936 15937 15837
+16031 16118 16032
+16031 16032 15938
+16118 16033 16032
+15935 15936 15836
+16030 16117 16031
+16030 15935 16115
+15836 15735 15935
+15935 16030 15936
+16115 16116 16030
+16117 16116 16220
+16117 16030 16116
+15936 16031 15937
+16117 16118 16031
+16310 16412 16311
+16702 16701 16798
+16310 16503 16412
+16504 16607 16608
+16503 16701 16607
+16864 16950 16865
+16864 16949 16950
+16865 16798 16864
+16865 16702 16798
+16607 16702 16608
+16609 16610 16505
+16865 16703 16702
+16867 17034 17035
+16311 16504 16505
+16412 16503 16504
+16504 16609 16505
+16608 16702 16609
+16704 16506 16610
+16507 16413 16506
+16865 16866 16703
+16865 17033 16866
+16611 16506 16704
+16610 16703 16704
+16869 16868 16952
+16705 16706 16613
+16953 16869 16952
+16612 16613 16508
+16869 16799 16868
+16707 16614 16510
+16706 16867 16868
+16704 16866 16867
+16867 16705 16704
+16867 16706 16705
+16613 16612 16705
+16507 16506 16611
+16612 16507 16611
+16413 16312 16506
+16508 16413 16507
+16508 16414 16413
+15941 15842 15940
+15940 16119 16120
+16507 16612 16508
+16611 16705 16612
+16414 16313 16413
+16414 16314 16313
+16706 16509 16613
+16510 16315 16509
+16221 16314 16315
+16221 16121 16314
+15743 15544 15543
+16121 16221 16122
+15943 16123 16124
+16122 16222 16123
+16708 16614 16707
+16510 16706 16707
+16617 16512 16616
+16316 16510 16511
+16616 16615 16708
+16511 16614 16615
+16799 16707 16706
+16800 16801 16707
+16616 16708 16709
+16615 16614 16708
+16954 16870 16953
+16799 16706 16868
+16800 16799 16869
+16800 16707 16799
+16800 16870 16801
+16869 16953 16870
+17038 16872 16871
+16710 16873 16514
+16617 16616 16709
+16511 16615 16616
+16512 16617 16513
+16709 16872 16710
+16709 16710 16617
+16873 16711 16514
+16872 16873 16710
+17039 17040 16873
+17040 16874 16873
+16875 16956 16876
+16619 16618 16713
+16711 16874 16712
+16874 16875 16712
+16955 16956 16875
+16517 16619 16620
+16712 16875 16713
+16620 16619 16713
+16516 16320 16515
+16515 16618 16516
+16712 16713 16618
+16619 16516 16618
+16415 16416 16321
+16319 16515 16320
+16514 16711 16515
+16128 16320 16129
+16127 16319 16320
+16516 16415 16320
+16517 16416 16415
+16127 16128 15947
+16127 16320 16128
+16514 16319 16318
+15844 15749 15748
+16126 16319 16127
+16514 16515 16319
+16316 16317 16124
+16125 16126 15945
+16317 16512 16318
+16617 16710 16513
+16124 16317 16125
+16318 16126 16125
+16318 16512 16513
+16511 16616 16512
+16125 16317 16318
+16316 16511 16317
+15943 16124 16034
+16123 16316 16124
+16125 15944 16034
+15845 15946 15750
+15749 15648 15748
+15646 15546 15745
+15549 15439 15438
+15545 15346 15345
+16125 15945 15944
+15945 15845 15844
+15649 15648 15749
+15649 15549 15548
+15944 15945 15844
+16126 15946 15945
+15946 15845 15945
+15750 15749 15845
+15751 15947 15752
+16128 16129 15948
+15552 15551 15752
+15441 15550 15551
+15750 15549 15649
+15350 15441 15351
+15551 15751 15752
+15750 15946 15751
+15550 15440 15549
+15349 15350 15153
+15549 15440 15439
+15550 15441 15350
+15153 15350 15250
+15440 15550 15350
+15251 15155 15154
+15252 15156 15155
+15350 15351 15250
+15250 15351 15251
+15251 15351 15252
+15441 15551 15351
+15346 15546 15347
+15439 15440 15349
+15438 15548 15549
+15647 15648 15548
+15348 15347 15547
+15348 15547 15548
+15548 15547 15647
+15548 15438 15348
+15349 15348 15438
+15249 15346 15347
+15152 15348 15349
+15152 14955 15151
+15545 15345 15437
+15248 15247 15345
+15344 15343 15436
+15247 15246 15343
+15345 15344 15437
+15345 15247 15344
+15744 15942 15745
+15942 16123 15943
+15544 15436 15435
+15544 15437 15436
+15745 15546 15545
+15546 15346 15545
+15745 15746 15646
+15547 15347 15546
+15747 15746 15843
+15747 15647 15646
+15747 15646 15746
+15547 15546 15646
+15746 15745 15843
+15545 15544 15744
+16123 15942 16122
+15943 15843 15745
+15744 15745 15545
+15942 15943 15745
+15643 15740 15741
+15941 15942 15744
+15742 15842 15743
+15940 16121 15941
+16122 15941 16121
+16122 15942 15941
+16119 15940 15939
+16120 16121 15940
+15939 15841 15840
+15940 15842 15841
+15644 15742 15645
+15841 15842 15742
+15840 15741 15740
+15841 15742 15741
+15542 15644 15645
+15643 15741 15644
+15743 15744 15544
+15743 15941 15744
+15435 15543 15544
+15435 15434 15543
+15340 15341 15144
+15434 15342 15341
+15434 15542 15543
+15541 15644 15542
+15343 15245 15342
+15146 15039 14950
+15342 15145 15341
+15246 15247 15147
+15245 15146 15145
+15147 15039 15146
+15245 15246 15146
+15245 15343 15246
+15042 15041 15149
+15147 15247 15148
+15043 15150 15249
+15151 15043 15249
+14953 14862 14952
+15043 15151 14954
+15249 15347 15151
+15150 15042 15149
+14953 14954 14863
+15147 15040 15039
+14860 14952 14861
+15148 15041 15040
+14779 14862 14780
+15042 14952 15041
+15042 15043 14953
+15042 14953 14952
+15043 14954 14953
+14862 14863 14780
+14862 14953 14863
+14578 14677 14678
+14577 14576 14778
+14860 14861 14779
+14952 14862 14861
+14860 14779 14778
+14861 14862 14779
+14950 14951 14778
+15145 14950 14949
+14951 14860 14778
+15039 14951 14950
+15039 15040 14951
+15144 14948 14947
+15144 15145 14948
+14950 14777 14949
+14574 14381 14573
+14575 14777 14576
+14776 14949 14777
+14777 14575 14776
+14575 14576 14383
+14574 14382 14381
+14574 14776 14575
+14383 14187 14186
+14382 14574 14575
+14014 14186 14015
+14382 14575 14383
+13656 13483 13655
+13302 13101 13195
+14013 14014 13655
+14013 14382 14014
+13482 13402 13481
+13301 13195 13300
+13301 13300 13402
+13194 13193 13300
+13482 13302 13402
+13302 13102 13101
+13102 13303 13103
+13656 13657 13303
+13402 13302 13301
+13482 13483 13302
+13303 13483 13656
+13303 13102 13483
+14187 14188 14015
+14385 14384 14577
+14186 14187 14015
+14186 14382 14383
+13104 13304 12903
+13104 13303 13304
+13303 13657 13304
+13656 14015 14016
+14017 14189 14190
+14188 14273 14274
+13830 14016 14017
+13657 13656 14016
+14188 14274 14189
+14273 14384 14274
+14384 14383 14576
+14384 14273 14272
+14188 14272 14273
+14187 14383 14272
+14676 14577 14779
+14578 14385 14577
+14780 14676 14779
+14677 14578 14676
+14384 14385 14274
+14578 14579 14386
+14017 14190 14100
+14189 14385 14190
+14386 14191 14190
+14103 14193 14020
+14387 14388 14192
+14019 13832 14018
+14191 14100 14190
+14018 13831 14017
+14191 14101 14100
+14102 14019 14018
+14189 14017 14016
+14100 14101 14018
+14016 13830 13657
+14017 13831 13830
+12903 13305 12904
+13304 13658 13305
+13743 13659 13833
+13658 13831 13832
+14100 14018 14017
+14101 14102 14018
+14102 14103 14019
+13833 13832 14019
+13484 13306 13659
+13659 13305 13658
+13660 13484 13659
+13306 13305 13659
+13743 13660 13659
+13105 12905 13306
+13485 13307 13484
+13307 13105 13484
+13745 13744 13834
+13661 13485 13660
+13744 13660 13743
+13744 13745 13660
+13914 13835 13913
+13744 13743 13834
+14019 14020 13833
+14103 14102 14192
+14193 14021 14020
+13834 13833 13911
+14191 14192 14102
+14277 14194 14193
+14019 14103 14020
+14193 14194 14021
+14192 14193 14103
+14275 14388 14389
+14276 14389 14277
+14389 14482 14483
+14390 14389 14483
+14481 14581 14582
+14481 14582 14482
+14583 14484 14483
+14276 14275 14389
+14481 14482 14389
+14192 14275 14193
+14192 14191 14387
+14193 14276 14277
+14193 14275 14276
+14389 14388 14481
+14275 14192 14388
+14578 14386 14385
+14387 14191 14386
+14478 14387 14386
+14479 14480 14387
+14387 14478 14479
+14386 14579 14478
+14581 14580 14681
+14479 14478 14580
+14388 14480 14481
+14388 14387 14480
+14784 14681 14783
+14680 14679 14783
+14780 14781 14678
+14780 14863 14781
+14783 14679 14782
+14680 14580 14679
+14781 14864 14782
+14956 15152 14957
+14954 14955 14864
+14954 15151 14955
+14782 14865 14783
+14782 14864 14865
+14784 14956 14957
+14865 14955 14956
+14783 14681 14680
+14783 14956 14784
+14480 14581 14481
+14681 14682 14581
+14785 14582 14682
+14785 14866 14786
+14785 14784 14957
+14682 14681 14784
+15154 15044 14958
+15155 15045 15044
+14582 14785 14583
+14868 14960 14787
+14582 14583 14483
+14485 14486 14392
+14485 14484 14584
+14391 14279 14278
+14583 14584 14484
+14788 14960 14961
+14786 14787 14584
+14786 14867 14868
+14487 14585 14586
+14486 14485 14585
+14488 14587 14588
+14586 14683 14587
+14585 14788 14586
+14789 14962 14790
+14684 14791 14589
+14591 14794 14795
+14484 14485 14391
+14584 14585 14485
+14585 14487 14486
+14488 14393 14487
+14105 14197 14025
+14281 14393 14282
+14198 14282 14394
+14281 14392 14393
+14281 14282 14197
+14393 14394 14282
+13918 13917 14027
+14026 14106 14027
+14025 14026 13916
+14025 14197 14106
+14025 14106 14026
+14197 14282 14106
+14196 14105 14104
+13915 13837 13836
+14392 14279 14391
+14280 14196 14279
+14104 14105 14024
+14196 14197 14105
+14389 14390 14277
+14483 14484 14390
+14391 14278 14390
+14195 14194 14278
+14104 14023 14022
+14024 13914 14023
+13834 13912 13913
+13834 13911 13912
+13913 14021 14022
+13912 13911 14021
+14105 13915 14024
+14025 13838 13915
+13915 13836 13914
+13746 13662 13836
+13913 13835 13834
+13661 13660 13745
+13834 13835 13745
+13914 13836 13835
+13835 13662 13661
+13746 13557 13662
+13660 13485 13484
+13308 13196 13307
+13662 13486 13661
+13308 13307 13485
+13198 13309 13199
+13403 13487 13488
+13308 13486 13403
+13485 13661 13486
+13486 13487 13403
+13486 13557 13487
+13489 13404 13488
+13488 13557 13558
+13559 13488 13558
+13404 13403 13488
+13310 13404 13405
+13309 13403 13404
+13311 13310 13406
+13201 13200 13310
+13406 13405 13489
+13406 13310 13405
+13560 13489 13559
+13405 13404 13489
+13663 13664 13559
+13747 13665 13664
+13557 13663 13558
+13746 13747 13663
+13665 13559 13664
+13489 13488 13559
+13838 13916 13839
+14026 14027 13917
+13838 13839 13747
+13918 14027 14028
+13916 13917 13839
+13916 14026 13917
+13665 13748 13666
+13665 13747 13748
+13667 13841 13842
+13840 13918 14029
+13493 13492 13667
+13491 13666 13667
+13666 13560 13665
+13666 13491 13490
+13668 13493 13667
+13313 13206 13205
+13408 13490 13491
+13407 13406 13490
+13408 13311 13407
+13204 13203 13311
+13490 13408 13407
+13312 13205 13204
+13491 13409 13408
+13491 13492 13409
+13205 13312 13313
+13312 13408 13409
+13492 13313 13409
+13207 13206 13313
+13669 13493 13668
+13209 13114 13113
+13315 13210 13209
+13208 13207 13314
+13493 13315 13314
+13210 13114 13209
+13314 13315 13209
+13211 13115 13114
+13494 13315 13493
+13316 13211 13315
+13315 13211 13210
+13316 13212 13211
+13669 13494 13493
+13670 13495 13494
+13749 13668 13667
+13750 13751 13668
+13751 13669 13668
+13846 13847 13671
+13750 13749 13843
+14029 14028 14108
+13668 13749 13750
+13667 13842 13749
+13843 13751 13750
+13843 13923 13844
+13751 13844 13669
+14398 14034 14397
+13843 13844 13751
+13923 14033 13844
+13844 14033 13845
+13923 13922 14032
+13921 14031 14032
+14283 14198 14394
+13843 13921 13922
+13920 14031 13921
+13923 14032 14033
+14201 14200 14396
+13842 13920 13921
+13842 13841 13919
+14029 13918 14028
+13840 13839 13918
+13920 13919 14031
+13841 13840 14029
+13919 13841 14030
+14028 14107 14108
+14198 14199 14108
+14030 13841 14029
+14198 14283 14199
+14031 13919 14030
+14029 14108 14199
+14589 14588 14684
+14395 14283 14394
+14199 14030 14029
+14395 14199 14283
+14200 14031 14030
+14394 14489 14395
+14394 14488 14489
+14791 14684 14790
+14791 14792 14590
+14489 14589 14395
+14489 14588 14589
+14200 14395 14396
+14395 14589 14590
+14395 14200 14199
+14395 14590 14396
+14031 14200 14201
+14590 14793 14396
+14032 14201 14033
+14396 14793 14397
+14201 14397 14033
+14201 14396 14397
+14202 14034 14398
+14397 14794 14591
+14794 14969 14795
+14794 14793 14968
+14397 14793 14794
+14590 14792 14793
+15049 15161 15050
+14966 14965 15049
+14794 14968 14969
+14967 15050 15162
+14795 14969 14970
+14968 15163 14969
+15358 15163 15560
+15358 15164 15163
+15846 15760 15759
+15848 15761 15760
+15561 15760 15761
+15560 15759 15760
+16035 15954 15953
+15560 15163 15162
+15953 15559 15558
+15758 15560 15559
+15161 15357 15162
+15559 15560 15162
+15159 15160 14963
+14964 14965 14792
+15357 15558 15559
+15757 15952 15558
+15162 15357 15559
+15160 15558 15357
+15557 15757 15558
+15557 15652 15756
+15160 15159 15356
+15354 15444 15355
+15557 15356 15355
+15558 15160 15356
+15357 15161 15160
+15049 14965 15048
+14966 15049 15050
+15048 15160 15161
+15050 15161 15162
+15049 15048 15161
+14967 14869 14966
+14793 14792 14869
+15048 14964 15160
+14790 14683 14789
+14963 14964 14791
+14963 15160 14964
+14586 14789 14683
+14788 14961 14789
+15047 15159 14962
+15354 15355 15159
+15356 15159 15355
+14963 14962 15159
+15046 15157 14960
+15354 15159 15158
+15157 14961 14960
+15158 15047 14961
+14961 15047 14962
+15158 15159 15047
+14586 14788 14789
+14787 14960 14788
+15046 14959 15045
+15046 14960 14959
+14786 14868 14787
+14867 14959 14868
+15353 15253 15352
+15253 15252 15352
+15552 15442 15352
+15157 15046 15156
+15353 15157 15253
+15158 14961 15157
+15555 15443 15554
+15354 15158 15353
+15650 15552 15753
+15352 15551 15552
+15443 15442 15554
+15353 15352 15442
+15554 15553 15650
+15552 15752 15753
+15442 15553 15554
+15442 15552 15553
+15754 15650 15753
+15754 15651 15650
+15555 15651 15556
+15554 15650 15651
+15354 15443 15556
+15554 15651 15555
+15353 15443 15354
+15353 15442 15443
+15951 15756 15755
+15557 15444 15652
+15951 15755 15950
+15652 15556 15755
+15757 15756 15951
+15757 15557 15756
+15951 16133 15952
+16325 16326 16134
+16133 16132 16325
+17046 16716 17045
+15952 16133 16134
+15951 15950 16132
+16323 16419 16420
+16322 16130 16321
+15754 15948 15949
+16130 16322 16131
+15951 16132 16133
+16131 16323 16132
+15950 16130 16131
+16321 16416 16417
+15753 15948 15754
+15753 15947 15948
+15950 15949 16130
+15950 15755 15949
+16129 16321 16130
+16129 16320 16321
+16517 16518 16416
+16715 16621 16714
+16520 16418 16417
+16323 16131 16322
+16715 16520 16621
+16418 16322 16417
+16416 16518 16417
+16517 16620 16518
+16417 16519 16520
+16621 16620 16714
+16878 16714 16877
+16621 16518 16620
+16878 16715 16714
+16520 16519 16621
+16879 16715 16878
+16879 16521 16715
+16419 16521 16420
+16419 16418 16521
+16521 16418 16520
+16419 16323 16418
+16716 16522 16521
+16324 16323 16420
+16524 16523 16717
+16325 16324 16523
+17045 16716 16879
+16522 16420 16521
+16523 16522 16716
+16523 16324 16522
+17047 16718 16717
+16326 16325 16523
+16717 16525 16524
+16422 16328 16421
+16525 16718 16526
+16525 16717 16718
+16526 16422 16525
+16137 16138 16037
+16421 16326 16524
+16327 16223 16326
+16525 16421 16524
+16525 16422 16421
+16421 16327 16326
+16328 16223 16327
+16224 16223 16328
+16134 16326 16223
+15952 16135 15953
+16134 16223 16135
+16223 16224 16135
+16224 16328 16329
+16526 16329 16422
+16136 16135 16224
+16224 16329 16136
+16526 16527 16329
+16136 16035 15953
+16136 16329 16137
+15953 15954 15758
+16036 16037 15954
+16035 16036 15954
+16035 16136 16137
+16138 15956 15955
+15848 15760 15847
+15956 15846 15955
+15847 15760 15846
+16139 15956 16138
+16139 16038 15956
+16038 16139 16140
+16138 16330 16139
+16035 16137 16036
+16329 16330 16137
+16137 16330 16138
+16526 16718 16527
+16329 16527 16330
+16718 17047 16719
+16527 16719 16330
+16527 16718 16719
+16880 16528 16719
+16529 16331 16528
+13670 13846 13671
+13845 14033 14034
+14591 14398 14397
+14202 14035 14034
+13848 13849 13754
+13497 13498 13319
+13848 13752 13847
+13753 13673 13752
+13674 13564 13563
+13318 13497 13319
+13495 13670 13671
+13494 13669 13670
+13118 13117 13318
+13317 13316 13494
+13563 13496 13562
+13318 13319 13119
+13495 13496 13318
+13754 13673 13753
+13562 13672 13673
+13561 13671 13672
+13561 13562 13496
+13561 13672 13562
+13563 13564 13497
+13565 13498 13497
+13673 13563 13562
+13673 13674 13563
+13563 13497 13496
+13564 13565 13497
+13674 13565 13564
+13756 13757 13675
+13754 13674 13673
+13756 13675 13674
+13565 13566 13498
+13565 13674 13675
+13755 13754 13849
+13753 13752 13848
+13848 13754 13753
+13849 13756 13755
+13674 13755 13756
+13674 13754 13755
+14034 14035 13847
+14035 13849 13848
+13847 14035 13848
+14203 14284 14204
+14203 14204 14035
+14286 14401 14287
+14036 13851 13850
+13852 13677 13759
+13758 13757 13850
+13675 13566 13565
+13567 13566 13675
+13567 13675 13676
+13758 13759 13676
+13851 13852 13759
+14205 14287 14206
+13925 13852 13924
+13851 13924 13852
+13851 14037 13924
+14037 14038 13924
+14038 13926 13925
+14206 14038 14037
+14109 14039 14038
+13925 13926 13852
+14039 14109 13853
+13571 13678 13679
+13926 13853 13852
+13926 14039 13853
+13853 13678 13677
+13760 13679 13678
+13568 13569 13500
+13677 13678 13570
+13415 13414 13501
+13570 13678 13571
+13571 13679 13572
+13324 13217 13323
+13215 13216 13124
+13501 13502 13415
+13570 13571 13502
+13572 13324 13503
+13323 13217 13216
+13569 13501 13500
+13570 13502 13501
+13677 13568 13676
+13569 13570 13501
+13677 13569 13568
+13677 13570 13569
+13758 13675 13757
+13758 13676 13675
+13500 13499 13568
+13498 13566 13567
+13412 13499 13500
+13567 13568 13499
+13414 13415 13322
+13415 13416 13322
+13322 13215 13214
+13216 13125 13124
+13322 13216 13215
+13322 13416 13323
+13321 13413 13414
+13416 13417 13323
+13502 13416 13415
+13502 13503 13416
+13125 13216 13217
+13216 13322 13323
+13503 13324 13417
+13020 12924 12923
+13326 13325 13418
+12821 12820 12922
+12921 12920 13124
+12925 12741 12924
+12741 12740 12823
+12737 12821 12738
+13019 13126 12922
+12437 12532 12533
+12631 12740 12632
+12739 12822 12740
+12344 12262 12261
+12630 12530 12737
+12533 12532 12631
+12630 12737 12738
+12820 12921 12922
+12530 12736 12737
+12820 12736 12921
+12738 12821 12922
+12737 12820 12821
+13125 12921 13124
+12736 12529 12735
+12527 12629 12734
+12920 12921 12735
+12921 12736 12735
+12820 12737 12736
+13214 13123 13213
+13124 12920 13123
+12919 13018 12920
+13123 12920 13018
+12525 12731 12732
+13120 13119 13319
+13410 13320 13319
+13122 13018 13121
+13123 13122 13213
+13123 13018 13122
+13322 13214 13321
+13215 13124 13214
+13213 13320 13321
+13411 13499 13412
+13412 13413 13321
+13412 13500 13413
+13321 13414 13322
+13413 13500 13414
+13321 13320 13412
+13410 13498 13499
+13412 13320 13411
+13213 13121 13320
+13214 13213 13321
+13122 13121 13213
+13018 12919 13121
+13318 13496 13497
+13118 13318 13119
+13318 13117 13317
+13320 13410 13411
+13319 13498 13410
+13318 13317 13495
+13212 13316 13317
+13317 13116 13212
+12916 12917 12730
+13317 13117 13116
+13118 12917 13117
+12732 12731 12918
+12730 12729 12916
+12919 13120 13121
+12918 13119 13120
+12734 12919 12920
+12918 13120 12919
+13119 12917 13118
+12522 12523 12426
+13117 12916 13116
+12728 12727 12915
+13116 12916 12915
+13117 12917 12916
+12918 12731 12917
+12733 12919 12734
+12731 12730 12917
+12731 12524 12730
+12733 12627 12732
+12525 12430 12524
+12919 12733 12918
+12627 12525 12732
+12629 12628 12733
+12526 12525 12627
+12627 12733 12628
+12732 12918 12733
+12528 12527 12734
+12527 12526 12629
+12530 12529 12736
+12435 12530 12630
+12337 12527 12431
+12735 12529 12528
+12531 12435 12630
+12434 12433 12530
+12431 12527 12528
+12337 12336 12527
+12342 12435 12436
+12342 12434 12435
+12435 12531 12436
+12435 12434 12530
+12341 12260 12433
+12339 12432 12258
+12528 12529 12432
+12259 12340 12260
+12529 12530 12433
+12525 12524 12731
+12428 12523 12524
+12628 12526 12627
+12428 12427 12523
+12629 12526 12628
+12527 12336 12526
+12424 12522 12425
+12424 12521 12522
+12422 12521 12423
+12426 12523 12427
+12522 12729 12523
+12335 12426 12427
+12425 12522 12426
+12430 12429 12524
+12429 12430 12335
+12526 12335 12525
+12336 12257 12335
+12260 12341 12342
+12524 12429 12428
+12430 12525 12335
+12432 12339 12528
+12338 12337 12431
+12526 12336 12335
+12337 12257 12336
+12338 12339 12257
+12338 12431 12339
+11226 11095 11284
+12257 12339 12258
+12260 12340 12433
+12258 12432 12340
+12258 12340 12259
+10158 10197 10198
+10158 10260 10197
+10548 10484 10684
+10751 10750 10897
+10684 10831 10749
+11031 10896 10978
+11032 10897 10896
+11032 11031 11153
+10896 10895 10978
+11031 10978 11030
+10895 10831 11095
+11030 11095 11096
+11030 10978 11095
+11226 11152 11095
+11153 11096 11152
+11285 11226 11284
+11153 11152 11226
+10593 10548 10684
+10749 10750 10685
+10548 10549 10485
+10484 10446 10384
+10485 10447 10446
+10485 10484 10548
+10485 10446 10484
+10198 10111 10158
+10386 10297 10385
+10088 10089 10030
+10088 10111 10089
+10030 9988 10088
+9833 9745 9988
+10111 10112 10089
+10111 10198 10199
+10112 10199 10200
+10111 10199 10112
+10089 10090 10031
+10113 10114 10032
+9988 10031 9989
+9988 10030 10031
+9988 9989 9924
+10031 10090 10032
+10033 10032 10114
+9989 10031 10032
+10113 10200 10114
+10199 10297 10298
+10299 10298 10386
+10200 10199 10298
+10487 10486 10595
+10386 10298 10297
+10446 10447 10385
+10485 10486 10447
+10486 10386 10447
+10387 10299 10386
+10685 10750 10686
+10549 10486 10485
+10686 10595 10594
+10596 10752 10753
+10594 10595 10549
+10751 10752 10595
+10686 10751 10595
+10687 10753 10754
+11419 11289 11288
+11154 11153 11227
+11420 11356 11289
+11286 11285 11354
+11355 11354 11418
+11355 11288 11287
+11355 11287 11354
+11154 11032 11153
+10593 10685 10594
+10750 10751 10686
+10594 10685 10686
+10749 10896 10750
+11096 11031 11030
+11032 10896 11031
+10684 10685 10593
+10684 10749 10685
+11226 11227 11153
+11285 11286 11227
+11287 11286 11354
+11287 11227 11286
+11228 11154 11227
+11228 11155 11154
+12043 12187 12116
+12118 12188 12189
+12533 12438 12437
+12344 12261 12343
+12345 12344 12438
+12343 12437 12344
+12535 12346 12534
+12344 12437 12438
+12188 12262 12189
+12188 12261 12262
+12119 12118 12189
+12117 12188 12118
+11420 11421 11356
+11982 12044 12045
+12117 12118 12044
+11983 11913 11982
+12045 11984 11983
+11914 11857 11856
+11985 11914 11984
+11855 11982 11913
+11856 11795 11855
+11984 11914 11913
+11985 11915 11914
+11914 11856 11855
+11857 11795 11856
+12047 11915 11985
+12047 12048 11915
+12192 12193 12122
+12048 11916 11915
+12123 12124 12050
+11558 11492 11557
+11621 11557 11556
+11621 11622 11559
+11621 11558 11557
+11622 11623 11560
+11492 11559 11493
+11558 11621 11559
+11423 11493 11424
+11559 11622 11560
+11494 11424 11493
+11493 11559 11560
+11560 11494 11493
+11358 11292 11357
+11356 11422 11357
+11421 11492 11422
+11493 11423 11422
+11424 11357 11423
+11419 11420 11289
+11491 11557 11492
+11419 11491 11420
+11556 11557 11491
+11559 11492 11558
+11493 11422 11492
+11419 11288 11355
+11290 11356 11357
+11490 11419 11418
+11490 11491 11419
+11032 11155 10897
+11228 11288 11155
+10897 10752 10751
+10897 11155 11156
+11288 11289 11155
+11358 11357 11424
+10387 10487 10488
+10595 10752 10596
+10388 10201 10387
+10200 10298 10299
+10488 10487 10596
+10387 10386 10487
+10034 10033 10114
+10114 10201 10034
+9989 9990 9926
+10032 10033 9990
+9928 9991 9992
+9990 10033 9991
+9836 9890 9930
+9991 10033 9992
+10200 10201 10114
+10299 10387 10201
+10033 10034 9992
+10201 10202 10034
+10897 10898 10752
+10899 10832 10753
+10596 10597 10488
+10596 10753 10597
+10897 11156 10898
+11097 11158 11159
+10753 10687 10597
+10754 10832 10755
+10898 11033 10899
+11157 11230 11158
+11033 11034 10899
+10900 10755 10832
+11294 11159 11293
+11157 11229 11230
+10898 11156 11033
+11155 11289 11156
+11292 11229 11291
+11157 11156 11229
+11156 11290 11229
+11289 11356 11290
+11290 11291 11229
+11290 11357 11291
+11230 11292 11293
+11291 11357 11292
+11425 11358 11424
+11293 11292 11358
+11293 11158 11230
+11034 10900 10899
+11293 11159 11158
+11160 11161 11037
+11158 11034 11033
+10901 11037 10902
+11098 11035 11097
+11034 11158 11097
+10899 10900 10832
+11034 11097 11035
+10754 10755 10687
+10900 11035 10901
+10488 10598 10388
+10755 10756 10598
+10034 10202 10035
+10201 10388 10202
+11034 11035 10900
+11097 11159 11098
+10599 10756 10901
+10755 10900 10756
+10900 10901 10756
+11035 11098 11036
+10390 10389 10600
+10388 10598 10599
+10204 10203 10390
+10202 10388 10389
+10205 10037 10204
+9839 9838 10037
+10389 10203 10202
+10204 10036 10203
+10599 10902 10600
+11037 11161 10902
+11036 11160 11037
+11162 11429 11163
+11294 11160 11159
+11036 10901 11035
+11160 11036 11098
+11037 10901 11036
+11358 11425 11293
+11426 11160 11294
+11159 11160 11098
+11426 11161 11160
+11562 11681 11426
+11683 11684 11428
+11426 11681 11427
+11919 11683 11682
+11680 11797 11681
+11917 12051 11918
+11797 11918 11681
+12125 12195 12196
+11738 11796 11680
+11917 11918 11797
+11561 11680 11562
+11623 11622 11679
+11560 11561 11494
+11560 11623 11624
+11426 11425 11562
+11294 11293 11425
+11425 11494 11561
+11425 11424 11494
+11561 11624 11680
+11561 11560 11624
+11738 11679 11622
+11738 11680 11679
+11796 11797 11680
+11917 11796 11738
+11917 11797 11796
+12194 12124 12123
+12195 12125 12124
+11916 12048 11986
+12349 12539 12350
+12194 12195 12124
+12351 12352 12197
+12350 12440 12351
+12197 12198 12054
+12124 12125 12051
+12052 11918 12051
+12196 12052 12125
+12196 12351 12197
+12055 12054 12199
+12053 12052 12196
+11919 12053 12054
+11919 11918 12053
+12196 12197 12053
+12264 12265 12198
+12353 12265 12264
+12353 12443 12354
+12352 12264 12197
+12352 12353 12264
+12195 12349 12196
+12542 12640 12641
+12440 12441 12351
+12747 12637 12636
+12351 12442 12352
+12541 12639 12640
+12642 12641 12748
+12542 12352 12442
+12643 12543 12642
+12543 12353 12542
+12639 12748 12640
+13508 13419 13507
+12747 12639 12638
+12640 12542 12541
+12441 12541 12442
+12441 12440 12541
+12642 12542 12641
+12353 12352 12542
+12541 12638 12639
+12541 12540 12638
+12746 12636 12635
+12637 12540 12636
+12638 12637 12747
+12747 12636 12746
+12746 12635 12745
+12636 12540 12539
+12440 12350 12540
+12538 12539 12349
+12263 12193 12192
+12196 12350 12351
+12540 12541 12440
+12349 12350 12196
+12539 12540 12350
+12048 12122 12049
+12194 12349 12195
+12048 12047 12192
+12536 12439 12347
+12347 12439 12348
+12536 12537 12439
+12743 12633 12536
+12743 12535 12742
+12536 12347 12535
+12347 12191 12346
+12347 12192 12191
+12046 12047 11985
+12121 12191 12047
+12121 12046 12120
+11985 11984 12046
+11982 12045 11983
+12044 12118 12045
+12046 12119 12120
+12045 12118 12119
+12346 12345 12534
+12262 12344 12345
+12347 12346 12535
+12190 12120 12119
+12191 12190 12346
+12191 12121 12190
+12924 13021 12925
+12924 13020 13021
+12740 12741 12632
+12823 12924 12741
+12535 12534 12742
+12438 12533 12534
+12925 13021 13022
+13020 13127 13021
+12742 12925 12926
+12742 12741 12925
+12925 13022 12926
+13128 13325 13326
+12928 12927 13023
+12927 13130 13023
+12926 12927 12743
+12926 13130 12927
+12824 12927 12928
+12536 12633 12537
+12743 12927 12824
+12928 13024 12824
+12743 12744 12633
+12743 12824 12744
+13023 13131 13024
+13131 13218 13132
+13328 13419 13329
+13763 13762 13855
+13507 13419 13328
+13024 13131 13132
+13023 13130 13131
+13326 13505 13327
+13575 13682 13683
+12926 13129 13130
+13022 13128 13129
+13021 13128 13022
+13021 13127 13128
+13573 13505 13504
+13129 13128 13326
+14599 14491 14598
+13504 13326 13418
+13505 13573 13574
+13504 13680 13573
+13504 13505 13326
+13574 13575 13505
+13761 13762 13681
+13764 13765 13684
+13573 13681 13574
+13680 13761 13681
+13574 13682 13575
+13681 13762 13682
+13854 13761 13680
+13854 13927 13855
+13927 13928 13855
+14040 13927 13854
+14040 14111 14041
+13854 13855 13762
+13928 13929 13855
+13762 13763 13682
+13684 13506 13683
+13683 13682 13763
+13763 13764 13683
+13684 13685 13507
+13683 13764 13684
+13763 13855 13764
+13928 14041 13929
+13764 13856 13765
+14042 14113 14114
+14043 13931 13930
+13932 13858 13857
+14043 13932 13931
+13933 13858 13932
+13857 13858 13685
+13686 13859 13860
+13857 13856 13930
+13764 13855 13856
+13856 13857 13765
+13931 13932 13857
+13684 13507 13506
+13684 13765 13685
+13327 13328 13218
+13327 13507 13328
+13219 13329 13330
+13219 13328 13329
+13419 13330 13329
+13857 13685 13765
+13859 13934 14045
+13858 13686 13685
+13509 13330 13508
+13685 13509 13508
+13512 13576 13577
+13511 13687 13576
+13511 13510 13687
+13220 13331 13332
+13220 13332 13221
+13331 13510 13332
+13509 13510 13331
+13859 13858 13934
+13510 13686 13687
+13859 14045 14046
+13687 13686 13860
+13686 13858 13859
+13509 13686 13510
+13509 13685 13686
+14043 14044 13932
+13934 13858 13933
+14115 14116 14044
+14116 14117 14045
+14116 14045 14044
+14118 14046 14045
+14119 14046 14118
+14047 13860 14046
+13860 13861 13687
+13860 14047 13861
+13578 13512 13577
+13421 13420 13511
+14046 14119 14047
+14301 14415 14416
+13864 13766 13863
+14047 14120 14121
+14049 13862 14048
+13689 13578 13688
+14416 14302 14301
+14048 14121 14122
+13864 13863 14049
+14048 14122 14123
+13335 13334 13513
+13862 13861 14048
+13577 13688 13578
+13577 13576 13688
+14305 14224 14223
+13863 13689 13688
+13027 13026 13133
+12825 12749 12748
+13511 13576 13512
+13028 13027 13133
+12931 12930 13027
+13222 13223 13134
+12753 12646 12645
+13028 12931 13027
+13029 12932 12931
+13029 13028 13133
+13029 12931 13028
+12748 12929 12825
+13026 13027 12930
+12930 13025 13026
+13333 13332 13420
+13333 13420 13421
+13332 13510 13420
+12930 12929 13025
+12748 12639 12929
+13221 13332 13333
+12930 12826 12929
+12929 12826 12825
+12825 12826 12749
+12930 12751 12750
+12826 12750 12749
+12826 12930 12750
+12751 12545 12750
+12445 12444 12544
+12749 12643 12642
+12443 12353 12543
+12543 12643 12544
+12749 12750 12643
+12544 12443 12543
+12354 12267 12266
+12353 12266 12265
+12354 12445 12355
+12268 12267 12354
+12199 12054 12198
+12055 11920 12054
+11683 11919 11920
+12268 12199 12267
+12268 12200 12199
+12444 12354 12443
+12444 12445 12354
+12355 12447 12356
+12200 12055 12199
+12127 12056 12126
+12056 12057 11922
+12126 12200 12270
+12126 12055 12200
+12126 12056 12055
+11684 11429 11428
+12055 12056 11921
+12127 12128 12056
+12128 12201 12202
+12127 12126 12201
+12446 12447 12355
+12201 12126 12270
+12355 12269 12268
+12270 12200 12269
+12544 12545 12445
+12270 12269 12355
+12751 12752 12546
+12270 12356 12201
+12445 12545 12446
+12544 12750 12545
+12545 12447 12446
+12547 12645 12646
+12933 12827 12753
+12751 12546 12545
+12753 12645 12644
+12357 12547 12548
+12752 12753 12644
+12646 12548 12547
+12545 12546 12447
+12644 12645 12547
+12357 12356 12547
+12546 12644 12547
+12201 12356 12271
+12447 12546 12356
+12357 12271 12356
+12202 12201 12271
+11922 11798 11921
+11685 11429 11684
+12056 11922 11921
+12059 12129 12204
+12204 12203 12273
+12202 12271 12272
+12273 12357 12358
+12272 12271 12357
+12060 12059 12204
+11987 11922 12057
+12059 11923 11987
+11858 11925 11800
+12057 12058 11987
+12057 12129 12058
+11924 11799 11923
+11800 11739 11686
+12058 12059 11987
+11799 11685 11923
+11924 12059 12060
+12058 12129 12059
+12754 12548 12646
+12549 12358 12548
+12272 12203 12202
+12273 12358 12204
+12272 12273 12203
+12272 12357 12273
+12932 12933 12753
+12827 12754 12753
+12753 12754 12646
+12828 12829 12754
+12754 12829 12755
+12828 12934 12829
+12754 12827 12828
+13136 13137 12935
+13135 13224 13136
+13224 13336 13136
+13513 13336 13335
+13693 13692 13769
+13336 13224 13335
+13136 12934 13135
+12827 12933 12934
+13134 13133 13222
+12828 12827 12934
+12753 12752 12932
+13134 12933 12932
+13135 12934 12933
+12931 12932 12752
+13029 13133 13134
+12933 13134 13135
+12932 13029 13134
+13223 13334 13335
+13222 13133 13334
+13134 13223 13135
+13222 13334 13223
+13690 13766 13767
+13690 13689 13766
+13862 13863 13688
+13690 13579 13689
+13578 13689 13579
+14123 14049 14048
+13766 13689 13863
+13862 14049 13863
+14049 14222 14223
+13766 13864 13767
+14223 14224 14050
+14049 14050 13864
+14049 14123 14222
+13514 13513 13580
+13864 14050 13935
+13513 13514 13336
+13580 13691 13514
+13767 13864 13865
+14421 14225 14420
+13935 14050 14051
+14054 14229 14055
+14052 13936 14124
+14424 14425 14228
+14053 14052 14124
+13936 13867 13866
+13867 13768 13866
+14052 13937 13936
+13336 13515 13337
+13514 13691 13515
+12755 12647 12549
+12755 12756 12647
+12647 12648 12550
+12647 12756 12648
+12937 12936 13139
+12936 13137 13138
+13768 13769 13692
+13337 13693 13338
+13338 13139 13337
+13138 13137 13337
+13693 13694 13338
+12937 12758 12757
+12650 12649 12757
+12550 12648 12649
+12650 12552 12448
+12360 12550 12551
+12554 12553 12938
+12208 12207 12362
+12758 12650 12757
+12758 12552 12650
+12936 12937 12757
+12759 12553 12363
+13868 13869 13693
+13868 13937 14053
+13515 13693 13337
+13769 13868 13693
+13867 13868 13769
+13937 14052 14053
+14226 14227 14124
+13869 13868 14053
+14306 14423 14227
+14228 14054 14053
+14423 14228 14227
+14054 13695 13694
+14426 14515 14427
+14056 14057 13697
+13339 13694 13695
+13693 13869 13694
+14053 14054 13869
+14228 14229 14054
+12940 13340 13341
+14425 14229 14228
+13695 14055 13696
+13695 14054 14055
+14055 14056 13696
+14624 14623 14820
+14428 14626 14429
+14430 14431 14230
+13699 13698 13872
+13698 13697 13870
+13872 13938 13939
+13871 14058 13938
+13342 13697 13698
+13870 14057 14058
+13342 13341 13697
+13696 14056 13697
+13698 13870 13871
+13697 14057 13870
+13697 13341 13696
+12939 12938 13339
+12556 12940 12941
+13340 13696 13341
+12942 13342 13343
+12941 13341 13342
+11932 12210 12211
+12555 12940 12556
+12212 12555 12556
+12555 12939 12940
+12941 12940 13341
+12555 12554 12939
+12210 12553 12554
+12363 12362 12552
+13340 13339 13695
+12938 12937 13338
+12940 12939 13340
+12554 12938 12939
+13339 13338 13694
+13339 12938 13338
+13338 12937 13139
+12938 12759 12937
+12937 12759 12758
+12938 12553 12759
+12209 12132 12208
+12064 12131 12132
+12066 12065 12209
+11929 11803 12064
+11805 11930 11862
+11930 11804 11929
+12210 12209 12553
+12065 12132 12209
+12555 12211 12554
+11930 12065 12066
+12066 12210 11931
+12066 12209 12210
+11933 11932 12212
+12210 12554 12211
+11933 12212 12067
+12211 12555 12212
+11811 11743 11810
+11694 11743 11695
+11932 11931 12210
+11862 11930 11931
+11809 11932 11933
+11808 11692 11807
+11810 11809 11933
+11361 11438 11302
+11934 11810 11933
+11810 11743 11694
+11934 11811 11810
+11440 11572 11500
+11744 11695 11743
+11744 11812 11574
+11810 11694 11809
+11437 11361 11300
+11809 11694 11572
+11573 11441 11500
+11806 11807 11742
+11808 11570 11692
+11932 11808 11931
+11692 11742 11807
+11931 11808 11807
+11932 11693 11808
+11930 11929 12065
+11930 11805 11804
+11929 11804 11803
+11805 11691 11690
+11862 11806 11805
+11862 11807 11806
+11801 11860 11861
+12061 12062 11988
+11741 11861 11802
+11927 11988 12062
+11927 11989 11861
+12063 12064 11928
+11928 11989 12063
+11928 11861 11989
+12062 12206 12207
+11989 12062 12063
+12130 12131 12064
+12130 12208 12131
+12063 12207 12130
+12363 12552 12759
+12274 12362 12207
+12360 12551 12448
+12209 12363 12553
+12208 12362 12363
+12362 12448 12552
+12362 12274 12361
+12361 12274 12360
+12207 12063 12062
+12448 12361 12360
+12448 12362 12361
+11860 11927 11861
+11926 11988 11927
+12274 12206 12360
+12274 12207 12206
+11927 12062 11989
+12061 12060 12205
+12206 12205 12360
+12205 12060 12204
+12360 12205 12359
+12206 12062 12061
+12206 12061 12205
+11988 11925 12061
+12059 11924 11923
+12060 11925 11924
+11860 11926 11927
+11859 11925 11926
+11741 11801 11861
+11859 11926 11860
+11687 11741 11688
+11740 11801 11741
+11924 11858 11799
+11924 11925 11858
+11739 11801 11740
+11859 11860 11801
+11690 11691 11629
+11742 11692 11630
+11436 11359 11498
+11497 11567 11629
+11231 11297 11298
+11231 11296 11297
+11435 11296 11434
+10979 10911 10837
+11567 11497 11496
+11568 11630 11498
+11231 11168 11296
+11039 10909 11167
+11231 11099 11168
+10910 10836 10835
+10762 10836 10763
+10835 10690 10761
+11040 10979 11039
+11042 11171 10980
+11168 11099 11039
+11231 11298 11169
+11099 11040 11039
+11099 11169 11041
+10910 10837 10836
+10837 10764 10763
+10762 10763 10691
+10837 10911 10764
+10692 10763 10764
+10764 10911 10838
+11302 11234 11301
+10912 10911 10980
+10838 10911 10912
+11231 11169 11099
+11299 11360 11300
+11297 11359 11298
+11297 11296 11359
+11099 11041 11040
+11100 11170 11171
+11498 11630 11569
+11568 11691 11630
+11570 11436 11569
+11359 11435 11498
+11569 11436 11498
+11360 11298 11436
+11809 11572 11693
+11361 11302 11301
+11438 11437 11571
+11437 11436 11570
+11436 11437 11360
+11570 11571 11437
+11499 11438 11571
+11362 11303 11302
+11499 11439 11438
+11440 11364 11363
+11693 11572 11571
+11499 11572 11440
+11571 11572 11499
+11440 11441 11364
+11694 11573 11572
+11694 11695 11631
+11572 11573 11500
+11363 11364 11303
+11362 11363 11303
+11440 11500 11441
+11439 11440 11363
+11439 11499 11440
+11300 11361 11301
+11437 11438 11361
+11438 11362 11302
+11439 11362 11438
+11439 11363 11362
+11232 11169 11298
+11234 11233 11301
+11169 11100 11041
+11437 11300 11360
+11301 11233 11300
+11234 11171 11233
+11234 10980 11171
+11360 11299 11298
+11233 11171 11232
+11233 11299 11300
+11232 11298 11299
+11232 11170 11169
+11232 11171 11170
+11041 11042 10980
+11100 11171 11042
+11041 11100 11042
+11169 11170 11100
+10357 10265 10309
+10125 10126 10095
+10356 10357 10309
+10127 10169 10128
+10357 10310 10265
+10127 10052 9947
+10493 10357 10356
+10310 10218 10265
+10398 10310 10357
+10398 10399 10311
+10493 10551 10494
+10609 10610 10551
+10766 10693 10765
+10610 10609 10693
+10493 10494 10399
+10551 10610 10494
+10311 10399 10400
+10398 10493 10399
+10357 10493 10398
+10129 10311 10219
+10310 10398 10311
+10311 10129 10218
+9850 9851 9758
+10218 10129 10128
+10006 10056 10007
+9948 10052 9949
+10220 10219 10312
+9850 9948 9949
+9953 10007 9954
+10129 10052 10128
+10053 9949 10052
+9850 9849 9948
+9901 9947 9948
+10051 9947 9946
+10052 9948 9947
+10264 10217 10216
+10265 10218 10169
+10052 10127 10128
+10217 10265 10169
+10309 10217 10264
+10217 10168 10216
+10215 10168 10126
+10217 10169 10127
+10168 10127 10126
+10168 10217 10127
+10095 10051 10005
+9947 9900 9899
+10003 10050 10004
+10005 9946 9898
+9676 9752 9753
+10004 10005 9945
+10049 10094 10050
+10124 10165 10166
+10050 10005 10004
+10095 10126 10051
+10127 10051 10126
+10127 9947 10051
+10214 10307 10215
+10264 10216 10215
+10355 10307 10306
+10308 10264 10307
+10307 10264 10215
+10308 10309 10264
+10213 10305 10214
+10214 10167 10166
+10215 10126 10167
+10050 10124 10095
+10167 10126 10125
+10165 10213 10214
+10306 10307 10214
+10690 10762 10691
+10690 10689 10761
+10214 10305 10306
+10550 10608 10492
+10691 10692 10608
+10164 10213 10123
+10263 10304 10305
+10355 10305 10354
+10355 10306 10305
+10124 10094 10165
+10123 10213 10165
+10123 10094 10048
+10123 10165 10094
+10167 10124 10166
+10125 10095 10124
+10048 10049 10002
+10004 9945 9944
+9943 10002 10003
+10001 10047 10002
+10003 10049 10050
+10003 10002 10049
+10049 10048 10094
+10002 10047 10048
+10093 10164 10123
+10163 10212 10164
+10262 10212 10211
+10263 10164 10212
+9941 9940 9999
+10000 10046 10001
+10048 10093 10123
+10047 10046 10093
+10045 10092 9999
+10092 10122 10046
+10120 10045 10091
+9999 9939 10045
+10001 9941 10000
+10120 10161 10210
+10210 10209 10300
+10122 10092 10121
+10046 9999 10092
+10162 10122 10121
+10163 10164 10122
+10262 10302 10303
+10395 10489 10490
+10210 10301 10262
+10300 10489 10395
+10210 10262 10211
+10301 10302 10262
+10757 10907 10758
+10491 10396 10395
+10300 10395 10301
+10490 10491 10395
+10301 10352 10302
+10395 10396 10352
+10490 10606 10491
+10606 10490 10605
+10492 10491 10550
+10492 10448 10491
+10263 10303 10304
+10263 10212 10303
+10396 10397 10353
+10396 10491 10448
+10397 10448 10354
+10397 10396 10448
+10608 10607 10690
+10608 10550 10607
+10550 10606 10607
+10688 10761 10689
+10760 10688 10759
+10689 10607 10688
+10833 10761 10760
+10834 10835 10761
+10909 10834 10833
+10835 10836 10762
+11038 10909 10908
+11039 10910 10909
+10909 10835 10834
+10909 10910 10835
+11435 11497 11568
+11435 11434 11497
+11689 11690 11627
+11804 11805 11690
+11627 11628 11567
+11690 11629 11628
+11496 11566 11567
+11689 11803 11690
+11296 11167 11434
+11168 11039 11167
+11496 11434 11495
+11496 11497 11434
+11565 11495 11433
+11566 11627 11567
+11626 11689 11627
+11626 11625 11689
+11565 11566 11495
+11565 11626 11566
+11688 11625 11564
+11688 11802 11689
+11565 11433 11564
+11495 11434 11433
+11432 11433 11295
+11433 11434 11295
+11166 11038 10907
+11295 11167 11038
+10833 10759 10908
+10606 10550 10491
+10909 10833 10908
+10834 10761 10833
+10833 10760 10759
+10761 10688 10760
+10604 10757 10489
+10759 10688 10606
+10759 10606 10605
+10688 10607 10606
+10906 10757 10604
+10758 10759 10605
+10394 10604 10489
+10603 10906 10604
+10905 11165 10906
+11166 11295 11038
+10906 10907 10757
+11038 10908 10907
+10757 10758 10605
+10907 10908 10758
+11165 11166 10906
+11432 11564 11433
+11165 11432 11166
+11431 11563 11432
+11687 11688 11564
+11741 11802 11688
+11740 11687 11739
+11740 11741 11687
+10905 11164 11165
+11164 11431 11165
+11686 11563 11431
+11687 11564 11563
+10602 10904 10905
+11429 11685 11430
+11164 11430 11431
+11164 11163 11430
+11687 11686 11739
+11431 11430 11686
+11920 11684 11683
+11798 11685 11684
+11427 11428 11161
+11427 11682 11428
+10905 10904 11164
+10902 11161 11162
+10904 10903 11163
+11161 11428 11162
+10601 10904 10602
+11163 11164 10904
+10603 10905 10906
+10603 10602 10905
+10392 10602 10603
+10602 10391 10601
+10902 10903 10600
+10902 11162 10903
+10600 10601 10390
+10600 10903 10601
+10601 10391 10390
+10039 10115 10040
+10392 10205 10391
+10039 9933 9932
+10392 10206 10205
+10392 10393 10207
+10117 10116 10208
+10041 10040 10115
+10392 10207 10206
+10393 10208 10207
+10208 10394 10300
+10393 10604 10394
+10300 10209 10208
+10300 10301 10210
+10121 10120 10162
+10119 10118 10160
+10162 10210 10211
+10161 10209 10210
+10161 10120 10119
+10121 10092 10120
+10209 10159 10208
+10118 10117 10159
+10209 10160 10159
+10209 10161 10160
+9997 10043 10044
+10042 10041 10116
+10118 10044 10043
+10118 10119 10091
+10120 10091 10119
+10045 9998 10091
+9938 9997 10044
+9894 9843 9893
+9997 9996 10043
+9895 9996 9938
+10043 9996 9995
+9894 9996 9895
+9935 9994 9936
+10040 10041 9994
+10041 10115 10207
+9993 9933 10039
+10117 10042 10116
+9995 9937 10042
+10115 10039 10206
+9932 9840 10038
+10205 10038 10037
+10205 10206 10038
+10040 9993 10039
+10040 9994 9935
+9750 9794 9751
+9751 9722 9750
+9536 9413 9412
+9673 9674 9609
+9796 9751 9795
+9673 9722 9674
+9673 9750 9722
+10039 9932 10038
+9933 9892 9891
+9840 9841 9794
+9891 9892 9842
+9932 9891 9841
+9932 9933 9891
+9934 9935 9892
+9538 9478 9537
+9479 9480 9415
+9841 9795 9794
+9796 9797 9722
+9841 9796 9795
+9841 9842 9796
+9244 9243 9291
+9350 9413 9414
+9293 9349 9350
+9537 9478 9414
+9350 9351 9295
+9414 9478 9351
+9246 9295 9296
+8958 8957 8999
+9295 9351 9296
+9294 9295 9246
+9294 9350 9295
+8798 8799 8751
+9350 9349 9413
+9293 9292 9348
+9351 9350 9414
+9294 9293 9350
+9537 9413 9536
+9349 9348 9413
+9293 9244 9292
+9347 9348 9292
+9347 9412 9348
+8715 8751 8799
+8714 8713 8751
+8797 8796 8858
+8752 8800 8801
+8752 8799 8800
+8716 8715 8752
+8667 8611 8715
+8666 8714 8715
+8666 8713 8714
+8548 8611 8667
+8545 8608 8495
+8548 8547 8611
+8448 8404 8498
+8329 8404 8362
+8498 8547 8548
+8403 8497 8404
+8404 8497 8498
+8331 8330 8362
+8330 8329 8362
+8499 8406 8448
+8362 8404 8405
+8612 8548 8667
+8499 8448 8548
+8548 8612 8499
+8716 8752 8801
+8448 8406 8405
+8499 8449 8406
+8407 8449 8408
+8499 8612 8549
+8363 8407 8408
+8363 8406 8407
+8613 8549 8612
+8500 8499 8549
+8501 8450 8500
+8450 8449 8500
+8803 8717 8802
+8614 8615 8503
+8613 8716 8717
+8667 8715 8716
+8614 8550 8613
+8550 8549 8613
+8860 8801 8859
+8860 8859 8909
+8803 8802 8861
+8717 8801 8802
+8959 8958 8999
+8910 8909 8957
+8960 8911 8959
+8910 8861 8909
+8999 9000 8959
+8804 8615 8803
+8958 8910 8957
+8911 8804 8803
+8615 8614 8803
+8410 8409 8502
+8500 8549 8550
+8614 8502 8550
+8410 8334 8409
+8502 8409 8450
+8409 8408 8450
+8501 8502 8450
+8334 8333 8409
+8803 8614 8717
+8615 8504 8503
+8550 8502 8501
+8503 8411 8410
+8910 8911 8803
+8912 8913 8804
+8503 8410 8502
+8411 8334 8410
+8614 8503 8502
+8504 8411 8503
+8616 8505 8615
+8412 8411 8505
+8804 8718 8615
+8805 8806 8618
+8618 8617 8805
+8616 8615 8718
+8804 8913 8805
+8912 9001 8913
+8959 8911 8910
+8912 8804 8911
+9002 8913 9001
+8912 8911 8960
+9296 9353 9354
+9046 9001 9000
+8960 8959 9000
+9002 9001 9047
+8960 9000 9001
+9084 9046 9045
+9084 9047 9046
+9541 9611 9483
+9613 9614 9544
+9136 9087 9135
+9047 9084 9085
+9482 9541 9483
+9418 9482 9483
+9417 9416 9481
+9484 9418 9483
+9354 9353 9416
+9351 9352 9296
+9351 9478 9415
+9416 9415 9480
+9352 9351 9415
+9478 9479 9415
+9538 9480 9479
+9418 9417 9482
+9418 9354 9417
+9538 9539 9480
+9540 9482 9481
+9937 9995 9996
+9540 9541 9482
+9539 9610 9540
+9933 9934 9892
+9993 10040 9935
+9843 9935 9936
+9934 9993 9935
+9936 9893 9843
+9936 10042 9937
+9893 9937 9894
+9893 9936 9937
+9541 9610 9611
+9541 9540 9610
+9996 9894 9937
+9996 9997 9938
+9611 9612 9542
+9483 9611 9542
+9543 9612 9613
+9999 9940 9939
+9939 9998 10045
+9998 9939 9938
+9939 9896 9938
+9939 9940 9896
+9938 9896 9895
+9616 9617 9546
+9355 9297 9419
+9543 9613 9544
+9544 9614 9545
+9619 9618 9675
+9546 9545 9616
+9617 9618 9546
+9487 9619 9548
+9487 9547 9619
+9486 9485 9547
+9548 9619 9675
+9547 9618 9619
+9675 9620 9548
+9424 9423 9552
+9548 9620 9549
+9676 9677 9550
+9675 9723 9620
+9844 9752 9943
+9676 9620 9723
+10002 9942 10001
+9752 9676 9723
+10001 9942 9941
+10002 9943 9942
+9944 9943 10003
+10004 9944 10003
+9897 9844 9943
+9945 9897 9944
+9898 9946 9846
+9945 9845 9897
+9753 9799 9754
+9753 9752 9798
+9844 9897 9845
+9799 9846 9754
+9847 9900 9848
+9945 9898 9845
+9945 10005 9898
+9946 9899 9846
+9946 9947 9899
+9800 9847 9848
+9846 9899 9847
+9801 9848 9901
+9900 9947 9901
+9756 9849 9757
+9901 9948 9849
+9849 9850 9757
+9851 9759 9758
+9849 9801 9901
+9755 9800 9848
+9756 9801 9849
+9755 9848 9801
+9754 9800 9755
+9754 9846 9800
+9681 9756 9757
+9680 9755 9756
+9683 9682 9759
+9553 9680 9681
+9756 9681 9680
+9757 9682 9681
+9550 9551 9423
+9679 9680 9552
+9682 9553 9681
+9425 9424 9553
+9677 9551 9550
+9678 9679 9552
+9678 9753 9754
+9845 9898 9799
+9677 9678 9551
+9677 9753 9678
+9844 9798 9752
+9845 9799 9753
+9549 9550 9422
+9549 9676 9550
+9676 9753 9677
+9798 9845 9753
+9547 9487 9486
+9487 9488 9421
+9548 9488 9487
+9422 9359 9421
+9301 9302 9195
+9359 9422 9302
+9549 9488 9548
+9549 9422 9488
+9302 9303 9195
+9302 9422 9303
+9552 9423 9551
+9552 9680 9424
+9198 9424 9425
+9198 9092 9197
+9199 9198 9425
+9006 8809 8808
+9423 9424 9197
+9198 9008 9092
+9090 9196 9197
+9195 9303 9196
+9198 9197 9424
+9091 9090 9197
+9007 9090 9091
+8809 8621 8808
+9092 9091 9197
+9092 9008 9007
+9199 9009 9198
+8812 9010 8813
+8416 8417 8253
+8416 8621 8417
+8808 8621 8620
+8809 8622 8621
+9092 9007 9091
+9008 8810 9007
+8252 8415 8416
+8342 8414 8415
+9005 9006 8808
+9006 9007 8809
+9196 9006 9195
+9090 9007 9006
+9194 9005 9004
+9195 9006 9005
+8415 8619 8620
+8188 8291 8247
+8618 8806 8619
+9004 9005 8807
+8414 8618 8619
+8617 8616 8718
+8414 8413 8618
+8506 8505 8616
+8618 8413 8507
+8340 8248 8339
+9003 9088 9089
+9088 9192 9089
+8807 8806 9004
+8807 8619 8806
+9005 9194 9195
+9249 9299 9300
+9420 9357 9356
+9358 9300 9357
+9485 9420 9356
+9357 9300 9356
+9419 9485 9356
+9486 9487 9420
+9547 9485 9546
+9486 9420 9485
+9248 9247 9297
+9419 9356 9355
+9193 9249 9194
+9193 9248 9249
+9247 9248 9192
+9298 9249 9248
+9136 9191 9192
+9248 9297 9298
+9088 9087 9136
+9136 9135 9191
+9085 9084 9135
+9004 9003 9089
+9048 9047 9086
+9087 9086 9135
+9047 9085 9086
+9003 9048 9088
+9002 9047 9048
+9048 9087 9088
+9048 9086 9087
+8806 9003 9004
+8805 8913 9003
+8805 8617 8718
+8507 8506 8617
+8412 8506 8507
+8412 8505 8506
+8413 8338 8412
+8413 8339 8338
+8414 8340 8413
+8248 8247 8339
+8339 8291 8338
+8339 8247 8291
+8338 8337 8412
+8289 8245 8337
+8245 8289 8246
+8337 8338 8289
+8246 8290 8291
+8289 8338 8290
+8046 8045 8153
+8335 8411 8336
+8245 8246 8154
+8289 8290 8246
+8190 8156 8155
+8047 8154 8155
+8291 8188 8246
+8155 8154 8188
+8188 8189 8155
+8188 8247 8189
+8194 8193 8250
+8158 8093 8193
+8189 8190 8155
+8192 8249 8157
+8192 8157 8156
+8193 8093 8157
+8095 8049 8094
+7933 8048 8049
+8195 8194 8250
+8158 8193 8194
+8050 8095 8096
+8094 8158 8095
+8191 8192 8156
+8248 8249 8192
+8247 8190 8189
+8191 8156 8190
+8248 8191 8190
+8248 8192 8191
+8413 8340 8339
+8341 8342 8249
+8250 8249 8342
+8250 8193 8249
+8414 8341 8340
+8414 8342 8341
+8159 8195 8251
+8159 8095 8195
+7990 7934 8051
+7933 8049 8050
+8160 8159 8251
+8098 8051 8097
+7991 7935 8053
+8051 8098 8052
+8050 8097 8051
+8096 8159 8097
+8098 8160 8099
+8098 8097 8160
+8162 8161 8252
+8160 8251 8252
+8253 8162 8252
+8053 8099 8161
+8055 8162 8253
+8054 8053 8162
+8056 7940 7939
+7858 7791 7857
+8162 8053 8161
+7991 7936 7935
+7993 7937 7992
+7991 8053 8054
+7992 7937 7991
+7791 7790 7856
+8055 7993 8054
+7993 7938 7858
+8054 7993 7992
+7706 7859 7793
+8055 7938 7993
+7939 7940 7861
+7993 7858 7937
+7938 7859 7792
+7791 7792 7637
+7858 7938 7792
+7937 7857 7936
+7857 7791 7856
+7937 7936 7991
+7935 7790 7934
+7936 7857 7856
+7937 7858 7857
+8052 7990 8051
+8052 8053 7935
+8050 7934 7933
+7990 7935 7934
+8052 7935 7990
+7936 7856 7935
+7789 7521 7520
+7636 7522 7521
+7263 6991 6990
+7263 7264 6991
+6357 6208 6499
+6761 6501 6500
+6499 6760 6500
+6991 7264 6992
+7791 7637 7636
+7638 7706 7707
+7792 7705 7637
+7792 7859 7705
+7705 7638 7637
+7707 7793 7861
+7705 7706 7638
+7705 7859 7706
+6991 6992 6761
+6569 6637 6638
+7522 7264 7263
+7522 7638 7523
+6761 6992 6762
+7264 7265 6992
+6287 6360 6361
+6503 6425 6502
+6361 6360 6423
+6215 6136 6214
+6009 6080 6136
+5950 5951 5877
+6212 6284 6285
+6500 6359 6358
+6501 6360 6359
+6211 6284 6212
+6135 6211 6212
+6134 6133 6210
+6211 6210 6284
+6211 6134 6210
+5951 5952 5837
+6134 6211 6135
+6210 6209 6358
+6078 6005 6004
+6206 6207 6076
+6207 6498 6208
+6131 6208 6209
+6207 6497 6498
+6208 6498 6499
+6759 6989 6990
+6358 6357 6500
+6758 6497 6496
+6209 6357 6358
+6209 6208 6357
+6991 6760 6990
+6761 6500 6760
+7790 7789 7934
+7520 7788 7789
+7519 7262 7261
+7520 7521 7262
+7518 7519 7261
+7518 7787 7519
+6760 6759 6990
+6687 6688 6630
+6499 6759 6760
+6498 6497 6759
+7515 7516 7258
+7260 7261 6989
+7788 7787 8047
+7788 7519 7787
+7259 7517 7260
+7518 7261 7260
+8044 8151 8045
+7787 7518 7786
+7515 7635 7784
+7786 7518 7517
+6987 7259 6988
+6987 6860 6986
+6758 6757 6987
+6496 6356 6355
+6758 6987 6988
+6689 6567 6632
+6759 6758 6988
+6759 6497 6758
+6205 6355 6356
+6496 6422 6495
+6072 6071 6203
+6354 6355 6205
+6422 6496 6355
+6757 6758 6496
+6354 6422 6355
+6633 6567 6689
+6354 6421 6422
+6354 6204 6203
+6496 6495 6634
+6421 6354 6420
+6493 6567 6494
+6495 6421 6420
+6202 6203 6130
+6354 6205 6204
+6072 6203 6204
+6202 6352 6353
+6493 6352 6492
+6202 6201 6351
+6492 6352 6351
+6353 6203 6202
+6566 6567 6493
+6351 6491 6492
+6630 6631 6566
+6494 6633 6634
+6493 6353 6352
+6420 6354 6353
+6566 6631 6632
+6632 6688 6689
+6688 6631 6630
+6632 6567 6566
+6492 6566 6493
+6492 6565 6566
+6859 6985 6986
+6754 6688 6753
+6688 6632 6631
+6688 6754 6689
+7255 7115 7114
+6860 6757 6756
+6755 6689 6754
+6634 6495 6494
+6755 6756 6633
+6495 6420 6494
+6493 6494 6353
+6567 6633 6494
+6689 6755 6633
+6757 6496 6634
+6986 6860 6755
+6756 6634 6633
+6860 6756 6755
+6757 6634 6756
+6754 6859 6755
+6987 6757 6860
+6987 7258 7259
+7257 7514 7515
+6753 6859 6754
+7258 6987 6986
+8288 8334 8335
+8153 8154 8046
+7516 7785 7517
+7784 8044 7932
+7259 7516 7517
+7258 6986 7257
+8047 8046 8154
+7786 8045 8046
+8152 8153 8045
+8244 8336 8245
+8412 8336 8411
+8337 8245 8336
+8152 8244 8153
+8334 8411 8335
+8151 8152 8045
+8244 8335 8336
+8151 8243 8152
+8288 8335 8244
+8044 8150 8151
+8287 8333 8334
+8150 8242 8151
+8287 8334 8288
+8243 8288 8244
+8243 8287 8288
+8151 8242 8243
+8242 8286 8287
+8243 8242 8287
+8241 8240 8331
+8333 8286 8285
+8333 8287 8286
+8149 8150 8044
+8149 8241 8150
+7932 8044 8045
+7784 7931 8044
+7785 7932 8045
+7785 7784 7932
+6755 6859 6986
+6858 6857 6984
+6986 6985 7257
+6859 6753 6858
+7931 7784 7783
+7785 7516 7784
+6859 6858 6985
+6750 6685 6684
+6752 6857 6858
+6856 6855 6906
+7256 6984 7115
+6985 6858 6984
+7635 7515 7514
+7784 7516 7515
+7258 7257 7515
+6985 6984 7256
+8241 8285 8242
+8286 8242 8285
+8408 8332 8363
+8364 8333 8332
+8408 8364 8332
+8408 8409 8364
+8285 8241 8332
+8149 8240 8241
+7782 7930 7931
+8042 7929 7989
+7634 7781 7782
+7783 7784 7635
+8330 8331 8284
+8149 7931 8043
+8406 8331 8362
+8284 8329 8330
+8332 8331 8363
+8240 8284 8331
+8239 8329 8284
+8402 8495 8496
+8240 8239 8284
+8043 8148 8149
+8041 8145 8146
+7783 7782 7931
+7855 7927 7928
+7930 8043 7931
+7930 8042 8043
+7635 7782 7783
+7635 7514 7634
+7257 7256 7514
+7257 6985 7256
+7382 7513 7514
+7704 7780 7781
+7632 7633 7513
+7514 7256 7382
+6857 6856 6906
+6796 6795 6855
+6749 6795 6684
+6749 6794 6854
+6796 6750 6795
+6348 6349 6198
+6750 6751 6685
+6490 6349 6348
+6795 6750 6684
+6796 6857 6751
+6796 6856 6857
+6796 6855 6856
+6796 6751 6750
+6565 6630 6566
+6857 6752 6751
+6753 6688 6687
+6629 6687 6630
+6752 6753 6687
+6564 6629 6491
+6686 6751 6752
+6628 6685 6686
+6627 6684 6685
+6628 6686 6629
+6685 6751 6686
+6685 6628 6627
+6491 6349 6490
+6564 6628 6629
+6564 6627 6628
+6630 6565 6629
+6492 6491 6565
+6127 6283 6201
+6200 6199 6282
+6200 6126 6199
+5937 6000 5938
+6351 6350 6491
+6283 6200 6350
+5935 6065 6066
+6198 6199 6125
+6684 6627 6562
+6627 6564 6563
+6350 6282 6349
+6350 6200 6282
+6348 6489 6490
+6626 6684 6562
+5824 5934 5825
+6123 6198 6124
+6564 6490 6563
+6564 6491 6490
+5934 5933 6063
+6197 6198 6123
+6347 6488 6489
+6489 6562 6490
+6625 6682 6683
+6625 6624 6681
+6626 6562 6489
+6488 6626 6489
+6683 6749 6626
+6794 6853 6854
+6905 6854 6904
+6855 6795 6854
+6981 6982 6904
+6983 6906 6905
+6982 7044 7114
+7113 7186 7114
+6853 6980 6904
+6980 7043 7044
+6904 6982 6905
+6981 7044 6982
+6747 6748 6681
+6624 6747 6681
+6904 6980 6981
+7043 7112 7113
+6979 7043 6980
+6680 6747 6624
+6682 6625 6681
+6346 6487 6624
+6197 6347 6348
+6346 6624 6488
+6626 6625 6683
+6488 6624 6625
+6196 6347 6197
+6346 6345 6487
+6196 6346 6347
+6195 6345 6346
+6064 5934 6063
+6195 6194 6345
+6063 6062 6195
+6062 6061 6194
+6486 6560 6561
+6622 6743 6744
+6419 6487 6345
+6561 6623 6487
+6419 6486 6561
+6559 6621 6622
+6344 6418 6419
+6417 6559 6486
+6418 6486 6419
+6418 6417 6486
+6060 6344 6194
+6193 6343 6344
+5931 5706 5930
+6342 6484 6620
+6192 6342 6193
+6342 6485 6343
+6743 6621 6620
+6743 6622 6621
+6344 6417 6418
+6343 6485 6417
+6486 6559 6560
+6485 6621 6559
+6976 6977 6903
+6851 6744 6850
+6976 6902 6975
+6903 6850 6849
+6976 6903 6902
+6976 6975 7041
+6976 7042 6977
+6903 6977 6978
+6792 6851 6852
+6977 7042 6978
+6978 6851 6850
+6978 6852 6851
+6559 6622 6560
+6744 6623 6622
+6744 6745 6623
+6746 6852 6747
+6746 6680 6745
+6624 6623 6680
+6792 6793 6745
+6792 6852 6793
+6793 6746 6745
+6793 6852 6746
+7379 7320 7446
+7573 7511 7572
+7573 7631 7512
+7926 7779 7854
+7701 7777 7778
+7629 7572 7699
+7511 7446 7572
+7629 7573 7572
+7631 7632 7512
+7700 7629 7699
+7630 7573 7629
+7853 7923 7924
+7853 7854 7777
+7701 7700 7777
+7701 7630 7700
+8039 7924 8038
+7776 7699 7852
+7377 7316 7248
+7776 7853 7777
+7852 7923 7853
+8037 8038 7987
+8092 8091 8142
+7317 7318 7249
+8091 8037 7987
+8091 8092 8037
+8491 8447 8400
+8142 8091 8235
+8038 8037 8092
+8142 8143 8092
+8039 8040 7988
+8236 8144 8143
+8237 8402 8238
+8038 7924 7923
+7988 7925 7924
+7924 8039 7988
+8038 8143 8039
+8040 7926 7988
+7926 7780 7779
+7927 8040 8041
+8039 8144 8040
+8237 8145 8144
+8041 8040 8145
+7988 7926 7925
+7927 7855 7780
+8040 7927 7926
+7929 7930 7781
+8147 8146 8238
+8147 8042 8146
+7704 7703 7780
+7704 7632 7703
+7854 7779 7778
+7780 7703 7702
+7701 7702 7631
+7779 7780 7702
+7630 7631 7573
+7630 7701 7631
+7573 7512 7511
+7632 7513 7512
+7379 7380 7321
+7320 7253 7185
+7379 7321 7320
+7255 7382 7256
+7321 7254 7253
+7321 7380 7322
+7704 7633 7632
+7634 7514 7513
+7043 7113 7044
+7112 7185 7113
+7321 7322 7254
+7380 7513 7381
+7254 7255 7186
+7322 7381 7255
+7512 7513 7380
+7633 7634 7513
+7380 7381 7322
+7513 7382 7381
+7633 7781 7634
+7855 7929 7781
+8041 7989 7927
+8042 8147 8148
+7928 7929 7855
+8042 8041 8146
+7928 7989 7929
+7928 7927 7989
+8148 8147 8238
+8148 8043 8042
+7929 8042 7930
+7989 8041 8042
+8611 8547 8610
+8547 8498 8546
+8611 8610 8666
+8546 8497 8609
+8713 8609 8712
+8610 8546 8609
+8497 8403 8496
+8404 8329 8403
+8237 8238 8146
+8403 8329 8238
+8402 8237 8328
+8146 8145 8237
+8403 8402 8496
+8494 8493 8607
+8238 8402 8403
+8328 8401 8402
+8609 8496 8608
+8495 8494 8545
+8609 8608 8712
+8607 8606 8711
+8609 8497 8496
+8546 8498 8497
+8713 8712 8750
+8608 8545 8607
+8796 8795 8856
+8712 8608 8711
+8906 8907 8795
+8797 8858 8798
+8907 8856 8795
+8908 8856 8907
+8955 8956 8907
+8796 8857 8858
+9134 9190 9242
+8712 8796 8750
+8712 8795 8796
+8799 8858 8859
+8857 8908 8858
+8798 8713 8750
+8666 8609 8713
+8750 8797 8798
+8750 8796 8797
+8713 8798 8751
+8858 8799 8798
+9290 9291 9242
+9244 9134 9243
+8908 8956 8858
+8998 8956 8955
+9289 9241 9288
+9242 9190 9241
+9289 9288 9345
+9240 9239 9288
+9346 9290 9345
+9242 9241 9289
+9345 9290 9289
+9291 9243 9242
+9346 9291 9290
+9347 9292 9291
+9839 9749 9672
+9673 9536 9535
+9411 9412 9346
+9535 9536 9412
+9840 9749 9839
+9750 9673 9749
+9672 9411 9410
+9535 9412 9411
+9411 9346 9345
+9412 9347 9346
+9287 9239 9238
+9240 9190 9239
+9241 9240 9288
+9241 9190 9240
+9839 9672 9671
+9749 9535 9672
+9286 9287 9237
+9411 9288 9287
+9082 9132 9188
+9286 9410 9287
+9133 9189 9190
+9237 9238 9189
+9081 9082 9044
+9188 9237 9189
+9082 9189 9083
+9083 9133 9134
+9083 9189 9133
+8907 8956 8908
+8955 8997 8998
+8954 8997 8955
+9044 9082 8998
+9044 8998 8997
+8995 9081 8996
+9130 9185 9186
+9187 9131 9186
+9081 9080 9130
+9187 9186 9236
+9131 9130 9186
+9237 9188 9236
+9132 9131 9187
+9188 9132 9187
+9082 9081 9132
+9082 9188 9189
+9187 9236 9188
+9672 9410 9671
+9411 9287 9410
+9236 9286 9237
+9284 9235 9283
+10036 9838 9837
+9839 9671 9838
+9285 9344 9286
+9409 9410 9344
+9236 9285 9286
+9236 9235 9284
+9477 9408 9407
+9409 9283 9408
+9670 9534 9533
+9534 9408 9533
+9608 9670 9533
+9671 9410 9534
+9838 9670 9837
+9671 9534 9670
+9608 9532 9531
+9608 9533 9532
+9475 9476 9407
+9532 9533 9477
+9129 9128 9183
+9127 9182 9183
+9183 9234 9184
+9183 9233 9234
+9285 9284 9344
+9285 9236 9284
+9081 9130 9131
+9080 9129 9130
+9078 9128 9129
+9127 9183 9128
+9130 9129 9184
+9079 9078 9129
+9081 8995 9080
+9043 8994 9078
+8952 8951 8992
+8905 8904 8995
+8793 8855 8903
+8953 8995 8996
+8904 8994 8995
+9080 9079 9129
+9080 8995 9043
+9080 9043 9079
+8995 8994 9043
+8997 8954 8996
+8906 8905 8953
+8996 8954 8953
+8955 8906 8954
+8996 9044 8997
+8996 9081 9044
+8794 8711 8710
+8795 8712 8711
+8795 8794 8906
+8794 8904 8905
+8793 8794 8710
+8905 8906 8794
+8493 8544 8606
+8544 8491 8605
+8493 8447 8492
+8608 8607 8711
+8545 8494 8607
+8283 8325 8326
+8400 8401 8327
+8402 8401 8494
+8490 8491 8399
+8447 8401 8400
+8710 8605 8604
+8544 8492 8491
+8605 8491 8490
+8492 8447 8491
+8543 8490 8489
+8491 8400 8399
+8490 8399 8489
+8400 8327 8326
+8283 8326 8235
+8399 8400 8326
+8325 8399 8326
+8542 8603 8543
+8709 8710 8604
+8604 8665 8709
+8604 8543 8603
+8398 8489 8399
+8542 8543 8489
+8604 8490 8543
+8488 8541 8489
+8603 8664 8665
+8446 8488 8398
+8664 8602 8601
+8542 8489 8541
+8792 8708 8707
+8603 8542 8541
+8541 8602 8603
+8541 8601 8602
+8664 8603 8602
+8665 8604 8603
+8901 8855 8854
+8793 8709 8708
+8791 8854 8792
+8992 8951 8991
+8901 8900 8951
+8952 8901 8951
+8902 8855 8901
+9042 8993 8992
+8952 8902 8901
+8665 8708 8709
+8664 8707 8708
+8993 8952 8992
+8993 8994 8903
+8854 8855 8792
+8903 8904 8793
+9042 9077 8993
+8994 8904 8903
+8902 8903 8855
+8902 8952 8903
+9078 9127 9128
+9182 9233 9183
+9127 9077 9076
+9127 9078 9077
+9076 9182 9127
+9280 9342 9343
+9529 9475 9474
+9476 9477 9407
+9531 9476 9475
+9531 9532 9476
+9408 9282 9407
+9234 9233 9282
+9669 9607 9606
+9608 9531 9607
+9747 9836 9748
+9837 9670 9748
+9668 9669 9606
+9748 9670 9669
+9748 9836 9837
+9930 10034 9931
+9528 9668 9529
+9529 9668 9606
+9528 9529 9474
+9606 9607 9530
+9475 9529 9530
+9528 9667 9668
+9668 9747 9748
+9930 9992 10034
+9747 9668 9667
+9748 9669 9668
+9930 9929 9992
+9890 9889 9929
+9835 9890 9836
+9991 9927 9990
+9836 9930 9931
+9890 9929 9930
+9404 9405 9342
+9407 9406 9475
+9343 9405 9406
+9182 9280 9233
+9280 9343 9281
+9077 9042 9076
+8992 8991 9042
+9042 9041 9076
+9042 8991 9041
+9233 9280 9281
+8990 8949 8989
+8988 9038 8989
+9605 9527 9472
+8989 9038 9039
+9040 8990 9039
+8950 8949 8990
+9472 9473 9404
+9527 9528 9473
+9835 9889 9890
+9888 9887 9926
+9835 9747 9746
+9835 9836 9747
+9889 9928 9929
+9889 9888 9928
+9835 9888 9889
+9835 9746 9834
+9666 9746 9747
+9793 9833 9834
+9793 9834 9746
+9887 9888 9834
+9926 9927 9888
+9926 9990 9927
+9989 9925 9924
+9926 9887 9925
+9924 9833 9988
+9924 9887 9833
+9745 9793 9746
+9745 9833 9793
+9605 9720 9665
+9720 9721 9665
+9720 9745 9721
+9605 9666 9527
+9665 9721 9666
+8949 8988 8989
+9075 9039 9038
+7569 7505 7568
+7567 7504 7503
+7567 7568 7504
+7505 7506 7372
+7507 7508 7438
+7570 7505 7569
+7571 7506 7570
+7571 7508 7507
+7437 7507 7438
+7510 7443 7442
+7248 7247 7376
+7444 7510 7445
+7506 7507 7437
+7506 7571 7507
+7177 7102 7245
+7510 7444 7443
+7442 7441 7510
+6971 7104 7105
+7376 7375 7443
+7375 7441 7442
+7378 7377 7445
+7378 7316 7377
+7443 7375 7442
+7178 7104 7246
+7377 7376 7445
+7247 7375 7376
+7439 7374 7373
+7441 7375 7374
+7508 7439 7438
+7509 7440 7439
+7441 7440 7509
+7441 7374 7440
+7244 7372 7373
+7437 7438 7373
+6967 7242 6968
+7435 7436 7370
+7505 7372 7371
+7437 7373 7372
+7368 7241 7314
+7240 7176 7239
+7101 6845 6966
+7313 7367 7314
+7241 7240 7314
+7313 7314 7240
+7100 7176 7240
+7099 7038 7098
+7313 7240 7239
+7038 7099 7039
+6899 6964 6965
+6898 7098 7038
+6900 6965 6966
+7099 7176 7100
+6967 6845 7101
+7039 7099 7100
+7315 7241 7368
+7101 7240 7241
+7242 7101 7241
+7100 7240 7101
+6737 6967 6968
+6736 6619 6735
+6968 6969 6738
+6968 7243 6969
+7243 7242 7370
+6967 7101 7242
+6846 6970 6971
+6969 7102 6970
+7374 7245 7373
+7374 7375 7246
+7242 7243 6968
+7370 7371 7243
+6969 7244 7102
+6969 7243 7244
+7433 7368 7367
+7315 7242 7241
+7434 7369 7368
+7434 7435 7369
+7370 7369 7435
+7370 7242 7369
+7374 7246 7245
+7375 7247 7246
+7246 7177 7245
+7246 7104 7177
+7247 7178 7246
+7105 7106 6972
+7105 7180 7106
+7247 7248 7180
+7247 7179 7178
+7247 7180 7179
+7319 7250 7318
+7107 7248 7249
+7316 7317 7249
+7250 7319 7251
+7378 7318 7317
+7319 7252 7251
+7378 7319 7318
+7184 7183 7252
+7250 7249 7318
+7252 7182 7251
+7250 7108 7249
+7251 7181 7250
+7107 6973 6972
+7182 7109 7181
+6973 6741 6972
+7251 7182 7181
+7183 7110 7109
+7252 7183 7182
+7184 7110 7183
+6974 7041 6975
+7111 7042 7041
+7181 7109 7108
+7182 7183 7109
+7111 7110 7184
+7041 6974 7110
+7109 6973 7108
+6483 6741 6484
+6971 7105 6972
+7104 7178 7105
+7248 7107 7106
+7108 6973 7107
+7177 7103 7102
+7177 7104 7103
+7102 7040 6970
+7103 7104 7040
+6740 6971 6972
+6739 6846 6971
+6737 6736 6967
+6844 6900 6966
+6845 6736 6735
+6479 6480 6188
+6741 6483 6740
+5924 5925 5700
+6967 6736 6845
+5925 6187 6188
+6738 6846 6739
+6738 6969 6846
+7109 6847 6973
+6974 6975 6901
+6742 6848 6849
+6847 6974 6848
+6974 6901 6848
+6975 6902 6901
+6484 6742 6620
+6847 6848 6742
+6191 6483 6192
+6482 6740 6483
+6972 6741 6740
+6847 6742 6741
+5925 5924 6187
+6737 6738 6480
+6480 6481 6189
+6480 6738 6481
+6193 6342 6343
+6192 6484 6342
+5929 5704 5928
+6190 6189 6481
+6482 6190 6481
+5927 5926 6189
+5928 6190 6191
+5927 6189 6190
+5821 5697 5820
+6478 6619 6736
+6737 6479 6736
+6737 6480 6479
+5926 6188 6189
+6187 6479 6188
+6187 6478 6479
+6341 6477 6478
+6416 6477 6340
+6478 6187 6186
+6185 6186 5923
+6341 6478 6186
+6184 6281 6185
+6340 6341 6185
+6476 6416 6415
+6416 6340 6339
+6059 6184 6185
+6339 6340 6281
+6476 6558 6477
+6558 6617 6618
+6476 6477 6416
+6558 6618 6477
+6477 6618 6619
+6617 6557 6616
+6735 6844 6845
+6616 6557 6733
+6735 6843 6844
+6965 7039 6966
+7101 6966 7100
+6845 6844 6966
+6843 6899 6900
+7038 7039 6965
+6844 6843 6900
+6734 6733 6842
+6735 6679 6734
+6735 6618 6679
+6735 6734 6843
+6617 6558 6557
+6842 6899 6843
+6964 7038 6965
+6898 6964 6899
+6898 7038 6964
+6475 6733 6557
+6842 6843 6734
+6898 6899 6842
+6678 6616 6733
+6678 6679 6617
+6734 6678 6733
+6734 6679 6678
+6678 6617 6616
+6679 6618 6617
+6339 6415 6416
+6475 6557 6476
+6415 6338 6183
+6339 6280 6338
+6476 6415 6475
+6339 6338 6415
+6183 6059 5921
+5696 5761 5762
+5818 5819 5761
+5761 5819 5762
+5921 6059 5922
+6183 6184 6059
+6280 6281 6184
+5819 5922 5820
+6059 6185 5922
+5698 5821 5923
+5922 6185 5923
+5923 5924 5699
+5923 6186 5924
+5926 5925 6188
+5701 5592 5591
+5477 5476 5591
+5699 5924 5700
+5923 5821 5922
+5697 5590 5589
+5922 5821 5820
+5923 5699 5698
+5820 5697 5762
+5821 5698 5697
+5474 5698 5699
+5590 5697 5698
+5591 5476 5475
+5346 5206 5345
+5347 5346 5475
+5345 5473 5474
+5542 5543 5470
+5588 5589 5543
+5406 5471 5407
+5590 5473 5472
+5588 5543 5542
+5643 5588 5542
+5644 5697 5589
+5643 5644 5588
+5643 5695 5696
+5760 5695 5643
+5760 5761 5695
+5643 5696 5644
+5695 5761 5696
+5543 5471 5470
+5543 5589 5471
+5471 5406 5470
+5343 5408 5344
+5472 5473 5408
+5204 5281 5344
+5342 5341 5407
+5407 5341 5406
+5281 5342 5343
+5281 5280 5342
+5344 5281 5343
+5204 5203 5281
+5342 5280 5341
+5281 5203 5280
+5204 5205 5139
+5204 5139 5203
+4864 4925 4926
+5141 5140 5205
+5141 5079 5140
+5142 5081 5080
+5080 5079 5141
+5012 5080 5081
+5080 5141 5142
+5140 5079 5139
+4733 4797 4798
+5206 5142 5141
+5013 5083 5014
+5080 5012 5079
+4926 4865 4864
+5082 5013 5012
+4925 5079 5012
+4926 5013 5014
+5082 5081 5142
+5207 5143 5142
+5144 5084 5083
+5346 5207 5206
+5143 5082 5142
+5083 5082 5143
+5012 5081 5082
+5475 5346 5474
+5208 5144 5143
+5206 5207 5142
+5346 5347 5208
+5346 5208 5207
+5348 5349 5210
+5144 5208 5209
+5145 5209 5146
+4866 4927 4928
+4865 4926 4927
+5014 5083 5084
+5013 5082 5083
+5084 5015 5014
+5084 5145 5015
+4866 4865 4927
+4797 4796 4865
+4796 4864 4865
+4733 4796 4797
+4603 4658 4659
+4865 4866 4797
+4928 4867 4866
+4660 4659 4798
+4658 4796 4733
+4733 4659 4658
+4733 4798 4659
+4539 4603 4604
+4209 4658 4603
+4539 4604 4540
+4603 4659 4604
+4930 4931 4800
+5016 5086 5017
+4735 4802 4736
+5085 5086 5016
+4868 4799 4929
+4930 4868 4929
+4930 4800 4868
+5148 5214 5149
+4929 5016 5017
+5085 5148 5086
+4929 5017 4930
+5086 5148 5149
+4930 5087 5088
+5017 5086 5087
+5215 5149 5214
+5087 5086 5149
+5480 5354 5353
+5354 5217 5216
+5148 5213 5214
+5282 5352 5213
+5016 5147 5085
+5282 5211 5350
+5147 5148 5085
+5147 5213 5148
+5210 5209 5348
+5144 5209 5145
+5208 5347 5209
+5146 5209 5210
+5347 5348 5209
+5347 5475 5348
+5352 5282 5351
+5212 5211 5282
+5213 5212 5282
+5213 5147 5212
+5592 5479 5478
+5479 5352 5409
+5348 5476 5349
+5475 5700 5591
+5477 5350 5349
+5478 5409 5350
+5925 5701 5700
+5592 5478 5477
+5700 5701 5591
+5926 5927 5702
+5592 5477 5591
+5478 5350 5477
+5701 5702 5592
+5702 5703 5480
+5409 5352 5351
+5353 5214 5352
+5352 5479 5353
+5409 5478 5479
+5479 5480 5353
+5702 5927 5703
+6192 6193 5930
+5481 5480 5703
+6192 5929 6191
+5703 5927 5928
+6191 5929 5928
+5933 5932 6062
+5703 5704 5481
+5594 5595 5484
+5481 5593 5482
+5704 5929 5705
+5353 5354 5215
+5481 5355 5354
+5410 5355 5482
+5218 5090 5217
+5355 5217 5354
+5218 5219 5090
+5215 5216 5087
+5215 5354 5216
+4931 5088 4932
+5087 5216 5088
+4869 4933 4870
+4932 5089 4933
+4933 5089 5090
+5088 5216 5089
+5355 5218 5217
+5355 5356 5283
+5283 5356 5357
+5483 5593 5594
+5410 5356 5355
+5357 5219 5283
+5218 5283 5219
+5218 5355 5283
+4807 4741 4806
+4806 4934 4935
+5219 5358 5220
+5357 5410 5483
+5091 5092 4935
+5220 5221 5092
+5704 5705 5593
+6060 6193 6344
+5593 5483 5482
+5357 5356 5410
+5484 5483 5594
+5410 5482 5483
+5593 5705 5594
+5929 6192 5930
+5931 5930 6060
+5705 5929 5930
+6061 6060 6194
+5930 6193 6060
+6195 6062 6194
+5932 5931 6061
+5594 5706 5595
+5705 5930 5706
+6061 5931 6060
+5932 5822 5931
+5709 5708 5824
+5822 5932 5823
+5707 5822 5823
+5706 5931 5822
+6196 6063 6195
+5932 6061 6062
+6197 6123 6064
+5823 5932 5933
+6197 6064 6196
+5933 6062 6063
+6196 6064 6063
+6065 6124 6125
+6123 6065 6064
+5824 5823 5934
+5706 5822 5596
+5823 5824 5707
+5599 5708 5709
+5707 5824 5708
+5485 5596 5486
+5707 5708 5598
+5599 5598 5708
+5487 5486 5598
+5601 5488 5600
+5224 5225 4940
+4940 4939 5224
+5223 5486 5487
+4937 4938 4672
+5600 5487 5599
+5222 5223 4938
+5222 5486 5223
+4936 4937 4808
+5222 4938 4937
+5486 5596 5597
+5485 5595 5596
+5598 5486 5597
+5360 5359 5484
+5222 5360 5486
+5484 5595 5485
+5360 5484 5485
+5359 5358 5484
+5486 5360 5485
+5222 5221 5360
+4741 4740 4806
+4805 4934 4806
+4608 4667 4668
+4666 4739 4740
+4669 4609 4668
+4667 4740 4668
+4805 4806 4740
+4935 4936 4807
+4935 4807 4806
+4669 4550 4609
+4808 4807 4936
+4808 4670 4807
+4808 4671 4670
+4167 4414 4168
+4937 4672 4671
+4938 4939 4673
+4412 4479 4413
+4671 4672 4553
+4477 4549 4550
+4549 4608 4609
+4807 4669 4741
+4670 4551 4669
+4550 4551 4478
+4670 4671 4552
+4478 4479 4412
+4551 4670 4552
+4413 4552 4553
+4479 4551 4552
+4168 4414 4415
+4553 4672 4414
+4410 4349 4348
+4412 4413 4350
+4479 4552 4413
+4408 4477 4409
+4411 4412 4349
+4548 4549 4476
+4550 4478 4477
+4477 4411 4410
+4478 4412 4411
+4476 4475 4547
+4548 4547 4608
+4408 4407 4476
+4476 4549 4477
+4548 4608 4549
+4804 4738 4803
+4544 4662 4663
+4546 4475 4474
+4476 4407 4475
+4547 4475 4546
+4474 4543 4544
+4608 4607 4666
+4544 4543 4662
+4608 4547 4607
+4548 4476 4547
+4667 4666 4740
+4667 4608 4666
+4739 4804 4805
+4870 4933 4871
+4740 4739 4805
+4666 4607 4665
+4870 4804 4803
+4870 4871 4804
+4803 4738 4737
+4804 4739 4738
+4738 4665 4664
+4738 4739 4665
+4737 4736 4802
+4545 4606 4546
+4737 4802 4803
+4735 4662 4801
+4802 4869 4803
+4932 4933 4869
+5088 4931 4930
+4932 4802 4931
+4868 4800 4799
+4931 4802 4801
+4661 4801 4662
+4800 4931 4801
+4802 4735 4801
+4736 4663 4735
+4735 4663 4662
+4736 4737 4664
+4736 4664 4663
+4737 4738 4664
+4606 4545 4544
+4546 4474 4545
+4606 4544 4663
+4545 4474 4544
+4664 4606 4663
+4664 4665 4606
+4216 4217 4164
+4286 4287 4217
+4217 4287 4165
+4350 4413 4287
+3682 3579 3681
+3526 3485 3525
+3051 3003 3050
+3853 3812 3852
+3725 3726 3677
+2966 3051 2967
+3180 3233 3181
+3180 3181 3141
+3143 3235 3144
+3143 3142 3182
+2742 2765 2714
+3729 3682 3728
+3433 3394 3393
+3682 3580 3579
+3682 3630 3580
+3774 3812 3775
+3728 3774 3775
+3852 3895 3853
+3728 3775 3729
+3812 3853 3775
+3948 3853 3895
+4164 4165 4116
+4077 4117 4118
+4116 4165 4117
+4166 4288 4167
+4287 4413 4288
+4118 4166 4119
+4165 4287 4166
+4077 4118 4119
+4117 4166 4118
+3685 3684 3731
+3951 3950 4078
+3949 4011 4012
+4078 4167 4079
+4119 4166 4167
+4167 4078 4119
+4079 3951 4078
+3898 3950 3951
+3897 3896 3950
+3813 3854 3855
+3813 3896 3854
+3730 3731 3684
+3814 3813 3855
+3776 3730 3813
+3353 3394 3322
+3434 3394 3433
+3394 3395 3322
+3434 3395 3394
+3323 3235 3322
+3143 3052 3142
+3683 3630 3682
+3394 3353 3393
+3682 3729 3683
+2592 2662 2663
+2714 2765 2715
+2386 2413 2414
+2535 2591 2592
+2451 2499 2452
+2536 2592 2663
+2500 2499 2536
+2535 2592 2536
+2330 2413 2386
+2329 2412 2413
+2898 2897 3052
+2766 2765 2832
+3053 3052 3144
+2897 2967 3052
+3235 3143 3182
+3144 3052 3143
+2386 2414 2387
+2413 2451 2452
+2500 2452 2499
+2499 2535 2536
+2664 2537 2536
+2414 2413 2452
+2201 2269 2270
+2274 2334 2335
+2270 2271 2249
+2333 2387 2388
+2168 2203 2204
+2249 2271 2204
+2011 2115 2012
+2204 2272 2205
+2204 2203 2249
+2204 2116 2168
+2115 2168 2116
+2167 2202 2168
+2168 2115 2167
+2116 2012 2115
+2271 2308 2332
+2330 2386 2331
+2202 2270 2249
+2331 2332 2308
+2308 2330 2331
+2329 2413 2330
+2269 2330 2270
+2203 2202 2249
+2167 2166 2201
+2011 2114 2115
+2113 2166 2114
+2202 2201 2270
+2167 2201 2202
+2327 2384 2410
+2498 2451 2478
+2499 2498 2535
+2499 2451 2498
+2413 2412 2451
+2328 2385 2329
+2663 2662 2715
+2626 2661 2662
+2801 2831 2765
+2897 2766 2832
+3142 2967 3051
+2897 2832 2967
+3142 3051 3141
+2967 2832 2896
+2927 2966 2896
+2966 2967 2896
+2831 2830 2863
+3003 3051 2966
+2712 2741 2713
+2801 2765 2742
+2895 3003 2965
+2831 2832 2765
+2830 2831 2801
+2896 2832 2831
+2965 3003 2966
+2764 2712 2830
+3677 3676 3725
+2927 2965 2966
+2927 2895 2965
+2498 2478 2497
+2590 2626 2591
+2412 2434 2451
+2412 2329 2385
+2535 2519 2534
+2535 2498 2519
+2329 2307 2328
+2329 2269 2307
+2411 2434 2412
+2450 2451 2434
+2411 2412 2385
+2589 2497 2450
+2411 2385 2328
+2497 2534 2519
+2590 2565 2589
+2519 2498 2497
+2450 2497 2478
+2589 2534 2497
+2326 2410 2384
+2306 2326 2384
+2306 2245 2326
+2565 2590 2566
+2589 2625 2590
+2534 2565 2566
+2534 2589 2565
+2696 2713 2742
+2696 2661 2713
+2830 2712 2895
+2625 2660 2661
+3577 3629 3679
+2896 2863 2927
+2863 2830 2895
+2764 2741 2712
+3051 3095 3141
+2742 2741 2764
+2742 2713 2741
+2801 2764 2830
+2801 2742 2764
+2927 2863 2895
+2896 2831 2863
+3141 3095 3140
+3051 3050 3095
+3003 2895 3050
+3527 3526 3578
+3527 3485 3526
+3579 3680 3681
+3679 3727 3773
+3579 3578 3680
+3526 3525 3578
+4009 4010 3947
+3894 3852 3851
+3894 3851 3947
+3774 3680 3773
+3948 3894 3947
+3895 3852 3894
+3947 4010 3948
+4009 4008 4074
+4350 4286 4349
+4350 4287 4286
+4286 4217 4216
+4286 4216 4285
+4010 4009 4075
+4072 3945 4071
+3946 4008 3947
+4074 4075 4009
+4008 3946 4007
+3947 3851 3946
+4074 4008 4007
+4009 3947 4008
+4408 4348 4347
+4409 4410 4348
+4407 4346 4345
+4115 4074 4073
+4074 4007 4073
+4007 4006 4073
+4007 3946 4006
+3849 3850 3773
+3773 3680 3679
+3727 3772 3773
+3945 3946 3850
+3772 3849 3773
+3850 3851 3773
+3629 3678 3679
+3628 3629 3577
+3628 3677 3629
+3578 3679 3680
+3678 3727 3679
+4115 4072 4114
+4344 4405 4284
+4070 4071 3944
+4213 4162 4161
+4161 4160 4211
+4071 4162 4163
+4212 4211 4284
+4114 4163 4115
+4162 4214 4215
+4163 4162 4215
+4407 4345 4406
+4211 4210 4283
+4161 4212 4213
+4161 4211 4212
+4214 4213 4284
+4214 4162 4213
+4405 4344 4404
+4404 4343 4403
+4473 4541 4542
+4283 4210 4282
+4472 4540 4541
+4471 4539 4540
+4343 4539 4471
+4343 4603 4539
+4404 4472 4473
+4403 4471 4472
+4403 4343 4471
+4209 4603 4343
+4209 4282 4210
+4343 4404 4344
+4284 4283 4344
+4284 4211 4283
+4113 4160 4161
+4159 4209 4210
+4283 4282 4344
+4209 4343 4282
+4112 4159 4160
+4112 4209 4159
+4162 4070 4161
+4068 4067 4112
+4113 4112 4160
+4067 4209 4112
+4069 4005 4068
+4004 4067 4068
+3892 3942 3943
+3892 3891 3942
+4068 4005 4004
+4068 4113 4069
+4161 4069 4113
+3943 3942 4069
+4069 4070 3943
+4069 4161 4070
+4073 4072 4115
+4071 4163 4114
+4114 4072 4071
+4073 4006 4072
+3944 3849 3848
+3945 3850 3849
+3941 3942 3891
+3943 3893 3892
+3943 3944 3893
+3678 3677 3726
+3725 3724 3771
+3726 3772 3727
+3771 3724 3770
+3678 3726 3727
+3725 3772 3726
+3525 3628 3577
+2164 2106 2105
+3629 3677 3678
+3628 3676 3677
+2244 2197 2243
+3847 3848 3811
+3771 3772 3725
+3811 3771 3770
+3848 3772 3771
+3892 3847 3846
+3893 3848 3847
+3847 3810 3846
+3810 3811 3770
+3810 3847 3811
+1496 1557 1619
+1675 1619 1618
+1413 1495 1496
+1285 1441 1412
+1618 1556 1675
+1057 1056 1116
+1413 1414 1287
+1286 1224 1285
+1116 1224 1156
+1349 1412 1413
+1413 1286 1349
+1287 1225 1157
+1285 1349 1286
+1285 1412 1349
+1441 1413 1412
+1441 1495 1413
+1676 1620 1558
+1743 1744 1621
+1495 1557 1496
+1556 1618 1557
+1413 1287 1286
+1414 1288 1287
+1289 1227 1288
+1118 1062 1061
+1620 1497 1558
+1415 1289 1288
+1117 1158 1227
+1117 1059 1158
+1886 1887 1811
+1952 1953 1887
+1675 1742 1676
+1675 1886 1742
+2105 2002 1952
+2003 1954 1953
+2005 1890 2004
+2064 2003 2002
+2064 2065 2003
+2196 2197 2106
+1497 1621 1498
+1620 1743 1621
+1498 1415 1497
+1352 1417 1418
+2003 2065 2004
+2198 2197 2245
+2243 2197 2196
+2105 2106 2065
+2164 2196 2106
+2003 2004 1954
+2106 2107 2004
+2005 2107 2108
+2106 2197 2107
+1889 1890 1744
+2004 2107 2005
+1498 1621 1622
+1888 1889 1744
+1954 2004 1889
+1745 1622 1744
+1290 1416 1350
+1162 1292 1122
+1417 1498 1499
+1162 1122 1064
+1123 1066 1065
+1231 1292 1162
+1230 1162 1161
+1159 1228 1119
+1161 1162 1121
+1230 1290 1350
+1415 1498 1416
+1121 1160 1161
+1289 1416 1290
+1290 1160 1289
+1227 1228 1159
+1063 1120 1121
+1289 1229 1228
+1289 1160 1229
+1159 1118 1227
+1060 1032 1059
+1060 1061 986
+1060 1117 1061
+1063 1033 1062
+987 950 902
+1227 1118 1117
+1159 1119 1118
+1118 1119 1062
+1228 1229 1119
+1119 1063 1062
+1121 1064 1063
+1121 1120 1160
+1063 1119 1120
+988 1064 1034
+1121 1162 1064
+989 1034 990
+1064 1122 1034
+764 804 827
+904 989 954
+953 988 989
+1063 987 1033
+951 950 987
+903 952 951
+953 904 952
+904 954 905
+828 765 805
+986 949 900
+949 987 902
+986 987 949
+804 764 763
+1057 1030 1056
+898 982 983
+947 981 982
+898 983 948
+982 1030 1057
+1156 1057 1116
+983 982 1057
+983 1031 984
+1058 1157 1059
+986 1032 1060
+986 985 1032
+1060 1059 1117
+1031 1058 1059
+1286 1157 1156
+1225 1158 1157
+1227 1158 1226
+1059 1157 1158
+1286 1156 1224
+1157 1058 1156
+981 1056 1030
+1155 1224 1116
+983 1058 1031
+1057 1156 1058
+1554 1553 1617
+1224 1155 1285
+1116 1056 1155
+1552 1616 1553
+1552 1551 1616
+1490 1550 1551
+1492 1552 1553
+1491 1437 1490
+1492 1438 1552
+1409 1437 1491
+1410 1438 1492
+1347 1409 1438
+1554 1555 1493
+1554 1617 1555
+1493 1494 1440
+1552 1438 1491
+1492 1439 1410
+1439 1493 1440
+1555 1494 1493
+1348 1410 1411
+1492 1554 1439
+1411 1410 1439
+1347 1438 1410
+820 867 868
+896 947 897
+1439 1440 1411
+897 947 982
+896 981 947
+802 869 899
+821 868 869
+897 982 898
+948 869 898
+822 801 821
+712 672 711
+744 761 802
+744 710 761
+759 820 801
+868 898 869
+869 822 821
+869 802 822
+742 820 759
+868 897 898
+896 867 709
+896 897 867
+820 868 821
+867 897 868
+1440 1223 1411
+1283 1223 1222
+1348 1284 1347
+1222 1282 1283
+1411 1284 1348
+1223 1055 1154
+1411 1223 1284
+801 760 759
+744 745 710
+671 670 704
+709 867 820
+742 759 743
+709 647 608
+595 596 564
+509 518 519
+509 592 518
+518 550 519
+518 592 550
+561 593 562
+608 647 594
+550 561 551
+550 592 561
+484 472 483
+472 436 411
+561 562 551
+593 594 562
+519 510 509
+473 436 472
+562 594 563
+593 608 594
+671 665 670
+595 609 610
+745 711 710
+672 673 650
+711 672 704
+672 649 665
+649 650 611
+509 510 484
+437 412 428
+474 438 437
+406 377 376
+428 412 376
+431 439 440
+375 428 405
+436 437 428
+428 376 405
+412 406 376
+356 370 376
+349 355 356
+319 307 318
+255 256 245
+370 375 405
+357 356 376
+357 319 356
+437 429 412
+407 430 414
+307 308 289
+307 319 308
+413 407 377
+358 350 357
+350 320 319
+319 320 309
+371 358 357
+371 378 359
+406 413 377
+320 291 290
+377 407 378
+430 439 431
+412 429 406
+438 439 430
+429 413 406
+429 438 430
+437 438 429
+437 473 474
+413 430 407
+413 429 430
+415 379 414
+414 430 431
+474 475 440
+486 511 512
+485 486 474
+521 552 522
+523 524 488
+487 441 475
+610 611 596
+596 597 565
+484 510 485
+486 475 474
+521 522 512
+552 553 522
+521 511 520
+521 512 511
+520 510 519
+485 474 473
+511 485 510
+511 486 485
+594 595 563
+594 609 595
+665 649 648
+596 595 610
+553 564 565
+563 595 564
+650 649 672
+643 648 649
+610 643 649
+610 609 643
+704 672 671
+712 673 672
+745 763 746
+803 825 763
+712 711 746
+704 710 711
+712 747 748
+746 763 764
+748 764 805
+747 746 764
+612 597 611
+611 610 649
+596 611 597
+650 651 612
+565 597 566
+611 650 612
+765 713 748
+714 674 713
+650 673 651
+712 713 673
+989 904 953
+905 956 906
+652 612 651
+567 566 612
+612 652 613
+651 673 652
+906 830 766
+714 765 829
+904 905 829
+955 991 905
+905 906 829
+715 675 714
+830 716 766
+677 653 676
+829 906 766
+768 769 717
+675 614 613
+653 615 614
+652 675 613
+674 714 675
+766 715 714
+766 716 715
+613 568 567
+568 569 525
+614 568 613
+614 570 569
+554 525 569
+568 614 569
+488 489 442
+524 568 525
+378 379 360
+416 417 380
+321 360 380
+379 415 380
+378 414 379
+431 440 414
+522 523 512
+524 489 488
+380 415 416
+414 441 415
+565 566 553
+597 612 566
+487 523 488
+553 566 523
+523 487 512
+488 441 487
+377 378 371
+407 414 378
+371 359 358
+379 380 360
+381 322 380
+321 320 360
+247 248 244
+291 320 321
+359 320 350
+359 360 320
+320 290 309
+284 259 258
+291 284 290
+291 285 284
+290 283 289
+284 258 283
+185 192 193
+246 242 245
+256 259 260
+291 321 292
+245 256 246
+259 285 260
+246 243 242
+210 193 192
+218 217 242
+218 209 217
+192 163 209
+210 192 209
+218 210 209
+219 220 211
+219 211 210
+220 194 211
+219 244 220
+293 292 321
+218 243 219
+246 247 243
+256 260 246
+322 321 380
+260 292 293
+285 291 292
+246 260 247
+285 292 260
+322 293 321
+261 260 293
+418 432 419
+476 477 445
+408 420 421
+419 432 420
+418 382 381
+419 408 382
+382 418 419
+417 442 443
+418 381 417
+382 361 381
+262 249 261
+248 220 244
+247 261 248
+322 361 323
+249 248 261
+249 220 248
+185 163 192
+185 186 163
+322 262 261
+265 295 296
+220 195 194
+187 165 164
+165 153 164
+163 186 164
+164 152 163
+164 186 187
+164 153 152
+97 152 148
+132 131 154
+97 148 131
+197 165 196
+153 148 152
+166 154 165
+131 148 153
+195 221 196
+249 262 221
+196 187 195
+196 165 187
+323 262 322
+265 286 266
+382 408 383
+419 420 408
+383 421 422
+420 433 421
+383 323 361
+294 325 295
+448 447 493
+422 433 446
+556 527 526
+446 433 445
+492 493 447
+527 556 571
+490 491 476
+492 447 446
+444 445 433
+477 446 445
+492 446 477
+447 422 446
+418 443 432
+443 476 444
+432 443 444
+418 417 443
+444 476 445
+555 569 570
+490 525 491
+489 524 525
+443 490 476
+489 525 490
+477 491 492
+477 476 491
+571 556 570
+526 525 554
+555 554 569
+555 526 554
+491 526 492
+491 525 526
+767 676 716
+653 614 676
+908 831 768
+717 677 767
+830 908 768
+769 718 717
+769 831 910
+909 910 831
+767 768 717
+767 830 768
+555 556 526
+571 572 527
+492 527 493
+492 526 527
+718 679 678
+572 571 615
+718 769 770
+768 831 769
+998 910 997
+832 769 910
+831 908 909
+990 991 955
+957 958 909
+957 994 958
+910 959 997
+910 909 959
+1069 996 995
+997 959 996
+1070 1035 1069
+997 996 1035
+1300 1070 1168
+1300 1301 1071
+1507 1300 1506
+1072 1302 1073
+1300 1299 1506
+1069 1035 996
+1124 1234 1166
+1167 1168 1068
+1168 1069 1068
+1168 1070 1069
+1166 1167 1067
+1299 1168 1167
+1422 1506 1299
+1355 1421 1297
+1299 1167 1298
+1234 1355 1297
+1420 1444 1421
+1068 993 1167
+992 991 1066
+1066 1123 1124
+1297 1167 1166
+991 992 956
+908 957 909
+1067 993 992
+1067 1167 993
+908 994 957
+993 1068 994
+907 908 830
+993 994 908
+992 906 956
+992 993 907
+906 907 830
+993 908 907
+1165 1124 1123
+1067 992 1066
+1124 1165 1234
+1067 1124 1166
+1067 1066 1124
+1163 1123 1122
+954 955 905
+954 989 990
+1165 1123 1164
+1123 1065 1122
+1066 991 1065
+1065 990 1034
+1065 991 990
+1416 1417 1350
+1293 1163 1232
+1164 1123 1163
+1416 1498 1417
+1499 1622 1559
+1559 1622 1623
+1296 1233 1295
+1165 1164 1233
+1296 1354 1355
+1295 1353 1354
+1166 1234 1297
+1165 1233 1234
+1354 1419 1420
+1234 1296 1355
+1234 1233 1296
+1627 1626 1678
+1627 1678 1749
+1626 1747 1678
+1624 1560 1623
+1626 1561 1625
+1444 1420 1502
+1627 1561 1626
+1504 1503 1561
+1354 1420 1355
+1500 1559 1501
+1500 1499 1559
+1560 1503 1444
+1623 1745 1624
+1677 1624 1745
+1813 1892 1955
+1812 1891 1892
+2107 2197 2108
+1891 2005 1955
+1891 1890 2005
+2267 2247 2246
+2197 2244 2245
+2199 2198 2247
+2108 2197 2198
+2267 2246 2306
+2198 2245 2246
+2268 2267 2306
+2247 2198 2246
+2248 2247 2267
+1678 1813 1748
+1678 1747 1813
+2005 2006 1955
+2005 2108 2006
+1749 1748 1814
+2248 2199 2247
+2248 2200 2199
+2248 2268 2200
+2110 2111 2067
+2010 2009 2067
+1958 2008 2009
+2165 2109 2199
+2066 2007 2109
+2200 2165 2199
+1956 1895 1894
+1297 1421 1298
+1355 1420 1421
+1505 1504 1627
+1421 1444 1504
+1505 1627 1628
+1504 1561 1627
+1894 1895 1749
+1505 1628 1506
+1627 1749 1628
+1298 1422 1299
+1421 1504 1422
+1422 1505 1506
+1422 1504 1505
+1301 1507 1508
+1506 1628 1751
+1959 2011 1897
+1751 1507 1506
+1896 1751 1750
+1898 1752 1751
+1507 1752 1508
+1898 2011 2012
+1895 1896 1750
+1958 2010 1959
+1959 1897 1896
+1898 1751 1897
+2010 2068 2011
+2111 2112 2068
+1958 1959 1896
+2010 2011 1959
+1898 2012 1752
+2117 2205 2013
+2767 2664 2766
+2665 2537 2664
+2538 2537 2665
+2418 2335 2334
+2454 2435 2453
+2415 2414 2453
+2537 2500 2536
+2537 2454 2500
+2500 2453 2452
+2500 2454 2453
+2416 2415 2435
+2387 2414 2415
+2333 2388 2389
+2387 2415 2388
+2273 2333 2334
+2271 2332 2333
+2273 2272 2333
+2204 2271 2272
+2389 2416 2417
+2388 2415 2416
+2333 2389 2334
+2388 2416 2389
+2334 2417 2418
+2416 2435 2417
+2014 2205 2206
+2117 2204 2205
+2205 2273 2274
+2205 2272 2273
+2334 2274 2273
+2335 2206 2274
+2435 2454 2417
+2455 2456 2335
+2501 2456 2539
+2418 2417 2454
+2595 2594 2627
+2539 2538 2593
+2538 2454 2537
+2455 2418 2454
+2666 2593 2665
+2539 2455 2538
+2770 2771 2744
+2667 2594 2593
+2667 2593 2666
+2594 2539 2593
+2803 2835 2804
+2719 2668 2667
+2542 2502 2541
+2539 2594 2595
+2540 2501 2539
+2419 2338 2337
+2595 2540 2539
+2595 2668 2628
+2542 2541 2596
+2501 2540 2541
+2746 2720 2745
+2595 2627 2668
+2719 2720 2668
+2597 2670 2598
+2595 2596 2541
+2669 2721 2670
+2628 2669 2596
+2628 2668 2669
+2669 2597 2596
+2669 2670 2597
+2568 2544 2567
+2503 2502 2520
+2541 2502 2457
+2458 2504 2459
+2567 2542 2597
+2520 2502 2542
+2457 2419 2337
+2502 2503 2458
+2309 2277 2338
+2209 2169 2208
+2277 2278 2250
+2277 2309 2278
+2277 2250 2209
+2279 2280 2210
+2121 2169 2122
+2208 2277 2209
+2169 2170 2122
+2209 2250 2210
+2120 2207 2208
+2276 2277 2208
+2275 2276 2208
+2275 2337 2276
+2456 2457 2336
+2338 2277 2337
+2457 2456 2501
+2336 2335 2456
+2336 2207 2206
+2275 2208 2207
+2541 2457 2501
+2502 2458 2457
+1756 2015 2016
+2118 2206 2207
+1629 1755 1756
+2014 2118 2015
+1755 1629 1510
+1512 1564 1513
+2015 2120 2016
+2119 2207 2120
+1756 1630 1629
+1631 1564 1563
+2120 2121 2016
+2120 2208 2121
+2018 1899 2017
+1757 1632 1631
+2016 2017 1899
+2016 2121 2017
+1756 1631 1630
+1756 1899 1631
+1511 1562 1512
+1630 1631 1562
+1423 1512 1513
+1562 1631 1563
+1077 1036 1007
+1304 1511 1423
+1563 1512 1562
+1563 1564 1512
+1074 1075 1003
+1304 1423 1305
+840 917 775
+919 1005 1006
+774 840 775
+916 1002 1003
+840 1003 917
+1002 1074 1003
+839 916 840
+877 915 962
+1000 1073 1001
+1304 1075 1074
+1510 1511 1304
+1629 1630 1511
+877 962 916
+961 1001 962
+837 875 838
+875 915 876
+839 877 916
+839 838 877
+832 911 833
+875 914 960
+874 873 913
+832 910 998
+773 838 774
+529 449 528
+836 873 874
+873 912 913
+836 874 837
+913 999 914
+874 914 837
+960 915 875
+1072 1073 999
+1000 999 1073
+1304 1303 1510
+1304 1074 1303
+1303 1509 1510
+2015 1756 1755
+2015 2118 2119
+2014 2206 2118
+1752 2012 1753
+2014 1755 1754
+837 914 875
+874 913 914
+1509 1302 1508
+1303 1073 1302
+2014 2013 2205
+2014 1754 2013
+1753 1509 1508
+1754 1510 1509
+2012 2117 2013
+2116 2204 2117
+1507 1301 1300
+1508 1302 1301
+1509 1753 1754
+1508 1752 1753
+1070 998 997
+1070 1300 1071
+1070 1071 998
+1301 1302 1072
+913 912 999
+1071 1301 1072
+835 834 912
+1071 1072 912
+998 911 832
+998 1071 911
+833 834 771
+873 836 835
+572 615 616
+678 717 718
+678 616 615
+528 493 572
+572 616 528
+772 835 836
+678 679 616
+718 770 771
+772 719 834
+719 718 771
+832 833 771
+834 835 772
+911 834 833
+911 912 834
+681 618 680
+719 771 834
+836 773 772
+386 387 328
+680 719 772
+680 679 719
+679 617 616
+618 619 531
+327 362 386
+386 449 450
+311 326 312
+326 325 362
+299 298 327
+326 362 327
+296 297 286
+296 311 297
+295 310 296
+325 384 385
+297 311 312
+310 326 311
+286 265 296
+263 323 324
+616 529 528
+452 532 453
+295 325 310
+294 263 324
+449 448 528
+449 385 448
+448 422 447
+384 383 422
+383 324 323
+384 325 324
+223 263 264
+262 323 263
+325 294 324
+295 264 294
+265 264 295
+265 250 264
+167 166 222
+222 263 223
+221 197 196
+132 122 121
+167 222 223
+221 262 222
+222 166 197
+198 224 225
+165 154 153
+166 133 132
+99 98 121
+97 131 120
+97 117 98
+97 120 117
+131 132 120
+154 166 132
+99 121 122
+117 120 121
+70 91 92
+70 69 91
+70 60 69
+16 17 3
+69 60 59
+70 71 60
+72 92 93
+91 99 100
+61 71 72
+70 92 71
+103 102 134
+101 92 100
+103 135 104
+123 122 133
+101 100 123
+92 91 100
+224 168 223
+133 166 167
+224 250 266
+250 223 264
+266 250 265
+224 223 250
+223 168 167
+135 136 104
+200 169 199
+168 224 198
+74 102 103
+93 92 101
+102 101 123
+63 73 74
+133 134 123
+168 169 135
+102 93 101
+102 73 93
+92 72 71
+93 73 72
+60 61 42
+60 71 61
+61 62 42
+61 73 62
+62 63 42
+62 73 63
+64 74 75
+73 102 74
+45 44 75
+42 63 64
+75 44 64
+44 32 43
+32 44 33
+43 64 44
+34 16 33
+33 16 32
+75 76 45
+75 103 76
+45 34 33
+35 46 16
+135 103 134
+104 76 103
+198 169 168
+200 201 170
+168 135 134
+169 136 135
+225 199 198
+212 200 199
+228 171 202
+170 169 200
+202 170 201
+136 169 170
+214 213 226
+200 212 213
+201 214 227
+201 200 214
+454 390 453
+329 387 388
+267 251 225
+268 227 251
+266 225 224
+226 213 212
+251 226 225
+251 227 226
+286 298 266
+328 268 267
+266 298 299
+297 312 298
+266 299 267
+298 312 327
+617 618 530
+451 452 388
+299 327 328
+312 326 327
+385 386 362
+450 387 386
+530 531 451
+617 680 618
+530 618 531
+680 772 681
+529 530 450
+529 617 530
+773 681 772
+774 838 839
+837 773 836
+837 838 773
+532 619 620
+618 681 619
+840 774 839
+683 620 682
+775 683 774
+619 681 682
+452 451 531
+388 387 451
+532 452 531
+453 389 452
+619 532 531
+620 621 533
+774 683 682
+777 841 842
+1075 1004 917
+1075 1076 1004
+621 684 622
+621 683 684
+775 776 684
+775 917 776
+776 918 841
+917 1004 918
+920 919 963
+841 918 919
+1076 1306 1169
+1007 1008 963
+841 920 842
+1008 1037 1038
+963 964 920
+1038 1079 1039
+776 777 685
+599 598 627
+778 777 842
+686 685 777
+776 685 684
+625 537 624
+685 622 684
+622 685 623
+533 621 534
+685 686 623
+622 623 535
+686 778 687
+330 389 331
+271 229 270
+389 390 331
+455 456 392
+388 389 330
+391 392 332
+229 269 270
+228 227 269
+452 389 388
+453 390 389
+270 330 331
+329 388 330
+534 621 622
+620 683 621
+227 202 201
+228 229 171
+454 533 534
+532 620 533
+202 171 170
+172 137 171
+105 137 138
+136 171 137
+79 47 78
+104 137 105
+17 16 46
+46 76 77
+105 78 104
+78 46 77
+79 78 105
+47 46 78
+17 46 47
+35 45 46
+45 35 34
+6 5 20
+32 16 3
+48 49 20
+19 36 48
+47 36 17
+47 48 36
+36 18 17
+6 7 5
+17 18 3
+14 15 2
+7 8 1
+3 4 5
+3 18 4
+4 19 5
+5 7 1
+20 7 6
+1 9 10
+21 8 7
+21 50 22
+106 81 80
+50 21 49
+5 19 20
+18 36 19
+21 20 49
+21 7 20
+80 79 105
+80 48 79
+81 106 107
+106 105 138
+139 106 138
+81 49 80
+271 332 333
+271 270 332
+272 230 271
+173 138 172
+140 107 139
+108 51 107
+231 173 230
+143 142 177
+174 140 139
+107 106 139
+51 81 107
+50 49 81
+21 9 8
+10 11 1
+23 10 22
+9 21 22
+22 10 9
+22 37 23
+24 12 11
+22 50 37
+51 25 24
+11 10 23
+25 13 12
+12 2 11
+5 1 3
+11 2 1
+12 13 2
+14 2 13
+23 24 11
+24 37 51
+52 25 51
+52 38 26
+141 108 140
+53 54 39
+37 24 23
+25 12 24
+107 140 108
+139 173 174
+231 272 273
+271 333 272
+233 175 232
+230 272 231
+231 174 173
+231 232 174
+391 455 392
+573 626 574
+779 720 687
+807 847 808
+779 780 720
+779 844 780
+778 779 687
+844 879 880
+688 625 687
+574 575 538
+535 536 456
+688 687 720
+331 391 332
+390 454 455
+455 535 456
+534 622 535
+390 455 391
+454 534 455
+777 778 686
+842 921 922
+844 843 878
+778 842 922
+623 624 536
+623 686 624
+879 924 969
+924 1011 969
+923 922 968
+843 778 922
+925 879 969
+923 968 1011
+922 967 1010
+922 966 967
+922 1010 968
+967 1040 1010
+878 923 924
+878 843 923
+1013 971 1012
+970 969 1012
+843 844 779
+878 924 879
+880 879 925
+844 878 879
+880 845 844
+880 971 845
+970 880 925
+926 972 881
+970 971 880
+970 1012 971
+1516 1761 1517
+1517 1518 1310
+1310 1083 1309
+1012 1011 1082
+1760 1761 1516
+2021 2022 1762
+1173 1308 1309
+1763 1902 1764
+1761 1762 1517
+1761 2021 1762
+1902 1901 2023
+2214 2213 2282
+2215 2127 2126
+2212 2021 2020
+2021 2214 2022
+2286 2349 2350
+2347 2346 2425
+2283 2310 2346
+2282 2213 2281
+2214 2021 2213
+2344 2282 2343
+2310 2283 2282
+1309 1516 1517
+1515 1635 1760
+2282 2281 2343
+2341 2460 2420
+2212 2281 2213
+2342 2343 2281
+2281 2341 2342
+2458 2339 2419
+1759 1760 1635
+2020 1761 1760
+2019 2211 2020
+2211 2340 2212
+1308 1515 1516
+1307 1306 1514
+1081 1172 1173
+1308 1516 1309
+1171 1308 1172
+1171 1307 1308
+1040 1039 1080
+966 965 1009
+1008 1038 964
+1037 1078 1038
+1039 1009 1038
+1039 966 1009
+963 1008 964
+963 1006 1007
+1037 1036 1078
+1305 1076 1075
+1171 1170 1307
+1125 1078 1170
+1076 1169 1077
+1307 1170 1169
+1005 1076 1006
+1169 1078 1077
+1077 1007 1006
+1036 1008 1007
+1633 1514 1513
+1514 1515 1307
+1513 1305 1423
+1306 1076 1305
+1006 1076 1077
+1005 1004 1076
+1757 1633 1632
+1634 1635 1514
+1513 1514 1306
+1633 1634 1514
+1758 1634 1633
+1758 1759 1634
+2018 1757 1899
+1900 1758 1757
+2122 2123 2069
+2170 2209 2171
+2170 2171 2123
+2210 2125 2124
+2338 2339 2309
+2458 2503 2504
+2278 2279 2250
+2278 2309 2279
+2209 2210 2171
+2250 2279 2210
+2123 2124 2069
+2123 2171 2124
+2124 2018 2069
+1900 1757 2018
+1757 1758 1633
+1900 1759 1758
+2019 1759 1900
+2019 1760 1759
+2212 2340 2341
+2280 2339 2340
+2020 2211 2212
+2125 2210 2211
+2341 2459 2460
+2545 2504 2544
+2572 2547 2546
+2572 2631 2573
+2570 2571 2546
+2600 2630 2572
+2544 2569 2545
+2571 2572 2546
+2339 2458 2340
+2504 2505 2459
+2569 2544 2568
+2503 2520 2543
+2544 2543 2567
+2544 2503 2543
+2340 2458 2459
+2419 2457 2458
+2599 2570 2545
+2570 2546 2545
+2599 2545 2569
+2546 2504 2545
+2598 2599 2569
+2599 2629 2570
+2600 2572 2571
+2573 2601 2574
+2670 2599 2598
+2629 2600 2571
+2570 2629 2571
+2632 2673 2633
+2671 2629 2599
+2672 2673 2631
+2629 2630 2600
+2629 2671 2672
+2629 2672 2630
+2724 2723 2777
+2630 2631 2572
+2630 2672 2631
+2572 2573 2547
+2575 2633 2602
+2631 2601 2573
+2631 2673 2632
+2547 2574 2548
+2601 2632 2574
+2574 2632 2633
+2601 2631 2632
+2548 2575 2576
+2574 2633 2575
+2725 2675 2674
+2634 2576 2602
+2675 2636 2603
+2637 2604 2577
+2725 2726 2676
+2637 2636 2675
+2577 2604 2550
+2637 2638 2604
+2634 2602 2633
+2576 2575 2602
+2635 2634 2674
+2635 2576 2634
+2462 2506 2550
+2460 2505 2506
+2343 2420 2421
+2342 2341 2420
+2420 2461 2421
+2420 2460 2461
+2462 2436 2421
+2345 2310 2344
+2603 2577 2549
+2636 2637 2577
+2461 2462 2421
+2461 2506 2462
+2421 2422 2390
+2463 2507 2464
+2390 2344 2343
+2390 2422 2423
+2391 2423 2437
+2391 2344 2423
+2391 2345 2344
+2346 2310 2345
+2346 2391 2424
+2346 2345 2391
+2424 2437 2464
+2423 2422 2436
+2423 2463 2437
+2462 2507 2463
+2676 2638 2637
+2639 2605 2638
+2463 2436 2462
+2463 2423 2436
+2638 2676 2639
+2725 2674 2724
+2641 2677 2678
+2913 2845 2912
+2677 2641 2640
+2606 2643 2607
+2676 2726 2677
+2676 2675 2725
+2911 2912 2845
+2939 2940 2912
+2909 2910 2844
+2936 2937 2911
+2844 2779 2725
+2845 2726 2779
+2779 2911 2845
+2910 2936 2911
+2909 2844 2843
+2910 2911 2844
+2844 2778 2843
+2674 2673 2724
+2844 2725 2778
+2779 2726 2725
+2843 2842 2873
+2870 2869 2906
+2909 2908 2932
+2907 2906 2929
+2873 2909 2843
+2933 2934 2909
+2974 3008 2975
+3008 3064 3009
+2932 2974 2933
+2973 3007 2974
+2909 2934 2910
+2933 2974 2934
+3588 3784 3589
+3149 3064 3063
+3148 3063 3098
+3064 3008 3063
+3063 3008 3007
+3009 2975 3008
+3066 3012 3065
+3011 3010 3065
+2976 2975 3010
+2934 2974 2975
+2910 2935 2936
+2934 2975 2935
+2976 3012 2977
+3066 3151 3152
+3151 3066 3065
+3013 2977 3012
+3183 3152 3151
+3013 3012 3066
+3152 3183 3245
+3151 3244 3183
+3149 3150 3064
+3244 3151 3150
+3281 3405 3495
+3183 3244 3245
+3150 3243 3244
+3585 3780 3781
+3354 3324 3404
+3325 3281 3324
+3244 3281 3245
+3244 3324 3281
+3405 3354 3404
+3325 3324 3354
+3403 3402 3590
+3591 3590 3786
+3493 3436 3492
+3437 3405 3436
+4088 4176 3963
+4088 4175 4297
+3404 3403 3492
+3964 3963 4177
+3436 3404 3492
+3324 3243 3403
+3589 3785 3590
+3784 3963 3785
+3589 3784 3785
+3862 3861 3961
+4087 4175 4088
+4295 4352 4424
+4087 4086 4174
+4294 4218 4293
+3962 4087 4088
+4015 3960 3959
+3963 3962 4088
+3784 3862 3962
+3492 3403 3590
+3402 3241 3401
+3147 3241 3242
+3589 3590 3402
+3324 3403 3404
+3243 3242 3403
+3148 3149 3063
+3243 3150 3149
+3097 3096 3147
+3402 3403 3242
+3147 3148 3098
+3242 3149 3148
+3063 3062 3098
+2972 2931 2930
+3062 3061 3097
+3062 3007 2972
+3400 3401 3240
+3097 3098 3062
+3146 3241 3147
+3242 3148 3147
+3096 3097 3061
+3147 3098 3097
+3962 3961 4087
+3962 3862 3961
+3960 4015 4085
+4174 4219 4175
+4085 4174 4086
+4294 4293 4352
+3862 3783 3861
+3589 3402 3401
+3240 3241 3145
+3402 3242 3241
+2971 2929 2928
+3057 3056 3240
+3902 3901 3958
+4172 4421 4292
+4086 3960 4085
+4084 4172 4292
+3961 3960 4086
+4015 4084 4085
+3959 4014 4015
+3953 3779 3857
+4013 3958 3957
+3959 3903 3902
+4015 4014 4084
+3959 3958 4014
+3959 3902 3958
+3782 3783 3587
+3588 3587 3783
+3902 3903 3860
+3861 3960 3961
+3903 3959 3960
+3588 3401 3400
+3588 3589 3401
+3239 3240 3056
+3240 3401 3241
+3587 3588 3400
+3783 3784 3588
+3057 3058 2970
+3145 3146 3058
+3057 2970 2969
+3060 3059 3096
+2840 2868 2869
+2970 2928 2905
+3058 3004 2970
+3058 3146 3059
+3058 3059 3004
+2972 2973 2931
+3061 3060 3096
+3005 3004 3059
+2970 2971 2928
+3006 3061 3062
+3005 3006 2971
+3005 3059 3006
+3006 3060 3061
+3006 3059 3060
+2932 2931 2973
+2930 2929 2972
+3006 2972 2971
+3006 3062 2972
+2908 2930 2931
+2908 2872 2871
+2908 2907 2930
+2871 2841 2907
+2908 2871 2907
+2724 2778 2725
+2872 2842 2871
+2872 2873 2842
+2671 2723 2672
+2842 2778 2724
+2724 2777 2842
+2724 2672 2723
+2842 2841 2871
+2777 2809 2841
+2807 2774 2806
+2809 2777 2776
+2840 2809 2776
+2840 2870 2809
+2907 2870 2906
+2841 2809 2870
+2869 2868 2905
+2836 2805 2804
+2868 2808 2807
+2840 2776 2808
+2722 2723 2671
+2776 2777 2723
+2721 2722 2670
+2721 2748 2749
+2774 2748 2747
+2746 2745 2773
+2807 2775 2774
+2775 2776 2723
+2721 2749 2722
+2748 2774 2749
+2776 2775 2808
+2749 2774 2775
+2839 2807 2806
+2808 2775 2807
+2905 2904 2970
+2837 2838 2805
+2868 2839 2904
+2868 2807 2839
+3057 3240 3145
+3239 3399 3400
+2839 2867 2904
+2839 2806 2838
+3058 3057 3145
+2969 3056 3057
+2866 2837 2865
+2838 2806 2805
+2902 2903 2866
+2903 2838 2866
+2904 2903 2969
+2867 2838 2903
+2903 2902 2969
+2865 2836 2864
+2865 2864 2902
+2900 2833 2899
+2837 2836 2865
+2837 2805 2836
+2803 2772 2771
+2773 2745 2772
+2747 2746 2805
+2720 2669 2668
+2866 2838 2837
+2867 2839 2838
+2721 2747 2748
+2721 2720 2747
+2718 2719 2667
+2745 2720 2719
+2747 2720 2746
+2721 2669 2720
+2717 2743 2718
+2772 2745 2744
+2718 2770 2744
+2802 2835 2803
+2772 2803 2804
+2771 2802 2803
+2770 2802 2771
+2834 2900 2901
+2743 2770 2718
+2769 2834 2770
+2719 2718 2744
+2697 2666 2716
+2665 2716 2666
+2716 2769 2743
+2833 2769 2768
+2717 2697 2716
+2718 2697 2717
+2667 2666 2697
+2897 2898 2766
+2768 2665 2767
+2768 2769 2716
+2833 2834 2769
+2716 2743 2717
+2769 2770 2743
+2898 3054 2899
+3583 3490 3489
+3053 2898 3052
+2899 2767 2898
+3235 3236 3144
+3054 2898 3053
+3395 3396 3323
+3236 3235 3323
+3053 3236 3237
+3053 3144 3236
+3053 3237 3054
+3395 3323 3322
+3056 3055 3239
+3237 3236 3397
+2902 2864 2901
+3054 3238 3055
+2968 2900 3055
+2835 2802 2834
+2770 2834 2802
+2833 2900 2834
+3056 2968 3055
+3056 2969 2968
+2968 2901 2900
+2968 2902 2901
+3584 3491 3687
+3397 3236 3396
+3779 3687 3778
+3779 3780 3584
+3778 3686 3732
+3687 3491 3583
+3397 3396 3491
+3236 3323 3396
+3489 3490 3435
+3583 3491 3490
+3489 3435 3395
+3490 3396 3435
+3489 3395 3434
+3435 3396 3395
+3488 3489 3434
+3582 3685 3489
+3814 3777 3813
+3732 3685 3777
+3686 3685 3732
+3686 3583 3685
+3685 3583 3489
+3686 3687 3583
+3898 3899 3855
+3856 3778 3814
+3899 3898 3951
+3855 3897 3898
+4079 4080 3952
+3856 3814 3855
+3952 4080 4081
+4079 4167 4168
+3856 3952 3857
+3899 3951 3952
+4169 4168 4415
+4080 4079 4168
+3952 4081 3953
+4080 4168 4081
+3952 3856 3899
+3857 3778 3856
+3779 3778 3857
+3687 3686 3778
+4081 4169 3953
+3584 3780 3585
+3859 3902 3860
+4081 4168 4169
+3952 3953 3857
+4291 4290 4420
+4169 4170 3954
+4169 4416 4170
+4013 3957 4083
+4291 4420 4556
+3954 4170 4171
+4171 4290 4291
+3953 3954 3779
+3782 3860 3783
+3780 3954 3955
+3953 4169 3954
+3780 3955 3781
+3954 4171 3955
+3586 3398 3585
+3779 3954 3780
+3398 3397 3584
+3398 3237 3397
+3491 3584 3397
+3687 3779 3584
+3238 3398 3399
+3238 3237 3398
+3586 3585 3781
+3398 3584 3585
+3398 3586 3399
+3781 3858 3782
+3859 3901 3902
+3956 4082 4083
+3955 3858 3781
+3955 4082 3956
+3858 3859 3782
+3858 3900 3859
+3239 3400 3240
+3399 3586 3587
+3781 3782 3586
+3859 3860 3782
+3399 3587 3400
+3586 3782 3587
+3901 3957 3958
+3900 3858 3956
+3900 3956 3957
+3858 3955 3956
+3901 3900 3957
+3901 3859 3900
+4014 4013 4084
+4082 4171 4291
+4084 4083 4172
+3957 3956 4083
+4084 4013 4083
+4014 3958 4013
+4675 4676 4554
+4815 4814 4874
+4170 4289 4171
+4480 4554 4555
+4812 4813 4676
+4872 4873 4814
+4554 4676 4555
+4813 4872 4814
+5097 4944 5018
+4872 4813 4942
+4942 5018 4943
+5096 5097 5018
+5831 5768 5767
+5366 5365 5413
+5369 5368 5417
+5366 5414 5415
+5367 5368 5287
+5095 4942 4812
+5094 5227 5095
+4943 4872 4942
+5097 5096 5229
+5018 4942 5096
+4942 5095 5096
+5227 5364 5228
+5413 5365 5412
+5228 5364 5365
+5414 5366 5413
+5412 5411 5492
+5412 5365 5411
+4811 4812 4675
+4941 5095 4812
+5094 5095 4941
+5228 5096 5095
+4674 4675 4417
+4675 4812 4676
+4351 4419 4420
+4351 4289 4418
+4420 4480 4555
+4419 4418 4480
+4289 4351 4290
+4289 4170 4417
+4480 4418 4554
+4419 4351 4418
+4171 4289 4290
+4170 4416 4417
+4418 4417 4554
+4811 4940 4941
+4810 4940 4811
+5093 5094 4941
+5226 5094 5093
+5226 5285 5286
+5093 4940 5225
+5093 4941 4940
+4812 4811 4941
+4675 4674 4811
+4554 4417 4675
+4418 4289 4417
+4939 4809 4673
+4940 4810 4809
+4169 4415 4416
+4414 4672 4415
+4674 4673 4809
+4415 4672 4673
+5223 4939 4938
+5223 5224 4939
+5487 5224 5223
+5361 5362 5225
+4674 4810 4811
+4674 4809 4810
+5225 5362 5284
+5225 5224 5361
+5648 5602 5601
+5224 5487 5488
+5488 5361 5224
+5488 5601 5602
+5647 5600 5646
+5488 5487 5600
+5603 5489 5602
+5362 5361 5489
+5545 5544 5604
+5490 5363 5489
+5652 5545 5604
+5546 5491 5490
+5284 5285 5226
+5363 5364 5286
+5545 5490 5544
+5545 5546 5490
+5095 5227 5228
+5094 5226 5227
+5226 5286 5227
+5285 5363 5286
+5411 5491 5492
+5411 5364 5491
+5938 5828 5867
+5865 5826 5864
+6066 6067 5999
+5828 5712 5827
+5828 5827 5867
+5765 5764 5826
+5712 5766 5827
+5711 5648 5601
+5647 5711 5601
+5712 5828 5649
+5600 5647 5601
+5710 5764 5765
+5600 5645 5646
+5599 5709 5645
+5646 5710 5647
+5646 5645 5710
+5710 5763 5764
+5710 5645 5763
+5865 5866 5826
+5766 5711 5765
+5648 5711 5712
+5647 5765 5711
+5999 5937 5866
+5866 5827 5766
+5934 5935 5825
+6066 6065 6125
+5866 5865 5936
+5866 5766 5765
+5825 5935 5864
+5934 6064 6065
+5934 6065 5935
+6123 6124 6065
+5935 6066 5936
+6125 6126 6066
+6126 6067 6066
+6200 6283 6127
+5999 5866 5936
+5867 5827 5866
+6066 5999 5936
+5999 6067 6000
+5866 5937 5867
+6000 6067 6127
+6200 6127 6067
+6129 6202 6130
+5999 6000 5937
+6068 6001 6000
+6127 6068 6000
+6127 6201 6128
+6127 6128 6068
+6201 6202 6129
+6070 6069 6129
+6069 6068 6128
+6070 6129 6130
+6002 5939 6001
+5651 5604 5603
+6001 6069 6002
+6001 6068 6069
+5828 5650 5649
+5361 5602 5489
+5649 5650 5602
+5648 5649 5602
+5648 5712 5649
+5489 5603 5544
+5650 5651 5603
+6001 5939 5938
+6002 6070 6003
+5939 6002 5940
+5604 5651 5652
+6003 5941 5940
+5942 5868 5941
+5943 6073 5944
+5870 5831 5869
+5829 5868 5869
+5767 5830 5831
+5829 5869 5830
+5832 5831 5870
+5869 5943 5944
+6002 6003 5940
+6070 6071 6003
+5868 5943 5869
+5868 5942 5943
+6071 6070 6130
+6002 6069 6070
+6073 6072 6204
+5942 5941 6071
+5943 6072 6073
+5942 6071 6072
+5945 6074 6075
+6073 6205 6074
+5944 5870 5869
+5832 5769 5768
+5713 5768 5769
+5945 5870 5944
+5945 5832 5870
+5714 5713 5769
+5947 5946 6076
+5833 5769 5832
+5947 5833 5946
+5947 5871 5834
+5834 5871 5872
+5948 6004 5949
+5833 5947 5834
+5714 5769 5770
+5833 5771 5770
+5548 5605 5606
+5496 5419 5495
+5495 5547 5548
+5289 5418 5370
+5548 5606 5496
+5288 5287 5368
+5287 5230 5367
+5370 5418 5495
+5369 5493 5418
+5288 5368 5369
+5230 5366 5367
+5369 5417 5493
+5368 5367 5416
+5713 5767 5768
+5415 5367 5366
+5415 5416 5367
+5417 5368 5416
+5289 5231 5288
+5230 5229 5366
+5098 5231 5232
+5098 5097 5231
+5418 5289 5369
+5231 5287 5288
+4945 5098 5099
+5019 5097 5098
+4873 4944 4874
+4943 5018 4944
+5231 5230 5287
+5097 5229 5230
+4814 4873 4874
+4872 4943 4873
+4172 4291 4421
+4172 4082 4291
+4815 4677 4814
+4676 4813 4814
+4291 4556 4421
+4555 4676 4556
+4945 4815 4874
+4678 4679 4558
+4676 4677 4556
+4815 4816 4677
+4816 4557 4677
+4293 4173 4292
+4422 4292 4421
+4173 4084 4292
+4558 4422 4557
+4558 4423 4422
+4422 4423 4292
+4423 4352 4293
+4559 4558 4679
+4423 4293 4292
+4559 4423 4558
+4218 4295 4174
+5371 5233 5290
+5101 4947 4818
+4678 4816 4817
+4815 4945 4816
+4679 4678 4817
+4558 4557 4678
+5232 5289 5370
+5288 5369 5289
+5233 5232 5290
+5099 5098 5232
+5290 5370 5419
+5290 5232 5370
+5607 5496 5606
+5233 5101 5100
+5607 5372 5496
+5498 5717 5499
+5101 5233 5372
+5290 5419 5371
+5099 4946 4816
+5100 5101 4946
+5099 5233 5100
+5371 5372 5233
+4559 4424 4423
+4424 4560 4425
+4173 4218 4174
+4173 4293 4218
+4295 4294 4352
+4295 4218 4294
+4425 4353 4424
+4219 4174 4295
+4423 4424 4352
+4559 4560 4424
+4946 4818 4817
+4680 4560 4559
+4561 4425 4560
+4297 4176 4088
+4424 4353 4295
+4425 4296 4353
+4561 4297 4425
+4297 4175 4296
+4425 4297 4296
+4426 4427 4177
+4819 4680 4679
+4820 4681 4561
+4561 4426 4297
+4561 4681 4426
+4819 4820 4680
+4947 4948 4820
+4947 4819 4818
+4947 4820 4819
+4947 5234 5235
+5101 5372 5234
+5372 5497 5234
+5609 5717 5498
+5607 5608 5497
+5234 5498 5235
+5497 5608 5609
+5717 5838 5718
+5837 5836 5877
+5836 5837 5717
+5951 5950 6007
+5876 5836 5875
+5876 5877 5836
+5835 5716 5772
+5836 5717 5609
+5497 5609 5498
+5608 5716 5609
+5607 5715 5716
+5871 5947 5948
+5716 5715 5772
+5607 5606 5715
+5871 5948 5872
+5947 6076 6077
+5872 5948 5873
+5836 5835 5875
+6078 6079 6005
+5875 5835 5874
+6078 6077 6208
+5948 5947 6077
+5949 6004 6005
+5948 6077 6004
+6079 6078 6131
+6004 6077 6078
+6132 6079 6131
+6209 6132 6131
+5950 5877 5876
+5952 6080 6009
+6006 6007 5950
+5953 5952 6009
+5838 5837 5952
+5877 5951 5837
+6007 6008 5951
+5952 6008 6080
+5952 5951 6008
+7383 7523 7524
+7264 7522 7523
+7187 7116 7266
+7264 7523 7265
+7383 7524 7525
+7574 7639 7708
+7523 7574 7524
+7523 7639 7574
+7576 7575 7640
+7524 7574 7575
+7576 7710 7577
+7577 7525 7576
+7383 7525 7384
+7524 7576 7525
+7640 7709 7576
+7578 7525 7577
+7267 7188 7187
+7267 7268 7188
+7187 7266 7267
+7265 7523 7383
+7267 7266 7383
+7187 7117 7116
+7119 7118 7188
+6995 6861 6994
+7118 7119 7046
+7188 7189 7120
+6907 6996 6997
+7119 7188 7120
+7045 7046 6995
+7119 7120 7046
+7118 7045 7117
+7118 7046 7045
+6639 6690 6691
+6568 6504 6503
+6765 6764 6861
+6638 6639 6569
+7265 7116 6993
+7045 6995 6994
+7118 7117 7187
+7045 6994 7116
+7045 7116 7117
+6994 6993 7116
+7265 6993 6992
+6994 6861 6993
+6993 6763 6762
+6861 6764 6763
+6763 6635 6762
+6763 6636 6635
+6424 6361 6423
+6502 6636 6503
+6763 6764 6636
+6216 6215 6288
+6216 6137 6215
+6425 6424 6502
+6217 6082 6137
+6082 5954 5953
+5952 5953 5838
+5500 5499 5718
+5719 5953 5954
+5718 5838 5953
+6081 6082 5953
+6138 6083 6082
+6217 6137 6216
+6082 6081 6137
+6082 6217 6138
+6426 6503 6504
+6084 5955 5954
+5500 5718 5719
+6084 6218 6219
+6138 6217 6218
+6218 6084 6083
+5955 6085 5956
+6218 6289 6219
+6692 6640 6691
+6504 6568 6569
+6636 6764 6637
+6637 6569 6568
+6639 6505 6569
+6636 6637 6568
+6690 6765 6691
+6764 6690 6637
+6764 6765 6690
+6690 6638 6637
+6690 6639 6638
+6691 6640 6639
+6692 6693 6640
+6862 6766 6765
+6862 6863 6766
+6364 6363 6427
+6507 6571 6572
+6289 6362 6290
+6220 6363 6292
+6219 6291 6220
+6290 6362 6291
+5501 5720 5502
+5719 5954 5720
+5954 5955 5720
+6220 6292 6221
+6220 6085 5955
+6292 6365 6221
+6292 6364 6365
+6292 6363 6364
+6293 6221 6365
+6293 6222 6221
+6427 6428 6365
+6222 5957 5956
+5239 4952 5238
+5720 5955 5721
+5955 5956 5721
+6085 6221 6222
+6223 6222 6367
+5956 6085 6222
+6366 6429 6430
+6222 6366 6367
+6293 6365 6428
+6429 6428 6506
+6693 6766 6767
+6366 6428 6429
+6693 6767 6694
+6864 6910 6865
+6767 6768 6694
+6908 6907 6997
+6768 6797 6769
+6767 6797 6768
+6909 6997 6998
+7050 6998 7049
+7051 6999 6998
+7050 7051 6998
+7123 6999 7051
+7048 7121 7049
+7122 7051 7050
+6797 6863 6864
+6908 6997 6909
+6798 6797 6864
+6767 6766 6863
+6864 6863 6909
+6797 6767 6863
+6996 6862 6995
+6907 6863 6862
+6863 6908 6909
+6863 6907 6908
+6862 6996 6907
+6995 7046 6996
+6996 7047 6997
+6996 7046 7047
+6997 7048 7049
+7047 7120 7121
+7123 7122 7270
+7189 7188 7268
+7269 7268 7384
+7269 7189 7268
+7122 7121 7269
+7048 7047 7121
+7269 7384 7527
+7268 7267 7384
+7384 7526 7527
+7384 7525 7526
+7526 7579 7527
+7944 7943 8058
+7582 7581 7643
+7643 7579 7642
+7528 7580 7581
+7527 7579 7580
+7049 7122 7050
+7269 7385 7122
+7527 7385 7269
+7528 7583 7529
+7584 7529 7583
+7385 7527 7528
+7583 7582 7644
+7583 7528 7582
+7644 7645 7583
+7387 7388 7324
+7646 7585 7584
+7647 7648 7585
+7387 7386 7530
+7585 7648 7530
+7528 7529 7385
+7584 7585 7529
+7270 7386 7323
+7385 7529 7386
+7385 7270 7122
+7385 7386 7270
+6998 6999 6910
+7123 7190 7124
+6864 6865 6798
+6910 6999 6865
+7272 7190 7271
+7124 6999 7123
+7272 7323 7387
+7271 7270 7323
+7272 7387 7324
+7323 7386 7387
+7272 7124 7190
+7191 7125 7124
+7124 7000 6999
+7124 7125 7000
+6865 6866 6799
+6865 7000 6866
+6866 6911 6867
+7126 7001 7125
+6644 6698 6645
+7126 7002 7001
+7126 7192 7127
+7389 7274 7273
+7389 7532 7390
+7323 7272 7271
+7324 7191 7272
+7324 7273 7191
+7324 7388 7273
+7530 7586 7531
+7530 7648 7586
+7387 7531 7388
+7716 7715 7801
+7531 7389 7388
+7275 7193 7127
+7531 7650 7389
+7651 7720 7652
+7274 7275 7192
+7532 7533 7390
+7391 7276 7390
+7532 7651 7652
+7390 7276 7275
+7390 7447 7391
+7389 7390 7275
+7391 7534 7535
+7533 7447 7390
+7533 7534 7447
+7806 7654 7653
+7535 7392 7391
+7534 7391 7447
+7392 7278 7277
+7535 7536 7392
+7279 7132 7131
+7276 7391 7277
+7325 7279 7278
+7128 7195 7129
+7194 7276 7195
+7276 7277 7195
+7391 7392 7277
+7004 7129 7005
+7195 7277 7129
+7006 6917 7005
+6916 6915 7004
+6919 6918 7006
+7129 7278 7130
+7006 7005 7130
+6872 6917 6918
+6872 7005 6917
+7131 7006 7130
+6918 6917 7006
+6872 6916 7005
+7003 6914 6913
+7004 6915 6914
+7194 7128 7193
+7194 7195 7128
+7003 7127 7128
+7192 7275 7127
+6869 6912 6870
+7002 7127 7003
+6912 7003 6913
+6912 7002 7003
+7001 7002 6868
+7002 6912 6869
+6645 6578 6511
+6513 6371 6512
+6509 6369 6368
+6224 6225 5959
+6510 6509 6576
+6578 6646 6647
+6578 6645 6646
+6646 6699 6647
+6872 6871 6916
+6580 6650 6514
+6872 6801 6871
+6699 6648 6647
+6649 6650 6580
+6647 6579 6512
+6648 6649 6579
+6371 6513 6514
+6579 6649 6580
+6513 6580 6514
+6513 6579 6580
+6225 6371 6226
+6371 6514 6226
+5960 5959 6225
+6512 6579 6513
+5723 5958 5959
+6372 6515 6516
+5243 4956 5242
+6370 6224 6510
+6224 6370 6225
+6511 6578 6512
+6225 6512 6371
+6578 6647 6512
+6645 6511 6577
+6223 6224 5958
+6225 6370 6512
+6510 6577 6511
+6511 6370 6510
+6511 6512 6370
+5958 6224 5959
+6368 6367 6431
+6508 6509 6368
+6510 6224 6369
+5723 5722 5957
+5957 6223 5958
+6224 6223 6369
+6223 6367 6368
+6575 6509 6574
+6510 6369 6509
+6643 6577 6510
+6577 6643 6644
+6698 6643 6575
+6911 6868 6867
+6575 6643 6576
+6866 6800 6799
+6867 6868 6800
+6799 6772 6696
+6800 6868 6772
+6576 6509 6575
+6508 6507 6572
+6642 6572 6641
+6772 6697 6696
+6769 6798 6770
+6507 6570 6571
+6506 6428 6570
+6571 6570 6641
+6367 6430 6431
+6506 6570 6507
+6509 6508 6574
+6368 6431 6508
+6642 6573 6572
+6574 6508 6573
+6222 6223 5957
+6368 6369 6223
+6366 6430 6367
+6429 6506 6430
+5503 5722 5504
+5721 5956 5722
+5244 5507 5245
+5241 5503 5504
+5724 5723 5959
+5504 5722 5723
+4954 4955 4687
+4354 4303 4302
+4220 4299 4300
+4431 4687 4432
+4300 4432 4301
+4300 4431 4432
+4220 4300 4221
+4299 4431 4300
+4017 4181 4222
+4298 4299 4181
+4181 4220 4221
+4181 4299 4220
+3597 3693 3694
+3693 3692 3791
+4300 4301 4222
+4432 4433 4301
+3693 3791 3736
+3735 3691 3734
+4302 4433 4354
+4432 4562 4433
+4301 4302 4222
+4301 4433 4302
+3793 3794 3696
+3869 3794 3868
+3694 3736 3737
+4562 4434 4433
+4355 4303 4354
+3906 3867 3866
+3793 3792 3816
+4355 4434 4356
+4354 4433 4434
+5504 5505 5241
+4564 4565 4483
+4687 4688 4562
+4955 4956 4688
+5723 5505 5504
+4957 4958 4690
+5724 5505 5723
+5242 5241 5505
+5960 5725 5959
+5506 5243 5242
+4562 4563 4434
+4688 4956 4689
+4303 4355 4356
+4354 4434 4355
+4434 4435 4356
+4481 4482 4435
+4563 4481 4435
+4563 4689 4564
+4565 4689 4690
+4955 5242 4956
+5724 5506 5505
+4958 4821 4691
+5725 5506 5724
+5507 5726 5508
+4688 4689 4563
+4956 4957 4689
+5959 5725 5724
+5962 6228 5963
+4436 4483 4484
+4482 4564 4483
+4565 4564 4689
+4482 4481 4564
+3971 3970 4018
+3970 3907 3969
+4019 3971 4018
+3907 3867 3906
+3972 3971 4019
+3908 3970 3971
+4020 3972 4019
+3909 3870 3869
+3253 3197 3196
+3908 3971 3972
+3599 3598 3696
+3793 3816 3866
+3868 3908 3869
+3868 3907 3908
+3868 3867 3907
+3868 3794 3867
+3907 3906 3969
+3970 3969 4018
+3906 3866 3905
+3906 3905 3969
+3905 3866 3865
+3867 3793 3866
+3792 3793 3737
+3867 3794 3793
+3501 3408 3500
+3328 3284 3327
+3329 3328 3408
+3329 3250 3328
+3737 3695 3694
+3409 3408 3501
+3793 3695 3737
+3598 3501 3597
+3696 3598 3695
+3335 3411 3412
+3331 3409 3410
+3329 3408 3409
+3793 3696 3695
+3795 3870 3871
+3598 3599 3409
+3696 3794 3599
+3600 3410 3599
+3255 3256 3201
+3251 3330 3252
+3329 3409 3330
+3409 3331 3330
+3252 3193 3251
+3162 3103 3161
+3331 3253 3252
+3331 3410 3332
+3331 3332 3253
+3255 3334 3256
+3195 3196 3163
+2559 2617 2560
+3194 3163 3193
+3194 3195 3163
+3252 3195 3194
+3253 3196 3195
+3192 3162 3161
+3163 3103 3162
+3191 3161 3160
+3251 3192 3250
+3251 3193 3192
+3103 3160 3161
+3283 3248 3282
+2750 2751 2730
+2785 2850 2786
+2751 2750 2786
+2686 2648 2685
+2730 2729 2750
+2784 2849 2785
+3103 3159 3160
+3158 3190 3248
+3440 3498 3499
+3408 3328 3327
+3250 3249 3284
+3249 3158 3248
+3250 3191 3249
+3250 3192 3191
+3440 3499 3407
+3500 3408 3441
+3694 3693 3736
+3789 3790 3735
+3598 3597 3694
+3537 3596 3634
+3597 3634 3693
+3693 3634 3692
+3597 3537 3634
+3500 3537 3597
+3500 3441 3499
+3326 3283 3282
+3327 3284 3283
+3500 3499 3537
+3441 3407 3499
+3326 3407 3327
+3326 3406 3407
+3536 3498 3439
+3536 3499 3498
+3440 3406 3439
+3326 3246 3406
+3406 3440 3407
+3439 3498 3440
+3157 3246 3190
+3246 3326 3282
+3247 3248 3190
+3283 3249 3248
+2876 2875 2918
+2785 2849 2850
+2876 2918 2919
+2876 2849 2848
+2729 2685 2684
+2848 2849 2784
+2876 2919 2849
+2848 2875 2876
+2874 2917 2943
+2875 2874 2918
+3188 3187 3406
+2917 2847 2916
+2917 2874 2847
+2874 2943 2918
+2846 2916 2847
+3018 2983 2982
+2983 2916 2915
+2783 2846 2847
+2782 2915 2846
+2983 2915 2982
+3187 3155 3186
+2983 2984 2916
+3154 3185 3186
+3405 3438 3495
+3185 3154 3153
+3100 3154 3186
+3153 3184 3185
+3071 3017 3070
+3689 3788 3690
+3733 3734 3691
+3633 3632 3690
+3595 3631 3632
+3535 3595 3633
+3188 3155 3187
+3101 3100 3155
+3102 3156 3189
+3102 3101 3156
+3157 3189 3246
+3156 3155 3188
+3246 3188 3406
+3189 3156 3188
+3190 3246 3247
+3189 3188 3246
+4091 4016 4090
+3790 3789 3864
+3904 3790 3864
+3864 3967 3904
+3964 3965 3786
+3967 4090 4016
+4298 4181 4091
+3968 4017 3904
+3968 4016 4017
+4298 4431 4299
+4428 4429 4178
+4298 4430 4431
+4953 5240 5241
+5240 5503 5241
+5721 5722 5503
+4954 4953 5241
+5239 5238 5501
+4017 4091 4181
+4017 4016 4091
+4685 4953 4686
+4952 5239 4953
+4430 4180 4179
+4298 4091 4180
+4431 4430 4686
+4298 4180 4430
+5501 5502 5239
+5721 5503 5502
+5240 5239 5502
+5240 4953 5239
+4090 4089 4180
+3966 3965 4179
+4953 4685 4952
+4686 4430 4685
+3631 3689 3690
+3787 3966 3788
+4091 4090 4180
+4016 3968 3967
+4089 3967 3863
+4089 4090 3967
+3789 3735 3734
+3788 3733 3690
+3788 3863 3789
+3733 3789 3734
+3733 3788 3789
+3633 3595 3632
+3593 3532 3531
+3534 3496 3533
+3594 3593 3689
+3533 3532 3593
+3594 3689 3631
+3787 3965 3966
+3535 3594 3595
+3533 3593 3594
+3863 3966 4089
+3863 3788 3966
+4430 4179 4429
+4089 3966 4179
+5500 5501 5238
+5500 5719 5501
+4949 5235 5236
+5500 5238 5237
+4948 5235 4949
+5237 4951 4950
+4952 4684 4951
+4685 4429 4684
+4428 4178 4177
+4179 3965 4178
+4682 4683 4427
+4683 4429 4428
+4949 4683 4682
+4950 4684 4683
+4950 5236 5237
+5235 5499 5236
+3965 4177 4178
+4176 4426 4177
+4948 4949 4682
+5236 4950 4949
+3591 3786 3688
+3785 3963 3964
+3965 3964 4177
+3786 3785 3964
+3688 3787 3689
+3688 3786 3787
+3495 3531 3532
+3592 3688 3593
+3529 3530 3494
+3591 3688 3592
+3530 3592 3531
+3530 3529 3592
+3325 3354 3405
+3014 2979 3067
+3099 3068 3014
+3013 3067 2979
+3013 3066 3067
+3437 3438 3405
+3530 3531 3438
+3493 3494 3438
+3493 3591 3529
+3493 3529 3494
+3591 3592 3529
+3531 3495 3438
+3533 3594 3534
+3533 3496 3495
+3535 3534 3594
+3535 3497 3534
+3534 3497 3496
+3535 3633 3497
+3067 3152 3099
+3015 3068 3069
+2980 2979 3014
+3016 2981 3015
+3015 2981 2980
+3016 3017 2981
+3017 3016 3070
+3017 2982 2981
+3017 3071 2982
+2913 2980 2914
+2914 2981 2982
+2780 2913 2781
+2980 2981 2914
+2726 2780 2678
+2726 2845 2780
+3099 3014 3067
+3068 2980 3014
+3068 3015 2980
+3069 3016 3015
+3013 2978 2977
+3013 2979 2978
+2727 2780 2781
+2727 2678 2780
+2845 2913 2780
+2940 2979 2913
+2678 2642 2641
+2678 2727 2679
+2551 2606 2552
+2642 2678 2643
+2606 2607 2552
+2643 2644 2607
+2605 2551 2507
+2606 2642 2643
+2640 2606 2551
+2641 2642 2606
+2424 2464 2425
+2437 2463 2464
+2346 2424 2425
+2391 2437 2424
+2283 2284 2214
+2283 2346 2347
+2214 2126 2022
+2214 2284 2126
+2426 2347 2425
+2348 2349 2285
+2464 2508 2425
+2464 2551 2508
+2128 2172 2217
+2284 2347 2348
+2284 2215 2126
+2173 2217 2252
+2126 2127 2023
+2172 2128 2127
+2215 2172 2127
+2215 2251 2216
+2285 2251 2215
+2285 2349 2286
+2286 2217 2251
+2217 2172 2216
+2509 2553 2554
+2508 2552 2553
+2427 2465 2509
+2426 2425 2465
+2426 2348 2347
+2426 2427 2348
+2645 2679 2680
+2644 2643 2679
+2681 2609 2680
+2608 2607 2645
+2680 2608 2645
+2554 2553 2608
+2682 2610 2681
+2610 2555 2609
+2348 2427 2349
+2351 2467 2468
+2608 2609 2554
+2608 2680 2609
+2509 2466 2427
+2509 2554 2555
+2509 2555 2466
+2554 2609 2555
+2555 2610 2611
+2609 2681 2610
+2782 2682 2728
+2611 2610 2682
+2613 2612 2684
+2611 2682 2683
+2468 2467 2557
+2556 2683 2612
+2646 2614 2613
+2557 2612 2613
+2683 2556 2611
+2612 2557 2556
+2557 2467 2556
+2468 2352 2351
+2350 2351 2288
+2289 2219 2288
+2289 2351 2290
+2288 2287 2350
+2351 2289 2288
+2290 2219 2289
+2352 2220 2290
+2027 1768 1907
+2218 2130 2129
+2219 2026 2130
+2220 2027 2219
+1906 1818 1905
+2218 2129 2173
+2130 2025 2129
+2286 2350 2287
+2349 2427 2350
+2252 2286 2287
+2287 2288 2218
+2252 2217 2286
+2251 2285 2286
+2128 2217 2173
+2216 2251 2217
+2218 2252 2287
+2218 2173 2252
+1902 2023 2024
+1817 1905 1766
+1815 1765 1637
+1816 1817 1765
+1519 1638 1520
+1766 1818 1767
+1815 1904 1816
+1905 1818 1766
+1765 1817 1766
+1816 1904 1817
+1904 1905 1817
+2025 2130 1905
+2219 2027 2026
+1907 1640 1767
+2028 2027 2220
+2028 1769 2027
+1907 1906 2026
+1767 1639 1766
+1521 1520 1640
+1638 1766 1639
+1907 1767 1906
+1907 1768 1640
+1313 1520 1521
+1639 1767 1640
+1085 1312 1086
+1522 1768 1769
+1312 1520 1313
+1640 1768 1521
+1018 1086 933
+1087 1088 935
+1018 932 931
+890 854 889
+933 932 1018
+890 889 932
+932 888 931
+853 811 888
+1086 1312 1313
+1312 1519 1520
+1311 1519 1312
+1638 1639 1520
+931 1085 1018
+1017 1084 1085
+931 930 1017
+931 887 930
+851 887 931
+851 784 850
+849 850 783
+886 887 850
+1015 1016 929
+809 783 782
+929 849 884
+885 850 849
+883 928 884
+1016 930 885
+884 928 929
+1084 1017 1016
+1083 1084 1015
+1311 1085 1084
+1518 1519 1311
+1636 1764 1637
+1765 1815 1816
+1903 1902 2024
+1518 1636 1519
+1764 1815 1637
+1903 2024 1904
+2023 2127 2024
+1519 1636 1637
+1518 1763 1636
+1764 1903 1815
+1764 1902 1903
+1083 1015 1014
+1084 1016 1015
+1013 1082 1083
+1309 1517 1310
+1762 1763 1518
+1762 1901 1763
+2022 1901 1762
+2022 2126 1901
+1309 1083 1082
+972 926 1013
+1013 1083 1014
+1310 1084 1083
+846 926 881
+845 971 926
+849 809 884
+882 927 928
+1014 928 927
+1015 929 928
+883 848 882
+883 884 848
+845 846 806
+845 926 846
+846 881 807
+882 848 808
+808 781 807
+720 780 781
+781 688 720
+628 654 691
+689 721 722
+688 781 721
+806 807 781
+806 846 807
+782 808 848
+782 781 808
+722 782 783
+721 781 782
+884 809 848
+849 783 809
+691 690 723
+690 722 723
+627 626 654
+785 784 810
+721 689 688
+722 690 689
+598 626 627
+689 690 654
+626 689 654
+599 600 575
+538 575 539
+598 599 575
+575 600 576
+627 654 628
+577 539 576
+459 394 458
+458 538 539
+456 536 537
+393 457 458
+457 537 538
+625 689 626
+598 575 574
+625 573 537
+574 538 573
+574 626 598
+573 625 626
+687 625 624
+688 689 625
+624 537 536
+573 538 537
+394 393 458
+392 456 457
+392 393 333
+392 457 393
+336 274 335
+272 333 334
+231 273 232
+272 334 273
+141 109 108
+83 55 54
+174 175 140
+174 232 175
+175 141 140
+175 176 141
+27 26 38
+26 25 52
+39 28 38
+14 25 26
+28 27 38
+15 14 27
+29 28 39
+15 27 28
+83 54 82
+52 108 82
+38 53 39
+38 52 53
+28 29 15
+39 55 30
+29 30 15
+29 39 30
+30 31 15
+40 41 31
+58 68 41
+30 40 31
+56 57 41
+55 56 40
+55 65 56
+111 84 110
+84 83 110
+39 54 55
+53 82 54
+110 83 109
+84 55 83
+273 274 232
+273 335 274
+175 233 176
+274 275 233
+177 142 176
+110 109 142
+577 540 539
+463 478 498
+600 628 576
+578 579 541
+177 234 235
+233 275 234
+460 395 459
+335 394 395
+274 336 275
+335 395 336
+112 111 124
+110 142 124
+125 112 124
+85 65 84
+112 85 111
+67 68 58
+65 66 58
+85 112 86
+144 143 178
+176 234 177
+125 143 144
+124 142 143
+113 112 125
+86 66 85
+113 86 112
+87 88 68
+86 67 66
+86 87 67
+68 88 31
+68 67 87
+113 87 86
+113 114 94
+87 94 88
+87 113 94
+177 235 178
+278 277 339
+397 337 396
+336 395 396
+275 337 276
+336 396 337
+539 540 459
+577 578 540
+395 460 396
+494 495 461
+540 494 460
+540 578 494
+630 655 694
+693 727 705
+726 727 692
+728 705 727
+786 813 749
+787 751 750
+785 812 786
+750 727 749
+694 655 693
+578 577 629
+694 693 705
+655 692 693
+578 629 655
+577 576 628
+577 628 629
+600 627 628
+725 691 724
+692 628 691
+723 724 691
+723 784 724
+784 725 724
+726 692 725
+785 786 725
+749 727 726
+853 854 812
+890 855 854
+784 785 725
+811 853 812
+855 786 854
+786 726 725
+888 852 931
+810 784 851
+931 852 851
+888 811 852
+889 853 888
+889 854 853
+786 855 813
+890 933 855
+726 786 749
+812 854 786
+749 813 750
+855 933 856
+813 787 750
+813 814 787
+787 814 788
+813 855 856
+934 856 933
+814 813 856
+750 751 728
+788 789 751
+750 728 727
+751 729 728
+631 630 656
+578 655 630
+729 694 705
+695 656 694
+694 706 695
+731 752 790
+729 730 706
+729 751 789
+815 789 788
+730 729 752
+732 753 791
+707 696 695
+632 696 697
+656 695 696
+706 731 695
+730 752 731
+753 707 731
+732 696 707
+696 632 656
+601 630 631
+656 632 631
+581 542 580
+581 632 582
+603 631 632
+632 581 603
+582 499 543
+543 513 542
+497 496 513
+582 543 581
+498 513 543
+603 580 602
+542 495 541
+602 601 631
+580 542 541
+603 602 631
+580 601 602
+541 579 580
+578 630 579
+494 541 495
+494 578 541
+460 461 396
+495 496 461
+462 423 461
+338 337 397
+496 462 461
+478 463 462
+338 397 398
+397 461 423
+180 179 203
+235 276 277
+423 398 397
+278 237 236
+235 277 236
+276 338 277
+127 126 145
+114 125 126
+115 95 114
+88 94 95
+95 96 88
+119 116 118
+96 95 115
+203 179 236
+155 145 179
+119 118 127
+115 126 118
+128 127 129
+118 126 127
+96 116 88
+96 115 116
+130 151 128
+128 151 119
+147 151 130
+119 127 128
+130 129 146
+127 145 129
+180 204 188
+253 280 302
+203 237 204
+236 277 278
+237 203 236
+204 180 203
+338 339 277
+279 252 278
+501 479 465
+423 462 463
+499 464 463
+423 463 398
+278 339 300
+338 398 339
+240 239 253
+237 278 252
+280 238 252
+205 204 238
+189 161 182
+147 130 146
+181 180 188
+155 179 180
+206 189 205
+188 204 205
+180 156 155
+157 161 158
+150 147 149
+147 146 149
+156 150 149
+150 151 147
+160 157 156
+158 151 150
+182 160 181
+161 162 159
+156 157 150
+160 182 157
+182 161 157
+161 189 183
+157 158 150
+161 159 158
+119 151 116
+158 159 151
+184 183 190
+162 161 183
+162 184 159
+162 183 184
+183 207 190
+206 205 239
+183 189 207
+182 181 189
+215 206 239
+207 189 206
+215 239 240
+205 238 239
+216 215 240
+207 206 215
+240 253 254
+239 238 280
+301 302 280
+253 239 280
+342 302 341
+303 281 302
+584 545 583
+557 514 545
+342 341 400
+363 398 399
+340 363 399
+399 400 341
+341 301 300
+341 302 301
+300 279 278
+300 301 279
+341 340 399
+339 398 363
+339 340 300
+339 363 340
+464 499 544
+463 498 499
+464 544 500
+499 582 544
+501 465 500
+399 398 464
+584 583 634
+544 582 633
+657 697 698
+696 732 733
+583 633 657
+582 632 633
+935 792 791
+734 697 733
+792 734 733
+735 708 698
+793 735 734
+796 816 861
+792 793 734
+859 891 860
+735 736 708
+737 794 795
+735 754 736
+793 859 860
+604 584 634
+557 545 584
+755 699 737
+700 666 658
+708 737 699
+736 754 737
+1091 1041 1090
+973 1020 1021
+794 793 860
+859 937 891
+1021 939 973
+938 937 973
+1021 1020 1042
+973 937 1019
+1020 1041 1042
+1020 1019 1041
+1178 1179 1130
+1092 1091 1129
+1912 1821 1773
+1647 1648 1567
+1681 1645 1644
+1646 1774 1682
+2070 2132 2032
+1773 1681 1644
+1774 1775 1682
+1525 1644 1565
+1645 1646 1565
+1526 1525 1565
+1525 1524 1644
+1820 1773 1680
+1821 1681 1773
+1910 1960 1911
+1961 1913 1912
+2032 1960 2031
+1911 1820 1910
+1912 1911 1960
+1912 1820 1911
+1425 1525 1526
+1424 1524 1525
+1089 1127 1090
+1089 1175 1127
+1129 1177 1317
+1176 1175 1316
+1091 1128 1129
+1176 1235 1177
+1127 1128 1090
+1127 1176 1128
+1090 1019 1089
+938 891 937
+973 1019 1020
+937 936 1019
+1088 936 935
+1089 1019 936
+1424 1316 1174
+1176 1127 1175
+1176 1316 1235
+1175 1089 1174
+1424 1174 1315
+1316 1175 1174
+791 858 935
+789 752 729
+791 792 733
+936 859 792
+791 790 858
+753 731 790
+857 815 856
+858 790 789
+857 789 815
+790 752 789
+934 857 856
+858 789 857
+1087 934 1086
+1087 935 934
+1313 1087 1086
+1522 1521 1768
+1424 1315 1523
+1088 1087 1314
+1088 1314 1315
+1313 1521 1314
+1641 1522 1769
+1523 1315 1522
+1908 1641 1769
+1642 1523 1641
+1679 1770 1771
+2222 2028 2221
+2030 1909 2029
+1770 1641 1908
+2030 1819 1909
+1910 1772 1819
+1772 1643 1679
+1643 1524 1523
+1524 1424 1523
+1525 1316 1424
+1642 1643 1523
+1680 1644 1524
+1771 1772 1679
+1680 1524 1643
+1680 1772 1820
+1680 1643 1772
+2471 2479 2513
+2511 2469 2559
+2521 2512 2511
+2479 2470 2511
+2561 2560 2579
+2512 2479 2511
+2354 2291 2428
+2030 2131 2070
+2521 2511 2560
+2470 2469 2511
+1770 1908 1909
+1769 2028 1908
+2352 2353 2220
+2291 2292 2222
+2221 2353 2291
+2352 2469 2353
+2558 2510 2557
+2559 2469 2510
+2613 2614 2557
+2578 2559 2558
+2614 2578 2558
+2615 2616 2578
+2614 2648 2615
+2647 2685 2648
+2578 2614 2615
+2646 2684 2685
+2685 2647 2646
+2648 2614 2647
+2614 2646 2647
+2613 2684 2646
+2784 2729 2684
+2729 2730 2685
+2785 2729 2784
+2785 2750 2729
+2751 2731 2730
+2648 2616 2615
+2617 2579 2560
+2698 2686 2730
+2698 2687 2686
+2686 2687 2616
+2698 2731 2687
+2730 2731 2698
+2561 2521 2560
+2522 2512 2521
+2522 2561 2579
+2522 2521 2561
+2513 2512 2522
+2292 2291 2354
+2471 2429 2428
+2311 2293 2292
+2392 2354 2429
+2311 2292 2354
+2253 2223 2222
+1908 2029 1909
+2222 2223 2131
+2028 2222 2029
+2292 2293 2253
+2292 2253 2222
+2293 2254 2253
+2355 2311 2354
+2392 2355 2354
+1819 2030 1910
+2029 2131 2030
+2070 2032 2031
+2132 2071 2032
+2032 2033 1961
+2132 2175 2133
+2070 2174 2132
+2431 2393 2438
+2032 2071 2033
+2295 2312 2313
+2174 2254 2294
+2294 2293 2311
+2223 2253 2254
+2254 2174 2223
+2175 2132 2174
+2472 2480 2481
+2293 2294 2254
+2438 2430 2472
+2393 2312 2430
+4487 4437 4486
+4485 4565 4566
+4485 4437 4436
+3972 3909 3869
+3973 3974 3909
+4018 4092 4019
+3972 4020 3973
+4092 4023 4022
+3253 3254 3197
+3332 3333 3254
+3254 3198 3197
+3254 3199 3198
+2357 2356 2393
+2312 2393 2356
+2482 2473 2472
+2474 2431 2438
+2472 2473 2438
+2482 2475 2474
+3410 3333 3332
+3410 3600 3411
+2473 2474 2438
+2473 2482 2474
+2314 2313 2357
+2439 2431 2474
+2357 2393 2431
+2358 2314 2357
+2314 2296 2255
+3254 3255 3199
+3333 3334 3255
+3257 3258 3202
+3794 3795 3599
+3601 3412 3411
+4020 4021 3973
+4022 3975 3974
+3599 3795 3600
+3794 3869 3795
+3973 4021 3974
+4020 4092 4021
+4485 4486 4437
+4488 4568 4489
+4021 4022 3974
+4021 4092 4022
+4566 4567 4486
+4566 4690 4567
+4567 4487 4486
+4488 4437 4487
+3870 3975 3871
+4023 4024 3975
+4567 4488 4487
+4689 4957 4690
+4960 5247 4961
+4690 4958 4691
+5246 5509 5247
+4691 4692 4568
+4693 4822 4694
+4568 4569 4490
+4611 4612 4569
+3977 4026 4027
+3976 4024 4025
+4026 3976 4025
+4568 4490 4489
+4569 4570 4490
+3411 3335 3334
+3412 3336 3335
+3601 3796 3797
+3601 3600 3796
+3502 3412 3601
+3415 3356 3414
+3256 3257 3202
+3286 3336 3287
+3258 3259 3202
+3285 3257 3256
+3285 3286 3257
+2358 2394 2359
+2394 2432 2475
+2394 2358 2432
+3285 3334 3335
+3411 3600 3601
+3333 3411 3334
+3333 3410 3411
+2432 2439 2475
+2432 2431 2439
+3255 3201 3200
+3256 3202 3201
+2358 2315 2296
+2359 2316 2315
+2224 2256 2257
+2224 2255 2256
+2176 2134 2224
+1527 1528 1427
+2224 2257 2225
+2256 2296 2257
+2258 2226 2225
+2177 2135 2176
+2227 2316 2178
+2227 2297 2316
+2258 2257 2297
+2225 2226 2176
+2227 2178 2177
+2226 2177 2176
+2177 2136 2135
+2134 2176 2135
+2258 2227 2226
+2258 2297 2227
+1358 1428 1429
+1427 1528 1445
+1529 1445 1528
+1529 1429 1445
+1445 1429 1428
+1322 1237 1321
+1650 1569 1530
+1322 1321 1358
+1180 1131 1179
+1322 1358 1429
+1321 1357 1358
+1095 1131 1180
+1092 1042 1091
+1428 1357 1427
+1428 1358 1357
+1567 1568 1528
+1649 1529 1568
+1321 1180 1320
+1131 1094 1179
+1426 1320 1319
+1427 1357 1320
+1094 1130 1179
+1023 1024 975
+1236 1319 1178
+1319 1179 1178
+1356 1426 1319
+1320 1179 1319
+1320 1426 1427
+1356 1317 1425
+1646 1682 1647
+1567 1528 1527
+1566 1646 1647
+1648 1649 1568
+1527 1647 1567
+2296 2314 2358
+2296 2256 2255
+1647 1684 1648
+2295 2314 2255
+1566 1647 1527
+1683 1684 1647
+1682 1683 1647
+1775 1684 1683
+1681 1774 1646
+1775 1683 1682
+1821 1774 1681
+1821 1822 1774
+2313 2314 2295
+2132 2133 2071
+1913 1822 1821
+1775 1774 1822
+2033 1913 1961
+1526 1426 1425
+1565 1646 1526
+1645 1681 1646
+1526 1566 1527
+1526 1646 1566
+1426 1356 1425
+1318 1236 1317
+1317 1236 1129
+1317 1356 1318
+1319 1318 1356
+1319 1236 1318
+892 860 939
+891 938 939
+939 860 891
+939 974 940
+940 892 939
+816 860 892
+1092 1043 1042
+1022 939 1021
+1236 1092 1129
+1178 1130 1092
+939 1022 974
+1021 1042 1043
+1021 1043 1022
+1092 1130 1093
+1043 1093 1094
+1043 1092 1093
+975 941 1023
+861 816 892
+941 940 974
+941 892 940
+975 893 941
+817 796 861
+798 740 739
+658 635 634
+756 796 817
+755 737 795
+644 658 659
+862 817 893
+644 636 635
+586 546 557
+637 605 636
+588 606 589
+645 662 668
+660 644 659
+738 700 699
+666 659 658
+796 795 816
+796 738 755
+699 700 658
+738 739 700
+793 794 754
+860 816 794
+635 604 634
+635 605 586
+796 755 795
+738 699 755
+635 586 604
+557 584 585
+604 586 585
+605 558 586
+557 546 514
+504 515 547
+466 479 503
+424 400 465
+466 465 479
+399 464 465
+546 503 514
+479 501 502
+424 401 400
+343 304 303
+191 208 216
+191 190 208
+190 191 184
+216 241 191
+216 240 241
+342 303 302
+287 282 281
+253 281 254
+253 302 281
+288 287 304
+281 303 287
+288 282 287
+257 281 282
+254 281 257
+313 288 304
+351 343 364
+342 400 364
+364 343 342
+364 372 365
+502 503 479
+503 546 515
+467 466 480
+424 465 466
+372 364 401
+364 400 401
+466 503 480
+502 514 503
+586 558 546
+605 637 587
+503 515 480
+640 589 606
+558 547 515
+638 637 661
+558 587 547
+558 605 587
+481 505 506
+547 588 548
+480 504 467
+480 515 504
+403 373 366
+401 424 425
+402 372 401
+365 351 364
+402 366 372
+344 313 343
+366 351 365
+344 343 351
+366 344 351
+434 426 425
+403 410 373
+372 366 365
+367 353 352
+427 426 469
+425 467 434
+366 352 344
+366 373 352
+469 426 434
+409 402 426
+373 367 352
+373 410 404
+427 409 426
+427 410 403
+409 403 402
+409 427 403
+468 481 506
+548 589 559
+505 481 504
+506 469 468
+434 468 469
+434 467 468
+516 505 504
+516 548 505
+548 588 589
+587 637 638
+505 548 506
+516 547 548
+663 645 668
+660 659 666
+740 757 741
+703 668 667
+741 757 758
+667 661 702
+738 756 739
+798 757 740
+666 701 660
+667 662 661
+741 702 740
+661 660 702
+662 645 661
+588 587 638
+637 660 661
+637 644 660
+702 701 740
+702 660 701
+739 756 797
+738 796 756
+701 739 740
+701 700 739
+739 797 798
+756 817 797
+1025 942 1024
+863 798 862
+861 893 817
+861 941 893
+817 862 797
+893 942 862
+1043 1023 1022
+1043 1094 1023
+942 975 1024
+942 893 975
+1131 1044 1094
+1095 1046 1045
+976 1025 1045
+1025 1044 1045
+1044 1025 1024
+1045 1046 976
+977 976 1046
+943 942 976
+942 863 862
+943 864 863
+979 944 1027
+943 976 977
+978 1026 1047
+977 1046 1026
+3413 3336 3412
+3286 3335 3336
+2072 2136 2178
+2072 2034 2136
+2035 1963 2034
+3288 3259 3287
+2035 2072 1964
+3288 3287 3337
+3259 3286 3287
+3336 3413 3337
+3502 3503 3414
+3336 3337 3287
+3415 3503 3442
+3338 3339 3288
+1963 1962 2034
+2034 2072 2035
+1914 1963 1915
+1686 1685 1777
+1569 1650 1686
+1685 1650 1776
+1570 1530 1569
+1650 1685 1686
+1570 1531 1530
+1047 1028 1027
+943 978 944
+1027 1028 979
+1823 1777 1776
+1914 1915 1823
+1915 1963 1964
+1914 1962 1963
+1095 1096 1046
+1181 1028 1047
+977 978 943
+977 1026 978
+1096 1047 1026
+1096 1181 1047
+799 800 758
+818 799 864
+818 800 799
+943 944 864
+978 1027 944
+517 559 590
+506 548 559
+606 639 663
+638 661 645
+645 639 638
+645 663 639
+373 404 367
+410 427 435
+354 368 369
+353 367 368
+506 517 507
+549 560 508
+469 506 507
+506 559 517
+469 507 482
+517 549 507
+410 435 404
+345 346 314
+315 346 347
+367 374 368
+404 435 374
+305 314 315
+346 315 314
+305 315 306
+346 354 347
+470 508 471
+482 507 508
+427 470 435
+482 508 470
+591 590 607
+549 517 590
+865 819 818
+646 640 664
+590 559 640
+894 865 945
+944 979 945
+1687 1686 1778
+1777 1915 1824
+1824 1778 1777
+1686 1777 1778
+1431 1430 1446
+864 865 818
+945 946 894
+1447 1431 1446
+818 819 800
+348 347 369
+316 315 347
+374 471 369
+508 560 471
+315 316 306
+664 663 669
+641 640 646
+895 894 946
+866 865 894
+664 591 646
+607 590 641
+316 317 306
+347 348 317
+549 591 560
+607 641 591
+1686 1687 1651
+1447 1531 1532
+1446 1530 1531
+1430 1431 1359
+1531 1570 1532
+1569 1686 1651
+1570 1651 1532
+1570 1569 1651
+1532 1651 1687
+3504 3416 3442
+3698 3603 3697
+3604 3504 3603
+3602 3503 3502
+3603 3504 3503
+3339 3356 3357
+3414 3413 3502
+3357 3415 3416
+3356 3355 3414
+3288 3337 3338
+1687 1778 1824
+3413 3355 3337
+3355 3339 3338
+3339 3355 3356
+3338 3337 3355
+3601 3602 3502
+3797 3697 3602
+3415 3414 3503
+3355 3413 3414
+3800 3801 3738
+3798 3799 3697
+3799 3800 3698
+3698 3635 3603
+3698 3699 3635
+3797 3798 3697
+4093 4028 4027
+3697 3799 3698
+3798 3874 3799
+3981 3982 3910
+3875 3911 3817
+3700 3699 3738
+4229 4228 4308
+3636 3699 3700
+3801 3817 3818
+3636 3700 3604
+3738 3801 3818
+3817 3876 3818
+3817 3800 3875
+3738 3818 3700
+4315 4362 4316
+4314 4241 4240
+4315 4242 4241
+4311 4312 4235
+4235 4312 4236
+4239 4313 4314
+4315 4316 4242
+4363 4451 4242
+4238 4237 4313
+4450 4363 4362
+4362 4363 4316
+4450 4451 4363
+4236 4312 4237
+4311 4446 4447
+4238 4313 4239
+4447 4446 4701
+4241 4314 4315
+4823 4968 4969
+4311 4235 4234
+4231 4310 4232
+4446 4311 4310
+4310 4233 4232
+4311 4234 4233
+4445 4309 4308
+4446 4310 4309
+4308 4307 4445
+4306 4223 4305
+4308 4309 4229
+4230 4309 4231
+4225 4224 4306
+4308 4227 4307
+4229 4309 4230
+4226 4225 4307
+4227 4226 4307
+3911 3912 3876
+4304 4358 4359
+4304 4305 4223
+3982 3911 3875
+3983 3912 3911
+3874 3980 3910
+3982 3983 3911
+4032 3982 3981
+4095 3983 3982
+3799 3875 3800
+3910 3982 3875
+3875 3874 3910
+3798 3797 3873
+3796 3872 3797
+3796 3976 3872
+3798 3873 3874
+3797 3872 3978
+4094 3979 4030
+3873 3797 3978
+4032 3980 4031
+3873 3978 3979
+4031 3980 3979
+3981 3910 3980
+3978 4030 3979
+4095 4032 4031
+3978 3977 4028
+3872 3976 3977
+4031 3979 4094
+3978 4028 4029
+4093 4029 4028
+4030 3978 4029
+4094 4030 4093
+4095 4031 4094
+4357 4441 4358
+3982 4032 4095
+3981 3980 4032
+4438 4439 4357
+4441 4495 4496
+4359 4360 4305
+4359 4442 4443
+4361 4306 4305
+4307 4225 4306
+4440 4495 4441
+4495 4576 4496
+4441 4442 4358
+4496 4577 4442
+4357 4439 4440
+4575 4697 4576
+4438 4494 4439
+4357 4440 4441
+4439 4495 4440
+4493 4574 4494
+4570 4614 4571
+4492 4493 4438
+4492 4573 4493
+4571 4572 4491
+4571 4695 4572
+4491 4573 4492
+4491 4572 4573
+4494 4575 4495
+4494 4574 4575
+4613 4612 4694
+4570 4569 4612
+4692 4610 4569
+4692 4821 4693
+4610 4611 4569
+4610 4692 4693
+4959 4960 4822
+4612 4611 4693
+4694 4822 4695
+4693 4821 4822
+4614 4613 4694
+4612 4693 4694
+4695 4960 4961
+4822 4821 4959
+4695 4614 4694
+4570 4612 4613
+4571 4614 4695
+4570 4613 4614
+4576 4577 4496
+4576 4697 4698
+4698 4697 4963
+4697 4696 4962
+4578 4698 4699
+4577 4576 4698
+5614 5515 5514
+4699 4698 4964
+5102 5256 5103
+4700 4964 4965
+5253 5516 5373
+4967 4703 4702
+4448 4447 4703
+4313 4312 4447
+4702 4701 4967
+4446 4445 4701
+5254 4967 4966
+4968 4703 4967
+4444 4578 4699
+4577 4698 4578
+4359 4443 4360
+4442 4578 4443
+4443 4361 4360
+4443 4578 4444
+4579 4448 4703
+4312 4311 4447
+4307 4444 4445
+4361 4443 4444
+4447 4702 4703
+4447 4701 4702
+4362 4449 4450
+4449 4315 4314
+4449 4448 4579
+4313 4447 4448
+4580 4449 4579
+4362 4315 4449
+4497 4450 4580
+4498 4497 4581
+4579 4704 4580
+4581 4497 4580
+4498 4451 4497
+4825 4743 4742
+4742 4705 4704
+10461 10434 10523
+4970 4824 4823
+4704 4703 4823
+4823 4824 4704
+4823 4969 4970
+4825 4742 4824
+4743 4705 4742
+4824 4970 4875
+5104 5103 5150
+4825 4875 4971
+5021 5020 5105
+5020 5104 5105
+5020 4969 5104
+4971 4970 5021
+5256 5150 5103
+5151 5104 5150
+5421 5518 5422
+5254 5375 5255
+4968 5102 5103
+4967 5254 5102
+5256 5255 5291
+5102 5254 5255
+5292 5256 5291
+5257 5150 5256
+5151 5150 5257
+5617 5618 5549
+5774 5773 5842
+5253 5252 5516
+5616 5737 5617
+5518 5420 5517
+5254 4966 5253
+5549 5618 5422
+5738 5773 5653
+5517 5549 5518
+5517 5617 5549
+5739 5653 5773
+5618 5617 5653
+5878 5972 5843
+5422 5618 5739
+5421 5420 5518
+5373 5517 5420
+5374 5421 5422
+5374 5373 5420
+5843 5292 5375
+5257 5256 5292
+5375 5374 5422
+5254 5373 5374
+5739 5843 5422
+5291 5255 5375
+5843 5972 6010
+5774 5843 5739
+5842 5971 5878
+5842 5878 5843
+5971 5972 5878
+6088 6089 5972
+6088 6240 6241
+6089 6090 6010
+6090 6140 6010
+6242 6296 6390
+6241 6089 6088
+6242 6241 6296
+6242 6140 6241
+6295 6438 6390
+6438 6537 6538
+6536 6596 6537
+6390 6438 6538
+6295 6389 6438
+6537 6389 6437
+6139 6088 6087
+6536 6437 6535
+6537 6437 6536
+6294 6389 6240
+6388 6387 6534
+6389 6294 6437
+6238 6087 6237
+6388 6535 6437
+6595 6596 6535
+6294 6239 6238
+6237 5970 6236
+6388 6294 6238
+6240 6088 6139
+6437 6294 6388
+6389 6295 6240
+6294 6240 6239
+6295 6241 6240
+6238 6139 6087
+6239 6240 6139
+5843 5774 5842
+5739 5773 5774
+6237 6387 6238
+6386 6533 6387
+6385 6386 6236
+6534 6665 6666
+6531 6385 6384
+6532 6386 6385
+6532 6533 6386
+6532 6664 6533
+6535 6534 6595
+6387 6533 6534
+6534 6666 6595
+6665 6710 6711
+6665 6664 6709
+6665 6711 6666
+6710 6782 6711
+6816 6817 6780
+6817 6818 6781
+6781 6709 6708
+6665 6533 6664
+6665 6709 6710
+6664 6708 6709
+6532 6594 6664
+6593 6706 6663
+6778 6662 6661
+6593 6531 6530
+6662 6779 6706
+7062 7021 7020
+6528 6529 6382
+6778 6661 6777
+6662 6593 6530
+6811 6812 6777
+6813 6814 6778
+6661 6662 6530
+6663 6594 6593
+6532 6385 6531
+6593 6594 6531
+6663 6664 6594
+6661 6530 6529
+6531 6384 6530
+5967 5839 5732
+6235 6086 6234
+6529 6383 6382
+6530 6384 6383
+6384 6235 6383
+5840 5735 5734
+6233 6086 5967
+5839 5840 5734
+6382 6234 6233
+6382 6235 6234
+5736 5615 5614
+5515 5251 5514
+6235 5968 6086
+6235 6236 5969
+6235 5969 5968
+5841 6087 5971
+5968 5969 5840
+6236 6386 6237
+5737 5970 5841
+5969 6236 5970
+5970 6237 6087
+6386 6387 6237
+5773 5841 5842
+5773 5738 5841
+5615 5736 5616
+5735 5840 5736
+5653 5617 5738
+5616 5736 5737
+5614 5615 5515
+5516 5517 5373
+5616 5515 5615
+5252 4964 5251
+5516 5617 5517
+5737 5738 5617
+5254 5253 5373
+4965 5252 5253
+5516 5252 5515
+4965 4964 5252
+5616 5516 5515
+5616 5617 5516
+5250 5251 4963
+5515 5252 5251
+5610 5512 5731
+5734 5735 5614
+5612 5613 5514
+5735 5736 5614
+5839 5733 5732
+5613 5614 5514
+5733 5612 5611
+5733 5734 5613
+5733 5613 5612
+5734 5614 5613
+5249 4963 4962
+5251 4964 4963
+5511 5249 5248
+5250 5513 5251
+5248 5510 5511
+5611 5612 5513
+5249 5250 4963
+5249 5512 5250
+5514 5513 5612
+5250 5512 5513
+5512 5610 5513
+5732 5733 5611
+5611 5610 5732
+6232 6381 6233
+6528 6233 6381
+6234 6086 6233
+6231 6379 6232
+5967 5732 5966
+5511 5731 5512
+5966 5732 5731
+5732 5610 5731
+5611 5513 5610
+6435 6379 6434
+6232 5966 6231
+6524 6588 6525
+6436 6380 6379
+6524 6436 6435
+6525 6526 6436
+6587 6524 6523
+6379 6378 6434
+6230 6376 6377
+6231 6378 6379
+6377 6523 6378
+5511 5729 5730
+6230 6377 6231
+5965 6231 5966
+5965 6230 6231
+6380 6232 6379
+6380 6381 6232
+6230 5965 5964
+5966 5731 5965
+5247 5510 5248
+5730 5965 5731
+5510 5729 5511
+5964 5965 5730
+4960 5246 5247
+5729 5964 5730
+5509 5728 5510
+5728 5962 5963
+5728 5729 5510
+5728 5963 5729
+5247 5509 5510
+5508 5727 5509
+4960 4959 5246
+4959 4958 5245
+4821 4958 4959
+5508 5509 5246
+5245 4958 4957
+5245 5246 4959
+5243 5244 4956
+5507 5506 5725
+5244 5245 4957
+5508 5246 5245
+4956 5244 4957
+5243 5506 5507
+5245 5507 5508
+5244 5243 5507
+5508 5726 5727
+5507 5725 5726
+6230 5963 6229
+5964 5729 5963
+5960 5961 5726
+5960 6226 5961
+5961 5962 5727
+5961 6227 5962
+6226 6227 5961
+6226 6514 6227
+6227 6372 6228
+6227 6515 6372
+6373 6374 6229
+6521 6520 6586
+6373 6518 6374
+6873 6928 6929
+6585 6586 6519
+6230 6375 6376
+6374 6519 6432
+6229 6375 6230
+6229 6374 6375
+6433 6521 6522
+6375 6432 6521
+6376 6433 6522
+6376 6375 6433
+6524 6587 6588
+6588 6589 6525
+6519 6586 6520
+6654 6587 6523
+6654 6588 6587
+6436 6524 6525
+6435 6434 6524
+6583 6518 6517
+6585 6519 6518
+6652 6653 6515
+6517 6372 6516
+6584 6518 6583
+6582 6517 6581
+6653 6582 6581
+6583 6517 6582
+6925 7011 6926
+6585 6518 6584
+7014 6874 6930
+6516 6653 6581
+6874 6873 6930
+7015 6875 6874
+6803 6877 6878
+7015 6931 6875
+7015 7058 7016
+6876 6877 6802
+6802 6877 6803
+6655 6700 6701
+7017 6932 6878
+6700 6773 6701
+6775 6807 6808
+6528 6592 6660
+6526 6590 6591
+6589 6526 6525
+6589 6655 6590
+6589 6590 6526
+6655 6656 6590
+6526 6527 6381
+6591 6656 6657
+6526 6591 6527
+6590 6656 6591
+6658 6657 6703
+6658 6591 6657
+6529 6528 6660
+6592 6591 6658
+6591 6592 6527
+6658 6703 6659
+6233 6528 6382
+6381 6527 6528
+6660 6659 6705
+6592 6658 6659
+6661 6660 6777
+6661 6529 6660
+6660 6705 6777
+6659 6703 6704
+6705 6659 6704
+7018 6934 6933
+6776 6705 6704
+7018 6933 6932
+6880 6879 6933
+7061 7143 7018
+6933 6879 6932
+7202 7203 7144
+6935 6882 6881
+6881 6934 6935
+6880 6933 6934
+6882 6935 6936
+6934 7018 7019
+7143 7200 7201
+7199 7287 7288
+7289 7201 7288
+7200 7199 7288
+7143 7201 7202
+7200 7288 7201
+7198 7142 7141
+7199 7200 7142
+7016 7059 7060
+7060 7142 7061
+7060 7061 7017
+7142 7143 7061
+7142 7060 7141
+7017 6877 7016
+7057 7139 7058
+7197 7141 7140
+7197 7198 7141
+7197 7287 7198
+7139 7196 7286
+7401 7449 7450
+7057 7138 7139
+7056 7014 7137
+7058 7139 7140
+7138 7196 7139
+6874 7014 7015
+7014 6930 7055
+7015 7057 7058
+7015 7056 7057
+7141 7059 7140
+7060 7017 7016
+6876 6931 6877
+7058 7059 7016
+7015 7014 7056
+6929 6928 7012
+6875 6931 6876
+7015 7016 6931
+6930 6873 7013
+7013 6873 6929
+6927 7012 6928
+7011 7133 7134
+6930 7013 7055
+7012 7134 7135
+7010 7052 7133
+7011 6927 6926
+7011 7012 6927
+7010 6925 6924
+7132 7007 7131
+7010 6924 6923
+7008 7007 7132
+6920 7007 6921
+6921 7008 6922
+7395 7280 7394
+6922 7008 7009
+7395 7394 7538
+6919 7007 6920
+6919 7006 7007
+7009 7008 7052
+6921 7007 7008
+7008 7132 7052
+7131 7130 7279
+7010 7133 7011
+7052 7132 7133
+7282 7135 7281
+7012 7011 7134
+7284 7196 7137
+7053 7012 7135
+7134 7281 7135
+7013 6929 7053
+7136 7054 7053
+7055 7013 7054
+7138 7056 7137
+7137 7014 7055
+7282 7283 7136
+7055 7054 7136
+7138 7137 7196
+7055 7136 7137
+7136 7283 7137
+7330 7402 7451
+7540 7541 7398
+7400 7284 7399
+7282 7328 7398
+7280 7133 7132
+7399 7283 7398
+7136 7135 7282
+7398 7283 7282
+7399 7284 7283
+7282 7281 7328
+7134 7133 7281
+7393 7394 7279
+7394 7280 7132
+7539 7396 7395
+7281 7133 7280
+7397 7327 7396
+7281 7280 7326
+7396 7327 7326
+7328 7281 7327
+7328 7397 7398
+7328 7327 7397
+7395 7396 7326
+7448 7397 7396
+7325 7393 7279
+7537 7538 7394
+7539 7395 7538
+7326 7280 7395
+7655 7536 7535
+7656 7809 7725
+7392 7393 7325
+7536 7537 7393
+7658 7539 7538
+7659 7726 7727
+7540 7587 7660
+7877 7959 7960
+7588 7540 7660
+7539 7658 7587
+7448 7540 7398
+7448 7587 7540
+7661 7662 7588
+7589 7542 7541
+7815 7729 7662
+7589 7588 7662
+7543 7542 7664
+7541 7588 7589
+7541 7542 7400
+7589 7663 7542
+7542 7663 7664
+7589 7662 7729
+7666 7590 7665
+7544 7451 7450
+7591 7544 7590
+7591 7545 7544
+7542 7449 7400
+7286 7402 7330
+7543 7450 7449
+7543 7544 7450
+7400 7401 7329
+7400 7449 7401
+7285 7329 7286
+7284 7400 7329
+7284 7285 7196
+7284 7329 7285
+7139 7286 7197
+7402 7450 7451
+7329 7402 7286
+7329 7401 7402
+7403 7330 7451
+7287 7197 7330
+7404 7452 7453
+7545 7591 7592
+7545 7403 7451
+7452 7404 7403
+7289 7404 7405
+7288 7403 7404
+7406 7332 7331
+7202 7201 7289
+7404 7453 7405
+7452 7592 7546
+7453 7454 7405
+7453 7546 7454
+7454 7546 7547
+7403 7545 7452
+7451 7544 7545
+7547 7546 7593
+7453 7452 7546
+7591 7590 7666
+7592 7591 7667
+7594 7668 7669
+7593 7592 7668
+7595 7670 7733
+7669 7732 7670
+7547 7594 7548
+7548 7670 7549
+7457 7550 7458
+7549 7670 7595
+7671 7595 7733
+7550 7549 7595
+7597 7596 7671
+7552 7461 7460
+7597 7671 7672
+7596 7595 7671
+7409 7461 7462
+7408 7409 7292
+7407 7457 7458
+7551 7459 7458
+7408 7292 7407
+7463 7409 7462
+7334 7293 7292
+7407 7292 7291
+7408 7461 7409
+7406 7407 7333
+7459 7460 7408
+7459 7408 7407
+7460 7461 7408
+7204 7290 7291
+7290 7289 7331
+7290 7331 7332
+7331 7405 7406
+7406 7456 7457
+7406 7405 7455
+7406 7455 7456
+7291 7290 7332
+7289 7405 7331
+7204 7203 7290
+7203 7289 7290
+7145 7144 7204
+7202 7289 7203
+7145 7204 7291
+7146 7063 7062
+7020 6938 7019
+7020 7019 7145
+7019 7018 7144
+6934 7019 6935
+7144 7145 7019
+7019 6936 6935
+7019 6937 6936
+6934 6881 6880
+6810 6811 6777
+7019 6938 6937
+7062 7020 7145
+6778 6812 6813
+6778 6777 6812
+6778 6814 6779
+6706 6815 6780
+6815 6886 6816
+6780 6815 6816
+6779 6886 6815
+7147 7064 7146
+7146 7062 7145
+7063 7021 7062
+7291 7146 7145
+7292 7146 7291
+7292 7205 7147
+7206 7147 7205
+7292 7293 7205
+7207 7208 7065
+7335 7293 7334
+7294 7207 7293
+7337 7295 7336
+7294 7293 7335
+7209 7295 7296
+7294 7336 7295
+7293 7207 7206
+7294 7295 7208
+7209 7208 7295
+7148 7065 7208
+7148 7149 7065
+6780 6817 6781
+6781 6818 6782
+7149 7150 7065
+7210 7211 7151
+7297 7149 7296
+7148 7208 7209
+7209 7149 7148
+7209 7296 7149
+7339 7298 7297
+7212 7152 7066
+7210 7151 7150
+7211 7212 7151
+7298 7212 7211
+7152 7067 7022
+7068 7154 7024
+7299 7213 7212
+7212 7213 7152
+7153 7214 7068
+10151 10273 10333
+7213 7214 7153
+7300 7301 7214
+7297 7210 7150
+7297 7298 7210
+7067 7213 7153
+7340 7415 7416
+7471 7414 7413
+7299 7212 7298
+7299 7300 7213
+7340 7416 7341
+7154 7214 7301
+7299 7340 7300
+7299 7414 7340
+7341 7300 7340
+7301 7341 7416
+7301 7300 7341
+7298 7413 7299
+7471 7472 7414
+7338 7339 7297
+7413 7414 7299
+7412 7413 7339
+7470 7471 7413
+7338 7337 7411
+7338 7296 7337
+7410 7335 7334
+7336 7294 7335
+7336 7410 7411
+7336 7335 7410
+7410 7463 7464
+7411 7465 7466
+7411 7410 7465
+7468 7412 7467
+7339 7338 7412
+7468 7467 7554
+7412 7411 7467
+7465 7464 7553
+7881 7736 7821
+7674 7735 7736
+7823 7739 7738
+7675 7740 7741
+7675 7739 7740
+7555 7469 7468
+7469 7413 7412
+7554 7555 7468
+7470 7413 7469
+7884 7824 7883
+7740 7739 7824
+7883 7823 7882
+7824 7739 7823
+7968 7883 7967
+7824 7823 7883
+7968 7884 7883
+7741 7824 7884
+7741 7884 7968
+8569 8570 8525
+8460 8525 8526
+8459 8569 8525
+8459 8524 8569
+8567 8646 8568
+8005 7967 7966
+8005 7968 7967
+8568 8524 8567
+8459 8458 8523
+8521 8563 8564
+8566 8567 8523
+9261 9262 9226
+8646 8566 8565
+8646 8567 8566
+8565 8564 8646
+8565 8522 8564
+8522 8521 8564
+8520 8562 8563
+8523 8458 8522
+8520 8563 8521
+8522 8458 8521
+7967 7882 7966
+8524 8523 8567
+8524 8459 8523
+7738 7822 7823
+7737 7736 7822
+7819 7880 7820
+7881 7882 7822
+7880 7881 7821
+7966 7882 7881
+7735 7734 7820
+8457 8456 8520
+8457 8458 8351
+8521 8457 8520
+8454 8455 8436
+8519 8456 8455
+7671 7734 7672
+7820 7880 7821
+7671 7819 7734
+7734 7819 7820
+8175 8109 8200
+8299 8300 8276
+8351 8436 8456
+8350 8351 8301
+8350 8349 8368
+8436 8368 8435
+8351 8350 8368
+8454 8436 8453
+8455 8456 8436
+8518 8454 8453
+8518 8519 8454
+8675 8643 8642
+8560 8520 8519
+8558 8518 8517
+8559 8519 8518
+8673 8674 8642
+8674 8675 8642
+9220 9447 9221
+8830 8733 8758
+8558 8641 8673
+8733 8830 8675
+8733 8675 8674
+8644 8645 8561
+8642 8643 8559
+8675 8676 8643
+8560 8519 8559
+8520 8456 8519
+8643 8560 8559
+8561 8562 8520
+8643 8644 8560
+8643 8676 8644
+8644 8561 8560
+8645 8562 8561
+9225 9324 9259
+9259 9260 9226
+9324 9449 9325
+9225 9224 9324
+9324 9325 9259
+9226 9225 9259
+9155 9154 9223
+9155 9225 9226
+9155 9224 9225
+9153 9223 9154
+9151 9152 9111
+9222 9223 9153
+9152 9153 9111
+9152 9222 9153
+9109 9150 9220
+9777 9702 9776
+9221 9151 9111
+9222 9152 9151
+9221 9322 9222
+9323 9224 9223
+9449 9448 9579
+9223 9222 9322
+9576 9577 9447
+9322 9221 9447
+9448 9322 9447
+9448 9323 9322
+9447 9577 9448
+9447 9575 9576
+9705 9581 9704
+9448 9577 9578
+9703 9579 9578
+9448 9578 9579
+9582 9450 9581
+9449 9323 9448
+9224 9323 9324
+9223 9322 9323
+9581 9449 9580
+9324 9323 9449
+9450 9325 9581
+9260 9259 9325
+9704 9581 9580
+9632 9583 9582
+9705 9582 9581
+9451 9367 9328
+9705 9632 9582
+9633 9634 9583
+9705 9780 9706
+9705 9876 9780
+9451 9584 9452
+9707 9781 9585
+9452 9585 9453
+9584 9707 9585
+9583 9450 9582
+9326 9262 9261
+9583 9451 9450
+9583 9584 9451
+9262 9326 9327
+9450 9451 9366
+9260 9261 9226
+9260 9325 9261
+9327 9326 9366
+9261 9325 9326
+9328 9367 9368
+9451 9452 9367
+9584 9585 9452
+9369 9368 9452
+9369 9328 9368
+9499 9454 9498
+9453 9585 9498
+9586 9587 9499
+9369 9452 9453
+9369 9453 9454
+9586 9499 9498
+9588 9454 9499
+9710 9637 9636
+9635 9709 9588
+9587 9588 9499
+9636 9637 9588
+9585 9586 9498
+9708 9635 9586
+9587 9635 9588
+9710 9732 9711
+9636 9588 9709
+9587 9586 9635
+9636 9709 9731
+9635 9708 9729
+9731 9710 9636
+9731 9784 9710
+9815 9814 9881
+9784 9731 9783
+9882 9815 9881
+9881 9880 9982
+9731 9730 9783
+9784 9785 9732
+9880 9814 9785
+9732 9733 9711
+9785 9786 9733
+9783 9730 9729
+9731 9709 9730
+9783 9729 9782
+9730 9709 9729
+9878 9783 9782
+9879 9784 9783
+10080 9878 9980
+9784 9880 9785
+10080 10081 9878
+9981 9982 9880
+9880 9784 9879
+9732 9710 9784
+9878 10081 9879
+10081 10082 9981
+9877 9980 9781
+9878 9781 9980
+10243 10244 10148
+10081 9981 9879
+10271 10244 10243
+10080 9980 10148
+10244 10081 10080
+10245 10082 10081
+10430 10431 10246
+10083 9983 9982
+10149 10247 10150
+9983 9912 9982
+9913 9882 9912
+10015 9983 10083
+10015 9984 9983
+9984 9913 9983
+10084 10015 10083
+10084 9984 10015
+10178 10177 10248
+10083 10082 10149
+10246 10247 10149
+10331 10248 10247
+10151 10150 10177
+10084 10083 10150
+10433 10332 10331
+10249 10151 10178
+10332 10273 10272
+10272 10273 10249
+10151 10249 10273
+10273 10332 10333
+10566 10567 10524
+10333 10365 10434
+10434 10461 10333
+10333 10332 10365
+10331 10432 10433
+10522 10647 10431
+10648 10433 10432
+10331 10332 10272
+10433 10365 10332
+10522 10430 10521
+10245 10330 10430
+10430 10460 10521
+10430 10429 10460
+10522 10431 10430
+10432 10247 10431
+10520 10459 10519
+10429 10428 10459
+10364 10427 10458
+10328 10363 10427
+10563 10709 10643
+10518 10459 10428
+10245 10244 10330
+10243 10328 10271
+10330 10329 10428
+10271 10328 10364
+10428 10329 10364
+10330 10244 10329
+10245 10246 10082
+10246 10431 10247
+10329 10244 10271
+10245 10081 10244
+10082 10246 10149
+10245 10430 10246
+10147 10079 10100
+10148 9980 10079
+10146 10100 10145
+10014 9978 10078
+10099 10145 10078
+10100 10079 10014
+10176 10146 10145
+10147 10148 10079
+10145 10100 10078
+10146 10147 10100
+10176 10147 10146
+10176 10242 10147
+10270 10242 10327
+10243 10147 10242
+10328 10270 10363
+10328 10243 10270
+10327 10425 10363
+10516 10640 10562
+10326 10241 10240
+10176 10145 10241
+10241 10327 10242
+10241 10326 10327
+10239 10423 10424
+10326 10425 10327
+10424 10515 10326
+10639 10794 10515
+10424 10326 10240
+10515 10425 10326
+10239 10424 10240
+10639 10515 10424
+10237 10422 10238
+10637 10936 10937
+10239 10238 10423
+10422 10637 10638
+10074 10238 10239
+10073 10237 10238
+10144 10143 10240
+10075 9974 10074
+10241 10144 10240
+9911 9875 9874
+10076 10099 10077
+10144 10145 10099
+9977 9976 10076
+10239 10240 10143
+10144 10076 10143
+10077 10013 10076
+9973 10074 9974
+10073 10238 10074
+9909 9873 9973
+9872 9970 9971
+9909 9973 9974
+9972 10074 9973
+9874 9779 9778
+9873 9777 9972
+9909 9974 9910
+10074 10239 10075
+10075 9975 9974
+9974 9975 9911
+10143 10075 10239
+10143 10076 9976
+10100 10014 10078
+10079 9980 9979
+10014 9979 9978
+10014 10079 9979
+9976 9977 9876
+10013 9978 9977
+9911 9975 9875
+10075 10143 9976
+9975 9976 9875
+9975 10075 9976
+9976 9876 9875
+9977 9978 9876
+9632 9705 9706
+9876 9978 9780
+9978 9877 9780
+9979 9980 9877
+9634 9707 9584
+9634 9633 9706
+9876 9704 9875
+9580 9579 9704
+9707 9706 9780
+9707 9634 9706
+9910 9874 9909
+9578 9577 9703
+9911 9874 9910
+9875 9704 9779
+9778 9779 9703
+9874 9875 9779
+9874 9873 9909
+9703 9577 9777
+9972 9777 9872
+9778 9703 9777
+9873 9778 9777
+9873 9874 9778
+8641 8732 8673
+8733 8674 8673
+8731 8732 8640
+8757 8758 8732
+8828 8829 8757
+8729 8756 8672
+8730 8828 8731
+8730 8731 8640
+8730 8827 8828
+8755 8729 8728
+8756 8730 8672
+8727 8754 8728
+8729 8672 8638
+8671 8637 8727
+8754 8755 8728
+8671 8727 8728
+8824 8825 8754
+8868 8755 8825
+8826 8756 8755
+8755 8756 8729
+8827 8730 8756
+8867 8868 8825
+8827 8756 8826
+8824 8867 8825
+9104 9147 9105
+8755 8868 8826
+9106 9105 9148
+9217 9148 9105
+9217 9320 9218
+9108 9107 9149
+9149 9107 9106
+8830 8758 8757
+9149 9150 9108
+9219 9321 9220
+9108 9150 9109
+9110 9220 9221
+9150 9149 9219
+9218 9321 9219
+9320 9319 9444
+9150 9219 9220
+9149 9106 9218
+9445 9572 9573
+9701 9575 9574
+9445 9446 9321
+9574 9575 9446
+9702 9576 9575
+9702 9577 9576
+9775 9776 9702
+9775 9872 9776
+9970 10072 10073
+10421 10422 10237
+9872 9971 9972
+9970 10073 9971
+10236 10421 10237
+10636 10635 10935
+9970 9871 9969
+9700 9571 9699
+10073 10072 10237
+9969 9968 10072
+9701 9700 9871
+10071 10072 9968
+10236 10420 10421
+10793 10634 10792
+10072 10236 10237
+10072 10071 10236
+10070 10235 10071
+10142 10141 10233
+9869 9870 9699
+9967 10070 10071
+9871 9700 9870
+9573 9574 9446
+9701 9573 9700
+9573 9446 9445
+9218 9320 9321
+9320 9444 9445
+9700 9573 9572
+9701 9574 9573
+9149 9218 9219
+9148 9217 9218
+9320 9216 9319
+9147 9104 9146
+9321 9320 9445
+9217 9216 9320
+9317 9318 9214
+9216 9147 9146
+9214 9318 9215
+9317 9365 9443
+10142 9965 10069
+9966 9967 9869
+9317 9443 9318
+9699 9571 9444
+9869 9967 9870
+9869 9965 9966
+10070 9966 9965
+10070 9967 9966
+10070 10234 10235
+10510 10417 10416
+10634 10514 10633
+10419 10234 10418
+10418 10513 10514
+10512 10559 10560
+10070 10142 10234
+10070 9965 10142
+10419 10418 10514
+10234 10142 10233
+9569 9697 9570
+9868 9869 9698
+10234 10233 10418
+10232 10068 10067
+10418 10512 10513
+10418 10233 10417
+10512 10511 10559
+10325 10233 10232
+9443 9570 9698
+9442 9441 9570
+10512 10417 10511
+10512 10418 10417
+9314 9364 9315
+9441 9442 9364
+9258 9316 9317
+9316 9364 9365
+9442 9443 9365
+9698 9699 9443
+9142 9213 9214
+9316 9365 9317
+9257 9316 9258
+9315 9364 9316
+9315 9316 9257
+9021 9052 9022
+9256 9255 9313
+8967 8924 9022
+8723 8668 8722
+8967 9022 9023
+9023 8968 8967
+8669 8635 8634
+9258 9213 9257
+8925 8968 8926
+8925 8967 8968
+9143 9214 9144
+9215 9145 9144
+9146 9104 9145
+9215 9146 9145
+9215 9216 9146
+8968 8927 8926
+8926 8865 8925
+8926 8927 8865
+9142 9214 9143
+8726 8823 8753
+8865 8927 8823
+8670 8753 8727
+8823 8824 8753
+8823 8866 8824
+8927 8867 8866
+8637 8670 8727
+8753 8754 8727
+8636 8670 8553
+8636 8669 8726
+8638 8637 8671
+8553 8670 8637
+8512 8636 8553
+8635 8669 8636
+8725 8669 8634
+8822 8823 8726
+8636 8726 8670
+8669 8725 8726
+8823 8822 8865
+8724 8924 8822
+8552 8634 8635
+8552 8511 8634
+8822 8725 8724
+8822 8726 8725
+8633 8724 8510
+8552 8512 8511
+8428 8512 8451
+8552 8636 8512
+8513 8451 8553
+8428 8427 8512
+8262 8426 8263
+8511 8512 8427
+8429 8428 8451
+8343 8427 8428
+8169 8263 8264
+8167 8262 8263
+7962 8074 8002
+8104 8169 8196
+8292 8265 8264
+8196 8264 8265
+8197 8266 8293
+8196 8265 8266
+8428 8429 8343
+8266 8265 8292
+8345 8294 8293
+8292 8343 8344
+8430 8345 8344
+8198 8269 8199
+8267 8197 8293
+7962 8002 7963
+8294 8267 8293
+8268 8269 8198
+8106 8172 8198
+8267 8294 8268
+8344 8345 8293
+8295 8268 8294
+8267 8268 8198
+8295 8269 8268
+8431 8345 8430
+8295 8294 8345
+8344 8429 8430
+8344 8343 8429
+8430 8514 8515
+8430 8429 8514
+8637 8513 8553
+8514 8429 8513
+8639 8638 8672
+8514 8637 8638
+8638 8639 8515
+8672 8730 8639
+8640 8555 8554
+8640 8732 8641
+8516 8431 8515
+8365 8347 8346
+8432 8365 8431
+8432 8366 8365
+8365 8366 8347
+8432 8433 8367
+8299 8298 8349
+8366 8432 8367
+8640 8556 8555
+8557 8517 8556
+8556 8641 8557
+8556 8640 8641
+8434 8517 8435
+8452 8516 8556
+8641 8558 8557
+8642 8518 8558
+8349 8434 8435
+8349 8348 8434
+8434 8452 8517
+8433 8432 8452
+8296 8348 8272
+8367 8434 8348
+8274 8297 8275
+8348 8349 8297
+8297 8298 8275
+8297 8349 8298
+8349 8300 8299
+8350 8301 8300
+7819 7733 7732
+8297 8273 8272
+8274 8204 8273
+8204 8274 8275
+8273 8297 8274
+8272 8202 8201
+8273 8204 8203
+8271 8296 8272
+8270 8347 8296
+8202 8203 8175
+8202 8272 8203
+8201 8271 8272
+8270 8296 8271
+8200 8199 8270
+8174 8173 8199
+8271 8200 8270
+8109 8174 8200
+8072 8104 8170
+8106 8198 8173
+7961 8072 8001
+8105 8074 8073
+8171 8172 8105
+8106 8002 8074
+8266 8197 8170
+8197 8267 8172
+8105 8172 8074
+8171 8197 8172
+8108 8173 8174
+8108 8107 8173
+8200 8174 8199
+8173 8107 8075
+8204 8175 8203
+7732 7669 7668
+8109 8108 8174
+8107 8077 8075
+8002 8106 8075
+8074 8172 8106
+8109 8107 8108
+8109 8077 8107
+7964 8003 7965
+8002 8075 8003
+7964 7965 7879
+8076 8077 8109
+8004 8076 7965
+8004 8075 8076
+7733 7670 7732
+7965 7818 7879
+7731 7665 7730
+7666 7665 7731
+7818 7878 7879
+7730 7665 7664
+7962 7963 7878
+8002 8003 7964
+7963 7964 7879
+7963 8002 7964
+7818 7817 7878
+8001 8073 8074
+7962 7817 7961
+7962 7878 7817
+7818 7730 7817
+7818 7731 7730
+7729 7816 7663
+7877 7961 7816
+7588 7660 7661
+7813 7875 7876
+7589 7729 7663
+7662 7728 7815
+7814 7815 7728
+7877 7816 7729
+7959 7877 7815
+7960 7961 7877
+7961 8001 7962
+7961 8000 8072
+7960 8000 7961
+7960 7959 8000
+8196 8170 8104
+8196 8266 8170
+8001 8072 8073
+8000 8071 8072
+8196 8169 8264
+8103 8071 8070
+8069 8070 7959
+8103 8104 8071
+8102 8169 8103
+8169 8104 8103
+8263 8168 8167
+8102 8070 8069
+8100 8168 8101
+8263 8169 8168
+8168 8102 8101
+8103 8070 8102
+8168 8100 8167
+7958 7959 7876
+7999 8068 8069
+8067 8167 8068
+8100 8069 8068
+8101 8102 8069
+7874 7958 7875
+8069 7959 7958
+7814 7876 7959
+7875 7958 7876
+7660 7727 7728
+7813 7876 7814
+7661 7660 7728
+7587 7659 7660
+7658 7659 7587
+7658 7726 7659
+7728 7727 7814
+7660 7659 7727
+7813 7874 7875
+7812 7956 7957
+7874 7999 7958
+8067 8068 7999
+7999 7957 7998
+7812 7657 7811
+7725 7811 7657
+7873 7955 7956
+7874 7957 7999
+7874 7812 7957
+7537 7656 7657
+7810 7873 7811
+7655 7724 7656
+7723 7807 7808
+7809 7656 7724
+7725 7657 7656
+7873 7954 7955
+7808 7724 7723
+7725 7810 7811
+7809 7954 7873
+7809 7810 7725
+7809 7873 7810
+8067 8066 8166
+7996 7954 8065
+8163 8164 8063
+7996 7955 7954
+8066 7996 8065
+8066 7956 7996
+8262 8165 8261
+8262 8166 8165
+8633 8632 8668
+8633 8551 8632
+8551 8509 8508
+8166 8066 8165
+8263 8426 8427
+8426 8508 8509
+8167 8166 8262
+8167 8067 8166
+8510 8426 8509
+8262 8425 8426
+7999 7998 8067
+7957 7956 7997
+8067 7997 8066
+7998 7957 7997
+8633 8510 8509
+8511 8427 8510
+8724 8723 8821
+8724 8633 8723
+8632 8631 8668
+8916 8862 8915
+8630 8721 8631
+8819 8721 8720
+8922 8864 8820
+8821 8722 8820
+8923 8821 8864
+8924 8724 8821
+9021 8923 8966
+8924 8821 8923
+8924 9021 9022
+9102 9211 9212
+9257 9213 9314
+9021 9020 9102
+9053 9052 9103
+9053 9022 9052
+9440 9441 9363
+9019 9020 8965
+9103 9102 9212
+9103 9021 9102
+9021 8966 9020
+8923 8864 8966
+9020 8922 8965
+8863 8820 8819
+8920 8965 8921
+9211 9255 9256
+9212 9211 9256
+8920 9019 8965
+9210 9311 9312
+9100 9209 9101
+8820 8864 8821
+9018 9019 8964
+9211 9102 9019
+8921 8863 8920
+8631 8508 8630
+8920 8863 8819
+8921 8922 8863
+8965 8922 8921
+8966 8864 8922
+8721 8820 8722
+8863 8922 8820
+8424 8629 8425
+8508 8425 8630
+8820 8721 8819
+8722 8631 8721
+8261 8424 8425
+8425 8629 8630
+8818 8919 8720
+8721 8630 8720
+8962 9017 9018
+8964 8920 8919
+8720 8919 8819
+8919 8918 8962
+9018 8964 8963
+9019 8920 8964
+9019 9101 9211
+9209 9311 9210
+9254 9312 9313
+9311 9436 9361
+9255 9254 9313
+9255 9211 9254
+9018 9101 9019
+9210 9211 9101
+9017 8962 8918
+8963 8919 8962
+8962 9018 8963
+9018 9017 9100
+9050 9051 9016
+9099 9141 9051
+9018 9100 9101
+9051 9141 9100
+9101 9209 9210
+9141 9208 9209
+9311 9310 9360
+9207 9140 9097
+9049 9050 9016
+9098 9099 9050
+9209 9208 9310
+9141 9099 9208
+9017 8917 9016
+8628 8817 8629
+9051 9017 9016
+9051 9100 9017
+8818 8918 8919
+8917 9017 8918
+8630 8629 8720
+8917 8918 8818
+8261 8163 8260
+8629 8818 8720
+8423 8628 8424
+8628 8627 8719
+8062 8260 8163
+8423 8424 8260
+7870 7869 7951
+7805 7806 7653
+7952 7951 7994
+7950 7868 7949
+7951 7869 7950
+7806 7871 7722
+8062 7994 7950
+7994 8063 7952
+7950 7994 7951
+8062 8063 7994
+8424 8261 8260
+8164 8065 8064
+8165 8164 8261
+8165 8065 8164
+8262 8261 8425
+8164 8163 8261
+8164 8064 8063
+8065 7954 8064
+8063 7995 7952
+8064 7954 7953
+7872 7953 7954
+7995 8064 7953
+7722 7871 7807
+7870 7952 7871
+7722 7807 7723
+7871 7953 7807
+7724 7808 7809
+7807 7953 7872
+7872 7808 7807
+7872 7809 7808
+7654 7722 7655
+7654 7806 7722
+7654 7655 7535
+7723 7724 7655
+7534 7654 7535
+7805 7721 7867
+7534 7653 7654
+7534 7533 7653
+7870 7806 7869
+7870 7871 7806
+7869 7868 7950
+7869 7806 7805
+7949 7867 7804
+7652 7653 7533
+7868 7805 7867
+7868 7869 7805
+7804 7721 7652
+7805 7653 7721
+7804 7652 7720
+7721 7653 7652
+7715 7714 7800
+7865 7948 7866
+7865 7803 7864
+7719 7718 7803
+7866 7804 7720
+7867 7721 7804
+7949 7866 7948
+7949 7804 7866
+8260 8259 8423
+7946 7862 7801
+8061 7949 7948
+8062 7950 7949
+8260 8061 8259
+7947 7864 7863
+7718 7802 7803
+7864 7947 7948
+7948 7865 7864
+7866 7720 7865
+7863 7802 7862
+7649 7531 7586
+7947 7863 7862
+7864 7802 7863
+7946 7947 7862
+8061 7948 7947
+8257 8258 8060
+8422 8259 8258
+8257 8060 8059
+8258 8259 8060
+7800 7946 7801
+8060 7947 7946
+7802 7801 7862
+7650 7718 7651
+7802 7717 7801
+7717 7650 7716
+7801 7717 7716
+7802 7718 7717
+7389 7650 7532
+7531 7649 7650
+7649 7715 7716
+7649 7714 7715
+7650 7649 7716
+7586 7714 7649
+7585 7646 7647
+7645 7644 7711
+7799 7713 7712
+7714 7648 7713
+7713 7800 7714
+7799 8059 7945
+7584 7645 7646
+7584 7583 7645
+7526 7642 7579
+7796 7943 7797
+7582 7643 7644
+7642 7796 7797
+7576 7709 7710
+7796 7642 7641
+7710 7709 7795
+7708 7639 7794
+7641 7710 7796
+7641 7577 7710
+7638 7707 7639
+7706 7793 7707
+7640 7708 7709
+7639 7707 7794
+7795 7708 7794
+7640 7575 7708
+7795 7794 7941
+7861 7860 7939
+7859 7860 7793
+7859 7938 7939
+7859 7939 7860
+8055 8056 7939
+8417 8254 8253
+8057 8058 7943
+8253 8254 8056
+8418 8419 8255
+8057 7941 8056
+7942 7796 7795
+7941 8057 7942
+8254 8255 8057
+7710 7795 7796
+7709 7708 7795
+7644 7797 7798
+7643 7642 7797
+7644 7798 7711
+7797 7943 7944
+7799 7944 8059
+7798 7797 7944
+8060 7945 8059
+7946 7800 7945
+8058 8257 8059
+8421 8422 8257
+8814 8813 9011
+8626 8421 8625
+8626 8625 8813
+8421 8257 8420
+8058 8256 8257
+8058 8057 8255
+8421 8420 8625
+8255 8254 8418
+8420 8419 8624
+8420 8256 8419
+8418 8623 8419
+8622 8810 8623
+8256 8255 8419
+8256 8058 8255
+9009 8811 9008
+8812 8625 8624
+8811 8624 8623
+8811 8812 8624
+8625 8812 8813
+8811 9009 8812
+9013 9012 9094
+8815 8814 9012
+9198 9009 9008
+9010 9011 8813
+9199 9010 9009
+9200 9011 9010
+9426 9199 9425
+9200 9010 9199
+9093 9201 9202
+9011 9200 9201
+9304 9429 9201
+9430 9492 9431
+9252 9251 9306
+9203 9093 9202
+9252 9203 9251
+9094 9012 9203
+9431 9307 9306
+9204 9094 9203
+9252 9204 9203
+9095 9013 9094
+9306 9307 9252
+9205 9095 9204
+9560 9433 9432
+9253 9204 9307
+9432 9308 9307
+9205 9204 9253
+9308 9205 9253
+9137 9095 9205
+9307 9308 9253
+9207 9310 9208
+9433 9309 9308
+9140 9208 9099
+9204 9095 9094
+9137 9138 9096
+9139 9096 9138
+8914 8961 8915
+8914 8816 8815
+8815 9012 9013
+8814 8627 8626
+8628 8629 8424
+8815 8719 8627
+8816 8862 8817
+8815 8816 8719
+8815 9013 8914
+9014 8914 9013
+8817 8917 8818
+9015 9049 9016
+9015 9016 8916
+9014 8961 8914
+9014 9096 9097
+8914 8862 8816
+8862 8916 8817
+8914 8915 8862
+8916 8917 8817
+8627 8628 8423
+8719 8816 8817
+8629 8817 8818
+8628 8719 8817
+8961 8916 8915
+8961 9015 8916
+9014 9097 9015
+9098 9050 9049
+9139 9097 9096
+9139 9207 9097
+9014 9015 8961
+9097 9049 9015
+9308 9309 9206
+9434 9435 9310
+9206 9207 9139
+9309 9434 9207
+9097 9140 9098
+9207 9208 9140
+9430 9431 9306
+9432 9307 9431
+9623 9686 9557
+9559 9560 9432
+9557 9686 9558
+9560 9561 9433
+9558 9686 9687
+9765 9807 9858
+9687 9560 9559
+9687 9766 9560
+9906 9860 9859
+9688 9561 9560
+9959 9858 9958
+9957 9856 9905
+9860 9861 9810
+9766 9858 9859
+9807 9857 9858
+9764 9763 9805
+9766 9765 9858
+9764 9806 9807
+9687 9765 9766
+9687 9764 9765
+9804 9856 9763
+9804 9855 9905
+9763 9856 9805
+10132 10131 10222
+9805 9806 9764
+9805 9857 9806
+9804 9905 9856
+10058 10131 10059
+9489 9556 9557
+9686 9762 9763
+9559 9558 9687
+9685 9622 9621
+9556 9489 9428
+9490 9429 9489
+9430 9491 9558
+9490 9489 9557
+9492 9558 9559
+9492 9430 9558
+9429 9430 9305
+9491 9557 9558
+9491 9429 9490
+9305 9201 9429
+9429 9491 9430
+9490 9557 9491
+9684 9685 9621
+9623 9557 9556
+9761 9762 9685
+9802 9854 9903
+9686 9685 9762
+9623 9622 9685
+9854 9761 9853
+9760 9554 9683
+9429 9428 9489
+9304 9427 9428
+9622 9556 9621
+9622 9623 9556
+9685 9684 9761
+9621 9555 9684
+9682 9426 9425
+9554 9427 9426
+9684 9555 9554
+9621 9556 9555
+9682 9758 9759
+9682 9757 9758
+9852 9760 9683
+9760 9684 9554
+9684 9760 9761
+9683 9759 9852
+9852 9853 9760
+9902 9854 9853
+9949 9851 9850
+9950 10053 10054
+9851 9852 9759
+9851 9949 9950
+9851 9951 9852
+10053 10129 10054
+9951 9952 9852
+9952 9951 10055
+9853 9953 9902
+10008 10056 10057
+9953 9954 9902
+10057 10130 10221
+9954 9955 9902
+9855 9804 9803
+9761 9802 9762
+9761 9854 9802
+9802 9803 9762
+9802 9903 9855
+9902 9955 9854
+10008 10007 10056
+9802 9855 9803
+9904 9905 9855
+9856 9957 9857
+9956 9904 9903
+9905 9956 9957
+9956 9903 9955
+9956 9955 10057
+10056 10130 10057
+10008 9955 9954
+10057 10058 9956
+9957 9956 10058
+9905 9904 9956
+9952 10006 9953
+9953 10006 10007
+9851 9950 9951
+9949 10053 9950
+9951 10054 10055
+10055 10130 10056
+9950 10054 9951
+10129 10219 10054
+9952 10055 10006
+10054 10219 10055
+9955 10008 10057
+9954 10007 10008
+10130 10220 10221
+10402 10403 10313
+10400 10401 10312
+10449 10450 10401
+10221 10220 10313
+10130 10055 10220
+10219 10400 10312
+10399 10494 10400
+10401 10450 10451
+10449 10495 10496
+10401 10451 10402
+10496 10611 10612
+10405 10404 10499
+10313 10403 10404
+10221 10314 10222
+10221 10313 10314
+10453 10406 10452
+10314 10404 10405
+10011 9959 9958
+9957 10058 10059
+10221 10222 10131
+10314 10315 10222
+10314 10405 10315
+10315 10405 10406
+10266 10222 10315
+10408 10359 10407
+10316 10315 10358
+10223 10267 10224
+10316 10358 10267
+10267 10266 10316
+10267 10223 10266
+10133 10132 10170
+10222 10266 10223
+10060 10010 10009
+9958 9858 9857
+10010 9958 10009
+10010 10011 9958
+10059 10060 10009
+9960 10012 9961
+10060 10011 10010
+10061 10062 9959
+10131 10132 10059
+10132 10133 10060
+10059 10132 10060
+10222 10223 10132
+10170 10224 10171
+10133 10170 10171
+10132 10223 10170
+10060 10133 10061
+9858 9959 9859
+10011 10061 9959
+10060 10061 10011
+9960 10062 10012
+10061 10133 10062
+10227 10319 10320
+10317 10359 10360
+10361 10317 10360
+10408 10407 10455
+10455 10407 10454
+10359 10408 10360
+10504 10557 10621
+10408 10361 10360
+10362 10410 10319
+10317 10361 10318
+10172 10226 10173
+10268 10318 10226
+10269 10318 10319
+10268 10317 10318
+10408 10409 10361
+10408 10455 10504
+10318 10362 10319
+10412 10623 10624
+10409 10410 10362
+10698 10621 10620
+10139 10138 10229
+10410 10623 10411
+10137 10136 10174
+10319 10410 10320
+10226 10269 10173
+10226 10318 10269
+10174 10227 10228
+10173 10269 10227
+10137 10174 10175
+10227 10320 10228
+10138 10175 10229
+10098 10097 10137
+10139 10229 10230
+10175 10228 10229
+10064 10065 9963
+10139 10066 10065
+10138 10137 10175
+10174 10173 10227
+10065 10138 10139
+10098 10137 10138
+10097 10063 10096
+10064 9962 10063
+10097 10136 10137
+10097 10096 10135
+10175 10174 10228
+10135 10134 10173
+10134 10172 10173
+10172 10134 10096
+10173 10174 10135
+10136 10135 10174
+10136 10097 10135
+9859 9960 9906
+9959 10062 9960
+9860 9906 9907
+9906 9961 9907
+9810 9861 9768
+9689 9688 9767
+9808 9859 9860
+9808 9860 9809
+9907 9861 9860
+9767 9808 9809
+9766 9859 9808
+9432 9433 9308
+9561 9562 9433
+9808 9767 9766
+9767 9768 9689
+9690 9624 9689
+9562 9688 9689
+9810 9767 9809
+9688 9766 9767
+9767 9810 9768
+9809 9860 9810
+9768 9690 9689
+9563 9564 9435
+9562 9434 9309
+9562 9624 9563
+9562 9563 9434
+9624 9690 9563
+9436 9493 9494
+9435 9564 9493
+9691 9724 9725
+9811 9812 9769
+9811 9863 9812
+10067 10231 10232
+9862 9863 9811
+9963 9908 9962
+9863 9862 9908
+9964 9963 10065
+9964 9863 9963
+9863 9964 9864
+10066 10230 10231
+9770 9771 9725
+9693 9694 9626
+9629 9695 9696
+10066 9865 9964
+9692 9693 9626
+9727 9728 9694
+9691 9726 9692
+9727 9693 9692
+9727 9694 9693
+9626 9691 9692
+9362 9361 9437
+9312 9311 9361
+9362 9313 9312
+9438 9496 9439
+9626 9627 9565
+9626 9694 9627
+9496 9495 9567
+9627 9694 9628
+9567 9629 9496
+9568 9631 9497
+9567 9628 9629
+9495 9496 9438
+9441 9314 9363
+9315 9257 9314
+9440 9363 9439
+9569 9497 9631
+9569 9441 9497
+9629 9568 9496
+9629 9696 9630
+9565 9566 9495
+9565 9628 9566
+9566 9567 9495
+9566 9628 9567
+9628 9695 9629
+9628 9694 9695
+9629 9630 9568
+9696 9631 9630
+9570 9697 9698
+9631 9696 9697
+9695 9773 9696
+9865 9772 9771
+9868 9867 10069
+9772 9728 9727
+10069 9867 10068
+9868 9697 9867
+9867 9866 10068
+10066 10139 10230
+10068 9866 10067
+9773 9728 9772
+9774 9773 9866
+9774 9696 9773
+9726 9771 9727
+9866 9773 9772
+9725 9724 9770
+9725 9771 9726
+9813 9865 9771
+9770 9813 9771
+9864 9964 9865
+9866 9865 10067
+9964 10065 10066
+10067 9865 10066
+9866 9772 9865
+10230 10321 10231
+10321 10412 10413
+10506 10456 10413
+10230 10229 10412
+10231 10321 10322
+10230 10412 10321
+10414 10413 10456
+10322 10321 10413
+10414 10456 10508
+10506 10624 10625
+10415 10414 10509
+10322 10413 10414
+10628 10510 10509
+10323 10322 10414
+10416 10323 10415
+10324 10325 10232
+10325 10416 10417
+10324 10323 10416
+10141 10140 10233
+10141 10069 10140
+10324 10232 10323
+10140 10068 10232
+10416 10325 10324
+10417 10233 10325
+10508 10627 10509
+10784 10928 10929
+10627 10699 10628
+10627 10626 10784
+10627 10784 10699
+10852 10782 10851
+10625 10558 10506
+10626 10627 10508
+10414 10508 10509
+10456 10507 10508
+10506 10558 10507
+10626 10508 10558
+10782 10625 10624
+10782 10783 10625
+10456 10506 10507
+10413 10412 10506
+10623 10780 10624
+10623 10779 10780
+10849 10850 10781
+10850 10851 10781
+10626 10783 10784
+10626 10625 10783
+10851 10850 10925
+10781 10780 10849
+10924 10849 10780
+10924 10925 10849
+10851 10925 10926
+10850 10849 10925
+11057 11184 11185
+10924 10923 11053
+10925 10985 11056
+11054 11109 11110
+10924 10985 10925
+10924 11054 10985
+10925 11056 10926
+11183 11182 11314
+10852 10851 10926
+10782 10781 10851
+11056 11057 10926
+11184 11183 11238
+11057 10927 10926
+10783 10782 10852
+10926 10927 10852
+11058 11059 10927
+11111 11059 11058
+11060 10928 11059
+11187 11113 11186
+11187 11060 11113
+11186 11112 11111
+11112 11059 11111
+11185 11186 11111
+11113 11059 11112
+11056 11110 11183
+11240 11316 11186
+11317 11187 11186
+11113 11112 11186
+11319 11187 11318
+11319 11188 11187
+11317 11318 11187
+11370 11371 11319
+11707 11590 11589
+11456 11510 11457
+11454 11317 11316
+11454 11455 11317
+11588 11706 11589
+11952 11953 11707
+11184 11238 11239
+11315 11316 11240
+11455 11454 11590
+11316 11315 11454
+11181 11313 11182
+11586 11508 11585
+11705 11706 11587
+11589 11453 11588
+11587 11706 11588
+12567 12223 12566
+11705 11587 11586
+11588 11453 11587
+11180 11312 11181
+11451 11509 11586
+11452 11451 11587
+11452 11453 11368
+11313 11314 11182
+11313 11368 11314
+11314 11238 11183
+11314 11315 11238
+11185 11239 11240
+11238 11315 11239
+11185 11184 11239
+11057 11056 11183
+11055 11110 11056
+11055 11054 11110
+11057 11183 11184
+11110 11182 11183
+11452 11367 11451
+11450 11508 11509
+11505 11506 11449
+11180 11181 11107
+11448 11583 11505
+11584 11639 11585
+11450 11507 11508
+11506 11585 11507
+11753 11705 11640
+11587 11451 11586
+11638 11703 11704
+11640 11585 11639
+11639 11704 11640
+11949 12079 11950
+11640 11705 11586
+11823 11874 11950
+11822 11752 11821
+11753 11640 11704
+11505 11584 11506
+11637 11638 11584
+11637 11703 11638
+11752 11753 11704
+11819 11820 11749
+11751 11704 11703
+11702 11749 11750
+11820 11873 11821
+11704 11751 11752
+11703 11750 11751
+11872 11820 11819
+11750 11703 11702
+11748 11701 11747
+11635 11582 11701
+11637 11636 11703
+11635 11701 11702
+11581 11582 11447
+11635 11636 11583
+11702 11636 11635
+11702 11703 11636
+11635 11583 11582
+11636 11637 11583
+11448 11505 11449
+11583 11584 11505
+11309 11447 11310
+11582 11583 11448
+11450 11311 11449
+11447 11582 11448
+11448 11310 11447
+10921 10922 10848
+11449 11311 11310
+10847 10848 10777
+11310 11311 11179
+11311 11312 11180
+11053 11107 11108
+11052 11180 11107
+11179 11311 11180
+11450 11451 11311
+11313 11312 11367
+11450 11509 11451
+11181 11312 11313
+11311 11451 11312
+11313 11367 11368
+11312 11451 11367
+11453 11452 11587
+11368 11367 11452
+11110 11109 11182
+11054 11053 11109
+10924 11053 11054
+11052 11107 11053
+11053 11108 11109
+11107 11181 11108
+10505 10409 10408
+10921 10846 10920
+11052 10922 11051
+10923 10924 10780
+11052 10923 10922
+11052 11053 10923
+10410 10622 10623
+10922 10923 10779
+10922 10778 10848
+10779 10623 10622
+10779 10622 10778
+10410 10409 10505
+10621 10505 10504
+10622 10410 10505
+10778 10777 10848
+10778 10622 10777
+11178 11051 11050
+11179 11052 11051
+10922 10921 11051
+10919 10775 10774
+10848 10847 10921
+10777 10621 10776
+10846 10847 10777
+10846 10921 10847
+10408 10504 10505
+10455 10454 10503
+10618 10697 10774
+10774 10775 10619
+10455 10503 10504
+10454 10502 10503
+10503 10557 10504
+10503 10556 10557
+10698 10776 10621
+10777 10622 10621
+10921 10920 11051
+10846 10776 10920
+10920 10776 10775
+10846 10777 10776
+11309 11178 11177
+10920 10775 10919
+10557 10619 10620
+10619 10698 10620
+10775 10776 10698
+10773 10774 10697
+10919 10918 10984
+10845 10844 10918
+11049 10919 10984
+11050 10920 10919
+10845 10773 10844
+10614 10771 10695
+10613 10770 10614
+10772 10696 10695
+10500 10553 10554
+10614 10695 10615
+10695 10616 10615
+10554 10616 10617
+10502 10555 10556
+10452 10500 10501
+10556 10618 10619
+10556 10555 10618
+10405 10499 10500
+10404 10498 10499
+10616 10553 10615
+10842 10769 10768
+10615 10553 10614
+10500 10499 10553
+10553 10613 10614
+10498 10497 10612
+10403 10497 10498
+10451 10450 10496
+10496 10612 10497
+10612 10768 10769
+10451 10496 10497
+10450 10449 10496
+10495 10552 10611
+10494 10610 10552
+10400 10495 10449
+10400 10494 10495
+10693 10766 10610
+10694 10840 10767
+10552 10694 10611
+10766 10839 10840
+10694 10767 10611
+10694 10766 10840
+10611 10768 10612
+10915 10914 10981
+10767 10840 10913
+10767 10913 10841
+10840 10839 10913
+10913 10914 10841
+11044 11045 10916
+10914 10913 10981
+10916 10915 10982
+10842 10841 10915
+11044 10916 10982
+10915 10981 10982
+10841 10842 10768
+10770 10917 10771
+10915 10916 10842
+11045 11102 11103
+10769 10770 10613
+10917 10843 10771
+10612 10769 10613
+10842 10916 10769
+10614 10770 10771
+10769 10916 10770
+11305 11306 11237
+11176 11105 11175
+11443 11444 11306
+11174 11173 11236
+11174 11103 11173
+11045 10917 10770
+11104 11046 11103
+11043 11044 10982
+11103 11046 11045
+11102 11045 11044
+11101 11044 11043
+11101 11102 11044
+11173 11103 11102
+11173 11172 11235
+11172 11102 11101
+11172 11173 11102
+11501 11442 11575
+11631 11574 11573
+11631 11744 11574
+11236 11235 11304
+11694 11631 11573
+11695 11744 11631
+11696 11575 11812
+11634 11633 11698
+11865 11696 11937
+11867 11942 11943
+11696 11632 11575
+11745 11813 11814
+11501 11443 11442
+11176 11307 11308
+11576 11577 11501
+11443 11365 11442
+11575 11576 11501
+11632 11697 11633
+11632 11576 11575
+11632 11577 11576
+11696 11697 11632
+11815 11941 11942
+11814 11698 11697
+11579 11503 11502
+11502 11578 11579
+11577 11633 11578
+11699 11698 11815
+11633 11697 11698
+11633 11579 11578
+11580 11504 11579
+11577 11502 11501
+11504 11580 11446
+11444 11502 11503
+11443 11501 11502
+11365 11443 11306
+11443 11502 11444
+11366 11307 11444
+11175 11237 11306
+10983 11047 11048
+11105 11048 11047
+11106 11049 11048
+11306 11307 11175
+11177 11106 11176
+11308 11307 11366
+11176 11175 11307
+11445 11366 11444
+11308 11177 11176
+11105 11106 11048
+11177 11050 11049
+11446 11308 11366
+11446 11447 11309
+11177 11049 11106
+11050 10919 11049
+11446 11309 11308
+11310 11179 11178
+11177 11178 11050
+11309 11310 11178
+11446 11581 11447
+11580 11634 11699
+11503 11504 11444
+11446 11366 11445
+11444 11504 11445
+11503 11579 11504
+11579 11634 11580
+11579 11633 11634
+11698 11699 11634
+11816 11867 11817
+11816 11700 11699
+11696 11745 11697
+11866 11941 11814
+11697 11745 11814
+11696 11813 11745
+12277 12276 12369
+12367 12559 12450
+11941 12072 12073
+11865 11866 11813
+12277 12369 12370
+12368 12450 12369
+12651 12763 12652
+12652 12561 12560
+12651 12762 12763
+12832 12946 12833
+12559 12651 12560
+12764 12833 12765
+12762 12832 12763
+12831 12945 12832
+12561 12451 12560
+12368 12367 12450
+12760 12761 12651
+12761 12832 12762
+12369 12276 12368
+12275 12214 12365
+12560 12651 12652
+12559 12760 12651
+13144 12945 13143
+12946 12832 12945
+13144 13143 13348
+13142 13141 13225
+12558 12760 12559
+12943 12944 12760
+12651 12761 12762
+12760 12831 12761
+12216 12215 12276
+12216 12072 12071
+12215 12071 12070
+12072 11941 11993
+12072 11993 12071
+11941 11866 11940
+11865 11813 11696
+11866 11814 11813
+11939 11940 11865
+11940 11866 11865
+11937 11938 11865
+11992 11993 11940
+11938 11939 11865
+11992 11940 11939
+11991 12070 11938
+12070 12071 11992
+11993 11992 12071
+11939 11938 11992
+11936 11990 11937
+12070 11992 11938
+12069 11990 12068
+12069 11937 11990
+11864 11936 11937
+11864 11935 11936
+11696 11812 11864
+11811 11934 11863
+11744 11811 11812
+11744 11743 11811
+11812 11863 11864
+11812 11811 11863
+12556 12213 12212
+12068 11934 12067
+12069 12068 12213
+11990 11936 11935
+11934 11935 11863
+12068 11990 11935
+12070 12069 12214
+11991 11937 12069
+12067 12213 12068
+12557 12941 12942
+12365 12214 12364
+12213 12556 12557
+12943 12942 13140
+12557 12556 12941
+12943 12557 12942
+12364 12213 12557
+13142 12943 13141
+12760 12558 12943
+12449 12365 12558
+12364 12557 12558
+12559 12449 12558
+12449 12366 12365
+12069 12070 11991
+12214 12215 12070
+12276 12275 12367
+12215 12214 12275
+12367 12449 12559
+12366 12275 12365
+12367 12366 12449
+12367 12275 12366
+13770 13771 13701
+13877 13944 13878
+13941 13942 13876
+14064 14234 14235
+13770 13876 13771
+13942 13943 13876
+13700 13701 13517
+13771 13702 13701
+13225 13344 13345
+13141 13140 13344
+13343 13140 12942
+13343 13516 13140
+13940 13873 13872
+13516 13343 13699
+13873 13700 13699
+13874 13875 13770
+13872 13873 13699
+14060 14232 14061
+14061 13941 13874
+13941 13876 13875
+13700 13770 13701
+13700 13874 13770
+14309 14232 14308
+14061 13874 14060
+13939 14059 13940
+14428 14057 14056
+13940 14060 13873
+13940 14059 14060
+14058 14230 14059
+14307 14308 14232
+14060 14231 14232
+14880 14997 14998
+14230 14432 14231
+14708 14823 14709
+14233 14232 14309
+14233 14125 14232
+14062 14063 13941
+14232 14125 14061
+14063 13942 13941
+13874 13941 13875
+14061 14125 14062
+14061 14062 13941
+14125 14233 14063
+14125 14063 14062
+14064 14235 14065
+14233 14234 14063
+14434 14310 14433
+14234 14233 14433
+14234 14310 14235
+14234 14433 14310
+13772 13877 13878
+13943 14064 13944
+13944 14064 14065
+13942 14063 14064
+13876 13943 13877
+13942 14064 13943
+13876 13877 13771
+13943 13944 13877
+13701 13581 13517
+13702 13703 13581
+13344 13225 13141
+13345 13422 13346
+13347 13346 13423
+13226 13142 13225
+13518 13519 13422
+13518 13581 13519
+13879 13704 13878
+13703 13702 13772
+13422 13423 13346
+13519 13520 13423
+12943 13142 12944
+13225 13346 13226
+13521 13522 13424
+13143 13142 13226
+13424 13348 13521
+13349 13144 13348
+13520 13347 13423
+13348 13143 13347
+13520 13521 13347
+13520 13705 13521
+13521 13705 13583
+13520 13582 13704
+13581 13582 13519
+13703 13772 13704
+13878 13704 13772
+13705 13520 13704
+14435 14434 14518
+14235 14310 14434
+14436 14236 14435
+14235 14434 14435
+14065 14236 14066
+14235 14435 14236
+13523 13424 13522
+13349 13348 13424
+13145 13144 13349
+12946 12945 13144
+14238 14067 14066
+13524 13523 13706
+14635 14436 14634
+14237 14236 14436
+14238 14237 14436
+14066 14236 14237
+14438 14067 14437
+14067 13706 14066
+14827 14438 14437
+14068 13708 13707
+14437 14067 14238
+13707 13524 13706
+14068 13707 14067
+13708 13350 13707
+13583 13523 13522
+13524 13349 13523
+12946 13145 12947
+13349 13350 13146
+12947 13146 12948
+12562 12453 12561
+12833 12947 12765
+13145 13349 13146
+12766 12948 12563
+13146 13350 12948
+12373 12562 12563
+12765 12947 12766
+12766 12562 12765
+12766 12563 12562
+12453 12372 12371
+12074 12075 11942
+12371 12452 12453
+12451 12561 12452
+12652 12653 12561
+12652 12764 12653
+12946 12947 12833
+13145 13146 12947
+12763 12764 12652
+12763 12832 12764
+12369 12451 12452
+12369 12450 12451
+12277 12370 12371
+12369 12452 12370
+12276 12277 12216
+12371 12372 12278
+12217 12278 12218
+12277 12371 12278
+12562 12373 12372
+12220 12374 12375
+12217 12218 12073
+12078 12079 11948
+12072 12217 12073
+12216 12277 12217
+12073 12218 12133
+12278 12372 12218
+12076 11994 12075
+11942 12073 12074
+11941 11815 11814
+11942 11816 11815
+11867 11816 11942
+11699 11815 11816
+12075 11994 11942
+11995 11943 11942
+12133 12075 12074
+11996 11946 11945
+12133 12076 12075
+12374 12373 12563
+11943 11996 11944
+12076 12133 12134
+11945 11867 11944
+11817 11700 11816
+11996 11945 11944
+11868 11817 11867
+11945 11868 11867
+11868 11869 11817
+11946 11868 11945
+11869 11870 11818
+11946 11869 11868
+11946 12078 11947
+12076 12077 11996
+12949 12564 12563
+12076 11995 11994
+11996 11943 11995
+12076 12134 12077
+12133 12218 12219
+12133 12219 12134
+12218 12373 12219
+12134 12219 12220
+12220 12219 12374
+12134 12220 12077
+12220 12221 12078
+11947 12078 11948
+12077 12220 12078
+12078 12221 12079
+12949 12563 12948
+11949 11948 12079
+11873 11872 11948
+11871 11870 11947
+11818 11817 11869
+11871 11947 11872
+11870 11946 11947
+11819 11818 11870
+11747 11701 11746
+11700 11746 11701
+11700 11817 11746
+11818 11747 11746
+11819 11749 11748
+11749 11702 11748
+11819 11871 11872
+11819 11870 11871
+11749 11820 11750
+11872 11873 11820
+11705 11753 11823
+11753 11752 11822
+11751 11821 11752
+11751 11750 11821
+11873 11822 11821
+11874 11823 11822
+11705 11824 11706
+11950 12079 12222
+11705 11823 11824
+11753 11822 11823
+11706 11952 11707
+11951 12223 12224
+11706 11951 11952
+11824 11823 11950
+11873 11949 11874
+11873 11948 11949
+11824 11950 11951
+11874 11949 11950
+12565 12222 12221
+12223 11951 11950
+12566 12223 12222
+12567 12953 12568
+11952 12224 12225
+11952 11951 12224
+12567 12568 12224
+12953 12954 12568
+12223 12567 12224
+12566 12951 12952
+13712 13355 13354
+13712 13356 13355
+12952 13354 13355
+13711 13712 13354
+12222 12565 12566
+13353 13354 12951
+12566 12952 12567
+12951 13354 12952
+12566 12565 12951
+12221 12375 12564
+12220 12375 12221
+12374 12563 12375
+12221 12564 12565
+12375 12563 12564
+13350 13351 12948
+12950 12565 12564
+13351 13352 12949
+12951 12565 12950
+12950 13353 12951
+13710 13711 13353
+14069 14070 13709
+14441 14829 14830
+13709 13351 13708
+12949 12948 13351
+12950 13352 13353
+13351 13709 13352
+14826 14827 14437
+14439 14440 14069
+14438 14068 14067
+14438 14439 14068
+13708 14069 13709
+14068 14439 14069
+14069 14440 14070
+14439 14828 14440
+13352 13710 13353
+13709 14070 13710
+13710 14071 13711
+14070 14440 14071
+13711 14072 13712
+14071 14441 14072
+14831 14442 14830
+14071 14440 14441
+14441 14442 14072
+14441 14830 14442
+14833 14444 14443
+14834 14637 14444
+14312 14445 14313
+15392 15275 15274
+14312 14313 14241
+15393 15604 15468
+14239 14443 14444
+14442 14636 14443
+14311 14312 14241
+14311 14445 14312
+14075 14076 13880
+14073 14443 14239
+14072 13713 13712
+14073 14239 14074
+14072 14073 13713
+14072 14442 14073
+14073 13714 13713
+14074 14241 14075
+14241 14074 14240
+13714 14073 14074
+12956 13358 13147
+13714 14074 13715
+13880 14076 13945
+14242 14313 14446
+14074 14075 13715
+14241 14313 14242
+13881 13880 13945
+13715 14075 13880
+13358 13359 13147
+13715 13880 13716
+13946 14126 13947
+14077 14076 14126
+13773 13716 13881
+13525 13359 13716
+14710 14835 14836
+14126 14076 14243
+14076 14242 14243
+14075 14241 14242
+14242 14314 14243
+15072 15007 15006
+14242 14446 14314
+14637 14834 14835
+14314 14447 14315
+14314 14446 14447
+13948 13947 14126
+13949 13883 13948
+13947 13773 13881
+13717 13525 13716
+13882 13717 13773
+13718 13584 13717
+13774 13719 13718
+13775 13720 13719
+13882 13774 13718
+13883 13775 13774
+13950 13883 13949
+13886 13885 13952
+15877 15813 15812
+13952 13885 13951
+13886 13777 13776
+13886 13952 13953
+15812 15813 15674
+13722 13587 13721
+13232 13364 13365
+13886 13776 13885
+13721 13720 13776
+13722 13588 13587
+13366 13428 13367
+13720 13585 13719
+13586 13528 13585
+13722 13721 13777
+13528 13587 13529
+13365 13364 13427
+13366 13234 13233
+13233 13232 13365
+13526 13584 13527
+13232 13363 13364
+13426 13427 13363
+13231 13362 13363
+13361 13527 13362
+13717 13584 13525
+13425 13527 13361
+13584 13718 13527
+13425 13526 13527
+13525 13584 13526
+13149 13228 13229
+13359 13525 13360
+13229 13425 13361
+13360 13525 13425
+12959 12958 13150
+12956 12572 12571
+13151 12959 13150
+12573 12379 12378
+13030 12959 13151
+12960 12769 12768
+13150 13230 13151
+13150 13361 13230
+13230 13231 13151
+13230 13362 13231
+13031 13030 13153
+13151 13231 13152
+13231 13232 13152
+13231 13363 13232
+13154 13153 13233
+13154 13031 13153
+13156 12962 13032
+12960 13030 13031
+12959 13030 12960
+13151 13152 13030
+12575 12768 12769
+12575 12574 12767
+12767 12574 12573
+12235 12236 12087
+12959 12767 12958
+12959 12768 12767
+12575 12380 12574
+12575 12769 12576
+12282 12381 12236
+12380 12575 12381
+12141 12235 12086
+12282 12236 12235
+12281 12282 12235
+12380 12381 12282
+12234 12281 12235
+12379 12380 12281
+12231 12377 12232
+12379 12281 12280
+12378 12379 12280
+12574 12380 12379
+12279 12378 12280
+12573 12958 12767
+12234 12279 12280
+12232 12378 12279
+12279 12234 12233
+12280 12281 12234
+12232 12140 12139
+12141 12086 12085
+12377 12231 12230
+12231 12139 12138
+12231 12138 12137
+12084 11960 12000
+12230 12231 12137
+12232 12139 12231
+12957 12573 12572
+12378 12232 12377
+12140 12233 12234
+12140 12232 12233
+12377 12573 12378
+12377 12572 12573
+13148 13149 12957
+12958 12573 12957
+13360 13228 13227
+13360 13229 13228
+13360 13227 13359
+13228 13149 13227
+13148 12957 13147
+13149 12958 12957
+13359 13148 13147
+13227 13149 13148
+12572 12376 12571
+12572 12377 12230
+12957 12956 13147
+12571 12955 12956
+12955 13357 12956
+13714 13715 13358
+13713 13357 13356
+13714 13358 13357
+13356 12954 12953
+13356 13357 12954
+12228 12570 12571
+12569 12955 12570
+12570 12226 12569
+12570 12228 12227
+12376 12229 12228
+12376 12230 12229
+12136 12230 12137
+12376 12572 12230
+12083 12136 12137
+12135 12229 12230
+11956 11955 12228
+11954 12226 12227
+12082 12135 12136
+12081 11998 11997
+12225 11953 11952
+11954 11708 11953
+11708 11591 11590
+11708 11709 11592
+11708 11592 11591
+11709 11593 11592
+11826 11825 11955
+11710 11709 11825
+11754 11710 11825
+11711 11595 11710
+11711 11754 11755
+11711 11710 11754
+11954 11955 11825
+12227 12228 11955
+11825 11826 11754
+11955 11827 11826
+11757 11713 11712
+11595 11460 11594
+11596 11595 11711
+11460 11321 11459
+11826 11755 11754
+11826 11756 11755
+11459 11458 11593
+11371 11320 11319
+11593 11458 11512
+11459 11320 11458
+11321 11460 11189
+11757 11827 11828
+11596 11460 11595
+11596 11461 11460
+11457 11511 11512
+11458 11320 11371
+10929 11060 11061
+11320 11321 11188
+11369 11319 11318
+11320 11188 11319
+11369 11370 11319
+11369 11455 11456
+11369 11456 11370
+11510 11511 11457
+11317 11455 11369
+11590 11591 11455
+11061 11060 11187
+10929 10928 11060
+11370 11456 11457
+11455 11510 11456
+10854 10853 10930
+10785 10929 10853
+10931 11061 11188
+10930 10853 10929
+10931 10930 11061
+10855 10787 10854
+10853 10854 10786
+10510 10630 10511
+10853 10786 10785
+10787 10701 10700
+10855 10854 10930
+10787 10786 10854
+10785 10700 10699
+10786 10787 10700
+10700 10701 10628
+10787 10855 10702
+10787 10702 10701
+10703 10630 10629
+10417 10510 10511
+10416 10509 10510
+10703 10629 10702
+10630 10510 10629
+10855 10788 10702
+10705 10706 10632
+10511 10630 10559
+10931 10855 10930
+10560 10631 10561
+10630 10703 10788
+10512 10560 10561
+10559 10631 10560
+10631 10632 10561
+10631 10704 10632
+10630 10789 10631
+10789 10931 10932
+10704 10705 10632
+10704 10631 10789
+10704 10790 10705
+10932 10933 10791
+10630 10788 10789
+10703 10702 10788
+10704 10789 10790
+10788 10855 10931
+11189 10931 11188
+10789 10788 10931
+10789 10932 10790
+11189 11190 10932
+10706 10791 10707
+10706 10790 10791
+11715 11714 11830
+11463 11192 11191
+11960 11961 11715
+11464 11192 11463
+10933 11191 10934
+11462 11714 11715
+11460 11461 11189
+11596 11712 11713
+11190 11462 11191
+11461 11714 11462
+10932 11190 10933
+11189 11461 11190
+10634 10633 10707
+10514 10513 10633
+10934 10793 10933
+10635 10420 10419
+10793 10635 10634
+10934 10935 10635
+10792 10634 10707
+10635 10419 10634
+10933 10793 10792
+10934 10635 10793
+11715 11463 11462
+11715 11716 11463
+11193 10936 10935
+10421 10420 10636
+11464 11193 11192
+10936 10637 10636
+10421 10637 10422
+10636 10935 10936
+11194 10936 11193
+10638 10639 10423
+11464 11322 11193
+11465 11597 11513
+11598 11513 11597
+11600 11720 11721
+11597 11465 11464
+11513 11466 11465
+11717 11641 11597
+11599 11466 11513
+11464 11716 11597
+11961 12086 11962
+11716 11717 11597
+11716 11831 11717
+11599 11641 11719
+11598 11597 11641
+11641 11718 11719
+11641 11717 11718
+11962 11875 11831
+11875 11833 11832
+11963 11964 11876
+11833 11719 11758
+11961 11962 11831
+12088 12236 12237
+11715 11961 11716
+11960 11830 11959
+11833 11758 11832
+11718 11717 11758
+11713 11757 11828
+12080 12228 12229
+11714 11713 11829
+11712 11756 11757
+11461 11713 11714
+11461 11596 11713
+11713 11828 11829
+11827 11955 11956
+11958 11959 11830
+11999 12083 12000
+11830 11960 11715
+12084 12083 12138
+11829 11958 11830
+11829 11828 11956
+11958 11957 11997
+11828 11827 11956
+11829 11957 11958
+11829 11956 11957
+11956 12080 11957
+12229 12135 12080
+11958 11997 11998
+11957 12080 11997
+11998 12081 12082
+12080 12135 12081
+12138 12083 12137
+12138 12139 12084
+11959 12000 11960
+11959 11999 12000
+12083 12084 12000
+12139 12140 12084
+11960 12085 11961
+12084 12140 12085
+12140 12141 12085
+12234 12235 12141
+12086 12087 11962
+12086 12235 12087
+11598 11599 11513
+11467 11195 11466
+11323 11196 11195
+10939 10795 10794
+11467 11323 11195
+11324 11325 11197
+11601 11323 11467
+11324 11196 11323
+11468 11324 11323
+11372 11325 11324
+11468 11372 11324
+11468 11514 11372
+11372 11373 11325
+11469 11326 11373
+11241 11325 11326
+11469 11515 11326
+11243 11327 11328
+10988 10987 11198
+11063 11062 11114
+10988 11198 11241
+11114 11197 11198
+11114 10987 11063
+10798 10858 10859
+10990 10989 11064
+10944 10943 10989
+10989 10990 10944
+11064 10945 10990
+10648 10647 10947
+10859 10944 10990
+10988 10942 10987
+10644 10564 10643
+10988 10943 10942
+10988 10989 10943
+10986 10941 10940
+10797 10710 10643
+10939 11062 10940
+11196 11197 11062
+11062 10986 10940
+11063 10987 10986
+10794 10938 10939
+11195 11196 10939
+11194 10937 10936
+11194 11195 10937
+10638 10938 10639
+10937 11195 10938
+10640 10794 10795
+10639 10938 10794
+10940 10856 10796
+10941 10942 10856
+10942 10857 10856
+10858 10943 10944
+10563 10643 10518
+10709 10797 10643
+10796 10708 10795
+10796 10642 10708
+10856 10709 10796
+10856 10797 10709
+10422 10638 10423
+10937 10938 10638
+10425 10516 10457
+10515 10640 10516
+10562 10517 10457
+10562 10641 10642
+10517 10563 10458
+10643 10564 10518
+10562 10642 10517
+10641 10708 10642
+10458 10563 10518
+10642 10709 10563
+10710 10645 10644
+10565 10646 10521
+10518 10519 10459
+10518 10564 10519
+10459 10520 10460
+10519 10564 10520
+10646 10522 10521
+10646 10799 10800
+10643 10710 10644
+10711 10646 10645
+10520 10565 10521
+10645 10646 10565
+10647 10800 10947
+10799 10945 10800
+10857 10858 10797
+10711 10645 10710
+10710 10798 10711
+10710 10797 10858
+10856 10857 10797
+10942 10943 10857
+10710 10858 10798
+10857 10943 10858
+10799 10859 10945
+10799 10798 10859
+10947 11065 11066
+10946 10945 11065
+10948 11067 11068
+11066 11065 11200
+10951 10861 10860
+11330 11202 11244
+10947 10946 11065
+10800 10945 10946
+11068 11069 10948
+11331 11330 11471
+10948 10947 11067
+10948 10648 10947
+10432 10647 10648
+10522 10646 10647
+10566 10523 10650
+10433 10648 10649
+10461 10523 10524
+10434 10433 10523
+10948 10949 10649
+11069 11070 10949
+11070 10950 10949
+10802 10712 10651
+10801 10651 10650
+10567 10461 10524
+10651 10566 10650
+10651 10567 10566
+10712 10567 10651
+10712 10461 10567
+10801 10802 10651
+10861 10461 10712
+10949 10950 10801
+10803 10712 10802
+10950 10860 10802
+10861 10712 10803
+10860 10950 10991
+11205 11072 11204
+10991 10950 11071
+10802 10801 10950
+10803 10860 10861
+10803 10802 10860
+11072 10991 11071
+10951 10860 10991
+10991 10992 10951
+10991 11072 10992
+11115 11073 11072
+11245 11115 11206
+11332 11245 11205
+11333 11376 11245
+11376 11333 11332
+11245 11476 11115
+11068 11202 11069
+11068 11067 11201
+11473 11203 11331
+11204 11070 11203
+11115 11205 11206
+11115 11072 11205
+11329 11201 11243
+11067 11066 11200
+10947 11066 11067
+11065 11199 11200
+11327 11200 11242
+11201 11067 11200
+11375 11329 11374
+11327 11243 11200
+11201 11200 11243
+11330 11244 11375
+11202 11201 11244
+11244 11329 11375
+11244 11201 11329
+11374 11327 11470
+11329 11328 11374
+11329 11243 11328
+11375 11374 11470
+11328 11327 11374
+11470 11471 11375
+11331 11202 11330
+11375 11471 11330
+11470 11516 11471
+11473 11474 11204
+11475 11376 11332
+11202 11331 11203
+11471 11516 11517
+11474 11332 11204
+11474 11475 11332
+11476 11376 11475
+18731 18617 18730
+11608 11609 11519
+11474 11608 11475
+11608 11519 11475
+11645 11609 11608
+11519 11476 11475
+18732 18617 18731
+11764 11840 11726
+11727 11766 11728
+11607 11608 11474
+11608 11607 11727
+11766 11842 11767
+11608 11728 11645
+11727 11607 11726
+11767 11728 11766
+11645 11728 11767
+11727 11765 11766
+11880 11841 11765
+11644 11724 11725
+11764 11839 11840
+11608 11727 11728
+11726 11765 11727
+11644 11605 11643
+12385 12454 12655
+11840 11765 11726
+11880 11840 11839
+11880 11765 11840
+11764 11763 11839
+11764 11725 11763
+11607 11725 11726
+11724 11763 11725
+11644 11643 11724
+11517 11472 11471
+11607 11606 11725
+11606 11518 11644
+11725 11606 11644
+11607 11474 11473
+11472 11473 11331
+11606 11607 11473
+11471 11472 11331
+11605 11518 11472
+11473 11518 11606
+11473 11472 11518
+11517 11605 11472
+11762 11838 11966
+11643 11605 11604
+11604 11517 11516
+11604 11605 11517
+11602 11468 11601
+11515 11603 11642
+11514 11468 11602
+11515 11514 11603
+11515 11469 11514
+11641 11599 11598
+11719 11720 11600
+11466 11600 11467
+11599 11719 11600
+11601 11721 11722
+11877 11964 12089
+11603 11602 11642
+11603 11514 11602
+11838 11762 11761
+11642 11602 11723
+11720 11760 11721
+11835 11759 11834
+11963 11833 11875
+11759 11720 11719
+11876 11834 11833
+11759 11835 11720
+11962 11963 11875
+11835 11760 11720
+11833 11834 11759
+11876 11964 11835
+11876 11835 11834
+11964 11877 11835
+11878 11836 11965
+11760 11835 11877
+11837 11836 11878
+11721 11760 11836
+11838 11761 11837
+11761 11722 11837
+11879 11838 11837
+11723 11722 11761
+12240 12284 12655
+11762 11723 11761
+11642 11723 11762
+12383 12238 12382
+12239 12090 12238
+13233 13234 13155
+13157 13033 12963
+13365 13366 13233
+13367 13235 13234
+12962 12576 12769
+12577 12383 12576
+12961 12962 12769
+13156 13157 12963
+12238 12237 12382
+12238 12089 12237
+12088 11963 12087
+12088 12089 11964
+12236 12088 12087
+12237 12089 12088
+12382 12283 12381
+12237 12236 12283
+12960 12961 12769
+13031 13155 13032
+12961 13032 12962
+12961 13031 13032
+13528 13586 13587
+13723 13589 13588
+13589 13530 13588
+13366 13427 13529
+13427 13366 13365
+13529 13588 13530
+13886 13953 13887
+15813 15877 16013
+13529 13587 13588
+13586 13721 13587
+13778 13722 13777
+13723 13588 13722
+13530 13589 13531
+13428 13530 13531
+13428 13529 13530
+13367 13428 13429
+13366 13529 13428
+13235 13367 13368
+13234 13366 13367
+13429 13531 13369
+13367 13429 13368
+13428 13531 13429
+13234 13235 13156
+13368 13369 13235
+13235 13369 13236
+13033 13236 13158
+12964 13034 12965
+13235 13157 13156
+13235 13236 13157
+13033 13158 13034
+12964 12963 13033
+12962 13156 12963
+12576 12383 12382
+12577 12384 12383
+12576 12770 12577
+12962 12963 12770
+12454 12384 12578
+12239 12383 12384
+12579 12578 12654
+12384 12577 12578
+12578 12771 12654
+12770 12963 12771
+12385 12384 12454
+12240 12142 12239
+12091 12001 12090
+11966 12240 12655
+12284 12384 12385
+11878 11879 11837
+11966 11838 11879
+12655 12284 12385
+12240 12239 12284
+11966 12142 12240
+11966 12091 12142
+12654 12771 12834
+12655 12579 12654
+12454 12578 12579
+12655 12654 12772
+12834 12964 12965
+12771 12963 12964
+12834 12965 12772
+13034 13158 12965
+12654 12834 12772
+12771 12964 12834
+18615 18439 18438
+18616 18440 18439
+18903 18999 18904
+18437 18615 18438
+18728 18616 18615
+18205 18437 18438
+18901 18997 18998
+18204 18344 18205
+18436 18344 18204
+18436 18437 18344
+18203 18431 18432
+18612 18613 18433
+18432 18612 18433
+18431 18611 18432
+18433 18613 18434
+18434 18613 18614
+18617 18729 18730
+18435 18614 18898
+18435 18434 18614
+18730 18729 18905
+18617 18440 18729
+18987 18725 18894
+18611 18431 18610
+18896 18726 18895
+18612 18432 18726
+18613 18727 18614
+18895 18990 19165
+19180 18730 19000
+19001 19182 19002
+18906 18732 18731
+18733 18734 18732
+18906 19001 18732
+18907 19003 18734
+18732 18907 18733
+19002 19003 18907
+18729 18904 18905
+18729 18440 18903
+18901 18998 18728
+19174 19175 18902
+18729 18903 18904
+18436 18901 18437
+19597 19813 19484
+18734 19003 19004
+19301 19488 19302
+19001 19002 18907
+19595 19807 19808
+19813 19598 19484
+19005 19004 19185
+19815 19599 19301
+19005 19185 19186
+18728 18998 18902
+18997 19173 18998
+18730 18905 19000
+18732 19001 18907
+19181 19295 19481
+18899 18992 18993
+18898 18992 18899
+19466 19796 19797
+19169 18993 19168
+19168 19465 19169
+19284 19164 18987
+18989 18611 18988
+19462 19463 19164
+18990 18895 18989
+18612 18896 18727
+19169 19170 18995
+18899 18993 18994
+18900 18995 18996
+18899 18994 18995
+18435 18898 18899
+18614 18727 18897
+18991 18896 18895
+18991 18727 18896
+18614 18897 18898
+18727 18991 18897
+18893 18894 18609
+18725 18611 18610
+18985 18724 18723
+18893 18609 18724
+18984 18890 18983
+18889 18890 18722
+18984 18891 18890
+19161 19280 19460
+18987 18894 18986
+18725 18610 18894
+18987 18986 19163
+18894 18893 18986
+19284 18987 19163
+18988 18725 18987
+18984 19161 18891
+19162 18986 18893
+18721 18720 18887
+18983 18890 18889
+19161 18892 18891
+18985 18723 18892
+18887 18720 18886
+18607 18885 18719
+18982 18887 18886
+18888 18889 18722
+19279 18888 18887
+19160 18889 18888
+18719 18982 18886
+18981 19159 18982
+18425 18602 18603
+18719 18981 18982
+18885 19158 18981
+18886 18720 18719
+18887 18888 18721
+18342 18721 18722
+18429 18720 18721
+18719 18608 18607
+18720 18429 18608
+18423 18601 18602
+18604 18426 18603
+18425 18190 18336
+18602 18424 18423
+18425 18426 18190
+18421 18422 18189
+18424 18425 18336
+18602 18425 18424
+18426 18427 18190
+18603 18426 18425
+18603 18884 18604
+18604 18427 18426
+18337 18190 18427
+18428 18337 18604
+18605 18428 18604
+18605 18338 18428
+18339 18338 18606
+18191 18190 18428
+18201 18200 18343
+18609 18610 18430
+18430 18431 18203
+18338 18339 18192
+18606 18607 18340
+18606 18340 18339
+18607 18608 18341
+18197 18341 18198
+18340 18607 18341
+18199 18198 18342
+18202 18343 18203
+18343 18202 18201
+18199 18342 18200
+18194 18340 18195
+18197 18199 18196
+18199 18197 18198
+18196 18341 18197
+18192 18191 18338
+18192 18190 18191
+18339 18193 18192
+18194 18195 18193
+18339 18194 18193
+18339 18340 18194
+19150 19151 18980
+19276 19780 19151
+19149 19275 19150
+19447 19580 19777
+18980 19149 19150
+19446 19580 19447
+19151 19447 19448
+19275 19446 19447
+19448 19449 19276
+19779 19918 19780
+19780 19918 19919
+19449 19780 19276
+19779 19917 20110
+19778 20109 19917
+20108 19916 19776
+20109 19778 19777
+19776 19777 19580
+19916 20109 19777
+20108 19775 19915
+19445 19272 19444
+20701 20430 20429
+19777 19776 19916
+19580 19446 19776
+20429 20107 20700
+19915 19774 20107
+20106 19773 19914
+20107 19774 19773
+19775 19774 19915
+19146 19443 19147
+19273 19148 19445
+18979 19149 18980
+18979 19273 19274
+19148 18979 18978
+18980 18716 18979
+18977 19147 19272
+18979 18716 18878
+18714 18715 18417
+18876 18716 18596
+19146 19147 18976
+18875 18596 18874
+18976 18875 18975
+18876 18596 18875
+19269 19442 19270
+18715 18596 18417
+18872 18714 18595
+18873 18715 18714
+18874 18715 18873
+18874 18596 18715
+18594 18595 18417
+18713 18870 18871
+18869 18973 18870
+18595 18713 18871
+18595 18594 18713
+18594 18712 18869
+19143 18869 18712
+18871 18974 19145
+18871 18870 18974
+19145 18872 18871
+18873 18714 18872
+19268 19441 19269
+19266 19267 19144
+19441 19268 19267
+19145 19268 19269
+19145 19267 19268
+20103 19770 19769
+19441 19267 19440
+19143 18868 19142
+19440 19267 19266
+19579 19270 19442
+19771 19772 19579
+19914 19773 19772
+19771 19579 19442
+19772 19443 19271
+18874 18975 18875
+19270 19579 19271
+18875 18976 18876
+18975 19271 19146
+19579 19772 19271
+18975 19146 18976
+19271 19443 19146
+20542 20432 20431
+20110 20242 19918
+20703 20702 20788
+20111 19919 19918
+20701 20540 20430
+20541 20702 20703
+20107 20429 19915
+20430 20109 19916
+20429 20430 20108
+20540 20541 20430
+20241 20428 20105
+20107 19773 20106
+19914 20104 20105
+19771 20426 20104
+20697 20698 20427
+20428 20106 20105
+20695 20696 20426
+20697 20427 20426
+20698 20428 20427
+20698 20699 20428
+19915 20429 20108
+20701 20962 20702
+20700 20701 20429
+20700 20960 20961
+20958 20959 20697
+20699 20700 20107
+20959 20699 20698
+20960 20700 20699
+20425 20695 20426
+20957 20958 20696
+20697 20959 20698
+21228 21527 20960
+20700 20961 20701
+20960 21229 20961
+21230 21231 20962
+20703 20432 20542
+20701 20702 20540
+20962 20788 20702
+20540 20702 20541
+20541 20542 20431
+20541 20703 20542
+20788 20963 20703
+20962 20963 20788
+21062 21232 21063
+21231 21062 20963
+21345 21232 21062
+18333 18598 18419
+18717 18879 18880
+18418 18597 18598
+18597 18879 18717
+18880 18597 18717
+18418 18185 18597
+19918 20242 20111
+19918 19779 20110
+20431 20110 19917
+20432 20242 20110
+21063 21346 21347
+19782 19581 19781
+19919 20111 20112
+18333 18418 18598
+18333 18185 18418
+18599 18335 18419
+18189 18188 18335
+18187 18186 18334
+18419 18187 18334
+18422 18421 18600
+18189 18335 18420
+18599 18420 18335
+18421 18189 18420
+18336 18422 18601
+18336 18189 18422
+18421 18420 18600
+18882 18599 18881
+18598 18880 18718
+18881 18599 18718
+18600 18420 18599
+18718 18880 18881
+18600 18599 18882
+18602 18601 18883
+19471 19173 19172
+19288 19174 19173
+19469 19171 19586
+18900 18996 19170
+18995 19170 18996
+19169 18994 18993
+19468 19286 19467
+19171 19170 19286
+19171 19287 18901
+19470 19471 19172
+19470 19287 19469
+19470 19172 19287
+19587 19471 19470
+19588 19928 19802
+19473 19289 19174
+19800 19587 19586
+19287 19171 19469
+19170 19285 19286
+19169 18995 18994
+19798 19468 19585
+19168 19167 19465
+19467 19466 19797
+19467 19285 19466
+19164 18989 18988
+18986 19283 19163
+19462 19164 19284
+19794 19463 19462
+18987 19164 18988
+19463 19165 19164
+19167 19166 19464
+18991 18895 19165
+18992 19168 18993
+18992 19167 19168
+19466 19169 19465
+19466 19170 19169
+18991 19165 19166
+18990 18989 19165
+18898 19167 18992
+18897 19166 19167
+18892 19161 18985
+18984 18983 19161
+19277 19278 18981
+19455 19456 19278
+19161 19281 18985
+19282 19283 19162
+18883 19154 19155
+18884 19155 19156
+18881 18880 19153
+21232 21346 21063
+21227 21228 20959
+21227 21526 21228
+20961 21230 20962
+21229 21527 21528
+20962 21231 20963
+21230 21343 21231
+21229 21528 21230
+22957 22737 22956
+21343 21344 21231
+21343 21528 21529
+19152 19581 19450
+19784 19452 19451
+19455 19277 19454
+19461 19281 19460
+19280 19279 19460
+19454 19277 19158
+19455 19278 19277
+18982 19457 19458
+19159 19456 19457
+19924 20125 19793
+19462 19284 19283
+19460 19281 19161
+19460 19792 19461
+19924 19461 19923
+19282 19162 19461
+20116 20117 19784
+20115 19783 20114
+19582 19581 19921
+19783 19582 19921
+19450 19582 19783
+19450 19581 19582
+21532 21347 21531
+21230 21528 21343
+22956 23121 23122
+21790 21529 21789
+21345 21344 21529
+21792 21637 21791
+21346 21232 21530
+21790 21791 21530
+21532 21348 21347
+21794 21348 21638
+22541 22540 22955
+21529 21528 21789
+21791 21637 21531
+21637 21638 21532
+22155 22156 22060
+21530 21529 21790
+21792 21791 21874
+21531 21530 21791
+21531 21637 21532
+21792 21875 21793
+20434 20245 20115
+19921 19920 20113
+19921 19581 19782
+19920 19782 19781
+19920 19921 19782
+19788 20119 20120
+19788 19787 20119
+20972 21240 20973
+20124 19922 20123
+19791 19790 20122
+19461 19792 19923
+20123 19922 19792
+20124 19923 19922
+19455 19789 19583
+19458 19584 19791
+19458 19457 19584
+19283 19793 19462
+19283 19282 19793
+19922 19923 19792
+19923 20125 19924
+19464 19794 19795
+19466 19465 19796
+19798 19797 20128
+19798 19585 19797
+20131 19587 19800
+19926 19925 20129
+19799 20128 19925
+19471 19927 19472
+20248 20132 20131
+20133 19927 20132
+20130 19926 20129
+19800 19586 19926
+20451 20248 20130
+20132 19587 20131
+20449 20127 20448
+19797 19796 20127
+20130 20129 20247
+19925 20128 20129
+20451 20130 20247
+20131 19800 20130
+20133 20134 19927
+20134 19928 19927
+20134 19929 19928
+19928 19929 19802
+20454 20546 20547
+20134 20135 19929
+20548 20715 20549
+19803 20136 19930
+20454 20453 20546
+20460 20140 20459
+19935 19482 19934
+20554 20555 20252
+20142 19808 20141
+20252 20142 20141
+20462 20463 20143
+20140 19936 19807
+20141 19808 19936
+19803 19931 19804
+19930 20136 19931
+20138 20139 19933
+20138 20458 20139
+19933 19806 19932
+19591 19479 19804
+19935 19934 20140
+19482 19806 19934
+19807 19935 20140
+19934 19806 19933
+19594 19481 19805
+19481 19593 19805
+19179 19000 19178
+19482 19594 19806
+19482 19296 19594
+19479 19292 19291
+19475 19802 19590
+19929 20136 19803
+19805 19592 20137
+19180 19295 19181
+19590 19802 19803
+19589 19588 19802
+19927 19801 19472
+19927 19928 19801
+19801 19588 19472
+19801 19928 19588
+19588 19473 19472
+19588 19589 19474
+19477 19590 19803
+19177 18999 19176
+19592 19479 19591
+19592 19293 19479
+19803 19478 19477
+19804 19479 19478
+19176 19289 19290
+19473 19588 19474
+19802 19475 19589
+19590 19477 19476
+19590 19476 19475
+19477 18999 19476
+19474 19289 19473
+19474 19290 19289
+19475 19177 19290
+19476 18999 19177
+19179 19178 19292
+19000 18905 19178
+18904 19291 19178
+19478 19479 19291
+19480 19294 19293
+19479 19293 19179
+19293 19294 19180
+19593 19481 19294
+19179 19180 19000
+19294 19295 19180
+18906 19181 19001
+18906 18731 19181
+19004 19003 19184
+19182 19296 19482
+19181 19481 19296
+19595 19299 19298
+19184 19003 19183
+19183 19299 19184
+19298 19002 19182
+19179 19293 19180
+19480 19593 19294
+19183 19002 19298
+19182 19482 19297
+19592 19480 19293
+19592 19593 19480
+19183 19298 19299
+19297 19807 19595
+19809 19595 19808
+19298 19297 19595
+19596 19940 19812
+19485 19598 19944
+19597 19300 19483
+19599 19818 19600
+19811 19596 19810
+19483 19185 19004
+19949 19599 19817
+19486 19301 19599
+19485 19484 19598
+19300 19185 19483
+19597 19483 19596
+19597 19484 19300
+19186 19300 19484
+19186 19185 19300
+19487 19301 19486
+19489 19490 19302
+19814 19485 19944
+19186 19484 19485
+19600 19486 19599
+19600 19601 19487
+19603 19490 19489
+19604 19303 19490
+19490 19303 19302
+19304 19305 19303
+19491 19604 19492
+19491 19304 19303
+19491 19305 19304
+19491 19492 19305
+20152 19604 19822
+19491 19303 19604
+19819 19488 19601
+19488 19301 19487
+19601 19488 19487
+19602 19489 19488
+19820 19602 19488
+19820 19821 19602
+19953 19603 19821
+19604 19490 19603
+19953 19822 19603
+20151 20152 19822
+19952 19953 19821
+20150 20151 19953
+20146 20147 19819
+20148 19820 19951
+19820 19952 19821
+20260 20466 20261
+20255 20146 19950
+19819 19818 19950
+19947 19815 19946
+19816 19599 19815
+19599 19816 19817
+19815 19947 19816
+19945 19814 19944
+19937 19938 19810
+19939 19596 19811
+19813 19943 19598
+20144 19944 19943
+19940 19941 19812
+20143 20144 19942
+19941 19942 19813
+19941 20143 19942
+19810 19938 19811
+19809 19937 19810
+19938 19939 19811
+20142 19938 19937
+20722 20794 20991
+20462 20143 19940
+20253 20144 20143
+19816 19947 19948
+19948 20145 19949
+19948 20464 20145
+20257 20146 20256
+19950 20145 20255
+20465 20259 20258
+20150 20149 20261
+19952 20148 20149
+20154 20264 20561
+20151 20150 20262
+19953 20149 20150
+20153 20264 20154
+20150 20261 20262
+20149 20148 20260
+20149 20260 20261
+20258 20147 20257
+20728 20729 20465
+20729 20467 20466
+20153 20263 20264
+20154 20561 20155
+20264 20730 20561
+21360 21087 21267
+20728 20465 20560
+20466 20260 20465
+20257 20256 20727
+21263 21563 21264
+21085 21264 20998
+21564 21644 21565
+20796 20995 20725
+21082 21083 20797
+20725 20558 20796
+20144 20253 20558
+20994 20995 20796
+20726 20559 20725
+20726 20464 20559
+20254 20145 20464
+20560 20257 20727
+20146 20255 20256
+20260 20259 20465
+20148 19951 20259
+20258 20257 20560
+20147 20146 20257
+20465 20258 20560
+20259 20147 20258
+19938 20462 19939
+20557 20723 20724
+20555 20556 20462
+20723 20795 20724
+20143 20463 20253
+20462 20556 20463
+20142 20252 20555
+20140 20460 20141
+20553 20721 20554
+20461 20252 20141
+20461 20554 20252
+20250 20456 20137
+20551 20251 20456
+20549 20550 20455
+19931 20250 19804
+20455 20456 20250
+20551 20457 20251
+21252 21555 21355
+20139 20458 20459
+20457 20717 20718
+20792 20720 20459
+20553 20461 20460
+20457 20718 20458
+20719 20987 20552
+20716 20550 20549
+20716 20455 20550
+20551 20455 20716
+20551 20717 20457
+20551 20716 20717
+20458 20718 20719
+20717 20984 20985
+20458 20719 20552
+21073 20987 21254
+20460 20720 20553
+20720 20988 20989
+20554 20721 20793
+20553 20720 20721
+20555 20554 20794
+20461 20553 20554
+20558 20557 20724
+20463 20556 20557
+20555 20722 20556
+20555 20794 20722
+20722 20723 20556
+20722 20992 20723
+20558 20993 20796
+21079 21260 20993
+20993 20994 20796
+20993 21260 21080
+20554 20990 20794
+20990 21257 21078
+20990 20991 20794
+21078 20992 20991
+20723 20992 20795
+21078 21258 20992
+20721 20720 20793
+20718 20791 20719
+20718 20717 20985
+21806 21557 21805
+21069 20984 21251
+20717 20716 20984
+20987 20988 20792
+21073 21255 21074
+20720 20989 20793
+20988 21073 20989
+20719 21071 20987
+21354 20986 20985
+20986 20718 20985
+20791 20986 21070
+20791 20718 20986
+20985 20984 21069
+21355 21071 21253
+21071 20719 20791
+21355 21556 21254
+21072 20987 21071
+20793 21074 21075
+20989 21073 21074
+20987 21073 20988
+20987 21072 21254
+20793 21075 21076
+21256 21255 21558
+20995 20994 21080
+20994 20993 21080
+21075 21074 21256
+20990 21077 21257
+21081 21261 21262
+21080 21260 21261
+21081 21262 21082
+20799 21085 20998
+21563 21644 21564
+21357 21265 21356
+20998 21264 21265
+20797 20995 21082
+21080 21261 21081
+20996 21083 21084
+21082 21262 21083
+21083 21263 21084
+21082 20995 21081
+20797 20725 20995
+21084 21263 20996
+20999 20998 21265
+20728 20727 20998
+20798 20997 20799
+20798 20996 20997
+20996 21085 20997
+20996 21263 21085
+21086 21000 20729
+20998 20999 20728
+21357 21358 20999
+21001 20801 21000
+20803 21002 21090
+21086 21001 21000
+21267 21087 20802
+21269 21089 21268
+20803 21090 21269
+21002 21089 21090
+21268 21088 21360
+21360 21088 21087
+21568 21266 21358
+21568 21646 21647
+21266 21647 21648
+21359 21360 21267
+21360 21571 21361
+21650 21649 21817
+21570 21650 21651
+21649 21816 21817
+21266 21569 21086
+21649 21650 21569
+21360 21570 21571
+21359 21650 21570
+21265 21565 21356
+21644 22095 21882
+21261 21561 21262
+21261 21260 21561
+21265 21564 21565
+21264 21563 21564
+21642 21563 21562
+21563 21263 21562
+21645 21566 21813
+21357 21356 21566
+21645 21567 21566
+21568 21358 21567
+21647 21646 21814
+21568 21567 21645
+21563 21643 21644
+21642 21562 21641
+21883 21645 21813
+21646 21568 21645
+22092 22317 22166
+21562 21561 21811
+21811 21641 21562
+21563 21642 21643
+21641 21881 21642
+22098 21814 22097
+21646 21645 21814
+21884 21647 21814
+21266 21568 21647
+21569 21648 21816
+21569 21266 21648
+21571 21651 21361
+21571 21570 21651
+21648 21815 21816
+21648 21647 21815
+21651 21650 21817
+21815 21884 21816
+21815 21647 21884
+22098 22097 22169
+21883 21882 22097
+22099 22098 22169
+21884 21814 22098
+22320 22321 22097
+22619 22751 22620
+21884 22098 22099
+22579 22381 22380
+22321 22322 22169
+22321 22379 22322
+22751 22989 22620
+23025 23143 23195
+22321 22577 22379
+22749 22576 22748
+22620 22578 22619
+22380 22322 22379
+22619 22578 22379
+22620 22579 22578
+22093 22167 22094
+22319 22095 22167
+22379 22577 22619
+22320 22576 22577
+22799 22618 22749
+22750 22619 22618
+22092 22165 22317
+21811 22091 22164
+22319 22318 22576
+22166 22317 22318
+22090 22315 22091
+22316 22317 22164
+22164 22165 21811
+22164 22317 22165
+22093 22092 22166
+21881 21641 22092
+21814 21883 22097
+21813 21882 21883
+22095 21812 22094
+21644 21643 21812
+21565 21882 21813
+21565 21644 21882
+22163 22164 22091
+21809 21808 21880
+22086 22161 22310
+21880 22087 22088
+21810 21809 22089
+22573 22574 22315
+22316 22575 22317
+22315 22574 22316
+22163 22316 22164
+22313 22087 22162
+22088 22087 22313
+22091 22315 22163
+22310 22378 22570
+22309 22160 22308
+22313 22571 22572
+22311 22570 22571
+22378 22569 22570
+22308 22307 22568
+22308 22568 22569
+22307 22306 22568
+22378 22309 22569
+22378 22310 22309
+22311 22571 22312
+21807 22162 22087
+22312 22571 22313
+22088 22313 22314
+22162 22312 22313
+21879 22086 22311
+21354 21252 20986
+21804 22085 21878
+22160 22161 22085
+22161 21878 22085
+21253 21071 21070
+21554 21803 21555
+21554 21553 21803
+21353 21553 21251
+21251 21554 21069
+21251 21553 21554
+22085 21804 21803
+21804 21805 21556
+21803 21804 21555
+21878 21879 21804
+22312 21879 22311
+21805 21804 21879
+21557 21556 21805
+21805 21879 21806
+21808 21807 22087
+21640 21806 21807
+22088 21809 21880
+21256 21074 21255
+21559 21809 21810
+21257 21077 21076
+21804 21556 21555
+21557 21806 21640
+21808 21558 21807
+21254 21072 21071
+21558 21557 21640
+21255 21073 21254
+21807 21558 21640
+21257 21076 21256
+20992 21258 21259
+21078 21257 21258
+21076 21075 21256
+21559 21257 21256
+21559 21258 21257
+21557 21254 21556
+21557 21255 21254
+21252 21253 21070
+21555 21556 21355
+21071 21355 21254
+21253 21252 21355
+21250 21249 21552
+21554 21555 21354
+20986 21252 21070
+21354 21555 21252
+21549 21550 21244
+21251 21250 21353
+21248 21068 21067
+21548 21242 21241
+21243 21549 21244
+21540 21351 21350
+21238 21239 20972
+21540 21541 21351
+21541 21542 21239
+21352 21541 21239
+21800 22075 21801
+20445 20446 20125
+21351 21541 21352
+21798 21540 21539
+21539 21540 21350
+21800 21799 21877
+21801 21544 21800
+21545 21544 21801
+22306 22567 22568
+21552 21802 21553
+22159 22306 22084
+22308 22084 22307
+21802 22083 22084
+22083 22159 22084
+22083 22082 22304
+22305 22304 22377
+22159 22305 22306
+22159 22083 22305
+22566 22377 22304
+22567 22377 22566
+21800 22074 22075
+22303 22556 22557
+22073 22074 21877
+22303 22073 22072
+21796 21795 22064
+21876 21795 22157
+21794 21793 21875
+22375 22546 22547
+22157 22300 22376
+22157 22299 22300
+22301 22302 22064
+22376 22301 22158
+22376 22548 22301
+22547 22548 22376
+22300 22547 22376
+22375 22374 22546
+22546 22545 22740
+22299 22375 22547
+22299 22374 22375
+22544 22617 22545
+22374 22544 22545
+23351 23419 23524
+22547 22546 22741
+22374 22545 22546
+23185 23349 23417
+23521 23579 23580
+23519 23518 23745
+23347 23742 23743
+23349 23121 23520
+22956 23122 23021
+23521 23349 23520
+22540 22954 22955
+23185 23417 23350
+23349 23521 23417
+23827 23749 23927
+23350 23417 23418
+23418 23124 23350
+22372 22373 22297
+23519 23348 23518
+23122 23349 23185
+23518 23348 23347
+23519 23520 23348
+23349 23122 23121
+23185 23186 23123
+22955 23121 22956
+23348 23520 23121
+23185 23021 23122
+22062 22298 22737
+23123 23022 23021
+23123 23124 23022
+23185 23123 23021
+23186 23124 23123
+23186 23350 23124
+22063 21876 22157
+22063 22064 21876
+21876 22064 21795
+21797 21534 21796
+21349 21533 21534
+21065 21234 20966
+21234 21065 21233
+21064 20964 21349
+22541 22955 22956
+22957 23124 22737
+23022 22957 23021
+23022 23124 22957
+21795 21796 21639
+22957 22956 23021
+22956 22737 22542
+22953 22538 22952
+23120 23347 22954
+22737 22543 22542
+22954 23347 22955
+22056 22057 21526
+21534 21233 21349
+21065 20965 21064
+20789 20965 20704
+21064 21233 21065
+22542 22541 22956
+22057 21527 21526
+22372 22542 22543
+22057 22058 21527
+22295 22057 22541
+21225 21525 20957
+22373 22372 22543
+22296 22058 22295
+22737 22298 22543
+22058 21789 21528
+22298 22297 22373
+22298 22156 22155
+22543 22298 22373
+21873 21791 21790
+20965 20789 20964
+20706 20790 20966
+20705 20543 20704
+20706 20544 20790
+20790 20544 20705
+20545 20439 20708
+20708 20969 20970
+21350 21238 21237
+20440 20118 20439
+21534 21234 21233
+20966 20790 21065
+21235 20966 21234
+21237 21236 21539
+20971 21238 20972
+21351 21352 21238
+21239 21240 20972
+21239 21542 21240
+21549 21242 21548
+21243 20979 21242
+21548 21241 21547
+21244 21550 21245
+21246 21247 21066
+21246 21551 21247
+21353 21250 21552
+20983 21068 21248
+20984 21250 21251
+21552 21248 21551
+21249 20983 21248
+21245 21550 21246
+21067 21066 21247
+21067 20981 21066
+21244 20979 21243
+21245 20980 21244
+21245 21246 20980
+20713 20982 20714
+21067 21068 20982
+20716 20549 20715
+20546 20713 20714
+20712 20981 20713
+21241 21242 20978
+20122 20443 20444
+21237 21238 20971
+20710 20441 20709
+20439 20438 20708
+20709 20440 20545
+20442 20443 20121
+20119 20118 20246
+20715 20547 20714
+20453 20713 20546
+20249 20547 20548
+20546 20714 20547
+20249 20548 20136
+20547 20715 20548
+20123 20445 20124
+20452 20451 20712
+20247 20450 20451
+20248 20451 20452
+20134 20453 20135
+20135 20249 20136
+20135 20453 20454
+20130 20248 20131
+20452 20132 20248
+20249 20454 20547
+20249 20135 20454
+20125 20446 20126
+20449 20450 20128
+20711 20451 20450
+20545 20440 20439
+20246 20118 20440
+20441 20246 20440
+20441 20119 20246
+20444 20123 20122
+20115 20114 20244
+19783 19921 20114
+20245 20116 20115
+21637 21793 21638
+20433 20243 20543
+20244 20114 20243
+20244 20434 20115
+20706 20707 20435
+20433 20705 20434
+20706 20435 20544
+20245 20435 20116
+20245 20544 20435
+20433 20434 20244
+20544 20245 20434
+21638 21793 21794
+20243 20433 20244
+20543 20705 20433
+22062 22061 22156
+22062 21791 21873
+22060 22156 22061
+22060 21789 22059
+22298 22062 22156
+21874 21791 22062
+22542 22295 22541
+22372 22297 22296
+22542 22296 22295
+22297 22155 22059
+22059 22155 22060
+22297 22298 22155
+21527 22058 21528
+22296 22297 22058
+22058 22059 21789
+22058 22297 22059
+21873 22060 22061
+21790 21789 22060
+22060 21873 21790
+22061 22062 21873
+22541 22056 22540
+21526 21226 21525
+22541 22057 22056
+22295 22058 22057
+18711 18712 18594
+18711 18868 18712
+19142 18868 18972
+18711 18710 18868
+19264 19142 18972
+19143 19265 19266
+19438 19768 19769
+19265 19440 19266
+18713 18869 18870
+18712 18868 19143
+19439 19143 19142
+19266 18973 19143
+19264 19438 19142
+19769 19770 19439
+19439 19265 19143
+19439 19440 19265
+19437 19578 19768
+20102 20103 19768
+19141 19264 18972
+19140 18969 19263
+19142 19438 19439
+19437 19436 19578
+19141 19140 19436
+19436 19435 19767
+19913 19578 19767
+19768 19438 19437
+19264 19437 19438
+19264 19141 19437
+20101 19767 19912
+19767 19578 19436
+19577 19435 19263
+19766 19767 19435
+19911 19912 19766
+19913 19768 19578
+19577 19263 19434
+19435 19140 19263
+18969 19140 18970
+19435 19436 19140
+18867 19141 18972
+18971 19140 19141
+18971 18867 18866
+18972 18710 18867
+19140 18971 18970
+19141 18867 18971
+19261 19262 19138
+19139 19434 19263
+19260 19261 19138
+19433 19434 19262
+19262 19139 19138
+19263 18969 19139
+19572 19573 19430
+19572 19907 19760
+19763 19432 19762
+19433 19262 19261
+19432 19261 19260
+19432 19433 19261
+19756 19568 19567
+19757 19569 19568
+20418 20687 20688
+20092 19754 19753
+19567 19753 19754
+19758 19570 19569
+19758 19759 19570
+19573 19574 19430
+19573 19572 19760
+19567 19755 19756
+19567 19754 19755
+19570 19759 19571
+19758 20095 19759
+19756 19904 20093
+19755 19754 19904
+19905 20094 19757
+20095 19758 19906
+20097 19760 20096
+19574 19573 19760
+20097 19761 19760
+19762 19575 19761
+19761 19575 19431
+19762 19432 19575
+19908 19763 19762
+19908 19909 19763
+19909 19576 19763
+19764 19433 19576
+19910 19765 19764
+19766 19577 19765
+19765 19577 19434
+19766 19435 19577
+20422 20097 20692
+19760 19907 20096
+20097 20421 20692
+20095 20691 20421
+20947 20691 20420
+20949 20421 20691
+20947 20420 20690
+20691 20095 20420
+20093 20094 19905
+20420 20095 20094
+20093 20092 20419
+19904 19754 20092
+20688 20419 20091
+20092 19753 20091
+20418 20688 20091
+20690 20093 20419
+20689 20688 20946
+21213 21338 21339
+20945 20688 20687
+20945 20946 20688
+20690 20689 20946
+20419 20688 20689
+20946 21215 20690
+22289 22531 22046
+21055 21213 21056
+20944 20687 20686
+20687 20944 20945
+20944 20943 21211
+20946 21214 21215
+20946 21056 21214
+21781 21515 21514
+20947 20690 21215
+21517 21216 21516
+21058 20949 21057
+21217 21057 21216
+20949 20691 20948
+21216 20948 20947
+21057 20949 20948
+21217 21058 21057
+21059 20950 20949
+21217 21059 21058
+21061 21219 20951
+21217 21218 21059
+21517 22048 22049
+21219 21061 21218
+20950 21059 21060
+21060 21061 20950
+21060 21218 21061
+20950 20951 20692
+21219 21220 20951
+21519 21220 21782
+20952 20951 21220
+20424 20101 20423
+19911 19765 19910
+20098 20422 20099
+20692 20951 20422
+20423 20099 20422
+20423 20100 20099
+19762 20098 19908
+19762 19761 20098
+20421 20097 20096
+20422 20098 20097
+20099 19909 19908
+20099 20100 19910
+20099 19910 19909
+20100 19911 19910
+19912 19911 20100
+19766 19765 19911
+20423 20101 20100
+19767 19766 19912
+20952 20953 20423
+20954 20955 20693
+20100 20101 19912
+20424 20102 20101
+20101 19913 19767
+20101 20102 19913
+19439 19770 19440
+20425 20426 19770
+20953 20693 20424
+20694 20425 20103
+20424 20103 20102
+20425 19770 20103
+20694 20695 20425
+20957 20696 20695
+20955 20694 20693
+20955 20956 20694
+21224 21225 20955
+20957 20695 20956
+21222 21340 21341
+21223 20954 20953
+21226 20957 21525
+20955 20954 21224
+20955 21225 20956
+22056 21525 22055
+21224 21524 21225
+21224 21223 21342
+21787 21788 21524
+22056 21526 21525
+21636 21786 21787
+21342 21223 21341
+21222 21341 21223
+21341 21636 21342
+21523 21636 21341
+21524 21224 21342
+20952 21221 20953
+21522 21635 21523
+21220 21519 20952
+21521 21522 21222
+21221 21222 20953
+21221 21521 21222
+22051 21784 21783
+21221 20952 21519
+21784 21520 21519
+21521 21221 21520
+21222 21522 21340
+21521 21635 21522
+22053 21785 22052
+21635 21521 21785
+21783 21782 22050
+21518 21218 21517
+22293 22052 22051
+21785 21520 21784
+22294 22293 22537
+22051 22050 22292
+22294 22052 22293
+21785 21784 22052
+21785 22053 21786
+22294 22054 22053
+21523 21786 21636
+22294 22537 22538
+21785 21786 21635
+22053 22054 21786
+21342 21636 21524
+21786 22054 21787
+21636 21787 21524
+22054 21788 21787
+21525 21788 22055
+21525 21225 21788
+22056 22055 22540
+21788 22054 22055
+22953 22539 22538
+22953 22954 22539
+22949 23019 23114
+22950 23116 23117
+22736 22538 22537
+22539 22054 22538
+22736 22951 22952
+23117 23118 22951
+22536 22736 22537
+22535 22291 22290
+22736 22952 22538
+22951 23118 22952
+23346 22953 23119
+23120 22954 22953
+23346 23345 23741
+23118 23117 23345
+22953 23346 23120
+23119 23345 23346
+22950 23117 22951
+23116 23344 23117
+22536 22292 22535
+23114 23115 23020
+23116 22950 23020
+22951 22736 22950
+23114 23184 23115
+23114 23183 23343
+23344 23517 23740
+23343 23183 23342
+23342 23516 23517
+23517 23344 23343
+23515 23577 23416
+23739 23517 23516
+23112 23342 23183
+23182 23416 23342
+23114 23019 23113
+22948 22947 23112
+23113 23019 23112
+22535 22290 22734
+23112 23019 22948
+23114 23020 22949
+22736 22735 22950
+22948 23019 22949
+22293 22292 22536
+22293 22051 22292
+22949 22735 22948
+22735 22536 22535
+22948 22735 22535
+22949 22950 22735
+22733 22792 22946
+23110 23109 23339
+22733 22534 22732
+22730 22532 22942
+23181 23110 23339
+22946 23018 23110
+23110 23181 23111
+23341 23415 23515
+23339 23340 23181
+23339 23513 23340
+23111 23341 23182
+23340 23415 23341
+23577 23515 23738
+23416 23341 23515
+23739 23577 23738
+23739 23516 23577
+23514 23576 23515
+23737 23738 23576
+23340 23513 23415
+23512 23575 23513
+23415 23514 23515
+23415 23513 23514
+22792 22945 22946
+23109 23110 23018
+22942 23336 23337
+23338 23339 23109
+23513 23414 23512
+23339 23338 23414
+23735 23511 23337
+23512 23414 23511
+23733 23336 23335
+23337 23338 23109
+23734 23735 23336
+23511 23338 23337
+22729 22941 22942
+22940 23108 22941
+22729 22942 22532
+22941 23336 22942
+23018 22944 23109
+22731 22730 22943
+22791 22790 22944
+22945 23018 22946
+22732 22731 22790
+22943 23109 22944
+22791 22945 22792
+22944 23018 22945
+22531 22728 22729
+22789 22940 22941
+22615 22727 22728
+22615 22530 22726
+22047 21781 22046
+22726 22529 22939
+22790 22731 22943
+22533 22532 22730
+22531 22729 22532
+22728 22941 22729
+22943 22730 22942
+22731 22533 22730
+22944 22790 22943
+22944 22945 22791
+22733 22732 22792
+22732 22790 22791
+22948 22734 22947
+22290 22534 22734
+22049 22534 22290
+22533 22731 22732
+22792 22732 22791
+22534 22048 22533
+22947 22733 22946
+22734 22534 22733
+21214 21514 21515
+22532 22533 22047
+22534 22533 22732
+22048 22047 22533
+22534 22049 22048
+22290 21782 22049
+21782 21518 22049
+21219 21218 21518
+22048 21516 22047
+21216 20947 21516
+21217 21517 21218
+21217 21216 21517
+21513 21514 21339
+21515 21516 21215
+21780 22046 21781
+22047 21516 21781
+21214 21515 21215
+21781 21516 21515
+22728 22531 22615
+22532 22047 22046
+21779 22046 21780
+22531 22532 22046
+21513 21780 21514
+21513 21779 21780
+21512 21779 21513
+22045 22044 22154
+21779 22289 22046
+22288 22529 22530
+22288 22045 22154
+22288 22289 22045
+22044 22045 21872
+22289 21779 22045
+22045 21778 21872
+21512 21210 21777
+21510 22042 21511
+22043 21872 21777
+22285 22286 22042
+22043 22044 21872
+22286 22287 22042
+22154 22044 22043
+22524 22934 22525
+22526 22527 22040
+22041 22285 22042
+22528 22527 22938
+22154 22287 22288
+22286 22528 22287
+22040 22527 22041
+23107 22937 23106
+22527 22526 22725
+21506 21507 21335
+22041 22527 22285
+23180 23105 23179
+22725 22936 22937
+22725 22526 22935
+22725 22937 22527
+22936 23105 23106
+23333 22938 23107
+22528 22285 22527
+22726 22530 22529
+22529 22528 22939
+22939 22528 22938
+22286 22285 22528
+22287 22529 22288
+22287 22528 22529
+22531 22530 22615
+22289 22288 22530
+22789 22726 22940
+22727 22615 22726
+22728 22789 22941
+22727 22726 22789
+22939 23108 22940
+23510 23335 23108
+23180 23106 23105
+23107 22938 22937
+23332 23107 23106
+23332 23506 23107
+23505 23332 23413
+23506 23333 23107
+23508 23334 23333
+23334 22938 23333
+23108 23334 23510
+23108 22939 23334
+23730 23731 23507
+23509 23732 23510
+23507 23731 23508
+23731 23919 23732
+23731 23732 23508
+23510 23334 23509
+23916 23730 23506
+23918 23731 23730
+23916 23506 23729
+23730 23507 23506
+23505 23506 23332
+23505 23729 23506
+23504 23330 23329
+23413 23331 23330
+23106 23180 23332
+23179 23330 23331
+24129 23729 23728
+23916 23917 23730
+23727 23574 23573
+23728 23503 23574
+23328 23329 23177
+23503 23504 23329
+23728 23504 23503
+23729 23505 23504
+23175 23328 23176
+23502 23574 23503
+23330 23178 23329
+23330 23179 23178
+23331 23180 23179
+23331 23332 23180
+22725 22935 22936
+22935 22934 23103
+23328 23177 23176
+22935 22526 22525
+23176 23177 23103
+23329 23104 23177
+23500 23101 23326
+23327 23102 23101
+23101 23100 23326
+23016 23015 23099
+23497 23412 23325
+23498 23571 23499
+23326 23174 23412
+23099 23015 23098
+23102 23175 23176
+23102 23327 23175
+23327 23502 23328
+23573 23574 23502
+23725 23726 23500
+23727 23573 23572
+23726 23727 23572
+23915 23728 23727
+24125 24126 23725
+23915 23727 23726
+23412 23499 23326
+23571 23570 23724
+23726 23501 23500
+23572 23502 23501
+23412 23498 23499
+23412 23497 23498
+23569 23724 23570
+24126 24297 24298
+23499 23571 23725
+23498 23497 23571
+23324 23495 23496
+24294 24525 24295
+23722 23495 23323
+23723 23496 23495
+23723 23569 23496
+23723 23724 23569
+23497 23325 23324
+23325 23099 23173
+23496 23497 23324
+23570 23571 23497
+23099 23325 23174
+23173 23324 23325
+23100 23017 23174
+23017 22933 22932
+23323 23096 22930
+23324 23173 23097
+23324 23097 23096
+23098 23015 23097
+22932 22931 23015
+23096 23097 22931
+22522 22722 22523
+22930 23096 22722
+22724 22723 22932
+22722 22931 22723
+22038 22037 22524
+21774 21634 21773
+23173 23098 23097
+23173 23099 23098
+23174 23017 23099
+22932 22723 22931
+23099 23017 23016
+22724 22523 22723
+23016 23017 22932
+23100 22933 23017
+22525 22934 22935
+22933 23101 22934
+22040 22039 22526
+21775 21505 21504
+22933 22724 22932
+22933 22934 22524
+22039 22038 22525
+22037 21774 21773
+21504 21774 21775
+22523 22037 22036
+22525 22038 22524
+21776 21506 21775
+22526 22039 22525
+21508 21208 21207
+22039 21776 22038
+22039 21508 21776
+21333 21504 21505
+21332 21503 21634
+22037 21775 21774
+22038 21776 21775
+21504 21634 21774
+22036 21771 22035
+22036 21773 21772
+21634 21503 21773
+22524 22037 22523
+22038 21775 22037
+21633 21632 21772
+21632 21631 21772
+21773 21633 21772
+21631 21332 21630
+21503 21633 21773
+21503 21632 21633
+21203 21333 21505
+21201 21504 21333
+21204 21506 21335
+21505 21775 21506
+21506 21334 21505
+21204 21051 21334
+21050 20935 21202
+21050 21202 21203
+21201 21333 21202
+21333 21203 21202
+21334 21051 21203
+20935 20936 20785
+20237 20079 20078
+21051 20935 21050
+20679 20412 20411
+20411 20238 20677
+21204 20936 21051
+20785 20936 20677
+21204 21335 21205
+20678 20677 20937
+20936 21204 21052
+20936 20937 20677
+20936 21052 20937
+21205 21206 21052
+21510 21509 22041
+20937 21053 20938
+20938 20939 20680
+21336 21508 21207
+20938 20679 20678
+21207 21208 20938
+20680 20679 20938
+20939 21208 21509
+20938 21053 21207
+21336 21207 21206
+21053 21052 21206
+21206 21207 21053
+21206 21507 21336
+21204 21205 21052
+21335 21206 21205
+21776 21508 21507
+21508 22040 21509
+21507 21508 21336
+22039 22040 21508
+20940 20939 21510
+21509 22040 22041
+21209 20940 21510
+21208 21508 21509
+21510 20939 21509
+20413 20680 20939
+20941 20940 21209
+20681 20413 20939
+20942 20941 21209
+20684 20539 20415
+21511 20942 21209
+21210 20943 20942
+21779 21512 21778
+21513 21338 21337
+21512 21211 21210
+21213 21055 21054
+21213 21212 21338
+21211 21512 21337
+21212 21054 20944
+21055 20945 21054
+21212 20944 21211
+21054 20945 20944
+21337 21212 21211
+21337 21338 21212
+20415 20539 20416
+20538 20683 20684
+20539 20685 20416
+20539 20787 20685
+20417 20686 20687
+20685 20943 20686
+20088 19901 20087
+20087 20416 20417
+20415 20416 20087
+20685 20686 20416
+20240 20089 20088
+20416 20686 20417
+20684 20415 20538
+19899 19749 19748
+20786 20683 20682
+20941 20787 20684
+20786 20684 20683
+20787 20539 20684
+20941 20786 20940
+20941 20684 20786
+20786 20682 20940
+20682 20414 20681
+20940 20682 20681
+20683 20538 20682
+20415 20086 20414
+19747 19428 19427
+20681 20084 20413
+19898 19899 19748
+19751 19901 19902
+20087 20417 20088
+20084 20414 20085
+20682 20538 20414
+20414 20086 20085
+20087 19901 19751
+20090 20089 20240
+20090 19753 19752
+20418 20090 20240
+19903 19902 20088
+20091 20090 20418
+20091 19753 20090
+20090 19903 20089
+18865 18709 18708
+20240 20088 20417
+20089 19903 20088
+19751 19902 19752
+19901 20088 19902
+20086 19899 20085
+20086 19900 19750
+19751 19900 20087
+19750 19899 20086
+19903 19752 19902
+19566 19750 19751
+19751 19750 19900
+19565 19749 19750
+19565 19566 19429
+19565 19750 19566
+19135 18858 18964
+18965 19136 19137
+19747 19746 20083
+19898 19748 19747
+19749 19564 19748
+20085 19898 20084
+20085 19899 19898
+19136 18858 19135
+18860 18965 19137
+18860 18859 18965
+18701 18859 18860
+18584 18583 18859
+18699 18700 18582
+18699 18857 18700
+19134 18964 18963
+18858 19136 18859
+19133 19134 18963
+19259 19426 19135
+19134 19135 18964
+19427 19428 19136
+19426 19427 19135
+19428 19137 19136
+19135 19427 19136
+19426 19746 19747
+20084 20083 20413
+20084 19747 20083
+19428 19747 19748
+19427 19426 19747
+19745 19563 19562
+19746 19426 19563
+19258 19425 19259
+19424 19562 19425
+19258 19259 19134
+19425 19426 19259
+20412 20082 20081
+20083 19746 20082
+19897 20080 20081
+20081 20082 19744
+20080 20239 20081
+20239 20238 20411
+20678 20411 20677
+20678 20679 20411
+20411 20412 20239
+20081 20239 20412
+20080 20238 20239
+20238 20080 19897
+20081 19744 19897
+19562 19424 19561
+19744 19745 19562
+20082 19746 19745
+19561 19424 19258
+19744 19561 19897
+19744 19562 19561
+19561 19258 19133
+17636 17637 17569
+17569 17570 17465
+17419 17466 17420
+17465 17570 17571
+17418 17465 17466
+17417 17569 17465
+17820 17754 17819
+17637 17571 17570
+17753 17817 17818
+17753 17752 17817
+17818 17754 17753
+17467 17466 17572
+17466 17571 17572
+17466 17465 17571
+17753 17637 17636
+17572 17571 17637
+17308 17418 17419
+17417 17465 17418
+17309 17308 17420
+17250 17151 17150
+17308 17419 17420
+17418 17466 17419
+17096 17150 17151
+17095 16976 16975
+17095 16975 17094
+17148 17248 17306
+17250 17249 17308
+17149 17307 17249
+17307 17148 17306
+17092 17247 17248
+17246 17304 17247
+17415 17416 17304
+17247 17305 17248
+17416 17306 17305
+17567 17634 17568
+17567 17568 17464
+17304 17246 17303
+17147 17090 17245
+17092 17091 17247
+17245 17303 17246
+17247 17147 17246
+16972 16913 16912
+17247 17091 17147
+17092 16915 17091
+17245 17090 17146
+16812 16758 16757
+17146 17090 17089
+17147 17091 16972
+17089 17090 16971
+17090 16912 16971
+16812 16757 16641
+16971 16912 16911
+17090 16972 16912
+16915 16914 17091
+16761 16814 16815
+17147 16972 17090
+17091 16914 16972
+17093 16973 17092
+16916 16814 16760
+16975 16976 16917
+16916 16915 16973
+17093 16974 16973
+16370 16371 16000
+16974 16917 16815
+16569 16570 16372
+16816 16815 16917
+16762 16761 16815
+16918 16816 16917
+16815 16814 16974
+16764 16763 16817
+16762 16815 16816
+16918 16976 16977
+16917 16974 16975
+16973 16974 16916
+17093 17148 17094
+17093 17094 16974
+17149 17150 17095
+17093 17248 17148
+17095 17094 17149
+16975 16974 17094
+17096 17095 17150
+17096 16976 17095
+17927 17928 17818
+17817 17927 17818
+17928 17820 17819
+17928 17988 18119
+17573 17638 17754
+17638 17753 17754
+17755 17573 17754
+17573 17572 17638
+17421 17573 17574
+17467 17572 17573
+17250 17309 17251
+17420 17467 17421
+16919 16918 16977
+16817 16763 16918
+17097 17152 17251
+17097 17096 17152
+16920 16817 16919
+16763 16646 16645
+17422 17421 17574
+17251 17309 17421
+17252 17098 17097
+16817 16918 16919
+17253 17098 17252
+17099 16978 17098
+17097 16920 16919
+17098 16921 16920
+16921 16818 16920
+16766 16765 16818
+16979 16922 16978
+16979 16980 16922
+17253 17422 17423
+17252 17421 17422
+17422 17253 17252
+16978 16921 17098
+17931 17756 17930
+17757 17422 17756
+17820 17755 17754
+17756 17574 17755
+17755 17822 17756
+17821 17929 17822
+17755 17821 17822
+17755 17820 17821
+17930 17929 18120
+17821 17820 17929
+17931 17930 18121
+17822 17929 17930
+18119 18181 18120
+18323 18413 18324
+18180 18179 18323
+18325 18324 18587
+18181 18323 18324
+18323 18181 18180
+18119 18180 18181
+18118 18179 18180
+18180 18119 18118
+18120 17929 18119
+17820 17928 17929
+17819 17818 17928
+18115 17925 17816
+17985 17986 17925
+17988 17928 17927
+18115 17985 17925
+18115 18116 17985
+18116 18178 18117
+17986 17987 17925
+17985 18116 17986
+18582 18410 18699
+18319 18320 18177
+17986 18116 18117
+18115 18177 18116
+18699 18319 18177
+18410 18320 18319
+18699 18410 18319
+18582 18583 18410
+18700 18583 18582
+18700 18858 18583
+18410 18411 18320
+18583 18584 18411
+18584 18322 18411
+18322 18178 18321
+18411 18322 18321
+18585 18586 18413
+18412 18413 18323
+18703 18861 18862
+18412 18585 18413
+18584 18859 18701
+18967 18862 18861
+18862 18968 18863
+18704 18862 18863
+18703 18702 18861
+18968 18862 18967
+18586 18702 18703
+18324 18586 18587
+18585 18702 18586
+18704 18703 18862
+18587 18586 18703
+18122 17931 18121
+18122 18123 17757
+18121 18325 18326
+18121 18120 18325
+18864 18588 18863
+18587 18703 18704
+18588 18589 18327
+18590 18707 18591
+18326 18122 18121
+18123 17758 17757
+18325 18588 18326
+18589 18328 18327
+18328 18124 18123
+18591 18592 18329
+18327 18328 18123
+18708 18707 18865
+18589 18590 18328
+18589 18705 18590
+18591 18708 18709
+18707 18706 18865
+18326 18588 18327
+18704 18863 18588
+18591 18707 18708
+18590 18706 18707
+18865 18589 18864
+18705 18589 18865
+18706 18705 18865
+18706 18590 18705
+18592 18591 18709
+18328 18590 18591
+18593 18592 18709
+18329 18124 18328
+18414 18330 18329
+18330 18331 18125
+18592 18593 18414
+18331 18126 18125
+18415 18330 18414
+18592 18414 18329
+18593 18415 18414
+18416 18415 18593
+18416 18330 18415
+18331 18330 18416
+18416 18332 18331
+17989 17933 18128
+18126 18182 18127
+18329 18125 18124
+17426 17427 17103
+18183 18182 18332
+18183 18127 18182
+17763 17936 17823
+17938 17994 17939
+17825 17939 17940
+17826 17825 17940
+17764 17823 17938
+17936 17763 17935
+17824 17938 17939
+17937 17994 17938
+17935 17991 17992
+17990 17934 17989
+17934 17990 17991
+17761 17762 17428
+17935 17992 17993
+17991 18129 17992
+17989 18128 18129
+18127 18184 18128
+17990 18129 17991
+18128 18184 18129
+17990 17989 18129
+17934 17762 17933
+17938 17823 17937
+17764 17575 17763
+17107 17106 17429
+17429 17428 17762
+17826 17766 17825
+17430 17575 17765
+17765 17824 17939
+17765 17764 17824
+17827 17766 17826
+17576 17430 17765
+17767 17766 17827
+17767 17768 17639
+17767 17827 17768
+17578 17577 17639
+17469 17468 17579
+17767 17576 17766
+17577 17578 17431
+17579 17578 17640
+17431 17256 17108
+17433 17468 17469
+17310 17433 17469
+17256 17110 17109
+17310 17257 17433
+17310 17110 17257
+16446 16819 17110
+16580 16445 16579
+16819 16926 17110
+16926 16925 16981
+17110 16926 16981
+16819 16925 16926
+16777 16776 16925
+16776 16775 17107
+17468 17432 17578
+17468 17433 17432
+17108 17256 17109
+17432 17257 17256
+17576 17431 17430
+17576 17577 17431
+17429 17430 17107
+17430 17431 17108
+16776 17108 16925
+17107 17430 17108
+17428 17106 17105
+17107 16775 16774
+16769 17101 17102
+17760 18125 17932
+17426 17760 17427
+17105 16772 17104
+17103 17427 17104
+17932 18127 17933
+17104 17428 17105
+17427 17761 17428
+17430 17429 17575
+17106 17428 17429
+17764 17763 17823
+17429 17762 17763
+18128 17933 18127
+17989 17934 17933
+17937 17936 17994
+17937 17823 17936
+18126 17932 18125
+18126 18127 17932
+18125 17760 17759
+17932 17761 17760
+17933 17761 17932
+17933 17762 17761
+17102 17426 17103
+17425 17760 17426
+18124 17758 18123
+17424 17423 17758
+17102 17101 17425
+17424 17759 17425
+18122 17757 17931
+17758 17423 17757
+17255 17254 17423
+17099 17098 17253
+17253 17254 17099
+17253 17423 17254
+17099 17100 16980
+17254 17255 17100
+17426 17102 17425
+16924 17100 17101
+16770 17102 17103
+16770 16769 17102
+16576 16378 16444
+16766 16648 16765
+17099 16979 16978
+16980 16923 16922
+16818 16921 16766
+16921 16978 16922
+16378 16577 16379
+16924 17101 16769
+17103 16771 16770
+17103 17104 16771
+16004 15801 15800
+16770 16771 16380
+16770 16379 16769
+15802 15803 15596
+16380 16006 16379
+15803 15804 15596
+16380 16007 16006
+16380 16381 16007
+16007 15804 16006
+15804 15597 15596
+16006 15804 15803
+16007 15805 15804
+15600 15388 15599
+15462 15598 15463
+15598 15461 15597
+15462 15387 15461
+16381 16008 16007
+15806 15598 15805
+16007 16008 15805
+15599 15463 15598
+15807 15599 15806
+15600 15464 15389
+15807 15600 15599
+15807 15808 15600
+16009 15808 15807
+15809 15602 15601
+15809 15603 15602
+15810 15604 15603
+15603 15604 15393
+15810 16011 15605
+15809 15808 16009
+15809 15601 15808
+15807 16008 16009
+15806 15805 16008
+17105 16773 16772
+16009 16008 16382
+16772 16773 16382
+17105 17106 16773
+16009 16383 16010
+16382 16773 16383
+16385 16384 16775
+16383 16773 16774
+16579 16386 16578
+16250 16190 16189
+16775 16384 16774
+16011 16010 16384
+16250 16189 16386
+16190 16013 16189
+16579 16387 16386
+16251 16190 16250
+16819 16777 16925
+16578 16775 16776
+16776 16579 16578
+16776 16777 16579
+16580 16777 16819
+16580 16579 16777
+16190 16251 16388
+16446 16445 16580
+16445 16387 16579
+16251 16250 16387
+16446 16388 16445
+16446 16190 16388
+16189 16012 16385
+16189 16013 16012
+16190 15813 16013
+15395 14638 15394
+15812 16012 15877
+15470 15606 15607
+15607 15673 15674
+15811 16012 15812
+15275 15392 15393
+15468 15604 15605
+15811 15606 15605
+15811 15673 15606
+15674 15673 15812
+15607 15606 15673
+15810 15605 15604
+15606 15470 15469
+15393 15468 15394
+15605 15469 15395
+15605 15606 15469
+15390 15271 15270
+15390 15272 15271
+15073 15204 15074
+15271 15205 15074
+15273 15272 15391
+15205 15271 15272
+15465 15466 15390
+15465 15601 15466
+15273 15391 15274
+15466 15602 15391
+15603 15467 15602
+15603 15392 15467
+15275 15393 15394
+15468 15605 15395
+14447 14520 14315
+15394 15468 15395
+15395 14520 14638
+15392 15603 15393
+15075 15206 15274
+15206 15205 15272
+14835 14887 14836
+14887 15274 15275
+14886 14835 14834
+14710 14638 14637
+15274 14887 15075
+14445 14637 14446
+15275 14836 14887
+15275 15394 14836
+14447 14446 14520
+14638 14710 14836
+14638 14446 14637
+15394 14638 14836
+14520 14446 14638
+14710 14637 14835
+14445 14444 14637
+15007 15008 14834
+14887 14835 14886
+14887 15009 15075
+14887 14886 15009
+15274 15206 15273
+15075 15205 15206
+15271 15074 15204
+15008 14886 14834
+15205 15008 15074
+15009 14886 15008
+15007 14833 15006
+14443 14636 14833
+15004 14884 14883
+15071 15006 14885
+15005 14885 14884
+15006 14833 14885
+15202 15005 15070
+15071 14885 15005
+15071 15203 15006
+15203 15202 15387
+15204 15073 15072
+15074 15008 15007
+15007 15073 15074
+15007 15072 15073
+15203 15269 15072
+15203 15387 15388
+15390 15270 15389
+15271 15204 15270
+15463 15387 15462
+15388 15269 15203
+15463 15388 15387
+15463 15599 15388
+15006 15203 15072
+15071 15202 15203
+15002 15200 15068
+15201 15070 15069
+15385 15268 15200
+15597 15461 15386
+15385 15386 15268
+15461 15387 15386
+15384 15385 15267
+15596 15597 15385
+15385 15384 15596
+15199 15198 15383
+15385 15200 15267
+15002 14830 15199
+15268 15068 15200
+14442 14831 14636
+15069 15003 15068
+15069 15070 15004
+15069 15004 15003
+15005 14884 15004
+14832 14883 14884
+14832 14636 14831
+15200 15002 15199
+15068 15003 15002
+15002 14831 14830
+14883 14832 14831
+15197 15594 15198
+15596 15384 15383
+15595 15802 15383
+16006 15803 15802
+16003 16004 15800
+16186 16249 16187
+16002 16003 15799
+15595 15383 15198
+15801 15595 15800
+15801 15802 15595
+14829 15197 15198
+15593 15592 16000
+15196 14827 14826
+15197 14829 14828
+14438 14828 14439
+14827 15196 14828
+14828 15196 15197
+15195 15592 15196
+15594 15593 15798
+15196 15592 15593
+15800 15594 15799
+15197 15593 15594
+16003 16065 16185
+16003 16002 16065
+15797 16000 15592
+16181 16063 16001
+16181 16182 16063
+16183 16065 16064
+16000 16180 16001
+15997 15998 15874
+16063 16182 16064
+16181 16372 16246
+16182 16183 16064
+16374 16373 16442
+16373 16572 16442
+16442 16573 16574
+16186 16003 16185
+15800 15799 16003
+16186 16187 16004
+16249 16378 16187
+15801 16005 15802
+16188 16379 16006
+16188 16004 16187
+16005 15801 16004
+16004 16188 16005
+16187 16378 16188
+16248 16376 16377
+16577 16768 16769
+16185 16375 16248
+16769 16768 16924
+16248 16377 16249
+16767 16575 16574
+16248 16375 16376
+16374 16247 16373
+16376 16443 16444
+16376 16375 16443
+16377 16444 16378
+16767 16574 16766
+16576 16577 16378
+16769 16379 16577
+16444 16575 16576
+16923 16924 16768
+16443 16575 16444
+16768 16577 16576
+16923 16767 16922
+16574 16648 16766
+16576 16575 16768
+16443 16574 16575
+16922 16767 16766
+16768 16575 16767
+16441 16571 16572
+16763 16816 16918
+16765 16764 16817
+16765 16647 16764
+16648 16647 16765
+16648 16573 16647
+16646 16763 16764
+16762 16816 16763
+16763 16645 16762
+16571 16441 16570
+16646 16571 16645
+16646 16572 16571
+16180 16569 16372
+16645 16571 16570
+16374 16442 16375
+16572 16573 16442
+16185 16247 16375
+16373 16183 16246
+16375 16247 16374
+16185 16184 16247
+16373 16246 16441
+16182 16181 16246
+16572 16373 16441
+16247 16183 16373
+15593 16000 16001
+15876 15875 15998
+16179 15999 15998
+16000 15797 15999
+16566 16370 16179
+16000 15999 16370
+16181 16180 16372
+16568 16759 16915
+16371 16180 16000
+16371 16569 16180
+16760 16569 16371
+16644 16645 16570
+16644 16761 16762
+16569 16760 16761
+16761 16644 16569
+16762 16645 16644
+16916 16760 16915
+16814 16761 16760
+16813 16759 16643
+16914 16915 16759
+16371 16568 16760
+16371 16370 16568
+16759 16567 16643
+16759 16568 16567
+16912 16813 16758
+16913 16914 16813
+16565 16642 16566
+16758 16813 16643
+16912 16812 16911
+16912 16758 16812
+16757 16758 16642
+16757 16642 16641
+16758 16643 16566
+16641 16565 16564
+16369 16245 16440
+16440 16565 16369
+16641 16642 16565
+16565 16566 16369
+16643 16567 16566
+16566 16179 16369
+16370 15999 16179
+16440 16245 16368
+16369 16179 16178
+15998 15997 16179
+16062 16245 16178
+15587 15670 15671
+15996 15997 15793
+15794 15590 15793
+15192 15191 15382
+15382 15193 15192
+14882 14824 14823
+15795 15590 15794
+15591 15194 15193
+16179 15997 16178
+15874 15794 15997
+15997 15794 15793
+15874 15875 15795
+15876 15795 15875
+15796 15591 15795
+15796 15876 15999
+15796 15795 15876
+15194 15591 15592
+15796 15999 15797
+15797 15592 15591
+15195 14825 15194
+15591 15193 15590
+15001 14825 14633
+15795 15591 15590
+15796 15797 15591
+15193 15000 15067
+15193 15194 15001
+15193 15001 15000
+15194 14825 15001
+14635 14826 14437
+15195 15196 14826
+14436 14635 14437
+14634 14825 14635
+14435 14518 14633
+14434 14517 14518
+14436 14519 14634
+14435 14633 14519
+14708 14631 14630
+14632 14517 14631
+15000 14882 14999
+15000 14824 14882
+14824 14709 14823
+14824 14632 14709
+15066 15191 15192
+14822 14823 14708
+14822 14708 14707
+14709 14631 14708
+14231 14432 14307
+14230 14431 14432
+14230 14058 14430
+14881 14998 14999
+14998 15064 15189
+14707 14880 14822
+14880 14881 14822
+14880 14998 14881
+14999 15066 15192
+14998 15065 15066
+14997 15064 14998
+15189 15266 15190
+15189 15065 14998
+15190 15191 15065
+15063 15062 15186
+15264 15265 15187
+14996 15064 14997
+15187 15188 15064
+15065 15189 15190
+15188 15265 15189
+14879 14994 14995
+15378 15460 15379
+15585 15460 15378
+14996 15063 15064
+14996 14995 15063
+14994 14993 15062
+15063 14995 15062
+14879 14995 14996
+14994 15062 14995
+14994 14879 14993
+14428 14056 14427
+14997 14879 14996
+14821 14993 14879
+14057 14429 14058
+14429 14628 14430
+14430 14628 14629
+14628 14429 14627
+14430 14058 14429
+14055 14427 14056
+14055 14229 14427
+14623 14624 14427
+14429 14057 14428
+14427 14515 14623
+14427 14229 14426
+14424 14514 14425
+14425 14620 14426
+14425 14426 14229
+14620 14514 14619
+14619 14514 14513
+14619 14819 14704
+14226 14306 14227
+14513 14514 14424
+14423 14424 14228
+14423 14511 14512
+14423 14512 14424
+14512 14513 14424
+14621 14620 14705
+14621 14426 14620
+14512 14619 14513
+14704 14705 14620
+14706 14621 14705
+14425 14514 14620
+14817 14701 14700
+14619 14704 14620
+14819 14705 14704
+14819 14820 14705
+15872 15993 15994
+14820 14706 14705
+14820 14623 14706
+14622 14621 14706
+14515 14426 14621
+14623 14622 14706
+14623 14515 14622
+16058 15994 16057
+14627 14429 14626
+14428 14427 14624
+14428 14625 14626
+14428 14624 14625
+16056 16172 16173
+15787 15870 15871
+15870 15991 15871
+15788 15787 15871
+15869 15990 15991
+15787 15786 15869
+15870 15787 15869
+14703 14702 14818
+14877 14878 14818
+15866 15785 15669
+15786 15669 15785
+16168 16055 15988
+15057 14988 15056
+15784 15988 15866
+16054 16168 15988
+16363 16751 16752
+15867 15989 15990
+15867 15785 15989
+15868 15867 15990
+15786 15785 15867
+15868 15990 15869
+16169 16055 16168
+15786 15868 15869
+15786 15867 15868
+15869 15991 15870
+16170 16169 16362
+16171 15992 15991
+15871 15991 15992
+15993 16056 16057
+15993 16172 16056
+15994 16058 16059
+16057 16173 16058
+16174 16365 16242
+15789 15871 15992
+15994 15993 16057
+15872 15992 15993
+15871 15789 15788
+15873 16060 15995
+15187 15186 15264
+15264 14993 15378
+15063 15186 15187
+15062 14993 15264
+15265 15264 15379
+15186 15062 15264
+15586 15670 15587
+15586 15585 15670
+15380 15379 15588
+15670 15790 15671
+15587 15588 15379
+15380 15189 15265
+15266 15380 15381
+15672 15588 15791
+15589 15380 15588
+15266 15189 15380
+15589 15672 15792
+15588 15671 15791
+15382 15589 15793
+15381 15380 15589
+15589 15792 15793
+15791 15671 15790
+15672 15791 15873
+15790 16060 15873
+15672 15873 15792
+15791 15790 15873
+15792 15995 15996
+15792 15873 15995
+15792 15996 15793
+16061 16060 16176
+16176 16244 16177
+16245 16062 16177
+16245 16244 16368
+16245 16177 16244
+16639 16755 16640
+16810 16910 16811
+16368 16244 16176
+16177 16061 16176
+15996 15995 16061
+16563 16640 16439
+16367 16438 16439
+16437 16562 16438
+16438 16563 16439
+16562 16754 16639
+16562 16639 16563
+16755 16810 16756
+16754 16755 16639
+16754 17085 16909
+16563 16639 16640
+17088 16811 17087
+16909 16755 16754
+16561 16753 16754
+17566 17633 17567
+17412 17086 17085
+16810 16755 16909
+17084 17083 17410
+17746 18111 17747
+17565 17748 17633
+17413 17242 17412
+17242 17086 17412
+16910 16909 17086
+17747 17565 17412
+17463 17414 17301
+16756 16810 16811
+17244 17243 17302
+17242 17413 17301
+17242 17243 17145
+17302 17243 17301
+17244 17088 17145
+17242 17145 17087
+17243 17244 17145
+17567 17749 17634
+17634 17749 17750
+17922 17748 17747
+17749 17815 17750
+17633 17748 17749
+18176 18317 18318
+17923 17924 17815
+17923 17984 17924
+17923 18113 17984
+19423 19132 19257
+18113 18176 18114
+18317 18409 18318
+18409 18581 18318
+18409 18408 18580
+18409 18317 18408
+18114 17984 18113
+18113 18317 18176
+18113 18316 18317
+18698 18580 18579
+18408 18317 18316
+18855 18698 18579
+18581 18409 18580
+18962 18856 18698
+18581 18580 18698
+18855 18578 19130
+18579 18408 18316
+19740 19420 19128
+18578 18112 18577
+18579 18316 18578
+18113 17923 17922
+18577 18112 18111
+18316 18113 17922
+17748 17922 17749
+18112 18316 17922
+17566 17565 17633
+17412 17411 17746
+17413 17565 17463
+17565 17747 17748
+17746 17747 17412
+18111 18112 17747
+17463 17565 17566
+17413 17412 17565
+17084 17410 17411
+17745 17746 17410
+17408 17743 17744
+17744 18109 18110
+17082 17408 17409
+17921 18108 17743
+17081 17408 17082
+17409 17744 17745
+17409 17408 17744
+17410 17746 17411
+17745 18110 17746
+17746 18110 18111
+17745 17744 18110
+19126 19419 19127
+18577 18111 18576
+18574 18315 18573
+18108 17921 18315
+18697 18574 18573
+18852 18574 18697
+18575 18108 18574
+17921 18107 18315
+17920 17742 17919
+18572 18695 18696
+18852 18961 19125
+18960 18851 18850
+18961 18697 18851
+18696 18695 18850
+18572 18407 18571
+18106 17983 17982
+18572 18314 18407
+18315 18107 18314
+17982 17919 17918
+17741 17918 17919
+17921 17920 18107
+17920 17919 17983
+18107 17920 17983
+17742 17743 17407
+17081 17407 17408
+17241 17564 17407
+17563 17741 17564
+17921 17742 17920
+17921 17743 17742
+17240 17406 17241
+16749 16908 16750
+17083 17082 17409
+16908 17081 16750
+15989 16169 16170
+16560 16750 16362
+16749 16750 16560
+17081 17082 16750
+16172 16171 16364
+16750 17082 16751
+16752 17083 17084
+16751 17082 17083
+16754 16753 17085
+16561 16365 16753
+17085 16753 17084
+16365 16364 16753
+16366 16561 16437
+16363 16752 16364
+16751 17083 16752
+16562 16437 16561
+16438 16367 16437
+16058 16174 16059
+16365 16561 16366
+16365 16366 16242
+16437 16367 16366
+16059 16175 15994
+16242 16366 16243
+16059 16174 16175
+16365 16173 16364
+16365 16174 16173
+16175 16174 16242
+16058 16173 16174
+16173 16172 16364
+15993 15992 16172
+15990 16170 15991
+16362 16751 16363
+16364 16171 16363
+16172 15992 16171
+16167 16361 16168
+16363 16170 16362
+15989 16055 16169
+15991 16170 16363
+15990 15989 16170
+16240 16163 16358
+16050 16164 16165
+16163 16240 16164
+16050 16163 16164
+16556 16636 16637
+16432 16556 16433
+17406 17564 17241
+17563 17406 17462
+17300 17406 17240
+17406 17563 17564
+17563 17632 17741
+17076 17075 17141
+18106 18314 18107
+18105 17982 17981
+17983 17919 17982
+18105 18106 17982
+18313 18314 18106
+18407 18314 18313
+17916 17739 17738
+17559 17630 17560
+17738 17739 17630
+17559 17560 17460
+17559 17460 17403
+17918 17917 17981
+17918 17741 17814
+17559 17403 17402
+17236 17296 17297
+17558 17559 17402
+17738 17630 17559
+17075 17074 17140
+17918 17814 17917
+16746 16747 16635
+16902 16967 16903
+16967 17074 17075
+16967 17073 17074
+16903 16967 16968
+17403 17297 17402
+17297 17237 17236
+17402 17297 17296
+17403 17237 17297
+17459 17558 17402
+17557 17737 17558
+17139 17140 17073
+17139 17234 17235
+17139 17235 17140
+17234 17294 17235
+17295 17401 17402
+17294 17234 17233
+17402 17401 17459
+17295 17235 17400
+17295 17400 17401
+17399 17557 17400
+17072 17233 17139
+17399 17294 17233
+17400 17294 17399
+17400 17235 17294
+17231 17398 17071
+17399 17233 17232
+16967 16902 17073
+17071 17232 17072
+17072 17073 16902
+16429 16552 16553
+16552 16745 16553
+16902 16744 17072
+16553 16430 16429
+16634 16553 16745
+16745 16552 16744
+16353 16160 16159
+16352 16551 16159
+16552 16429 16353
+16355 16354 16430
+16353 16237 16160
+16430 16354 16429
+16355 16237 16354
+16634 16554 16553
+16555 16556 16432
+17404 17405 17299
+16162 16049 16048
+16161 16048 16047
+15981 16046 16047
+16160 16237 16238
+16160 16238 16161
+16160 16161 16046
+16552 16353 16551
+16354 16237 16353
+15581 15979 15777
+16352 15978 16351
+15777 15980 15778
+15777 16159 15980
+15778 15980 15860
+15980 16046 15981
+15983 15861 15982
+15861 15780 15860
+15779 15860 15780
+15982 16048 15983
+15778 15860 15779
+15981 15982 15860
+15583 15665 15781
+15780 15861 15781
+15181 15373 15582
+15777 15778 15582
+14985 15373 15181
+15257 15178 15177
+14987 14986 15182
+14986 14985 15181
+15181 15374 15182
+15181 15582 15374
+15782 15666 15781
+15582 15778 15665
+15374 15583 15456
+15374 15582 15583
+15457 15456 15584
+15259 15056 15182
+14814 14698 14697
+15261 15184 15058
+14988 14987 15056
+15262 15184 15261
+15183 15259 15260
+15458 15457 15668
+15375 15456 15457
+15667 15668 15584
+15667 15783 15668
+15782 15862 15863
+15456 15583 15667
+15583 15781 15666
+15456 15667 15584
+15666 15782 15667
+15781 15862 15782
+15861 15983 15862
+16049 15983 16048
+15782 15863 15783
+15862 15983 15863
+15863 15984 15985
+15375 15457 15458
+16749 16560 16559
+16436 16559 16361
+16361 16559 16560
+16360 16436 16361
+15184 15060 15059
+15183 15261 15058
+14816 14988 14989
+15060 14991 14990
+15057 15058 14988
+15184 15059 15058
+15375 15261 15260
+15259 15183 15056
+15260 15261 15183
+15183 15057 15056
+15183 15058 15057
+14876 14815 14875
+14815 14816 14699
+14815 14699 14698
+14815 14876 14816
+14508 14617 14618
+14616 14700 14617
+14699 14816 14700
+14989 15058 15059
+14876 14988 14816
+14876 14987 14988
+15058 14989 14988
+15059 15060 14990
+14702 14817 14818
+14990 14991 14878
+14989 14990 14877
+14989 15059 14990
+14617 14701 14618
+14618 14701 14702
+14617 14700 14701
+14989 14817 14816
+14877 14818 14817
+14421 14420 14508
+14419 14418 14505
+14421 14508 14509
+14507 14617 14508
+14421 14509 14510
+14508 14618 14509
+14422 14421 14510
+14224 14051 14050
+14420 14506 14507
+14505 14616 14506
+14508 14420 14507
+14225 14224 14420
+14420 14224 14419
+14504 14615 14505
+14418 14419 14305
+14225 14051 14224
+14506 14419 14505
+14506 14420 14419
+14418 14305 14304
+14419 14224 14305
+14223 14303 14304
+14221 14122 14121
+14305 14223 14304
+14050 14049 14223
+14303 14418 14304
+14503 14504 14418
+14418 14504 14505
+14503 14614 14615
+14503 14615 14504
+14697 14698 14615
+14698 14814 14815
+14813 14873 14874
+14986 14874 14873
+14814 14697 14813
+14876 14875 14987
+14814 14874 14875
+15182 14986 15181
+14875 14874 14986
+14615 14614 14697
+14417 14303 14302
+14814 14813 14874
+14697 14614 14696
+14813 14696 14812
+14613 14502 14501
+14696 14695 14812
+14696 14614 14613
+14612 14694 14695
+14984 15055 15180
+14812 14985 14873
+14812 14694 14811
+14500 14611 14501
+14695 14696 14613
+14811 14694 14611
+14812 14695 14694
+14417 14416 14502
+14221 14123 14122
+14695 14613 14612
+14502 14416 14501
+14614 14502 14613
+14614 14503 14502
+14503 14417 14502
+14503 14418 14417
+14417 14302 14416
+14222 14123 14221
+14303 14222 14302
+14303 14223 14222
+14302 14221 14301
+14302 14222 14221
+14121 14220 14221
+14499 14413 14498
+14119 14219 14220
+14118 14217 14218
+14047 14119 14120
+14118 14219 14119
+14299 14300 14219
+14301 14221 14220
+14298 14218 14297
+14219 14118 14218
+14115 14214 14215
+14117 14118 14045
+14217 14117 14116
+14217 14118 14117
+14114 14212 14213
+14295 14296 14216
+14116 14215 14216
+14294 14410 14411
+14116 14216 14217
+14215 14295 14216
+14497 14413 14412
+14299 14218 14298
+14214 14294 14215
+14410 14607 14608
+14217 14296 14297
+14295 14294 14411
+14215 14294 14295
+14214 14213 14294
+14981 14810 14608
+14609 14810 14610
+14811 14611 14610
+14298 14297 14412
+14497 14610 14498
+14611 14612 14501
+14298 14413 14299
+14413 14499 14414
+14220 14300 14301
+14299 14413 14300
+14301 14414 14415
+14300 14413 14414
+14414 14499 14500
+14610 14810 14983
+14414 14500 14501
+14499 14611 14500
+14498 14610 14499
+14694 14612 14611
+14499 14610 14611
+14498 14413 14497
+14983 14811 14610
+14985 14812 14811
+15054 14983 14982
+14984 15180 14985
+15054 15179 14983
+15180 15373 14985
+14811 14984 14985
+14811 14983 14984
+15179 15257 15258
+15372 15371 15581
+15180 15372 15373
+15979 16159 15777
+15373 15372 15581
+15179 15055 14983
+15580 15979 15581
+16351 16350 16550
+15581 15371 15580
+15372 15180 15258
+15372 15258 15371
+15180 15055 15258
+15257 15179 15178
+15258 15055 15179
+15054 15177 15178
+14981 15369 15177
+15258 15257 15371
+15177 15369 15370
+15580 15978 15979
+15580 15369 15579
+15176 15369 14981
+15175 15174 15578
+15177 15370 15257
+15369 15580 15370
+14810 14981 14982
+14809 14980 15176
+14411 14608 14609
+14982 14983 14810
+15177 15054 14982
+15178 15179 15054
+14411 14609 14412
+14609 14610 14497
+14410 14608 14411
+14607 14809 14608
+14412 14609 14497
+14608 14810 14609
+14693 14809 14607
+14693 14808 14809
+14604 14692 14605
+14808 14693 14692
+15175 14807 14806
+15175 14980 14807
+14807 14808 14692
+14980 14809 14808
+15175 15176 14980
+15175 15578 15579
+15176 15175 15579
+15577 15975 15976
+15580 15579 15978
+15578 15976 15977
+15176 15579 15369
+15578 15977 15579
+16158 15975 16157
+15577 15576 15975
+15576 15173 15172
+15576 15577 15173
+16350 15976 16349
+15578 15577 15976
+14690 14803 14804
+14979 15173 14805
+14802 14803 14688
+14802 14978 14803
+14803 14979 14804
+15172 15173 14979
+15575 15774 15775
+15773 15772 15859
+14872 14977 14801
+15576 15575 15776
+15368 15574 15575
+14109 14208 13760
+14801 14802 14686
+14687 14688 14598
+14687 14802 14688
+14688 14689 14598
+14688 14803 14689
+14690 14804 14599
+14804 14805 14691
+14689 14690 14598
+14689 14803 14690
+14690 14599 14598
+14691 14600 14599
+14602 14601 14806
+14492 14491 14601
+14599 14600 14491
+14493 14492 14601
+14405 14491 14492
+14602 14493 14601
+14406 14405 14493
+14807 14603 14806
+14406 14493 14602
+14406 14603 14407
+14602 14806 14603
+14494 14604 14605
+14603 14807 14604
+14495 14494 14606
+14211 14293 14408
+14607 14496 14693
+14494 14605 14606
+14693 14496 14606
+14409 14212 14211
+14407 14408 14293
+14604 14494 14408
+14410 14212 14409
+14409 14408 14494
+14211 14212 14112
+14213 14214 14115
+13930 14042 14043
+14112 14212 14113
+14410 14213 14212
+14410 14294 14213
+14043 14115 14044
+14043 14042 14114
+13929 14042 13930
+13929 14041 14042
+14043 14114 14115
+14113 14212 14114
+14110 14111 14040
+14293 14210 14407
+14209 14291 14292
+14496 14409 14495
+14496 14410 14409
+14407 14292 14406
+14209 14040 13854
+14210 14292 14407
+14210 14110 14209
+14210 14209 14292
+14110 14040 14209
+14038 14207 14109
+14289 14288 14402
+14595 14799 14800
+14403 14402 14595
+14403 14595 14596
+14978 15171 15368
+14978 14977 15171
+14801 14977 14978
+14872 14976 14977
+15255 15169 15365
+14596 14685 14597
+14800 14871 14685
+15053 15170 15256
+15052 15169 15170
+15051 14871 14975
+14800 14799 14870
+14870 14799 14974
+14871 14870 14975
+14871 14800 14870
+14975 14870 14974
+14490 14403 14596
+14401 14594 14595
+15167 15254 15364
+15051 14975 14974
+14290 14207 14403
+14401 14595 14402
+14490 14596 14597
+14595 14800 14596
+14290 14403 14404
+14290 14208 14207
+14109 14207 14208
+14289 14402 14403
+14038 14206 14207
+14037 14036 14205
+14207 14289 14403
+14207 14206 14289
+14285 14286 14204
+14206 14288 14289
+14286 14287 14205
+14401 14402 14287
+14205 14206 14037
+14287 14288 14206
+14595 14594 14798
+14399 14593 14594
+14286 14400 14401
+14285 14284 14400
+14204 14286 14205
+14285 14400 14286
+14203 14202 14399
+14971 14795 14970
+14592 14398 14591
+14593 14399 14398
+14399 14202 14398
+14203 14035 14202
+14398 14592 14593
+14591 14795 14592
+14797 14796 14972
+14592 14795 14796
+14798 14797 14973
+14594 14593 14797
+15254 15166 15362
+14973 15165 15166
+14796 14971 14972
+14796 14795 14971
+14972 15164 15165
+14971 14970 15164
+15562 15445 15561
+15164 15358 15359
+15448 15361 15447
+15165 15164 15360
+15447 15361 15360
+15448 15362 15361
+15362 15448 15449
+15449 15363 15362
+15167 14974 14973
+15564 15364 15363
+15168 15051 14974
+15364 15168 15167
+15449 15564 15363
+14974 15167 15168
+15166 15254 15167
+15655 15564 15563
+15852 15853 15764
+15765 15564 15655
+15655 15654 15764
+15446 15447 15360
+15764 15654 15763
+15563 15447 15562
+15763 15654 15653
+15655 15563 15654
+15359 15445 15360
+15563 15448 15447
+15358 15561 15359
+15562 15447 15446
+15445 15446 15360
+15445 15562 15446
+15762 15562 15761
+15445 15359 15561
+15761 15562 15561
+15653 15563 15562
+15653 15762 15763
+15653 15562 15762
+15959 15853 15852
+15765 15655 15764
+16039 15957 16038
+15850 15849 15957
+15851 15959 15852
+16142 15960 15959
+16039 16038 16140
+15957 15956 16038
+16040 16039 16140
+16040 15957 16039
+16141 16040 16140
+16141 16041 16040
+15963 15857 15856
+15964 16044 15858
+15960 15765 15853
+15856 15766 15656
+15658 15565 15657
+15857 15766 15856
+15857 15858 15766
+15766 15657 15656
+15769 15768 15966
+15659 15658 15767
+15966 16149 15967
+15969 16150 16045
+15967 15968 15770
+15772 15664 15663
+15660 15661 15566
+15568 15450 15567
+15660 15659 15768
+15660 15565 15659
+15661 15660 15768
+15566 15565 15660
+15658 15659 15565
+15661 15567 15566
+15661 15769 15568
+15661 15568 15567
+15769 15770 15568
+15568 15451 15450
+15452 15365 15169
+15453 15452 15570
+15451 15568 15569
+15569 15452 15451
+15569 15570 15452
+15574 15573 15664
+15454 15365 15453
+15455 15454 15573
+15366 15365 15454
+15366 15255 15365
+15366 15256 15255
+15053 15256 15171
+15170 15255 15256
+15368 15367 15574
+15256 15366 15455
+15455 15367 15256
+15455 15574 15367
+15454 15572 15573
+15571 15662 15771
+15454 15571 15572
+15570 15662 15571
+15573 15663 15664
+15572 15571 15663
+15771 15772 15663
+15773 15774 15574
+15771 15969 15772
+15971 15972 15773
+15772 15773 15664
+15859 15971 15773
+15972 15973 15774
+16153 16232 16154
+15773 15972 15774
+15971 16045 16151
+16153 16152 16231
+16152 15971 16151
+16153 16231 16232
+16152 16230 16231
+16233 16154 16232
+15973 15972 16153
+16343 16344 16232
+16427 16345 16344
+16541 16426 16540
+16427 16344 16343
+16342 16343 16231
+16426 16427 16343
+16727 16538 16537
+16340 16150 16537
+16150 16340 16151
+16341 16342 16230
+16425 16342 16341
+16426 16343 16342
+16150 16151 16045
+16230 16152 16151
+16624 16625 16539
+16425 16341 16340
+16538 16340 16537
+16341 16230 16340
+16725 17055 16726
+16537 16339 16536
+16725 16338 16337
+16339 15968 16338
+16725 16535 16338
+16536 16339 16535
+16229 16337 16148
+15967 15769 15966
+15770 15968 15771
+16339 16150 15968
+15859 15969 15970
+15968 16150 15969
+15970 15971 15859
+15970 16045 15971
+15857 15964 15858
+16149 15966 15965
+16338 15967 16149
+16338 15968 15967
+16146 16043 16145
+16043 16147 15964
+15963 15964 15857
+16043 16146 16147
+16229 16044 16147
+16148 15965 16044
+15963 16043 15964
+15963 15962 16043
+16043 15962 16145
+16225 16143 16142
+15963 15856 15962
+15961 15960 16042
+15959 16041 16142
+16331 16529 16530
+16142 16041 16141
+15959 15958 16041
+16144 16143 16226
+16144 16042 16143
+16226 16143 16225
+16042 15960 16143
+16333 16226 16225
+16334 16144 16226
+16423 16333 16332
+16423 16334 16333
+16140 16331 16141
+16140 16139 16331
+16225 16332 16333
+16141 16530 16332
+16227 16424 16335
+16722 16883 16884
+16623 16723 16533
+16336 16228 16335
+16146 16145 16227
+16723 16534 16533
+16534 16335 16533
+16335 16228 16227
+16336 16147 16228
+16337 16534 16724
+16336 16335 16534
+16229 16148 16044
+16149 15965 16148
+16336 16229 16147
+16336 16534 16337
+16336 16337 16229
+16724 16725 16337
+16886 17053 16724
+16726 16535 16725
+17052 16886 16885
+17052 17382 17053
+16885 16884 17052
+16885 16723 16722
+16723 16886 16724
+16722 16723 16623
+16885 16886 16723
+16529 16720 16622
+16881 16720 16880
+16721 16622 16720
+16720 16802 16721
+16881 16882 16802
+16881 17049 16882
+16532 16722 16623
+17454 17380 17379
+17380 17381 17215
+17214 17131 17379
+17051 17050 17131
+17051 16957 17050
+17380 17214 17379
+17215 17051 17214
+17624 17541 17379
+17542 17543 17455
+17214 17380 17215
+17455 17543 17381
+17454 17455 17380
+17542 17624 17719
+17215 17381 17052
+17544 17721 17382
+17381 17382 17052
+17381 17543 17544
+16724 17054 16725
+17383 17384 17054
+17052 17053 16886
+17382 17383 17053
+17723 17384 17383
+17216 17386 17217
+17723 17545 17384
+18291 18290 18549
+16888 17056 17057
+17628 17726 17808
+17545 17724 17385
+18085 17723 18084
+16726 17055 16887
+17056 17385 17216
+16887 17055 17056
+17054 17384 17055
+16887 17056 16888
+17055 17385 17056
+16728 16727 16887
+16727 16536 16726
+16727 16726 16887
+16536 16535 16726
+16888 16728 16887
+16537 16536 16727
+16539 16540 16426
+16425 16340 16538
+16889 16729 16888
+16538 16727 16728
+16728 16624 16538
+16728 16888 16729
+16728 16729 16624
+16730 16731 16627
+16729 16625 16624
+16729 16803 16730
+16624 16539 16425
+16625 16540 16539
+16426 16541 16427
+16540 16626 16627
+16625 16626 16540
+16625 16729 16626
+16541 16627 16628
+16541 16540 16627
+16889 16890 16803
+17058 16891 16890
+16729 16889 16803
+16888 17057 16889
+16729 16730 16626
+16803 16731 16730
+17056 17216 17057
+17385 17546 17216
+17546 17547 17386
+17725 17901 17726
+17547 17456 17386
+17548 17626 17627
+17548 17388 17456
+17388 17457 17288
+17058 17217 17218
+17217 17386 17287
+17389 17288 17457
+17287 17387 17388
+17457 17548 17628
+17456 17547 17626
+17389 17457 17549
+17388 17548 17457
+17550 17390 17549
+17218 17059 16891
+17132 17220 17221
+17389 17549 17390
+17222 17391 17392
+17390 17550 17391
+17223 17222 17392
+17133 17063 17222
+17220 17219 17389
+17218 17287 17388
+17062 17221 17222
+17132 17060 17220
+17062 17132 17221
+17061 17060 17132
+17063 17062 17222
+17064 17063 17133
+16961 16896 16895
+16894 16958 16959
+17062 17063 16960
+17060 16958 16893
+17061 17062 16958
+16958 17062 16959
+16807 16806 16893
+16806 16892 16893
+17218 17219 17059
+17060 16893 16892
+17390 17220 17389
+17390 17391 17220
+17389 17219 17288
+17220 17060 17059
+17219 17218 17288
+16891 17058 17218
+16891 17059 16892
+17219 17220 17059
+16629 16732 16733
+16731 16890 16732
+16805 16806 16733
+16805 16892 16806
+16633 16734 16735
+16633 16632 16734
+16543 16631 16544
+16631 16734 16632
+16629 16628 16732
+16627 16731 16628
+16543 16629 16630
+16542 16427 16541
+16543 16542 16629
+16543 16428 16542
+15973 16154 15974
+15973 16153 16154
+16345 16428 16346
+16345 16427 16428
+16154 16155 15974
+16154 16233 16155
+16155 16235 16156
+16234 16346 16235
+16346 16544 16347
+16632 16633 16544
+16544 16545 16347
+16158 15976 15975
+16157 16236 16348
+16157 16156 16236
+16349 16158 16348
+15975 16156 16157
+16348 16158 16157
+16349 15976 16158
+16347 16545 16348
+16633 16736 16545
+16348 16546 16349
+16545 16736 16737
+16897 16738 16896
+16546 16545 16737
+16633 16735 16736
+16734 16806 16807
+16894 16808 16893
+16735 16734 16808
+16808 16807 16893
+16808 16734 16807
+16960 16894 16959
+16896 16737 16895
+17065 16963 16962
+17066 17067 16964
+17136 17227 17137
+16963 16897 16896
+16964 16898 16897
+16547 16738 16739
+16737 16896 16738
+17065 16962 16961
+16963 16896 16962
+16897 16739 16738
+16548 16349 16547
+16546 16547 16349
+16546 16737 16547
+16740 16548 16739
+16350 15977 15976
+16549 16350 16548
+16743 16742 16901
+16898 16740 16739
+16741 16742 16550
+16740 16549 16548
+16740 16741 16549
+16899 16900 16741
+16351 16743 16352
+16549 16550 16350
+16549 16741 16550
+15977 16351 15978
+16550 16742 16351
+15979 16352 16159
+16351 16742 16743
+16900 16901 16742
+16743 16551 16352
+17071 16743 16901
+17071 17072 16743
+16741 16900 16742
+17230 17138 17293
+16899 16966 16900
+16899 16965 17069
+16901 17070 17231
+17069 17068 17137
+17136 17137 17067
+17138 17070 16966
+16966 17069 17138
+16966 16899 17069
+17137 17138 17069
+17229 17293 17138
+16901 17231 17071
+17397 17734 17735
+17397 17230 17293
+17231 17070 17230
+17555 17398 17735
+17232 17071 17398
+17397 17396 17554
+17293 17229 17292
+17067 17137 17068
+17228 17229 17137
+17231 17397 17398
+17293 17396 17397
+17226 17227 17136
+17228 17137 17227
+17134 17064 17133
+17065 16961 17064
+17224 17135 17134
+17136 17066 17135
+17133 17223 17134
+17289 17290 17224
+17290 17291 17225
+17292 17228 17227
+17290 17394 17291
+17396 17293 17292
+17134 17223 17224
+17133 17222 17223
+17551 17393 17392
+17290 17289 17393
+17223 17392 17289
+17391 17730 17392
+17395 17396 17292
+17458 17394 17393
+17393 17394 17290
+17734 17397 17554
+17914 17555 17735
+17556 17399 17555
+17977 17908 18091
+17811 17729 17728
+17730 18090 17908
+18298 18297 18400
+18090 18299 18091
+17908 18090 18091
+18954 18837 19110
+17730 17908 17731
+17730 17907 18090
+17730 17729 17907
+17907 17906 18089
+17907 17729 17906
+18556 18297 18399
+18090 17907 18297
+18089 18296 18297
+18397 18295 18553
+18558 18298 18557
+18298 18090 18297
+18557 18298 18400
+18299 18090 18298
+18840 18689 18557
+18554 18397 18553
+18297 18556 18400
+19401 19402 19249
+19111 19110 19249
+19550 19549 19719
+19551 19550 19719
+18841 18689 18840
+18840 18688 18839
+18557 18400 18688
+18840 18557 18688
+18689 18558 18557
+18298 18558 18299
+18689 18843 18690
+19112 18956 18955
+18843 18689 18842
+19552 19553 19403
+19720 19886 19721
+19885 19720 19551
+19552 19403 19551
+19719 19885 19551
+19551 19720 19552
+20386 20651 20652
+19720 19553 19552
+20053 19886 19720
+19888 20056 20057
+19885 20053 19720
+20227 20388 20054
+20226 20053 19885
+20227 19886 20053
+20654 20387 20653
+20227 20053 20387
+20388 20227 20387
+20388 20389 20228
+21483 21186 21185
+20387 20226 20386
+20387 20053 20226
+20652 20917 20653
+21188 20919 20918
+20653 20917 20918
+20652 20779 20917
+20917 21046 21187
+21187 21485 21329
+21187 21186 21485
+21623 21485 21749
+21486 21329 21485
+20779 20916 20917
+20915 21186 21046
+20651 20779 20652
+20651 20915 20779
+20386 20385 20651
+21184 21183 21328
+19719 20051 20052
+20384 20651 20385
+20387 20386 20652
+20226 19885 20052
+20226 20052 20386
+19885 19719 20052
+19402 19718 19549
+20384 20385 20051
+19717 19718 19401
+20051 19719 19718
+18555 18687 18838
+18952 18953 18835
+19109 19110 18953
+19249 19402 19111
+19109 19401 19110
+19401 19718 19402
+18837 18954 18838
+19110 19111 18954
+19110 19401 19249
+19716 20050 19717
+21748 21484 21747
+21485 21186 21484
+20779 20915 20916
+20050 20384 19717
+20651 20914 20915
+21328 21483 21185
+21186 20914 21185
+20651 20384 20914
+19400 19716 19401
+20384 20051 19717
+21185 21045 21184
+20914 20384 20650
+21185 21184 21328
+21183 21182 21482
+21747 21483 21482
+21484 21186 21483
+21045 21183 21184
+21045 20913 21183
+21183 20913 20912
+21045 20914 20913
+20050 20650 20384
+20913 20914 20650
+19107 18551 18832
+19715 20383 20050
+19401 19716 19717
+19107 19715 19108
+19108 19109 18951
+19400 19401 19109
+18951 18835 18685
+18836 18837 18687
+18833 19108 18834
+18952 18835 18951
+19109 18952 18951
+19109 18953 18952
+18398 18687 18555
+18833 18293 18551
+18553 18294 18552
+18294 18293 18552
+18685 18553 18552
+17902 17903 17810
+18553 18295 18294
+17811 17906 17729
+18835 18686 18685
+18835 18953 18836
+18686 18553 18685
+18686 18836 18554
+18835 18836 18686
+18953 18837 18836
+18686 18554 18553
+18296 18398 18399
+18836 18687 18554
+18837 18838 18687
+18554 18398 18397
+18399 18297 18296
+18687 18398 18554
+18296 18295 18397
+18399 18398 18555
+18296 18397 18398
+18089 18088 18295
+17809 17810 17727
+18089 17976 18088
+18089 17906 17976
+17976 17905 17904
+17976 17906 17905
+17904 17811 17728
+17905 17906 17811
+17902 17975 17903
+17904 17728 17810
+17727 17550 17549
+17728 17729 17550
+17808 17809 17727
+17810 17728 17727
+18088 17975 18087
+18088 17904 17975
+17904 17903 17975
+17904 17810 17903
+18293 18087 17901
+18294 18088 18087
+18087 17902 17901
+18087 17975 17902
+17810 17809 17902
+17727 17628 17808
+17548 17627 17628
+17548 17456 17626
+17627 17626 17726
+17547 17546 17725
+17547 17725 17626
+17724 17545 17723
+17901 17808 17726
+17901 17902 17808
+17726 17628 17627
+17727 17549 17628
+17901 18086 18293
+17725 17546 17724
+18086 18551 18293
+20049 19712 20048
+19108 18951 18834
+18834 18552 18833
+18550 18832 18551
+19106 18548 19105
+18086 18292 18551
+18549 18832 18550
+18551 18292 18550
+18086 17725 17724
+18292 18291 18550
+19105 18547 19104
+18546 18547 18289
+18548 19106 18549
+18290 18548 18549
+18290 18084 18548
+18396 18546 18288
+19103 19248 19398
+18166 18081 18165
+18394 18544 18545
+18548 18083 18547
+18165 18081 18080
+18083 18082 18289
+17721 17900 18082
+17723 17722 18084
+17721 18082 18083
+18086 17724 18085
+18085 18084 18290
+18292 18086 18085
+17546 17385 17724
+17382 17722 17383
+17721 18083 17722
+18292 18085 18291
+17724 17723 18085
+17381 17544 17382
+17543 17720 17544
+17974 17899 17807
+18080 18081 17899
+17625 17720 17543
+17899 17900 17720
+18080 17974 18079
+18080 17899 17974
+17625 17719 17720
+17806 17898 17807
+17454 17542 17455
+17719 17807 17720
+17543 17542 17625
+17541 17624 17542
+17718 17719 17624
+17454 17541 17542
+17454 17379 17541
+17719 17718 17806
+17807 17898 17974
+17807 17719 17806
+17625 17542 17719
+18394 18165 18286
+18287 18288 18166
+18164 18079 18286
+18165 18164 18286
+18165 18080 18164
+18544 18394 18393
+18286 18079 18393
+19102 18950 18682
+18683 18544 18682
+18395 18396 18287
+18683 18545 18544
+18683 18684 18545
+18287 18166 18165
+18082 17900 18081
+18395 18287 18394
+18396 18288 18287
+18082 18166 18288
+18082 18081 18166
+18545 18395 18394
+18545 18396 18395
+18545 18684 18546
+18950 19102 19103
+18546 18830 18831
+19399 19711 19104
+19712 19711 20047
+20223 19884 19710
+18831 19103 19104
+19248 19397 19398
+18831 18830 19103
+18829 18683 18950
+18547 18831 19104
+18547 18546 18831
+19104 19103 19399
+18829 18684 18683
+18830 18950 19103
+18683 18682 18950
+18830 18829 18950
+18830 18684 18829
+19710 19398 19397
+19248 18682 19397
+19248 19102 18682
+19248 19103 19102
+19399 19398 19710
+19399 19103 19398
+20223 20046 19884
+20223 20224 20046
+19884 19711 19710
+20046 19711 19884
+20047 20048 19712
+20378 20224 20223
+20378 20379 20224
+20646 20525 20223
+20379 20225 20047
+20644 20645 20524
+20525 20378 20223
+20777 20647 20646
+20525 20526 20379
+20525 20379 20378
+20525 20646 20647
+20046 20047 19711
+20224 20379 20047
+20525 20647 20526
+20909 20908 21044
+20777 20778 20647
+20379 20380 20225
+21178 21044 20908
+20649 20909 20910
+21178 21179 21044
+21477 21622 21741
+21479 20910 21180
+21179 21327 21477
+20381 20649 20910
+20648 20778 20909
+20647 20778 20648
+20777 20908 20778
+20910 20909 21180
+20778 20908 20909
+20649 20648 20909
+20526 20647 20648
+20526 20380 20379
+20526 20648 20380
+20649 20380 20648
+20048 20225 20380
+18547 19105 18548
+19104 19712 19105
+20911 20381 20910
+20381 20380 20649
+21181 20912 20911
+19713 19105 19712
+19107 19106 19714
+19106 19105 19713
+19714 19106 19713
+18832 18549 19106
+19107 19714 19715
+19713 20381 20382
+18551 19107 18833
+18832 19106 19107
+19109 19108 19400
+20383 20650 20050
+19107 19108 18833
+19715 19400 19108
+19714 20383 19715
+19714 20382 20383
+20382 20381 20911
+19713 20049 20381
+20912 20382 20911
+19714 19713 20382
+20912 21181 21182
+21480 20910 21479
+21182 21481 21482
+21181 21480 21481
+20650 20912 20913
+20383 20382 20912
+21327 21178 21326
+21621 21476 21475
+21739 21740 21620
+21621 21475 21620
+21620 21740 21621
+21621 21622 21476
+21621 21740 21622
+21858 22002 21740
+21858 21740 21739
+21858 22001 22002
+22251 22252 22002
+21622 21859 21741
+21740 22002 21859
+22251 22002 22001
+21857 21858 21739
+21857 22001 21858
+20906 21043 20907
+21324 21176 21042
+21325 21177 21176
+22250 22355 22490
+20905 21175 21042
+21042 20906 20775
+21324 21325 21176
+20523 20643 20644
+20905 21042 20775
+20775 20906 20776
+21042 21176 20906
+20906 20907 20776
+20907 20645 20776
+20905 20775 20643
+20644 20524 20523
+19395 19546 19547
+19396 19395 19548
+19395 19708 19548
+19883 19708 19547
+19709 19548 19708
+19395 19547 19708
+19546 19707 19547
+20044 19883 19707
+20045 19708 19883
+20043 19881 19880
+19707 19882 20044
+19706 19881 19882
+20375 20521 20639
+20375 20043 20042
+19706 19546 19880
+20042 20043 19880
+20640 20641 20376
+20374 20521 20221
+20637 20520 20519
+20221 20042 20373
+20373 20374 20221
+20373 20520 20374
+20519 20520 20373
+20637 20901 20638
+20374 20638 20521
+20520 20637 20638
+20638 20639 20521
+20638 20901 20902
+20377 20376 20522
+20221 20375 20042
+20639 20640 20375
+20222 20376 20377
+20222 20044 20376
+20045 19883 20044
+20641 20642 20522
+21855 21736 21854
+21619 21474 21324
+21997 21735 21853
+21734 21618 21471
+21618 21472 21471
+21618 21735 21472
+20641 20903 20904
+20641 20640 20903
+20638 20902 20639
+20904 20903 21174
+20640 20902 20903
+21174 21470 21471
+21852 21734 21733
+21852 21853 21734
+21733 21994 21852
+21994 21993 22245
+22246 22137 22245
+21995 21852 21994
+23084 22910 22909
+22353 22246 22487
+22138 21995 22137
+21996 21853 21852
+22138 21996 21995
+22138 22247 22139
+21853 21996 21997
+22246 22353 22247
+22695 22603 22782
+21997 21996 22139
+22249 22248 22489
+22489 22248 22354
+22249 22140 22248
+23085 22910 23084
+22604 22489 22696
+21856 21737 21855
+21473 21619 21324
+22140 22249 21998
+21855 21737 21736
+21738 21474 21619
+21737 21619 21736
+21324 21175 21473
+21736 21619 21473
+21737 21856 21738
+21737 21738 21619
+21998 22249 21999
+22909 22910 22785
+22785 22698 22697
+22000 22141 22250
+22000 21999 22141
+22355 22250 22141
+22490 22491 22250
+22699 22491 22698
+22251 22250 22491
+22696 22909 22784
+22910 22786 22785
+22699 22698 22786
+22491 22490 22698
+22784 22909 22785
+23085 22911 22910
+22353 22488 22695
+22697 22784 22785
+22697 22696 22784
+23299 23168 23083
+23168 23169 23084
+23299 23406 23300
+23168 23084 23083
+23169 23085 23084
+23170 23086 23085
+23170 23171 23086
+22912 22911 23086
+22700 22699 22911
+23301 23302 23170
+23087 23088 22912
+23476 23477 23301
+23700 23893 23701
+23302 23172 23171
+23303 23479 23304
+23302 23303 23172
+23477 23476 23699
+23703 23481 23480
+22499 22498 22608
+23480 23305 23304
+23704 23821 23822
+22496 22704 22497
+22915 23307 22916
+23086 23087 22912
+23172 23303 23087
+22912 22913 22702
+23088 23304 22913
+22914 22704 22913
+22494 22255 22254
+22704 22495 22703
+22256 22257 22142
+22913 22704 22703
+22914 22705 22497
+22358 22496 22359
+22704 22914 22497
+22494 22356 22255
+22357 22358 22257
+22359 22496 22497
+22358 22495 22496
+22606 22494 22605
+22607 22703 22495
+22702 22606 22605
+22702 22703 22607
+22356 22607 22495
+22606 22702 22607
+22911 22699 22786
+22492 22252 22251
+22700 22492 22699
+22700 22701 22493
+22492 22700 22253
+22605 22494 22493
+22492 22253 22252
+22256 22255 22356
+22493 22254 22253
+22493 22494 22254
+22005 22255 22006
+22006 22255 22142
+21744 21743 22006
+22005 22254 22255
+22253 22003 22252
+22004 21741 22003
+21743 21478 21742
+22004 22254 22005
+21179 21477 21478
+21741 22004 21742
+21478 21477 21742
+21327 21476 21477
+21743 21479 21478
+21180 21179 21478
+21744 21479 21743
+21480 20911 20910
+22005 21743 21742
+22005 22006 21743
+22142 22007 22006
+21745 21481 21480
+22008 22145 22146
+22008 22007 22144
+21745 22007 22008
+21744 22006 22007
+22007 21745 21744
+21181 20911 21480
+21744 21745 21480
+22008 22146 22009
+22259 22147 22146
+22010 21746 22009
+22148 22147 22260
+22148 22010 22147
+22147 22259 22260
+22146 22145 22258
+22359 22258 22358
+22145 22008 22144
+22259 22258 22359
+22145 22144 22258
+22357 22256 22356
+22142 22255 22256
+22258 22257 22358
+22143 22142 22257
+22495 22357 22356
+22495 22358 22357
+22012 22148 22260
+22011 21860 22010
+22501 22362 22500
+22262 22151 22150
+22260 22149 22012
+22150 22015 21862
+21746 22010 21860
+22009 22147 22010
+22149 22014 22013
+22014 22150 21862
+22148 22011 22010
+22012 21860 22011
+21747 21746 21860
+21481 21745 21746
+22012 21747 21860
+21861 22014 21748
+22012 22013 21861
+22014 22149 22150
+21861 22013 22014
+22012 22149 22013
+21747 21861 21748
+21747 22012 21861
+21749 21862 22015
+21748 22014 21862
+21623 21749 21750
+21485 21748 21749
+21624 21623 21750
+21486 21485 21623
+21863 21751 21750
+21330 21188 21487
+21864 21752 21751
+21752 21753 21625
+21330 21625 21488
+21752 21865 21753
+21624 21751 21625
+22016 21863 22015
+21625 21751 21752
+21624 21750 21751
+21865 21864 22017
+21751 21863 21864
+22261 22150 22149
+22261 22262 22150
+22150 22151 22015
+22017 21864 22016
+22364 22365 22263
+22017 22016 22151
+22017 22264 22152
+22365 22503 22504
+22505 22366 22504
+22365 22364 22503
+22265 22366 22505
+22152 22264 22366
+22264 22365 22504
+22263 22262 22364
+22262 22363 22364
+22262 22261 22363
+22264 22263 22365
+22264 22151 22263
+22261 22362 22363
+22261 22500 22362
+22259 22360 22260
+22497 22705 22498
+22360 22361 22260
+22360 22497 22498
+22361 22498 22499
+22361 22360 22498
+22361 22499 22500
+22498 22705 22608
+22609 22707 22502
+22502 22362 22501
+22916 22707 22915
+22502 22501 22609
+22499 22608 22500
+22705 22915 22706
+22608 22706 22500
+22706 22915 22707
+23305 23306 22914
+23705 23481 23704
+23307 22915 23306
+22707 22609 22706
+22500 22706 22609
+22608 22705 22706
+23308 22917 23307
+22709 22503 22708
+22363 22610 22503
+22502 22707 22610
+22707 22708 22610
+22916 22709 22708
+22918 22505 22917
+22265 22018 22152
+23307 22917 22916
+22505 22504 22709
+22709 22917 22505
+22709 22916 22917
+23310 23309 23409
+23308 23307 23482
+23565 23486 23409
+23309 23089 23308
+23487 23310 23486
+22919 22711 22710
+23485 23309 23408
+23089 22917 23308
+23485 23409 23309
+23486 23310 23409
+23310 23089 23309
+23310 23311 22918
+22918 22506 22505
+22266 22018 22265
+22505 22266 22265
+21866 21867 21757
+22506 22267 22266
+22269 22508 22509
+23310 22918 23089
+22710 22507 22506
+22505 22506 22266
+22918 22710 22506
+22611 22508 22711
+22021 21867 21866
+21489 22019 21755
+21754 22018 22266
+22267 22268 22019
+22507 22508 22268
+21490 21756 21757
+22020 22268 22269
+22508 22269 22268
+22270 22021 22020
+21756 22020 21866
+21755 22268 22020
+22712 22611 22711
+22509 22270 22269
+23311 22919 22918
+22711 22507 22710
+22919 22787 22711
+22713 22611 22712
+23906 24110 23711
+23311 23310 23487
+22918 22919 22710
+22919 23090 22920
+22713 22787 22920
+22712 22711 22787
+24109 23905 23982
+22788 22715 22714
+23312 22921 23090
+22788 22713 22920
+22612 22713 22714
+22712 22787 22713
+22713 22509 22611
+22714 22715 22612
+23090 22921 22920
+22921 22715 22788
+22368 22367 22511
+22509 22713 22612
+23313 23312 23713
+22921 22788 22920
+23313 22921 23312
+22922 22716 22921
+23314 23315 22923
+22924 22717 22514
+22716 22512 22511
+22922 22923 22512
+22509 22510 22270
+22612 22715 22510
+22512 22716 22922
+22511 22510 22716
+22274 22369 22512
+22273 22272 22369
+22275 22274 22512
+21760 22023 22024
+22276 22025 22513
+21761 21494 21493
+22275 22024 22274
+22025 22026 21762
+21760 21759 22023
+21868 21867 22021
+22023 22153 22024
+22023 22272 22153
+21626 21491 21757
+21868 22021 22022
+22271 22367 22272
+22510 22511 22367
+22022 22272 22023
+22368 22369 22272
+22021 22271 22022
+22270 22510 22271
+22020 22021 21866
+22270 22271 22021
+22023 21759 22022
+21757 21867 21868
+21757 21756 21866
+21755 22019 22268
+21491 21490 21757
+21191 21755 21490
+21868 21758 21757
+21492 20924 21192
+21757 21758 21626
+21868 22022 21759
+21868 21759 21758
+21492 21491 21626
+21492 21759 21760
+21626 21758 21759
+21761 21493 22024
+21493 21492 21760
+22275 21761 22024
+21195 21495 21196
+21493 21494 21193
+21761 22025 21762
+21759 21492 21626
+20924 20662 20661
+20924 21493 20925
+21760 22024 21493
+20397 20663 20398
+20666 20784 20667
+20925 20783 20664
+20926 21193 21047
+20926 20784 20783
+20666 20532 20665
+20398 20399 20065
+20398 20532 20399
+20396 20397 20063
+20662 20663 20397
+20064 20063 20230
+20397 20398 20230
+20395 20396 20062
+20662 20397 20396
+21493 20924 21492
+20925 20664 20663
+20925 20663 20924
+20664 20398 20663
+20661 21192 20924
+20923 21191 21192
+20661 20660 20923
+20395 20394 20660
+21192 20661 20923
+20662 20395 20661
+20061 19725 20060
+20658 20657 20781
+20058 20392 20393
+20389 20388 20527
+20530 20529 20658
+20393 20392 20529
+20530 20658 20659
+20529 20392 20528
+20782 20531 20659
+20393 20529 20530
+20393 20531 20394
+20530 20659 20531
+20659 20781 20782
+20659 20658 20781
+21490 21755 21756
+21754 21488 21753
+20781 20922 20782
+20781 20780 20921
+21191 21489 21755
+21191 20921 21190
+20781 20657 20780
+20658 20529 20657
+20922 20921 21191
+20922 20781 20921
+20529 20528 20657
+20655 20780 20656
+20780 20920 20921
+21189 21330 21488
+21191 21190 21489
+20920 20919 21190
+21489 21754 22019
+21489 21190 21754
+20919 21189 21190
+20919 21188 21189
+20528 20390 20527
+20654 20920 20655
+20656 20528 20655
+20388 20654 20527
+20655 20528 20527
+20228 20054 20388
+20657 20528 20656
+20390 20229 20228
+20392 20391 20528
+20229 20057 20056
+20390 20228 20389
+20054 19886 20227
+20229 20390 20391
+20389 20527 20390
+19404 19250 19403
+19404 19112 19250
+19405 19251 19404
+18956 18842 18955
+19720 19721 19553
+19886 20054 19887
+20055 20054 20228
+20055 19887 20054
+19722 19887 19888
+19721 19886 19887
+20056 20055 20228
+20056 19887 20055
+20228 20229 20056
+19724 19725 19408
+20392 20229 20391
+20392 20058 20229
+19721 19887 19722
+20060 20393 20394
+19721 19722 19404
+19405 19406 19252
+19722 19405 19404
+19722 19888 19723
+19252 19116 18958
+19114 19115 18957
+19114 19251 19115
+19405 19252 19115
+19405 19722 19723
+18847 18846 19116
+18845 19115 18958
+18560 18691 18561
+18957 19115 18845
+18403 18561 18562
+18691 18844 18845
+18957 18845 18844
+18842 18956 18843
+19405 19115 19251
+19113 18956 19112
+18689 18690 18558
+18558 18690 18559
+18300 18401 18402
+18299 18558 18401
+18299 18300 18167
+18299 18401 18300
+18401 18560 18402
+18401 18559 18560
+18094 18093 18168
+18091 18299 18167
+18093 17977 18092
+17732 17812 17910
+17731 17908 17909
+17393 17551 17552
+17730 17731 17551
+17551 17629 17552
+17551 17731 17629
+17911 17732 17910
+18092 17977 18091
+18168 18303 18169
+17554 17733 17734
+17554 17553 17733
+17733 17911 17912
+17733 17732 17911
+17911 17979 17912
+17911 17978 17979
+17978 18095 17979
+18094 18168 18169
+18094 18169 18095
+18303 18304 18170
+18301 18402 18403
+18167 18300 18301
+18302 18403 18303
+18402 18560 18561
+18562 18561 18691
+18403 18402 18561
+18958 18692 18845
+18692 18404 18562
+18846 18692 18958
+18562 18845 18692
+18303 18404 18304
+18303 18562 18404
+18404 18563 18304
+18098 17914 17913
+17913 18097 18098
+18847 18565 18564
+18169 18170 18095
+18169 18303 18170
+18170 18171 18096
+18170 18304 18171
+18095 18096 17979
+18097 18172 18173
+18171 18097 18096
+17734 17733 17912
+17734 17913 17735
+17912 18096 17913
+18173 18098 18097
+18567 18310 18101
+18096 18097 17913
+18171 18172 18097
+18305 18173 18172
+18309 18566 18567
+18306 18307 18098
+17736 17556 17555
+17913 17914 17735
+18099 18100 17914
+18174 18100 18099
+17737 17557 17736
+18100 17736 17914
+18100 18101 17736
+17915 18101 18102
+17737 17736 18101
+17737 17915 17738
+17737 18101 17915
+18101 18309 18567
+18101 18100 18309
+18305 18306 18173
+18308 18100 18174
+18100 18308 18309
+18307 18099 18098
+18564 18565 18305
+18307 18174 18099
+18565 18566 18307
+18308 18174 18307
+18306 18565 18307
+19119 18567 18566
+19726 19409 19408
+19119 18566 19118
+19408 19409 19118
+19728 19410 19119
+20065 20066 19729
+19730 19731 19411
+19726 19408 19725
+19118 18566 18565
+19406 19407 19116
+19408 19118 19117
+18305 18565 18306
+19117 19118 18565
+18304 18564 18305
+18563 18692 18846
+18304 18563 18564
+18404 18692 18563
+18565 18847 19117
+18564 18563 18847
+19252 19406 19116
+19723 20058 20059
+19116 18846 18958
+18847 18563 18846
+19723 19407 19406
+19724 19408 19117
+20061 19726 19725
+20062 20063 19727
+19405 19723 19406
+19888 20057 20058
+19723 20059 19407
+20060 20394 20061
+19888 20058 19723
+20057 20229 20058
+19407 20059 19724
+20058 20393 20059
+20059 20060 19724
+20059 20393 20060
+20396 20063 20062
+20230 20065 20064
+20062 19727 19726
+19889 19728 19727
+19889 20064 20065
+19889 20063 20064
+19727 19728 19409
+19889 20065 19728
+19729 20066 20067
+20065 20399 20066
+19410 19729 19730
+19410 19728 19729
+20533 20666 20667
+20665 20783 20666
+20668 20401 20068
+20399 20532 20533
+20668 20068 20400
+19730 19729 20067
+20668 20400 20667
+20067 20066 20400
+20928 20929 20667
+20669 20401 20668
+20670 20401 20669
+20068 19730 20067
+20402 20670 20671
+20669 20930 20670
+20402 20671 20403
+20931 21498 20932
+20403 20071 20070
+19735 19555 19734
+20069 20068 20401
+19732 19733 19413
+20070 20402 20403
+20070 20069 20402
+19253 19415 19555
+19414 19413 19733
+19890 19734 20070
+19890 19891 19735
+19890 19735 19734
+20534 20535 20407
+18849 18959 18694
+19415 19414 19554
+19253 19123 19414
+19555 19415 19554
+19253 19414 19415
+19120 19412 19121
+19414 19122 19413
+20069 19732 20068
+19733 19554 19414
+20069 19733 19732
+20069 20070 19733
+20068 19731 19730
+19732 19413 19412
+19412 19411 19731
+19120 19410 19411
+19732 19412 19731
+19413 19122 19121
+19412 19120 19411
+18848 18569 18568
+19120 19121 18848
+19412 19413 19121
+18405 18570 18694
+18569 18693 18570
+18312 18311 18569
+18848 18568 19120
+18569 18405 18312
+18103 18102 18310
+18175 18103 18311
+18310 18567 18568
+18103 18310 18311
+18102 18101 18310
+18175 18104 18103
+17980 17916 18103
+18695 18960 18850
+18961 19254 19125
+17980 18103 18104
+18312 18175 18311
+18312 18104 18175
+18960 18961 18851
+19124 19254 18961
+19417 19126 19125
+18575 18574 18853
+19416 19417 19125
+19416 19556 19417
+19558 19417 19557
+19558 19557 19736
+19417 19556 19557
+19737 19558 19736
+19418 19417 19558
+18693 18849 18694
+19122 18959 18849
+19122 19414 19123
+18959 19122 19123
+20074 19738 19893
+19737 19736 19892
+20407 20408 20076
+19255 19422 19130
+19255 19420 19421
+19741 19895 19742
+19893 19738 19737
+19418 19558 19737
+19892 19893 19737
+19739 19419 19738
+18575 19126 18576
+19418 19737 19419
+19125 19126 18853
+19418 19419 19126
+18576 19127 18577
+19419 19739 19127
+19127 19128 18577
+19129 19130 18854
+18577 19128 18854
+19127 19739 19128
+19128 19129 18854
+19128 19420 19129
+19559 19421 19420
+19742 19896 19743
+19420 19255 19129
+19421 19422 19255
+19132 18962 19131
+19131 19256 19257
+18698 18856 18581
+19131 18962 18855
+19131 19257 19132
+18856 18962 19132
+19743 19560 19742
+19423 19256 19560
+19740 19741 19420
+19895 19896 19742
+19559 19422 19421
+19560 19256 19422
+19420 19741 19559
+19740 20077 19741
+19559 19742 19560
+19559 19741 19742
+19423 19560 19743
+20077 20236 20078
+20078 19741 20077
+20537 20410 20409
+20237 20236 20410
+20536 20409 20408
+20410 20236 20409
+20076 20408 20077
+20407 20535 20408
+19739 20076 19740
+20408 20409 20077
+19740 20076 20077
+19739 19894 20075
+20073 19893 19892
+20073 20074 19893
+20076 20075 20407
+20076 19739 20075
+20075 20235 20407
+20075 19894 20235
+20407 20235 20406
+20072 20232 20233
+20071 20403 20231
+20404 20405 20233
+20231 20072 20071
+19891 19890 20071
+19891 20071 20072
+20404 20231 20403
+20232 20072 20231
+20232 20404 20233
+20404 20672 20405
+20404 20671 20932
+20405 20672 20673
+20675 20535 20674
+20536 20675 20676
+20675 20536 20408
+20676 20537 20536
+20673 20933 20934
+21768 21500 21767
+21501 21502 21200
+21499 22031 21767
+21767 22033 21768
+21769 21501 21500
+21769 21627 21501
+22035 21770 21769
+21628 21502 21627
+21770 21629 21628
+21630 21332 21502
+21771 21630 21629
+21631 21503 21332
+21771 21631 21630
+21632 21503 21631
+21771 22036 21772
+22035 22521 22522
+21771 21770 22035
+21628 21627 21770
+20933 20932 21499
+22032 22033 21767
+22034 21768 22033
+21769 21500 21768
+22033 22032 22283
+22280 21766 22029
+22518 22371 22614
+22283 22032 22031
+22519 22031 22282
+21499 21199 20933
+22280 22281 22030
+22282 22030 22281
+22370 22280 22279
+21495 21496 21196
+22031 22030 22282
+22031 21498 22030
+21766 21765 22029
+21766 21498 21497
+21766 21497 21765
+20931 20670 20930
+20672 20932 20933
+21766 22030 21498
+22031 21499 21498
+21767 21199 21499
+21498 20931 21497
+20671 20670 20931
+20404 20932 20672
+20671 20931 20932
+21198 20930 21197
+20669 20668 20930
+21331 21495 21195
+21197 21049 21196
+21496 21198 21197
+21497 20931 21198
+20927 21047 21048
+21762 22026 22027
+20927 21048 20928
+21196 21049 21048
+20667 20929 20668
+21048 21049 20929
+20784 20927 20928
+20783 20925 20926
+20784 20926 20927
+20925 21493 21193
+20667 20784 20928
+20666 20783 20784
+20925 21193 20926
+21194 21195 21047
+20926 21047 20927
+21193 21194 21047
+21494 21331 21193
+21193 21331 21194
+22277 22027 22026
+21764 21497 21198
+21194 21331 21195
+21494 21761 21495
+21496 21495 21762
+21331 21494 21495
+22275 22025 21761
+22275 22513 22025
+21496 21762 21763
+21495 21761 21762
+21762 22027 21763
+22278 22279 22028
+22027 22028 21869
+22027 22277 22278
+21196 21496 21197
+21763 21869 21764
+22027 21869 21763
+21871 22029 21765
+21763 21764 21496
+21871 22028 22029
+21869 21870 21764
+21869 22028 21870
+21764 21871 21765
+21870 22028 21871
+22613 22719 22517
+22927 22926 23093
+22517 22614 22371
+23092 23091 23317
+22517 22719 22614
+22613 22718 22719
+22280 22517 22371
+22370 22516 22517
+22279 22280 22029
+22371 22281 22280
+22517 22516 22613
+22370 22279 22515
+22514 22276 22513
+22277 22026 22276
+22027 22278 22028
+22277 22514 22278
+22923 22924 22513
+22277 22276 22514
+22719 22718 22925
+22613 22516 22515
+22370 22515 22516
+22278 22514 22717
+22718 22717 22925
+22718 22515 22717
+23713 23714 23313
+22924 22514 22513
+22922 23314 22923
+23316 22925 22924
+24739 24740 24516
+23315 23316 22924
+23714 24113 24114
+23488 23489 23316
+23714 24114 23715
+23315 23314 23715
+23491 23317 23490
+23316 23315 23488
+23490 23317 23316
+22925 22717 22924
+23091 22925 23316
+23091 22926 22925
+23316 23317 23091
+23316 23489 23490
+23716 23490 23489
+23717 23566 23491
+23717 23491 23490
+23566 23567 23492
+23411 23492 23568
+23411 23319 23492
+23568 23492 23567
+23319 23318 23410
+23320 23493 23494
+23411 23568 23493
+23317 23318 23092
+23319 23320 23093
+23093 23318 23319
+23317 23491 23318
+23319 23410 23492
+23318 23491 23410
+22926 23092 23093
+22926 23091 23092
+23094 22927 23093
+22720 22719 22926
+22281 22518 22282
+22614 22719 22720
+22721 22518 22720
+22281 22371 22518
+22518 22721 22282
+22720 22926 22721
+22519 22927 22928
+22721 22926 22927
+23094 23095 22927
+22284 22035 22034
+22721 22519 22282
+22721 22927 22519
+22519 22520 22283
+22928 22929 22520
+22929 22521 22520
+22520 22521 22284
+22284 22521 22035
+22521 22930 22522
+22035 22522 22036
+22521 22929 22930
+22522 22930 22722
+22929 23323 22930
+23720 23321 23494
+22928 22927 23095
+23722 23323 23322
+23495 23096 23323
+22928 23321 23322
+22928 23095 23321
+23721 23322 23321
+23323 22929 23322
+24120 24209 24121
+23723 23495 23722
+23510 23733 23335
+23920 24133 23733
+23918 23919 23731
+23920 23510 23732
+24300 24535 24130
+23918 23730 23917
+24130 24131 23917
+24132 24302 23920
+24301 24537 24132
+23920 23732 23919
+24759 25017 24537
+24762 25020 25021
+24537 24538 24302
+24760 25019 24761
+24133 24539 24134
+24760 25018 25019
+24132 24537 24302
+24759 25016 25017
+24535 24759 24536
+24759 24537 24536
+24131 24132 23919
+24131 24301 24132
+24535 24534 24638
+25012 25011 25253
+24757 24756 24844
+24128 24129 23728
+24534 24757 24638
+25015 24759 24758
+24757 24637 24756
+24533 24129 24128
+24128 24532 24533
+25011 25012 24754
+24756 24637 24755
+24534 24300 24533
+24755 24533 24754
+24637 24757 24534
+24637 24534 24533
+24638 24758 24535
+24301 24535 24536
+24301 24131 24130
+23916 24130 23917
+24300 24534 24535
+23916 24300 24130
+24129 24533 24300
+24129 23916 23729
+24129 24300 23916
+24126 23915 23726
+24127 24128 23915
+24126 24299 24127
+24532 25011 24754
+24299 24128 24127
+24299 24532 24128
+23915 24126 24127
+24377 24529 24530
+23914 24125 23725
+24528 24297 24125
+23725 24126 23726
+24125 24297 24126
+23723 23914 23724
+23723 23722 23913
+23723 23913 24124
+23722 23721 24122
+23914 24124 24125
+23913 24122 24123
+24749 24527 24526
+23913 23722 24122
+24527 24296 24526
+24123 24122 24296
+24124 24123 24296
+24124 23913 24123
+24636 24529 24750
+24297 24528 24529
+24209 24376 24294
+24122 23721 24121
+25007 24527 24749
+24528 24124 24527
+25006 24749 25005
+24296 24122 24526
+24843 24751 24750
+24529 24528 24750
+25009 24843 24750
+24752 24636 24751
+24531 24530 24636
+24530 24529 24636
+24752 24531 24636
+24377 24297 24529
+24531 24377 24530
+24298 24297 24377
+24753 24531 24752
+24299 24298 24531
+24531 24753 24299
+25251 25133 25250
+25011 24532 24753
+24754 24533 24532
+24752 25010 24753
+24752 24751 24843
+25346 25347 25253
+24755 24754 25012
+25252 25251 25343
+25010 25133 25251
+25249 25008 25505
+25009 24750 25008
+25010 24843 25009
+25010 24752 24843
+25504 25007 25248
+25008 24527 25007
+24295 24525 24526
+25243 25002 25242
+24748 24749 24526
+25006 25007 24749
+25004 25131 25132
+24747 24524 24523
+24748 25004 25005
+24748 24747 25003
+25246 25132 25131
+25247 25005 25132
+25506 25249 25505
+25250 25133 25249
+25245 25501 25246
+25503 25743 25636
+25005 25247 25248
+25246 25502 25247
+25990 26203 25991
+25505 25007 25504
+25507 25506 25747
+25342 25250 25249
+25507 25342 25506
+25507 25343 25342
+25508 25509 25345
+25508 25637 25509
+25508 25343 25507
+25344 25252 25343
+25345 25252 25344
+25011 24753 25252
+25347 25346 25510
+25253 25345 25346
+25347 25510 25511
+25346 25509 25510
+25348 25347 25511
+25254 25253 25347
+25348 25511 25512
+25510 25749 25511
+25513 25256 25512
+25254 25347 25348
+25752 25513 25751
+25349 25256 25513
+25514 25349 25513
+25256 25255 25512
+25014 25255 25256
+24844 24756 24755
+25257 25256 25349
+25134 25014 25256
+25255 25254 25348
+25012 25253 25254
+25014 25013 25255
+24755 25012 25013
+25014 24844 25013
+25014 24845 24844
+25015 24845 25014
+24758 24638 24757
+24758 24845 25015
+24758 24757 24845
+25514 25258 25349
+25134 25256 25257
+25260 25017 25259
+25016 25015 25258
+25349 25258 25257
+25259 25016 25258
+25350 25260 25259
+24759 25015 25016
+24538 24760 24539
+24538 24537 24760
+24537 25017 24760
+25016 25259 25017
+25261 25019 25018
+25020 25263 25135
+25519 25261 25518
+25352 25262 25261
+25258 25514 25259
+25351 25261 25260
+25516 25260 25350
+25261 25018 25260
+25754 25638 25753
+25515 25259 25514
+25517 25351 25260
+25517 25518 25351
+25261 25262 25019
+25839 25838 26001
+25352 25520 25262
+25519 25518 25639
+25520 25640 25756
+25520 25352 25640
+25755 25754 25998
+25518 25517 25754
+25755 25639 25754
+25755 25640 25519
+25352 25519 25640
+25352 25261 25519
+25752 25753 25514
+25754 25517 25638
+25753 25515 25514
+25516 25350 25515
+25638 25516 25515
+25638 25517 25516
+25994 25750 25749
+25751 25512 25750
+26209 25996 26208
+25514 25513 25752
+25996 25997 25753
+25997 25998 25754
+25752 25996 25753
+26210 26617 26454
+26450 25995 26207
+26208 25996 25995
+25995 25996 25752
+26209 25997 25996
+26539 26449 26448
+25995 25750 26207
+25998 25999 25755
+26099 26213 26291
+26291 26100 26099
+25999 26098 26099
+25837 25756 25836
+26000 26100 26101
+26000 25836 26100
+25640 25755 25836
+26102 26000 26101
+26102 26001 25838
+25836 25756 25640
+25836 26000 25837
+26102 25837 26000
+25838 25756 25837
+26102 25838 25837
+26001 26103 25839
+26102 26215 26103
+26102 26101 26215
+26211 26098 25998
+26099 26100 25999
+26212 26213 26098
+26291 26457 26214
+26212 26211 26290
+25997 26209 26210
+26098 26213 26099
+26212 26290 26213
+26458 26214 26457
+26101 26100 26214
+26100 26291 26214
+26213 26290 26456
+26291 26544 26457
+26459 26292 26545
+26292 26215 26458
+26454 26543 26455
+26618 26801 26619
+26211 26454 26455
+26210 26209 26453
+26213 26456 26291
+26290 26455 26456
+26617 26453 26616
+26289 26208 26451
+26453 26542 26616
+26615 26450 26614
+26210 26453 26617
+26209 26289 26453
+26798 26663 26867
+26540 26539 26613
+26539 26612 26613
+26538 26611 26661
+26615 26451 26450
+26450 26207 26449
+26538 26448 26611
+25994 25749 25748
+26614 26450 26541
+26451 26208 26450
+26452 26451 26542
+26452 26289 26451
+26211 26210 26454
+26211 25998 26210
+26448 26449 26207
+26540 26541 26449
+26453 26289 26452
+26209 26208 26289
+26609 26536 26535
+25748 25749 25637
+26446 26533 26534
+26447 26535 26536
+26608 26534 26533
+26919 26918 27078
+26659 26535 26534
+26536 26610 26447
+26448 26537 26611
+26448 26447 26537
+26661 26610 26660
+26537 26447 26610
+26794 26609 26535
+26610 26536 26609
+26661 26660 26795
+26610 26609 26660
+26535 26659 26794
+26658 26793 26659
+26533 26445 26657
+26444 26606 26656
+26658 26608 26533
+26658 26659 26608
+26288 26604 26442
+26531 26604 26789
+26604 26788 26789
+26860 26915 26861
+26791 26656 26790
+26607 26444 26656
+26530 26654 26603
+26653 26786 26787
+26530 26602 26653
+26788 26604 26655
+26288 26203 26202
+26529 26439 26601
+26529 26283 26439
+26441 26286 26603
+26440 26602 26530
+26443 26532 26444
+26605 26789 26790
+26531 26443 26203
+26531 26605 26443
+26655 26441 26603
+26604 26288 26441
+26531 26442 26604
+26531 26203 26442
+26439 26282 26528
+26200 25989 25988
+26283 26200 26282
+26283 26284 26200
+26286 26201 26285
+26286 26202 26201
+26288 26202 26287
+26203 25990 26202
+26530 26286 26285
+26287 26202 26286
+26441 26288 26287
+26442 26203 26288
+26204 26444 26205
+26444 26607 26445
+26205 26446 26206
+26445 26533 26446
+26535 26447 26446
+26448 26207 26206
+26447 26206 26446
+26447 26448 26206
+26445 26205 26444
+25746 25505 25504
+25992 26205 25993
+26445 26446 26205
+25745 25991 25746
+25835 25990 25991
+25992 25993 25747
+26205 26206 25993
+26207 25994 26206
+26207 25750 25994
+25508 25748 25637
+25993 25994 25748
+26204 25992 25991
+25747 25505 25746
+25746 25992 25747
+25746 25991 25992
+25835 25745 25744
+25746 25504 25745
+25990 25835 25743
+25745 25504 25636
+25745 25835 25991
+25744 25743 25835
+25744 25636 25743
+25504 25248 25503
+25501 25988 25989
+25989 25743 25502
+25504 25503 25636
+25248 25247 25503
+25741 25987 25742
+26199 26282 26200
+25742 25987 25988
+26198 26199 25987
+25499 25740 25500
+25985 26196 26097
+25739 25740 25499
+25985 25834 25740
+25740 25741 25500
+25834 25986 25741
+25984 25985 25833
+25497 25634 25736
+25635 25497 25736
+26191 26192 25983
+25737 25635 25983
+26095 25984 25739
+25985 25740 25833
+26094 26191 25983
+26596 26432 26595
+26094 26093 26190
+26190 26191 26094
+26190 26189 26270
+26430 26270 26269
+26093 25982 26189
+26191 26272 26192
+26191 26190 26271
+26271 26432 26272
+26274 26193 26273
+26272 26432 26273
+26275 26193 26274
+25739 25984 25833
+26095 26195 25984
+26276 26277 26195
+26277 26278 26196
+26197 25986 26097
+25987 25741 25986
+26097 26196 26278
+25985 26096 26196
+26197 26097 26278
+25986 25834 26097
+25987 26199 25988
+26198 26280 26199
+26276 26434 26435
+26435 26278 26277
+26436 26279 26278
+26198 25986 26197
+26278 26279 26197
+26525 26599 26526
+26600 26528 26527
+26281 26282 26199
+26438 26281 26280
+26528 26282 26281
+26526 26527 26280
+26528 26281 26438
+26198 26437 26280
+26599 26649 26526
+26649 26650 26600
+26528 26438 26527
+26274 26273 26433
+26598 26524 26436
+26599 26525 26524
+26437 26279 26525
+26526 26437 26525
+26526 26280 26437
+26276 26435 26277
+26523 26436 26435
+26271 26431 26432
+26780 27069 27070
+26273 26432 26433
+26594 26522 26780
+26270 26430 26522
+26267 26429 26268
+26521 26593 26430
+26429 26430 26268
+26429 26521 26430
+26271 26270 26431
+26269 26268 26430
+26435 26434 26523
+26275 26274 26433
+26433 26434 26275
+26194 26276 26195
+26275 26434 26276
+26189 26269 26270
+26189 26268 26269
+26191 26271 26272
+26190 26270 26271
+26262 26184 26425
+26185 26186 26089
+26184 26183 26425
+26184 26087 26183
+26423 26261 26181
+26183 26086 26182
+26185 26262 26263
+26185 26184 26262
+26266 26187 26265
+26187 25981 25980
+26188 26266 26267
+26265 26427 26266
+26188 26187 26266
+26264 26427 26265
+26521 26428 26592
+26521 26429 26428
+26263 26426 26264
+26591 26592 26427
+26425 26183 26424
+26591 26426 26778
+26427 26264 26426
+26423 26260 26589
+25832 25976 25977
+26260 26259 26422
+26260 26181 26084
+26777 26423 26589
+26181 26182 26085
+26260 26422 26589
+26258 26257 26421
+26588 26421 26256
+26257 26179 26256
+26257 26256 26421
+26176 26419 26586
+26256 26081 26178
+26259 26180 26258
+25975 26084 25976
+26424 26261 26423
+26424 26182 26261
+26423 26181 26260
+26261 26182 26181
+25825 25972 25973
+26178 26081 26080
+26258 26180 26083
+26259 26260 26180
+26179 26082 26081
+26083 26180 26084
+25828 25827 25974
+26084 25975 26083
+25974 26082 26083
+25830 25975 25831
+25974 26083 25975
+26260 26084 26180
+26085 25976 26084
+26185 26089 26184
+25977 25976 26085
+26187 26186 26264
+26265 26187 26264
+26090 25981 26187
+26268 26188 26267
+26091 26090 26188
+26188 26092 26091
+26189 25982 26092
+26089 26088 26184
+25979 25978 26087
+26187 25980 26186
+25978 25977 26086
+26088 25979 26087
+26089 25979 26088
+26089 26186 25980
+26089 25980 25979
+25234 25235 25126
+25975 25976 25831
+25123 25122 25232
+25831 25976 25832
+25230 25340 25341
+25829 25975 25830
+25340 25339 25735
+25974 25975 25829
+25735 25829 25830
+25825 25826 25734
+25973 26081 25974
+25826 25973 25827
+25735 25828 25829
+25341 25340 25492
+25122 24993 25121
+25341 25492 25493
+25339 25340 25230
+25490 25337 25228
+25491 25338 25337
+25118 25229 25339
+25337 25229 25228
+25338 25339 25229
+24842 24991 24736
+25229 25118 24991
+25119 25118 25230
+24992 24991 25118
+24738 24737 24992
+24113 24516 24517
+25341 25120 25230
+25120 24992 25119
+24992 25120 24993
+25119 25230 25120
+24995 24740 24994
+25123 24995 24994
+24993 24739 24738
+24517 24742 24518
+24994 24740 24739
+23907 24116 23908
+25124 24996 24995
+24997 24742 24996
+25124 24995 25123
+24996 24741 24995
+25233 25124 25123
+25232 25233 25123
+25494 25234 25233
+24994 24993 25122
+25120 25341 25231
+24994 25122 25123
+25121 25231 25122
+25121 25120 25231
+25233 25232 25494
+25122 25231 25232
+25235 25234 25495
+25124 25233 25234
+24997 24996 25126
+24996 25124 25125
+24997 25126 25127
+25125 25234 25126
+25496 25237 25236
+25496 25497 25237
+25128 25235 25236
+25127 25126 25235
+25497 25496 25634
+25236 25495 25496
+25498 25497 25635
+25238 25237 25497
+25497 25498 25238
+25635 25737 25498
+25500 25742 25501
+25500 25741 25742
+25988 25501 25742
+25502 25246 25501
+25238 25239 25000
+25498 25738 25240
+25498 25240 25239
+25499 25241 25240
+25243 25242 25500
+24522 24523 24290
+25501 25244 25500
+25244 25245 25003
+24748 24525 24747
+25243 25500 25244
+25003 25245 25131
+25244 25501 25245
+25240 25001 25000
+25241 25242 25001
+25242 25002 25001
+25243 25244 25002
+24743 24518 24742
+25130 25236 25237
+24998 25129 25130
+25128 25127 25235
+24998 25130 24999
+25129 25236 25130
+24998 25128 25129
+24997 25127 25128
+24996 24742 24741
+24997 24998 24743
+24744 24743 24999
+24997 25128 24998
+24520 24521 24289
+24746 25002 24747
+24115 24520 24116
+24521 24290 24289
+23911 24118 24119
+24521 24522 24290
+25001 24746 24521
+24746 24523 24522
+24521 24746 24522
+25001 25002 24746
+24746 24747 24523
+24121 24295 24122
+25244 25003 25002
+25003 25004 24748
+25002 25003 24747
+25131 25004 25003
+24747 24525 24524
+24748 24526 24525
+24291 24375 24292
+24523 24524 24375
+24292 24375 24293
+24375 24524 24376
+24119 24291 24208
+24375 24376 24293
+24208 24293 24120
+24208 24292 24293
+24121 24294 24295
+24376 24525 24294
+24120 24121 23912
+23722 23322 23721
+24293 24209 24120
+24293 24376 24209
+23912 24121 23721
+24209 24294 24121
+24118 23911 23910
+24119 23912 23911
+24290 24118 24289
+24290 24119 24118
+24523 24291 24290
+24292 24208 24291
+24116 24117 23983
+24289 24118 24117
+23494 23719 23911
+23719 23718 23910
+23911 23719 23910
+23493 23568 23719
+23983 23908 24116
+23983 23909 23908
+23908 23717 23907
+23907 23717 23716
+23488 23715 23716
+24115 24116 23907
+24114 24113 24517
+24743 24998 24999
+23716 24115 23907
+24288 24519 24115
+24117 23984 23983
+23985 23909 23984
+24521 24520 25000
+24289 24116 24520
+25000 24745 24999
+24519 24288 24518
+24519 24745 24520
+24744 24999 24745
+24518 24743 24744
+24742 24997 24743
+24745 24519 24744
+24288 24517 24518
+24744 24519 24518
+24520 24115 24519
+24113 24112 24516
+24741 24742 24517
+24111 24515 24112
+24740 24741 24516
+24516 24741 24517
+24740 24995 24741
+24515 24514 24737
+24635 24736 24514
+23312 23712 23713
+24110 24286 24287
+24514 24515 24111
+24738 24739 24515
+23712 24112 23713
+24515 24516 24112
+24115 24114 24288
+23713 24112 24113
+23716 23715 24115
+23715 23314 23714
+24115 23715 24114
+23488 23315 23715
+23487 23711 23311
+24111 24112 23712
+23313 23714 23314
+23713 24113 23714
+23311 23711 23712
+23487 23486 23710
+24110 23906 24109
+23711 23487 23906
+23905 23710 23824
+23905 23906 23710
+23484 23485 23408
+23709 23710 23565
+23564 23565 23485
+23710 23486 23565
+23485 23484 23564
+23408 23308 23483
+23482 23707 23483
+23484 23408 23483
+23482 23706 23901
+23707 23708 23564
+23823 23707 23902
+23564 23483 23707
+23823 23708 23707
+23823 23709 23708
+23903 23823 23902
+23904 23824 23823
+24283 24284 24108
+23905 23904 23982
+23903 23902 23981
+23707 23901 23902
+23904 23903 23981
+23904 23823 23903
+24108 24107 24283
+23981 23902 24107
+24509 24373 24284
+23982 23981 24108
+24110 24109 24285
+23906 23905 24109
+24511 24373 24510
+24285 24109 24284
+24509 24284 24283
+24373 24374 24285
+24373 24285 24284
+24287 24514 24111
+24374 24286 24285
+24111 23711 24110
+24285 24286 24110
+24512 24634 24513
+24110 24287 24111
+24286 24374 24512
+24287 24513 24514
+24287 24286 24512
+24512 24511 24632
+24374 24373 24511
+24287 24512 24513
+24374 24511 24512
+24510 24631 24511
+24733 24840 24841
+24632 24633 24512
+24632 24733 24633
+24513 24635 24514
+24513 24634 24635
+24841 24735 24734
+24841 24990 24842
+24840 24989 24841
+25228 25229 24990
+24735 24842 24736
+24735 24841 24842
+24839 24838 24988
+24508 24730 24731
+24839 24732 24838
+24632 24511 24631
+24633 24733 24734
+24732 24839 24733
+24731 24837 24732
+24838 24732 24837
+24731 24631 24509
+24729 24507 24728
+25117 24987 24835
+24987 24988 24837
+24833 24834 24728
+25115 25116 24986
+24832 24833 24727
+24834 24729 24728
+24508 24729 24730
+24985 25115 24986
+24509 24508 24731
+24729 24985 24986
+24631 24731 24732
+24730 24835 24731
+24632 24631 24732
+24508 24283 24507
+24510 24509 24631
+24510 24373 24509
+24107 24507 24283
+24506 24728 24507
+24283 24508 24509
+24507 24729 24508
+24106 24105 24282
+24502 24369 24501
+24104 24280 24281
+24279 24369 24370
+24503 24725 24504
+24504 24505 24372
+24372 24371 24503
+24280 24370 24371
+24281 24372 24505
+24281 24280 24372
+24726 24505 24504
+24981 24832 24831
+24982 24833 24832
+24727 24833 24728
+24502 24724 24503
+25484 25483 25617
+24370 24503 24371
+24724 24725 24503
+24503 24504 24372
+24725 24726 24504
+24502 24501 24630
+24368 24278 24367
+24722 24723 24630
+24366 24626 24500
+24276 24277 24207
+24628 24500 24627
+24628 24501 24367
+24630 24629 24722
+24630 24501 24629
+24367 24366 24500
+24624 24623 24720
+24628 24367 24500
+24368 24369 24278
+24723 24502 24630
+24370 24369 24502
+24104 24103 24280
+24103 23979 23978
+24367 24278 24277
+24279 24280 24103
+24501 24368 24367
+24501 24369 24368
+24102 24101 24278
+23890 23891 23817
+24102 23895 23894
+23478 23303 23302
+23701 23895 23702
+23894 24101 24102
+23821 23896 23897
+23895 23977 23896
+24279 24102 24278
+23977 23895 24102
+24103 23978 23977
+23978 23896 23977
+24102 24103 23977
+23979 23896 23978
+24279 24103 24102
+24104 23979 24103
+24281 24105 24104
+24281 24282 24105
+24106 23901 23900
+24106 24107 23901
+23979 23980 23897
+24105 23899 23898
+24106 23900 23899
+23901 23707 23482
+23980 23898 23897
+23481 23306 23305
+23897 23898 23822
+23980 24105 23898
+23898 23705 23822
+23899 23706 23705
+23308 23482 23483
+23307 23706 23482
+23480 23481 23305
+23705 23306 23481
+23900 23706 23899
+23900 23901 23706
+23703 23704 23481
+23703 23820 23821
+23702 23819 23703
+23819 23895 23896
+23896 23821 23820
+23897 23822 23821
+23703 23819 23820
+23702 23895 23819
+23895 23701 23894
+23702 23480 23701
+23479 23480 23304
+23702 23703 23480
+23700 23479 23478
+23701 23480 23479
+23699 23700 23477
+23479 23303 23478
+23699 23817 23818
+23816 23889 23890
+23892 23700 23818
+23701 23479 23700
+23894 23893 24101
+23894 23701 23893
+23974 23975 23889
+23893 23700 23892
+24206 24100 24205
+23891 23818 23817
+23892 24100 23893
+23976 24099 24100
+24098 23975 23974
+24098 24099 23975
+23816 23890 23817
+23889 23975 23890
+23976 23891 23890
+23892 23818 23891
+23697 23698 23563
+23815 23816 23698
+23697 23815 23698
+23814 23888 23815
+23698 23816 23817
+23815 23889 23816
+24096 23972 23886
+23973 23888 23887
+23815 23697 23814
+23563 23475 23562
+23886 23813 23812
+23886 23887 23813
+23562 23475 23474
+23563 23476 23475
+23407 23476 23301
+23563 23698 23476
+23478 23477 23700
+23476 23698 23699
+23302 23477 23478
+23302 23301 23477
+23299 23300 23168
+23475 23476 23407
+23300 23407 23301
+23300 23406 23407
+23406 23475 23407
+23082 22908 23014
+22695 22488 22603
+23474 23475 23406
+22908 22907 23014
+22906 22694 22693
+22908 22783 22907
+22908 22695 22783
+22783 22782 22907
+22603 22487 22694
+22693 22694 22487
+22693 22905 22906
+22782 22694 22906
+22907 23081 23014
+22907 22906 23081
+23081 23082 23014
+23081 23298 23082
+23694 23810 23695
+23690 23883 23691
+24092 23691 23883
+23884 23694 23693
+23473 23472 23561
+23298 23472 23473
+23811 23695 23810
+23811 23696 23695
+23885 23811 23810
+23885 23812 23811
+23695 23696 23561
+23812 23813 23696
+23884 24272 24095
+24095 24096 23885
+23810 23884 23885
+24716 24717 24496
+24713 24714 24495
+24095 23885 23884
+23694 23884 23810
+24094 24272 23884
+24495 24095 24272
+24273 24096 24095
+24093 24092 24268
+24091 23971 24202
+23881 24090 23971
+23690 23882 23883
+23690 23881 23882
+24266 24267 24092
+23971 24090 24202
+23883 24091 24266
+23883 23882 24091
+24493 24621 24363
+24490 24268 24267
+24091 24202 24265
+24362 24269 24491
+24492 24362 24491
+24270 24093 24269
+24493 24270 24362
+24363 24621 24494
+24493 24492 24620
+24493 24362 24492
+24270 24269 24362
+24493 24620 24621
+24492 24491 24620
+24270 24363 24271
+24270 24493 24363
+25608 25710 25711
+24272 24271 24494
+24494 24713 24272
+24715 24273 24495
+24720 24719 24979
+24718 24978 24826
+24274 24497 24623
+24497 24496 24622
+24625 24720 24827
+24623 24719 24720
+24276 24205 24364
+24203 24098 24274
+24715 24496 24273
+24622 24718 24497
+24624 24498 24623
+24274 24097 24496
+23885 24096 23886
+24273 24496 24097
+24273 24097 24096
+23973 23887 23972
+23974 24097 24098
+23972 24096 24097
+23888 23973 23974
+23972 24097 23973
+24275 24203 24274
+24098 24097 24274
+24623 24498 24274
+24099 23976 23975
+24498 24275 24274
+24204 24203 24275
+24204 24099 24203
+24205 24100 24099
+24205 24204 24275
+24205 24099 24204
+24101 24207 24277
+24101 24100 24207
+24625 24499 24364
+24276 24206 24205
+24366 24276 24365
+24366 24277 24276
+24626 24499 24721
+24364 24275 24498
+24625 24498 24624
+24499 24365 24364
+24625 24364 24498
+24365 24276 24364
+24720 24625 24624
+24827 24980 24721
+24499 24625 24721
+24627 24500 24626
+25326 25223 25222
+25219 25220 25109
+25323 25324 25219
+25325 25480 25222
+25110 25221 25111
+25325 25479 25480
+25221 25325 25222
+25328 25483 25329
+25717 25718 25616
+25327 25224 25481
+25718 25482 25481
+25483 25328 25482
+25477 25612 25323
+25715 25612 25957
+25220 25325 25221
+25220 25324 25325
+25616 25326 25480
+25481 25224 25326
+25322 25218 25217
+25323 25219 25218
+25322 25477 25218
+25613 25715 25614
+25325 25324 25478
+25220 25219 25324
+25216 25322 25217
+25216 25476 25322
+25213 25214 25104
+25475 25215 25214
+24979 25216 25217
+25321 25476 25216
+24825 24977 24978
+25214 25215 25105
+25105 25106 24978
+25215 25321 25106
+25218 25107 25217
+25218 25108 25107
+24827 25108 24980
+25218 25219 25108
+24825 24717 24716
+24622 24496 24717
+25106 24826 24978
+24979 24719 24826
+24715 24716 24496
+24824 24976 24716
+24975 24824 24715
+24824 24716 24715
+24977 24825 24976
+24978 24718 24825
+24715 24495 24823
+24821 24822 24714
+24713 24495 24272
+24823 24714 24822
+24823 24495 24714
+24821 24714 24713
+25470 25102 25208
+24713 24494 24712
+25103 25102 25209
+25210 25103 25209
+25211 25471 25212
+25100 25469 25208
+25948 26405 26406
+25471 25470 25705
+25320 25209 25470
+25950 25471 25949
+25211 25320 25471
+25604 25603 25708
+25604 25474 25603
+24975 24976 24824
+24976 25213 25104
+25105 24977 25104
+25105 24978 24977
+25810 25809 25954
+25812 25811 25955
+25712 25609 25811
+25808 25710 25953
+25606 25709 25607
+25607 25710 25608
+25952 25709 25605
+25952 25953 25709
+25949 25705 25948
+25470 25469 25705
+25707 25706 25951
+25468 25948 25469
+25947 26405 25948
+26407 25949 26406
+25471 25705 25949
+26407 25950 25949
+25706 25472 25950
+25952 26164 25953
+26409 26765 26766
+26762 26763 26406
+26764 26408 26407
+26764 26765 26408
+26405 26762 26406
+26761 27050 26762
+26407 26763 26764
+26407 26406 26763
+27053 27303 27304
+27054 26766 26765
+27054 27305 27055
+26766 26767 26410
+25953 25954 25808
+25712 25812 25956
+25712 25811 25812
+25810 26165 25955
+27056 26768 26767
+25958 25957 26166
+25957 25612 25714
+25716 25958 25813
+25716 25614 25958
+25616 25716 25717
+25614 25478 25613
+25476 25475 25713
+25614 25715 25958
+25613 25323 25612
+25611 25612 25477
+25611 25714 25612
+25712 25713 25609
+25611 25610 25714
+25476 25713 25610
+25323 25613 25478
+25612 25715 25613
+25615 25614 25716
+25479 25478 25614
+25616 25615 25716
+25480 25479 25615
+25960 26168 25961
+25617 25483 25482
+25959 25813 25958
+25959 25717 25813
+25959 25718 25717
+25481 25326 25616
+25719 25617 25482
+25719 25960 25961
+25616 25718 25481
+25959 25960 25718
+25960 25719 25718
+26168 26414 26169
+25960 25959 26167
+27056 27307 27057
+26414 26168 26167
+25724 25723 25814
+25814 25963 25964
+25962 25961 26169
+25960 26167 26168
+25815 25814 25964
+26171 26070 25966
+26069 25964 26170
+26254 26171 26416
+26254 26585 26417
+26070 26173 26071
+26173 26255 26072
+26070 26071 25967
+26173 26417 26255
+26416 26171 26069
+26172 26070 26171
+26254 26172 26171
+26254 26173 26172
+25623 25724 25725
+25724 25814 25815
+25964 25965 25815
+26069 26171 25965
+25818 25817 25966
+25725 25815 25816
+25727 25625 25726
+25725 25816 25817
+25722 25814 25723
+25963 26170 25964
+25727 25728 25625
+25623 25622 25724
+25620 25722 25723
+25720 25962 25721
+25814 25722 25963
+25721 25962 25963
+25720 25617 25719
+25719 25961 25720
+26168 26169 25961
+25962 25720 25961
+25721 25618 25720
+25617 25618 25484
+25721 25722 25619
+25487 25619 25620
+25618 25721 25619
+25619 25722 25620
+25620 25723 25621
+25483 25484 25329
+24830 24981 24831
+25618 25485 25484
+25618 25619 25486
+25329 25484 25330
+24724 24828 24725
+24828 24829 24725
+24726 24830 24831
+25485 25618 25486
+25486 25619 25487
+24833 24983 24984
+24984 24983 25112
+24833 24982 24983
+25113 24985 24834
+24834 24833 24984
+24834 24985 24729
+24834 24984 25113
+25114 24985 25113
+24985 25114 25115
+25726 25623 25725
+25627 25626 25728
+25621 25723 25724
+25725 25724 25815
+25622 25621 25724
+25818 25726 25817
+25625 25624 25726
+25818 25727 25726
+25818 25819 25727
+25821 25627 25728
+25628 25331 25627
+25629 25729 25822
+25628 25627 25729
+25730 25629 25822
+25331 25628 25629
+25728 25626 25625
+25629 25628 25729
+25117 24986 25116
+24986 24730 24729
+24835 24730 24986
+24987 25117 25225
+24835 24986 25117
+24835 24987 24836
+25225 25332 25226
+25332 25331 25629
+25225 25117 25331
+25730 25630 25629
+25333 25226 25332
+25488 25489 25334
+25335 25632 25336
+25334 25226 25333
+25334 25227 25226
+25631 25488 25333
+25335 25227 25334
+24839 24989 24840
+25227 25228 24989
+24988 25227 24989
+25335 25336 25227
+25489 25632 25335
+25633 25490 25336
+25336 25490 25228
+25633 25734 25490
+25333 25488 25334
+25732 25731 25824
+25334 25489 25335
+25488 25631 25732
+25731 25730 25823
+25630 25332 25629
+25731 25630 25730
+25631 25333 25630
+25488 25732 25489
+25632 25732 25733
+25633 25733 25734
+25973 26080 26081
+25971 25972 25825
+25971 26078 26177
+25825 25973 25826
+25972 26080 25973
+25824 25970 25732
+26079 26178 26080
+25732 25971 25733
+25825 25734 25733
+25733 25971 25825
+25970 26077 26078
+25731 25732 25631
+25970 25971 25732
+25822 25821 25968
+25729 25627 25821
+25630 25731 25631
+25823 25969 25824
+25821 25820 25968
+25821 25728 25820
+25822 25969 25823
+26074 26175 26075
+25823 25824 25731
+25969 25970 25824
+26075 26076 25969
+26175 26419 26076
+25820 26072 25968
+26071 26173 26072
+26074 26075 25969
+26175 26076 26075
+26174 26255 26418
+26072 26174 26073
+26418 26175 26174
+26586 26775 26587
+26076 26176 26077
+26420 26586 26587
+25970 26078 25971
+26077 26176 26078
+25971 26079 25972
+25971 26177 26079
+26078 26176 26177
+26178 26420 26256
+26178 26177 26420
+26426 26590 26778
+26424 26423 26777
+27176 27201 27318
+27066 27176 27177
+27138 27065 27175
+26909 27065 27138
+26424 26777 26590
+26776 27065 26909
+27174 27317 27201
+27064 27174 27065
+27066 27138 27176
+27065 27174 27175
+27176 27138 27175
+27066 26909 27138
+27397 27316 27396
+27398 27397 27438
+27398 27317 27397
+27844 27981 28128
+27692 27843 27693
+27843 27981 27844
+27440 27401 27439
+27846 27725 27724
+27441 27464 27320
+27319 27401 27440
+27319 27176 27401
+27440 27462 27402
+27177 27320 27067
+27402 27463 27441
+27402 27441 27320
+27463 27464 27441
+27917 27983 28130
+27695 27845 27724
+27917 28130 27984
+27726 27847 27727
+27726 27846 27983
+27724 27845 27846
+28128 28446 28447
+27726 27983 27847
+27847 27917 27848
+27847 27983 27917
+29461 29147 29146
+28448 28129 28447
+29461 29146 29460
+29145 28786 29144
+30120 29917 30119
+29713 29712 29917
+30119 29916 30118
+28785 28786 28445
+29917 29712 29916
+29460 29146 29145
+29713 29460 29712
+29146 28787 29145
+28788 28787 29146
+28788 28448 28447
+29712 29459 29711
+29712 29460 29459
+29460 29145 29459
+28787 28786 29145
+30713 31235 31236
+28787 28446 28786
+29144 29458 29459
+29915 29916 29711
+27846 27845 28129
+27694 27723 27844
+28787 28447 28446
+28787 28788 28447
+27844 27845 27694
+27982 28129 27845
+27693 27843 27723
+27722 27981 27843
+27845 27844 27982
+27723 27843 27844
+28124 28443 28125
+28785 28444 28784
+28445 28126 28444
+29456 29708 29709
+31865 31232 31231
+29144 28785 29143
+28445 28444 28785
+28785 29144 28786
+29458 29711 29459
+29143 29458 29144
+29142 29143 28784
+29709 29708 29913
+30117 30392 30393
+29143 29457 29458
+29914 29915 29710
+29710 29709 29914
+31223 30388 30706
+29914 29709 29913
+29710 29458 29457
+29142 29457 29143
+29709 29710 29457
+28783 29141 29142
+29707 29912 29708
+29455 29708 29456
+29912 29913 29708
+29142 29456 29457
+29140 28782 28781
+29706 29911 29707
+31218 31851 31852
+29140 29455 29141
+29707 29708 29455
+29456 29141 29455
+29142 28784 28783
+28441 28442 28123
+28782 29141 28783
+28444 28443 28784
+28442 28782 28783
+28783 28443 28442
+28783 28784 28443
+27841 27840 28126
+28124 28123 28442
+27840 27839 28125
+27839 27838 28124
+28125 27839 28124
+27571 27310 27570
+28126 27840 28125
+27572 27571 27840
+27688 27572 27840
+27841 27688 27840
+27841 27689 27688
+27574 27460 27690
+27690 27573 27689
+27437 27394 27573
+27647 27574 27690
+27647 27842 27691
+27647 27648 27575
+27691 27722 27692
+27648 27692 27576
+27722 27843 27692
+27576 27396 27395
+27438 27397 27396
+27460 27461 27314
+27574 27647 27461
+27842 27647 27690
+27691 27648 27647
+27172 27394 27314
+27436 27573 27394
+27316 27173 27395
+27315 27395 27173
+26420 26587 26588
+27172 27313 27394
+27436 27394 27313
+27569 27308 27568
+27570 27310 27309
+27311 27310 27571
+27838 27570 27569
+27839 27571 27570
+28781 28441 28440
+28782 28442 28441
+28123 27838 27837
+28123 28124 27838
+28781 28440 28780
+28441 28122 28440
+27307 27568 27308
+27569 27309 27308
+27837 27569 27568
+27837 27838 27569
+28120 28121 27835
+28121 28122 27836
+28119 28438 28120
+27836 27568 27567
+27835 28121 27836
+28439 28440 28121
+28777 28778 28437
+28439 28121 28120
+27833 28119 27834
+28437 28438 28119
+27834 28120 27835
+28438 28439 28120
+26767 27055 27056
+27305 27566 27306
+27566 27567 27306
+27835 27836 27567
+27567 27307 27306
+27567 27568 27307
+27056 27057 26768
+27307 27308 27057
+27306 27055 27305
+26767 26766 27055
+27306 27056 27055
+27306 27307 27056
+27053 27054 26765
+27304 27305 27054
+27303 27564 27304
+28775 28434 28774
+27304 27565 27305
+27564 27833 27565
+26764 27052 27053
+27302 27563 27303
+27051 27052 26763
+27302 27303 27052
+26764 27053 26765
+27052 27303 27053
+27052 27051 27302
+26763 26762 27051
+27827 27828 27559
+27561 27562 27301
+27560 27561 27300
+27302 27051 27301
+27299 27560 27300
+27829 27830 27561
+27300 27561 27301
+28113 28431 28432
+27302 27562 27563
+27302 27301 27562
+27560 27829 27561
+28773 28432 28772
+27560 27828 27829
+27560 27559 27828
+27828 28114 27829
+28774 28773 29132
+27828 28113 28114
+27828 27827 28113
+28113 28432 28114
+28431 28771 28772
+28116 28115 28434
+28114 28432 28433
+27832 27831 28117
+27831 27830 28116
+28434 28115 28433
+28116 27830 28115
+27563 27831 27832
+27563 27562 27831
+27833 27832 28118
+27564 27563 27832
+27832 28117 28118
+28116 28434 28435
+28117 28436 28118
+28776 28777 28436
+28776 28435 28775
+28117 28116 28435
+28776 28775 29134
+28435 28434 28775
+29446 29447 29132
+29699 29700 29447
+29446 29132 29131
+28433 28432 28773
+29447 29133 29132
+29447 29448 29133
+29130 28772 28771
+29130 29131 28772
+29128 29129 28770
+29443 29444 29129
+29129 28771 28770
+29129 29130 28771
+29444 29130 29129
+29131 28773 28772
+29444 29445 29130
+29697 29698 29445
+29445 29131 29130
+29445 29446 29131
+29695 29696 29443
+29697 29445 29444
+30100 30101 29898
+29901 29696 29900
+29444 29443 29696
+29695 29694 29899
+30102 29900 29899
+29901 29697 29696
+30103 29901 29900
+30104 30686 30368
+31182 31816 31183
+29902 29698 29697
+29902 29903 29698
+29698 29903 29699
+30370 30689 30371
+29903 29904 29699
+29701 29448 29700
+30691 30373 30372
+29700 29699 29904
+30107 29905 29904
+29448 29447 29700
+30108 30694 30376
+30110 29908 29907
+29451 29136 29450
+29907 29702 29906
+29450 29136 29135
+29702 29701 29906
+29700 29904 29905
+29906 29701 29905
+29702 29450 29449
+29448 29449 29134
+29701 29702 29449
+28435 28776 28436
+29134 29449 29135
+28776 29135 28777
+29449 29450 29135
+28437 28778 28438
+29136 29451 29137
+28436 28777 28437
+29135 29136 28777
+29907 29703 29702
+29703 29704 29451
+29702 29703 29450
+29451 29452 29137
+29704 29452 29451
+28779 28439 28438
+29138 28779 29137
+28780 28439 28779
+29140 28781 29139
+28782 28441 28781
+29452 29138 29137
+29453 29139 29138
+29455 29140 29454
+29141 28782 29140
+29908 29909 29704
+29910 29706 29705
+29450 29703 29451
+29907 29908 29703
+29705 29452 29704
+29453 29138 29452
+30699 31207 31208
+29704 29909 29705
+30380 30110 30698
+29453 29706 29454
+29910 29911 29706
+30380 31207 30699
+30696 30377 31201
+30109 30376 30377
+31203 30696 31202
+30697 31205 30379
+30696 30378 30109
+30696 31203 30378
+30378 30379 30110
+31835 31836 31202
+30378 30697 30379
+30378 31203 30697
+31203 31837 31204
+30698 30379 31205
+31207 31206 31840
+30698 31205 31206
+31834 31200 31833
+30695 31199 31200
+30696 31201 31202
+30695 31200 31201
+30697 31204 31205
+30697 31203 31204
+30374 30373 30692
+31194 31193 31827
+31830 31197 31196
+31828 31195 31194
+30376 30694 31199
+30694 30375 31197
+31826 31192 31825
+30692 31194 31195
+31191 30691 30372
+31192 31826 31193
+31192 31193 30691
+31826 31827 31193
+30372 30373 30107
+30691 31193 30373
+30693 30374 31195
+30373 31193 30692
+31199 30694 31198
+29905 30108 29906
+30375 30694 30108
+30375 30374 30693
+30107 30373 30374
+30374 30375 30108
+30693 31197 30375
+30372 30106 30371
+29904 29903 30106
+31186 31185 31819
+30372 30371 30690
+30106 30370 30371
+30686 31183 30368
+30368 30369 30105
+30687 31184 31185
+29902 30105 29903
+30369 30688 30105
+29901 30104 29902
+30103 30365 30684
+30681 30363 30362
+29899 29898 30101
+30682 30364 30102
+30364 30365 30103
+31179 30685 30366
+30684 30366 30103
+31181 30686 30367
+30366 30367 30104
+31181 31814 31815
+30363 30682 30102
+30683 30365 30364
+30361 30680 30101
+31171 31172 30681
+30362 30363 30102
+31172 31805 31806
+31170 30680 31169
+30101 30360 30361
+31171 30681 30362
+31172 31173 30681
+30681 31173 30363
+31174 31175 30682
+31175 30683 30364
+31810 31811 31177
+31177 30684 30365
+30684 31179 30366
+30366 30685 30367
+31179 30684 31178
+30368 30687 30369
+30368 31183 30687
+31187 30688 31186
+30369 30687 31185
+30105 30688 30370
+30369 31185 30688
+30685 31181 30367
+30685 31180 31181
+31181 31182 30686
+31181 31815 31182
+30683 31177 30365
+31811 31812 31178
+31812 31179 31178
+31180 30685 31179
+31812 31813 31179
+31814 31181 31180
+31178 31177 31811
+31178 30684 31177
+30362 30680 31171
+30362 30101 30680
+30682 31175 30364
+31809 31810 31176
+31807 31174 31173
+31174 30682 31173
+31172 31806 31173
+31175 31176 30683
+31807 31808 31174
+31809 31176 31175
+31175 31174 31808
+31803 31170 31169
+30680 31170 31171
+31169 31168 31802
+31807 31173 31806
+31800 31802 31801
+31188 31822 31189
+31800 31803 31802
+31800 31798 31803
+31171 31804 31805
+31171 31170 31804
+31809 31808 31815
+31809 31175 31808
+31176 31810 31177
+31809 31811 31810
+31815 31812 31811
+31813 31180 31179
+31814 31813 31812
+31814 31180 31813
+31817 31815 31806
+31814 31812 31815
+31187 30370 30688
+31817 31818 31184
+31845 31211 31844
+31838 31831 31828
+31815 31817 31816
+31821 31188 31187
+31820 31819 31821
+31818 31185 31184
+31821 31819 31817
+31186 30688 31185
+31819 31818 31817
+31819 31185 31818
+31820 31186 31819
+31820 31187 31186
+31821 31187 31820
+31188 30689 31187
+31189 31190 30690
+31191 31825 31192
+31823 31824 31190
+31823 31825 31824
+31825 31191 31824
+31192 30691 31191
+31825 31828 31826
+31829 31830 31196
+31828 31829 31195
+31830 31831 31197
+31826 31828 31827
+31831 31198 31197
+31838 31839 31205
+31837 31838 31205
+31828 31831 31830
+31832 31199 31198
+31199 31832 31833
+31836 31835 31838
+31832 31835 31833
+31844 31852 31850
+31203 31202 31836
+31832 31831 31838
+31203 31836 31837
+31835 31832 31838
+31823 31828 31825
+31836 31838 31837
+31842 31840 31838
+31840 31206 31839
+31210 31209 31843
+31838 31840 31839
+31207 30698 31206
+30701 31212 31213
+31842 31838 31843
+31848 31847 31844
+31843 31838 31844
+31850 31848 31844
+30383 31213 30702
+31220 31853 31854
+31852 31854 31853
+31855 31857 31856
+31852 31860 31857
+31226 31860 31227
+31849 31848 31850
+31849 31216 31215
+31847 31846 31845
+31847 31214 31213
+31844 31847 31845
+31848 31215 31214
+31858 31224 31857
+30706 30387 31221
+31225 31224 31858
+30707 30389 30388
+31859 31860 31226
+30389 30115 30388
+30705 31220 31221
+31220 31854 31221
+30386 30704 31219
+31852 31853 31219
+30387 30705 31221
+31219 31853 31220
+31850 31216 31849
+31217 30385 30703
+31849 31215 31848
+31216 30703 31215
+31220 30705 31219
+31217 31851 31218
+31842 31841 31840
+31209 31210 30700
+31844 31211 31210
+31845 31846 31212
+31213 31214 30702
+31847 31848 31214
+31841 31207 31840
+30382 30700 31211
+31841 31208 31207
+31841 31842 31208
+31845 31212 31211
+30382 30701 30383
+31846 31213 31212
+31846 31847 31213
+30698 31207 30380
+31208 31842 31209
+31208 31209 30699
+31842 31843 31209
+30699 31209 30381
+30381 30380 30699
+30111 29909 29908
+30381 30111 30380
+30700 31210 31211
+30111 30381 30700
+30111 30700 30382
+30381 31209 30700
+30383 30701 31213
+30382 31211 30701
+30703 30385 30384
+31217 31218 30704
+30384 30112 30702
+30112 30382 30383
+30702 30112 30383
+29910 29909 30112
+30704 31218 31219
+31224 30707 31223
+29912 29911 30114
+31225 30707 31224
+30114 30386 30387
+30113 30385 30704
+31215 30703 30384
+31216 31217 30703
+30113 30704 30386
+30385 31217 30704
+30386 30705 30387
+30386 31219 30705
+31223 30706 31222
+30388 30114 30706
+31223 30707 30388
+30389 31226 30708
+30389 31225 31226
+31225 31858 31859
+31859 31226 31225
+31230 30710 31229
+31229 31862 31863
+31227 30390 30708
+30389 30707 31225
+30391 30116 30390
+31227 30708 31226
+30391 30390 30709
+30115 30389 30708
+30390 30115 30708
+29913 29912 30115
+29913 30116 29914
+30709 31229 30391
+30710 30391 31229
+30710 30116 30391
+30393 30392 30711
+30116 30710 30392
+31235 30712 31234
+29915 30117 30118
+29915 29914 30117
+30117 30394 30118
+30117 30393 30712
+30398 30397 30716
+30119 30118 30396
+31239 30396 30714
+30118 30394 30395
+30395 30396 30118
+31239 31240 30715
+31241 30715 31240
+30397 30396 30715
+30395 30713 31237
+30395 30394 30713
+30395 30714 30396
+30395 31237 30714
+30393 30711 31233
+30392 30710 31231
+30394 30712 31235
+30394 30117 30712
+31874 31241 31240
+31242 30716 31241
+31872 31874 31873
+31865 31866 31232
+31877 31874 31872
+31874 31240 31873
+31244 31243 31876
+31242 31241 31875
+31875 31874 31877
+31873 31239 31872
+31234 31867 31868
+31237 31238 30714
+31235 31869 31236
+31871 31238 31237
+30712 31233 31234
+30711 30392 31232
+31228 31227 31861
+30709 30390 31227
+31864 31865 31231
+31233 30711 31232
+31229 31228 31862
+30709 31227 31228
+31863 31230 31229
+31231 30710 31230
+31864 31231 31230
+31232 30392 31231
+31863 31864 31230
+31866 31867 31233
+31857 31859 31858
+31860 31861 31227
+31868 31867 31869
+31871 31869 31877
+31864 31863 31865
+31891 31257 31890
+31234 31233 31867
+31863 31860 31869
+31863 31869 31865
+31245 31878 31879
+31232 31866 31233
+31865 31867 31866
+31870 31236 31869
+31869 31235 31868
+31238 31871 31872
+31870 31869 31871
+31865 31869 31867
+31237 31870 31871
+31237 31236 31870
+31250 31884 31251
+31885 31883 31882
+31878 31877 31882
+31249 31248 31881
+31247 31246 31880
+31871 31877 31872
+31881 31880 31882
+31881 31247 31880
+31244 31876 31877
+31242 31875 31876
+30717 31243 31244
+31877 31878 31244
+30399 31245 30719
+31244 31878 31245
+31245 31246 30719
+31245 31879 31246
+30720 31248 31249
+30720 31247 31248
+31883 31250 31249
+30720 30400 31247
+31249 31250 30721
+31249 31882 31883
+31887 31253 31886
+30721 31250 31251
+31884 31885 31251
+31253 31254 30723
+31886 31253 31252
+31257 30724 31256
+31887 31254 31253
+31887 31888 31254
+31888 31889 31256
+30404 30724 30405
+31255 31888 31256
+31258 30725 31257
+31888 31885 31882
+31884 31250 31883
+31252 31885 31886
+31884 31883 31885
+31885 31888 31886
+31892 31890 31894
+31882 31889 31888
+31892 31894 31893
+31882 31890 31889
+30728 31264 31265
+31900 31898 31897
+31265 31899 31266
+31896 31900 31897
+31266 31900 31267
+31900 31899 31898
+31268 31901 31269
+31902 31900 31896
+31269 31902 31903
+31902 31901 31900
+30732 31271 31272
+31894 31902 31896
+31279 31912 31913
+31906 31905 31907
+31903 31902 31904
+31275 31274 31908
+31916 31912 31920
+31274 31906 31907
+31906 31272 31905
+31271 31270 31904
+31904 31270 31903
+31904 31905 31271
+31904 31907 31905
+30730 31267 31268
+31901 31902 31269
+30411 31269 30731
+31269 31903 31270
+31906 31274 31273
+31907 31908 31274
+30733 30413 31273
+30732 30412 31271
+31268 31267 31901
+31266 31899 31900
+30730 30410 31267
+31269 30730 31268
+31898 31264 31897
+30728 31263 31264
+31899 31265 31898
+30729 30409 31265
+30729 31266 31267
+30729 31265 31266
+31261 31895 31262
+31894 31896 31895
+31892 31891 31890
+31258 31257 31891
+31260 31892 31893
+31259 31258 31892
+31259 30726 30406
+31260 31261 30726
+29921 30123 30124
+30725 31259 30406
+30125 30124 30408
+30406 30726 30407
+30408 30409 30125
+30728 31265 30409
+30125 30410 30126
+30125 30409 30410
+31270 30731 31269
+30411 30410 30730
+30411 30731 30412
+31270 31271 30731
+30412 30732 30413
+31272 31273 30732
+30412 30413 30127
+30732 31273 30413
+30410 30411 30126
+30730 31269 30411
+30411 30412 30126
+30731 31271 30412
+29721 29720 29925
+29467 29152 29466
+30128 30127 30414
+29924 30126 30127
+29469 29154 29468
+29924 30127 29925
+29721 29468 29720
+29153 28794 29152
+29923 29719 29718
+29720 29468 29467
+29924 29720 29719
+29924 29925 29720
+28793 29151 29152
+29717 29716 29921
+29151 28792 29150
+29466 29465 29718
+30125 29923 29922
+30125 30126 29923
+30407 30124 30406
+30407 30408 30124
+29718 29717 29922
+29920 30122 30123
+29922 29717 29921
+28451 28133 28132
+29464 29149 29463
+29715 29919 29920
+30121 30402 30122
+29920 29716 29715
+29463 29715 29716
+29714 29713 29918
+31251 30402 30721
+31252 31253 30722
+29919 30122 29920
+30403 31253 30723
+29920 30123 29921
+30724 31255 31256
+30122 30404 30123
+30723 31254 31255
+30405 30724 31257
+30404 31255 30724
+30406 30405 30725
+30123 30404 30405
+30122 30403 30404
+30403 30402 30722
+30403 30722 31253
+30402 31251 30722
+30404 30403 30723
+30122 30402 30403
+31245 30399 30718
+30120 30121 29918
+30721 30401 31249
+31249 30401 30720
+30720 30401 30400
+30721 30402 30401
+30718 30717 31244
+30716 31242 31243
+30399 30398 30718
+30398 30716 30717
+30718 30398 30717
+30399 30120 30398
+30400 30120 30399
+29918 29713 29917
+30400 30121 30120
+29919 29715 29714
+30401 30121 30400
+30401 30402 30121
+29715 29462 29714
+29147 28788 29146
+29714 29461 29713
+29462 29148 29147
+29919 29714 29918
+29462 29461 29714
+29462 29147 29461
+29148 28789 29147
+28790 28449 28789
+28449 28130 28448
+28131 28449 28450
+28789 29148 28790
+29463 29149 29148
+28450 28449 28790
+29148 29149 28790
+27987 27728 27850
+29462 29463 29148
+29716 29717 29464
+29716 29464 29463
+28792 28793 28452
+29465 29151 29150
+28791 28792 28451
+28451 28450 28791
+28790 28791 28450
+29149 29464 29150
+28450 28451 28132
+29465 29150 29464
+27921 27986 27849
+28131 27987 27986
+27650 27852 27698
+28794 28793 29152
+27987 27851 27728
+27581 27445 27650
+27984 28130 27985
+27920 27921 27849
+27920 27985 27921
+27921 28131 27986
+27921 27985 28131
+27920 27919 27985
+27985 27919 27984
+27984 27919 27918
+27847 27848 27727
+27728 27696 27579
+27697 27729 27580
+27578 27466 27577
+27465 27577 27466
+27578 27443 27466
+27321 27068 27067
+27443 27442 27466
+27320 27464 27442
+27444 27321 27443
+26426 26591 26427
+26591 26779 26592
+27068 27069 26779
+27069 27068 27322
+26430 26593 26522
+26521 26592 26593
+26522 26593 26780
+26432 26431 26595
+26595 26594 26780
+26595 26431 26594
+27699 27581 27698
+27650 27580 27729
+27580 27445 27322
+27580 27650 27445
+27851 27697 27696
+27580 27579 27649
+27696 27697 27649
+27851 27729 27697
+27852 27650 27729
+27698 27581 27650
+27324 27070 27323
+27073 26913 26912
+26784 27072 26911
+26784 26783 27072
+27583 27324 27582
+27325 27071 27324
+26910 26782 27071
+27071 26781 27070
+26597 26523 26434
+26433 26596 26434
+26433 26432 26596
+26781 26597 26596
+26782 26598 26597
+26597 26598 26523
+26782 26910 26783
+26598 26783 26599
+26910 27072 26783
+26783 26649 26599
+26783 26784 26649
+26526 26649 26600
+26784 26911 26651
+26526 26600 26527
+26651 26785 26652
+26650 26651 26600
+26650 26784 26651
+26786 26652 26785
+26786 26653 26652
+26785 26911 26912
+27326 27072 27325
+26914 26787 26913
+26655 26654 26787
+26788 26914 26860
+26913 27074 26914
+26785 26651 26911
+26786 26912 26913
+26786 26785 26912
+27585 27327 27326
+27326 27327 27073
+27586 27327 27585
+27585 27857 27586
+27326 27584 27585
+27326 27325 27584
+27584 27856 27585
+27325 27324 27583
+28453 28793 28794
+28453 28452 28793
+28133 28451 28452
+28454 28794 28795
+28454 28453 28794
+28451 28792 28452
+29465 29464 29717
+28791 29150 28792
+28791 29149 29150
+29718 29465 29717
+29466 29152 29151
+29466 29151 29465
+28793 28792 29151
+29720 29467 29719
+29468 29154 29153
+29468 29153 29467
+28795 28794 29153
+28795 29154 28796
+29721 29469 29468
+29155 28796 29154
+29470 29156 29155
+27859 27860 27588
+29470 29723 29471
+27590 27861 27700
+28139 28458 28140
+29472 29725 29473
+29159 29158 29473
+28799 29157 29158
+28141 28459 28460
+27859 28139 28140
+28458 28459 28140
+27588 27860 27589
+28140 28459 28141
+27587 27858 27859
+27179 27330 27078
+27588 27589 27330
+27590 27331 27589
+27180 27080 26952
+26664 26798 26614
+26952 26921 26920
+26918 27077 27078
+26920 26865 26919
+27078 27330 27079
+27178 27076 26949
+27329 27077 27076
+27860 27859 28140
+27588 27329 27587
+27329 27179 27077
+27588 27587 27859
+26791 26790 26863
+27075 27178 26949
+27328 27178 27075
+27329 27076 27178
+26914 26915 26860
+26914 27074 26915
+26949 26950 26917
+27076 27077 26951
+26950 26951 26917
+26950 27076 26951
+26790 26532 26605
+26915 27075 26916
+26789 26861 26862
+26915 26916 26862
+26606 26532 26790
+26861 26915 26862
+26789 26788 26860
+26655 26787 26788
+26531 26789 26605
+26860 26861 26789
+26606 26790 26656
+26862 26916 26790
+26951 26864 26917
+26657 26607 26792
+26864 26791 26863
+26790 26916 26863
+26917 26864 26863
+26792 26656 26791
+26793 26918 26919
+26919 27079 26920
+26657 26793 26658
+26657 26792 26864
+26793 26794 26659
+26865 26660 26794
+26866 26796 26795
+26662 26538 26661
+26921 26922 26866
+26662 26661 26796
+26866 26797 26796
+26612 26538 26662
+26865 26920 26795
+26921 26952 26922
+26791 26864 26792
+26918 26793 26864
+27080 26922 26952
+26866 26795 26920
+27079 26919 27078
+26865 26794 26919
+26952 26920 27079
+26921 26866 26920
+26797 26922 26867
+27080 27331 27081
+27080 26953 26922
+26666 26800 26616
+27080 27081 26953
+27081 27331 27332
+26798 26923 26924
+27332 27331 27590
+26797 26867 26663
+26953 27081 26923
+26665 26798 26924
+26867 26953 26923
+26614 26798 26665
+26867 26923 26798
+26612 26797 26613
+26662 26796 26797
+26540 26663 26541
+26613 26797 26663
+26615 26614 26665
+26541 26663 26664
+26541 26664 26614
+26663 26798 26664
+26924 26799 26665
+26924 27082 26799
+26451 26615 26542
+26799 26800 26666
+26799 26615 26665
+26666 26542 26615
+26456 26619 26544
+26543 26618 26619
+26621 26803 26545
+27335 27085 27084
+26620 26544 26802
+26802 26621 26620
+27866 27865 28146
+27591 27333 27332
+26800 26799 27082
+27335 27084 27334
+27085 26802 27084
+27592 27864 27593
+27084 26801 27083
+27865 27594 27593
+27084 27083 27334
+27593 27335 27334
+27593 27594 27335
+27592 27863 27864
+27864 28144 28145
+27334 27592 27593
+28144 28462 28463
+27864 27865 27593
+27337 27595 27596
+28144 27864 27863
+27334 27333 27592
+27701 27862 27702
+27083 27333 27334
+27702 27863 27592
+27332 27333 27082
+27860 27861 27589
+27700 27701 27591
+28142 27861 28141
+27590 27589 27861
+27700 27862 27701
+27702 27591 27701
+28142 28141 28460
+27861 27860 28141
+28143 28142 28461
+28800 29158 29159
+29474 29475 29160
+28144 27863 28143
+28463 28145 28144
+28146 27865 28145
+28464 28145 28463
+29728 29932 29933
+29475 29474 29727
+29729 29728 29933
+29475 29727 29728
+29161 29475 29476
+29730 29477 29729
+29728 29729 29476
+29933 29934 29729
+31940 31307 31939
+30750 30431 30430
+30429 30430 30135
+30430 31307 30750
+30428 30748 30429
+30428 30747 31303
+30745 31299 30426
+31301 30747 30427
+30426 30427 30134
+30746 31301 30427
+30743 30424 30423
+30424 30133 30132
+31297 30744 31296
+30745 30426 30425
+30744 30425 30424
+30426 30134 30133
+31293 30743 30423
+31293 31926 31294
+30740 31289 30421
+31291 30742 30422
+30132 30422 30423
+30421 30741 30422
+30424 30132 30423
+29930 29725 29929
+29931 30133 30134
+29931 29930 30133
+29728 29727 29932
+29726 29930 29931
+29931 29727 29726
+29931 29932 29727
+30133 29930 30132
+29726 29725 29930
+29727 29474 29726
+29160 29159 29474
+29157 29472 29158
+29471 29156 29470
+29471 29724 29472
+30131 30421 30422
+29724 29929 29725
+29724 29928 29929
+30130 29928 29927
+30130 30131 29928
+29722 29723 29470
+29928 29724 29723
+29724 29471 29723
+29157 29156 29471
+29721 29926 29722
+29925 30127 30128
+29926 29721 29925
+29722 29470 29469
+29722 29469 29721
+29155 29154 29469
+30736 30417 30416
+29926 29925 30128
+30130 30129 30418
+29927 29926 30129
+30130 29927 30129
+29723 29722 29927
+30128 30416 30129
+31281 31914 31915
+30416 30415 30735
+30128 30414 30415
+31279 30416 30735
+30417 30129 30416
+31277 30734 31276
+30415 30414 30734
+31279 30736 30416
+31280 31914 31281
+30417 30737 30418
+30417 30736 31281
+30419 30738 31285
+30418 31283 30738
+30131 30130 30420
+30418 30738 30419
+30419 30130 30418
+30419 30420 30130
+29928 30131 29929
+30420 30421 30131
+30419 30739 30420
+30419 31285 30739
+31289 30740 31288
+30421 30420 30740
+31290 31291 30741
+31292 31293 30742
+31924 31292 31291
+31924 31925 31292
+31922 31923 31289
+31924 31291 31290
+30740 31287 31288
+30739 31286 31287
+31921 31922 31288
+31290 30741 31289
+30737 31281 31282
+31280 31279 31913
+31278 31911 31279
+31279 30735 31278
+30736 31280 31281
+30736 31279 31280
+31909 31275 31908
+31276 30734 31275
+31282 31916 31283
+31285 30738 31284
+31287 31286 31919
+30739 31285 31286
+31280 31913 31914
+31279 31911 31912
+31276 31909 31910
+31908 31907 31911
+31277 31910 31278
+31909 31908 31911
+31902 31912 31907
+31920 31919 31916
+31917 31916 31919
+31915 31914 31916
+31297 31930 31931
+31918 31917 31919
+31918 31284 31917
+31285 31918 31919
+31285 31284 31918
+31290 31289 31923
+31921 31920 31922
+31290 31923 31924
+31922 31920 31923
+31923 31925 31924
+31920 31927 31925
+31297 31931 31298
+30743 31294 31295
+31302 31934 31935
+31927 31930 31929
+31927 31934 31930
+30745 31298 31299
+31931 31933 31932
+31292 31926 31293
+31925 31927 31926
+31296 31295 31929
+31294 31927 31928
+31295 31294 31928
+30743 31293 31294
+31929 31295 31928
+30744 30424 31295
+31930 31297 31929
+30744 31295 31296
+30425 31297 30745
+31296 31929 31297
+31297 31298 30745
+31931 31932 31298
+30426 31299 30746
+31298 31932 31299
+31301 31302 30747
+31935 31936 31303
+31299 31300 30746
+31299 31932 31933
+31300 31301 30746
+31300 31933 31301
+30749 31307 30430
+31309 31942 31310
+31935 31303 31302
+31936 31937 31303
+31937 31305 31304
+31938 31939 31306
+30750 31307 31308
+30749 31306 31307
+31301 31933 31934
+31930 31934 31933
+31307 31306 31939
+30749 31305 31306
+31936 31935 31934
+31305 31937 31938
+31304 31303 31937
+31970 31968 31966
+31943 31952 31945
+31321 31320 31953
+31960 31961 31328
+31954 31955 31322
+31322 31955 31956
+31952 31955 31954
+31952 31962 31955
+31955 31958 31957
+31955 31961 31958
+31966 31962 31970
+31961 31955 31962
+31962 31966 31964
+30763 30444 30443
+31968 31967 31966
+31334 31335 30763
+31329 31963 31330
+31962 31964 31963
+31325 31959 31326
+31958 31961 31959
+31326 31960 31327
+31959 31961 31960
+31951 31950 31952
+31947 31945 31952
+31319 31951 31952
+31318 31317 31951
+31952 31953 31320
+31952 31954 31953
+31332 31333 30762
+31967 31968 31335
+30761 31329 31330
+31328 31961 31329
+31965 31333 31332
+31966 31967 31333
+31948 31947 31952
+31948 31315 31947
+31949 31948 31950
+30137 30433 30434
+31317 31316 31949
+31950 31317 31949
+31944 31943 31945
+31942 31952 31943
+31310 31942 31943
+31941 31952 31942
+31947 31946 31945
+31947 31315 31314
+31309 31310 30751
+31944 31945 31311
+31944 31311 31310
+31946 31947 31314
+31949 31315 31948
+31315 30754 30434
+31949 31316 31315
+30437 30756 31321
+31945 31312 31311
+31312 31313 30752
+31946 31314 31313
+30753 30434 30433
+31308 31309 30750
+31308 31941 31309
+31311 30751 31310
+31311 31312 30752
+30751 30752 30432
+31313 31314 30753
+31315 30753 31314
+31315 31316 30754
+30433 31313 30753
+31312 31946 31313
+30435 30434 30754
+30434 30753 31315
+30140 29937 30139
+31323 31957 31324
+31316 31317 30754
+31318 31319 30755
+31320 31321 30756
+31322 31323 30757
+30140 30439 30440
+30758 31324 31325
+30443 30442 30762
+30441 30760 30761
+31333 30763 30443
+31334 31967 31335
+31319 31320 30756
+31953 31954 31321
+31951 31317 31950
+31318 30755 31317
+30436 31319 30756
+31318 31951 31319
+30757 31321 31322
+30757 30437 31321
+31323 31324 30758
+31957 31958 31325
+30759 31325 31326
+31324 31957 31325
+30767 30447 31341
+30765 30446 30445
+30448 30767 31343
+31973 31972 31974
+30766 30446 31339
+31970 31337 31969
+31969 31337 31336
+30764 30763 31335
+31340 30766 31339
+31969 31336 31335
+30765 30445 31337
+31969 31335 31968
+30764 31336 31337
+30764 31335 31336
+31338 30765 31337
+30444 30763 30764
+31339 30765 31338
+31337 30445 30764
+31341 30766 31340
+30446 30765 31339
+31342 30767 31341
+30448 30144 30447
+31347 30450 30769
+30146 30451 30452
+30768 30449 30448
+30450 31347 30770
+30769 30450 30449
+31351 31350 31983
+30146 30452 30147
+30453 30147 30452
+31349 30770 31348
+30771 30452 30451
+30770 30451 30450
+30770 31349 30451
+31352 31353 30772
+31359 31992 31993
+31345 30768 31344
+30768 30448 31343
+31350 31351 30771
+30453 30452 30772
+31342 31976 31343
+31343 30767 31342
+31978 31979 31346
+31345 30769 30449
+31343 31976 31344
+31346 30769 31345
+31986 31354 31353
+31987 31355 31354
+31984 31352 31351
+31353 30773 30453
+31986 31353 31352
+31354 30773 31353
+31350 31349 31982
+30771 30451 31349
+31984 31351 31983
+30771 31349 31350
+30772 31351 31352
+30772 30452 31351
+31346 31347 30769
+31348 30770 31347
+31970 31969 31968
+31970 31338 31337
+31344 31976 31977
+31345 31978 31346
+31970 31971 31338
+31972 31339 31971
+31974 31976 31975
+31344 31977 31345
+31341 31974 31975
+31977 31978 31345
+31976 31974 31977
+31972 31971 31970
+31974 31972 31970
+31340 31973 31974
+31340 31339 31973
+31979 31977 31970
+32004 32006 32005
+31347 31346 31979
+31977 31979 31978
+31983 31982 31979
+31983 31350 31982
+31981 31980 31979
+31981 31348 31980
+31982 31981 31979
+31982 31349 31981
+31984 31985 31352
+31987 31354 31986
+31985 31984 31987
+31988 31355 31987
+31986 31352 31985
+31993 31990 31995
+31990 32000 31997
+32000 32006 32004
+31367 31366 31999
+31365 31997 31998
+31995 31990 31997
+31984 31983 31987
+31996 31995 31997
+31996 31363 31995
+31985 31987 31986
+31990 31991 31357
+31989 31987 31990
+31983 31979 31987
+31989 31988 31987
+31356 31357 30774
+31362 31994 31995
+31994 31360 31993
+31359 31360 30776
+31358 31357 31991
+31994 31993 31995
+31994 31361 31360
+32002 32001 32000
+31371 30782 30462
+30783 31373 31374
+30782 31372 31373
+32007 31375 31374
+30785 31378 31379
+31376 31377 30784
+32011 32012 31379
+32008 32009 31375
+31376 32010 31377
+32013 31380 32012
+31379 31380 30786
+32002 32000 32003
+32003 32000 32004
+31997 32000 31999
+31371 31370 32003
+32003 31370 32002
+31375 32007 32008
+31374 32006 32007
+31375 32009 31376
+32008 32010 32009
+32011 32010 32013
+32011 31378 32010
+32019 31386 31385
+32016 32013 32018
+31383 32015 32016
+32014 32013 32015
+31382 32015 31383
+32015 32013 32016
+30788 31384 31385
+31385 32018 32019
+30791 31390 31391
+32019 32020 31386
+32022 32020 32018
+31387 31388 30790
+32024 32022 32018
+32034 32035 31402
+32046 32050 32049
+31397 30794 31396
+31393 32025 32026
+32024 32023 32022
+32024 32025 31392
+32018 32020 32019
+32021 31388 31387
+32022 32021 32020
+32022 31389 32021
+32020 31387 31386
+32020 32021 31387
+32021 31389 31388
+30472 30792 30473
+32023 31391 31390
+32023 32024 31391
+30792 31392 31393
+30792 31391 31392
+30789 31385 31386
+31384 32016 32017
+32022 31390 31389
+31391 30792 30472
+31381 31382 30787
+32014 32015 31382
+30788 31383 31384
+30787 31382 31383
+30789 30469 31385
+31383 32016 31384
+32014 31381 32013
+31379 31378 32011
+30786 30466 31379
+30467 30154 30466
+31381 31380 32013
+31381 30787 30467
+31369 31370 30781
+29746 29493 29492
+31371 30781 31370
+30782 30463 30462
+31378 30785 31377
+29747 29494 29493
+32004 31372 31371
+32005 31373 31372
+30465 30464 30784
+30783 31375 30784
+31387 30789 31386
+30788 30787 31383
+30789 30790 30470
+31388 31389 30790
+30790 30791 30471
+30790 31389 30791
+30470 30469 30789
+30468 30155 30154
+31377 30785 30465
+30786 30467 30466
+31381 30786 31380
+30153 30465 30466
+30156 30471 30472
+30470 30790 30471
+30157 30156 30472
+30471 30791 30472
+30793 30474 30473
+30157 29955 29954
+31385 30469 30788
+30470 30471 30156
+31381 30467 30786
+30155 30469 30470
+30787 30468 30467
+30787 30788 30468
+30784 30464 30783
+30784 31377 30465
+31379 30466 30785
+29750 29953 29751
+30785 30466 30465
+30154 30155 29952
+31373 30463 30782
+30464 30465 30153
+30151 30150 30460
+31365 30459 30778
+30781 30462 30461
+30152 30463 30464
+30151 30462 30152
+31365 30778 31364
+30455 30775 30456
+30777 30458 30457
+30151 29948 30150
+30458 30778 30459
+31363 31362 31995
+30777 31361 31362
+32000 31367 31999
+30460 30459 30779
+30779 31367 30460
+31368 32002 31369
+31368 31369 30780
+32002 31370 31369
+30460 31367 30780
+31366 31365 31998
+31367 31368 30780
+32001 32002 31368
+31999 31366 31998
+30779 30459 31365
+31363 31364 30778
+31363 31996 31364
+30779 31366 31367
+30779 31365 31366
+31993 31360 31359
+31361 30457 30776
+30775 31358 31359
+31991 31992 31358
+30776 30456 31359
+31358 31992 31359
+31355 31356 30774
+31989 31990 31357
+31354 31355 30773
+31988 31989 31356
+31988 31356 31355
+31989 31357 31356
+31355 30774 30454
+31357 31358 30775
+30456 30775 31359
+30774 31357 30775
+31361 30776 31360
+30457 30456 30776
+30149 29946 30148
+30455 30454 30774
+30773 30454 30453
+30774 30775 30455
+30149 29947 29946
+30148 30147 30454
+30454 30147 30453
+29173 29489 29174
+30456 30148 30455
+29946 29945 30148
+30148 29945 30147
+29743 29489 29742
+29943 30146 29944
+30450 30451 30146
+29740 29942 29943
+30146 30147 29944
+29741 29742 29488
+29944 29945 29742
+29742 29489 29488
+28814 29173 28815
+29488 29489 29173
+29743 29490 29489
+27877 28158 27878
+29946 29743 29945
+29490 29174 29489
+29744 29490 29743
+29175 29176 28817
+30456 30149 30148
+29744 29743 29946
+29744 29491 29490
+29744 29745 29491
+29177 29492 29493
+29176 29491 29492
+29949 30152 29950
+28480 28162 28161
+29947 29948 29745
+30151 30461 30462
+29949 29747 29746
+30153 30152 30464
+29745 29948 29746
+30152 30462 30463
+30458 30150 30149
+29745 29744 29947
+29746 29948 29949
+29947 30149 30150
+30457 30149 30456
+30457 30458 30149
+30460 30150 30459
+29948 29947 30150
+29948 30151 29949
+30460 30461 30151
+29749 29748 29951
+29748 29747 29950
+29950 30152 30153
+29949 30151 30152
+29951 29950 30153
+29747 29949 29950
+30466 30154 30153
+29748 29494 29747
+30153 30154 29951
+30467 30468 30154
+29750 29952 29953
+29951 30154 29952
+29952 30155 29953
+30468 30469 30155
+29954 30156 30157
+29953 30155 30156
+30474 30158 30157
+29955 29752 29954
+30158 29955 30157
+29753 29579 29578
+29498 29497 29751
+29497 29496 29750
+29751 29954 29752
+29953 30156 29954
+29955 29753 29752
+29752 29577 29576
+29309 29501 29185
+29576 29577 29538
+29578 29579 29501
+28485 28825 28826
+29499 29538 29539
+29499 29539 29500
+29540 29578 29501
+29499 29500 29184
+29753 29577 29752
+29751 29497 29750
+29182 28823 29181
+29750 29496 29749
+28821 28481 28480
+29751 29575 29498
+29751 29752 29575
+29952 29749 29951
+29495 29494 29748
+29951 29748 29950
+29749 29496 29495
+29749 29495 29748
+29180 29181 28822
+28480 28479 28820
+27880 28160 28161
+28819 28820 28479
+29179 28821 28820
+28822 29181 28823
+29495 29179 29494
+29495 29180 29179
+28820 28821 28480
+29180 29496 29181
+29179 29180 28821
+29495 29496 29180
+29498 29182 29497
+29499 29184 29183
+28166 28484 28485
+29183 29184 28825
+28163 27882 28162
+28821 29180 28822
+28484 28824 28825
+28483 28823 28824
+28823 28482 28822
+28823 28483 28482
+28484 28483 28824
+28165 28164 28483
+28485 28484 28825
+28166 28165 28484
+28167 28166 28485
+27885 28165 28166
+28164 28165 27884
+28483 28484 28165
+27614 27356 27355
+27104 27103 27354
+27609 27881 27610
+28162 28481 28163
+28480 28481 28162
+28822 28482 28481
+28482 28163 28481
+27883 27882 28163
+27880 28161 27881
+28479 28480 28161
+27881 27609 27880
+27351 27350 27609
+28162 27881 28161
+28162 27882 27881
+27350 27608 27609
+27608 27607 27879
+28157 27877 27876
+27348 27098 27097
+27878 27879 27607
+27880 27609 27608
+28474 28815 28475
+27878 27607 27606
+28477 28159 28158
+27879 27880 27608
+28159 27879 27878
+28477 28818 28478
+28161 28160 28479
+28160 28159 28478
+27879 28159 28160
+28818 28819 28478
+29493 29494 29178
+29178 29177 29493
+28818 29176 29177
+28158 28476 28477
+29175 29490 29491
+28158 28159 27878
+28477 28478 28159
+28157 28476 28158
+28817 28477 28476
+29490 29175 29174
+28817 28476 28816
+29174 29175 28816
+29491 29176 29175
+28816 28815 29174
+28816 28476 28475
+28155 28473 28474
+28813 29172 28814
+28156 28475 28157
+28815 28816 28475
+27875 28156 27876
+28474 28475 28156
+28156 28157 27876
+28475 28476 28157
+27347 27605 27606
+28157 28158 27877
+27877 27605 27876
+27877 27606 27605
+27344 27603 27345
+27874 27875 27603
+27346 27095 27345
+27603 27875 27604
+28473 28154 28472
+27874 27873 28154
+28814 28473 28813
+28155 28154 28473
+28473 28472 28813
+28154 27873 28153
+27873 27601 27872
+27343 27092 27342
+28472 28154 28153
+28810 28470 28469
+28153 27872 28152
+28470 28151 28469
+27340 27599 27341
+28152 27871 28151
+28152 27872 27871
+28151 28470 28152
+29169 29484 29170
+29170 28811 29169
+28470 28810 28811
+28153 28471 28472
+28153 28152 28471
+28811 28812 28471
+29170 29171 28812
+28809 28810 28469
+29168 29169 28810
+28810 29169 28811
+29168 29483 29169
+29736 29737 29484
+29171 29170 29485
+28812 28811 29170
+29573 29537 29572
+29486 29171 29485
+29308 29537 29487
+29571 29486 29485
+29537 29308 29486
+29488 29173 29172
+29486 29308 29171
+29537 29573 29487
+29308 29487 29172
+29573 29740 29574
+29573 29574 29487
+29741 29488 29574
+29794 29740 29739
+29572 29486 29571
+29739 29601 29571
+29740 29573 29572
+29485 29739 29571
+29794 29941 29942
+29739 29740 29601
+30145 30449 30450
+29740 29741 29574
+29944 29742 29741
+29794 29942 29740
+30144 30448 30145
+29741 29943 29944
+29942 30144 30145
+29740 29943 29741
+29942 30145 29943
+31341 30447 30766
+30767 30448 30447
+30447 30446 30766
+30144 29942 29941
+29738 29794 29739
+29793 29941 29794
+30144 29941 30143
+29737 29570 29484
+30144 30143 30446
+30143 30444 30445
+30446 30143 30445
+29941 29940 30143
+30143 30142 30444
+29939 29940 29735
+31331 30442 30761
+30443 30142 30442
+30444 30142 30443
+30143 29940 30142
+29941 29793 29792
+29941 29792 29940
+29793 29738 29737
+29485 29738 29739
+29570 29737 29738
+29792 29793 29737
+29938 29939 29734
+29940 29736 29735
+29735 29736 29483
+29792 29737 29736
+30137 30434 30138
+29732 29936 29937
+30436 30756 30437
+30758 30439 30438
+30138 29935 30137
+30141 29939 29938
+29734 29733 29938
+29734 29939 29735
+29938 30140 30141
+30141 30140 30440
+29938 29937 30140
+30760 30441 30440
+30442 30142 30141
+30441 30141 30440
+30441 30442 30141
+30440 30439 30759
+30140 30438 30439
+30438 30437 30757
+30139 30436 30437
+30437 30438 30139
+30757 31323 30438
+30755 30435 30754
+30433 30752 31313
+31319 30436 30755
+30139 29937 29936
+30138 30436 30139
+30435 30755 30436
+30435 30138 30434
+30137 30136 30432
+31309 30431 30750
+30751 30432 30431
+30431 30432 30136
+30752 30433 30432
+29934 30137 29935
+30432 30433 30137
+30436 30138 30435
+29936 29935 30138
+30139 29936 30138
+29937 29733 29732
+29480 29732 29733
+29935 29730 29934
+29478 29477 29730
+29478 29731 29479
+29935 29936 29731
+29731 29478 29730
+28464 28146 28145
+28147 28466 28148
+28807 28467 28466
+29732 29480 29479
+28467 28468 28149
+28808 28809 28468
+28808 28807 29166
+28808 28467 28807
+28808 28468 28467
+28467 28149 28148
+27870 28151 27871
+28468 28150 28149
+28468 28469 28150
+27340 27339 27598
+28150 28151 27870
+28149 27868 28148
+28149 28150 27869
+27598 27339 27597
+27597 27338 27596
+27868 27867 28148
+27336 27085 27335
+28806 28466 28465
+27866 28147 27867
+28465 28466 28147
+28805 28465 28464
+27867 27595 27866
+27336 27335 27594
+27865 27866 27594
+28146 28147 27866
+27866 27595 27594
+27086 27337 27087
+27087 26804 27086
+27336 27594 27595
+26624 26548 26623
+27336 27086 27085
+26622 26545 26803
+27595 27337 27336
+27087 27338 27088
+26803 26623 26622
+26621 26545 26458
+26622 26546 26545
+26622 26547 26546
+26623 26548 26460
+26218 26294 26295
+26218 26293 26294
+26622 26623 26547
+26804 26624 26623
+26623 26460 26547
+26548 26295 26460
+26462 26461 26625
+26295 26548 26461
+26297 26221 26462
+26220 26108 26219
+26625 26805 26462
+26298 26224 26223
+26462 26463 26297
+26464 26224 26298
+26806 26464 26626
+26298 26222 26463
+26299 26464 26465
+26299 26224 26464
+26464 26463 26626
+26625 26624 26804
+26625 26461 26624
+27088 26805 27087
+27336 27337 27086
+27595 27867 27596
+27337 27338 27087
+27868 27596 27867
+27868 27597 27596
+27598 27597 27869
+27339 27088 27338
+27089 26806 27088
+27870 27598 27869
+27089 27088 27339
+27090 26807 27089
+27599 27598 27870
+27340 27089 27339
+27599 27340 27598
+27090 27089 27340
+27871 27599 27870
+27600 27341 27599
+27091 27341 27342
+27090 27340 27341
+26809 27091 27092
+27600 27601 27342
+26810 26809 27092
+26469 26306 26468
+27341 27091 27090
+26809 26469 26808
+27092 27091 27342
+26809 26808 27091
+26469 26468 26808
+26467 26303 26466
+26232 26231 26469
+27093 26810 27092
+26232 26470 26013
+26628 26468 26304
+26628 26808 26468
+26229 26305 26306
+26304 26468 26305
+26301 26302 26227
+26303 26113 26227
+26627 26466 26465
+26807 26628 26467
+26304 26467 26628
+26304 26228 26467
+26806 26627 26465
+26807 26466 26627
+26466 26300 26465
+26466 26302 26301
+26300 26301 26226
+26300 26466 26301
+26300 26225 26299
+26226 26112 26006
+26005 26111 26006
+26224 26225 26111
+26301 26227 26226
+26113 26008 26112
+26226 26227 26112
+26302 26303 26227
+26303 26228 26113
+26304 26305 26229
+26010 26229 26114
+26228 26304 26229
+26011 26114 26012
+26114 26229 26230
+26012 26231 26232
+26012 26114 26231
+26810 26471 26470
+25359 25534 25360
+26231 26114 26230
+26011 26010 26114
+26014 25843 26013
+26014 25763 25843
+25532 25842 25648
+26012 26232 25842
+25843 25763 25649
+26014 25765 25764
+26014 25764 25763
+25765 25534 25764
+25763 25650 25649
+25764 25534 25650
+26013 25762 25842
+25359 25360 25277
+25842 25762 25648
+25843 25649 25762
+25841 25842 25761
+26009 26228 26010
+25531 25841 25761
+26011 26012 25841
+25527 25526 25647
+26111 26226 26006
+25354 25268 25526
+26006 26112 26007
+25271 25529 25272
+26113 26228 26009
+25526 25525 25647
+25524 25759 25646
+26224 26005 26110
+25647 25646 25760
+26221 26297 26222
+26220 26296 26462
+25760 26110 26005
+25759 26109 26004
+26003 26108 26221
+26003 26221 26109
+26220 26462 26221
+26110 26222 26223
+26109 26221 26222
+26108 26220 26221
+26108 26107 26219
+26106 26295 26219
+26461 26219 26295
+26296 26220 26219
+26295 26106 26218
+25758 25521 25757
+26459 26293 26292
+26459 26460 26293
+26105 26218 26106
+26293 26216 26292
+26103 26001 26102
+26104 26002 26216
+26216 26002 26103
+26216 26217 26104
+26216 26293 26217
+26002 25839 26103
+25757 25756 25838
+25521 25263 25757
+26104 26218 26105
+25521 25264 25263
+25840 25757 25839
+25840 25758 25757
+26002 25840 25839
+26002 25758 25840
+25641 25522 25521
+25641 25521 25758
+25641 25642 25522
+25643 25522 25642
+25265 25137 25264
+25643 25644 25523
+25524 25645 25759
+25268 25025 25267
+25354 25269 25268
+25353 25525 25526
+25646 25647 25525
+25522 25523 25266
+25644 25645 25523
+25523 25524 25266
+25523 25645 25524
+25267 25353 25268
+25524 25525 25353
+25526 25268 25353
+25139 25026 25268
+25528 25355 25270
+25269 25139 25268
+25024 25267 25025
+25266 25524 25267
+24765 25023 25024
+25265 25264 25521
+24846 24765 25024
+24766 24542 24765
+25022 25137 25138
+25021 25135 25136
+25266 25265 25522
+25138 25023 25022
+25266 25138 25265
+25266 25023 25138
+25757 25263 25520
+24762 25021 24763
+25264 25135 25263
+25136 25137 25021
+25264 25136 25135
+25264 25137 25136
+25262 25020 25019
+25135 25021 25020
+24764 25022 25023
+25021 25137 25022
+24542 24543 24303
+24763 25021 25022
+24541 24540 24763
+24540 24539 24761
+24762 24761 25020
+24539 24760 24761
+24541 24135 24540
+24540 24761 24762
+24763 24540 24762
+24134 24539 24540
+23337 23336 23735
+23336 23733 23734
+23511 23735 23736
+23734 24134 24135
+23575 23736 23737
+23575 23511 23736
+24639 24543 24542
+23921 23735 24135
+24764 24541 24763
+24847 24846 25025
+24764 24765 24541
+24136 23922 23737
+24541 24136 24135
+23737 23736 23921
+24135 24136 23921
+24137 24138 23739
+23738 23922 23739
+24544 24543 24641
+24766 24767 24639
+24641 24543 24640
+24136 24303 23922
+24136 24542 24303
+24641 24767 24642
+24640 24639 24767
+24541 24765 24542
+24764 25023 24765
+24848 24766 24847
+24639 24542 24766
+25025 24846 25024
+24766 24765 24846
+25026 24848 25025
+24766 24846 24847
+24849 24848 25026
+24767 24766 24848
+25028 25029 24851
+24768 24642 24767
+24548 24378 24547
+24547 24307 24306
+24546 24644 24770
+24546 24545 24644
+24850 24769 24768
+24643 24642 24768
+24849 24850 24768
+24852 24770 24769
+24767 24641 24640
+24642 24544 24641
+24643 24544 24642
+24304 24137 24544
+24303 24137 23922
+24303 24544 24137
+24306 24305 24546
+24138 24137 24304
+24644 24545 24643
+24546 24305 24545
+24138 24305 24306
+24138 24304 24305
+24308 24307 24378
+24547 24771 24772
+23346 23741 23742
+23345 23344 23741
+23741 24139 23742
+23741 24138 24139
+24310 24140 24309
+23742 24139 24140
+24139 24308 24140
+24139 24307 24308
+24550 24310 24549
+24140 24308 24309
+24380 24549 24309
+24550 24311 24141
+24548 24379 24378
+24379 24308 24378
+24549 24380 24548
+24309 24308 24380
+24307 24547 24378
+24306 24546 24547
+24772 24548 24547
+24772 24773 24549
+24853 24854 24774
+24310 24309 24549
+24772 25032 24773
+25143 25142 25361
+25276 25032 25031
+25033 25143 25144
+25276 25277 25032
+25277 25361 25142
+25357 25274 25356
+25275 25031 25274
+24851 24852 24769
+25029 25030 24852
+25276 25031 25275
+24772 24771 25031
+24850 24851 24769
+25029 24852 24851
+25027 24850 24849
+25027 25140 25141
+25027 25028 24850
+25140 25270 25141
+25270 25269 25354
+25140 25139 25269
+25269 25270 25140
+25354 25527 25528
+25355 25141 25270
+25271 25028 25141
+25531 25357 25356
+25531 25761 25358
+25529 25355 25528
+25270 25354 25528
+25028 25271 25272
+25141 25355 25271
+25271 25355 25529
+25273 25530 25356
+25358 25532 25275
+25761 25842 25532
+25274 25358 25275
+25357 25531 25358
+25532 25276 25275
+25277 25142 25032
+25533 25359 25276
+25360 25361 25277
+25532 25533 25276
+25649 25650 25533
+25276 25359 25277
+25533 25650 25359
+24774 24854 24855
+24853 25032 25033
+24549 24774 24550
+24549 24773 24774
+25034 24856 24855
+24776 24646 24645
+24776 24856 24857
+24775 24855 24856
+24856 24776 24775
+24777 24648 24647
+24648 24552 24647
+24211 24314 24315
+24314 24780 24554
+24555 24383 24315
+24556 24783 24316
+25544 25042 25041
+24212 24211 24383
+24649 24313 24553
+24556 24316 24383
+24317 24147 24316
+24148 24147 24317
+23927 23988 24148
+24316 24147 24146
+23987 23927 23749
+23749 23581 23523
+24148 23988 24147
+24148 23989 23928
+23522 23748 23418
+24211 24212 24146
+24146 24147 23987
+24144 24143 24312
+24777 24647 24776
+24552 24312 24551
+24778 24648 24777
+24553 24552 24648
+24647 24646 24776
+24647 24552 24551
+24776 24645 24775
+24551 24311 24550
+24646 24551 24645
+24646 24647 24551
+23745 23923 23924
+24141 24311 24142
+24553 24381 24552
+24143 24311 24312
+24552 24381 24312
+23923 24141 24142
+24142 24143 23924
+24310 24141 24140
+24142 23924 23923
+23518 23744 23745
+23743 23742 24140
+24143 23925 23924
+23747 23579 23520
+23744 23743 23923
+23518 23347 23743
+23745 23744 23923
+23518 23743 23744
+23519 23578 23520
+23519 23745 23578
+23925 23747 23825
+23578 23745 23746
+23825 23747 23746
+23579 23521 23520
+23826 23925 23926
+23825 23924 23925
+23826 23579 23747
+23580 23522 23521
+23925 23826 23747
+23748 23522 23580
+23826 23748 23579
+23826 23926 23748
+23926 23925 23986
+23579 23748 23580
+23926 23986 23748
+24144 24313 24145
+24313 24649 24210
+24381 24313 24312
+23986 23925 24144
+23986 24145 23748
+23986 24144 24145
+24312 24313 24144
+24381 24553 24313
+23987 23988 23927
+24148 23928 23927
+23749 23523 23419
+23187 23351 23352
+23126 23125 23352
+23351 23524 23352
+22739 22617 22544
+23125 23187 23352
+22958 23023 23126
+23023 22958 22793
+23127 22958 23126
+23126 23023 23125
+22959 22738 22794
+22959 22739 22738
+22794 22738 22793
+22958 23127 22959
+22958 22794 22793
+22959 22795 22739
+22740 22795 22960
+22739 22544 22616
+22738 22616 22793
+22738 22739 22616
+22795 22617 22739
+22546 22740 22741
+22617 22795 22740
+22795 22959 22960
+22958 22959 22794
+22741 22740 22961
+24153 23753 24152
+23989 24149 23929
+26022 25545 25544
+23524 23419 23523
+23828 23750 23581
+23749 23828 23581
+23929 23930 23750
+23928 23827 23927
+23827 23989 23828
+23828 23749 23827
+23928 23989 23827
+23929 23750 23828
+23930 24150 23751
+24562 25045 25046
+23929 23828 23989
+23930 23929 24149
+24148 24149 23989
+26023 25545 26022
+24560 25044 24561
+24561 25045 24562
+25047 25550 25048
+24563 24562 25046
+25046 25549 25047
+24561 25044 25045
+25043 24559 25042
+25543 25544 25041
+24560 24559 25043
+25545 25043 25042
+25044 24560 25043
+25044 25547 25045
+25546 25043 25545
+26818 27100 27101
+26481 26025 26024
+26481 26482 26025
+26483 26027 26026
+27101 27352 27102
+25546 25044 25043
+25544 25545 25042
+26476 26815 26816
+26019 25542 25541
+24783 24556 24782
+26475 26018 26474
+25539 25282 25281
+25284 25540 25285
+24650 24780 24781
+25145 25283 25284
+24781 24782 24651
+24557 24783 25040
+24317 24316 24783
+24783 24557 24317
+25040 25041 24557
+24555 24554 24781
+24554 24780 24650
+24781 24554 24650
+24555 24382 24554
+24779 24861 24780
+25037 24859 25282
+25038 25284 25285
+24780 25038 25285
+24780 24861 25038
+25038 25145 25284
+24859 24779 24649
+24861 24860 25145
+24860 24859 25037
+25145 24860 25037
+24861 24779 24860
+25282 24859 25036
+24860 24779 24859
+24854 25033 24855
+24854 24853 25033
+24858 24857 25035
+24777 24776 24857
+25144 25143 25278
+25033 25142 25143
+25363 25279 25278
+25034 25033 25144
+25035 25279 25280
+25144 25278 25279
+25537 25366 25280
+25365 25364 25536
+25279 25363 25364
+25280 25365 25537
+25280 25279 25365
+25361 25535 25362
+25765 26015 25535
+25365 25766 25537
+26015 26471 26472
+26473 26016 26472
+25538 25366 25537
+25539 25538 25767
+25281 25366 25538
+25367 25282 25539
+25283 25367 25540
+25283 25282 25367
+26018 26017 26474
+25284 25283 25540
+25542 26019 26020
+26478 26022 26021
+26020 26477 26021
+26021 25543 26020
+27099 26816 27098
+27099 26817 26816
+26475 26476 26019
+26816 26477 26476
+25542 26020 25543
+26476 26477 26020
+26018 26019 25541
+26476 26020 26019
+26014 26470 26471
+26018 26475 26019
+26814 26813 27096
+26811 27093 27094
+26017 26473 26474
+27095 27094 27345
+26816 26815 27098
+26476 26475 26815
+26473 26813 26474
+26473 26812 26813
+26471 26811 26472
+26471 26810 26811
+26472 26812 26473
+26472 26811 26812
+27093 27344 27094
+27093 27343 27344
+27344 27345 27094
+27603 27604 27345
+27604 27346 27345
+26813 26812 27095
+27347 27346 27605
+27347 27096 27346
+26474 26813 26814
+26813 27095 27096
+27347 27097 27096
+26815 26475 26814
+26814 27097 26815
+26814 27096 27097
+27607 27348 27606
+27607 27349 27348
+27098 27349 27099
+27098 27348 27349
+27609 27610 27351
+27612 27883 27884
+27353 27352 27611
+27351 27610 27352
+27610 27611 27352
+27882 27883 27611
+26024 26480 26481
+26479 26022 26478
+27101 27100 27351
+26817 27099 27100
+27352 27101 27351
+26819 26480 26479
+26818 26817 27100
+26478 26477 26817
+26021 26022 25544
+26479 26818 26819
+26478 26818 26479
+26478 26817 26818
+26023 26480 26024
+26819 26818 27101
+26023 26479 26480
+26023 26022 26479
+27102 26819 27101
+27102 26820 26819
+27103 26820 27102
+27103 26821 26820
+26820 26821 26481
+26482 26026 26025
+26822 26823 26483
+26482 26483 26026
+26823 26824 26484
+26482 26822 26483
+27104 27105 26822
+26822 27105 26823
+27614 27613 27885
+27104 27355 27105
+27104 27354 27355
+27102 27352 27353
+27355 27354 27613
+27612 27611 27883
+27103 27353 27354
+27103 27102 27353
+27613 27612 27884
+27354 27353 27612
+28166 27886 27885
+27615 27357 27356
+27356 27106 27105
+27107 26825 26824
+27357 27107 27106
+27358 27108 27107
+26827 26826 27109
+27360 27361 27110
+27617 27359 27358
+26629 26827 26630
+27359 27109 27108
+27360 27110 27109
+26486 26826 26487
+26825 27108 26826
+26823 27106 26824
+26029 26485 26486
+26825 26486 26485
+27110 27361 27111
+26488 26629 26630
+26487 26826 26629
+26629 26826 26827
+26489 26828 26829
+26631 26630 26828
+26490 26829 26830
+27362 27361 27620
+27112 27113 26830
+27113 26831 26830
+27117 26834 27116
+26492 26491 26831
+27114 26831 27113
+26832 26492 26831
+27115 26832 27114
+26833 26493 26832
+28496 28837 28497
+26833 26832 27115
+27114 27113 27364
+26830 26829 27112
+27623 27365 27364
+26832 26831 27114
+26828 27111 26829
+26828 27110 27111
+27111 27112 26829
+27362 27363 27112
+27115 27116 26833
+27367 27366 27625
+27117 27368 27118
+27896 27625 27624
+26834 27117 26835
+27116 27367 27117
+27117 27118 26835
+27371 27629 27630
+27118 27119 26836
+28180 27899 28179
+27118 27369 27119
+27118 27368 27369
+27369 27370 27119
+27628 27899 27900
+27629 27371 27370
+26839 26840 26500
+27372 27181 27371
+27372 27373 27123
+27632 27633 27374
+27123 26926 26954
+27181 27372 27122
+25563 26041 25564
+27119 27370 27120
+27120 27371 27121
+26925 26954 26926
+27122 27123 26954
+27122 27372 27123
+26841 26868 26927
+26840 26839 26925
+26841 26632 26840
+26926 26868 26840
+26842 27124 27125
+26926 26927 26868
+26954 26925 27122
+26498 26042 26041
+26840 26925 26926
+26496 26495 26835
+26833 27116 26834
+26496 26835 26836
+26836 26837 26497
+26836 27119 26837
+26493 26492 26832
+25057 25559 25560
+26493 26036 26492
+26493 26037 26036
+26036 26037 25559
+26493 26833 26494
+26493 26494 26037
+26833 26834 26494
+26038 26037 26494
+26836 26497 26496
+26837 26838 26498
+26497 26837 26498
+26838 26499 26498
+26839 26500 26499
+26501 26500 26632
+26233 26499 26500
+24577 24323 24322
+26497 26498 26041
+25564 26042 25565
+26499 26233 26043
+25561 25562 25059
+26041 26040 26497
+26044 26043 26233
+24578 25060 25061
+25563 25564 25061
+26041 26042 25564
+26039 25561 26038
+26495 26038 26494
+25560 25559 26037
+26496 26039 26495
+26496 26040 26039
+25561 25560 26038
+24575 24784 24576
+25054 25055 24571
+26036 25558 26035
+26036 25559 25558
+26490 26033 26489
+25555 26032 26033
+24570 25053 25054
+25051 25554 25052
+25554 25553 26031
+25052 25555 25053
+25052 25554 25555
+26035 26034 26491
+26491 26490 26830
+26034 26033 26490
+26036 26035 26492
+25557 26034 26035
+26489 26032 26488
+26487 26030 26486
+25554 26032 25555
+25554 26031 26032
+26828 26489 26631
+26829 26490 26489
+26032 26031 26488
+25554 25051 25553
+25552 26029 26030
+26825 26826 26486
+26488 26487 26629
+26031 26030 26487
+26027 26484 26028
+26483 26823 26484
+25549 26027 25550
+25549 26026 26027
+26027 26028 25550
+26484 26485 26028
+25048 25551 25049
+26028 26485 26029
+26030 26029 26486
+25551 26028 26029
+26030 25553 25552
+26030 26031 25553
+25048 25049 24565
+25551 25552 25049
+25550 25551 25048
+25552 25553 25050
+24569 25053 24570
+24572 25056 24573
+24571 25055 24572
+24572 24573 24318
+24569 24160 24568
+23931 23764 24163
+24164 23932 23931
+24163 24164 23931
+24318 23932 24164
+23359 23526 23757
+23359 23358 23526
+23528 23527 23758
+23758 23529 23528
+22967 22966 23132
+23358 23128 23357
+23131 22965 23130
+22964 23128 23129
+23130 22965 23129
+23359 23130 23129
+23360 23130 23359
+23360 23131 23130
+23361 23529 23362
+23932 23764 23931
+24163 23764 23763
+23933 24165 23934
+23935 23766 23934
+24168 23768 24167
+24167 23768 23767
+22561 22560 22744
+22559 22742 22743
+22742 22972 22973
+22743 22742 22973
+22743 22744 22560
+22743 22973 22974
+22744 22743 22974
+23936 23769 23768
+24173 23937 24326
+24169 23936 24168
+24173 23938 23937
+24578 24579 24170
+24168 23936 23768
+24324 24578 24170
+24325 24581 24326
+24168 24213 24169
+24213 24322 24323
+24384 24577 24322
+24578 24324 24323
+24324 24169 24323
+24168 24322 24213
+24170 24169 24324
+24318 24573 24319
+23932 23933 23765
+24574 24320 24319
+24168 24321 24322
+24321 24384 24322
+25059 25562 25060
+24784 25059 24576
+24574 25058 24575
+25058 25057 25560
+25561 25058 25560
+25561 25059 25058
+25058 24784 24575
+25058 25059 24784
+24323 24577 24578
+24576 24577 24384
+25060 24578 24577
+24171 24170 24579
+24579 24580 24171
+25063 25062 25565
+26043 25566 25565
+23938 24173 24327
+24327 24328 23938
+24580 24581 24325
+24584 24329 24328
+23939 24328 24174
+24326 24327 24173
+24326 24581 24582
+24585 24176 24330
+24175 24174 24329
+23777 24176 23940
+24175 24330 24176
+23941 23940 23990
+23777 23940 23941
+23990 24177 23941
+24176 23990 23940
+24176 24177 23990
+23942 23941 24178
+23778 23941 23942
+23778 23942 23779
+23532 23531 23776
+23774 23773 23829
+23775 23938 23939
+23829 23937 23938
+24326 23937 24172
+23829 23773 23937
+23937 23773 23772
+23829 23938 23774
+23582 23774 23775
+23530 23773 23774
+23531 23582 23775
+23530 23774 23582
+23376 23531 23532
+23375 23530 23531
+23188 23134 23376
+22979 22745 22978
+23376 23377 23188
+22566 22565 22745
+22981 22746 22980
+22569 22568 22746
+23134 22981 23133
+22569 22746 22981
+22982 22981 23134
+23377 23189 23188
+23135 23136 22982
+23379 23378 23533
+23134 23135 22982
+23190 23378 23136
+23138 23139 22984
+23138 23380 23381
+22982 23136 22983
+23135 23190 23136
+23138 23137 23380
+22983 23136 23137
+23779 23381 23778
+23532 23377 23376
+23189 23134 23188
+23189 23190 23135
+23189 23378 23190
+23378 23189 23377
+23377 23533 23378
+23776 23777 23533
+23137 23379 23380
+23136 23378 23379
+23420 23384 23534
+23534 23384 23383
+23192 23384 23421
+23193 23024 23192
+23142 22987 23141
+22986 23140 23141
+23383 23141 23140
+23191 23192 23142
+23024 23142 23192
+23141 23191 23142
+22988 22747 22987
+22748 22747 22988
+22988 23024 23193
+22987 23142 23024
+22800 22750 22799
+22618 22577 22749
+22797 22798 22749
+22796 22797 22748
+22798 22799 22749
+22799 22750 22618
+22751 22619 22750
+23025 22799 22798
+23025 22989 22799
+22989 22800 22799
+22751 22750 22800
+22796 22988 23143
+22796 22748 22988
+22748 22797 22749
+22796 23143 22797
+23421 23193 23192
+23194 22988 23193
+23385 23194 23193
+23143 22988 23194
+23194 23195 23143
+23195 23194 23386
+23385 23421 23422
+23535 23585 23536
+23386 23385 23422
+23386 23194 23385
+23585 23783 23422
+23945 23993 24216
+23421 23535 23536
+23420 23584 23535
+23535 23421 23420
+23536 23422 23421
+23421 23384 23420
+23192 23191 23384
+23420 23534 23583
+23943 23781 23780
+23993 24182 24216
+23781 23830 23831
+23832 23783 23782
+23583 23781 23831
+24182 24181 24216
+24332 24333 24215
+24182 23992 24181
+24331 24180 24179
+24214 24215 24180
+24180 23943 23780
+23991 23992 23943
+24216 24215 24333
+24215 24214 24332
+24387 24333 24332
+24216 24181 24215
+24654 24216 24387
+23945 23832 23831
+23943 23992 23830
+23991 24181 23992
+23943 23830 23781
+23992 24182 23993
+23945 23944 23993
+23830 23992 23944
+23782 23831 23832
+23830 23944 23831
+23831 23944 23945
+23944 23992 23993
+24332 24386 24387
+24332 24214 24386
+24385 24331 24588
+24386 24214 24331
+24787 24788 24653
+24386 24331 24385
+24588 24653 24385
+24590 24387 24386
+24216 24333 24387
+24653 24788 24654
+24864 24863 25071
+24589 24653 24654
+25071 24654 24788
+24387 24590 24654
+24864 25071 24788
+25148 25573 25071
+24787 24864 24788
+24863 24862 25070
+24385 24653 24589
+24652 24787 24653
+25069 25147 24862
+25146 25289 25147
+25573 25372 25371
+25573 25290 25372
+25573 25371 25572
+25653 25572 25652
+25653 25573 25572
+25372 25289 25371
+25372 25290 25289
+25147 25069 25146
+24786 24587 25069
+25290 25148 25147
+25071 24863 25070
+25070 25148 25071
+25290 25573 25148
+24652 24653 24588
+25069 24587 25068
+24786 24588 24587
+24787 24863 24864
+24787 24652 24863
+25067 24586 24585
+25068 24587 24586
+25066 25067 24585
+25287 25368 25369
+25287 25288 25068
+25369 25571 25652
+25568 25066 25065
+24585 24330 24584
+24583 24584 24328
+25066 24585 24584
+24327 24583 24328
+24327 24326 24582
+24172 24325 24326
+24172 24580 24325
+24327 24582 24583
+24581 24785 24582
+25064 25567 25065
+25063 25064 24785
+25063 25566 25064
+24584 25065 25066
+25066 25569 25067
+25570 25368 25287
+25064 25566 25567
+25063 25565 25566
+25286 25067 25569
+26234 26235 26047
+25569 25066 25568
+26049 25770 26048
+25770 25286 25569
+26048 25770 25769
+25844 26116 25771
+25570 25771 25571
+25772 25773 25652
+25770 25570 25286
+25770 25844 25771
+25286 25570 25287
+25287 25369 25288
+25368 25571 25369
+25845 25773 25772
+25653 25652 25773
+25652 25370 25369
+25572 25371 25370
+26956 26955 27127
+27126 27125 27182
+26930 26869 26955
+26930 26955 26956
+27126 26843 27125
+26929 26844 26843
+25568 25567 26046
+25566 26043 26044
+26045 25768 26044
+26044 25768 25566
+26927 26928 26841
+26927 27124 26928
+26841 26928 26842
+27124 26842 26928
+27125 26843 26842
+27183 27139 27203
+26955 26929 27126
+27126 27182 27139
+27125 27374 27375
+27140 27126 27139
+26929 26843 27126
+27446 27375 27374
+27403 27202 27375
+27403 27404 27202
+27448 27635 27405
+27183 27203 27204
+27139 27182 27203
+27203 27377 27204
+27184 27140 27183
+27140 27139 27183
+27204 27184 27183
+27127 26955 27140
+26931 26930 26957
+26956 27127 27128
+27377 27184 27204
+27141 27127 27140
+27128 27127 27141
+26957 26930 26956
+26870 26845 26869
+27141 26957 27128
+27141 27184 26957
+26667 26870 26871
+26845 26870 26667
+26931 26957 26846
+26844 26845 26633
+26844 26869 26845
+26931 26870 26930
+26931 26871 26870
+26504 26503 26633
+26047 25568 26046
+26235 26234 26503
+26845 26667 26633
+26871 26846 26667
+26871 26931 26846
+26235 26115 26048
+26236 26237 26049
+25770 26049 25844
+26115 26236 26049
+26050 25771 26116
+25651 25571 25771
+25771 26050 25651
+26050 25845 25772
+25651 26050 25772
+26116 25845 26050
+25653 25773 25845
+25845 26116 26238
+26235 26307 26308
+26237 26238 25844
+26308 26237 26236
+26115 26235 26308
+26235 26503 26307
+26307 26504 26308
+26307 26503 26504
+26115 26308 26236
+27404 27447 27448
+27635 27377 27405
+27376 27404 27405
+27469 27635 27448
+27447 27469 27448
+27467 27446 27633
+27405 27404 27448
+27403 27446 27467
+27202 27404 27376
+27403 27447 27404
+27469 27468 27635
+27447 27403 27468
+27631 27632 27373
+27704 27732 27705
+27652 27467 27633
+27468 27403 27467
+27903 27632 27631
+27703 27730 27651
+27651 27652 27633
+27653 27635 27634
+27467 27634 27468
+27652 27704 27705
+27651 27730 27731
+27922 27923 27730
+28184 27903 28183
+27631 27630 27902
+27903 27904 27632
+27904 27730 27703
+27902 27903 27631
+27988 27922 27904
+27632 27904 27703
+27903 27988 27904
+28011 28186 28012
+27905 27731 27730
+27989 28012 27990
+27906 27731 27905
+27703 27651 27633
+27731 27732 27704
+28011 28012 27989
+27652 27653 27634
+27732 27906 27705
+27651 27704 27652
+27651 27731 27704
+27924 27705 27906
+27635 27653 27705
+27905 27924 27906
+28010 27988 28184
+28010 28011 27988
+27922 27989 27923
+28011 28185 28186
+28010 28202 28185
+27990 27924 27905
+28185 28203 28186
+27989 27990 27923
+28012 28272 27990
+28186 28203 28272
+28316 28630 28272
+28184 28202 28010
+28271 28272 28202
+28203 28202 28272
+28271 28315 28316
+28270 28184 28183
+28271 28201 28315
+28271 28202 28201
+28271 28316 28272
+28504 28567 28316
+28503 28566 28567
+28566 28630 28567
+28630 28672 28844
+28629 28565 28671
+28630 28629 28672
+28630 28566 28629
+28671 28843 28844
+28899 28968 29011
+28901 28844 28843
+28843 28671 28670
+28844 28672 28671
+28565 28502 28628
+28503 28567 28504
+28565 28566 28502
+28565 28629 28566
+28315 28503 28504
+28270 28502 28566
+28316 28315 28504
+28201 28184 28270
+28502 28270 28183
+28314 28315 28201
+28566 28314 28270
+28503 28315 28314
+29201 29202 29012
+29244 29313 29202
+29201 29012 29011
+29013 28970 28969
+29518 29543 29519
+29243 29242 29312
+29243 29313 29244
+29244 29201 29243
+29244 29202 29201
+29312 29341 29313
+29808 29798 29807
+29519 29543 29341
+29604 29771 29772
+29312 29340 29341
+29542 29518 29541
+29591 29590 29605
+29341 29340 29519
+29312 29242 29339
+29543 29591 29605
+29543 29542 29591
+29312 29339 29340
+29542 29543 29518
+29590 29604 29605
+29590 29542 29541
+29541 29589 29603
+29590 29591 29542
+29780 29771 29779
+29604 29590 29603
+29515 29769 29516
+29603 29590 29541
+29339 29517 29541
+29517 29516 29589
+29767 29768 29514
+29516 29198 29515
+29768 29769 29515
+29589 29541 29517
+29518 29339 29541
+29311 29199 29517
+29242 29200 29311
+29242 29011 29200
+29516 29199 29198
+29311 29200 29199
+29340 29339 29518
+29311 29517 29339
+29198 28839 29197
+27367 27368 27117
+28498 28497 28838
+27625 27366 27624
+28839 28498 28838
+28180 28179 28498
+28499 28840 28500
+29198 29199 28840
+28840 28839 29198
+28840 28499 28839
+29200 28968 28841
+29200 29011 28968
+28670 28900 28843
+29012 29202 29013
+29012 29013 28969
+29202 28970 29013
+28843 28900 28901
+29202 29341 28970
+28842 28900 28628
+28969 28970 28900
+28501 28842 28628
+28841 28968 28842
+28969 28899 29012
+28969 28900 28899
+28181 27900 28180
+28180 28498 28499
+27901 28182 27902
+28500 28841 28501
+28502 28501 28628
+28182 28500 28501
+27630 27629 27901
+27370 27369 27628
+27629 27900 27901
+27629 27370 27628
+28182 28181 28500
+27901 27900 28181
+27629 27628 27900
+27369 27627 27628
+27626 27627 27368
+27899 27628 27627
+28181 28180 28499
+27900 27899 28180
+28498 28179 28497
+27899 27627 27898
+27367 27626 27368
+27898 28179 27899
+27625 27897 27626
+28178 28179 27898
+27115 27366 27116
+28494 28175 28493
+27116 27366 27367
+27365 27114 27364
+27898 27626 27897
+27366 27115 27365
+28176 28495 28177
+27626 27367 27625
+28496 28178 28177
+28178 27898 27897
+28496 28177 28495
+27897 27625 27896
+29196 29514 29197
+28178 27897 28177
+28497 28178 28496
+28497 28179 28178
+28836 28495 28835
+28177 27896 28176
+27623 27895 27624
+28175 28494 28176
+27895 27896 27624
+28177 27897 27896
+28495 28494 28835
+28495 28176 28494
+27893 28173 28174
+28833 29192 28834
+28834 28835 28494
+28493 28492 28833
+28173 28172 28491
+28172 28173 27892
+27363 27622 27364
+28492 28174 28173
+28492 28493 28174
+27892 27893 27621
+28174 27894 27893
+28175 27895 27894
+27624 27365 27623
+27894 27895 27623
+28175 28176 27895
+27366 27365 27624
+27115 27114 27365
+27113 27363 27364
+27113 27112 27363
+27621 27622 27363
+27893 27894 27622
+27363 27362 27621
+27111 27361 27362
+27618 27619 27360
+27890 28171 27891
+27619 27620 27361
+27891 28172 27892
+27617 27889 27618
+28170 28488 28489
+27358 27359 27108
+27618 27890 27619
+27617 27618 27359
+27889 27890 27618
+27616 27617 27358
+27888 28169 27889
+27355 27356 27105
+27614 27886 27615
+27356 27357 27106
+27616 27358 27357
+27615 27886 27887
+27614 27885 27886
+27616 27615 27887
+27356 27614 27615
+27615 27616 27357
+27887 28168 27888
+27617 27888 27889
+28168 28486 28487
+27886 28167 27887
+28485 28826 28486
+27616 27888 27617
+27616 27887 27888
+28167 28486 28168
+28167 28485 28486
+28168 28487 28169
+28486 28826 28827
+28829 28488 28828
+28169 28487 28488
+28490 28171 28489
+28170 27889 28169
+28171 28170 28489
+27890 27889 28170
+28170 28171 27890
+28489 28830 28490
+27619 27891 27620
+27619 27890 27891
+29188 29189 28830
+28831 29190 28832
+28831 28491 28490
+28492 28173 28491
+28830 28831 28490
+28832 29191 28833
+28830 29189 28831
+29189 29188 29505
+28830 28489 28829
+30161 30162 29960
+29188 28829 29187
+28830 28829 29188
+28489 28488 28829
+28827 28828 28487
+29187 28829 28828
+28486 28827 28487
+29502 29186 29185
+29187 28828 29186
+29500 29309 29184
+29500 29540 29309
+29500 29539 29540
+28826 29185 28827
+29754 29502 29579
+29754 29956 29957
+29309 29540 29501
+29539 29577 29540
+29577 29578 29540
+29753 29956 29754
+29956 29753 29955
+29578 29577 29753
+29753 29754 29579
+29957 30159 30160
+29503 29755 29756
+29502 29754 29755
+29188 29504 29505
+29958 30160 30161
+29186 29503 29187
+29186 29502 29503
+29503 29504 29187
+29756 29757 29504
+29505 29506 29189
+29505 29757 29758
+29504 29757 29505
+29756 29958 29959
+29961 29758 29960
+29759 29580 29758
+29584 29602 29585
+29584 29761 29602
+29602 29762 29585
+29602 29761 29762
+29796 29763 29762
+29764 29964 29965
+29509 29586 29510
+29585 29763 29586
+29761 29583 29760
+29507 29581 29582
+29508 29583 29584
+29189 29190 28831
+29507 29191 29190
+28831 28832 28491
+29190 29191 28832
+28833 28834 28493
+29192 29509 29193
+29193 29509 29510
+28834 29193 28835
+28834 29192 29193
+29514 29196 29513
+29511 29310 29510
+29193 29510 29310
+29512 29195 29194
+28496 28495 28836
+28836 28837 28496
+29766 29512 29765
+28836 29195 28837
+28836 29194 29195
+29195 29196 28837
+29195 29513 29196
+29514 29513 29767
+29195 29512 29513
+29194 29511 29512
+29586 29763 29764
+29588 29511 29587
+29194 29310 29511
+29964 29764 29796
+29587 29586 29764
+29766 29767 29513
+29512 29511 29588
+29966 29765 29965
+29766 29513 29512
+30165 30166 29963
+29764 29763 29796
+29962 30164 30165
+30164 30486 30487
+29795 29962 29963
+30808 31425 30809
+30811 30491 31429
+32058 31425 32057
+29963 30166 29964
+30492 30811 30812
+30490 30491 30166
+30490 30810 30491
+30165 30489 30490
+30488 30807 30808
+30491 30810 31429
+30490 30809 30810
+30489 30808 30809
+30807 31421 31422
+30489 30488 30808
+29962 29795 29760
+30490 30489 30809
+30165 30488 30489
+31421 30487 30806
+29962 30165 29963
+30163 30485 30486
+31416 31415 32049
+30806 30487 30486
+30488 30165 30164
+30485 30804 30805
+30484 30803 30804
+30800 31408 31409
+31410 31411 30801
+30801 30802 30482
+31413 32045 32046
+30484 30162 30483
+29959 29757 29756
+30486 30485 30805
+30163 30484 30485
+30486 30164 30163
+30487 30488 30164
+29759 29962 29760
+29759 29961 29962
+30163 29961 30162
+29758 29757 29960
+29758 29961 29759
+29960 30162 29961
+30480 30161 30160
+29960 29757 29959
+29958 30161 29959
+30481 30801 30482
+30480 30481 30161
+32041 32040 32039
+30159 30478 30160
+30479 31405 30799
+30797 30478 30477
+30798 30479 30478
+29755 29958 29756
+29755 29754 29957
+29755 29957 29958
+29956 30158 30159
+30159 30158 30476
+29956 29955 30158
+30477 30159 30476
+30477 30478 30159
+30792 30793 30473
+31393 32026 31394
+30473 30474 30157
+32028 31395 32027
+30158 30475 30476
+30158 30474 30475
+30474 30793 31395
+31397 31398 30795
+32027 31394 32026
+30793 31393 31394
+30475 30794 30795
+30475 30474 30794
+32027 31395 31394
+30794 30474 31395
+32029 31396 32028
+30794 31395 31396
+31398 31397 32031
+30795 30794 31397
+31399 31398 32032
+31399 30795 31398
+31399 31400 30796
+31399 32032 31400
+30796 31401 30477
+31403 30798 30478
+30797 31403 30478
+31406 32040 31407
+30479 30799 30480
+30479 30798 31405
+30480 30800 30481
+30480 30799 31407
+32041 31408 32040
+30800 30480 31407
+30801 31409 31410
+30801 30481 31409
+30800 31407 31408
+30799 31405 31406
+31403 31404 30798
+31404 32037 31405
+30799 31406 31407
+31405 32038 31406
+31401 31402 30797
+31404 31405 30798
+30477 31401 30797
+31400 32032 32033
+30797 31402 31403
+31401 32034 31402
+32025 32027 32026
+32024 32029 32027
+31395 32028 31396
+31397 32029 32030
+31402 32036 31403
+31403 32036 31404
+31404 32036 32037
+32037 32038 31405
+31396 32029 31397
+32028 32027 32029
+32031 31397 32030
+32032 32031 32030
+32030 32033 32032
+32033 32030 32029
+32033 32034 31401
+32047 31414 31413
+32035 32034 32033
+31406 32039 32040
+32035 32037 32036
+32035 32033 32037
+31406 32038 32039
+32037 32033 32038
+31410 32042 32043
+31409 31408 32041
+32043 32041 32039
+32042 31409 32041
+31410 32043 32044
+32039 32045 32043
+31413 32046 32047
+32053 32052 32051
+31420 31421 30806
+32056 32053 32051
+32054 31421 31420
+31419 31420 30806
+32053 32054 31420
+32056 32060 32058
+31416 31417 30804
+32050 32051 31417
+32044 31411 31410
+32044 32045 31411
+31411 31412 30802
+31411 32045 31412
+30483 31413 30803
+31412 32045 31413
+30805 31418 31419
+30805 31417 31418
+32048 31414 32047
+31415 30803 31414
+31417 31416 32049
+30804 31415 31416
+31424 31423 32057
+30808 30807 31423
+32055 31422 31421
+31423 30807 31422
+30808 31424 31425
+30808 31423 31424
+31427 31426 32059
+30809 31425 31426
+32061 31428 32060
+30810 30809 31427
+30810 31428 31429
+30810 31427 31428
+32058 32057 32056
+32055 32053 32056
+31423 31422 32056
+32054 32053 32055
+31423 32056 32057
+32059 32058 32060
+31426 31425 32058
+31427 32059 32060
+31426 32058 32059
+32062 32061 32063
+31429 31428 32061
+31434 32067 31435
+32068 31436 31435
+32063 32066 32064
+32063 32060 32066
+31437 32070 31438
+31441 32074 32075
+31437 32069 32070
+32069 32074 32071
+32069 32071 32070
+32069 32068 32074
+32079 32078 32074
+31442 31441 32075
+32074 32078 32075
+32079 31446 32078
+32078 32076 32075
+30818 31445 30499
+32073 32072 32074
+31439 32071 32072
+31441 32073 32074
+31439 30815 31438
+32076 31443 31442
+30817 30816 31441
+32078 32077 32076
+32078 31445 31444
+30818 31443 31444
+32077 32078 31444
+30818 30498 30817
+30817 31441 31442
+31441 31440 32073
+31440 30816 31439
+32076 31442 32075
+31443 30818 30817
+30812 31433 30813
+32067 32068 31435
+30815 31437 31438
+31436 32069 31437
+32071 31439 31438
+32072 32073 31439
+31430 32062 32063
+31429 32061 32062
+30811 31431 30812
+31431 31430 32063
+32065 31433 31432
+32066 32067 31434
+31429 31430 30811
+31429 32062 31430
+30812 31431 31432
+30811 31430 31431
+31433 31434 30813
+31433 32066 31434
+30494 30813 31435
+31435 31436 30814
+31433 30812 31432
+30493 30492 30812
+30495 30494 30814
+30493 30812 30813
+30167 30492 30493
+30166 30491 30492
+29963 29964 29796
+30166 30492 30167
+30813 30494 30493
+29965 29964 30166
+30494 30168 30167
+29765 29764 29965
+30168 30494 30495
+30167 30493 30494
+30167 30168 29966
+30495 30815 30496
+30495 30496 30168
+30169 30498 30170
+30167 29966 29965
+30168 30169 29967
+29966 29766 29765
+29966 29967 29766
+29967 29968 29767
+29969 29797 29769
+30168 29967 29966
+30171 30172 29996
+29767 29968 29768
+29967 30169 29968
+30169 30170 29968
+30169 30497 30498
+30169 30496 30497
+30169 30168 30496
+30170 30498 30499
+30817 31442 31443
+30496 30816 30497
+30496 31439 30816
+30497 30817 30498
+30497 30816 30817
+31445 30818 31444
+30499 30498 30818
+29982 29981 29997
+30171 30170 30500
+29981 30007 29997
+30500 30170 30499
+29971 29807 29806
+29769 29770 29589
+29983 29982 29997
+29807 29798 29806
+29968 29969 29768
+29968 30170 29969
+29603 29770 29779
+29969 29996 29970
+29970 29797 29969
+29806 29798 29779
+29516 29769 29589
+29768 29969 29769
+29589 29770 29603
+29769 29797 29770
+29780 29779 29798
+29770 29797 29779
+29970 29806 29797
+29970 29981 29806
+29981 29971 29806
+29971 29808 29807
+29983 29808 29972
+29799 29780 29798
+29808 29799 29798
+29771 29603 29779
+29781 29771 29780
+29604 29603 29771
+29781 29772 29771
+29605 29604 29772
+29983 29799 29808
+29799 29781 29780
+29799 29772 29781
+30008 29998 29997
+29998 30009 29983
+29983 29971 29982
+29972 29808 29971
+29997 29998 29983
+30185 30504 30009
+30007 30008 29997
+30173 30174 30008
+30008 30174 30009
+30173 30184 30174
+29998 30008 30009
+30007 30172 30173
+30503 30504 30185
+30183 30503 30184
+31452 32084 32085
+30174 30185 30009
+30174 30184 30185
+30173 30172 30183
+30170 30171 29969
+30183 30172 30502
+30007 29996 30172
+30822 30183 30502
+30184 30173 30183
+30820 30501 30500
+30502 30172 30501
+31445 30819 30499
+30501 30172 30171
+29969 30171 29996
+30500 30501 30171
+30499 30819 30500
+31445 31446 30819
+31448 30820 31447
+31449 30501 30820
+31451 30821 31450
+30502 30501 30821
+31452 31451 32084
+30822 30821 31451
+30819 31446 31447
+31445 32078 31446
+31449 31448 32081
+31449 30820 31448
+32081 32080 32082
+31448 31447 32080
+31449 32081 32082
+31448 32080 32081
+32084 32083 32085
+32086 32085 32087
+30183 30822 30503
+30502 30821 30822
+31453 30823 31452
+30822 31451 31452
+30822 30823 30503
+31452 32085 31453
+32087 31453 32086
+31454 30824 31453
+30823 30824 30504
+30823 31453 30824
\ No newline at end of file
-# .PCD v.5 - Point Cloud Data file format
-VERSION .5
-FIELDS x y z w
-SIZE 4 4 4 4
-TYPE F F F F
-COUNT 1 1 1 1
+# .PCD v0.7 - Point Cloud Data file format
+VERSION 0.7
+FIELDS x y z normal_x normal_y normal_z curvature
+SIZE 4 4 4 4 4 4 4
+TYPE F F F F F F F
+COUNT 1 1 1 1 1 1 1
WIDTH 3283
HEIGHT 1
+VIEWPOINT 0 0 0 1 0 0 0
POINTS 3283
DATA ascii
-1.068 0.094721 -0.016231 0
-1.061 -0.028772 0.060295 1
-1.0623 -0.040527 0.061047 2
-1.0662 -0.062634 0.068123 3
-1.1409 0.01096 -0.018963 4
-1.061 0.010928 0.04118 5
-1.0669 0.033427 0.023453 6
-1.082 0.014063 0.023212 7
-1.0702 0.019919 0.029893 8
-1.1021 0.054651 -0.017556 9
-1.0659 0.071941 0.0028285 10
-1.0809 0.05108 0.0025063 11
-1.0709 0.059696 0.0061207 12
-1.0842 0.075449 -0.015663 13
-1.072 0.080562 -0.0087111 14
-1.0897 0.060124 -0.0098445 15
-1.0777 0.06397 -0.0014249 16
-1.104 0.015911 0.0042437 17
-1.1224 0.033959 -0.01819 18
-1.1067 0.039092 -0.012226 19
-1.1289 0.016783 -0.012605 20
-1.1102 0.023018 -0.0053673 21
-1.086 0.036915 0.007621 22
-1.0721 0.042877 0.012893 23
-1.0904 0.021268 0.011994 24
-1.0782 0.025799 0.019187 25
-1.0943 0.042442 -0.0038091 26
-1.0985 0.029584 9.9195e-06 27
-1.142 -0.0023402 -0.018046 28
-1.1478 -0.021856 -0.014969 29
-1.1856 -0.062748 -0.018534 30
-1.1493 -0.063353 0.0074649 31
-1.1665 -0.042292 -0.017585 32
-1.1494 -0.040618 -0.0091634 33
-1.1676 -0.061432 -0.011532 34
-1.1537 -0.057022 -0.0043619 35
-1.1014 -0.027495 0.022228 36
-1.0626 -0.0052578 0.043081 37
-1.0672 -0.02136 0.048121 38
-1.087 -0.00081266 0.025093 39
-1.0709 0.00044475 0.034975 40
-1.0908 -0.020546 0.027144 41
-1.0743 -0.018846 0.036212 42
-1.1017 -0.063916 0.042506 43
-1.104 -0.042855 0.02706 44
-1.1276 -0.062217 0.024982 45
-1.1101 -0.058921 0.03415 46
-1.0871 -0.04335 0.045152 47
-1.0728 -0.038085 0.052866 48
-1.0914 -0.059409 0.048676 49
-1.0736 -0.059557 0.056855 50
-1.094 -0.037784 0.034307 51
-1.0774 -0.031207 0.038331 52
-1.0976 -0.051062 0.038799 53
-1.1232 -0.0020358 0.0025811 54
-1.1077 -0.00012923 0.0087363 55
-1.1244 -0.021017 0.0039363 56
-1.1088 -0.020045 0.012842 57
-1.1317 0.00025424 -0.0080264 58
-1.1327 -0.018341 -0.0053476 59
-1.0945 0.0011787 0.016737 60
-1.0981 -0.015196 0.019032 61
-1.13 -0.040987 0.0073197 62
-1.1125 -0.038116 0.016526 63
-1.1337 -0.056479 0.013774 64
-1.1365 -0.036847 -0.002123 65
-1.1389 -0.051403 1.0284e-05 66
-0.74673 0.25701 0.16494 67
-0.7629 0.25156 0.14073 68
-0.74469 0.25782 0.14775 69
-0.92979 0.33306 -0.017009 70
-0.91726 0.33081 -0.010164 71
-0.98108 0.25212 -0.019026 72
-0.90457 0.2761 0.024551 73
-0.92384 0.25338 0.023125 74
-0.9086 0.2595 0.027814 75
-0.94319 0.31866 -0.017086 76
-0.94678 0.29662 -0.014948 77
-0.90536 0.3173 0.0032577 78
-0.92364 0.29439 0.0024726 79
-0.90802 0.29983 0.0089949 80
-0.93081 0.31934 -0.011485 81
-0.91334 0.32153 -0.0044182 82
-0.93262 0.30131 -0.0072094 83
-0.91694 0.30567 -0.0002747 84
-0.94528 0.25779 0.0047022 85
-0.96475 0.27394 -0.016069 86
-0.94878 0.28018 -0.011602 87
-0.96789 0.25882 -0.012856 88
-0.95198 0.26164 -0.0037316 89
-0.92719 0.27804 0.0069554 90
-0.91111 0.28255 0.014668 91
-0.93249 0.26099 0.012278 92
-0.91513 0.26585 0.018064 93
-0.93479 0.28058 -0.002827 94
-0.9384 0.26872 -0.00051226 95
-0.83186 0.29516 0.069306 96
-0.86271 0.27307 0.062648 97
-0.86634 0.25949 0.063345 98
-0.82431 0.27506 0.08285 99
-0.8411 0.2517 0.080439 100
-0.82906 0.25941 0.08791 101
-0.85009 0.27734 0.066816 102
-0.83355 0.28237 0.072351 103
-0.84878 0.25862 0.072071 104
-0.83535 0.2638 0.077588 105
-0.80424 0.29027 0.10032 106
-0.78663 0.25489 0.12305 107
-0.80078 0.28326 0.10122 108
-0.79153 0.27737 0.1082 109
-0.80488 0.2574 0.10549 110
-0.79296 0.26194 0.11322 111
-0.76544 0.27263 0.1247 112
-0.75752 0.27183 0.13378 113
-0.76992 0.25993 0.1304 114
-0.75449 0.2648 0.13709 115
-0.77468 0.27507 0.11753 116
-0.77867 0.26421 0.11979 117
-0.81173 0.29165 0.085981 118
-0.81941 0.29461 0.0795 119
-0.80986 0.28056 0.091029 120
-0.79904 0.27541 0.099369 121
-0.81373 0.26266 0.096557 122
-0.86807 0.312 0.042219 123
-0.86354 0.30012 0.042371 124
-0.88545 0.31499 0.026802 125
-0.87534 0.31307 0.036569 126
-0.88676 0.29909 0.028 127
-0.87176 0.30052 0.037353 128
-0.84852 0.29784 0.049225 129
-0.83816 0.29686 0.057266 130
-0.88194 0.27411 0.042194 131
-0.869 0.27758 0.048873 132
-0.88336 0.25915 0.04532 133
-0.87479 0.26063 0.054836 134
-0.88941 0.28113 0.031667 135
-0.87614 0.28717 0.039141 136
-0.89342 0.261 0.036457 137
-0.85138 0.28365 0.052895 138
-0.83823 0.28678 0.057905 139
-0.89257 0.31601 0.012645 140
-0.89513 0.30209 0.016856 141
-0.89977 0.28922 0.01996 142
-0.72319 0.25344 0.20703 143
-0.71587 0.25232 0.2031 144
-0.70708 0.25278 0.18971 145
-0.73915 0.2538 0.16083 146
-0.70336 0.25227 0.17578 147
-0.7341 0.25714 0.15096 148
-0.6987 0.25142 0.16732 149
-0.73859 0.26596 0.1388 150
-0.74565 0.1992 0.23275 151
-0.77108 0.11231 0.22121 152
-0.76696 0.097684 0.22287 153
-0.75573 0.23191 0.18015 154
-0.7637 0.21372 0.18628 155
-0.75499 0.21429 0.18179 156
-0.76013 0.19271 0.19068 157
-0.75184 0.19908 0.18412 158
-0.74965 0.17907 0.18801 159
-0.78197 0.21946 0.14047 160
-0.74778 0.24028 0.16884 161
-0.76013 0.21009 0.16065 162
-0.74511 0.22047 0.17248 163
-0.76586 0.23929 0.14494 164
-0.74853 0.24135 0.14801 165
-0.76819 0.21863 0.14607 166
-0.75498 0.21832 0.15231 167
-0.7851 0.19142 0.1605 168
-0.78246 0.17883 0.16361 169
-0.78831 0.19676 0.14745 170
-0.80469 0.17507 0.14263 171
-0.79189 0.18012 0.15063 172
-0.7641 0.19848 0.16263 173
-0.74871 0.19923 0.17078 174
-0.77048 0.18035 0.16838 175
-0.75039 0.18112 0.17287 176
-0.77017 0.2022 0.1527 177
-0.75398 0.20944 0.1557 178
-0.82506 0.1534 0.14193 179
-0.8284 0.13848 0.14491 180
-0.86162 0.098262 0.14183 181
-0.82463 0.097426 0.16518 182
-0.84821 0.11752 0.14412 183
-0.83099 0.12053 0.15187 184
-0.85123 0.099672 0.14722 185
-0.83276 0.10081 0.1556 186
-0.78063 0.13083 0.18122 187
-0.76228 0.15526 0.20309 188
-0.75814 0.15228 0.20095 189
-0.76013 0.14899 0.20438 190
-0.75319 0.14029 0.20344 191
-0.76817 0.15413 0.18103 192
-0.74873 0.16034 0.19138 193
-0.76971 0.13844 0.183 194
-0.74709 0.14033 0.19062 195
-0.78075 0.097424 0.20209 196
-0.78191 0.11925 0.1861 197
-0.80263 0.095576 0.18273 198
-0.78748 0.098233 0.19129 199
-0.76688 0.11386 0.21689 200
-0.75243 0.11865 0.20508 201
-0.76938 0.098612 0.21072 202
-0.75066 0.099527 0.20759 203
-0.77489 0.12077 0.1895 204
-0.74413 0.12066 0.19571 205
-0.77718 0.10615 0.18881 206
-0.74225 0.10228 0.19858 207
-0.78274 0.15761 0.16197 208
-0.80346 0.13499 0.16407 209
-0.78806 0.13947 0.16982 210
-0.80956 0.15973 0.1479 211
-0.79164 0.16226 0.15625 212
-0.81038 0.14034 0.15334 213
-0.79707 0.14702 0.158 214
-0.77384 0.16004 0.17156 215
-0.75025 0.16663 0.17524 216
-0.77636 0.14459 0.1749 217
-0.81013 0.11967 0.16482 218
-0.79352 0.11988 0.17454 219
-0.81079 0.10095 0.17269 220
-0.79247 0.10745 0.17664 221
-0.81687 0.12422 0.15797 222
-0.90227 0.039727 0.14089 223
-0.92011 0.013941 0.14028 224
-0.9065 0.016599 0.1446 225
-0.90637 -0.062481 0.18435 226
-0.94549 -0.026781 0.14144 227
-0.90215 -0.0056495 0.16216 228
-0.90467 -0.022622 0.16381 229
-0.92254 -0.0035534 0.14311 230
-0.90837 0.00037996 0.15129 231
-0.92683 -0.020415 0.14803 232
-0.91398 -0.018842 0.15742 233
-0.94854 -0.041044 0.1431 234
-0.96205 -0.066634 0.14303 235
-0.95017 -0.060264 0.1491 236
-0.92269 -0.044612 0.16294 237
-0.90943 -0.039593 0.17044 238
-0.92535 -0.061504 0.16699 239
-0.91518 -0.057388 0.17541 240
-0.93101 -0.039448 0.15277 241
-0.91558 -0.031174 0.15925 242
-0.93529 -0.056417 0.15672 243
-0.76542 0.07961 0.22675 244
-0.75818 0.075365 0.22163 245
-0.7658 0.060662 0.23103 246
-0.75555 0.059043 0.22281 247
-0.8011 0.035503 0.22094 248
-0.79237 0.038108 0.22272 249
-0.80569 0.014161 0.22143 250
-0.79113 0.0192 0.22696 251
-0.77078 0.036069 0.24098 252
-0.7679 0.02813 0.24052 253
-0.76558 0.038304 0.23342 254
-0.75433 0.039431 0.22656 255
-0.76724 0.02303 0.23234 256
-0.75585 0.020266 0.23141 257
-0.82045 -0.022249 0.22059 258
-0.86456 -0.067296 0.22046 259
-0.82566 -0.048087 0.24253 260
-0.84165 -0.069481 0.24029 261
-0.8244 -0.060377 0.24307 262
-0.84283 -0.044772 0.2216 263
-0.8309 -0.044985 0.22964 264
-0.84595 -0.063977 0.22677 265
-0.83346 -0.05696 0.23299 266
-0.78562 -0.0071568 0.24098 267
-0.80469 -0.021887 0.24314 268
-0.79679 -0.017781 0.24538 269
-0.80754 -0.0019453 0.22606 270
-0.79229 0.0010492 0.23357 271
-0.81091 -0.02027 0.23006 272
-0.79833 -0.010586 0.23954 273
-0.77464 0.0037627 0.23521 274
-0.74852 0.0066546 0.23192 275
-0.80568 -0.041586 0.24441 276
-0.79663 -0.038284 0.24672 277
-0.81536 -0.060144 0.24984 278
-0.80972 -0.036231 0.23249 279
-0.82833 0.057712 0.18434 280
-0.8274 0.015239 0.20621 281
-0.84215 0.032228 0.18112 282
-0.82876 0.039193 0.18756 283
-0.84893 0.018499 0.18546 284
-0.83188 0.021382 0.19372 285
-0.86264 0.051326 0.1614 286
-0.8645 0.077557 0.14811 287
-0.88651 0.055315 0.14291 288
-0.86879 0.06022 0.15122 289
-0.8423 0.075798 0.16075 290
-0.82878 0.078252 0.16656 291
-0.84727 0.05562 0.1655 292
-0.83437 0.062454 0.17202 293
-0.85153 0.082639 0.1546 294
-0.83609 0.087519 0.15852 295
-0.85044 0.065825 0.15911 296
-0.86677 0.038365 0.16523 297
-0.88541 0.013662 0.16399 298
-0.87147 0.020324 0.17068 299
-0.88824 0.03863 0.14714 300
-0.8749 0.042248 0.15597 301
-0.89073 0.02128 0.15247 302
-0.87913 0.026417 0.15961 303
-0.84949 0.040727 0.1733 304
-0.83757 0.046261 0.17818 305
-0.85451 0.023794 0.17794 306
-0.78489 0.077899 0.20341 307
-0.80136 0.053323 0.20093 308
-0.78911 0.059211 0.20845 309
-0.80812 0.078177 0.18356 310
-0.79339 0.081066 0.19295 311
-0.80981 0.060071 0.19115 312
-0.79762 0.06392 0.19657 313
-0.77115 0.080659 0.20676 314
-0.75029 0.079218 0.21108 315
-0.77278 0.063217 0.21375 316
-0.74694 0.06105 0.21505 317
-0.80747 0.037641 0.20957 318
-0.79463 0.046412 0.21246 319
-0.81238 0.022218 0.21166 320
-0.79685 0.023493 0.21866 321
-0.81455 0.042199 0.19658 322
-0.81898 0.027731 0.19807 323
-0.76911 0.049492 0.21798 324
-0.74291 0.042585 0.21787 325
-0.81614 0.08222 0.17472 326
-0.81941 0.069763 0.17943 327
-0.87091 -0.0045891 0.18499 328
-0.88534 -0.027333 0.18195 329
-0.86986 -0.020174 0.18886 330
-0.84199 -0.0049868 0.20515 331
-0.8317 0.0022784 0.20767 332
-0.8459 -0.021048 0.20706 333
-0.82962 -0.021087 0.21564 334
-0.8488 0.00074561 0.1916 335
-0.83847 0.0067752 0.19848 336
-0.85275 -0.017783 0.19753 337
-0.86503 -0.043908 0.20328 338
-0.88218 -0.064176 0.20326 339
-0.87243 -0.060314 0.21054 340
-0.88697 -0.04123 0.18687 341
-0.87164 -0.037376 0.19519 342
-0.89393 -0.058842 0.19371 343
-0.87795 -0.052607 0.19935 344
-0.85063 -0.039385 0.2113 345
-0.83361 -0.032962 0.21868 346
-0.85112 -0.055379 0.21631 347
-0.85828 -0.031007 0.19925 348
-0.88816 -0.00073397 0.16801 349
-0.87446 0.0029096 0.17639 350
-0.89069 -0.018675 0.17273 351
-0.87638 -0.01931 0.17996 352
-0.8987 0.0061824 0.15876 353
-0.85941 0.0070654 0.17986 354
-0.89714 -0.037902 0.17837 355
-0.89977 -0.050587 0.17957 356
-0.81523 -0.00070112 0.21553 357
-0.81657 -0.016588 0.21707 358
-0.81291 -0.031617 0.21901 359
-0.90596 0.19623 0.061746 360
-0.92199 0.17672 0.062867 361
-0.90964 0.17941 0.067477 362
-0.90428 0.11766 0.10303 363
-0.9059 0.098651 0.10587 364
-0.9424 0.13601 0.061338 365
-0.90309 0.1541 0.082958 366
-0.9215 0.13332 0.083369 367
-0.90879 0.1398 0.087708 368
-0.92427 0.15892 0.06441 369
-0.90879 0.15927 0.073376 370
-0.92925 0.13914 0.069515 371
-0.91475 0.14506 0.076325 372
-0.94274 0.091499 0.081796 373
-0.94715 0.11812 0.06524 374
-0.966 0.096087 0.064114 375
-0.94978 0.099893 0.070484 376
-0.92352 0.11954 0.085125 377
-0.91294 0.12052 0.094613 378
-0.92705 0.099253 0.088689 379
-0.91418 0.10101 0.097954 380
-0.93251 0.12159 0.073982 381
-0.93445 0.10318 0.076959 382
-1.0015 0.23168 -0.019421 383
-0.98855 0.23287 -0.015467 384
-1.0038 0.22137 -0.018746 385
-0.9905 0.21891 -0.010685 386
-1.025 0.17814 -0.014894 387
-0.98108 0.1923 0.0013685 388
-1.0015 0.172 0.0013969 389
-0.98912 0.17885 0.0072863 390
-1.0054 0.19642 -0.018421 391
-0.99019 0.19981 -0.0088034 392
-1.0113 0.18079 -0.0077757 393
-0.9938 0.1859 -0.0033951 394
-0.94247 0.23149 0.021429 395
-0.94552 0.21855 0.024068 396
-0.90513 0.23767 0.043532 397
-0.92076 0.21435 0.042054 398
-0.90983 0.22014 0.04823 399
-0.92651 0.23873 0.026326 400
-0.91329 0.24164 0.035354 401
-0.9281 0.22044 0.03282 402
-0.91702 0.22735 0.038524 403
-0.942 0.19176 0.041665 404
-0.94401 0.17762 0.043064 405
-0.94598 0.19777 0.027478 406
-0.96795 0.17739 0.025118 407
-0.95085 0.18179 0.033197 408
-0.92881 0.19737 0.047702 409
-0.91298 0.20295 0.053886 410
-0.93264 0.18049 0.052496 411
-0.91622 0.18974 0.059687 412
-0.93295 0.20297 0.035386 413
-0.96139 0.23241 0.0013411 414
-0.9491 0.23853 0.0081839 415
-0.96679 0.21819 0.0041684 416
-0.95179 0.2208 0.013357 417
-0.96878 0.23985 -0.0091514 418
-0.9585 0.24451 -0.00037122 419
-0.97487 0.22236 -0.0026389 420
-0.93528 0.24222 0.015902 421
-0.96928 0.19855 0.008959 422
-0.9555 0.20336 0.016988 423
-0.9746 0.18302 0.014547 424
-0.97911 0.20096 8.8411e-06 425
-0.98602 0.15587 0.022802 426
-1.0033 0.13227 0.021699 427
-0.98991 0.13907 0.026685 428
-1.0227 0.095471 0.022928 429
-0.98302 0.11555 0.042083 430
-1.0007 0.090741 0.040226 431
-0.9868 0.097995 0.044537 432
-1.0077 0.11758 0.024834 433
-0.99056 0.12094 0.033567 434
-1.0105 0.09983 0.029754 435
-0.99454 0.10298 0.037504 436
-1.0234 0.16184 -0.017042 437
-1.0434 0.13272 -0.016931 438
-1.0293 0.13862 -0.013149 439
-1.0027 0.15887 0.0029608 440
-0.9915 0.16014 0.01246 441
-1.0081 0.13854 0.0089131 442
-0.99608 0.14494 0.015868 443
-1.0129 0.15893 -0.0071944 444
-1.0134 0.1417 -0.0051719 445
-1.0256 0.11631 0.007498 446
-1.0426 0.095768 0.0022491 447
-1.0318 0.10036 0.011414 448
-1.0464 0.11845 -0.014197 449
-1.0328 0.12147 -0.0048763 450
-1.0482 0.1006 -0.0084409 451
-1.0373 0.10988 -0.0014282 452
-1.0157 0.12326 0.013437 453
-1.0192 0.10654 0.019783 454
-1.0195 0.12848 9.2054e-06 455
-0.94865 0.15895 0.047012 456
-0.9656 0.13416 0.04276 457
-0.94948 0.14046 0.05114 458
-0.97028 0.16067 0.030573 459
-0.95624 0.16278 0.038771 460
-0.97051 0.14157 0.035563 461
-0.95869 0.14739 0.039867 462
-0.9332 0.16137 0.055967 463
-0.93921 0.14843 0.058841 464
-0.96966 0.11924 0.048728 465
-0.95255 0.1228 0.055958 466
-0.97363 0.10092 0.053356 467
-0.9594 0.1096 0.059841 468
-0.97837 0.12849 0.038425 469
-0.9796 0.16848 0.018563 470
-0.82488 0.23561 0.10505 471
-0.84318 0.21355 0.10186 472
-0.82649 0.22026 0.10545 473
-0.86184 0.1733 0.10113 474
-0.8219 0.19677 0.12166 475
-0.82468 0.17875 0.12402 476
-0.84479 0.19828 0.10421 477
-0.82934 0.19972 0.11221 478
-0.84741 0.1802 0.10664 479
-0.83496 0.17948 0.11653 480
-0.8646 0.2181 0.082092 481
-0.88092 0.23187 0.06105 482
-0.86845 0.23952 0.068091 483
-0.88413 0.21641 0.065321 484
-0.87203 0.22189 0.07264 485
-0.84491 0.23595 0.084567 486
-0.83156 0.24096 0.092186 487
-0.84767 0.21932 0.090089 488
-0.83469 0.22439 0.097273 489
-0.85217 0.2423 0.076861 490
-0.88178 0.19361 0.081069 491
-0.86765 0.19825 0.087495 492
-0.88547 0.17765 0.083988 493
-0.87076 0.1804 0.092885 494
-0.88927 0.20023 0.0703 495
-0.87579 0.20601 0.07829 496
-0.89216 0.18189 0.074537 497
-0.85355 0.20273 0.094868 498
-0.85775 0.18588 0.099466 499
-0.78821 0.23877 0.1266 500
-0.80875 0.21597 0.12371 501
-0.79108 0.22031 0.13153 502
-0.81082 0.24097 0.10891 503
-0.79666 0.24145 0.11613 504
-0.81316 0.22003 0.11499 505
-0.79916 0.22548 0.11894 506
-0.77316 0.24037 0.13583 507
-0.77513 0.2263 0.13865 508
-0.80925 0.19983 0.12805 509
-0.79352 0.201 0.13649 510
-0.80982 0.18067 0.13283 511
-0.79906 0.18873 0.13926 512
-0.81749 0.20695 0.11607 513
-0.77737 0.20947 0.13952 514
-0.8177 0.24804 0.099102 515
-0.86221 0.13109 0.12449 516
-0.88661 0.15511 0.10396 517
-0.86672 0.16127 0.10576 518
-0.88618 0.13941 0.10493 519
-0.86856 0.13839 0.1128 520
-0.84691 0.15372 0.12263 521
-0.83177 0.1601 0.12996 522
-0.85041 0.13896 0.12794 523
-0.83456 0.1425 0.13565 524
-0.85169 0.15989 0.11338 525
-0.83711 0.16552 0.11666 526
-0.8558 0.14437 0.11643 527
-0.86491 0.1203 0.12488 528
-0.88226 0.096532 0.12191 529
-0.86925 0.099775 0.13064 530
-0.89003 0.11988 0.10963 531
-0.87258 0.12227 0.11682 532
-0.88988 0.10118 0.11499 533
-0.85463 0.11999 0.13461 534
-0.83948 0.12964 0.13962 535
-0.85856 0.10713 0.13595 536
-0.89059 0.15983 0.090541 537
-0.87415 0.16618 0.097285 538
-0.89407 0.14109 0.09628 539
-0.8974 0.16574 0.077216 540
-0.89977 0.12815 0.09935 541
-0.8168 0.16665 0.13599 542
-0.88888 0.24074 0.051923 543
-0.87628 0.24679 0.058248 544
-0.89316 0.22121 0.056841 545
-0.89607 0.20854 0.059616 546
-0.98404 0.07092 0.061961 547
-0.98872 0.058774 0.064941 548
-1.0221 0.012297 0.063572 549
-0.98312 0.032776 0.080905 550
-1.0024 0.011868 0.08166 551
-0.9896 0.017346 0.085203 552
-1.0026 0.03394 0.061835 553
-0.99177 0.039939 0.070312 554
-1.0098 0.019113 0.069229 555
-0.99565 0.026108 0.075217 556
-0.94211 0.057665 0.1008 557
-0.90384 0.074198 0.12276 558
-0.90609 0.058552 0.12758 559
-0.92579 0.07556 0.10387 560
-0.9098 0.080725 0.11117 561
-0.92995 0.058966 0.10677 562
-0.9126 0.061244 0.11547 563
-0.94599 0.015028 0.12259 564
-0.94771 0.037987 0.10599 565
-0.96409 0.015939 0.10521 566
-0.95195 0.022092 0.11261 567
-0.92288 0.034715 0.12403 568
-0.90938 0.041183 0.13174 569
-0.92793 0.019358 0.12903 570
-0.9131 0.024237 0.13654 571
-0.9308 0.041737 0.11449 572
-0.91881 0.047665 0.1197 573
-0.93599 0.028448 0.11891 574
-0.94665 0.078761 0.086433 575
-0.96508 0.057035 0.083195 576
-0.94951 0.060916 0.092109 577
-0.96879 0.079054 0.06868 578
-0.95571 0.083322 0.077022 579
-0.97202 0.060987 0.074332 580
-0.93319 0.081907 0.095448 581
-0.91881 0.087138 0.09933 582
-0.93867 0.069509 0.099524 583
-0.96657 0.038491 0.087127 584
-0.95366 0.042525 0.095472 585
-0.97154 0.021181 0.093138 586
-0.9594 0.029826 0.099065 587
-0.97724 0.045865 0.07797 588
-0.98108 -0.00893 0.10334 589
-1.0022 -0.029957 0.10071 590
-0.98824 -0.022419 0.10605 591
-1.0211 -0.068726 0.10048 592
-0.98364 -0.044586 0.12158 593
-0.98967 -0.061692 0.1249 594
-1.0069 -0.042234 0.10416 595
-0.99144 -0.039435 0.11302 596
-1.0116 -0.060662 0.1073 597
-0.99563 -0.058002 0.11682 598
-1.0224 -0.024538 0.081478 599
-1.0406 -0.0065877 0.060581 600
-1.0277 -0.001304 0.065201 601
-1.0461 -0.023021 0.06549 602
-1.0301 -0.018868 0.073134 603
-1.0077 -0.0015816 0.083794 604
-0.99025 -0.00032516 0.091713 605
-1.0111 -0.020669 0.088616 606
-0.99338 -0.015684 0.096057 607
-1.0165 0.0012797 0.074822 608
-1.0195 -0.011964 0.077433 609
-1.0406 -0.048123 0.08106 610
-1.028 -0.041201 0.085252 611
-1.0474 -0.062414 0.084307 612
-1.0292 -0.059266 0.092665 613
-1.0474 -0.040369 0.070379 614
-1.0377 -0.034672 0.07822 615
-1.053 -0.05506 0.073792 616
-1.0152 -0.03818 0.094486 617
-1.0188 -0.055787 0.098595 618
-0.94849 -0.0013953 0.12401 619
-0.96328 -0.023692 0.12596 620
-0.95287 -0.019067 0.13272 621
-0.96841 -0.00058786 0.10837 622
-0.95557 0.0025258 0.11761 623
-0.97254 -0.017729 0.11408 624
-0.9594 -0.012057 0.11967 625
-0.92948 0.00053809 0.13329 626
-0.91881 0.0094638 0.14008 627
-0.93253 -0.013037 0.13672 628
-0.96696 -0.039751 0.12974 629
-0.95793 -0.038452 0.13877 630
-0.9682 -0.059061 0.13379 631
-0.9594 -0.055048 0.1394 632
-0.97581 -0.031422 0.11766 633
-0.97538 0.0031542 0.097521 634
-1.023 0.0508 0.042257 635
-1.0415 0.070625 0.020216 636
-1.0264 0.07812 0.025139 637
-1.0434 0.057324 0.023754 638
-1.0315 0.060368 0.030787 639
-1.0038 0.078815 0.042082 640
-0.99154 0.079073 0.050674 641
-1.007 0.05885 0.046242 642
-0.99634 0.061547 0.055251 643
-1.0127 0.081329 0.034205 644
-1.0146 0.062941 0.03695 645
-1.0406 0.032832 0.040872 646
-1.0298 0.038876 0.045717 647
-1.0462 0.01802 0.043733 648
-1.0292 0.01935 0.051322 649
-1.0469 0.040526 0.029485 650
-1.0358 0.044608 0.037839 651
-1.0538 0.024872 0.037273 652
-1.0118 0.040755 0.054963 653
-0.99913 0.046293 0.05955 654
-1.0171 0.024266 0.056153 655
-1.0465 0.077324 0.0073995 656
-1.0351 0.082661 0.013752 657
-1.0512 0.060523 0.014919 658
-1.0542 0.085269 -0.0023396 659
-1.0554 0.045972 0.018011 660
-0.97663 0.083839 0.057033 661
-1.0497 8.7388e-05 0.049801 662
-1.035 0.0032209 0.057554 663
-1.0524 -0.016458 0.056798 664
-0.88827 0.07916 0.12801 665
-0.8699 0.081927 0.13535 666
-0.89113 0.062867 0.13569 667
-0.87706 0.067984 0.13979 668
-0.89429 0.086776 0.11783 669
-0.89977 0.043684 0.13967 670
-0.73349 0.21273 0.22294 671
-0.72892 0.19815 0.22416 672
-0.72681 0.18082 0.22509 673
-0.71934 0.1725 0.22112 674
-0.72487 0.16394 0.22556 675
-0.71798 0.15512 0.22229 676
-0.72314 0.13757 0.22309 677
-0.71877 0.14496 0.22302 678
-0.72796 0.12738 0.22257 679
-0.72564 0.23995 0.21193 680
-0.71429 0.23848 0.20415 681
-0.72359 0.21991 0.21645 682
-0.71409 0.21889 0.20713 683
-0.70748 0.24041 0.18976 684
-0.71043 0.22109 0.19214 685
-0.72305 0.20258 0.21809 686
-0.71362 0.19948 0.20853 687
-0.7221 0.18055 0.21347 688
-0.71625 0.18276 0.20876 689
-0.7106 0.20256 0.19474 690
-0.73943 0.17107 0.18036 691
-0.71354 0.18236 0.19866 692
-0.69972 0.20341 0.1836 693
-0.68124 0.17247 0.18316 694
-0.67965 0.17284 0.18173 695
-0.73817 0.23216 0.16113 696
-0.7038 0.24073 0.17651 697
-0.73382 0.21634 0.16422 698
-0.70236 0.22722 0.17833 699
-0.73331 0.24156 0.15145 700
-0.71633 0.23399 0.1485 701
-0.72698 0.22276 0.15485 702
-0.7174 0.21658 0.15407 703
-0.69361 0.24373 0.16798 704
-0.67524 0.23603 0.162 705
-0.6897 0.22001 0.17269 706
-0.672 0.21976 0.16362 707
-0.68213 0.24336 0.15835 708
-0.66815 0.23465 0.15658 709
-0.66655 0.22598 0.15811 710
-0.73182 0.19976 0.16706 711
-0.71666 0.19559 0.16091 712
-0.73294 0.17872 0.17286 713
-0.71982 0.17401 0.1676 714
-0.72785 0.20442 0.15859 715
-0.71717 0.20604 0.15739 716
-0.68142 0.20722 0.17377 717
-0.67517 0.20498 0.16932 718
-0.6766 0.17234 0.17859 719
-0.71409 0.15925 0.21508 720
-0.7218 0.14042 0.21795 721
-0.71837 0.14407 0.21466 722
-0.7356 0.15754 0.18261 723
-0.73661 0.14 0.18573 724
-0.69822 0.1625 0.20079 725
-0.68556 0.15977 0.18949 726
-0.67931 0.1599 0.18264 727
-0.6829 0.14358 0.19144 728
-0.67856 0.13713 0.19062 729
-0.7237 0.12753 0.21837 730
-0.71902 0.12499 0.21624 731
-0.73534 0.12047 0.19109 732
-0.73749 0.10738 0.19506 733
-0.68776 0.11253 0.20636 734
-0.68 0.11538 0.20074 735
-0.6838 0.1043 0.2059 736
-0.67852 0.094688 0.20595 737
-0.68085 0.12013 0.1977 738
-0.67893 0.12069 0.19535 739
-0.68095 0.10893 0.19944 740
-0.67911 0.10731 0.19828 741
-0.73037 0.16095 0.17653 742
-0.72638 0.14824 0.17802 743
-0.67752 0.16872 0.17911 744
-0.73692 0.00078294 0.23048 745
-0.73859 0.087219 0.20382 746
-0.73943 0.068077 0.20803 747
-0.68333 0.080197 0.21062 748
-0.67835 0.088147 0.20609 749
-0.68283 0.06632 0.21238 750
-0.67929 0.061772 0.21191 751
-0.73687 0.041832 0.21494 752
-1.3814 -0.36243 -0.018653 753
-1.3862 -0.38196 -0.0121 754
-1.061 -0.20963 0.14117 755
-1.0644 -0.22401 0.14468 756
-1.0649 -0.36531 0.22195 757
-1.0812 -0.38558 0.22028 758
-1.0681 -0.38143 0.22368 759
-1.1436 -0.30703 0.14106 760
-1.0659 -0.28524 0.18406 761
-1.0672 -0.30168 0.18695 762
-1.1004 -0.24944 0.14108 763
-1.1026 -0.26202 0.14446 764
-1.061 -0.2383 0.16028 765
-1.0674 -0.26351 0.16467 766
-1.0868 -0.24448 0.14594 767
-1.0686 -0.23742 0.15058 768
-1.092 -0.2597 0.152 769
-1.0723 -0.25756 0.15752 770
-1.1026 -0.30775 0.16287 771
-1.1237 -0.28651 0.14185 772
-1.1076 -0.28004 0.14768 773
-1.129 -0.30077 0.14487 774
-1.1081 -0.2995 0.15311 775
-1.0851 -0.28213 0.16433 776
-1.0719 -0.27953 0.17269 777
-1.0885 -0.29967 0.16933 778
-1.076 -0.29628 0.17742 779
-1.094 -0.27905 0.15683 780
-1.0973 -0.29609 0.15797 781
-1.1449 -0.32311 0.14207 782
-1.1619 -0.34765 0.14118 783
-1.149 -0.34156 0.14674 784
-1.1832 -0.38722 0.14244 785
-1.1429 -0.36796 0.16156 786
-1.1612 -0.38794 0.16174 787
-1.1498 -0.38169 0.16536 788
-1.1649 -0.36203 0.14515 789
-1.1517 -0.35847 0.15363 790
-1.169 -0.37983 0.15002 791
-1.1568 -0.37456 0.15822 792
-1.102 -0.34794 0.18176 793
-1.0652 -0.32333 0.20527 794
-1.0681 -0.3398 0.20737 795
-1.0852 -0.32338 0.18234 796
-1.0725 -0.31973 0.1916 797
-1.0887 -0.34052 0.18724 798
-1.0758 -0.33799 0.19574 799
-1.1015 -0.3858 0.20189 800
-1.1212 -0.36708 0.18026 801
-1.1077 -0.36188 0.18563 802
-1.1251 -0.3847 0.18357 803
-1.1087 -0.37941 0.19091 804
-1.0869 -0.36438 0.20577 805
-1.0721 -0.35922 0.21223 806
-1.0896 -0.38041 0.20957 807
-1.0754 -0.37432 0.21754 808
-1.0932 -0.35885 0.19408 809
-1.0785 -0.35111 0.19831 810
-1.0973 -0.37243 0.19652 811
-1.1072 -0.32135 0.16813 812
-1.1267 -0.34199 0.16424 813
-1.1097 -0.33982 0.17302 814
-1.1297 -0.32015 0.14928 815
-1.1136 -0.31607 0.15647 816
-1.1346 -0.33772 0.15476 817
-1.0945 -0.31884 0.17683 818
-1.0975 -0.33503 0.1788 819
-1.1289 -0.36072 0.16796 820
-1.1144 -0.3553 0.17512 821
-1.1332 -0.37848 0.17438 822
-1.1193 -0.37162 0.17995 823
-1.1386 -0.35593 0.15915 824
-1.2222 -0.14917 0.0017049 825
-1.2269 -0.122 -0.01619 826
-1.2289 -0.14123 -0.011516 827
-1.2244 -0.20251 0.02176 828
-1.2408 -0.22883 0.020647 829
-1.2281 -0.22091 0.025535 830
-1.2625 -0.16896 -0.019235 831
-1.2649 -0.18156 -0.017202 832
-1.2258 -0.16309 0.0029222 833
-1.2299 -0.18178 0.0078405 834
-1.246 -0.16285 -0.014092 835
-1.2331 -0.15787 -0.0057492 836
-1.2494 -0.17983 -0.0075782 837
-1.2374 -0.17494 -0.00037024 838
-1.2654 -0.22322 0.0038519 839
-1.2693 -0.20148 -0.012895 840
-1.2838 -0.22526 -0.016157 841
-1.2748 -0.21877 -0.008102 842
-1.245 -0.20189 0.0051016 843
-1.2331 -0.19907 0.013578 844
-1.249 -0.2193 0.010276 845
-1.2352 -0.21594 0.017128 846
-1.2556 -0.19737 -0.0033854 847
-1.064 -0.12544 0.10249 848
-1.0658 -0.14135 0.10532 849
-1.1017 -0.10536 0.06213 850
-1.062 -0.086202 0.081695 851
-1.0672 -0.10169 0.086568 852
-1.0853 -0.087114 0.063099 853
-1.0699 -0.079327 0.07123 854
-1.0894 -0.101 0.069198 855
-1.0747 -0.095781 0.076674 856
-1.1022 -0.1456 0.082874 857
-1.122 -0.12808 0.060964 858
-1.1083 -0.1222 0.065122 859
-1.1254 -0.14147 0.065301 860
-1.111 -0.13987 0.074429 861
-1.0833 -0.12294 0.083291 862
-1.0711 -0.11919 0.091947 863
-1.0898 -0.14013 0.088527 864
-1.0754 -0.13819 0.096903 865
-1.0917 -0.11862 0.073968 866
-1.0967 -0.13208 0.078537 867
-1.1437 -0.16411 0.062781 868
-1.1619 -0.1877 0.061199 869
-1.1495 -0.18084 0.067789 870
-1.1826 -0.22734 0.061586 871
-1.1429 -0.22819 0.082372 872
-1.163 -0.20183 0.062701 873
-1.1514 -0.19968 0.071091 874
-1.1683 -0.22051 0.064819 875
-1.1491 -0.21901 0.072803 876
-1.1042 -0.18572 0.10192 877
-1.063 -0.16473 0.1222 878
-1.0803 -0.18875 0.12128 879
-1.0696 -0.18135 0.12664 880
-1.084 -0.16479 0.10488 881
-1.0713 -0.15884 0.11229 882
-1.0888 -0.18047 0.10924 883
-1.0757 -0.17597 0.1174 884
-1.1004 -0.22962 0.12049 885
-1.1073 -0.20122 0.10546 886
-1.1222 -0.22873 0.1011 887
-1.1077 -0.22051 0.10793 888
-1.0842 -0.201 0.12314 889
-1.0696 -0.20019 0.13222 890
-1.0895 -0.22154 0.1259 891
-1.0721 -0.21842 0.13494 892
-1.0952 -0.19957 0.11528 893
-1.097 -0.21721 0.11667 894
-1.1063 -0.15984 0.08468 895
-1.1262 -0.1828 0.083581 896
-1.109 -0.17977 0.091338 897
-1.1299 -0.15958 0.071078 898
-1.1162 -0.15723 0.078788 899
-1.1332 -0.17805 0.076959 900
-1.0907 -0.16001 0.094382 901
-1.0762 -0.15198 0.099438 902
-1.0967 -0.17305 0.095905 903
-1.1291 -0.20034 0.086632 904
-1.1175 -0.20009 0.096535 905
-1.1298 -0.22001 0.088157 906
-1.1162 -0.21603 0.096549 907
-1.1383 -0.20054 0.078489 908
-1.1384 -0.2162 0.077966 909
-1.1437 -0.083326 0.021319 910
-1.1628 -0.10674 0.022034 911
-1.1489 -0.10189 0.027198 912
-1.1826 -0.14721 0.023774 913
-1.1448 -0.12529 0.042527 914
-1.1623 -0.14649 0.040882 915
-1.1496 -0.14084 0.046179 916
-1.1652 -0.12158 0.024616 917
-1.1523 -0.11929 0.033842 918
-1.1674 -0.13984 0.029782 919
-1.1574 -0.1342 0.037703 920
-1.1833 -0.10689 0.0053542 921
-1.1887 -0.081772 -0.014337 922
-1.2069 -0.10526 -0.01573 923
-1.1916 -0.099641 -0.0081817 924
-1.1636 -0.083228 0.00491 925
-1.1529 -0.078696 0.013322 926
-1.1686 -0.099692 0.010481 927
-1.1552 -0.094352 0.017182 928
-1.1697 -0.077795 -0.0049254 929
-1.1759 -0.092675 -0.0012943 930
-1.1887 -0.12048 0.0077329 931
-1.2091 -0.14334 0.005159 932
-1.1911 -0.13947 0.012409 933
-1.2093 -0.12062 -0.0089085 934
-1.1963 -0.11721 -0.0029253 935
-1.2149 -0.1361 -0.0029223 936
-1.1997 -0.13063 1.0833e-05 937
-1.174 -0.11981 0.017127 938
-1.1747 -0.13442 0.018265 939
-1.1036 -0.081931 0.045658 940
-1.1262 -0.10443 0.044558 941
-1.1089 -0.09922 0.052162 942
-1.129 -0.080043 0.027815 943
-1.1118 -0.078891 0.036808 944
-1.134 -0.097649 0.034152 945
-1.1155 -0.091314 0.038658 946
-1.092 -0.078628 0.054343 947
-1.0782 -0.072871 0.05948 948
-1.0983 -0.092701 0.058359 949
-1.1291 -0.12002 0.049667 950
-1.1141 -0.11484 0.057133 951
-1.1325 -0.13822 0.055252 952
-1.1389 -0.11375 0.039469 953
-1.1801 -0.16285 0.040899 954
-1.1843 -0.18503 0.043116 955
-1.1889 -0.16116 0.02986 956
-1.207 -0.18367 0.024221 957
-1.1932 -0.17833 0.03289 958
-1.1675 -0.16178 0.046379 959
-1.1538 -0.15879 0.055169 960
-1.168 -0.17955 0.05026 961
-1.1576 -0.1757 0.058103 962
-1.174 -0.1525 0.035664 963
-1.1899 -0.20157 0.046561 964
-1.2043 -0.22438 0.042645 965
-1.1913 -0.22021 0.051106 966
-1.21 -0.2005 0.029743 967
-1.1982 -0.19759 0.037649 968
-1.2116 -0.21828 0.034769 969
-1.1997 -0.21127 0.039083 970
-1.1708 -0.19871 0.056045 971
-1.1746 -0.21254 0.057998 972
-1.2102 -0.16113 0.0094986 973
-1.1964 -0.15698 0.016298 974
-1.2124 -0.17626 0.01577 975
-1.1997 -0.17053 0.019962 976
-1.2199 -0.19031 0.018608 977
-1.1382 -0.15128 0.059426 978
-1.2264 -0.28304 0.063209 979
-1.2274 -0.30114 0.067896 980
-1.2237 -0.34807 0.10063 981
-1.2259 -0.36238 0.10322 982
-1.2421 -0.38639 0.10272 983
-1.2297 -0.38065 0.10814 984
-1.264 -0.34653 0.064167 985
-1.226 -0.32532 0.082323 986
-1.2451 -0.34572 0.083285 987
-1.2297 -0.3406 0.089272 988
-1.2437 -0.32553 0.065042 989
-1.2325 -0.31823 0.072121 990
-1.2522 -0.33924 0.070731 991
-1.2375 -0.33164 0.077531 992
-1.2632 -0.36162 0.080539 993
-1.2654 -0.38466 0.083497 994
-1.2678 -0.36039 0.070301 995
-1.2835 -0.38482 0.062269 996
-1.2732 -0.37885 0.070945 997
-1.2489 -0.36083 0.085357 998
-1.2333 -0.35893 0.09495 999
-1.2502 -0.37888 0.091697 1000
-1.2385 -0.37228 0.098988 1001
-1.26 -0.35082 0.07801 1002
-1.3016 -0.30695 0.02292 1003
-1.3031 -0.24434 -0.018048 1004
-1.3039 -0.26228 -0.01306 1005
-1.3404 -0.28899 -0.018564 1006
-1.3467 -0.30215 -0.015526 1007
-1.3024 -0.28321 0.0056307 1008
-1.307 -0.30048 0.010077 1009
-1.3262 -0.28409 -0.014985 1010
-1.3102 -0.27909 -0.0069622 1011
-1.3291 -0.30026 -0.0085432 1012
-1.3152 -0.29814 -0.0023161 1013
-1.2633 -0.24785 0.021021 1014
-1.2653 -0.26143 0.022273 1015
-1.2253 -0.24549 0.041708 1016
-1.2292 -0.26174 0.046936 1017
-1.2471 -0.24291 0.025674 1018
-1.2323 -0.23841 0.032787 1019
-1.2496 -0.26004 0.030818 1020
-1.2364 -0.25666 0.038373 1021
-1.2649 -0.30296 0.042741 1022
-1.2851 -0.28619 0.022768 1023
-1.2693 -0.28118 0.028661 1024
-1.2904 -0.29995 0.026275 1025
-1.2736 -0.29864 0.034619 1026
-1.2442 -0.28253 0.045903 1027
-1.2338 -0.27851 0.054021 1028
-1.2499 -0.29935 0.050156 1029
-1.2367 -0.29896 0.058396 1030
-1.2542 -0.27648 0.035504 1031
-1.2823 -0.24626 0.0031216 1032
-1.2726 -0.24081 0.0090488 1033
-1.2864 -0.26113 0.0063576 1034
-1.2735 -0.25834 0.015478 1035
-1.2884 -0.24026 -0.0092281 1036
-1.2782 -0.23259 -0.0027277 1037
-1.2936 -0.25775 -0.0052116 1038
-1.255 -0.23509 0.016791 1039
-1.2925 -0.27905 0.012083 1040
-1.2766 -0.27412 0.018185 1041
-1.2967 -0.29439 0.019105 1042
-1.3003 -0.34791 0.041458 1043
-1.3044 -0.32201 0.02519 1044
-1.3214 -0.34715 0.020156 1045
-1.3095 -0.34055 0.029056 1046
-1.3457 -0.38189 0.022891 1047
-1.3067 -0.363 0.0455 1048
-1.3241 -0.38657 0.042214 1049
-1.3094 -0.37938 0.047687 1050
-1.3257 -0.36238 0.02699 1051
-1.3147 -0.35677 0.034504 1052
-1.3281 -0.37922 0.032225 1053
-1.3178 -0.37117 0.037146 1054
-1.3418 -0.34693 0.0023361 1055
-1.3493 -0.32009 -0.014222 1056
-1.3667 -0.34418 -0.017172 1057
-1.3506 -0.33991 -0.0091858 1058
-1.3219 -0.32604 0.0031258 1059
-1.3131 -0.31923 0.01178 1060
-1.3268 -0.34018 0.0088193 1061
-1.316 -0.33624 0.017271 1062
-1.3293 -0.31995 -0.0040507 1063
-1.3187 -0.31172 1.1907e-05 1064
-1.334 -0.33429 -0.0018386 1065
-1.349 -0.36167 0.0085621 1066
-1.368 -0.38174 0.0059142 1067
-1.3548 -0.38005 0.01436 1068
-1.3688 -0.36141 -0.010308 1069
-1.3562 -0.35482 -0.003986 1070
-1.3738 -0.37604 -0.0042586 1071
-1.3328 -0.35646 0.016439 1072
-1.2833 -0.32614 0.040919 1073
-1.2715 -0.32057 0.047004 1074
-1.2875 -0.34177 0.044615 1075
-1.2722 -0.33897 0.053097 1076
-1.2904 -0.31943 0.033628 1077
-1.2786 -0.31228 0.037812 1078
-1.2934 -0.33612 0.037651 1079
-1.2513 -0.31863 0.056042 1080
-1.2385 -0.31249 0.060084 1081
-1.2586 -0.33274 0.058966 1082
-1.2902 -0.35961 0.052562 1083
-1.2769 -0.35979 0.058293 1084
-1.2912 -0.37924 0.056492 1085
-1.2773 -0.37098 0.059312 1086
-1.1612 -0.26966 0.1014 1087
-1.1459 -0.26402 0.10669 1088
-1.1834 -0.30743 0.10469 1089
-1.1477 -0.28566 0.12486 1090
-1.1625 -0.30726 0.1227 1091
-1.151 -0.29978 0.12961 1092
-1.1663 -0.2828 0.10643 1093
-1.1529 -0.27755 0.11364 1094
-1.1694 -0.2989 0.11065 1095
-1.1583 -0.29389 0.118 1096
-1.1831 -0.2652 0.081094 1097
-1.1874 -0.24155 0.064512 1098
-1.2073 -0.26212 0.063206 1099
-1.191 -0.26042 0.071753 1100
-1.1626 -0.24591 0.082691 1101
-1.1491 -0.24084 0.088011 1102
-1.1688 -0.26105 0.087365 1103
-1.1507 -0.25721 0.095522 1104
-1.1701 -0.23982 0.072505 1105
-1.1551 -0.23344 0.077551 1106
-1.1755 -0.25343 0.07755 1107
-1.1889 -0.28184 0.088583 1108
-1.2068 -0.30147 0.083322 1109
-1.1919 -0.29946 0.093063 1110
-1.2109 -0.28083 0.070278 1111
-1.1966 -0.27633 0.076397 1112
-1.2149 -0.29666 0.07635 1113
-1.1736 -0.27695 0.096648 1114
-1.178 -0.29588 0.099597 1115
-1.1232 -0.24993 0.12142 1116
-1.1065 -0.24247 0.12717 1117
-1.1263 -0.26207 0.12461 1118
-1.112 -0.25937 0.13395 1119
-1.1278 -0.24275 0.10709 1120
-1.1121 -0.23608 0.11397 1121
-1.1343 -0.25746 0.11303 1122
-1.0927 -0.23751 0.1338 1123
-1.0768 -0.23214 0.13767 1124
-1.1301 -0.27875 0.13107 1125
-1.116 -0.27308 0.13707 1126
-1.1367 -0.29407 0.13802 1127
-1.1384 -0.27304 0.11873 1128
-1.1346 -0.23765 0.095457 1129
-1.1389 -0.25027 0.099445 1130
-1.1839 -0.34413 0.12279 1131
-1.2026 -0.32874 0.10362 1132
-1.1896 -0.32105 0.10944 1133
-1.2079 -0.34088 0.10474 1134
-1.194 -0.33862 0.11422 1135
-1.1672 -0.32189 0.12495 1136
-1.1526 -0.31839 0.13412 1137
-1.1694 -0.33986 0.13022 1138
-1.1575 -0.33658 0.1375 1139
-1.1742 -0.31386 0.11604 1140
-1.2043 -0.36662 0.12155 1141
-1.19 -0.36131 0.12762 1142
-1.2074 -0.38081 0.1249 1143
-1.1913 -0.37948 0.13428 1144
-1.2097 -0.35922 0.11162 1145
-1.1982 -0.35313 0.11823 1146
-1.2153 -0.37684 0.11582 1147
-1.1731 -0.35812 0.13614 1148
-1.1766 -0.37461 0.13916 1149
-1.2096 -0.32082 0.088735 1150
-1.1966 -0.31529 0.095175 1151
-1.2155 -0.33539 0.095419 1152
-1.2091 -0.24115 0.047358 1153
-1.1964 -0.23784 0.055462 1154
-1.2129 -0.25705 0.055318 1155
-1.2176 -0.23214 0.037979 1156
-1.3853 -0.545 0.067502 1157
-1.3802 -0.46397 0.04018 1158
-1.3857 -0.44317 0.023974 1159
-1.4014 -0.46724 0.022348 1160
-1.3901 -0.46108 0.028677 1161
-1.3831 -0.40936 0.0019293 1162
-1.4019 -0.4279 0.0026028 1163
-1.3885 -0.42222 0.0087494 1164
-1.4055 -0.403 -0.014305 1165
-1.3905 -0.39825 -0.0051158 1166
-1.4105 -0.42106 -0.010955 1167
-1.3954 -0.41466 -0.0010939 1168
-1.4226 -0.46062 -0.010056 1169
-1.4058 -0.44199 0.0068047 1170
-1.3937 -0.43784 0.015246 1171
-1.4099 -0.46024 0.010261 1172
-1.3979 -0.45347 0.01874 1173
-1.4164 -0.44052 -0.0099783 1174
-1.4179 -0.45955 -0.01005 1175
-1.3833 -0.48169 0.04294 1176
-1.3879 -0.50083 0.045794 1177
-1.404 -0.48199 0.024883 1178
-1.393 -0.47891 0.03375 1179
-1.4071 -0.50058 0.028275 1180
-1.3959 -0.49783 0.037229 1181
-1.4245 -0.54597 0.041469 1182
-1.4253 -0.5244 0.024928 1183
-1.4421 -0.54354 0.023462 1184
-1.4325 -0.53987 0.031185 1185
-1.4017 -0.52414 0.040807 1186
-1.3892 -0.51922 0.046964 1187
-1.4069 -0.54174 0.046722 1188
-1.3918 -0.53695 0.053349 1189
-1.4111 -0.51796 0.031664 1190
-1.3979 -0.51063 0.03876 1191
-1.4162 -0.53397 0.038283 1192
-1.4241 -0.48454 0.0045756 1193
-1.4295 -0.50107 0.0070188 1194
-1.4243 -0.47973 -0.0082451 1195
-1.4268 -0.49997 -0.007939 1196
-1.4143 -0.47869 0.012362 1197
-1.4163 -0.49775 0.015712 1198
-1.4182 -0.4817 -0.018017 1199
-1.4182 -0.49586 -0.017364 1200
-1.4433 -0.52178 0.005012 1201
-1.4328 -0.51942 0.01431 1202
-1.4433 -0.54021 0.011016 1203
-1.4381 -0.5482 0.0030024 1204
-1.443 -0.52357 -0.0031849 1205
-1.435 -0.5195 -0.012787 1206
-1.4423 -0.53656 -0.0030509 1207
-1.4318 -0.54114 -0.011445 1208
-1.4185 -0.54614 -0.018908 1209
-1.407 -0.56157 0.064 1210
-1.3908 -0.55619 0.07096 1211
-1.4162 -0.57159 0.061507 1212
-1.4437 -0.56625 0.042474 1213
-1.4311 -0.56263 0.048744 1214
-1.4437 -0.57793 0.044483 1215
-1.4324 -0.57514 0.053706 1216
-1.4452 -0.56002 0.03016 1217
-1.4381 -0.55268 0.037381 1218
-1.4515 -0.57868 0.029345 1219
-1.4158 -0.55869 0.055546 1220
-1.4193 -0.57349 0.05902 1221
-1.445 -0.55999 0.012037 1222
-1.4367 -0.56123 0.0026262 1223
-1.4485 -0.57858 0.01193 1224
-1.4376 -0.57634 0.0025747 1225
-1.4281 -0.55902 -0.0062669 1226
-1.4299 -0.57427 -0.0034921 1227
-1.415 -0.56173 -0.016133 1228
-1.4168 -0.57171 -0.011373 1229
-1.2279 -0.46442 0.1459 1230
-1.2645 -0.50376 0.14196 1231
-1.225 -0.48711 0.16286 1232
-1.2297 -0.4947 0.16409 1233
-1.2461 -0.48281 0.14425 1234
-1.2314 -0.47924 0.153 1235
-1.2507 -0.49842 0.14784 1236
-1.2363 -0.49529 0.15593 1237
-1.2649 -0.51069 0.14157 1238
-1.1028 -0.42381 0.22239 1239
-1.064 -0.40533 0.2416 1240
-1.0669 -0.42092 0.24346 1241
-1.0862 -0.40211 0.22434 1242
-1.0707 -0.39956 0.23339 1243
-1.0904 -0.41995 0.22952 1244
-1.0751 -0.41648 0.23687 1245
-1.1036 -0.4389 0.22547 1246
-1.0821 -0.43531 0.24146 1247
-1.0744 -0.43255 0.24523 1248
-1.0944 -0.43669 0.23551 1249
-1.1451 -0.40462 0.18243 1250
-1.1623 -0.42681 0.183 1251
-1.1508 -0.42076 0.18752 1252
-1.1812 -0.4683 0.1809 1253
-1.1446 -0.44346 0.20085 1254
-1.15 -0.45985 0.20397 1255
-1.1652 -0.44158 0.18577 1256
-1.1534 -0.43909 0.19523 1257
-1.1689 -0.46021 0.18931 1258
-1.1561 -0.45636 0.19821 1259
-1.1864 -0.42195 0.16259 1260
-1.2027 -0.40787 0.14149 1261
-1.1879 -0.40025 0.14727 1262
-1.2067 -0.42215 0.14569 1263
-1.1964 -0.41945 0.15456 1264
-1.1653 -0.40186 0.16407 1265
-1.1517 -0.39999 0.1728 1266
-1.1676 -0.4206 0.17063 1267
-1.1576 -0.41578 0.17678 1268
-1.1714 -0.39658 0.15584 1269
-1.2019 -0.44818 0.16158 1270
-1.1901 -0.44108 0.16669 1271
-1.2049 -0.46242 0.16423 1272
-1.1908 -0.46016 0.17295 1273
-1.2059 -0.44017 0.14791 1274
-1.1985 -0.4372 0.15641 1275
-1.2123 -0.45744 0.15316 1276
-1.1738 -0.43912 0.17603 1277
-1.1769 -0.45372 0.17845 1278
-1.1053 -0.40127 0.20517 1279
-1.1243 -0.42371 0.20451 1280
-1.1122 -0.41976 0.21283 1281
-1.1294 -0.40061 0.18973 1282
-1.1164 -0.39828 0.19725 1283
-1.1329 -0.41663 0.19379 1284
-1.0942 -0.39783 0.21382 1285
-1.0985 -0.41192 0.21873 1286
-1.1285 -0.43968 0.20635 1287
-1.1125 -0.43876 0.21546 1288
-1.131 -0.45402 0.21128 1289
-1.1184 -0.45112 0.21777 1290
-1.1376 -0.43075 0.19917 1291
-1.1384 -0.39215 0.17868 1292
-1.1835 -0.47573 0.18385 1293
-1.1734 -0.47211 0.19134 1294
-1.2109 -0.47967 0.16771 1295
-1.1938 -0.47621 0.1759 1296
-1.2184 -0.49176 0.16943 1297
-1.2185 -0.47212 0.15841 1298
-1.3012 -0.42749 0.082057 1299
-1.3069 -0.40551 0.065078 1300
-1.3216 -0.42535 0.06259 1301
-1.3121 -0.42086 0.070438 1302
-1.3039 -0.44259 0.086128 1303
-1.3214 -0.46847 0.081045 1304
-1.3091 -0.4605 0.088409 1305
-1.323 -0.43887 0.062288 1306
-1.3137 -0.44034 0.072249 1307
-1.327 -0.4628 0.068288 1308
-1.3174 -0.45497 0.072795 1309
-1.267 -0.42338 0.10432 1310
-1.2254 -0.40271 0.125 1311
-1.2408 -0.42745 0.12039 1312
-1.2295 -0.42018 0.12791 1313
-1.2457 -0.40015 0.10355 1314
-1.2326 -0.39912 0.11327 1315
-1.2496 -0.41971 0.1124 1316
-1.2368 -0.4143 0.1184 1317
-1.2644 -0.46368 0.12297 1318
-1.2823 -0.44886 0.10131 1319
-1.2717 -0.44071 0.10808 1320
-1.2854 -0.4617 0.10281 1321
-1.2736 -0.45949 0.11256 1322
-1.2465 -0.44231 0.12245 1323
-1.2298 -0.4387 0.12846 1324
-1.2503 -0.46044 0.12977 1325
-1.2315 -0.45637 0.13647 1326
-1.2563 -0.43819 0.11747 1327
-1.2576 -0.45065 0.11853 1328
-1.2836 -0.40594 0.081397 1329
-1.2703 -0.40041 0.089169 1330
-1.2886 -0.42135 0.086077 1331
-1.2746 -0.418 0.094327 1332
-1.2893 -0.39942 0.071686 1333
-1.2786 -0.39414 0.077574 1334
-1.2958 -0.41459 0.078261 1335
-1.2576 -0.39873 0.097756 1336
-1.2894 -0.4388 0.093866 1337
-1.2798 -0.43822 0.099161 1338
-1.2925 -0.4581 0.097858 1339
-1.3017 -0.48591 0.10284 1340
-1.3271 -0.50579 0.10323 1341
-1.3087 -0.50082 0.10857 1342
-1.3404 -0.5119 0.10032 1343
-1.3435 -0.53868 0.10192 1344
-1.3041 -0.52306 0.12263 1345
-1.3147 -0.53124 0.12117 1346
-1.3298 -0.52093 0.10459 1347
-1.3124 -0.52002 0.11478 1348
-1.3278 -0.53375 0.10806 1349
-1.318 -0.53167 0.116 1350
-1.3453 -0.50351 0.08528 1351
-1.3444 -0.48308 0.068601 1352
-1.364 -0.50541 0.061824 1353
-1.3548 -0.49988 0.070779 1354
-1.3264 -0.48144 0.083954 1355
-1.3097 -0.47858 0.093033 1356
-1.3323 -0.49881 0.09314 1357
-1.318 -0.49194 0.096365 1358
-1.3337 -0.47572 0.073448 1359
-1.3472 -0.52028 0.089813 1360
-1.3646 -0.54515 0.084514 1361
-1.3546 -0.5387 0.091753 1362
-1.3664 -0.52164 0.065472 1363
-1.3572 -0.51836 0.074341 1364
-1.3708 -0.53833 0.071798 1365
-1.3591 -0.53252 0.077234 1366
-1.3367 -0.51359 0.098814 1367
-1.2703 -0.482 0.12782 1368
-1.2842 -0.505 0.12311 1369
-1.2726 -0.49917 0.13126 1370
-1.2882 -0.47966 0.10831 1371
-1.2769 -0.47593 0.11616 1372
-1.2906 -0.49727 0.11544 1373
-1.2798 -0.49321 0.11885 1374
-1.255 -0.47701 0.13676 1375
-1.26 -0.49169 0.13971 1376
-1.2912 -0.51561 0.12475 1377
-1.2739 -0.51284 0.13249 1378
-1.2977 -0.47311 0.098026 1379
-1.341 -0.40842 0.042383 1380
-1.3417 -0.42014 0.042071 1381
-1.3484 -0.40058 0.026938 1382
-1.3667 -0.42288 0.022938 1383
-1.3504 -0.41906 0.032358 1384
-1.3298 -0.40111 0.046149 1385
-1.312 -0.39877 0.054951 1386
-1.3297 -0.42016 0.050844 1387
-1.3183 -0.4142 0.057693 1388
-1.3358 -0.39722 0.035449 1389
-1.3628 -0.4487 0.041564 1390
-1.3473 -0.44088 0.04606 1391
-1.3693 -0.46191 0.045062 1392
-1.3495 -0.46041 0.053239 1393
-1.3688 -0.44134 0.031439 1394
-1.3564 -0.43636 0.036261 1395
-1.3745 -0.45654 0.036775 1396
-1.3314 -0.43874 0.054996 1397
-1.3358 -0.4575 0.058842 1398
-1.3695 -0.39955 0.0072008 1399
-1.3572 -0.39927 0.016347 1400
-1.3732 -0.41615 0.014692 1401
-1.3707 -0.47936 0.049392 1402
-1.3526 -0.47912 0.057044 1403
-1.3691 -0.5001 0.05519 1404
-1.36 -0.493 0.057812 1405
-1.3716 -0.51795 0.056323 1406
-1.3762 -0.53196 0.058504 1407
-1.2114 -0.39914 0.13224 1408
-1.1967 -0.39461 0.13745 1409
-1.2145 -0.42062 0.13699 1410
-1.2134 -0.43706 0.13598 1411
-1.3692 -0.55263 0.086026 1412
-1.3733 -0.55305 0.078047 1413
-0.96699 -0.38306 0.30175 1414
-0.97341 -0.39209 0.3026 1415
-0.92011 -0.14992 0.22061 1416
-0.90619 -0.14202 0.22622 1417
-0.90512 -0.22482 0.26494 1418
-0.94339 -0.18798 0.22351 1419
-0.9029 -0.16691 0.24276 1420
-0.90592 -0.18061 0.24367 1421
-0.92372 -0.16372 0.22582 1422
-0.91175 -0.15889 0.23216 1423
-0.92805 -0.18017 0.22972 1424
-0.91599 -0.17851 0.23834 1425
-0.94247 -0.21991 0.2406 1426
-0.94531 -0.20132 0.22724 1427
-0.96415 -0.22222 0.22321 1428
-0.94837 -0.21962 0.23218 1429
-0.92438 -0.20417 0.24372 1430
-0.90994 -0.19968 0.2503 1431
-0.92854 -0.22058 0.24605 1432
-0.91132 -0.21894 0.2545 1433
-0.93255 -0.19745 0.23584 1434
-0.91733 -0.19233 0.23956 1435
-0.93941 -0.22313 0.23932 1436
-0.98365 -0.087447 0.143 1437
-0.98772 -0.10072 0.14567 1438
-1.0225 -0.14695 0.14199 1439
-0.98238 -0.12594 0.16279 1440
-0.9878 -0.14095 0.16676 1441
-1.0046 -0.12337 0.14393 1442
-0.98931 -0.11993 0.15172 1443
-1.0105 -0.14125 0.14869 1444
-0.99333 -0.13597 0.15565 1445
-0.94224 -0.10658 0.18227 1446
-0.90227 -0.088491 0.20083 1447
-0.92011 -0.10614 0.20205 1448
-0.9098 -0.10219 0.20688 1449
-0.92387 -0.083183 0.18434 1450
-0.90796 -0.079537 0.19045 1451
-0.92698 -0.10083 0.18895 1452
-0.91424 -0.09547 0.19647 1453
-0.94384 -0.14613 0.2021 1454
-0.94561 -0.12087 0.18293 1455
-0.96452 -0.14341 0.18562 1456
-0.95108 -0.13949 0.19204 1457
-0.92217 -0.12127 0.20203 1458
-0.90858 -0.11985 0.20952 1459
-0.92864 -0.14089 0.20671 1460
-0.91085 -0.1383 0.21479 1461
-0.92913 -0.11945 0.19196 1462
-0.91881 -0.12042 0.19993 1463
-0.93643 -0.13423 0.19604 1464
-0.94607 -0.084027 0.1633 1465
-0.96402 -0.103 0.16253 1466
-0.94929 -0.10054 0.17045 1467
-0.96834 -0.080901 0.14826 1468
-0.9532 -0.077055 0.15575 1469
-0.97306 -0.09948 0.15522 1470
-0.95799 -0.091035 0.15933 1471
-0.93121 -0.079165 0.17169 1472
-0.9356 -0.094746 0.17721 1473
-0.97084 -0.12093 0.16669 1474
-0.95226 -0.11792 0.17452 1475
-0.97091 -0.13865 0.176 1476
-0.9594 -0.13106 0.17951 1477
-0.97667 -0.1124 0.15716 1478
-0.98712 -0.18414 0.18637 1479
-1.0234 -0.22653 0.18191 1480
-0.98485 -0.22364 0.20567 1481
-1.0051 -0.20673 0.18151 1482
-0.98895 -0.19974 0.18944 1483
-1.0112 -0.22076 0.18631 1484
-0.99117 -0.21887 0.19478 1485
-1.0222 -0.18564 0.16178 1486
-1.0412 -0.16916 0.14094 1487
-1.0283 -0.16172 0.14585 1488
-1.0428 -0.18242 0.14297 1489
-1.0307 -0.17914 0.15208 1490
-1.0087 -0.16665 0.16322 1491
-0.99 -0.15944 0.16979 1492
-1.0118 -0.18057 0.16776 1493
-0.99248 -0.17843 0.17579 1494
-1.0132 -0.15812 0.15468 1495
-0.99913 -0.15102 0.15925 1496
-1.0185 -0.17329 0.15838 1497
-1.0235 -0.20095 0.16366 1498
-1.0453 -0.22571 0.16309 1499
-1.0291 -0.21952 0.17064 1500
-1.0492 -0.20073 0.14817 1501
-1.0333 -0.19854 0.1577 1502
-1.0523 -0.21799 0.1523 1503
-1.038 -0.21199 0.15911 1504
-1.013 -0.19955 0.17304 1505
-0.99772 -0.19383 0.17859 1506
-1.0181 -0.21214 0.17617 1507
-0.94558 -0.16125 0.2043 1508
-0.96642 -0.18494 0.2035 1509
-0.9485 -0.18072 0.20989 1510
-0.96801 -0.16014 0.18736 1511
-0.95395 -0.15957 0.19706 1512
-0.97271 -0.17767 0.19269 1513
-0.95712 -0.17236 0.19864 1514
-0.9306 -0.15966 0.21357 1515
-0.93591 -0.1745 0.2157 1516
-0.96864 -0.20104 0.20621 1517
-0.95201 -0.19794 0.21475 1518
-0.97319 -0.21905 0.21395 1519
-0.97628 -0.20022 0.19869 1520
-0.97764 -0.21078 0.19918 1521
-0.9769 -0.15835 0.17816 1522
-0.83245 -0.10628 0.26048 1523
-0.86248 -0.14502 0.26115 1524
-0.8426 -0.12534 0.2615 1525
-0.83625 -0.11772 0.26137 1526
-0.85107 -0.14029 0.26339 1527
-0.86207 -0.1084 0.24114 1528
-0.8808 -0.089558 0.22241 1529
-0.86698 -0.083996 0.22391 1530
-0.88308 -0.10015 0.22263 1531
-0.87041 -0.10134 0.23029 1532
-0.84385 -0.082146 0.24299 1533
-0.82821 -0.080294 0.24794 1534
-0.84865 -0.10108 0.24569 1535
-0.83332 -0.099203 0.25414 1536
-0.85094 -0.07932 0.23205 1537
-0.85244 -0.096342 0.23593 1538
-0.86497 -0.12238 0.24368 1539
-0.88214 -0.14775 0.24329 1540
-0.8696 -0.14029 0.25023 1541
-0.89019 -0.12142 0.22543 1542
-0.87229 -0.11938 0.23406 1543
-0.89005 -0.14026 0.2335 1544
-0.87319 -0.13495 0.23663 1545
-0.8505 -0.1194 0.25159 1546
-0.83652 -0.11365 0.25791 1547
-0.85397 -0.13332 0.25725 1548
-0.81825 -0.077197 0.25351 1549
-0.86668 -0.16205 0.26398 1550
-0.88403 -0.18756 0.2623 1551
-0.87024 -0.1791 0.2662 1552
-0.85559 -0.15565 0.26577 1553
-0.88739 -0.20092 0.26648 1554
-0.87567 -0.19695 0.27224 1555
-0.89095 -0.21888 0.27077 1556
-0.87834 -0.21128 0.27511 1557
-0.88856 -0.16026 0.24774 1558
-0.87381 -0.15887 0.25606 1559
-0.89004 -0.17935 0.25227 1560
-0.87658 -0.17523 0.25845 1561
-0.89553 -0.15527 0.2369 1562
-0.8972 -0.19981 0.25745 1563
-0.89796 -0.21342 0.25707 1564
-0.88759 -0.081833 0.20653 1565
-0.87218 -0.077109 0.21451 1566
-0.89026 -0.098036 0.21418 1567
-0.89441 -0.074914 0.19694 1568
-0.8579 -0.073201 0.21996 1569
-0.89716 -0.11804 0.21861 1570
-0.89977 -0.13039 0.21948 1571
-0.98108 -0.24891 0.22027 1572
-0.98771 -0.26245 0.22584 1573
-1.0218 -0.30646 0.22211 1574
-0.98256 -0.28945 0.24103 1575
-0.98881 -0.3025 0.24565 1576
-1.0059 -0.28483 0.22353 1577
-0.99069 -0.27922 0.23011 1578
-1.0113 -0.30062 0.22747 1579
-0.99387 -0.29792 0.23553 1580
-0.94162 -0.26465 0.26169 1581
-0.90102 -0.24753 0.2818 1582
-0.90693 -0.26221 0.28218 1583
-0.92412 -0.24398 0.26284 1584
-0.90914 -0.24005 0.27008 1585
-0.92905 -0.26122 0.2664 1586
-0.91318 -0.25811 0.27534 1587
-0.94229 -0.30545 0.28078 1588
-0.94327 -0.28503 0.26382 1589
-0.96494 -0.3037 0.26288 1590
-0.94866 -0.30062 0.27122 1591
-0.92511 -0.28596 0.28219 1592
-0.91401 -0.27773 0.2834 1593
-0.93197 -0.30084 0.28558 1594
-0.93183 -0.27839 0.27112 1595
-0.91773 -0.27226 0.27897 1596
-0.93877 -0.29405 0.27789 1597
-0.94536 -0.24615 0.2435 1598
-0.96352 -0.26346 0.24276 1599
-0.94887 -0.26113 0.25009 1600
-0.96683 -0.24074 0.22651 1601
-0.95153 -0.23891 0.23532 1602
-0.97032 -0.25944 0.23444 1603
-0.9594 -0.25072 0.23402 1604
-0.93131 -0.23898 0.25082 1605
-0.91665 -0.23151 0.25768 1606
-0.93769 -0.25495 0.25554 1607
-0.93968 -0.2332 0.23963 1608
-0.96683 -0.28171 0.24615 1609
-0.9511 -0.27795 0.25486 1610
-0.97191 -0.2997 0.25399 1611
-0.95799 -0.29107 0.2589 1612
-0.97383 -0.2774 0.2373 1613
-0.98353 -0.34645 0.26779 1614
-1.0211 -0.38783 0.26038 1615
-0.98411 -0.36274 0.28264 1616
-0.98761 -0.38079 0.28542 1617
-1.0048 -0.36651 0.26128 1618
-0.98846 -0.35978 0.2707 1619
-1.009 -0.38239 0.2676 1620
-0.9953 -0.37644 0.27467 1621
-1.0225 -0.34817 0.2419 1622
-1.0406 -0.32964 0.22066 1623
-1.025 -0.32217 0.22537 1624
-1.0432 -0.34232 0.22156 1625
-1.0291 -0.33992 0.22901 1626
-1.004 -0.32386 0.24159 1627
-0.99147 -0.32028 0.24841 1628
-1.009 -0.34067 0.24618 1629
-0.99081 -0.33801 0.25468 1630
-1.0137 -0.31876 0.23442 1631
-0.99862 -0.31172 0.23851 1632
-1.0172 -0.33676 0.23703 1633
-1.0264 -0.36263 0.24698 1634
-1.0426 -0.38401 0.24291 1635
-1.0302 -0.37993 0.25094 1636
-1.0477 -0.36169 0.22642 1637
-1.0333 -0.3586 0.23495 1638
-1.0499 -0.37908 0.23178 1639
-1.0366 -0.37219 0.23729 1640
-1.0128 -0.35803 0.25364 1641
-0.99436 -0.35363 0.25783 1642
-1.0165 -0.37655 0.25781 1643
-0.94702 -0.32359 0.2841 1644
-0.96907 -0.34602 0.28251 1645
-0.95055 -0.34013 0.28862 1646
-0.96616 -0.32111 0.26629 1647
-0.95225 -0.31775 0.27459 1648
-0.97357 -0.33725 0.27054 1649
-0.95747 -0.33215 0.27833 1650
-0.93276 -0.31714 0.28731 1651
-0.93948 -0.33197 0.29322 1652
-0.96979 -0.36042 0.28666 1653
-0.95304 -0.35834 0.2933 1654
-0.97133 -0.37983 0.29429 1655
-0.95771 -0.3708 0.29731 1656
-0.97379 -0.31745 0.25654 1657
-0.9796 -0.3361 0.25931 1658
-1.0239 -0.24124 0.18401 1659
-1.0432 -0.26554 0.18261 1660
-1.0283 -0.26107 0.18844 1661
-1.0032 -0.24549 0.2011 1662
-0.9902 -0.24065 0.20876 1663
-1.0076 -0.26257 0.20478 1664
-0.99502 -0.25792 0.21287 1665
-1.0132 -0.24022 0.19315 1666
-0.9956 -0.23346 0.19804 1667
-1.0164 -0.25693 0.19576 1668
-1.0267 -0.28287 0.20425 1669
-1.0451 -0.30295 0.2054 1670
-1.0294 -0.30039 0.21308 1671
-1.0485 -0.28041 0.18806 1672
-1.0313 -0.27801 0.19524 1673
-1.0512 -0.29656 0.19482 1674
-1.039 -0.29023 0.19799 1675
-1.011 -0.27848 0.21181 1676
-0.99837 -0.27128 0.21723 1677
-1.0173 -0.29413 0.21697 1678
-1.0469 -0.24037 0.16679 1679
-1.0339 -0.23942 0.17678 1680
-1.0499 -0.25926 0.17191 1681
-1.0369 -0.2538 0.17779 1682
-1.0571 -0.24002 0.15778 1683
-1.0592 -0.25039 0.16002 1684
-1.0569 -0.27217 0.17724 1685
-0.97405 -0.23646 0.21698 1686
-1.0512 -0.3196 0.21219 1687
-1.0319 -0.31662 0.21746 1688
-1.0518 -0.33998 0.21654 1689
-1.0556 -0.35286 0.21672 1690
-0.89761 -0.24407 0.28068 1691
-0.89977 -0.2501 0.2812 1692
-0.89538 -0.23664 0.27713 1693
-0.89977 -0.2501 0.27933 1694
-1.0219 -0.10667 0.12039 1695
-1.0427 -0.087708 0.1017 1696
-1.0266 -0.082739 0.105 1697
-1.0454 -0.10036 0.10246 1698
-1.029 -0.099979 0.11202 1699
-1.0068 -0.08223 0.12577 1700
-0.99145 -0.079967 0.13285 1701
-1.0124 -0.10015 0.12611 1702
-0.99438 -0.099532 0.13557 1703
-1.0135 -0.078294 0.11291 1704
-1.0187 -0.092565 0.1193 1705
-1.044 -0.12689 0.12173 1706
-1.0275 -0.12185 0.124 1707
-1.0452 -0.14203 0.12406 1708
-1.0296 -0.14065 0.13192 1709
-1.05 -0.12095 0.10992 1710
-1.0338 -0.11363 0.11531 1711
-1.0536 -0.13848 0.11438 1712
-1.0112 -0.11939 0.13225 1713
-0.99847 -0.11188 0.13799 1714
-1.0164 -0.13382 0.13569 1715
-1.0499 -0.080784 0.089038 1716
-1.0327 -0.074818 0.096583 1717
-1.0556 -0.098435 0.095452 1718
-1.0562 -0.11281 0.099549 1719
-0.97211 -0.075085 0.13687 1720
-1.049 -0.16058 0.12933 1721
-1.0353 -0.15581 0.13687 1722
-1.0508 -0.17844 0.13539 1723
-1.0592 -0.15106 0.11843 1724
-1.0561 -0.19619 0.13882 1725
-1.0272 -0.40239 0.26492 1726
-1.0328 -0.41472 0.2663 1727
-1.0031 -0.39988 0.28113 1728
-0.9911 -0.39576 0.28654 1729
-1.0119 -0.39863 0.27398 1730
-1.0185 -0.41099 0.27582 1731
-1.047 -0.40148 0.24731 1732
-1.0347 -0.39756 0.25466 1733
-1.048 -0.41677 0.25152 1734
-1.0386 -0.41246 0.25873 1735
-1.0541 -0.39088 0.23813 1736
-0.97706 -0.39272 0.2953 1737
-1.061 0.2903 -0.098505 1738
-1.0639 0.25323 -0.076838 1739
-1.0803 0.27538 -0.098805 1740
-1.0674 0.27827 -0.093749 1741
-1.0832 0.25254 -0.09717 1742
-1.0698 0.25991 -0.089277 1743
-1.1438 0.33472 -0.17259 1744
-1.0662 0.3755 -0.1357 1745
-1.1023 0.33062 -0.139 1746
-1.0619 0.35234 -0.11882 1747
-1.0669 0.33778 -0.116 1748
-1.0869 0.35445 -0.13671 1749
-1.0692 0.35976 -0.13034 1750
-1.0891 0.33859 -0.13189 1751
-1.0727 0.34321 -0.12355 1752
-1.1016 0.37258 -0.15819 1753
-1.1212 0.3907 -0.17869 1754
-1.1059 0.39363 -0.17495 1755
-1.1238 0.37817 -0.17665 1756
-1.1102 0.38058 -0.16791 1757
-1.0857 0.39096 -0.15798 1758
-1.0886 0.37918 -0.15241 1759
-1.0749 0.3824 -0.14514 1760
-1.0952 0.39307 -0.1655 1761
-1.0962 0.3873 -0.16341 1762
-1.105 0.35773 -0.15523 1763
-1.1272 0.3382 -0.1551 1764
-1.1077 0.34168 -0.14757 1765
-1.1291 0.35865 -0.17215 1766
-1.1144 0.36267 -0.16376 1767
-1.1349 0.34223 -0.1692 1768
-1.0915 0.36051 -0.14648 1769
-1.0777 0.36691 -0.14105 1770
-1.0983 0.34592 -0.14142 1771
-1.1434 0.25848 -0.13806 1772
-1.1409 0.31058 -0.15968 1773
-1.1454 0.29783 -0.1571 1774
-1.1474 0.31936 -0.17256 1775
-1.1636 0.29624 -0.17457 1776
-1.1533 0.30268 -0.16772 1777
-1.1832 0.27813 -0.17842 1778
-1.2019 0.25141 -0.17988 1779
-1.1901 0.25774 -0.17421 1780
-1.1612 0.27307 -0.15891 1781
-1.1508 0.27792 -0.15231 1782
-1.1626 0.25729 -0.15631 1783
-1.1545 0.26089 -0.14773 1784
-1.1682 0.27977 -0.17037 1785
-1.1569 0.28299 -0.16228 1786
-1.1687 0.26176 -0.1656 1787
-1.1042 0.31858 -0.13644 1788
-1.1225 0.29514 -0.13771 1789
-1.1089 0.29909 -0.13123 1790
-1.0845 0.31828 -0.1175 1791
-1.0708 0.3207 -0.11038 1792
-1.0891 0.29852 -0.11534 1793
-1.0687 0.30071 -0.10602 1794
-1.0919 0.32142 -0.12704 1795
-1.0947 0.30341 -0.12402 1796
-1.1034 0.27852 -0.11722 1797
-1.1221 0.25439 -0.1183 1798
-1.1093 0.26 -0.11414 1799
-1.1262 0.27939 -0.13592 1800
-1.113 0.28005 -0.12574 1801
-1.1294 0.25883 -0.12871 1802
-1.115 0.26666 -0.12383 1803
-1.0888 0.27886 -0.10873 1804
-1.0733 0.2845 -0.10331 1805
-1.0896 0.25936 -0.10517 1806
-1.0776 0.26486 -0.10154 1807
-1.1293 0.31918 -0.1517 1808
-1.1145 0.32283 -0.14243 1809
-1.1312 0.30063 -0.14772 1810
-1.1382 0.32063 -0.16323 1811
-1.1335 0.28273 -0.1447 1812
-1.2235 0.43652 -0.27738 1813
-1.2222 0.42673 -0.27947 1814
-1.2408 0.44656 -0.29878 1815
-1.2344 0.43827 -0.2906 1816
-1.2271 0.42137 -0.29126 1817
-1.241 0.4426 -0.30631 1818
-1.2353 0.43779 -0.30514 1819
-1.2408 0.42721 -0.31726 1820
-1.2306 0.41984 -0.30825 1821
-1.2385 0.41095 -0.32095 1822
-1.1518 0.4132 -0.2139 1823
-1.1828 0.41461 -0.23932 1824
-1.2019 0.4313 -0.25817 1825
-1.1969 0.43151 -0.25401 1826
-1.2029 0.41766 -0.25747 1827
-1.1922 0.41949 -0.24853 1828
-1.1685 0.41631 -0.22966 1829
-1.178 0.41701 -0.23998 1830
-1.1379 0.41069 -0.20263 1831
-1.212 0.43398 -0.26791 1832
-1.2097 0.41909 -0.2689 1833
-1.2194 0.41395 -0.28542 1834
-1.2199 0.43354 -0.30769 1835
-1.2154 0.42687 -0.30822 1836
-1.2234 0.35084 -0.23904 1837
-1.227 0.34003 -0.23646 1838
-1.2269 0.35599 -0.25228 1839
-1.2308 0.33962 -0.2498 1840
-1.2264 0.29792 -0.21706 1841
-1.2222 0.2781 -0.19944 1842
-1.2262 0.25939 -0.19765 1843
-1.2422 0.27448 -0.21777 1844
-1.23 0.2803 -0.21016 1845
-1.2418 0.2575 -0.21294 1846
-1.2356 0.26121 -0.20745 1847
-1.2259 0.31646 -0.23141 1848
-1.2341 0.30031 -0.23026 1849
-1.2282 0.319 -0.24964 1850
-1.2408 0.29824 -0.25106 1851
-1.2339 0.29992 -0.24986 1852
-1.2625 0.25095 -0.23794 1853
-1.2641 0.25186 -0.24817 1854
-1.2448 0.2759 -0.23024 1855
-1.2361 0.28498 -0.22907 1856
-1.2491 0.25951 -0.22986 1857
-1.2436 0.27524 -0.24817 1858
-1.2356 0.28342 -0.25181 1859
-1.2531 0.26102 -0.25026 1860
-1.2224 0.3974 -0.27643 1861
-1.2234 0.37892 -0.27745 1862
-1.2242 0.40061 -0.289 1863
-1.2235 0.38504 -0.28802 1864
-1.2289 0.35917 -0.27032 1865
-1.2286 0.33886 -0.26981 1866
-1.2272 0.35922 -0.28984 1867
-1.2243 0.34095 -0.2879 1868
-1.2249 0.40372 -0.30847 1869
-1.2229 0.38684 -0.31152 1870
-1.2243 0.35399 -0.30149 1871
-1.2236 0.3471 -0.30184 1872
-1.2324 0.32006 -0.26998 1873
-1.226 0.30237 -0.26641 1874
-1.2238 0.31912 -0.2853 1875
-1.2231 0.30096 -0.29262 1876
-1.2408 0.2713 -0.26194 1877
-1.2308 0.27831 -0.26479 1878
-1.2472 0.2584 -0.2671 1879
-1.2324 0.26177 -0.2738 1880
-1.2408 0.25009 -0.28115 1881
-1.2295 0.25389 -0.2829 1882
-1.2231 0.29749 -0.30425 1883
-1.2222 0.30393 -0.3269 1884
-1.1801 0.37088 -0.2186 1885
-1.1446 0.37754 -0.19575 1886
-1.163 0.39747 -0.21738 1887
-1.151 0.39952 -0.20931 1888
-1.1662 0.37911 -0.21305 1889
-1.1549 0.3835 -0.20437 1890
-1.1864 0.35768 -0.21561 1891
-1.1901 0.33924 -0.21327 1892
-1.1482 0.36057 -0.19456 1893
-1.166 0.33276 -0.19747 1894
-1.1488 0.33694 -0.19097 1895
-1.1672 0.36238 -0.20782 1896
-1.1583 0.36092 -0.20108 1897
-1.1725 0.33972 -0.20384 1898
-1.1571 0.34466 -0.20043 1899
-1.1854 0.39841 -0.23721 1900
-1.1868 0.3781 -0.23365 1901
-1.2043 0.39887 -0.25656 1902
-1.1959 0.40057 -0.24677 1903
-1.2037 0.37915 -0.25508 1904
-1.1973 0.37969 -0.24544 1905
-1.1682 0.40027 -0.22676 1906
-1.174 0.38115 -0.22469 1907
-1.2057 0.35639 -0.23601 1908
-1.1921 0.36186 -0.22769 1909
-1.2099 0.33977 -0.22862 1910
-1.197 0.34356 -0.2232 1911
-1.2112 0.3637 -0.24878 1912
-1.1997 0.36857 -0.24481 1913
-1.178 0.36884 -0.22528 1914
-1.1293 0.39753 -0.19173 1915
-1.115 0.39839 -0.1834 1916
-1.1345 0.38137 -0.1871 1917
-1.1364 0.40293 -0.2029 1918
-1.1365 0.36067 -0.18455 1919
-1.1354 0.34231 -0.18477 1920
-1.203 0.29221 -0.19867 1921
-1.1886 0.29861 -0.19447 1922
-1.2067 0.31698 -0.21704 1923
-1.1889 0.32083 -0.20861 1924
-1.2091 0.29777 -0.20905 1925
-1.1937 0.30322 -0.20421 1926
-1.1694 0.31952 -0.19342 1927
-1.1545 0.32116 -0.18403 1928
-1.1694 0.30175 -0.18668 1929
-1.1587 0.30668 -0.18126 1930
-1.1775 0.31639 -0.20107 1931
-1.2095 0.27948 -0.19522 1932
-1.1912 0.28074 -0.18545 1933
-1.2085 0.25938 -0.1885 1934
-1.197 0.2665 -0.18271 1935
-1.2161 0.2863 -0.20355 1936
-1.1759 0.28915 -0.18129 1937
-1.2157 0.32002 -0.22838 1938
-1.1997 0.32743 -0.22112 1939
-1.2191 0.31866 -0.24695 1940
-1.2117 0.40156 -0.268 1941
-1.212 0.379 -0.26959 1942
-1.1997 0.37148 -0.26102 1943
-1.219 0.40107 -0.2935 1944
-1.2148 0.37775 -0.29054 1945
-1.2137 0.36774 -0.2647 1946
-1.1997 0.36982 -0.26102 1947
-1.2142 0.36722 -0.29359 1948
-1.216 0.33422 -0.29316 1949
-1.2162 0.39374 -0.30812 1950
-1.2156 0.37971 -0.30845 1951
-1.212 0.36005 -0.30655 1952
-1.1972 0.35288 -0.31109 1953
-1.2108 0.33943 -0.30651 1954
-1.1952 0.33804 -0.31344 1955
-1.1931 0.33141 -0.32077 1956
-1.2155 0.29657 -0.27202 1957
-1.2126 0.31961 -0.29383 1958
-1.2176 0.29964 -0.28674 1959
-1.2106 0.28028 -0.27221 1960
-1.2129 0.26507 -0.27678 1961
-1.2102 0.27981 -0.29065 1962
-1.1997 0.27006 -0.29926 1963
-1.2082 0.25985 -0.29028 1964
-1.1997 0.2684 -0.29926 1965
-1.2064 0.31959 -0.31021 1966
-1.1997 0.31628 -0.3099 1967
-1.2127 0.30142 -0.31083 1968
-1.2051 0.31137 -0.32676 1969
-1.197 0.31986 -0.32531 1970
-1.2081 0.30138 -0.32707 1971
-1.1957 0.29686 -0.33204 1972
-1.2067 0.28517 -0.30635 1973
-1.1968 0.27741 -0.31131 1974
-1.2035 0.25822 -0.30692 1975
-1.1968 0.26232 -0.31266 1976
-1.1933 0.28017 -0.32576 1977
-1.1898 0.25851 -0.32564 1978
-1.173 0.26214 -0.32799 1979
-1.2241 0.17151 -0.15833 1980
-1.2258 0.19762 -0.17566 1981
-1.2475 0.17708 -0.17674 1982
-1.2304 0.18062 -0.16872 1983
-1.2241 0.13221 -0.13854 1984
-1.2276 0.11933 -0.13473 1985
-1.2302 0.098645 -0.13225 1986
-1.2646 0.15772 -0.17799 1987
-1.2647 0.14024 -0.17718 1988
-1.2247 0.15874 -0.15672 1989
-1.2431 0.13387 -0.15638 1990
-1.2303 0.13988 -0.1502 1991
-1.2501 0.15872 -0.17204 1992
-1.2326 0.16081 -0.16449 1993
-1.2524 0.13946 -0.16747 1994
-1.2367 0.14814 -0.16153 1995
-1.2662 0.09327 -0.15607 1996
-1.2674 0.1189 -0.17391 1997
-1.283 0.094377 -0.17768 1998
-1.2727 0.10047 -0.16938 1999
-1.2445 0.11926 -0.15493 2000
-1.2371 0.12048 -0.14499 2001
-1.2484 0.10076 -0.14974 2002
-1.2379 0.10328 -0.1412 2003
-1.2554 0.12212 -0.16507 2004
-1.2584 0.10684 -0.16102 2005
-1.1422 0.17111 -0.099189 2006
-1.0662 0.19788 -0.054356 2007
-1.0805 0.17674 -0.058989 2008
-1.0711 0.17994 -0.05111 2009
-1.1004 0.23094 -0.098353 2010
-1.1044 0.21943 -0.094922 2011
-1.068 0.2389 -0.071737 2012
-1.0822 0.21616 -0.0781 2013
-1.0692 0.22017 -0.069534 2014
-1.0902 0.2396 -0.091495 2015
-1.0743 0.24398 -0.08255 2016
-1.0915 0.22098 -0.085418 2017
-1.1024 0.19443 -0.078927 2018
-1.1227 0.17304 -0.078654 2019
-1.1082 0.17901 -0.07453 2020
-1.1259 0.19583 -0.095451 2021
-1.1099 0.20118 -0.088984 2022
-1.13 0.17936 -0.090704 2023
-1.1157 0.18605 -0.081938 2024
-1.0888 0.19952 -0.07473 2025
-1.0729 0.20116 -0.065606 2026
-1.0893 0.18035 -0.066127 2027
-1.0769 0.1877 -0.063171 2028
-1.0954 0.20519 -0.081973 2029
-1.146 0.15724 -0.097238 2030
-1.1616 0.13404 -0.098185 2031
-1.15 0.1396 -0.092056 2032
-1.1801 0.11029 -0.099756 2033
-1.1831 0.096578 -0.095912 2034
-1.1446 0.11495 -0.076442 2035
-1.1629 0.095394 -0.076518 2036
-1.151 0.1006 -0.070671 2037
-1.1663 0.1182 -0.093245 2038
-1.153 0.12223 -0.085122 2039
-1.1712 0.10115 -0.087736 2040
-1.1581 0.10903 -0.08024 2041
-1.102 0.13719 -0.059044 2042
-1.064 0.15314 -0.038959 2043
-1.0654 0.13786 -0.035212 2044
-1.0837 0.15594 -0.0561 2045
-1.0719 0.1607 -0.048022 2046
-1.0898 0.14 -0.051838 2047
-1.0742 0.14064 -0.042396 2048
-1.1026 0.097861 -0.038132 2049
-1.1243 0.11495 -0.057283 2050
-1.1073 0.11969 -0.053047 2051
-1.1279 0.098432 -0.054453 2052
-1.1106 0.1012 -0.045179 2053
-1.084 0.11419 -0.03771 2054
-1.0686 0.12004 -0.030708 2055
-1.091 0.099119 -0.031319 2056
-1.0694 0.10317 -0.024406 2057
-1.092 0.12168 -0.045695 2058
-1.0768 0.12682 -0.041111 2059
-1.0971 0.10861 -0.041425 2060
-1.1243 0.15785 -0.076626 2061
-1.1097 0.15989 -0.069321 2062
-1.1296 0.13945 -0.073509 2063
-1.1097 0.14117 -0.06413 2064
-1.1317 0.1604 -0.088051 2065
-1.1362 0.14286 -0.08307 2066
-1.0899 0.16124 -0.06257 2067
-1.1317 0.12034 -0.069202 2068
-1.1144 0.12567 -0.062403 2069
-1.1361 0.10297 -0.063294 2070
-1.1384 0.12768 -0.08045 2071
-1.1442 0.21373 -0.11756 2072
-1.1612 0.23162 -0.13839 2073
-1.1502 0.23876 -0.13296 2074
-1.1647 0.21775 -0.13586 2075
-1.1523 0.22065 -0.12637 2076
-1.1809 0.19761 -0.13835 2077
-1.1864 0.17835 -0.13251 2078
-1.1626 0.19377 -0.11895 2079
-1.1494 0.19914 -0.11431 2080
-1.1659 0.17708 -0.11591 2081
-1.1503 0.18011 -0.10813 2082
-1.1705 0.19961 -0.1296 2083
-1.1582 0.2075 -0.12358 2084
-1.1735 0.1829 -0.12445 2085
-1.1837 0.23338 -0.15802 2086
-1.1882 0.21773 -0.15276 2087
-1.2045 0.23702 -0.17744 2088
-1.1927 0.2402 -0.16841 2089
-1.2078 0.21858 -0.17251 2090
-1.1964 0.22221 -0.16353 2091
-1.1665 0.23933 -0.15062 2092
-1.1571 0.24498 -0.14341 2093
-1.1712 0.22299 -0.14477 2094
-1.1767 0.24728 -0.16144 2095
-1.2034 0.1971 -0.15801 2096
-1.1908 0.20057 -0.14897 2097
-1.2095 0.17914 -0.15388 2098
-1.1945 0.18168 -0.14469 2099
-1.2118 0.20132 -0.16679 2100
-1.1997 0.20855 -0.16126 2101
-1.2179 0.1846 -0.16192 2102
-1.178 0.19661 -0.1412 2103
-1.125 0.23759 -0.11622 2104
-1.1092 0.2401 -0.10765 2105
-1.1297 0.22019 -0.11249 2106
-1.1139 0.22057 -0.10356 2107
-1.134 0.24268 -0.12414 2108
-1.0972 0.24405 -0.10085 2109
-1.1321 0.20096 -0.10521 2110
-1.1174 0.2092 -0.10116 2111
-1.1373 0.18592 -0.10244 2112
-1.1837 0.15677 -0.11701 2113
-1.1869 0.13905 -0.11506 2114
-1.2019 0.15063 -0.13824 2115
-1.1933 0.15998 -0.1298 2116
-1.2074 0.13872 -0.13238 2117
-1.1971 0.14315 -0.12452 2118
-1.1697 0.16109 -0.11079 2119
-1.1548 0.16131 -0.10246 2120
-1.1691 0.13892 -0.10542 2121
-1.1578 0.14563 -0.10174 2122
-1.1915 0.11914 -0.11129 2123
-1.207 0.097467 -0.11672 2124
-1.1921 0.10029 -0.10712 2125
-1.2104 0.12043 -0.12495 2126
-1.1997 0.12874 -0.12136 2127
-1.2126 0.10259 -0.12312 2128
-1.1739 0.12452 -0.10267 2129
-1.2112 0.16018 -0.1469 2130
-1.1975 0.16833 -0.14188 2131
-1.2144 0.1454 -0.14341 2132
-1.2237 0.035442 -0.097224 2133
-1.242 0.014082 -0.098531 2134
-1.2296 0.018907 -0.093054 2135
-1.2248 -0.041861 -0.057346 2136
-1.2416 -0.0678 -0.05792 2137
-1.2292 -0.060258 -0.053263 2138
-1.2625 -0.0097416 -0.099717 2139
-1.2647 -0.022414 -0.096923 2140
-1.2273 -0.0031126 -0.075859 2141
-1.2413 -0.024718 -0.078434 2142
-1.2313 -0.020594 -0.070298 2143
-1.2468 -0.0026532 -0.094577 2144
-1.2335 0.0014515 -0.086119 2145
-1.2486 -0.019833 -0.087898 2146
-1.2381 -0.012986 -0.081491 2147
-1.2643 -0.065921 -0.07679 2148
-1.2687 -0.040916 -0.093534 2149
-1.2854 -0.063811 -0.096454 2150
-1.2729 -0.059342 -0.08849 2151
-1.2448 -0.040663 -0.07655 2152
-1.2343 -0.03947 -0.066947 2153
-1.2492 -0.060433 -0.069613 2154
-1.2368 -0.055255 -0.063267 2155
-1.2551 -0.038734 -0.084202 2156
-1.259 -0.052989 -0.080952 2157
-1.3003 0.031413 -0.15766 2158
-1.3035 0.019846 -0.15524 2159
-1.3003 0.032185 -0.16886 2160
-1.3025 0.020259 -0.16897 2161
-1.2671 0.054857 -0.13502 2162
-1.2276 0.076359 -0.11671 2163
-1.2438 0.055451 -0.11739 2164
-1.2314 0.059755 -0.11098 2165
-1.2438 0.077189 -0.13584 2166
-1.2342 0.081771 -0.12749 2167
-1.2507 0.061975 -0.12844 2168
-1.2376 0.066559 -0.12155 2169
-1.2668 0.015888 -0.11659 2170
-1.2823 0.034535 -0.13754 2171
-1.2718 0.03961 -0.1311 2172
-1.2849 0.018899 -0.13594 2173
-1.2749 0.021156 -0.12651 2174
-1.2458 0.038728 -0.11611 2175
-1.2324 0.040096 -0.10658 2176
-1.2495 0.019953 -0.10844 2177
-1.236 0.026644 -0.10298 2178
-1.2563 0.042611 -0.12212 2179
-1.2695 0.079227 -0.15328 2180
-1.284 0.057323 -0.15674 2181
-1.2754 0.060557 -0.14842 2182
-1.2825 0.080176 -0.17067 2183
-1.2784 0.079758 -0.17002 2184
-1.2865 0.057818 -0.16716 2185
-1.2754 0.062832 -0.17479 2186
-1.2542 0.080795 -0.14351 2187
-1.2588 0.068791 -0.14217 2188
-1.288 0.038815 -0.15103 2189
-1.2791 0.045505 -0.14442 2190
-1.2918 0.021225 -0.14526 2191
-1.295 0.040618 -0.17044 2192
-1.2952 0.02371 -0.1784 2193
-1.3008 -0.028786 -0.11789 2194
-1.3028 -0.0070134 -0.13492 2195
-1.3081 -0.020675 -0.13143 2196
-1.3056 -0.040928 -0.11593 2197
-1.3214 -0.068796 -0.11902 2198
-1.3107 -0.061479 -0.11178 2199
-1.322 -0.046089 -0.13373 2200
-1.3155 -0.038547 -0.12949 2201
-1.3229 -0.060561 -0.13158 2202
-1.3179 -0.055192 -0.12254 2203
-1.3057 -0.00034179 -0.15137 2204
-1.3109 -0.01942 -0.15026 2205
-1.3046 0.00027039 -0.16955 2206
-1.3029 -0.020944 -0.16586 2207
-1.3142 -0.039526 -0.15042 2208
-1.3214 -0.063608 -0.14221 2209
-1.3138 -0.05949 -0.15109 2210
-1.3072 -0.040873 -0.17012 2211
-1.3048 -0.060402 -0.16969 2212
-1.2823 -0.0081179 -0.11906 2213
-1.2703 -0.00078974 -0.11113 2214
-1.288 -0.021891 -0.11453 2215
-1.2732 -0.01881 -0.10571 2216
-1.2884 0.00056802 -0.13003 2217
-1.2784 0.0061676 -0.12286 2218
-1.2929 -0.015597 -0.12278 2219
-1.257 0.0042332 -0.10242 2220
-1.2897 -0.040425 -0.10815 2221
-1.2774 -0.038881 -0.10198 2222
-1.2908 -0.057079 -0.10308 2223
-1.2798 -0.050671 -0.10109 2224
-1.2954 0.0064956 -0.14317 2225
-1.2973 -0.0068636 -0.17842 2226
-1.2969 -0.020596 -0.17495 2227
-1.297 -0.032927 -0.17929 2228
-1.2977 -0.066963 -0.17773 2229
-1.1465 0.07524 -0.055369 2230
-1.1633 0.051478 -0.059639 2231
-1.1496 0.0596 -0.053734 2232
-1.1801 0.030964 -0.058868 2233
-1.1841 0.016343 -0.057098 2234
-1.1435 0.032536 -0.037867 2235
-1.1627 0.01419 -0.03638 2236
-1.1504 0.019129 -0.030003 2237
-1.1683 0.037105 -0.054792 2238
-1.1499 0.041186 -0.047449 2239
-1.1698 0.020072 -0.048121 2240
-1.1572 0.027288 -0.041556 2241
-1.1823 0.071163 -0.078637 2242
-1.189 0.057498 -0.073864 2243
-1.2031 0.073345 -0.097441 2244
-1.1905 0.079743 -0.09092 2245
-1.2069 0.058688 -0.094516 2246
-1.1962 0.061276 -0.085132 2247
-1.1688 0.079547 -0.073273 2248
-1.1522 0.081555 -0.063506 2249
-1.1693 0.062423 -0.066321 2250
-1.1583 0.066914 -0.061595 2251
-1.1763 0.084169 -0.08305 2252
-1.1923 0.039535 -0.070452 2253
-1.2061 0.016546 -0.07595 2254
-1.1942 0.021001 -0.067376 2255
-1.2098 0.040218 -0.089528 2256
-1.1995 0.045464 -0.082416 2257
-1.2127 0.022749 -0.08455 2258
-1.1747 0.044838 -0.060588 2259
-1.1229 0.072701 -0.038228 2260
-1.1081 0.077104 -0.033779 2261
-1.127 0.057841 -0.03481 2262
-1.1104 0.060973 -0.026481 2263
-1.1312 0.08109 -0.048768 2264
-1.1148 0.085288 -0.041362 2265
-1.1357 0.061278 -0.043874 2266
-1.0912 0.081702 -0.026743 2267
-1.0777 0.088013 -0.020899 2268
-1.0978 0.066651 -0.021862 2269
-1.1306 0.039775 -0.029903 2270
-1.1144 0.046884 -0.021394 2271
-1.1354 0.02468 -0.023959 2272
-1.1377 0.04672 -0.042561 2273
-1.1389 0.085912 -0.059967 2274
-1.1817 -0.0083002 -0.038478 2275
-1.1861 -0.021413 -0.037799 2276
-1.2026 -0.0087248 -0.057769 2277
-1.1902 -0.00083941 -0.05141 2278
-1.2074 -0.022565 -0.054745 2279
-1.195 -0.018214 -0.04626 2280
-1.1666 -0.00076464 -0.034086 2281
-1.1513 0.0010381 -0.024687 2282
-1.168 -0.020368 -0.029154 2283
-1.1553 -0.015623 -0.022705 2284
-1.1753 0.0046824 -0.043185 2285
-1.1895 -0.041095 -0.032324 2286
-1.2061 -0.06345 -0.034352 2287
-1.1941 -0.05762 -0.026929 2288
-1.2103 -0.04071 -0.048389 2289
-1.1987 -0.035277 -0.042516 2290
-1.213 -0.058569 -0.043637 2291
-1.1728 -0.03549 -0.024546 2292
-1.2094 0.00036934 -0.068226 2293
-1.1983 0.0054044 -0.062997 2294
-1.2156 -0.015858 -0.061971 2295
-1.2092 0.079041 -0.10832 2296
-1.1977 0.085765 -0.10469 2297
-1.215 0.063627 -0.10326 2298
-1.2408 0.23461 -0.19947 2299
-1.2309 0.23874 -0.19343 2300
-1.2434 0.21799 -0.19683 2301
-1.2316 0.22091 -0.18845 2302
-1.2497 0.24055 -0.21077 2303
-1.2379 0.24821 -0.20114 2304
-1.2472 0.21881 -0.20921 2305
-1.2625 0.19421 -0.19895 2306
-1.2666 0.17727 -0.1917 2307
-1.2636 0.19547 -0.20854 2308
-1.2671 0.1806 -0.20964 2309
-1.251 0.19931 -0.19194 2310
-1.2322 0.20255 -0.18329 2311
-1.2559 0.18516 -0.18714 2312
-1.2549 0.2035 -0.21092 2313
-1.2591 0.17416 -0.21745 2314
-1.2659 0.23785 -0.23281 2315
-1.2646 0.22376 -0.23334 2316
-1.2657 0.23996 -0.24729 2317
-1.2638 0.22225 -0.24257 2318
-1.2554 0.24328 -0.225 2319
-1.2567 0.21655 -0.22701 2320
-1.2539 0.23938 -0.2544 2321
-1.2508 0.21946 -0.2516 2322
-1.2632 0.19131 -0.2265 2323
-1.2645 0.1831 -0.22718 2324
-1.2629 0.18205 -0.24225 2325
-1.2539 0.2001 -0.22972 2326
-1.2582 0.17794 -0.23276 2327
-1.247 0.19949 -0.24972 2328
-1.2385 0.19812 -0.25916 2329
-1.2516 0.18032 -0.25097 2330
-1.2711 0.15995 -0.19034 2331
-1.2693 0.14017 -0.19036 2332
-1.2682 0.16028 -0.20934 2333
-1.2671 0.13986 -0.21015 2334
-1.2591 0.16223 -0.21837 2335
-1.26 0.14395 -0.21478 2336
-1.2763 0.12012 -0.18999 2337
-1.2838 0.098506 -0.1915 2338
-1.2789 0.10601 -0.18604 2339
-1.2823 0.11562 -0.20742 2340
-1.2764 0.12141 -0.2109 2341
-1.2833 0.10055 -0.20602 2342
-1.2771 0.099776 -0.21259 2343
-1.2625 0.15244 -0.22604 2344
-1.2666 0.1401 -0.22983 2345
-1.2639 0.13635 -0.24148 2346
-1.2558 0.16037 -0.22977 2347
-1.26 0.14849 -0.23783 2348
-1.2522 0.16015 -0.2499 2349
-1.2385 0.15007 -0.25916 2350
-1.2476 0.14069 -0.24668 2351
-1.2377 0.13914 -0.25566 2352
-1.2695 0.12038 -0.22962 2353
-1.2667 0.1005 -0.22591 2354
-1.2635 0.12583 -0.24114 2355
-1.2567 0.11287 -0.2388 2356
-1.2569 0.099099 -0.23575 2357
-1.2483 0.12024 -0.24543 2358
-1.2374 0.11943 -0.25456 2359
-1.2451 0.098897 -0.24865 2360
-1.2373 0.10534 -0.25568 2361
-1.2451 0.24258 -0.26493 2362
-1.2345 0.23771 -0.27296 2363
-1.2422 0.21841 -0.26068 2364
-1.2326 0.22012 -0.2704 2365
-1.2291 0.2411 -0.28519 2366
-1.2259 0.21944 -0.28368 2367
-1.242 0.20902 -0.26076 2368
-1.2341 0.19994 -0.27028 2369
-1.2428 0.17757 -0.2625 2370
-1.2342 0.18056 -0.27183 2371
-1.2259 0.1998 -0.28733 2372
-1.2258 0.18197 -0.28428 2373
-1.243 0.1622 -0.26291 2374
-1.232 0.15958 -0.27212 2375
-1.2332 0.13996 -0.27007 2376
-1.2242 0.15898 -0.28287 2377
-1.2256 0.1402 -0.2846 2378
-1.2338 0.12003 -0.26991 2379
-1.2413 0.093912 -0.26283 2380
-1.2316 0.10067 -0.27072 2381
-1.2257 0.11922 -0.28498 2382
-1.2246 0.10067 -0.28481 2383
-1.2116 0.24236 -0.1842 2384
-1.2186 0.22291 -0.1807 2385
-1.2146 0.23919 -0.29419 2386
-1.2131 0.21944 -0.293 2387
-1.2139 0.20094 -0.29623 2388
-1.2124 0.1793 -0.29332 2389
-1.2071 0.24065 -0.30787 2390
-1.1959 0.23812 -0.31502 2391
-1.2042 0.22067 -0.30585 2392
-1.1965 0.21882 -0.31495 2393
-1.2019 0.24891 -0.32147 2394
-1.1893 0.24182 -0.32671 2395
-1.1887 0.21717 -0.32414 2396
-1.1751 0.23129 -0.3247 2397
-1.1734 0.22257 -0.3233 2398
-1.2045 0.19985 -0.30764 2399
-1.1977 0.19982 -0.31117 2400
-1.2064 0.17976 -0.30973 2401
-1.1997 0.18002 -0.30898 2402
-1.2031 0.19579 -0.329 2403
-1.1969 0.20096 -0.32976 2404
-1.2064 0.18314 -0.32493 2405
-1.1934 0.17811 -0.3313 2406
-1.1738 0.18235 -0.334 2407
-1.2157 0.16085 -0.29228 2408
-1.2181 0.13942 -0.29462 2409
-1.2155 0.12013 -0.29448 2410
-1.2154 0.098802 -0.29447 2411
-1.2107 0.15929 -0.30862 2412
-1.1968 0.16035 -0.31679 2413
-1.2084 0.13953 -0.30943 2414
-1.1995 0.13939 -0.31854 2415
-1.1932 0.15979 -0.32835 2416
-1.1972 0.13915 -0.32829 2417
-1.2085 0.11991 -0.31035 2418
-1.1997 0.12874 -0.31921 2419
-1.2058 0.1001 -0.30963 2420
-1.1997 0.095489 -0.31921 2421
-1.2044 0.11932 -0.32218 2422
-1.1971 0.12024 -0.33014 2423
-1.2028 0.10474 -0.3227 2424
-1.196 0.099957 -0.32672 2425
-1.3008 0.011956 -0.18315 2426
-1.2832 0.086131 -0.19061 2427
-1.277 0.076232 -0.18983 2428
-1.2871 0.051987 -0.18193 2429
-1.2726 0.05992 -0.19044 2430
-1.2823 0.086961 -0.20081 2431
-1.2722 0.079964 -0.2101 2432
-1.2708 0.059978 -0.21009 2433
-1.2864 0.0399 -0.18355 2434
-1.2752 0.039703 -0.19329 2435
-1.2888 0.019936 -0.18706 2436
-1.277 0.022146 -0.19595 2437
-1.2723 0.039549 -0.20981 2438
-1.2737 0.019997 -0.21049 2439
-1.2646 0.079316 -0.22921 2440
-1.2661 0.059781 -0.22807 2441
-1.2587 0.084846 -0.23635 2442
-1.2566 0.058064 -0.23763 2443
-1.2495 0.080538 -0.24792 2444
-1.2328 0.075242 -0.25648 2445
-1.2456 0.059231 -0.24711 2446
-1.2352 0.062358 -0.25634 2447
-1.2679 0.040592 -0.227 2448
-1.2643 0.022078 -0.22376 2449
-1.2528 0.03777 -0.23591 2450
-1.2477 0.019009 -0.23217 2451
-1.2452 0.039821 -0.24971 2452
-1.2385 0.047083 -0.25916 2453
-1.2414 0.021178 -0.24934 2454
-1.2384 0.013481 -0.25366 2455
-1.3008 0.0065672 -0.18311 2456
-1.3015 -0.044853 -0.18206 2457
-1.3005 -0.060679 -0.18214 2458
-1.2894 -0.0010424 -0.18918 2459
-1.2796 5.7058e-05 -0.19733 2460
-1.2864 -0.020571 -0.18962 2461
-1.2798 -0.022883 -0.19864 2462
-1.2766 6.6101e-05 -0.20995 2463
-1.2823 -0.013449 -0.20081 2464
-1.276 -0.020506 -0.20961 2465
-1.2898 -0.039197 -0.18898 2466
-1.278 -0.042114 -0.19728 2467
-1.2898 -0.060185 -0.18865 2468
-1.2783 -0.058922 -0.19583 2469
-1.2733 -0.039613 -0.20947 2470
-1.2735 -0.060318 -0.20965 2471
-1.2671 -0.0036573 -0.2262 2472
-1.2673 -0.020052 -0.22887 2473
-1.2625 -0.016522 -0.24538 2474
-1.2536 0.00302 -0.23245 2475
-1.2594 -0.022262 -0.23791 2476
-1.2491 -0.00087903 -0.24961 2477
-1.2385 0.0070791 -0.25678 2478
-1.2532 -0.0206 -0.25097 2479
-1.2385 -0.028437 -0.25916 2480
-1.2669 -0.039277 -0.22556 2481
-1.2663 -0.060406 -0.2267 2482
-1.2561 -0.041023 -0.23522 2483
-1.2539 -0.058944 -0.23621 2484
-1.2441 -0.039063 -0.24732 2485
-1.2371 -0.041164 -0.25668 2486
-1.2441 -0.060684 -0.24872 2487
-1.2385 -0.054182 -0.25541 2488
-1.2432 0.086432 -0.26405 2489
-1.2299 0.082067 -0.27127 2490
-1.2408 0.050613 -0.26137 2491
-1.2286 0.05737 -0.26886 2492
-1.2257 0.078219 -0.28793 2493
-1.2258 0.060867 -0.28762 2494
-1.2427 0.036194 -0.26306 2495
-1.2337 0.040681 -0.27177 2496
-1.2408 0.022668 -0.26158 2497
-1.2327 0.020002 -0.27066 2498
-1.227 0.039103 -0.28876 2499
-1.2284 0.020226 -0.29004 2500
-1.2266 0.020776 -0.30371 2501
-1.2416 -0.0040766 -0.26131 2502
-1.2333 0.00010337 -0.27079 2503
-1.2421 -0.017427 -0.26088 2504
-1.2305 -0.020531 -0.2706 2505
-1.2253 -0.0001788 -0.2898 2506
-1.2234 -0.016133 -0.28884 2507
-1.2312 -0.03998 -0.26974 2508
-1.2414 -0.064038 -0.26261 2509
-1.2345 -0.059489 -0.27171 2510
-1.2238 -0.046032 -0.28154 2511
-1.2252 -0.060728 -0.28235 2512
-1.2251 0.0054755 -0.3034 2513
-1.2188 0.071671 -0.25926 2514
-1.2176 0.072649 -0.26764 2515
-1.2165 0.066005 -0.27058 2516
-1.218 0.082614 -0.29578 2517
-1.2147 0.056636 -0.29596 2518
-1.2134 0.043863 -0.29643 2519
-1.2065 0.080027 -0.3095 2520
-1.1997 0.08094 -0.31921 2521
-1.2054 0.060446 -0.30971 2522
-1.1997 0.065561 -0.31921 2523
-1.2023 0.079631 -0.33249 2524
-1.1985 0.079125 -0.32888 2525
-1.203 0.056558 -0.32582 2526
-1.1964 0.063056 -0.32993 2527
-1.2059 0.040623 -0.30674 2528
-1.1959 0.037138 -0.31539 2529
-1.211 0.020165 -0.30775 2530
-1.1952 0.019514 -0.31415 2531
-1.2019 0.044028 -0.3323 2532
-1.1935 0.039487 -0.32523 2533
-1.2019 0.015896 -0.33701 2534
-1.1958 0.019371 -0.3277 2535
-1.2182 -0.028391 -0.27898 2536
-1.2199 -0.0065955 -0.29923 2537
-1.2152 -0.024787 -0.2913 2538
-1.2176 -0.034499 -0.27906 2539
-1.2072 -0.039723 -0.28905 2540
-1.1997 -0.044588 -0.29542 2541
-1.2087 -0.059256 -0.28831 2542
-1.1969 -0.06098 -0.29614 2543
-1.2101 -0.0013001 -0.30614 2544
-1.1964 -0.00011118 -0.31481 2545
-1.2095 -0.020496 -0.30749 2546
-1.1974 -0.018806 -0.31675 2547
-1.1919 0.00042732 -0.3279 2548
-1.1891 -0.019022 -0.32504 2549
-1.1706 -0.025064 -0.32719 2550
-1.1571 -0.026568 -0.32712 2551
-1.2053 -0.035484 -0.30753 2552
-1.1941 -0.04219 -0.31262 2553
-1.1879 -0.059889 -0.3096 2554
-1.1853 -0.040716 -0.32545 2555
-1.1854 -0.057994 -0.32599 2556
-1.1767 -0.069093 -0.31734 2557
-1.1738 -0.032809 -0.32641 2558
-1.1772 -0.068065 -0.32527 2559
-1.203 0.20329 -0.34094 2560
-1.1975 0.15838 -0.34103 2561
-1.2026 0.07739 -0.3425 2562
-1.1964 0.073259 -0.34155 2563
-1.1866 0.069778 -0.34039 2564
-1.2026 0.011277 -0.34167 2565
-1.1931 0.008982 -0.34144 2566
-0.98624 0.33418 -0.05341 2567
-1.0423 0.35091 -0.099661 2568
-1.0272 0.35511 -0.097127 2569
-1.0422 0.34144 -0.098866 2570
-1.0314 0.33922 -0.093122 2571
-0.98836 0.35351 -0.074447 2572
-1.0041 0.33466 -0.074384 2573
-0.99171 0.34046 -0.068716 2574
-1.0122 0.35907 -0.090294 2575
-0.99748 0.35518 -0.080861 2576
-1.01 0.34044 -0.084981 2577
-0.99745 0.34605 -0.080721 2578
-0.9651 0.33257 -0.038186 2579
-0.94775 0.336 -0.032117 2580
-0.97437 0.3511 -0.057673 2581
-0.97172 0.34059 -0.050208 2582
-0.95316 0.34106 -0.043542 2583
-0.93819 0.33426 -0.021791 2584
-0.97646 0.35146 -0.06466 2585
-0.97818 0.34683 -0.063613 2586
-1.0022 0.31172 -0.059715 2587
-0.98964 0.3208 -0.053135 2588
-1.0061 0.29795 -0.056895 2589
-0.98827 0.29798 -0.05003 2590
-1.0239 0.27376 -0.058287 2591
-1.0269 0.25622 -0.053047 2592
-1.0007 0.27103 -0.038821 2593
-0.98971 0.27521 -0.035362 2594
-1.0032 0.25726 -0.037817 2595
-0.99238 0.25993 -0.028973 2596
-1.0065 0.27762 -0.052758 2597
-0.9941 0.28203 -0.04532 2598
-1.0097 0.2611 -0.046606 2599
-0.99913 0.2604 -0.041012 2600
-1.0243 0.31291 -0.078952 2601
-1.0274 0.29856 -0.075021 2602
-1.0437 0.31672 -0.09597 2603
-1.0315 0.31964 -0.088942 2604
-1.047 0.29947 -0.09167 2605
-1.0364 0.30211 -0.08222 2606
-1.0085 0.31933 -0.071544 2607
-0.99815 0.32107 -0.063809 2608
-1.0147 0.30201 -0.065925 2609
-1.0165 0.32353 -0.082945 2610
-1.0452 0.27707 -0.07418 2611
-1.0326 0.28085 -0.068349 2612
-1.0492 0.25983 -0.0718 2613
-1.0359 0.26087 -0.062991 2614
-1.0523 0.28239 -0.085869 2615
-1.0581 0.26899 -0.080642 2616
-1.0149 0.28428 -0.06383 2617
-0.96307 0.32085 -0.038086 2618
-0.94976 0.31974 -0.028521 2619
-0.96764 0.29743 -0.031972 2620
-0.95286 0.3041 -0.026695 2621
-0.97214 0.31906 -0.042957 2622
-0.97444 0.30241 -0.044924 2623
-0.9384 0.32855 -0.02132 2624
-0.96977 0.28021 -0.028422 2625
-0.95863 0.2844 -0.020765 2626
-0.97515 0.26656 -0.021677 2627
-1.0429 0.37326 -0.11743 2628
-1.0348 0.37198 -0.11058 2629
-1.0515 0.37531 -0.12696 2630
-1.0481 0.35865 -0.11181 2631
-1.0322 0.36425 -0.1044 2632
-1.0508 0.34081 -0.10725 2633
-1.055 0.36454 -0.12291 2634
-1.0525 0.32221 -0.10257 2635
-1.0568 0.30442 -0.10105 2636
-1.0221 0.23537 -0.037182 2637
-1.0225 0.21933 -0.036662 2638
-1.0463 0.23871 -0.0565 2639
-1.0311 0.24108 -0.047863 2640
-1.0488 0.21838 -0.05359 2641
-1.0308 0.22087 -0.044708 2642
-1.0113 0.23957 -0.030972 2643
-0.99249 0.24383 -0.024568 2644
-1.0134 0.22029 -0.027149 2645
-1.0195 0.24716 -0.040963 2646
-1.0435 0.19487 -0.037856 2647
-1.029 0.19865 -0.031991 2648
-1.0454 0.17878 -0.034406 2649
-1.0346 0.18148 -0.024737 2650
-1.0505 0.20205 -0.046415 2651
-1.0385 0.20787 -0.041317 2652
-1.0547 0.183 -0.042139 2653
-1.0143 0.20238 -0.024985 2654
-1.0544 0.24455 -0.063707 2655
-1.039 0.24972 -0.060466 2656
-1.058 0.2208 -0.060697 2657
-1.0484 0.15982 -0.032285 2658
-1.034 0.16102 -0.022674 2659
-1.0495 0.14044 -0.027031 2660
-1.0376 0.14275 -0.020565 2661
-1.0562 0.1222 -0.022142 2662
-1.0575 0.099806 -0.020998 2663
-1.382 -0.30788 -0.055009 2664
-1.3812 -0.28753 -0.067668 2665
-1.3824 -0.30002 -0.068874 2666
-1.3802 -0.30138 -0.08606 2667
-1.3822 -0.32526 -0.036679 2668
-1.3877 -0.34159 -0.032031 2669
-1.3866 -0.32086 -0.051219 2670
-1.4009 -0.34863 -0.056291 2671
-1.3934 -0.33973 -0.049332 2672
-1.4009 -0.36505 -0.037935 2673
-1.3934 -0.35982 -0.029034 2674
-1.4012 -0.38177 -0.033438 2675
-1.3958 -0.37718 -0.026084 2676
-1.401 -0.36415 -0.048527 2677
-1.3979 -0.35598 -0.050905 2678
-1.4011 -0.38038 -0.04635 2679
-1.3972 -0.38036 -0.0557 2680
-1.3853 -0.32026 -0.069201 2681
-1.4009 -0.34824 -0.063281 2682
-1.3916 -0.33959 -0.070033 2683
-1.3815 -0.32353 -0.082872 2684
-1.3834 -0.34185 -0.082173 2685
-1.4009 -0.35155 -0.063087 2686
-1.3931 -0.36039 -0.070036 2687
-1.3903 -0.37979 -0.06902 2688
-1.3821 -0.35697 -0.081202 2689
-1.3047 -0.083298 -0.096127 2690
-1.3084 -0.10085 -0.093193 2691
-1.3404 -0.14446 -0.098442 2692
-1.3045 -0.12507 -0.076823 2693
-1.3083 -0.14108 -0.072605 2694
-1.3247 -0.12345 -0.095775 2695
-1.3121 -0.11884 -0.08782 2696
-1.3276 -0.14044 -0.091028 2697
-1.3176 -0.13847 -0.08189 2698
-1.2647 -0.10386 -0.055452 2699
-1.2253 -0.083587 -0.037423 2700
-1.2427 -0.10707 -0.038397 2701
-1.2306 -0.10109 -0.032223 2702
-1.2478 -0.082669 -0.0549 2703
-1.2318 -0.0787 -0.046166 2704
-1.2509 -0.098587 -0.047733 2705
-1.2385 -0.091942 -0.042469 2706
-1.263 -0.14744 -0.03733 2707
-1.2687 -0.12075 -0.052475 2708
-1.2849 -0.14443 -0.057793 2709
-1.2711 -0.14011 -0.048938 2710
-1.2449 -0.12042 -0.035872 2711
-1.235 -0.11973 -0.026173 2712
-1.2501 -0.14039 -0.030752 2713
-1.2371 -0.13682 -0.022346 2714
-1.2558 -0.11965 -0.042631 2715
-1.2595 -0.13418 -0.041185 2716
-1.2697 -0.080906 -0.073081 2717
-1.2836 -0.10381 -0.077372 2718
-1.2724 -0.099478 -0.068759 2719
-1.2889 -0.080617 -0.088469 2720
-1.2769 -0.074449 -0.08423 2721
-1.2913 -0.099104 -0.083377 2722
-1.254 -0.078224 -0.063448 2723
-1.2887 -0.11994 -0.07189 2724
-1.2765 -0.11777 -0.064011 2725
-1.2916 -0.1388 -0.063394 2726
-1.279 -0.13099 -0.060846 2727
-1.2957 -0.11191 -0.081245 2728
-1.3012 -0.16812 -0.058894 2729
-1.3049 -0.18205 -0.053924 2730
-1.3418 -0.2273 -0.058874 2731
-1.3016 -0.20546 -0.039372 2732
-1.3065 -0.22209 -0.034558 2733
-1.3219 -0.20672 -0.056612 2734
-1.3116 -0.19994 -0.049433 2735
-1.3272 -0.22128 -0.052421 2736
-1.3148 -0.21763 -0.044154 2737
-1.3404 -0.18403 -0.078937 2738
-1.3438 -0.16371 -0.095143 2739
-1.3487 -0.18024 -0.090473 2740
-1.3246 -0.16614 -0.076602 2741
-1.3096 -0.15906 -0.069328 2742
-1.3287 -0.18054 -0.074662 2743
-1.3132 -0.17926 -0.065479 2744
-1.33 -0.15828 -0.087597 2745
-1.3182 -0.15389 -0.080678 2746
-1.3376 -0.17253 -0.081556 2747
-1.3448 -0.20352 -0.074223 2748
-1.3508 -0.22056 -0.070989 2749
-1.3528 -0.19996 -0.090131 2750
-1.3556 -0.22003 -0.090246 2751
-1.3291 -0.19892 -0.067397 2752
-1.3162 -0.19341 -0.062011 2753
-1.3346 -0.21306 -0.062643 2754
-1.267 -0.1622 -0.031622 2755
-1.2846 -0.18507 -0.03708 2756
-1.2733 -0.17935 -0.028621 2757
-1.2892 -0.16108 -0.054602 2758
-1.2743 -0.1583 -0.045198 2759
-1.2916 -0.17781 -0.045787 2760
-1.279 -0.17176 -0.041348 2761
-1.2557 -0.15528 -0.024957 2762
-1.2891 -0.20121 -0.03243 2763
-1.2774 -0.19746 -0.024056 2764
-1.2906 -0.2183 -0.026099 2765
-1.2798 -0.2103 -0.021273 2766
-1.2956 -0.19279 -0.042005 2767
-1.2968 -0.15648 -0.061094 2768
-1.3232 -0.081117 -0.11455 2769
-1.3155 -0.078942 -0.10513 2770
-1.3238 -0.10029 -0.11246 2771
-1.3176 -0.099098 -0.10231 2772
-1.3264 -0.080086 -0.1305 2773
-1.3253 -0.10022 -0.13039 2774
-1.3407 -0.12668 -0.11405 2775
-1.3407 -0.14073 -0.10858 2776
-1.332 -0.11872 -0.10933 2777
-1.3371 -0.13978 -0.11095 2778
-1.3306 -0.12081 -0.13018 2779
-1.3281 -0.14046 -0.12973 2780
-1.3229 -0.079874 -0.14471 2781
-1.3137 -0.080331 -0.15452 2782
-1.3225 -0.099371 -0.14359 2783
-1.313 -0.10023 -0.15333 2784
-1.3042 -0.081135 -0.1693 2785
-1.3035 -0.1013 -0.16642 2786
-1.3226 -0.12011 -0.14462 2787
-1.316 -0.11961 -0.15368 2788
-1.3217 -0.13814 -0.144 2789
-1.3161 -0.14125 -0.15307 2790
-1.3064 -0.12132 -0.16761 2791
-1.3074 -0.14045 -0.16918 2792
-1.2971 -0.074169 -0.17726 2793
-1.2959 -0.098802 -0.17536 2794
-1.2951 -0.11805 -0.17666 2795
-1.2949 -0.13575 -0.17881 2796
-1.343 -0.16087 -0.10909 2797
-1.3479 -0.18008 -0.11042 2798
-1.3404 -0.16638 -0.12073 2799
-1.3421 -0.18165 -0.12425 2800
-1.3376 -0.15288 -0.11641 2801
-1.3285 -0.16011 -0.13005 2802
-1.3187 -0.16917 -0.13888 2803
-1.3314 -0.17888 -0.13327 2804
-1.3485 -0.20052 -0.11017 2805
-1.3492 -0.22059 -0.11015 2806
-1.3424 -0.19986 -0.12911 2807
-1.3414 -0.22102 -0.12763 2808
-1.3372 -0.20129 -0.13376 2809
-1.3345 -0.21852 -0.13426 2810
-1.3214 -0.15777 -0.14196 2811
-1.3148 -0.1602 -0.15146 2812
-1.3238 -0.18214 -0.14544 2813
-1.3166 -0.17823 -0.15392 2814
-1.3045 -0.15945 -0.16862 2815
-1.3074 -0.18045 -0.16864 2816
-1.3404 -0.19982 -0.14117 2817
-1.3265 -0.20013 -0.14811 2818
-1.3184 -0.19992 -0.15804 2819
-1.3248 -0.22 -0.14856 2820
-1.3184 -0.2208 -0.15814 2821
-1.3102 -0.20017 -0.1698 2822
-1.3111 -0.22013 -0.16986 2823
-1.2968 -0.16315 -0.17745 2824
-1.2959 -0.17607 -0.1781 2825
-1.2104 -0.079969 -0.029686 2826
-1.198 -0.079054 -0.021875 2827
-1.2123 -0.097293 -0.024256 2828
-1.1991 -0.091931 -0.020347 2829
-1.2188 -0.071901 -0.041371 2830
-1.3441 -0.26619 -0.036778 2831
-1.3476 -0.24215 -0.053601 2832
-1.3636 -0.26616 -0.05651 2833
-1.3521 -0.25924 -0.049258 2834
-1.325 -0.24335 -0.036806 2835
-1.3106 -0.23982 -0.028141 2836
-1.3289 -0.25916 -0.032002 2837
-1.3145 -0.25863 -0.022946 2838
-1.3306 -0.23822 -0.044586 2839
-1.3369 -0.25258 -0.041214 2840
-1.3502 -0.2816 -0.032542 2841
-1.3645 -0.30384 -0.036189 2842
-1.3553 -0.29827 -0.027698 2843
-1.3675 -0.28123 -0.05198 2844
-1.3584 -0.27655 -0.043466 2845
-1.3713 -0.29862 -0.049787 2846
-1.3307 -0.27602 -0.023691 2847
-1.3187 -0.27152 -0.020091 2848
-1.365 -0.2431 -0.073913 2849
-1.3572 -0.23803 -0.066408 2850
-1.3669 -0.26012 -0.070752 2851
-1.3594 -0.2539 -0.060653 2852
-1.3631 -0.241 -0.08409 2853
-1.3576 -0.23981 -0.092402 2854
-1.3644 -0.26113 -0.085765 2855
-1.3586 -0.25945 -0.095265 2856
-1.3735 -0.2786 -0.070718 2857
-1.3766 -0.29858 -0.072615 2858
-1.3675 -0.28072 -0.088264 2859
-1.3599 -0.27972 -0.098058 2860
-1.3712 -0.3002 -0.088618 2861
-1.3599 -0.29952 -0.09868 2862
-1.297 -0.23246 -0.022008 2863
-1.3693 -0.31995 -0.030027 2864
-1.3589 -0.31693 -0.022587 2865
-1.3722 -0.33635 -0.023381 2866
-1.3748 -0.31324 -0.042701 2867
-1.3772 -0.31335 -0.076526 2868
-1.3708 -0.31922 -0.090407 2869
-1.3593 -0.32044 -0.099167 2870
-1.369 -0.33998 -0.09069 2871
-1.3585 -0.33877 -0.098978 2872
-1.3772 -0.38282 -0.078244 2873
-1.3699 -0.36049 -0.090009 2874
-1.36 -0.35447 -0.099881 2875
-1.3682 -0.37898 -0.08811 2876
-1.3593 -0.38267 -0.097445 2877
-1.3498 -0.24035 -0.11049 2878
-1.3495 -0.2601 -0.11032 2879
-1.3442 -0.24 -0.1265 2880
-1.3411 -0.26107 -0.12187 2881
-1.3342 -0.24229 -0.13473 2882
-1.3319 -0.25947 -0.13143 2883
-1.3523 -0.28007 -0.11065 2884
-1.3529 -0.30004 -0.11058 2885
-1.3431 -0.28106 -0.12532 2886
-1.3444 -0.2999 -0.12679 2887
-1.3343 -0.2789 -0.13429 2888
-1.3338 -0.3002 -0.13587 2889
-1.3247 -0.23847 -0.14469 2890
-1.3159 -0.24166 -0.15406 2891
-1.3235 -0.26145 -0.14446 2892
-1.3161 -0.25875 -0.15373 2893
-1.3099 -0.24003 -0.16985 2894
-1.3099 -0.26001 -0.16994 2895
-1.3244 -0.28009 -0.14719 2896
-1.3177 -0.28012 -0.15737 2897
-1.3253 -0.29925 -0.1447 2898
-1.317 -0.30095 -0.15438 2899
-1.3105 -0.28007 -0.16996 2900
-1.3076 -0.2996 -0.16653 2901
-1.2967 -0.28293 -0.1797 2902
-1.294 -0.30078 -0.17613 2903
-1.3514 -0.3197 -0.11033 2904
-1.3545 -0.33998 -0.1108 2905
-1.3445 -0.31919 -0.12564 2906
-1.345 -0.33969 -0.12566 2907
-1.3333 -0.32094 -0.13462 2908
-1.3328 -0.34098 -0.13495 2909
-1.3628 -0.3656 -0.10072 2910
-1.3563 -0.36022 -0.11131 2911
-1.354 -0.38021 -0.11074 2912
-1.3447 -0.35984 -0.12508 2913
-1.3446 -0.37838 -0.12352 2914
-1.3319 -0.3607 -0.13449 2915
-1.3288 -0.38019 -0.13094 2916
-1.3171 -0.38435 -0.1368 2917
-1.3253 -0.31964 -0.14395 2918
-1.3132 -0.32026 -0.15433 2919
-1.3239 -0.34 -0.14454 2920
-1.3119 -0.33968 -0.15434 2921
-1.3022 -0.31829 -0.16467 2922
-1.3015 -0.34261 -0.16201 2923
-1.3256 -0.36114 -0.1471 2924
-1.3136 -0.35966 -0.15682 2925
-1.3226 -0.37299 -0.14423 2926
-1.3127 -0.38061 -0.1505 2927
-1.3029 -0.36365 -0.16746 2928
-1.3038 -0.37928 -0.16734 2929
-1.2951 -0.33187 -0.15913 2930
-1.2926 -0.32194 -0.17279 2931
-1.2873 -0.33947 -0.16973 2932
-1.279 -0.34046 -0.17747 2933
-1.2925 -0.35656 -0.17308 2934
-1.2915 -0.38073 -0.17439 2935
-1.2766 -0.3841 -0.17799 2936
-1.3015 -0.081469 -0.18376 2937
-1.3012 -0.14829 -0.18091 2938
-1.2905 -0.079765 -0.19201 2939
-1.2798 -0.071245 -0.19758 2940
-1.2874 -0.099075 -0.18896 2941
-1.2795 -0.10803 -0.19338 2942
-1.2845 -0.08477 -0.20284 2943
-1.2732 -0.079476 -0.21108 2944
-1.286 -0.096525 -0.20421 2945
-1.2767 -0.10143 -0.21215 2946
-1.2853 -0.12017 -0.18276 2947
-1.2782 -0.1201 -0.19267 2948
-1.2873 -0.14182 -0.18739 2949
-1.2791 -0.13585 -0.19425 2950
-1.2741 -0.12021 -0.21003 2951
-1.2823 -0.14852 -0.20081 2952
-1.274 -0.14031 -0.20984 2953
-1.2652 -0.079883 -0.22688 2954
-1.2647 -0.099911 -0.22456 2955
-1.2566 -0.081636 -0.23597 2956
-1.254 -0.10012 -0.23417 2957
-1.249 -0.0797 -0.24923 2958
-1.2448 -0.10018 -0.24935 2959
-1.2385 -0.10854 -0.25859 2960
-1.266 -0.11988 -0.22528 2961
-1.2658 -0.14025 -0.22709 2962
-1.2536 -0.11988 -0.2349 2963
-1.2566 -0.13914 -0.23668 2964
-1.2427 -0.11768 -0.24597 2965
-1.2358 -0.12244 -0.25335 2966
-1.2458 -0.14028 -0.24314 2967
-1.2344 -0.14018 -0.25309 2968
-1.3003 -0.15239 -0.18019 2969
-1.301 -0.18718 -0.18073 2970
-1.3023 -0.20196 -0.18633 2971
-1.3021 -0.21799 -0.18257 2972
-1.2912 -0.15995 -0.19007 2973
-1.2884 -0.17946 -0.19042 2974
-1.2843 -0.1611 -0.20422 2975
-1.2772 -0.16016 -0.21336 2976
-1.2823 -0.17847 -0.20132 2977
-1.2755 -0.18028 -0.21072 2978
-1.2942 -0.19833 -0.19454 2979
-1.2894 -0.21986 -0.19159 2980
-1.2798 -0.22686 -0.19805 2981
-1.2867 -0.20133 -0.20223 2982
-1.276 -0.20013 -0.21177 2983
-1.2829 -0.21371 -0.2018 2984
-1.2716 -0.22031 -0.21 2985
-1.2588 -0.22953 -0.21893 2986
-1.2694 -0.16071 -0.22966 2987
-1.2672 -0.17887 -0.2268 2988
-1.2625 -0.16721 -0.24144 2989
-1.2588 -0.15696 -0.23847 2990
-1.2522 -0.18277 -0.2354 2991
-1.2492 -0.15939 -0.24354 2992
-1.2313 -0.16056 -0.25279 2993
-1.2462 -0.17712 -0.24197 2994
-1.2321 -0.18036 -0.25092 2995
-1.2661 -0.20053 -0.22386 2996
-1.2651 -0.21588 -0.22172 2997
-1.2518 -0.19994 -0.23404 2998
-1.2385 -0.19664 -0.23856 2999
-1.2513 -0.21986 -0.22913 3000
-1.2364 -0.22416 -0.23574 3001
-1.2438 -0.20114 -0.24241 3002
-1.2289 -0.20057 -0.2494 3003
-1.2408 -0.22355 -0.2513 3004
-1.2345 -0.22025 -0.2492 3005
-1.2436 -0.079552 -0.26196 3006
-1.2352 -0.080678 -0.27219 3007
-1.2428 -0.097213 -0.26179 3008
-1.232 -0.10015 -0.27037 3009
-1.2256 -0.079472 -0.28365 3010
-1.2237 -0.092167 -0.2817 3011
-1.2265 -0.12111 -0.26637 3012
-1.226 -0.13951 -0.26873 3013
-1.2227 -0.12779 -0.28246 3014
-1.2232 -0.13514 -0.28233 3015
-1.2251 -0.15665 -0.26379 3016
-1.2244 -0.18145 -0.27134 3017
-1.2232 -0.18603 -0.28356 3018
-1.2248 -0.20055 -0.27225 3019
-1.2408 -0.22453 -0.26223 3020
-1.2301 -0.21988 -0.26891 3021
-1.2245 -0.19244 -0.28112 3022
-1.2199 -0.1641 -0.25781 3023
-1.2176 -0.1759 -0.25846 3024
-1.2185 -0.19744 -0.25402 3025
-1.2147 -0.10439 -0.27786 3026
-1.2097 -0.08038 -0.2888 3027
-1.196 -0.079495 -0.29566 3028
-1.2063 -0.099632 -0.28504 3029
-1.1962 -0.10109 -0.29488 3030
-1.2169 -0.11725 -0.27356 3031
-1.2122 -0.14646 -0.27609 3032
-1.2097 -0.11967 -0.28599 3033
-1.1932 -0.11964 -0.29481 3034
-1.2102 -0.13896 -0.28522 3035
-1.1959 -0.14068 -0.29285 3036
-1.1865 -0.080123 -0.30526 3037
-1.187 -0.10124 -0.30631 3038
-1.182 -0.076516 -0.33486 3039
-1.1836 -0.10612 -0.32727 3040
-1.1726 -0.080515 -0.31418 3041
-1.1742 -0.096652 -0.31298 3042
-1.1726 -0.079709 -0.32583 3043
-1.1754 -0.096292 -0.32545 3044
-1.1902 -0.12022 -0.31026 3045
-1.1948 -0.14056 -0.31093 3046
-1.1865 -0.11983 -0.32444 3047
-1.1865 -0.13879 -0.32348 3048
-1.178 -0.11031 -0.30691 3049
-1.1723 -0.12136 -0.32771 3050
-1.1591 -0.12621 -0.32609 3051
-1.1737 -0.14042 -0.32637 3052
-1.1591 -0.13317 -0.32877 3053
-1.2106 -0.16028 -0.27127 3054
-1.1995 -0.1572 -0.27677 3055
-1.2164 -0.17883 -0.2678 3056
-1.2051 -0.16658 -0.28767 3057
-1.1977 -0.15776 -0.29152 3058
-1.2128 -0.17969 -0.28909 3059
-1.1959 -0.18058 -0.29694 3060
-1.2172 -0.19889 -0.26918 3061
-1.2123 -0.21978 -0.27746 3062
-1.1958 -0.21951 -0.27895 3063
-1.2087 -0.19862 -0.28357 3064
-1.192 -0.19958 -0.29197 3065
-1.205 -0.21804 -0.28323 3066
-1.1964 -0.21694 -0.28632 3067
-1.1889 -0.15992 -0.30922 3068
-1.1899 -0.17907 -0.30773 3069
-1.1869 -0.15988 -0.32374 3070
-1.1906 -0.17302 -0.32127 3071
-1.1766 -0.15703 -0.31502 3072
-1.1764 -0.15499 -0.3232 3073
-1.1888 -0.19309 -0.3038 3074
-1.3031 -0.24014 -0.18338 3075
-1.303 -0.25945 -0.18257 3076
-1.3012 -0.27491 -0.18171 3077
-1.2891 -0.23998 -0.1922 3078
-1.2793 -0.24569 -0.1976 3079
-1.2889 -0.26022 -0.18751 3080
-1.276 -0.25986 -0.19515 3081
-1.2704 -0.24023 -0.20853 3082
-1.2701 -0.25896 -0.20803 3083
-1.2558 -0.23742 -0.21821 3084
-1.256 -0.26365 -0.21399 3085
-1.2915 -0.28141 -0.18957 3086
-1.2754 -0.27444 -0.19714 3087
-1.2856 -0.2973 -0.18649 3088
-1.2759 -0.30162 -0.19423 3089
-1.2842 -0.28667 -0.202 3090
-1.2706 -0.28198 -0.20676 3091
-1.2719 -0.30055 -0.20992 3092
-1.2564 -0.27811 -0.21529 3093
-1.2646 -0.26586 -0.22301 3094
-1.245 -0.2409 -0.22316 3095
-1.2361 -0.23882 -0.23243 3096
-1.2483 -0.25987 -0.23015 3097
-1.2408 -0.24241 -0.249 3098
-1.2357 -0.24061 -0.2506 3099
-1.2425 -0.25761 -0.24273 3100
-1.2304 -0.26055 -0.25109 3101
-1.2628 -0.27968 -0.22542 3102
-1.2659 -0.29981 -0.22536 3103
-1.2506 -0.27948 -0.2314 3104
-1.2361 -0.27507 -0.23982 3105
-1.2529 -0.30112 -0.23467 3106
-1.2366 -0.3091 -0.23752 3107
-1.2432 -0.28225 -0.24034 3108
-1.2291 -0.27866 -0.24904 3109
-1.2444 -0.29989 -0.24442 3110
-1.2364 -0.29653 -0.24729 3111
-1.3003 -0.36743 -0.18319 3112
-1.2857 -0.3201 -0.18382 3113
-1.2759 -0.31998 -0.19346 3114
-1.2832 -0.34167 -0.18495 3115
-1.2783 -0.339 -0.19074 3116
-1.2686 -0.31954 -0.20978 3117
-1.2708 -0.33983 -0.20706 3118
-1.2585 -0.32564 -0.21762 3119
-1.2512 -0.34122 -0.21545 3120
-1.2888 -0.36064 -0.18744 3121
-1.2744 -0.36132 -0.1956 3122
-1.2859 -0.372 -0.18325 3123
-1.2695 -0.37937 -0.18994 3124
-1.2665 -0.36004 -0.20484 3125
-1.2667 -0.37531 -0.20426 3126
-1.2579 -0.35795 -0.21298 3127
-1.26 -0.38167 -0.20081 3128
-1.2644 -0.31374 -0.22299 3129
-1.252 -0.32012 -0.22888 3130
-1.2377 -0.31144 -0.2367 3131
-1.2484 -0.33518 -0.22393 3132
-1.2408 -0.31395 -0.24074 3133
-1.2373 -0.31134 -0.24091 3134
-1.2504 -0.35102 -0.22006 3135
-1.23 -0.23874 -0.26728 3136
-1.2238 -0.25603 -0.26726 3137
-1.2268 -0.246 -0.28265 3138
-1.2291 -0.25137 -0.28105 3139
-1.225 -0.27501 -0.26197 3140
-1.2188 -0.26361 -0.25673 3141
-1.217 -0.24064 -0.2742 3142
-1.1997 -0.23205 -0.27765 3143
-1.2161 -0.25953 -0.26671 3144
-1.2105 -0.23613 -0.2815 3145
-1.1975 -0.23218 -0.28156 3146
-1.2181 -0.27174 -0.26637 3147
-1.4072 -0.39971 -0.030793 3148
-1.3979 -0.39051 -0.021298 3149
-1.4125 -0.42003 -0.030317 3150
-1.4018 -0.40015 -0.04575 3151
-1.3978 -0.39997 -0.055267 3152
-1.4028 -0.41991 -0.048442 3153
-1.3979 -0.41942 -0.055426 3154
-1.4119 -0.44023 -0.030432 3155
-1.4107 -0.45976 -0.030318 3156
-1.4027 -0.43929 -0.047076 3157
-1.3979 -0.44062 -0.055977 3158
-1.4023 -0.46079 -0.04792 3159
-1.3979 -0.45952 -0.056078 3160
-1.3917 -0.40033 -0.068918 3161
-1.4009 -0.42118 -0.062292 3162
-1.394 -0.42048 -0.070469 3163
-1.3802 -0.40658 -0.080322 3164
-1.381 -0.42053 -0.081671 3165
-1.4009 -0.43018 -0.060174 3166
-1.3914 -0.43949 -0.069142 3167
-1.4009 -0.45995 -0.060174 3168
-1.3927 -0.4606 -0.070037 3169
-1.3814 -0.4405 -0.081945 3170
-1.3824 -0.45581 -0.081691 3171
-1.4114 -0.48002 -0.0301 3172
-1.4139 -0.4996 -0.030213 3173
-1.4028 -0.48004 -0.047282 3174
-1.3964 -0.48263 -0.057107 3175
-1.4052 -0.50048 -0.047393 3176
-1.3943 -0.50044 -0.056913 3177
-1.425 -0.52156 -0.026489 3178
-1.4248 -0.53403 -0.022145 3179
-1.414 -0.52054 -0.03416 3180
-1.3979 -0.52903 -0.038734 3181
-1.4084 -0.54049 -0.030071 3182
-1.3979 -0.5329 -0.038734 3183
-1.406 -0.51609 -0.04434 3184
-1.3887 -0.52007 -0.051188 3185
-1.4009 -0.54667 -0.040759 3186
-1.3883 -0.5388 -0.050452 3187
-1.3898 -0.47862 -0.065799 3188
-1.3841 -0.5 -0.063669 3189
-1.3834 -0.51906 -0.068539 3190
-1.3864 -0.53968 -0.070527 3191
-1.3816 -0.52765 -0.082799 3192
-1.3852 -0.53992 -0.084375 3193
-1.4067 -0.55969 -0.029835 3194
-1.4019 -0.55829 -0.042218 3195
-1.3942 -0.55738 -0.051912 3196
-1.3887 -0.55581 -0.070456 3197
-1.3839 -0.55209 -0.081363 3198
-1.3772 -0.39618 -0.078244 3199
-1.3689 -0.40012 -0.087287 3200
-1.3587 -0.39848 -0.097511 3201
-1.3688 -0.42006 -0.09088 3202
-1.3586 -0.42211 -0.099188 3203
-1.3743 -0.46867 -0.078553 3204
-1.3682 -0.43943 -0.089595 3205
-1.3588 -0.44017 -0.097586 3206
-1.368 -0.45881 -0.087809 3207
-1.355 -0.46344 -0.094108 3208
-1.3769 -0.52153 -0.053594 3209
-1.3693 -0.48028 -0.073557 3210
-1.3593 -0.48363 -0.078478 3211
-1.37 -0.49956 -0.072732 3212
-1.3594 -0.49241 -0.078361 3213
-1.3635 -0.47161 -0.081717 3214
-1.3533 -0.47973 -0.089952 3215
-1.3645 -0.50432 -0.086361 3216
-1.3575 -0.49861 -0.093134 3217
-1.3751 -0.51773 -0.07071 3218
-1.3765 -0.53587 -0.06612 3219
-1.3679 -0.51943 -0.088846 3220
-1.3543 -0.52055 -0.097221 3221
-1.3701 -0.54103 -0.088785 3222
-1.3511 -0.53837 -0.09403 3223
-1.3502 -0.39909 -0.10936 3224
-1.3492 -0.42018 -0.10701 3225
-1.3418 -0.39063 -0.12086 3226
-1.3309 -0.4036 -0.11763 3227
-1.3314 -0.41702 -0.11597 3228
-1.3245 -0.39832 -0.12408 3229
-1.3169 -0.40121 -0.13315 3230
-1.3253 -0.42344 -0.12722 3231
-1.3172 -0.41683 -0.13329 3232
-1.3494 -0.44012 -0.10979 3233
-1.3467 -0.4594 -0.10689 3234
-1.3404 -0.46825 -0.12073 3235
-1.3369 -0.44142 -0.11795 3236
-1.3348 -0.45838 -0.11583 3237
-1.3288 -0.44 -0.12939 3238
-1.3173 -0.44925 -0.13874 3239
-1.3281 -0.45868 -0.12718 3240
-1.317 -0.46044 -0.13558 3241
-1.3116 -0.40067 -0.15018 3242
-1.3214 -0.42864 -0.14375 3243
-1.3112 -0.41949 -0.14877 3244
-1.3049 -0.39987 -0.16438 3245
-1.3029 -0.4109 -0.16069 3246
-1.3216 -0.43797 -0.14273 3247
-1.3083 -0.44106 -0.1493 3248
-1.3087 -0.46003 -0.14921 3249
-1.3028 -0.44558 -0.16601 3250
-1.3074 -0.45556 -0.1637 3251
-1.2922 -0.42011 -0.15744 3252
-1.2897 -0.40231 -0.17068 3253
-1.2785 -0.39834 -0.17699 3254
-1.2867 -0.41931 -0.16908 3255
-1.2798 -0.41627 -0.17581 3256
-1.2956 -0.4339 -0.15685 3257
-1.2948 -0.43596 -0.16725 3258
-1.3465 -0.48053 -0.10969 3259
-1.3498 -0.49945 -0.10595 3260
-1.3404 -0.47289 -0.12073 3261
-1.3351 -0.48483 -0.11824 3262
-1.3295 -0.49974 -0.11464 3263
-1.3275 -0.48022 -0.12482 3264
-1.3154 -0.48122 -0.1346 3265
-1.3215 -0.49999 -0.12247 3266
-1.3135 -0.49731 -0.12986 3267
-1.3472 -0.52091 -0.10505 3268
-1.3426 -0.53358 -0.10365 3269
-1.341 -0.52661 -0.12376 3270
-1.3303 -0.52087 -0.11442 3271
-1.3187 -0.52737 -0.11421 3272
-1.3325 -0.53567 -0.10789 3273
-1.3305 -0.5197 -0.1233 3274
-1.3187 -0.51183 -0.12701 3275
-1.309 -0.47678 -0.14544 3276
-1.3714 -0.55417 -0.079815 3277
-1.3703 -0.552 -0.083352 3278
-1.2823 -0.40621 -0.18304 3279
-1.2731 -0.39812 -0.18668 3280
-1.2844 -0.41563 -0.18321 3281
-1.2798 -0.41073 -0.18623 3282
+1.068 0.094720997 -0.016231 -0.33680952 -0.5904243 -0.73345655 0.021525998
+1.061 -0.028772 0.060295001 -0.56758565 -0.38228491 -0.72918081 0.0050898455
+1.0623 -0.040527001 0.061046999 -0.55886567 -0.084654853 -0.8249259 0.000421467
+1.0662 -0.062633999 0.068122998 -0.64745134 -0.36214662 -0.67056441 0.0028368302
+1.1409 0.01096 -0.018963 -0.59129852 -0.30371472 -0.74707657 0.0058283354
+1.061 0.010928 0.04118 -0.49607444 -0.29880989 -0.81524402 0.004465431
+1.0669 0.033427 0.023452999 -0.42345393 -0.53327352 -0.73232925 0.0046825605
+1.082 0.014063 0.023212001 -0.62366515 -0.33702326 -0.70530635 0.0011787268
+1.0702 0.019919001 0.029893 -0.53319526 -0.43594223 -0.72502226 0.00070771371
+1.1021 0.054651 -0.017556001 -0.55292827 -0.42033359 -0.7194373 0.00096826366
+1.0659 0.071941003 0.0028285 -0.4502984 -0.52064472 -0.72536922 0.003078921
+1.0809 0.05108 0.0025063001 -0.57215309 -0.39516228 -0.71867067 0.0011595576
+1.0709 0.059696 0.0061206999 -0.54420036 -0.37263849 -0.75165582 7.220581e-05
+1.0842 0.075448997 -0.015663 -0.58270401 -0.49464083 -0.64481509 0.00042408847
+1.072 0.080562003 -0.0087110996 -0.50513911 -0.53149116 -0.67996436 0.0031810345
+1.0897 0.060123999 -0.0098444996 -0.60166568 -0.42191342 -0.67822373 0.00019676136
+1.0777 0.06397 -0.0014249 -0.58595997 -0.44162574 -0.67942441 0.00010943217
+1.104 0.015911 0.0042436998 -0.58750647 -0.38657412 -0.71091247 0.00079923787
+1.1224 0.033959001 -0.01819 -0.53125936 -0.46843943 -0.70592344 0.0017374299
+1.1066999 0.039092001 -0.012226 -0.51467884 -0.42831802 -0.74273098 0.0011337942
+1.1289001 0.016783001 -0.012605 -0.557836 -0.39243373 -0.73131037 0.0017936839
+1.1102 0.023018001 -0.0053673 -0.56485015 -0.43261439 -0.70270127 0
+1.086 0.036915001 0.0076210001 -0.56743491 -0.41624865 -0.71046096 0.0010416841
+1.0721 0.042877 0.012893 -0.43541691 -0.44516245 -0.7824592 0.0061351527
+1.0904 0.021268001 0.011994 -0.58540106 -0.39743719 -0.7066465 7.6441356e-06
+1.0782 0.025799001 0.019187 -0.55574745 -0.4330337 -0.70966649 0.00093032821
+1.0943 0.042442001 -0.0038091 -0.60040617 -0.40753239 -0.68806237 0
+1.0985 0.029584 9.9195004e-06 -0.59424943 -0.41279042 -0.69026929 0.00041982034
+1.142 -0.0023401999 -0.018045999 -0.61674958 -0.22413947 -0.75457358 0.0023465897
+1.1478 -0.021856001 -0.014969 -0.56236899 -0.28779712 -0.77518642 0
+1.1856 -0.062748 -0.018533999 -0.43275625 -0.32629526 -0.84038883 0.0020460589
+1.1493 -0.063353002 0.0074649001 -0.5570181 -0.56051922 -0.61282057 0.0090720542
+1.1665 -0.042291999 -0.017585 -0.43404731 -0.41620278 -0.79898572 0
+1.1494 -0.040617999 -0.0091634002 -0.4584479 -0.30880135 -0.83334696 0.0011132527
+1.1676 -0.061432 -0.011532 -0.43051493 -0.32892233 -0.84051597 0.0013592446
+1.1537 -0.057022002 -0.0043619 -0.51321554 -0.49958739 -0.69786978 0.015350549
+1.1014 -0.027495001 0.022228001 -0.6234324 -0.33749777 -0.70528531 0.00065429934
+1.0626 -0.0052578002 0.043081 -0.60392046 -0.25279889 -0.7558921 0.0097488333
+1.0671999 -0.021360001 0.048121002 -0.69650578 -0.40483004 -0.59244603 0.0073208394
+1.087 -0.00081265997 0.025093 -0.59047568 -0.21829462 -0.77697229 0.0012344209
+1.0709 0.00044475001 0.034975 -0.56945843 -0.12500916 -0.81245905 0.00096120179
+1.0908 -0.020546 0.027144 -0.50667858 -0.41621971 -0.75500858 0.0011378102
+1.0743001 -0.018846 0.036212001 -0.61764997 -0.24766958 -0.74643707 0.0077825733
+1.1016999 -0.063915998 0.042505998 -0.61395168 -0.2425078 -0.75116801 0.0038044997
+1.104 -0.042854998 0.02706 -0.61849153 -0.42329445 -0.66203475 0.0019651481
+1.1276 -0.062217001 0.024982 -0.83422047 -0.14980352 -0.53069311 0
+1.1101 -0.058921002 0.034150001 -0.54563153 -0.46125486 -0.69966435 0.0016377554
+1.0871 -0.04335 0.045152001 -0.57436401 -0.48740557 -0.65767908 0.010484132
+1.0728 -0.038084999 0.052866001 -0.63274181 -0.44730332 -0.63210571 0.018474381
+1.0914 -0.059409 0.048675999 -0.49329123 -0.28231719 -0.82277632 0.0055620791
+1.0736001 -0.059556998 0.056855001 -0.56530398 -0.21531714 -0.79628509 0.0162104
+1.094 -0.037783999 0.034306999 -0.53393513 -0.44211641 -0.72072631 0.01014529
+1.0774 -0.031207001 0.038330998 -0.6047222 -0.51497024 -0.60754973 0.011375685
+1.0976 -0.051061999 0.038798999 -0.61170083 -0.40786082 -0.67784339 0.0025704585
+1.1232001 -0.0020357999 0.0025811 -0.54907882 -0.22713426 -0.80431485 0.0093031414
+1.1077 -0.00012923 0.0087363003 -0.44239262 -0.37983769 -0.81241137 0.0011667114
+1.1244 -0.021017 0.0039363001 -0.59602761 -0.027351856 -0.80249792 0.0050539547
+1.1088001 -0.020044999 0.012842 -0.54204196 -0.26378 -0.79787886 0.0014189287
+1.1317 0.00025424 -0.0080263996 -0.69583249 -0.19899411 -0.69008583 0.0048956918
+1.1327 -0.018340999 -0.0053476002 -0.61631423 -0.20427024 -0.76054615 0.00084424886
+1.0944999 0.0011787 0.016736999 -0.58666283 -0.21547769 -0.78063828 0.0020659934
+1.0980999 -0.015196 0.019032 -0.62041163 -0.26047981 -0.73975646 0.0016615307
+1.13 -0.040987 0.0073197 -0.58971387 -0.43742615 -0.67889315 0.013689078
+1.1125 -0.038116001 0.016526001 -0.55696833 -0.33787239 -0.75870192 0.0022550342
+1.1337 -0.056479 0.013774 -0.60443169 -0.53516471 -0.59013653 0.013789672
+1.1365 -0.036846999 -0.0021230001 -0.61366194 -0.26254499 -0.74464029 0.0053218957
+1.1389 -0.051403001 1.0284e-05 -0.57767451 -0.46565101 -0.6704188 0.013134298
+0.74673003 0.25701001 0.16494 -0.52100813 0.55673403 0.64699137 0.10840169
+0.76289999 0.25156 0.14072999 -0.42080948 -0.35860467 -0.83326 0.012832491
+0.74469 0.25782001 0.14775001 -0.70902693 -0.55449039 -0.43568474 0.15468958
+0.92979002 0.33306 -0.017008999 -0.42214379 -0.39182347 -0.81747717 0.0027091834
+0.91725999 0.33081001 -0.010164 -0.3907772 -0.36596724 -0.84460711 0
+0.98108 0.25211999 -0.019026 -0.50716633 -0.24987562 -0.82483006 0.0015082328
+0.90456998 0.27610001 0.024551 -0.58263665 -0.35210577 -0.73249984 0.0024255302
+0.92383999 0.25338 0.023125 -0.53842127 -0.39937061 -0.74202812 0.0072095729
+0.90859997 0.2595 0.027814001 -0.49196556 -0.40865976 -0.76874381 0.0065098736
+0.94318998 0.31865999 -0.017085999 -0.64447254 -0.26286641 -0.71802253 0.011990944
+0.94678003 0.29662001 -0.014948 -0.61542952 -0.34273529 -0.70977396 0.002508183
+0.90535998 0.31729999 0.0032577 -0.54748809 -0.33572647 -0.76651448 0
+0.92364001 0.29438999 0.0024726 -0.53724468 -0.33880511 -0.77238536 0.0046784477
+0.90802002 0.29982999 0.0089948997 -0.51491153 -0.35992789 -0.77802187 0.00084486452
+0.93080997 0.31933999 -0.011485 -0.42312041 -0.32534593 -0.84564722 0.0020444705
+0.91333997 0.32153001 -0.0044181999 -0.44767255 -0.32905135 -0.83145326 0.0027411822
+0.93261999 0.30131 -0.0072094002 -0.51257533 -0.28747383 -0.80908918 0.0030520144
+0.91693997 0.30566999 -0.0002747 -0.50186002 -0.3700608 -0.78178746 0.00095530588
+0.94528002 0.25779 0.0047022002 -0.57028633 -0.38419861 -0.72606122 0.0071208682
+0.96474999 0.27394 -0.016069001 -0.54220551 -0.45832506 -0.70423812 0.0057876981
+0.94878 0.28018001 -0.011602 -0.47948918 -0.32269451 -0.81606281 0.005277887
+0.96789002 0.25882 -0.012856 -0.52979988 -0.24672833 -0.81144148 0.0015694362
+0.95197999 0.26164001 -0.0037316 -0.50639725 -0.4185555 -0.7539053 0.0051609105
+0.92719001 0.27803999 0.0069554001 -0.59203476 -0.36877081 -0.71659118 0.0070396052
+0.91110998 0.28255001 0.014668 -0.54225999 -0.34607184 -0.76562941 0.0038678383
+0.93248999 0.26098999 0.012278 -0.53964603 -0.38617888 -0.74809629 0.010218983
+0.91513002 0.26585001 0.018064 -0.51143402 -0.40409586 -0.75838107 0.0065215393
+0.93479002 0.28058001 -0.0028270001 -0.60377711 -0.27210844 -0.74927318 0.002865812
+0.93839997 0.26872 -0.00051226001 -0.55742157 -0.43774548 -0.70545024 0.0047093262
+0.83186001 0.29516 0.069306001 -0.75653249 -0.30529299 -0.57832068 0.017747067
+0.86271 0.27307001 0.062647998 -0.59066594 -0.56409127 -0.57698774 0.022596592
+0.86633998 0.25949001 0.063345 -0.52048475 -0.13110948 -0.84374523 0.0043593105
+0.82431 0.27506 0.082850002 -0.58636481 -0.36033306 -0.72549057 0.0026085319
+0.84109998 0.25170001 0.080439001 -0.57019681 -0.34263608 -0.7466433 0.0024405071
+0.82906002 0.25940999 0.087909997 -0.58010483 -0.33038685 -0.74452859 0.0022745337
+0.85009003 0.27733999 0.066816002 -0.42188004 -0.56022364 -0.71285808 0.044803113
+0.83354998 0.28237 0.072351001 -0.56521863 -0.39465237 -0.72441518 0.042394768
+0.84877998 0.25861999 0.072071001 -0.44695625 -0.28494745 -0.84795934 0.0014082565
+0.83534998 0.2638 0.077587999 -0.58716208 -0.35483274 -0.72755367 0.0028441488
+0.80423999 0.29027 0.10032 -0.76287496 0.18181401 -0.62045586 0.012759911
+0.78662997 0.25488999 0.12305 -0.57477087 -0.33130985 -0.74824607 0.0090483744
+0.80078 0.28325999 0.10122 -0.68265617 0.27403158 -0.67741209 0.00015177089
+0.79153001 0.27737001 0.1082 -0.49392909 -0.19315977 -0.84777558 0.019967778
+0.80488002 0.25740001 0.10549 -0.58716279 -0.38219103 -0.7135613 0.0014672367
+0.79295999 0.26194 0.11322 -0.54471534 -0.35244778 -0.76096374 0.0088054407
+0.76543999 0.27263001 0.1247 -0.55489093 -0.40805852 -0.72497195 0.0034833953
+0.75752002 0.27182999 0.13378 -0.5358575 -0.42720747 -0.7282517 0.0094579272
+0.76991999 0.25993001 0.1304 -0.51524711 -0.47325748 -0.71452618 0.0035780724
+0.75449002 0.26480001 0.13709 -0.36112395 -0.52930093 -0.76774341 0.01688518
+0.77468002 0.27507001 0.11753 -0.46709657 -0.29797384 -0.83248568 0.00069717981
+0.77867001 0.26420999 0.11979 -0.49000162 -0.48978567 -0.72111613 0.0022192069
+0.81173003 0.29165 0.085980996 -0.82085282 0.039919473 -0.56974304 0.0080483221
+0.81941003 0.29460999 0.079499997 -0.6307016 -0.059800066 -0.77371788 0
+0.80985999 0.28055999 0.091029003 -0.64502341 -0.20416357 -0.73638451 0.02444235
+0.79904002 0.27541 0.099368997 -0.60248196 -0.19398107 -0.7742008 0.02356044
+0.81373 0.26266 0.096556999 -0.51318914 -0.34786969 -0.78461683 0.0012580848
+0.86807001 0.31200001 0.042219002 -0.56893456 0.15641819 -0.80737036 0.0012187917
+0.86353999 0.30012 0.042371001 -0.39527023 -0.043046881 -0.91755569 0.0069019375
+0.88545001 0.31499001 0.026802 -0.77183807 -0.23170041 -0.59209877 0.0055783135
+0.87533998 0.31307 0.036568999 -0.58662844 0.037627473 -0.80898166 0.0056345216
+0.88676 0.29909 0.028000001 -0.63986528 -0.17361452 -0.74861908 0.0079915756
+0.87176001 0.30052 0.037353002 -0.55227679 -0.053942651 -0.83191383 0.011830366
+0.84851998 0.29784 0.049224999 -0.45365956 -0.21231343 -0.86551493 0.0031476121
+0.83815998 0.29686001 0.057266001 -0.68776619 -0.22351559 -0.69066525 0.030557677
+0.88194001 0.27410999 0.042194001 -0.61320156 -0.33886668 -0.71354979 0.0026981714
+0.86900002 0.27757999 0.048873 -0.4836008 -0.52336448 -0.7015838 0.021671534
+0.88336003 0.25915 0.04532 -0.67701244 -0.26123196 -0.68804944 0.00097790489
+0.87479001 0.26063001 0.054836001 -0.68954962 -0.30814478 -0.65541446 0.0053647486
+0.88941002 0.28112999 0.031667002 -0.56477892 -0.34186617 -0.75110066 0.0028414498
+0.87614 0.28716999 0.039140999 -0.53988534 -0.33045474 -0.77415979 0.0015915543
+0.89341998 0.26100001 0.036456998 -0.55563056 -0.20366748 -0.80609822 0.0012807442
+0.85137999 0.28365001 0.052894998 -0.46050996 -0.62148416 -0.63378865 0.023977956
+0.83823001 0.28678 0.057905 -0.61197495 -0.51269108 -0.60219139 0.036313441
+0.89257002 0.31601 0.012645 -0.74483067 -0.16446711 -0.64666665 0.014053172
+0.89512998 0.30208999 0.016856 -0.6908825 -0.30031279 -0.6576423 0.011617791
+0.89977002 0.28922001 0.019959999 -0.58658558 -0.36168718 -0.72463763 0.0025670568
+0.72319001 0.25343999 0.20703 -0.55039895 0.16146702 0.81913942 0.00060161139
+0.71587002 0.25231999 0.2031 -0.76121956 0.10020757 0.64070529 0.013710982
+0.70708001 0.25277999 0.18971001 -0.91889143 0.028148288 0.39350513 0.007330657
+0.73914999 0.2538 0.16083001 -0.77393186 0.29252279 0.56165826 0.083648056
+0.70336002 0.25227001 0.17578 -0.88884711 0.090832472 0.44911051 0.025761725
+0.73409998 0.25714001 0.15096 -0.80815309 0.46845037 0.35699126 0.060356759
+0.69870001 0.25141999 0.16732 -0.70090824 0.18861815 0.68785965 0.023143329
+0.73859 0.26596001 0.1388 -0.12707418 -0.77693158 -0.61662757 0
+0.74564999 0.1992 0.23275 nan nan nan nan
+0.77108002 0.11231 0.22121 -0.99619251 0.054300647 -0.068205789 0.03419235
+0.76696002 0.097684003 0.22287001 -0.99225658 0.079246625 -0.095639579 0.012511455
+0.75572997 0.23191001 0.18015 -0.68513376 0.16658865 0.70911205 0.0021139258
+0.76370001 0.21371999 0.18628 -0.43534935 0.22394392 0.87196338 0
+0.75498998 0.21428999 0.18178999 -0.70348012 0.049912158 0.70896006 0.028241869
+0.76012999 0.19271 0.19068 -0.49813244 0.21762532 0.83934695 0
+0.75184 0.19908001 0.18412 -0.78835821 0.18926361 0.58538085 0.033342496
+0.74965 0.17907 0.18801001 -0.89588869 0.35141501 0.27182886 0.079320356
+0.78197002 0.21946 0.14047 -0.5001018 -0.09174224 -0.86109328 0.022521462
+0.74778003 0.24028 0.16884001 -0.70502007 0.11367635 0.70001745 0.0032140093
+0.76012999 0.21009 0.16065 -0.4445484 -0.52766734 -0.72383958 0.022896338
+0.74510998 0.22047 0.17248 -0.66444093 0.20172878 0.71959972 0.0037204993
+0.76586002 0.23929 0.14494 -0.43229285 -0.15625787 -0.88809139 0.016801648
+0.74852997 0.24135 0.14801 -0.31112233 -0.36050513 -0.87934005 0.021328798
+0.76819003 0.21863 0.14607 -0.49317762 -0.35793597 -0.79287928 0.032003783
+0.75498003 0.21832 0.15231 -0.099616028 -0.74807179 -0.65609854 0.043822147
+0.78509998 0.19142 0.1605 -0.49638298 -0.4823254 -0.72177982 0.04126386
+0.78245997 0.17883 0.16361 -0.63860542 0.1454231 -0.7556687 0.022351351
+0.78830999 0.19676 0.14745 -0.58836019 -0.59412014 -0.54850119 0.029902713
+0.80469 0.17507 0.14263 -0.62788761 -0.43156695 -0.64769369 0.00072129944
+0.79189003 0.18012001 0.15063 -0.74579632 -0.2186812 -0.62925863 0.012940519
+0.76410002 0.19848 0.16263001 -0.45564336 -0.58273524 -0.67291075 0.041686803
+0.74870998 0.19923 0.17078 -0.83100307 0.52755547 -0.17640626 0.2491418
+0.77047998 0.18035001 0.16838001 -0.38108718 -0.14602235 -0.91293478 0.00016602944
+0.75038999 0.18111999 0.17287 -0.37843832 0.30334339 0.87450975 0.13401882
+0.77016997 0.2022 0.15270001 -0.45328397 -0.65248221 -0.60728949 0.024278864
+0.75397998 0.20943999 0.1557 -0.44384104 -0.52794617 -0.72407043 0.023058245
+0.82506001 0.1534 0.14193 -0.58747894 -0.42359111 -0.6895209 0.0062664906
+0.82840002 0.13847999 0.14490999 -0.52523357 -0.35321614 -0.77418864 0.0084761605
+0.86162001 0.098261997 0.14183 -0.67929232 -0.27266532 -0.68133366 0.011165475
+0.82463002 0.097425997 0.16518 -0.58303976 -0.24749304 -0.77382934 0.0013893476
+0.84820998 0.11752 0.14411999 -0.57404637 -0.38094422 -0.72481191 0.00775328
+0.83099002 0.12053 0.15187 -0.46879825 -0.42876768 -0.77226061 0.0042425417
+0.85123003 0.099671997 0.14722 -0.63657504 -0.30133596 -0.70990771 0.0070042289
+0.83275998 0.10081 0.1556 -0.66496289 -0.31545317 -0.67698866 0.00055533572
+0.78062999 0.13083 0.18122 -0.56024003 -0.40595087 -0.72203529 0.0021937469
+0.76227999 0.15526 0.20309 -0.5319733 0.34720266 0.77230477 0.00033542045
+0.75814003 0.15228 0.20095 -0.70968926 0.20035073 0.6754263 0.018626822
+0.76012999 0.14899001 0.20438001 -0.60262978 0.38526776 0.69886065 0
+0.75318998 0.14029001 0.20344 -0.78557175 0.45094758 0.42370197 0.0029746317
+0.76817 0.15413 0.18103001 -0.73036337 -0.20593439 -0.65127599 0.0013808846
+0.74873 0.16034 0.19137999 -0.63486356 0.29158083 0.71549201 0.067135304
+0.76971 0.13844 0.183 -0.61731559 -0.34160042 -0.7086823 0.0088280467
+0.74708998 0.14033 0.19062001 -0.69922531 0.38035023 0.60532439 0.017993895
+0.78074998 0.097424001 0.20209 -0.73838878 -0.20251676 -0.64324874 0.068726152
+0.78191 0.11925 0.18610001 -0.62741846 -0.13038841 -0.7676881 0.0061939107
+0.80263001 0.095576003 0.18273 -0.53412491 -0.42296222 -0.7319929 0.01765259
+0.78748 0.098232999 0.19129001 -0.57995063 -0.51154506 -0.634018 0.03178269
+0.76687998 0.11386 0.21689001 -0.76198775 -0.17005651 0.62486428 0.065349184
+0.75243002 0.11865 0.20508 -0.63028187 0.20080535 0.74994802 0.0015535713
+0.76937997 0.098612003 0.21072 -0.073773459 0.47431666 -0.8772577 0.13299701
+0.75066 0.099527001 0.20759 -0.39624804 0.16358282 0.90345341 0.021452565
+0.77489001 0.12077 0.1895 -0.33880496 -0.26904666 -0.90156811 0.012505848
+0.74413002 0.12066 0.19571 -0.61403525 0.14061527 0.77665186 0.0048072375
+0.77718002 0.10615 0.18881001 -0.71658444 -0.41392335 -0.56140381 0.030261125
+0.74225003 0.10228 0.19858 -0.57146633 0.27898508 0.77174705 0.0029626749
+0.78274 0.15761 0.16197 -0.5881238 -0.31346864 -0.745552 0.0049512316
+0.80346 0.13499001 0.16407 -0.53300995 -0.43321607 -0.72679043 0.0032412615
+0.78806001 0.13947 0.16982 -0.46900594 -0.53180158 -0.70513862 0.00077321462
+0.80956 0.15973 0.1479 -0.47993043 -0.46032357 -0.74683934 0.005261024
+0.79163998 0.16226 0.15625 -0.43327001 -0.25963819 -0.86305571 0
+0.81037998 0.14034 0.15334 -0.48156101 -0.43639413 -0.76003885 0.0054698954
+0.79707003 0.14702 0.15800001 -0.50516069 -0.43420103 -0.74584323 0.0049727587
+0.77384001 0.16004001 0.17156 -0.74563646 -0.25219989 -0.61678314 0
+0.75024998 0.16663 0.17524 -0.79775292 0.49534333 0.34383881 0.12428398
+0.77635998 0.14459001 0.1749 -0.6301133 -0.36462969 -0.68556714 0.007280028
+0.81013 0.11967 0.16482 -0.52544373 -0.24384016 -0.81513852 0.0009527884
+0.79351997 0.11988 0.17454 -0.56665158 -0.13067481 -0.81352937 0.0071891313
+0.81079 0.10095 0.17269 -0.47783843 -0.3827208 -0.79069287 0.016688989
+0.79246998 0.10745 0.17664 -0.50626892 -0.4014723 -0.76322454 0.019261338
+0.81686997 0.12422 0.15797 -0.52098393 -0.40430483 -0.75174022 0.0045390646
+0.90227002 0.039726999 0.14089 -0.5371803 -0.26836112 -0.7996372 0.0082781715
+0.92010999 0.013941 0.14027999 -0.56798011 -0.324182 -0.75650823 0.010028656
+0.90649998 0.016599 0.1446 -0.4990117 -0.42664564 -0.75429487 0.0069962125
+0.90636998 -0.062481001 0.18435 -0.57835376 -0.39476597 -0.71390939 0.0091323741
+0.94549 -0.026781 0.14144 -0.31897223 -0.3736788 -0.87098843 0.0062945983
+0.90214998 -0.0056495001 0.16215999 -0.57359332 -0.3031525 -0.76097912 0.0049410798
+0.90467 -0.022622 0.16381 -0.55407381 -0.29864979 -0.77705252 0.0057567954
+0.92254001 -0.0035534 0.14311001 -0.62582797 -0.29917485 -0.72030115 0.0071890778
+0.90837002 0.00037995999 0.15129 -0.59550399 -0.39823875 -0.69769686 0.0021167044
+0.92682999 -0.020415001 0.14803 -0.64915162 -0.27551407 -0.70900929 0.0039277854
+0.91398001 -0.018842001 0.15741999 -0.56235176 -0.19710706 -0.80306244 0.00062634255
+0.94853997 -0.041044001 0.14309999 -0.37650943 -0.11699798 -0.9189952 0.001350765
+0.96205002 -0.066633999 0.14303 -0.59780866 -0.40025625 -0.6945644 0.0046840115
+0.95016998 -0.060263999 0.14910001 -0.52917027 -0.40510619 -0.74556553 0.00042076359
+0.92268997 -0.044612002 0.16294 -0.60259473 -0.36916599 -0.70752811 0.0017490532
+0.90943003 -0.039593 0.17044 -0.52623439 -0.39600009 -0.75250334 0.0034484451
+0.92535001 -0.061503999 0.16699 -0.63165367 -0.33330724 -0.69994283 0.00084734603
+0.91518003 -0.057388 0.17541 -0.54596943 -0.36397535 -0.75461203 0.0062177386
+0.93101001 -0.039448 0.15277 -0.58894092 -0.38581514 -0.71013749 0.0031062807
+0.91557997 -0.031174 0.15925001 -0.55257004 -0.36278111 -0.75037074 0.00292524
+0.93528998 -0.056417 0.15672 -0.55984092 -0.33167249 -0.75932306 0.0015785691
+0.76542002 0.079609998 0.22675 -0.60661584 0.18889685 0.77222741 5.5474709e-05
+0.75818002 0.075364999 0.22163001 -0.66651756 0.20165859 0.71769643 0.0020160261
+0.7658 0.060662001 0.23103 -0.62061578 0.043538388 -0.78290516 0.12070439
+0.75555003 0.059043001 0.22281 0.12437542 0.22125924 -0.9672513 0.19110593
+0.80110002 0.035503 0.22093999 -0.58884668 -0.28685743 -0.75562721 0.044049066
+0.79237002 0.038107999 0.22272 -0.60544169 -0.23690708 -0.75981271 0.059676036
+0.80568999 0.014161 0.22143 -0.55875117 -0.33926198 -0.75676847 0.011556867
+0.79113001 0.019200001 0.22696 -0.54577833 -0.26605657 -0.79456902 0.014466011
+0.77078003 0.036068998 0.24098 -0.92475182 -0.036858164 0.37878153 0.021300653
+0.76789999 0.02813 0.24052 -0.65475535 0.090298139 0.7504276 0.06246797
+0.76558 0.038304001 0.23342 -0.53701168 0.5167405 0.6667816 0.10638596
+0.75432998 0.039430998 0.22656 -0.28846949 0.49886692 0.81726199 0.046340398
+0.76723999 0.02303 0.23233999 -0.65464324 0.09019918 0.7505374 0.062628955
+0.75585002 0.020266 0.23141 -0.47493085 0.2021801 0.85648352 0.032476131
+0.82045001 -0.022249 0.22059 -0.39217529 -0.11871412 -0.91219813 0.099605568
+0.86456001 -0.067295998 0.22046 -0.44164407 -0.36841854 -0.81805766 0.018315352
+0.82565999 -0.048087001 0.24253 -0.7255401 -0.12614584 -0.67651963 0.020285277
+0.84165001 -0.069481 0.24029 -0.53736508 -0.42876297 -0.72622389 0.017605796
+0.82440001 -0.060377002 0.24307001 -0.51240158 -0.35892105 -0.78014117 0.036181208
+0.84283 -0.044771999 0.2216 -0.58174294 -0.37354404 -0.72252345 0.0063048028
+0.83090001 -0.044985 0.22964001 -0.69206983 -0.39550489 -0.60383385 0.019339824
+0.84595001 -0.063977003 0.22677 -0.57654709 -0.48485303 -0.6576556 0.025271351
+0.83345997 -0.056960002 0.23299 -0.62642145 -0.41044977 -0.6626668 0.021274088
+0.78561997 -0.0071568 0.24098 -0.18859164 -0.56166655 -0.80558294 0.00046663926
+0.80469 -0.021887001 0.24314 -0.73710042 -0.15588656 -0.6575579 0.02282867
+0.79679 -0.017781001 0.24538 -0.30686924 -0.5285942 -0.79146659 0.0045672837
+0.80754 -0.0019453 0.22606 -0.69349521 -0.27167961 -0.667274 0.014244695
+0.79228997 0.0010492 0.23356999 -0.30552146 -0.43711621 -0.84592324 0.017831683
+0.81090999 -0.020269999 0.23006 -0.83348304 -0.14882641 -0.53212458 0.030632332
+0.79833001 -0.010586 0.23954 -0.52901375 -0.50653601 -0.68085659 0.019092754
+0.77464002 0.0037626999 0.23521 -0.1642248 -0.58469546 -0.79445672 0
+0.74852002 0.0066546001 0.23192 0.19091517 -0.13913748 -0.97169554 1.2720314e-05
+0.80567998 -0.041586 0.24440999 -0.76667774 0.041977584 -0.64065838 0.043525416
+0.79663002 -0.038284 0.24672 -0.76673275 0.041985285 -0.64059204 0.043550499
+0.81536001 -0.060144 0.24984001 -0.54073679 -0.18461385 -0.82068354 0.0071062511
+0.80971998 -0.036231 0.23249 -0.89753735 0.063068002 -0.43640491 0.029415542
+0.82832998 0.057712 0.18434 -0.54156554 -0.36836919 -0.75565255 0.010137107
+0.82740003 0.015239 0.20621 -0.60210079 -0.52200949 -0.60413641 0.0067602838
+0.84214997 0.032228 0.18111999 -0.49869201 -0.38632542 -0.77592462 0.00080509443
+0.82876003 0.039193001 0.18756001 -0.55123234 -0.26306295 -0.79179585 0.0037107677
+0.84893 0.018499 0.18546 -0.53807127 -0.34189457 -0.77044618 0.0033435952
+0.83187997 0.021382 0.19372 -0.5165953 -0.46298438 -0.7202602 0.0078655025
+0.86264002 0.051325999 0.16140001 -0.46723884 -0.43271497 -0.77100295 0.0029091225
+0.86449999 0.077556998 0.14811 -0.64825273 -0.4208647 -0.63454014 0.0051811496
+0.88651001 0.055314999 0.14291 -0.40366599 -0.35901326 -0.84152442 0.0023688809
+0.86878997 0.060219999 0.15121999 -0.64091939 -0.34140685 -0.68750548 0.00093267683
+0.8423 0.075797997 0.16075 -0.44300383 -0.35193136 -0.82455558 0.004507435
+0.82878 0.078252003 0.16655999 -0.54260772 -0.32697901 -0.77373224 0.0040092776
+0.84727001 0.05562 0.1655 -0.46656853 -0.42283732 -0.77686703 0.0024832459
+0.83437002 0.062454 0.17202 -0.57830471 -0.41390881 -0.70302439 0.0077444189
+0.85153002 0.082639001 0.15459999 -0.42643487 -0.29855835 -0.85382444 0.001636566
+0.83609003 0.087518997 0.15852 -0.46109909 -0.29616597 -0.83646482 0.0078665596
+0.85044003 0.065825 0.15910999 -0.33675417 -0.30692568 -0.89016479 0.002265054
+0.86677003 0.038364999 0.16523001 -0.52820688 -0.37017393 -0.76417851 0.0034906797
+0.88541001 0.013662 0.16399001 -0.54637611 -0.42388281 -0.72235489 0.0037455063
+0.87146997 0.020323999 0.17068 -0.50896364 -0.3782725 -0.77321792 0.0033577296
+0.88823998 0.038630001 0.14714 -0.49863091 -0.30199492 -0.81250614 0.0025549701
+0.87489998 0.042247999 0.15597001 -0.59376174 -0.36685932 -0.71614331 0.00082221738
+0.89073002 0.02128 0.15246999 -0.55327147 -0.43982366 -0.70742202 0.0030349477
+0.87913001 0.026417 0.15961 -0.60495317 -0.38306141 -0.69806558 0.0019342924
+0.84948999 0.040727001 0.1733 -0.45204434 -0.4014124 -0.79657012 0.0020686684
+0.83757001 0.046261001 0.17817999 -0.60699964 -0.33523974 -0.72053152 0.0074947323
+0.85451001 0.023793999 0.17794 -0.46732175 -0.32990256 -0.82022846 0.005358628
+0.78489 0.077899002 0.20341 -0.46890447 -0.43433693 -0.7690773 0.0065684519
+0.80136001 0.053323001 0.20093 -0.57838196 -0.48445424 -0.65633714 0.0030542857
+0.78911 0.059211001 0.20845 -0.52151847 -0.39419651 -0.75672168 0.012493757
+0.80812001 0.078176998 0.18356 -0.57831562 -0.31521395 -0.75245684 0.0029223326
+0.79338998 0.081065997 0.19295 -0.6114558 -0.30199635 -0.73138225 0.0017768355
+0.80980998 0.060070999 0.19114999 -0.45044163 -0.40764076 -0.79431188 0.0036329292
+0.79762 0.063919999 0.19656999 -0.58448792 -0.38416749 -0.71469522 0.0022602242
+0.77114999 0.080659002 0.20676 -0.51831925 -0.12922207 -0.84536785 0.012981099
+0.75028998 0.079218 0.21108 -0.59427071 0.17764559 0.7844007 0.006293484
+0.77278 0.063216999 0.21375 -0.49692214 -0.37460455 -0.78277689 0.06935893
+0.74694002 0.061050002 0.21505 -0.62344658 0.23476557 0.74578786 0.0023827855
+0.80747002 0.037641 0.20957001 -0.66541368 -0.38041395 -0.64226925 0.025118224
+0.79462999 0.046411999 0.21246 -0.57037556 -0.56736475 -0.5939436 0.0044622822
+0.81238002 0.022218 0.21166 -0.6178624 -0.34223297 -0.70790023 0.035660099
+0.79685003 0.023492999 0.21866 -0.57348704 -0.1986897 -0.79475462 0.025411341
+0.81454998 0.042199001 0.19657999 -0.62445825 -0.39168853 -0.67574549 0.0089921346
+0.81897998 0.027731 0.19807 -0.62509149 -0.43952262 -0.64504308 0.011022672
+0.76911002 0.049492002 0.21798 -0.51425958 -0.22661272 -0.82715398 0.14028265
+0.74291003 0.042585 0.21787 -0.51552606 0.25613222 0.81769747 0.0002735474
+0.81614 0.082220003 0.17472 -0.58264917 -0.28268963 -0.76197541 0.0027491893
+0.81941003 0.069762997 0.17942999 -0.52646339 -0.47009188 -0.7084136 0.0058718137
+0.87090999 -0.0045890999 0.18499 -0.48991939 -0.33915845 -0.80308819 0.030307081
+0.88533998 -0.027333001 0.18195 -0.52135926 -0.41973841 -0.74296981 0.0048208777
+0.86985999 -0.020174 0.18886 -0.51327997 -0.28759211 -0.80860025 0.010526536
+0.84198999 -0.0049867998 0.20514999 -0.67656505 -0.37507188 -0.63370407 0.0040880325
+0.83170003 0.0022783999 0.20767 -0.45438436 -0.30289674 -0.83772808 0.013825565
+0.8459 -0.021048 0.20705999 -0.57004058 -0.28718206 -0.76979232 0.0094441706
+0.82962 -0.021087 0.21563999 -0.37468737 -0.44408214 -0.81387985 0.0031175152
+0.8488 0.00074560998 0.19159999 -0.66920936 -0.32116887 -0.67008162 0.0042916466
+0.83846998 0.0067751999 0.19848 -0.66635376 -0.46818754 -0.58032155 0.0030287111
+0.85275 -0.017782999 0.19753 -0.60288662 -0.33846766 -0.72247303 0.00950923
+0.86502999 -0.043908 0.20328 -0.51892656 -0.49638236 -0.69593084 0.0011943004
+0.88217998 -0.064176001 0.20326 -0.56588614 -0.30059409 -0.76773441 0.005108003
+0.87243003 -0.060314 0.21054 -0.5854457 -0.39457935 -0.70820934 0.0099528506
+0.88696998 -0.041230001 0.18686999 -0.57071048 -0.32605651 -0.75364232 0.0020918532
+0.87164003 -0.037376001 0.19519 -0.48797861 -0.38747069 -0.78214025 0.0015941332
+0.89393002 -0.058842 0.19371 -0.5681352 -0.39162973 -0.72377384 0.007755002
+0.87795001 -0.052607 0.19935 -0.50818962 -0.46252367 -0.72650886 0.0017664349
+0.85062999 -0.039384998 0.2113 -0.56180829 -0.35209405 -0.74859947 0.0057412502
+0.83361 -0.032962002 0.21867999 -0.50175822 -0.48357216 -0.71721447 0.0017763261
+0.85112 -0.055379 0.21630999 -0.49445671 -0.36335891 -0.78960931 0.019376392
+0.85828 -0.031006999 0.19925 -0.54299319 -0.37225491 -0.75271809 0.0037306871
+0.88815999 -0.00073397002 0.16801 -0.51219916 -0.30309772 -0.80360669 0.0012170663
+0.87445998 0.0029096 0.17639001 -0.47038904 -0.41283497 -0.77993685 0.011685177
+0.89069003 -0.018674999 0.17273 -0.52641189 -0.31820387 -0.78843951 0.0076479614
+0.87638003 -0.019309999 0.17996 -0.58031958 -0.23643383 -0.77931267 0.01864814
+0.8987 0.0061824 0.15876 -0.56273717 -0.43661064 -0.7019245 0.00388753
+0.85940999 0.0070654 0.17986 -0.45204398 -0.40054098 -0.79700887 0.010555314
+0.89714003 -0.037902001 0.17837 -0.54501921 -0.26274055 -0.79619187 0.0015952943
+0.89977002 -0.050586998 0.17957 -0.54953462 -0.41240793 -0.7265889 0.0052274968
+0.81523001 -0.00070112001 0.21552999 -0.5567134 -0.079224378 -0.82691818 0.011738827
+0.81656998 -0.016588001 0.21707 -0.59051526 -0.12292344 -0.79760987 0.056741022
+0.81291002 -0.031617001 0.21901 -0.90520746 0.12897851 -0.40492475 0.047675859
+0.90596002 0.19622999 0.061746001 -0.46507499 -0.42042476 -0.77906889 0.0019336628
+0.92198998 0.17671999 0.062867001 -0.51714247 -0.26051626 -0.81528825 0.0036572379
+0.90964001 0.17941 0.067477003 -0.39420941 -0.37381297 -0.8395611 7.8233919e-05
+0.90428001 0.11766 0.10303 -0.51816738 -0.27400497 -0.81019992 0.0037008626
+0.9059 0.098650999 0.10587 -0.56326902 -0.25221956 -0.78683752 0.0058304113
+0.94239998 0.13601001 0.061338 -0.6389184 -0.31683481 -0.7009986 0.0029040687
+0.90309 0.1541 0.082957998 -0.62745965 -0.48970202 -0.60538113 0.0018094556
+0.92150003 0.13332 0.083369002 -0.63833541 -0.39117041 -0.66295826 0.0076375967
+0.90878999 0.1398 0.087707996 -0.51295674 -0.45730114 -0.72646475 0.0058090142
+0.92426997 0.15892 0.064410001 -0.51569664 -0.19022588 -0.83538681 0.0053532203
+0.90878999 0.15927 0.073376 -0.51484424 -0.41679955 -0.74914193 0.005787821
+0.92925 0.13913999 0.069514997 -0.5851509 -0.35430121 -0.72943068 0.011268549
+0.91474998 0.14506 0.076324999 -0.5946157 -0.51077354 -0.62092072 0.0031816131
+0.94274002 0.091499001 0.081795998 -0.53071952 -0.49744722 -0.6862092 0.001980525
+0.94714999 0.11812 0.065240003 -0.5830434 -0.33380875 -0.74069703 0.0033279292
+0.96600002 0.096087001 0.064113997 -0.56945777 -0.36293879 -0.73755908 0.0061227954
+0.94977999 0.099893004 0.070483997 -0.45893478 -0.41813269 -0.78392845 0.0038495564
+0.92352003 0.11954 0.085124999 -0.71288526 -0.1556747 -0.68378359 0.00079720246
+0.91294003 0.12052 0.094613001 -0.5908764 -0.24280359 -0.76935792 0.0040516104
+0.92704999 0.099252999 0.088688999 -0.53644782 -0.47766408 -0.69574475 0.0068122311
+0.91417998 0.10101 0.097953998 -0.61100644 -0.21133514 -0.76289487 0.00034061115
+0.93251002 0.12159 0.073982 -0.66206801 -0.23277505 -0.71237749 0.0086725131
+0.93444997 0.10318 0.076958999 -0.56326622 -0.37679788 -0.73536021 0.0090391859
+1.0015 0.23168001 -0.019421 -0.48473206 -0.35153261 -0.80091172 0.0092782537
+0.98855001 0.23287 -0.015467 -0.3754428 -0.40421301 -0.83405906 0.0081368238
+1.0038 0.22137 -0.018746 -0.51487517 -0.24144921 -0.82256049 0.009865433
+0.99049997 0.21890999 -0.010685 -0.47387826 -0.16507708 -0.86497915 0.0046478924
+1.025 0.17814 -0.014894 -0.58602446 0.043545283 -0.80912244 0.0061416551
+0.98108 0.19230001 0.0013684999 -0.55881625 -0.46597728 -0.6859954 0.0026258673
+1.0015 0.17200001 0.0013969 -0.58999228 -0.2732808 -0.75975448 0.013236515
+0.98912001 0.17885 0.0072863 -0.53961849 -0.43308923 -0.72197348 0.0049493834
+1.0053999 0.19642 -0.018421 -0.43961868 -0.53677064 -0.72014785 0.0040879743
+0.99019003 0.19981 -0.0088034002 -0.58153826 -0.21125394 -0.78561127 0.0066166366
+1.0113 0.18079001 -0.0077757002 -0.39004141 -0.54826784 -0.73977709 0.0020043156
+0.99379998 0.1859 -0.0033950999 -0.44606307 -0.49608782 -0.74493259 0.0036595666
+0.94247001 0.23149 0.021429 -0.60616559 -0.43644759 -0.6648885 0.00992247
+0.94551998 0.21855 0.024068 -0.60395247 -0.18027925 -0.77636385 0.0095124701
+0.90513003 0.23767 0.043531999 -0.52786136 -0.36420909 -0.76727706 0.0011126621
+0.92075998 0.21435 0.042054001 -0.60402668 -0.39344376 -0.69307566 0.0055364212
+0.90982997 0.22014 0.04823 -0.51597214 -0.35427761 -0.77991027 0.0020281195
+0.92650998 0.23873 0.026326001 -0.54489708 -0.34369028 -0.76482958 0.0066286903
+0.91329002 0.24164 0.035354 -0.53255004 -0.37715349 -0.75772405 0.0028560665
+0.92809999 0.22044 0.032820001 -0.52504838 -0.30932605 -0.79286927 0.0035431923
+0.91702002 0.22735 0.038524002 -0.58983117 -0.33717889 -0.73376393 0.00031845688
+0.94199997 0.19176 0.041664999 -0.65990955 -0.4292312 -0.61666846 0.011036621
+0.94401002 0.17761999 0.043063998 -0.66818225 -0.28747082 -0.68621641 0.0031731855
+0.94598001 0.19777 0.027478 -0.61805934 -0.46604592 -0.63309079 0.015454342
+0.96794999 0.17738999 0.025118001 -0.55815756 -0.40118721 -0.72629809 0.0022736681
+0.95085001 0.18178999 0.033197001 -0.6032936 -0.44472411 -0.66201001 0.015898354
+0.92881 0.19736999 0.047702 -0.53634542 -0.45562124 -0.71045262 0.0067827692
+0.91298002 0.20295 0.053886 -0.45365724 -0.42205831 -0.78489614 0.0020308236
+0.93264002 0.18049 0.052496001 -0.61928761 -0.23413196 -0.74944311 0.0034294729
+0.91622001 0.18974 0.059687 -0.44840553 -0.41186532 -0.793284 0.00053273578
+0.93295002 0.20297 0.035386 -0.64998561 -0.48450637 -0.58546758 0.0089890193
+0.96139002 0.23241 0.0013411 -0.5611881 -0.34664214 -0.75160301 0.0027351291
+0.94910002 0.23853 0.0081839003 -0.60092157 -0.31766188 -0.73347402 0.0085145431
+0.96679002 0.21819 0.0041684001 -0.51576149 -0.36125189 -0.77684426 0.00048227055
+0.95178998 0.2208 0.013357 -0.66753453 -0.28793079 -0.68665385 0.006257866
+0.96877998 0.23985 -0.0091514001 -0.53242779 -0.31002483 -0.7876581 0.0039971778
+0.95850003 0.24450999 -0.00037122 -0.62580925 -0.30471817 -0.71798992 0.0011672711
+0.97487003 0.22236 -0.0026389 -0.49294233 -0.42391521 -0.75980502 0.0010307756
+0.93528003 0.24222 0.015902 -0.59216499 -0.37421712 -0.7136541 0.0088039264
+0.96928 0.19855 0.008959 -0.58027035 -0.43176082 -0.69055694 0.0018855608
+0.95550001 0.20336001 0.016988 -0.63452238 -0.24928881 -0.73159862 0.0069477051
+0.97460002 0.18302 0.014547 -0.57536846 -0.46072638 -0.6757828 0.0038297672
+0.97911 0.20096 8.8410998e-06 -0.61658025 -0.25858539 -0.74361444 0
+0.98602003 0.15587001 0.022802001 -0.61998576 -0.394743 -0.67808235 0.0037022231
+1.0033 0.13226999 0.021699 -0.62301028 -0.47829184 -0.61894673 0.0025431882
+0.98991001 0.13907 0.026684999 -0.54149175 -0.34591088 -0.76624566 0.0067978227
+1.0227 0.095471002 0.022927999 -0.61914289 -0.29803512 -0.726524 0.0015426942
+0.98302001 0.11555 0.042082999 -0.54639757 -0.30101487 -0.78156245 0.0010292452
+1.0007 0.090741001 0.040226001 -0.51564634 -0.33338302 -0.78928113 0.0017695468
+0.98680001 0.097994998 0.044537 -0.52528799 -0.30454716 -0.7945587 0.0028648991
+1.0077 0.11758 0.024834 -0.56419486 -0.33695927 -0.75375229 0.0030778358
+0.99056 0.12094 0.033567 -0.51232612 -0.31890371 -0.79738474 0.0013899606
+1.0105 0.099830002 0.029754 -0.53316003 -0.30324942 -0.7897976 0.0011988794
+0.99453998 0.10298 0.037503999 -0.5089128 -0.31419891 -0.80142802 0.0018265418
+1.0233999 0.16184001 -0.017042 -0.59896797 0.078440338 -0.79692185 0.0035052602
+1.0434 0.13271999 -0.016930999 -0.51600534 -0.40478447 -0.75490928 0.0024960607
+1.0293 0.13862 -0.013149 -0.4552305 -0.470781 -0.7557317 0.0006101483
+1.0027 0.15887 0.0029608 -0.67432153 -0.12528726 -0.72773176 0.00080478971
+0.99150002 0.16013999 0.01246 -0.62384629 -0.31586623 -0.71487367 0.0052475557
+1.0081 0.13854 0.0089130998 -0.69858241 -0.55086738 -0.45664844 0.0018211897
+0.99607998 0.14494 0.015868001 -0.66303301 -0.43205875 -0.61132032 0.0059917043
+1.0129 0.15893 -0.0071943998 -0.67897218 -0.10665592 -0.72637546 0
+1.0134 0.1417 -0.0051719001 -0.67354703 -0.3278667 -0.66244835 0.01413874
+1.0256 0.11631 0.0074979998 -0.64640331 -0.47669384 -0.59575641 0.0044477335
+1.0426 0.095767997 0.0022491 -0.64992231 -0.35925233 -0.66973037 0.0044248593
+1.0318 0.10036 0.011414 -0.6827184 -0.33447254 -0.64963347 0.0026418325
+1.0464 0.11845 -0.014197 -0.58930421 -0.30389696 -0.74857688 0.0015500779
+1.0328 0.12147 -0.0048763002 -0.54738271 -0.44838777 -0.70662612 0.0066956347
+1.0482 0.1006 -0.0084408997 -0.72788608 -0.38254794 -0.56906849 0.0048116101
+1.0373 0.10988 -0.0014282 -0.67217404 -0.38862997 -0.63019741 0.0017796899
+1.0157 0.12326 0.013437 -0.70157593 -0.44799924 -0.55415511 0.0053039566
+1.0192 0.10654 0.019783 -0.62667274 -0.37258184 -0.68444431 0.0014385731
+1.0195 0.12848 9.2053997e-06 -0.62529922 -0.52196246 -0.58013451 0.0075829281
+0.94865 0.15895 0.047012001 -0.621216 -0.25630501 -0.74053925 0.0027780938
+0.96560001 0.13416 0.04276 -0.50866735 -0.43223512 -0.74460071 0.00072460691
+0.94948 0.14046 0.051139999 -0.63758475 -0.27868304 -0.71820712 0.0034071445
+0.97027999 0.16067 0.030572999 -0.51351565 -0.28071377 -0.81086463 0.0041117412
+0.95624 0.16278 0.038771 -0.55786783 -0.20062989 -0.8053143 0.0035683531
+0.97051001 0.14157 0.035563 -0.39338857 -0.31968871 -0.86200035 0.0024875496
+0.95868999 0.14738999 0.039866999 -0.56393737 -0.24979743 -0.78713137 0.0036713248
+0.9332 0.16136999 0.055966999 -0.55520862 -0.25920907 -0.79028726 0.0030493315
+0.93921 0.14843 0.058841001 -0.58143532 -0.320636 -0.74774688 0.0028842997
+0.96965998 0.11924 0.048728 -0.47431245 -0.38265365 -0.79284543 0.0012404486
+0.95254999 0.1228 0.055957999 -0.55865711 -0.37040028 -0.74209559 0.0051141558
+0.97363001 0.10092 0.053355999 -0.5982157 -0.32264602 -0.73351043 0.0035898287
+0.9594 0.1096 0.059841 -0.51752961 -0.40180701 -0.75545633 0.0039658649
+0.97837001 0.12849 0.038424999 -0.47450599 -0.40052542 -0.78385162 0.0010637143
+0.97960001 0.16847999 0.018563 -0.58542293 -0.38597348 -0.71295476 0.0034863385
+0.82488 0.23560999 0.10505 -0.59947681 -0.35371003 -0.71799493 0.010784649
+0.84318 0.21355 0.10186 -0.55476266 -0.41541472 -0.72088057 0.0097160516
+0.82648998 0.22025999 0.10545 -0.48604849 -0.26691988 -0.83217221 0.013018862
+0.86184001 0.1733 0.10113 -0.47962597 -0.382552 -0.78969169 0.0023208172
+0.82190001 0.19677 0.12166 -0.58651632 -0.33691764 -0.73653585 0.0075704558
+0.82467997 0.17874999 0.12402 -0.60391527 -0.225271 -0.76455182 0.0050727222
+0.84478998 0.19828001 0.10421 -0.52199274 -0.21866933 -0.82444358 0.0037540549
+0.82933998 0.19972 0.11221 -0.47539356 -0.57234251 -0.66815048 0.0014227384
+0.84741002 0.1802 0.10664 -0.52411735 -0.24872315 -0.81451696 0.0012783514
+0.83495998 0.17948 0.11653 -0.59928781 -0.11381859 -0.79240113 0.00026966783
+0.8646 0.2181 0.082092002 -0.51154155 -0.37961307 -0.77085608 0.0036627164
+0.88091999 0.23187 0.061050002 -0.57498491 -0.32047766 -0.7527858 0.00033594601
+0.86844999 0.23952 0.068090998 -0.54254228 -0.34464252 -0.766074 0.00098443357
+0.88413 0.21641 0.065320998 -0.58656424 -0.36412823 -0.72343135 0.00038675996
+0.87203002 0.22189 0.072640002 -0.62151271 -0.34545231 -0.70312482 0.0002418144
+0.84491003 0.23594999 0.084567003 -0.55049723 -0.33826473 -0.76323634 0
+0.83156002 0.24096 0.092185996 -0.60750872 -0.33880916 -0.71842986 0.0068169362
+0.84767002 0.21932 0.090089001 -0.52558011 -0.41381216 -0.74332035 0.0091250325
+0.83468997 0.22439 0.097273 -0.60121846 -0.39161882 -0.6965422 0.013597582
+0.85216999 0.2423 0.076861002 -0.50634247 -0.34461656 -0.79047877 0.00034203156
+0.88178003 0.19361 0.081069 -0.59368545 -0.3294138 -0.73418272 0.0032004407
+0.86764997 0.19825 0.087494999 -0.51032072 -0.34604603 -0.78728962 0.00050212134
+0.88546997 0.17765 0.083988003 -0.61967474 -0.35560441 -0.69967747 0.0070562498
+0.87076002 0.1804 0.092885002 -0.52186549 -0.33301938 -0.78533715 0.00050089782
+0.88927001 0.20023 0.070299998 -0.56793463 -0.36587805 -0.73728114 0.0055634412
+0.87579 0.20601 0.078290001 -0.58551055 -0.38006032 -0.71605277 0.0013465818
+0.89216 0.18189 0.074537002 -0.5434522 -0.28521445 -0.78950137 0.0077711549
+0.85355002 0.20273 0.094867997 -0.5997256 -0.35071233 -0.71925664 0.0066873697
+0.85775 0.18588001 0.099466003 -0.52520549 -0.29415587 -0.7985183 0.0017145331
+0.78820997 0.23876999 0.1266 -0.63351518 -0.25144088 -0.73173487 0.0063557383
+0.80874997 0.21596999 0.12371 -0.5696947 -0.41887951 -0.70709819 0.013041764
+0.79108 0.22031 0.13153 -0.51433957 -0.28669098 -0.80824697 0.020822566
+0.81081998 0.24097 0.10891 -0.45336613 -0.40980577 -0.79152906 0.0067880661
+0.79666001 0.24145 0.11613 -0.59246016 -0.15072444 -0.79137415 0.0052085896
+0.81316 0.22002999 0.11499 -0.52357644 -0.42571056 -0.73799604 0.019716488
+0.79916 0.22548001 0.11894 -0.57497853 -0.40680766 -0.70986426 0.012896671
+0.77315998 0.24037001 0.13583 -0.59511691 -0.23025955 -0.76994568 0.004909588
+0.77512997 0.2263 0.13865 -0.52804369 -0.17383423 -0.83123499 0.014830954
+0.80925 0.19983 0.12805 -0.54562867 -0.27875513 -0.79030681 0.0068807271
+0.79351997 0.20100001 0.13649 -0.47791228 -0.55269438 -0.68273622 0.014297949
+0.80982 0.18066999 0.13282999 -0.58601809 -0.3243759 -0.74253827 0.0034048667
+0.79905999 0.18873 0.13925999 -0.6248731 -0.33649999 -0.70448655 0.0062789093
+0.81748998 0.20694999 0.11607 -0.60143006 -0.34666523 -0.71979517 0.0061016404
+0.77736998 0.20947 0.13952 -0.48934469 -0.37058294 -0.78943658 0.019381313
+0.81770003 0.24804001 0.099101998 -0.54579264 -0.38814139 -0.74260122 0.0064071543
+0.86220998 0.13109 0.12449 -0.60335654 -0.41880867 -0.67864591 0.0067200996
+0.88660997 0.15511 0.10396 -0.60645801 -0.41785285 -0.676467 0.038206737
+0.86672002 0.16126999 0.10576 -0.43381289 -0.43726528 -0.78778511 0.0020081515
+0.88617998 0.13941 0.10493 -0.46835259 -0.076204561 -0.88024926 0.012527327
+0.86856002 0.13839 0.1128 -0.44409004 -0.39297807 -0.80520332 0.015699957
+0.84691 0.15372001 0.12263 -0.59681606 -0.49561548 -0.63101166 0.010835593
+0.83177 0.1601 0.12996 -0.5789305 -0.49978098 -0.64425033 0.011772036
+0.85040998 0.13896 0.12794 -0.52590269 -0.4365806 -0.72994787 0.0078156497
+0.83455998 0.1425 0.13564999 -0.59134322 -0.36434138 -0.71942234 0.0049849753
+0.85168999 0.15989 0.11338 -0.4235431 -0.39462808 -0.81540173 0.01673739
+0.83710998 0.16552 0.11666 -0.58082604 -0.44174889 -0.68373901 0.011987467
+0.85579997 0.14437 0.11643 -0.60335642 -0.45864987 -0.65238124 0.006103396
+0.86491001 0.1203 0.12488 -0.67537767 -0.23455596 -0.69917697 0.00049167522
+0.88226002 0.096532002 0.12191 -0.55718952 -0.39701036 -0.72933036 0.0010639022
+0.86925 0.099775001 0.13064 -0.63879752 -0.25275451 -0.72667259 0.01146022
+0.89003003 0.11988 0.10963 -0.43655372 -0.31309524 -0.84344071 0.0021587377
+0.87257999 0.12227 0.11682 -0.52714646 -0.38392636 -0.75810105 0.0094435243
+0.88988 0.10118 0.11499 -0.52289754 -0.26494238 -0.81017512 0.00052316289
+0.85462999 0.11999 0.13461 -0.58852035 -0.35287523 -0.72740829 0.01039953
+0.83947998 0.12964 0.13962001 -0.52659273 -0.44835964 -0.72226971 0.0038244107
+0.85856003 0.10713 0.13595 -0.66376376 -0.34227362 -0.66503119 0.0047564316
+0.89059001 0.15983 0.090540998 -0.63158286 -0.45532748 -0.62751889 0.018392732
+0.87414998 0.16618 0.097285002 -0.45041993 -0.54549319 -0.70679498 0.015992634
+0.89407003 0.14109001 0.096280001 -0.64333844 -0.31238109 -0.6989519 0.016380979
+0.89740002 0.16574 0.077215999 -0.63635886 -0.43691862 -0.63572752 0.0028026092
+0.89977002 0.12815 0.099349998 -0.52525419 -0.38354832 -0.75960428 0.0018487063
+0.8168 0.16665 0.13598999 -0.54268378 -0.48348644 -0.68682981 0.0024878762
+0.88888001 0.24074 0.051922999 -0.50816762 -0.31688151 -0.80084437 0.00040985784
+0.87628001 0.24679001 0.058247998 -0.635665 -0.31030127 -0.7068544 0.0029120862
+0.89315999 0.22121 0.056841001 -0.49497676 -0.28261006 -0.82166272 0.00096749922
+0.89607 0.20853999 0.059615999 -0.49258876 -0.40661642 -0.7694279 0.0019405767
+0.98404002 0.070919998 0.061960999 -0.55431408 -0.41653895 -0.72057694 0.0032854285
+0.98872 0.058773998 0.064940996 -0.5867281 -0.33901131 -0.73540562 0.0026226456
+1.0221 0.012297 0.063571997 -0.59205467 -0.46612686 -0.657417 0.0028383038
+0.98312002 0.032776002 0.080904998 -0.49743569 -0.42067587 -0.75867617 0.0012903532
+1.0024 0.011868 0.081660002 -0.49999475 -0.41016725 -0.76273727 0.0046702172
+0.9896 0.017346 0.085202999 -0.42877632 -0.39410093 -0.81291777 0.0043413779
+1.0026 0.033939999 0.061834998 -0.58933985 -0.42261109 -0.68853354 0.0064367717
+0.99177003 0.039939001 0.070312001 -0.61735803 -0.35049427 -0.70428884 0.0037806453
+1.0098 0.019113 0.069228999 -0.58440614 -0.51907796 -0.62372077 0.0018284216
+0.99564999 0.026108 0.075217001 -0.5566777 -0.49446264 -0.6675452 0.0035490997
+0.94211 0.057665002 0.1008 -0.56519961 -0.2111613 -0.79747117 0.0038285826
+0.90384001 0.074198 0.12276 -0.59408057 -0.41638035 -0.68825549 0.013292339
+0.90609002 0.058552001 0.12758 -0.63980561 -0.33166477 -0.69328725 0.0073490208
+0.92579001 0.075560004 0.10387 -0.47181588 -0.38630849 -0.79256254 0.0058882376
+0.90979999 0.080724999 0.11117 -0.53799319 -0.46211675 -0.70499039 0.0065852832
+0.92995 0.058966 0.10677 -0.44346306 -0.32001641 -0.8372156 0.001175456
+0.91259998 0.061244 0.11547 -0.62787676 -0.29562932 -0.71998203 0.010332877
+0.94599003 0.015028 0.12259 -0.50794286 -0.33118242 -0.79518062 0.0061250478
+0.94770998 0.037987001 0.10599 -0.5467025 -0.48218262 -0.68455559 0.0026403007
+0.96408999 0.015938999 0.10521 -0.68244982 -0.37081754 -0.62988621 0.0022073609
+0.95195001 0.022092 0.11261 -0.56999952 -0.46734309 -0.67578912 0.0034810335
+0.92287999 0.034715001 0.12403 -0.539244 -0.40324888 -0.73932838 0.00073050108
+0.90938002 0.041182999 0.13174 -0.64530504 -0.33084199 -0.68856734 0.001257438
+0.92793 0.019358 0.12903 -0.50210249 -0.36767471 -0.78275692 0.010996122
+0.9131 0.024236999 0.13654 -0.57677633 -0.36159277 -0.73251611 0.0061787046
+0.93080002 0.041737001 0.11449 -0.49902943 -0.40404963 -0.76662481 0.00029232848
+0.91881001 0.047665 0.1197 -0.61096334 -0.41493231 -0.67420691 0.0054559815
+0.93598998 0.028448001 0.11891 -0.46810722 -0.46554369 -0.75109565 0.00099454238
+0.94665003 0.078760996 0.086433001 -0.59852529 -0.38096818 -0.70472038 0.0021621673
+0.96508002 0.057034999 0.083195001 -0.5712378 -0.28743517 -0.76880968 0.0020155795
+0.94950998 0.060915999 0.092109002 -0.60457981 -0.29886797 -0.73835027 0.0035357748
+0.96878999 0.079053998 0.068680003 -0.59568805 -0.3527084 -0.72163194 0.0048051276
+0.95570999 0.083322003 0.077022001 -0.55828726 -0.44815364 -0.69819301 0.0003109932
+0.97201997 0.060986999 0.074331999 -0.54373103 -0.36046478 -0.75790608 0.0011854573
+0.93318999 0.081906997 0.095448002 -0.49425125 -0.46934757 -0.73172981 0.0020403196
+0.91881001 0.087137997 0.099330001 -0.53145289 -0.40725619 -0.74276519 0.0033725032
+0.93866998 0.069509 0.099523999 -0.5599153 -0.33716628 -0.75684464 0.004142819
+0.96657002 0.038490999 0.087127 -0.53281778 -0.33914393 -0.77529782 0.002576021
+0.95366001 0.042525001 0.095472001 -0.65613925 -0.35577026 -0.66551387 0.0014179138
+0.97153997 0.021181 0.093138002 -0.69876397 -0.37498984 -0.60918927 0.0026492612
+0.9594 0.029826 0.099064998 -0.6318751 -0.45084906 -0.63045144 0.00058623235
+0.97724003 0.045864999 0.077969998 -0.53296161 -0.33424953 -0.77732182 0.0032671364
+0.98108 -0.0089299995 0.10334 -0.54857576 -0.43973097 -0.71112669 0.0032233209
+1.0022 -0.029957 0.10071 -0.5248087 -0.44305116 -0.72682977 0.0014517402
+0.98824 -0.022419 0.10605 -0.51382846 -0.42370754 -0.7459572 0.0025515396
+1.0211 -0.068726003 0.10048 -0.5816046 -0.32982418 -0.74360752 0.0024701951
+0.98364002 -0.044585999 0.12158 -0.54036254 -0.38333181 -0.74904275 0.0031786293
+0.98966998 -0.061691999 0.1249 -0.66398895 -0.36114612 -0.65474594 6.1267667e-05
+1.0069 -0.042234 0.10416 -0.58125627 -0.32466188 -0.74614727 0.001084368
+0.99144 -0.039434999 0.11302 -0.50583857 -0.36728805 -0.7805298 0.0023566771
+1.0116 -0.060662001 0.1073 -0.59741378 -0.28404793 -0.7499423 0.0026877024
+0.99563003 -0.058001999 0.11682 -0.57840472 -0.33430517 -0.74410212 0.00088891364
+1.0224 -0.024537999 0.081478 -0.51969004 -0.38320991 -0.76359183 0.0028855463
+1.0405999 -0.0065877 0.060580999 -0.50906545 -0.42931038 -0.74601942 0.00044386109
+1.0276999 -0.001304 0.065200999 -0.5627771 -0.37561628 -0.73633844 0.0023796014
+1.0461 -0.023021 0.06549 -0.49870306 -0.38502228 -0.7765649 0.0050450861
+1.0301 -0.018867999 0.073133998 -0.49784449 -0.43179035 -0.75213563 0.00043541021
+1.0077 -0.0015816001 0.083793998 -0.51913726 -0.30762067 -0.7974121 0.0038622068
+0.99024999 -0.00032516001 0.091712996 -0.43657762 -0.35201937 -0.82793868 0.0037084338
+1.0111001 -0.020669 0.088615999 -0.53438139 -0.36860177 -0.76063746 0.0044383788
+0.99338001 -0.015683999 0.096056998 -0.52689391 -0.43623269 -0.72944075 0.0017339427
+1.0165 0.0012797 0.074822001 -0.62786865 -0.36928493 -0.68513477 0.00099384179
+1.0195 -0.011964 0.077432998 -0.61183947 -0.33472729 -0.71666592 0.0012066176
+1.0405999 -0.048122998 0.08106 -0.5396452 -0.36099494 -0.76056933 0.0052991193
+1.028 -0.041200999 0.085252002 -0.51386875 -0.34032473 -0.78747571 0.0022855795
+1.0474 -0.062414002 0.084307 -0.62505835 -0.34890854 -0.6982584 0.0022837189
+1.0292 -0.059266001 0.092665002 -0.50351012 -0.32225406 -0.801642 0.0012995499
+1.0474 -0.040369 0.070378996 -0.59265172 -0.31707868 -0.74042213 0.0013800343
+1.0377001 -0.034672 0.078220002 -0.52502018 -0.3662672 -0.76824611 0.0034104299
+1.053 -0.055059999 0.073792003 -0.59198648 -0.43059307 -0.68127936 0.0010349886
+1.0152 -0.038180001 0.094485998 -0.60540718 -0.34762284 -0.71598923 0.0011649787
+1.0188 -0.055787001 0.098595001 -0.61452156 -0.27455762 -0.73958182 0.0020996947
+0.94849002 -0.0013953 0.12401 -0.5852384 -0.2038109 -0.78482944 0.0010997696
+0.96328002 -0.023692001 0.12596001 -0.62290823 -0.38800481 -0.67929196 0.0036315948
+0.95287001 -0.019067001 0.13271999 -0.54077381 -0.49815971 -0.67779088 0.0042802715
+0.96841002 -0.00058786001 0.10837 -0.59900635 -0.35289079 -0.71879023 0.005333222
+0.95556998 0.0025257999 0.11761 -0.61126792 -0.21667862 -0.76118457 0.00064697996
+0.97254002 -0.017728999 0.11408 -0.54049581 -0.39329743 -0.74376166 0.0022530819
+0.9594 -0.012057 0.11967 -0.5861423 -0.41115743 -0.69813097 0.0031134589
+0.92948002 0.00053809001 0.13328999 -0.69132662 -0.2524775 -0.67699534 0.002691518
+0.91881001 0.0094638001 0.14008 -0.56591243 -0.32264245 -0.75871271 0.0076919226
+0.93252999 -0.013037 0.13672 -0.52232534 -0.4758299 -0.70764554 0.010322579
+0.96696001 -0.039751001 0.12974 -0.58028805 -0.26725626 -0.76931137 0.0083376123
+0.95793003 -0.038451999 0.13877 -0.55241168 -0.20648874 -0.80759126 0.0053784829
+0.96820003 -0.059060998 0.13379 -0.6061675 -0.25298831 -0.75402778 0.0017641849
+0.9594 -0.055048 0.13940001 -0.59404868 -0.22946417 -0.77100748 0.0045433976
+0.97580999 -0.031422 0.11766 -0.53512967 -0.39951596 -0.74432737 0.0024843244
+0.97538 0.0031542 0.097521 -0.59310794 -0.39717329 -0.70034009 0.0068171867
+1.023 0.050799999 0.042257 -0.43719506 -0.50766492 -0.74238586 0.0011664304
+1.0415 0.070625 0.020215999 -0.57990342 -0.44265893 -0.6839335 0.0044891094
+1.0264 0.078120001 0.025139 -0.57367194 -0.35862502 -0.73640245 0.0084268041
+1.0434 0.057324 0.023754001 -0.60310924 -0.33519158 -0.72381341 0.0025988526
+1.0315 0.060368001 0.030787 -0.44627506 -0.43156639 -0.78395724 0.0040529827
+1.0038 0.078814998 0.042082001 -0.59517097 -0.20174378 -0.77786309 0.00015287472
+0.99154001 0.079072997 0.050673999 -0.51595503 -0.37122032 -0.77200127 0.0040168483
+1.007 0.058850002 0.046241999 -0.52542686 -0.47071186 -0.70877135 0.0064754151
+0.99633998 0.061547 0.055250999 -0.65994066 -0.34449351 -0.66768444 0.00039362937
+1.0127 0.081329003 0.034205001 -0.58498806 -0.22226715 -0.77999121 0.00060760404
+1.0146 0.062941 0.03695 -0.50456262 -0.33142024 -0.7972309 0.0086300056
+1.0405999 0.032832 0.040872 -0.55716074 -0.43261281 -0.70881462 0.004589587
+1.0298001 0.038876001 0.045717001 -0.51759994 -0.45258597 -0.72612417 0.0008407936
+1.0462 0.01802 0.043733001 -0.38119218 -0.35435957 -0.85388631 0.00068656373
+1.0292 0.01935 0.051321998 -0.46797237 -0.47458035 -0.74550337 0.0054901573
+1.0469 0.040525999 0.029485 -0.59761536 -0.46304795 -0.65455514 0.0027203939
+1.0358 0.044608001 0.037838999 -0.56701618 -0.44717962 -0.69175363 0.0014462124
+1.0538 0.024871999 0.037273001 -0.45068848 -0.4786132 -0.75353122 0.0030255748
+1.0118001 0.040755 0.054963 -0.51937395 -0.29835385 -0.80077189 0.0012044214
+0.99913001 0.046293002 0.059549998 -0.62079644 -0.34748232 -0.7027573 0.0051810262
+1.0171 0.024266001 0.056152999 -0.56676954 -0.45388415 -0.68757659 0.0088705216
+1.0465 0.077324003 0.0073994999 -0.60142684 -0.42201039 -0.6783753 0.0048511438
+1.0351 0.082661003 0.013752 -0.62295586 -0.37263927 -0.68779796 0.0079743583
+1.0512 0.060523 0.014919 -0.71342945 -0.38233423 -0.58722985 0.0019731203
+1.0542001 0.085268997 -0.0023395999 -0.45606622 -0.49850437 -0.73722243 0.0070427335
+1.0554 0.045972001 0.018011 -0.47658262 -0.4692542 -0.74341738 0.0070405342
+0.97662997 0.083838999 0.057032999 -0.59778363 -0.38042545 -0.70564246 0.0050679008
+1.0497 8.7387998e-05 0.049800999 -0.49131525 -0.35939077 -0.79337734 0.0047611762
+1.035 0.0032209 0.057553999 -0.52971661 -0.45515215 -0.71570718 0.0024342572
+1.0524 -0.016457999 0.056798 -0.54738748 -0.44445166 -0.70910484 0.0021866967
+0.88827002 0.079159997 0.12801 -0.42071062 -0.45724824 -0.78353471 0.0021074032
+0.86989999 0.081927001 0.13535 -0.61532682 -0.33691686 -0.71264291 0.012805573
+0.89112997 0.062867001 0.13569 -0.47456422 -0.43825907 -0.76335949 0.001606698
+0.87706 0.067984 0.13979 -0.51450849 -0.44805247 -0.73111564 0.0082519623
+0.89428997 0.086776003 0.11783 -0.52051771 -0.457344 -0.72103935 0.0044277129
+0.89977002 0.043683998 0.13967 -0.52309614 -0.31766185 -0.79086119 0.0092144441
+0.73348999 0.21273001 0.22294 -0.52530175 0.15823628 0.83607382 0.0029601781
+0.72891998 0.19814999 0.22416 -0.51034755 0.16812609 0.84337366 0.001178885
+0.72680998 0.18082 0.22509 -0.83946389 0.1601209 0.51928955 0.013952361
+0.71934003 0.1725 0.22112 -0.79352218 0.23647064 0.56071758 0.011742566
+0.72487003 0.16394 0.22555999 -0.70206422 0.11692423 0.70244896 0.0062026349
+0.71798003 0.15512 0.22228999 -0.78182805 -0.071662925 0.619362 0.02049808
+0.72314 0.13756999 0.22308999 -0.78243244 -0.21043958 0.58610129 0.023757968
+0.71877003 0.14496 0.22302 -0.91036069 -0.29350609 0.29171491 0.0075071235
+0.72795999 0.12738 0.22257 -0.6053651 -0.23936421 0.75910336 0.030696776
+0.72564 0.23995 0.21193001 -0.54982358 0.16136849 0.81954509 0.00069004111
+0.71429002 0.23848 0.20415001 -0.76041776 0.16553202 0.62798411 0.011595695
+0.72359002 0.21991 0.21645001 -0.60201591 0.13670905 0.78669405 0.004675101
+0.71408999 0.21889 0.20713 -0.8771612 0.078777529 0.47369015 0.013769059
+0.70748001 0.24041 0.18976 -0.91476578 0.01071621 0.40384266 0.0038436565
+0.71043003 0.22109 0.19214 -0.92903805 -0.032637872 0.36854178 0.0025976577
+0.72305 0.20258 0.21809 -0.6534934 0.11360855 0.74835789 0.0062400098
+0.71362001 0.19948 0.20852999 -0.89602947 -0.049167439 0.44126374 0.0090984665
+0.72210002 0.18054999 0.21347 -0.75195372 0.49216828 0.43856144 0.010712621
+0.71625 0.18276 0.20875999 -0.90507782 -0.077464417 0.41813079 0.029591573
+0.71060002 0.20255999 0.19474 -0.83452338 0.21598828 0.50687259 0.012886317
+0.73943001 0.17106999 0.18036 -0.49145377 0.44618303 0.74792641 0.10687473
+0.71354002 0.18235999 0.19866 -0.8618753 -0.23338425 0.45022535 0.0091378847
+0.69972003 0.20341 0.18359999 nan nan nan nan
+0.68124002 0.17247 0.18316001 -0.74082637 0.069440909 0.6680975 0.00070196891
+0.67965001 0.17284 0.18173 -0.74082637 0.069440909 0.6680975 0.00070196891
+0.73817003 0.23216 0.16113 -0.63163781 0.51760662 0.57716292 0.065123782
+0.70380002 0.24073 0.17651001 -0.89273632 0.0358942 0.44914737 0.0190238
+0.73382002 0.21634001 0.16422001 -0.59625012 0.20950577 0.77497941 0.012770732
+0.70235997 0.22722 0.17833 -0.75245458 0.18551333 0.63197857 0.028701639
+0.73330998 0.24156 0.15144999 0.20682181 -0.036249224 -0.97770685 0.12829547
+0.71632999 0.23399 0.1485 0.27304861 -0.26913932 -0.92358458 9.6207477e-05
+0.72697997 0.22276001 0.15485001 -0.46266663 0.195382 0.86473441 0.011813608
+0.71740001 0.21658 0.15407 -0.44507322 0.2075707 0.87110519 0.016479414
+0.69361001 0.24372999 0.16798 -0.6398685 0.21154183 0.7387951 0.010221414
+0.67523998 0.23603 0.162 -0.41705287 0.32553804 0.84858221 0.014113124
+0.68970001 0.22001 0.17269 -0.47144952 0.31327584 0.82437474 0.00067931908
+0.67199999 0.21976 0.16362 -0.48864287 0.241127 0.83850211 0.0020075119
+0.68212998 0.24336 0.15835001 -0.48221111 0.69898397 0.52810407 0.00031714261
+0.66815001 0.23465 0.15658 -0.41775262 0.32571566 0.84816992 0.014062402
+0.66654998 0.22598 0.15810999 -0.59729761 0.20704114 0.77483523 0.00032424572
+0.73181999 0.19976 0.16706 -0.36253467 0.177921 0.91482937 0.018758627
+0.71666002 0.19559 0.16091 -0.33132437 0.50586766 0.7964434 0.026571
+0.73294002 0.17872 0.17286 0.30059689 -0.43631271 -0.84809947 0.025866546
+0.71982002 0.17400999 0.16760001 -0.43453398 0.24207082 0.86751479 0
+0.72785002 0.20442 0.15859 -0.44492552 0.29039285 0.84717965 0.018618474
+0.71717 0.20603999 0.15739 -0.33954486 0.33010125 0.88076246 0.013612588
+0.68142003 0.20722 0.17377 -0.46454665 0.28587875 0.83813465 0.0028558439
+0.67517 0.20498 0.16932 -0.61170685 0.16668898 0.77332366 0
+0.67659998 0.17234001 0.17859 -0.74256253 0.068027757 0.66631317 0.00024422962
+0.71408999 0.15925001 0.21507999 -0.80912739 -0.0084003862 0.58757323 0.024000989
+0.72180003 0.14042 0.21795 -0.78254986 -0.21044391 0.5859428 0.023771944
+0.71837002 0.14407 0.21466 -0.88754302 -0.1786463 0.42467973 0.015340735
+0.73559999 0.15753999 0.18261001 -0.46353757 0.35447577 0.81208366 0.069502898
+0.73661 0.14 0.18573 -0.48661384 0.10725483 0.86700827 0.00095499743
+0.69822001 0.16249999 0.20079 nan nan nan nan
+0.68555999 0.15977 0.18949001 -0.68047422 0.16146637 0.71476114 0.001111249
+0.67931002 0.15989999 0.18264 -0.7241444 0.13967337 0.67535639 0.0013538259
+0.68290001 0.14358 0.19144 -0.68431014 0.24270359 0.68761516 0.0010194762
+0.67856002 0.13713001 0.19062001 -0.58457506 0.24131036 0.77462333 0.00036544068
+0.72369999 0.12752999 0.21837001 -0.77914083 -0.18803544 0.59798187 0.037784647
+0.71902001 0.12499 0.21624 -0.7188285 -0.061911255 0.69242513 0.019842833
+0.73534 0.12047 0.19109 -0.45835081 0.18746103 0.86877662 0.00038754623
+0.73749 0.10738 0.19506 -0.58661312 0.19504465 0.7860297 0.0034771312
+0.68776 0.11253 0.20636 -0.73989457 0.14641681 0.65659583 0.012472426
+0.68000001 0.11538 0.20073999 -0.74214286 0.14498256 0.65437299 0.011699708
+0.68379998 0.1043 0.2059 -0.69682032 0.2471133 0.67333245 0.0087815197
+0.67852002 0.094687998 0.20595001 -0.6435014 0.248483 0.7239905 0.01011519
+0.68085003 0.12013 0.19769999 -0.74077141 0.16321258 0.65162826 0.0046436517
+0.67892998 0.12069 0.19535001 -0.72793341 0.15863529 0.66704416 0.0058224867
+0.68094999 0.10893 0.19944 -0.68768126 0.25227833 0.68077165 0.011669435
+0.67910999 0.10731 0.19828001 -0.68768126 0.25227833 0.68077165 0.011669435
+0.73036999 0.16095001 0.17653 -0.52017754 0.23999524 0.81964481 0.0021543656
+0.72637999 0.14824 0.17802 -0.55658382 0.17466307 0.81222367 0.0035294951
+0.67751998 0.16872001 0.17911001 -0.74256253 0.068027757 0.66631317 0.00024422962
+0.73692 0.00078294001 0.23048 nan nan nan nan
+0.73859 0.087219 0.20382001 -0.52707285 0.23523314 0.81661469 0.0048267841
+0.73943001 0.068076998 0.20803 -0.45271972 0.2222015 0.86352271 0.0015472395
+0.68333 0.080196999 0.21062 -0.44405913 0.15261964 0.88290358 0.00056317047
+0.67834997 0.088146999 0.20609 -0.42568207 0.1722105 0.88833457 0.0012903231
+0.68282998 0.066320002 0.21238001 -0.30621612 0.13251992 0.94269305 0
+0.67929 0.061772 0.21190999 -0.30621612 0.13251992 0.94269305 0
+0.73686999 0.041832 0.21494 nan nan nan nan
+1.3814 -0.36243001 -0.018653 -0.52136123 -0.45368457 -0.72273976 0
+1.3862 -0.38196 -0.0121 -0.66812539 -0.43569857 -0.60313779 0.0012166637
+1.061 -0.20963 0.14117 -0.60905278 -0.29201826 -0.73741442 0.0014776312
+1.0644 -0.22401001 0.14467999 -0.62851524 -0.39476106 -0.67017329 0.0018325798
+1.0649 -0.36531001 0.22194999 -0.42935658 -0.38313806 -0.81783754 0.0064031105
+1.0812 -0.38558 0.22028001 -0.53856057 -0.38722956 -0.74833536 0.0051636682
+1.0681 -0.38143 0.22368 -0.41208795 -0.25410411 -0.8749941 0.0067622894
+1.1436 -0.30702999 0.14105999 -0.5607506 -0.26754794 -0.78356683 0.0067823585
+1.0659 -0.28523999 0.18406001 -0.50825846 -0.40931973 -0.75771403 0.010324777
+1.0671999 -0.30168 0.18695 -0.5304029 -0.30274585 -0.79184449 0.0056752195
+1.1004 -0.24944 0.14108001 -0.57633996 -0.48968843 -0.65424579 0.0044945856
+1.1026 -0.26201999 0.14445999 -0.63289595 -0.31069601 -0.70916188 0.00013502435
+1.061 -0.2383 0.16028 -0.57521296 -0.10445481 -0.81130713 0.022714771
+1.0674 -0.26350999 0.16467001 -0.44343796 -0.51511735 -0.73349631 0
+1.0868 -0.24448 0.14594001 -0.37143582 -0.59355766 -0.71395004 0.0051015122
+1.0686001 -0.23741999 0.15058 -0.65877491 -0.29195687 -0.69338071 0.01867325
+1.092 -0.2597 0.152 -0.50818998 -0.40415877 -0.76052529 0.0035552965
+1.0723 -0.25756001 0.15752 -0.43030715 -0.52817887 -0.73202658 0
+1.1026 -0.30774999 0.16287 -0.59637845 -0.45029768 -0.6645034 0.0017391508
+1.1237 -0.28650999 0.14184999 -0.48969656 -0.46204442 -0.73939997 0.0017952141
+1.1076 -0.28004 0.14768 -0.52595478 -0.37154752 -0.76506466 0.0048602889
+1.1289999 -0.30077001 0.14487 -0.34556192 -0.27659169 -0.89670736 0.0019995144
+1.1081001 -0.29949999 0.15311 -0.58883524 -0.41618019 -0.69286877 0.0046082102
+1.0851001 -0.28213 0.16433001 -0.59415543 -0.283521 -0.75272512 0.003882542
+1.0719 -0.27952999 0.17269 -0.54829973 -0.46697375 -0.69375992 0.0081454786
+1.0885 -0.29967001 0.16933 -0.59802419 -0.36618668 -0.71293366 0.0041107479
+1.076 -0.29628 0.17742001 -0.62472802 -0.3140361 -0.71490991 0.0049195569
+1.094 -0.27904999 0.15683 -0.57698566 -0.15326647 -0.80224502 0.00042395957
+1.0973001 -0.29609001 0.15797 -0.60207093 -0.32536504 -0.72914213 0.0044305357
+1.1449 -0.32311001 0.14207 -0.51969641 -0.23568952 -0.82119799 0.0078552589
+1.1619 -0.34764999 0.14117999 -0.57318759 -0.37535599 -0.72839814 0.00047908572
+1.149 -0.34156001 0.14674 -0.53746319 -0.36416382 -0.76060367 0.0012250625
+1.1832 -0.38722 0.14244001 -0.52592248 -0.42261326 -0.7381081 0.0024319305
+1.1429 -0.36796001 0.16156 -0.47052434 -0.39227423 -0.79039717 0.0011365522
+1.1612 -0.38793999 0.16174001 -0.5734368 -0.34122753 -0.74480474 0.0015365039
+1.1497999 -0.38169 0.16536 -0.47325596 -0.39289421 -0.78845608 0.0010399044
+1.1648999 -0.36203 0.14515001 -0.62443244 -0.32808909 -0.70883119 0.00091702101
+1.1517 -0.35846999 0.15363 -0.48468488 -0.37410128 -0.79065084 0.0016563232
+1.169 -0.37983 0.15002 -0.62499768 -0.3579801 -0.69370604 0.0010592534
+1.1568 -0.37456 0.15821999 -0.51934284 -0.3842966 -0.76328182 0.0031891526
+1.102 -0.34794 0.18176 -0.54844874 -0.37901863 -0.74535149 0.0015521194
+1.0652 -0.32332999 0.20527001 -0.64811915 -0.36677477 -0.66739637 0.0086831376
+1.0681 -0.3398 0.20737 -0.62674576 -0.11254513 -0.77105343 0.0086839041
+1.0852 -0.32337999 0.18234 -0.54455513 -0.25314429 -0.79961097 0.0019260816
+1.0725 -0.31973001 0.19159999 -0.70650446 -0.33917812 -0.62113583 0.0074559734
+1.0887001 -0.34051999 0.18724 -0.5337171 -0.32893023 -0.77907056 0.00010182148
+1.0757999 -0.33798999 0.19574 -0.6705569 -0.2967537 -0.6799196 0.0055854847
+1.1015 -0.3858 0.20189001 -0.59341556 -0.39480382 -0.70141846 0.0024143772
+1.1212 -0.36708 0.18026 -0.56758028 -0.39667627 -0.72145724 0.0047237282
+1.1077 -0.36188 0.18562999 -0.53623277 -0.35512015 -0.76573116 0.0045521553
+1.1251 -0.3847 0.18357 -0.50183994 -0.37869254 -0.77765584 0.004143544
+1.1087 -0.37941 0.19091 -0.5500465 -0.37339804 -0.74700916 0.0026099279
+1.0869 -0.36438 0.20577 -0.5901019 -0.43892086 -0.67758995 0.0070588551
+1.0721 -0.35922 0.21223 -0.48764172 -0.53766656 -0.68783736 0.0055829692
+1.0896 -0.38040999 0.20957001 -0.63070863 -0.34829688 -0.6934666 0.0027483439
+1.0754 -0.37432 0.21754 -0.52751482 -0.34131035 -0.77796888 0.0040912624
+1.0932 -0.35885 0.19408 -0.53788346 -0.43515825 -0.7220239 0.0099487454
+1.0785 -0.35111001 0.19831 -0.61025649 -0.43008029 -0.66529542 0.0084606307
+1.0973001 -0.37243 0.19652 -0.6379531 -0.33642995 -0.69269812 0.0042217961
+1.1072 -0.32135001 0.16813 -0.62742573 -0.331595 -0.70454359 0.0042373496
+1.1267 -0.34198999 0.16424 -0.54837656 -0.29218367 -0.78352523 0.0019328878
+1.1097 -0.33982 0.17302001 -0.49719688 -0.28972092 -0.81783676 0.00086557091
+1.1296999 -0.32014999 0.14928 -0.44754097 -0.29271343 -0.84500051 0.0024905747
+1.1136 -0.31606999 0.15647 -0.56440115 -0.44386837 -0.69601166 0.0033451349
+1.1346 -0.33772001 0.15476 -0.56543785 -0.3574557 -0.74330711 0.0024665175
+1.0944999 -0.31884 0.17682999 -0.52727622 -0.34506509 -0.77647269 0.005590335
+1.0975 -0.33502999 0.1788 -0.5171904 -0.28815582 -0.80590343 0.001214017
+1.1289001 -0.36072001 0.16796 -0.55857372 -0.33615601 -0.75828385 0.0053597447
+1.1144 -0.35530001 0.17512 -0.56410658 -0.38552639 -0.73017341 0.0044364445
+1.1332 -0.37847999 0.17438 -0.54112327 -0.39863333 -0.7404573 0.0032956228
+1.1193 -0.37162 0.17995 -0.5382576 -0.37320012 -0.75564575 0.00509506
+1.1386 -0.35593 0.15915 -0.52189857 -0.29817465 -0.79919565 0.0030569846
+1.2222 -0.14917 0.0017048999 -0.52679199 -0.34726614 -0.77581978 0.008730025
+1.2269 -0.122 -0.01619 -0.54723287 -0.31515291 -0.77538043 0.0094007617
+1.2289 -0.14123 -0.011516 -0.64422613 -0.35003564 -0.68003505 0.0069931787
+1.2244 -0.20251 0.02176 -0.55195147 -0.30018687 -0.77797002 0.0014050618
+1.2408 -0.22882999 0.020647001 -0.48526189 -0.45292306 -0.74791813 0.00040813992
+1.2280999 -0.22091 0.025535 -0.52339059 -0.36035052 -0.77214622 0.0034184647
+1.2625 -0.16896001 -0.019235 -0.61017406 -0.41318899 -0.67598999 0.0094082337
+1.2649 -0.18155999 -0.017201999 -0.64703238 -0.14107452 -0.74929768 0.0077122315
+1.2258 -0.16309001 0.0029221999 -0.49094152 -0.30213815 -0.81712234 0.0064473567
+1.2299 -0.18178 0.0078405002 -0.50027066 -0.35137573 -0.79136866 0.00070507341
+1.2460001 -0.16285001 -0.014092 -0.51938874 -0.39860851 -0.75587469 0.0043778508
+1.2331001 -0.15786999 -0.0057492 -0.63339096 -0.3655718 -0.68203604 0.0019456891
+1.2494 -0.17983 -0.0075782002 -0.54706854 -0.38067061 -0.74552387 0.00048085969
+1.2374001 -0.17494 -0.00037024001 -0.56758642 -0.34740865 -0.7464267 0.00043235099
+1.2654001 -0.22322001 0.0038519001 -0.5222885 -0.48408598 -0.70205098 0.0034218109
+1.2693 -0.20148 -0.012895 -0.65747255 -0.39743015 -0.64013994 0.0030183371
+1.2838 -0.22526 -0.016156999 -0.65349162 -0.43917981 -0.61649799 0.0021637308
+1.2747999 -0.21877 -0.0081019998 -0.70784545 -0.3875587 -0.59055316 0.0014561753
+1.245 -0.20189001 0.0051016002 -0.55541277 -0.31815508 -0.76830596 0.00077095389
+1.2331001 -0.19907001 0.013578 -0.57441843 -0.30859607 -0.75816357 0.0015308363
+1.249 -0.2193 0.010276 -0.44488478 -0.4113723 -0.79551893 0.0010078723
+1.2352 -0.21594 0.017128 -0.55639768 -0.30889159 -0.77136737 0.001636557
+1.2556 -0.19736999 -0.0033853999 -0.55846006 -0.33306605 -0.75972986 0.00078158377
+1.064 -0.12544 0.10249 -0.58992642 -0.33551145 -0.73445147 0.002934274
+1.0658 -0.14135 0.10532 -0.64392132 -0.33512011 -0.68779337 0.0069027785
+1.1016999 -0.10536 0.06213 -0.58224189 -0.37743053 -0.72009772 0.00012326804
+1.062 -0.086202003 0.081694998 -0.59792727 -0.41619125 -0.68503129 0.00011475272
+1.0671999 -0.10169 0.086567998 -0.62356842 -0.37780321 -0.68441743 2.6774283e-05
+1.0853 -0.087113999 0.063098997 -0.524656 -0.44324154 -0.72682387 0.0010193159
+1.0699 -0.079327002 0.071230002 -0.62083381 -0.35771033 -0.69757342 0.0024359841
+1.0894001 -0.101 0.069197997 -0.53438514 -0.36117864 -0.76418746 0.0018483318
+1.0747 -0.095780998 0.076673999 -0.56186932 -0.42810497 -0.70783406 0.00021976839
+1.1022 -0.14560001 0.082874 -0.50439155 -0.34702045 -0.79067439 0.0025790115
+1.122 -0.12808 0.060963999 -0.54929322 -0.42275614 -0.72080106 0.003626809
+1.1083 -0.1222 0.065122001 -0.48447832 -0.39332169 -0.78139538 0.0018168676
+1.1253999 -0.14147 0.065301001 -0.58502728 -0.39269954 -0.70959854 0.0019015853
+1.1109999 -0.13987 0.074428998 -0.49746954 -0.38954055 -0.77510142 0.00093159947
+1.0833 -0.12294 0.083291002 -0.58185428 -0.42247397 -0.69495422 4.6398502e-05
+1.0711 -0.11919 0.091946997 -0.59050554 -0.38646263 -0.70848411 0.0020798673
+1.0898 -0.14013 0.088527001 -0.51630968 -0.42138034 -0.74556214 4.7035614e-05
+1.0754 -0.13819 0.096902996 -0.55426443 -0.16719528 -0.81537515 0.00027456359
+1.0917 -0.11862 0.073968001 -0.5413785 -0.35403433 -0.76260674 0.00098523172
+1.0967 -0.13208 0.078537002 -0.50854629 -0.44168252 -0.73911917 0.00010211167
+1.1437 -0.16411 0.062780999 -0.52933788 -0.37556136 -0.76075959 0.0023959554
+1.1619 -0.1877 0.061198998 -0.62019217 -0.25488654 -0.74188578 0.0027480014
+1.1495 -0.18084 0.067789003 -0.54430813 -0.30788678 -0.78034252 0.0023239825
+1.1826 -0.22734 0.061586 -0.49650845 -0.38690141 -0.77703714 0.0020754079
+1.1429 -0.22819 0.082372002 -0.52431965 -0.48061907 -0.70291841 0.00070365419
+1.163 -0.20183 0.062701002 -0.5802846 -0.2129972 -0.78606743 0.00046622561
+1.1514 -0.19968 0.071091004 -0.53967446 -0.10728557 -0.83500975 0.001640435
+1.1683 -0.22051001 0.064819001 -0.44809803 -0.30583662 -0.84004295 0.0057907403
+1.1490999 -0.21901 0.072802998 -0.34838703 -0.24183209 -0.90561789 0.013226739
+1.1042 -0.18572 0.10192 -0.58190173 -0.44615218 -0.67995477 0.0055955318
+1.063 -0.16473 0.1222 -0.55257523 -0.38788632 -0.73770237 0.0014620689
+1.0803 -0.18875 0.12128 -0.55858749 -0.34504059 -0.75427246 0.0025614796
+1.0696 -0.18134999 0.12664001 -0.5431177 -0.33113304 -0.77160496 0.0025880383
+1.084 -0.16479 0.10488 -0.61444777 -0.44563416 -0.65104854 0.0031365659
+1.0713 -0.15884 0.11229 -0.62644476 -0.42992425 -0.65017849 0.0034283784
+1.0888 -0.18047 0.10924 -0.56738311 -0.44763544 -0.69115764 0.003946553
+1.0757 -0.17597 0.1174 -0.59527725 -0.39299387 -0.70085722 0.0003430777
+1.1004 -0.22961999 0.12049 -0.60956997 -0.47051907 -0.63799393 0.0020542094
+1.1073 -0.20122001 0.10546 -0.67813963 -0.14851587 -0.71977061 0.0055379448
+1.1222 -0.22872999 0.1011 -0.57740223 -0.47648379 -0.66300064 0.00086639385
+1.1077 -0.22051001 0.10793 -0.65217972 -0.29526141 -0.69819933 0.0099603478
+1.0842 -0.20100001 0.12314 -0.52440852 -0.28213954 -0.80336356 2.7072108e-05
+1.0696 -0.20018999 0.13222 -0.52697361 -0.23822674 -0.81581056 0.000863188
+1.0895 -0.22154 0.1259 -0.52802998 -0.4754816 -0.70363456 0.0022586193
+1.0721 -0.21842 0.13494 -0.55228716 -0.27083474 -0.78843349 0.0015474312
+1.0951999 -0.19957 0.11528 -0.5753442 -0.2007098 -0.79290259 0.0017032932
+1.097 -0.21720999 0.11667 -0.68224406 -0.219989 -0.69724303 0.00448744
+1.1063 -0.15984 0.084679998 -0.48399374 -0.29261476 -0.82469791 0.00021319941
+1.1262 -0.18279999 0.083581001 -0.47210157 -0.26806793 -0.83979732 0.0010595839
+1.109 -0.17976999 0.091338001 -0.46827376 -0.60174733 -0.64700848 0.0013049085
+1.1299 -0.15958001 0.071078002 -0.54911017 -0.36732405 -0.75070041 0.00057058828
+1.1162 -0.15723 0.078787997 -0.48774773 -0.30948934 -0.81628335 0.00076523895
+1.1332 -0.17805 0.076958999 -0.5059461 -0.34452885 -0.79077083 0.00017060609
+1.0907 -0.16001 0.094382003 -0.5282101 -0.41706142 -0.73963094 0.0072972439
+1.0762 -0.15198 0.099437997 -0.61532003 -0.41986093 -0.6671567 0.0065629515
+1.0967 -0.17305 0.095904998 -0.56650889 -0.42383122 -0.70670706 0.0053419429
+1.1291 -0.20034 0.086631998 -0.65121561 -0.15238763 -0.74343538 0.002248032
+1.1174999 -0.20009001 0.096534997 -0.65326625 0.057505697 -0.75494128 0.00038942922
+1.1298 -0.22001 0.088156998 -0.61794269 -0.30377993 -0.72516525 0.014410826
+1.1162 -0.21603 0.096548997 -0.66195488 -0.18166515 -0.72719568 0.011241821
+1.1382999 -0.20054001 0.078488998 -0.5696224 0.084941581 -0.81750548 0.0016581939
+1.1384 -0.21619999 0.077965997 -0.60030198 -0.19560757 -0.77548379 0.012341072
+1.1437 -0.083325997 0.021319 -0.48983327 -0.27499872 -0.8273083 0.00077751686
+1.1628 -0.10674 0.022034001 -0.57060504 -0.40012786 -0.71715254 0.0040433612
+1.1489 -0.10189 0.027198 -0.47684491 -0.43557259 -0.76347584 0.0019827124
+1.1826 -0.14721 0.023774 -0.56025076 -0.51799083 -0.6463781 0.0049250796
+1.1447999 -0.12529001 0.042527001 -0.51354927 -0.38617763 -0.76624668 0.00033430319
+1.1623 -0.14648999 0.040881999 -0.56751972 -0.468364 -0.67716795 0.0028375306
+1.1496 -0.14083999 0.046179 -0.49367118 -0.34988803 -0.79615778 6.7360648e-05
+1.1652 -0.12158 0.024615999 -0.65730888 -0.25347862 -0.7097137 0.0042261975
+1.1523 -0.11929 0.033842001 -0.54595369 -0.3922421 -0.74032468 0.00022836481
+1.1674 -0.13984001 0.029782001 -0.62882918 -0.43560579 -0.64406633 0.006684036
+1.1574 -0.13420001 0.037703 -0.59479809 -0.36688179 -0.71527129 0.0023912829
+1.1833 -0.10689 0.0053542 -0.56842434 -0.43316299 -0.6994738 0.003555821
+1.1887 -0.081772 -0.014337 -0.65394044 -0.2860443 -0.70038605 0.0018109278
+1.2069 -0.10526 -0.015729999 -0.51314414 -0.4538379 -0.72850144 0.001779516
+1.1916 -0.099641003 -0.0081816996 -0.57334518 -0.4153066 -0.70625472 0.0052286801
+1.1636 -0.083228 0.0049100001 -0.6293751 -0.38482532 -0.67512703 0.0026742336
+1.1529 -0.078695998 0.013322 -0.59976602 -0.33690748 -0.72579205 0.0011511887
+1.1686 -0.099692002 0.010481 -0.54975194 -0.49839145 -0.67035717 0.002757299
+1.1552 -0.094351999 0.017182 -0.56583786 -0.41404217 -0.71301937 0.0044945343
+1.1697 -0.077794999 -0.0049254 -0.64094669 -0.38760138 -0.66253495 0.00017506212
+1.1759 -0.092675 -0.0012943 -0.56929094 -0.47852716 -0.66852045 0.0016762266
+1.1887 -0.12048 0.0077328999 -0.62561226 -0.3060832 -0.71758097 0.0017732943
+1.2091 -0.14334001 0.0051589999 -0.40321368 -0.39475492 -0.82558298 0.0087757986
+1.1911 -0.13947 0.012409 -0.49084291 -0.37216353 -0.78776103 0.0095124897
+1.2093 -0.12062 -0.0089085 -0.39277706 -0.41825914 -0.81901497 0.0013651914
+1.1963 -0.11721 -0.0029253 -0.61289668 -0.36360732 -0.70153219 0.0063823881
+1.2149 -0.13609999 -0.0029223 -0.47510207 -0.49588731 -0.72689331 0.0064918422
+1.1997 -0.13063 1.0833e-05 -0.50270045 -0.41889986 -0.75618464 0.0084853033
+1.174 -0.11981 0.017127 -0.58670521 -0.18841244 -0.78757715 0.0038667717
+1.1747 -0.13441999 0.018265 -0.56342971 -0.33659005 -0.75448936 0.0092444858
+1.1036 -0.081931002 0.045658 -0.66257918 -0.33048353 -0.67213804 0.0050616558
+1.1262 -0.10443 0.044558 -0.49500844 -0.47706732 -0.72620481 0.005306466
+1.1089 -0.09922 0.052161999 -0.56789565 -0.46140537 -0.68161541 0.0060055284
+1.1289999 -0.080043003 0.027814999 -0.44326395 -0.29745016 -0.84560066 0.0043524061
+1.1118 -0.078891002 0.036807999 -0.55307031 -0.17242335 -0.81509715 0.0029731658
+1.1339999 -0.097649001 0.034152001 -0.51831734 -0.42128611 -0.74422121 0.00067464414
+1.1155 -0.091314003 0.038658001 -0.54360229 -0.49249712 -0.67966402 0.0076152394
+1.092 -0.078628004 0.054343 -0.53199863 -0.47476938 -0.70112157 0.0020103354
+1.0782 -0.072871 0.05948 -0.59716773 -0.38451198 -0.70394677 0.0044872425
+1.0983 -0.092701003 0.058359001 -0.56565911 -0.42890513 -0.70432252 0.0010572359
+1.1291 -0.12002 0.049667001 -0.53306586 -0.37744701 -0.75721502 0.0026183233
+1.1141 -0.11484 0.057133 -0.53076184 -0.43053097 -0.73002392 0.0017772479
+1.1325001 -0.13822 0.055252001 -0.57111454 -0.39081812 -0.72186518 0.0024630169
+1.1389 -0.11375 0.039469 -0.51416492 -0.40425089 -0.75644946 0.00083812681
+1.1801 -0.16285001 0.040899001 -0.50176644 -0.55038089 -0.66731656 0.0065520369
+1.1842999 -0.18503 0.043116 -0.53141737 -0.36297256 -0.76540613 0.00060099579
+1.1889 -0.16116001 0.029859999 -0.68878239 -0.42324817 -0.58859146 0.0049406546
+1.207 -0.18367 0.024220999 -0.55626613 -0.41351998 -0.72081149 0.0038742681
+1.1932 -0.17833 0.032889999 -0.637739 -0.33691695 -0.69265854 0.0068151141
+1.1675 -0.16178 0.046379 -0.51868534 -0.33422959 -0.78692818 0.012147481
+1.1538 -0.15879001 0.055169001 -0.49155736 -0.33525634 -0.80372542 0.0018572183
+1.168 -0.17955001 0.05026 -0.56045777 -0.30855179 -0.76855892 0.0035808934
+1.1576 -0.17569999 0.058102999 -0.5992772 -0.33880323 -0.72531313 0.0035792086
+1.174 -0.1525 0.035664 -0.52861303 -0.54155111 -0.65367478 0.0026776104
+1.1899 -0.20157 0.046560999 -0.63795209 -0.27119818 -0.72074175 0.0027576075
+1.2043 -0.22438 0.042645 -0.5445798 -0.37807426 -0.74866056 0.00090953195
+1.1913 -0.22021 0.051105998 -0.5653888 -0.33148798 -0.75528222 0.0050745807
+1.21 -0.2005 0.029743001 -0.52060956 -0.30117083 -0.79891282 0.0020091035
+1.1982 -0.19758999 0.037648998 -0.58950841 -0.24388352 -0.77006537 0.0034636338
+1.2115999 -0.21828 0.034768999 -0.49994561 -0.33288932 -0.79952425 0.0012269439
+1.1997 -0.21127 0.039083 -0.59955388 -0.26222429 -0.7561571 0.002475525
+1.1708 -0.19870999 0.056045 -0.57954818 -0.19493547 -0.79128003 0.001964415
+1.1746 -0.21254 0.057998002 -0.50169516 -0.32262149 -0.80263156 0.0029865084
+1.2102 -0.16113 0.0094985999 -0.43329498 -0.30037457 -0.84972382 0.0015395206
+1.1964 -0.15697999 0.016298 -0.61983609 -0.39269668 -0.67940605 0.0072386949
+1.2124 -0.17625999 0.015769999 -0.48290119 -0.419871 -0.76844954 0.00074580923
+1.1997 -0.17053001 0.019962 -0.61599451 -0.39200979 -0.68328553 0.0061924956
+1.2199 -0.19031 0.018608 -0.51159632 -0.38231057 -0.76948541 0.00056856254
+1.1382 -0.15128 0.059425998 -0.52283108 -0.43474278 -0.7332437 0.0038683496
+1.2264 -0.28303999 0.063208997 -0.55599141 -0.28301865 -0.78152025 0.0042760759
+1.2273999 -0.30114001 0.067896001 -0.65476203 -0.27464986 -0.70416903 0.0047090189
+1.2237 -0.34807 0.10063 -0.54415601 -0.40118533 -0.73684782 0.0062355315
+1.2259001 -0.36238 0.10322 -0.52374196 -0.30842978 -0.79408151 0.0033349106
+1.2421 -0.38639 0.10272 -0.58460194 -0.28575987 -0.75932992 0.0003127665
+1.2297 -0.38065001 0.10814 -0.50912768 -0.3150647 -0.80095148 0.00012907643
+1.2640001 -0.34652999 0.064167 -0.6816141 -0.45674786 -0.57164979 0.011155738
+1.226 -0.32532001 0.082323 -0.48315784 -0.4946557 -0.72240859 0.00044991434
+1.2451 -0.34571999 0.083284996 -0.48603567 -0.4498753 -0.74925393 0.011271116
+1.2297 -0.34060001 0.089272 -0.51852602 -0.44132462 -0.73236835 0.005743261
+1.2437 -0.32552999 0.065041997 -0.57477713 -0.51496238 -0.6359601 0.0018034418
+1.2325 -0.31823 0.072121002 -0.67324948 -0.4112491 -0.61449921 0.0038623363
+1.2522 -0.33924001 0.070730999 -0.56378865 -0.59674978 -0.57099229 0.0039205835
+1.2375 -0.33164001 0.077531002 -0.55807775 -0.51781571 -0.64839506 0.0027947836
+1.2632 -0.36162001 0.080539003 -0.59600371 -0.12507413 -0.79318094 0.042481631
+1.2654001 -0.38466001 0.083497003 -0.58762074 -0.47286546 -0.65658224 0.00087597733
+1.2678 -0.36039001 0.070300996 -0.82214159 -0.30816388 -0.47866297 0.0051682573
+1.2835 -0.38482001 0.062268998 -0.56930339 -0.50708663 -0.64711428 0.0060424311
+1.2732 -0.37885001 0.070945002 -0.74648398 -0.35879487 -0.56038195 0.0066064615
+1.2489001 -0.36083001 0.085357003 -0.43624493 -0.2784152 -0.85567248 0.0016876095
+1.2333 -0.35892999 0.094949998 -0.58661741 -0.35834458 -0.72627068 0.0031036572
+1.2502 -0.37887999 0.091697 -0.58425891 -0.34225249 -0.73587012 0.00038347562
+1.2385 -0.37228 0.098987997 -0.57068056 -0.36493436 -0.73562664 0.00096349214
+1.26 -0.35082 0.07801 -0.58885068 -0.46820244 -0.65881819 0.022553423
+1.3016 -0.30695 0.022919999 -0.61707932 -0.32858711 -0.71501309 0.0074688429
+1.3031 -0.24434 -0.018048 -0.60459566 -0.33931321 -0.72064608 0.0021314544
+1.3039 -0.26227999 -0.01306 -0.61627758 -0.35187081 -0.70454872 0.0030325358
+1.3404 -0.28898999 -0.018564001 -0.49406362 -0.46086493 -0.73722768 0.005711887
+1.3467 -0.30215001 -0.015526 -0.54477048 -0.28717691 -0.78787982 0.0083920658
+1.3024 -0.28321001 0.0056306999 -0.68496221 -0.40107918 -0.60824531 0.0011736908
+1.307 -0.30048001 0.010077 -0.76640308 -0.33329943 -0.54912466 0.00078184908
+1.3262 -0.28409001 -0.014985 -0.4542388 -0.47724515 -0.75226599 0.0059763142
+1.3102 -0.27908999 -0.0069622002 -0.57356465 -0.52646416 -0.62758201 0.0015168499
+1.3291 -0.30026001 -0.0085431999 -0.38082337 -0.36327937 -0.85029501 0.0012222433
+1.3152 -0.29813999 -0.0023161001 -0.63478565 -0.16697581 -0.75443107 0.018040676
+1.2632999 -0.24785 0.021020999 -0.49853864 -0.35137355 -0.79246187 0.0056274445
+1.2653 -0.26143 0.022273 -0.50804085 -0.17390907 -0.8435936 0.001190275
+1.2253 -0.24549 0.041708 -0.47220436 -0.40373102 -0.78359705 0.0013237734
+1.2292 -0.26174 0.046936002 -0.51816529 -0.42204219 -0.74389863 0.0013788629
+1.2471 -0.24291 0.025674 -0.43127978 -0.39524645 -0.8110351 0.0053391708
+1.2323 -0.23841 0.032786999 -0.50191516 -0.41489106 -0.75891149 0.0012337123
+1.2496001 -0.26003999 0.030818 -0.49910834 -0.33861169 -0.79764211 0.00017564463
+1.2364 -0.25666001 0.038373001 -0.55734593 -0.37183771 -0.74236262 0.00017372343
+1.2649 -0.30296001 0.042741001 -0.50299054 -0.38545489 -0.77357942 0.00040171004
+1.2851 -0.28619 0.022768 -0.47918135 -0.47949919 -0.73516375 0.0016277866
+1.2693 -0.28117999 0.028661 -0.47709802 -0.43875608 -0.76149231 0.0030276969
+1.2904 -0.29995 0.026275 -0.45981097 -0.37855116 -0.80328876 0.00018498386
+1.2736 -0.29864001 0.034619 -0.46391144 -0.38405463 -0.79830337 0.00099667686
+1.2442 -0.28253001 0.045903001 -0.61024272 -0.34567991 -0.71281779 0.0008133541
+1.2338001 -0.27851 0.054021001 -0.62557995 -0.42293495 -0.65557295 0.0005476455
+1.2499 -0.29934999 0.050156001 -0.49004528 -0.37283978 -0.78793794 7.0148155e-05
+1.2367001 -0.29896 0.058396 -0.59224188 -0.16788663 -0.78807592 0.0022063353
+1.2542 -0.27647999 0.035503998 -0.50584555 -0.3914561 -0.76868874 0.00044681263
+1.2823 -0.24626 0.0031216 -0.68015242 -0.35593209 -0.6408627 0.0025106019
+1.2726001 -0.24081001 0.0090488 -0.62438822 -0.38737059 -0.67829448 0.0015722576
+1.2864 -0.26113001 0.0063576 -0.64816481 -0.40166578 -0.64695215 0.0047681085
+1.2735 -0.25834 0.015478 -0.61450577 -0.26934081 -0.74151075 0.0010707279
+1.2884001 -0.24026 -0.0092281001 -0.63351589 -0.42393363 -0.64725405 0.0059055518
+1.2782 -0.23259 -0.0027276999 -0.67757666 -0.4416557 -0.58807319 0.00079968601
+1.2936 -0.25775 -0.0052116001 -0.71443081 -0.36946329 -0.59420991 0.0012206079
+1.255 -0.23509 0.016790999 -0.39477721 -0.48426613 -0.78079271 0.00025658295
+1.2925 -0.27904999 0.012083 -0.52517235 -0.45451307 -0.71945256 0.0042445008
+1.2766 -0.27412 0.018185001 -0.51320517 -0.38824382 -0.7654326 0.0045776633
+1.2967 -0.29438999 0.019105 -0.62046283 -0.42772987 -0.6573227 0.0035617489
+1.3003 -0.34790999 0.041457999 -0.50009006 -0.43909454 -0.74639529 0.0019044423
+1.3044 -0.32201001 0.025189999 -0.67529249 -0.29600659 -0.67554438 0.0095058801
+1.3214 -0.34715 0.020156 -0.64550173 -0.4661558 -0.60500115 0.0012455386
+1.3095 -0.34055001 0.029056 -0.62694782 -0.39145416 -0.67357248 0.0069535873
+1.3457 -0.38189 0.022891 -0.64628571 -0.24482372 -0.72275591 0
+1.3067 -0.36300001 0.045499999 -0.55769247 -0.31002375 -0.76997691 0.0036384154
+1.3241 -0.38657001 0.042213999 -0.60254657 -0.43631342 -0.66825765 0.0028476701
+1.3094 -0.37937999 0.047687002 -0.58935523 -0.33472139 -0.73527002 0.0088117542
+1.3257 -0.36238 0.02699 -0.64146924 -0.36395788 -0.67531615 0.0022033583
+1.3147 -0.35677001 0.034504 -0.64412451 -0.38833785 -0.65901238 0.0013625025
+1.3281 -0.37922001 0.032225002 -0.6348967 -0.37199652 -0.67714459 0.0020490431
+1.3178 -0.37117001 0.037145998 -0.6225518 -0.33615863 -0.70670128 0.0046323189
+1.3418 -0.34693 0.0023361 -0.52689832 -0.51770329 -0.67406332 0.00041199266
+1.3493 -0.32009 -0.014222 -0.62378776 -0.14650652 -0.76773995 0
+1.3667001 -0.34417999 -0.017171999 -0.49543661 -0.37566227 -0.78321159 0.0011410471
+1.3506 -0.33991 -0.0091858003 -0.4997873 -0.47262782 -0.72583437 0.00070845254
+1.3219 -0.32604 0.0031258001 -0.66030008 -0.36968806 -0.65370822 0.00268742
+1.3131 -0.31922999 0.01178 -0.77219617 -0.30395415 -0.55796504 0
+1.3268 -0.34018001 0.0088192998 -0.58433491 -0.4991321 -0.63985926 0.00059926289
+1.316 -0.33623999 0.017271001 -0.7302947 -0.38088468 -0.56709474 0.0012313571
+1.3293 -0.31995001 -0.0040507 -0.5319407 -0.29499915 -0.79373467 0
+1.3187 -0.31172001 1.1907e-05 -0.6467765 -0.25247148 -0.71967942 0.0097348383
+1.334 -0.33429 -0.0018386 -0.53086042 -0.43024647 -0.73012 0.0023271057
+1.349 -0.36166999 0.0085621001 -0.5332557 -0.53293735 -0.65697497 0.00090509671
+1.368 -0.38174 0.0059142001 -0.65477347 -0.21630085 -0.72421378 0.0045502451
+1.3548 -0.38005 0.01436 -0.59855831 -0.12560816 -0.79117036 0.00085932744
+1.3688 -0.36140999 -0.010308 -0.54568678 -0.4160718 -0.72739965 0.00081878528
+1.3562 -0.35482001 -0.0039860001 -0.55565566 -0.46027905 -0.69237989 0.0028484412
+1.3738 -0.37604001 -0.0042586001 -0.62302029 -0.47238848 -0.62345386 0
+1.3328 -0.35646001 0.016439 -0.53832328 -0.51572001 -0.66651404 0.00049930689
+1.2833 -0.32613999 0.040918998 -0.54322636 -0.3269653 -0.77330387 2.9153665e-05
+1.2715 -0.32056999 0.047003999 -0.51416975 -0.33410674 -0.78993809 0.00039202426
+1.2875 -0.34176999 0.044615 -0.47828525 -0.39216068 -0.78578198 0.0013583601
+1.2722 -0.33897001 0.053096998 -0.52303296 -0.35278711 -0.77587229 0.0025855759
+1.2904 -0.31942999 0.033628002 -0.50328124 -0.28581506 -0.81548619 0.001018523
+1.2786 -0.31228 0.037811998 -0.5232361 -0.37004566 -0.76765239 0.00011818062
+1.2934 -0.33612001 0.037650999 -0.52736157 -0.36821163 -0.7657088 0.00293183
+1.2513 -0.31863001 0.056042001 -0.49018782 -0.44425249 -0.74990374 0.00084308465
+1.2385 -0.31248999 0.060084 -0.6262666 -0.3548052 -0.69419265 0.0050719474
+1.2586 -0.33274001 0.058966 -0.54865551 -0.48611185 -0.68020028 0.0020512785
+1.2902 -0.35960999 0.052561998 -0.37211314 -0.34180799 -0.86295944 0.0037937355
+1.2769001 -0.35979 0.058293 -0.56708372 -0.17984858 -0.80378515 0.023920974
+1.2912 -0.37924001 0.056492001 -0.38173798 -0.35405102 -0.85377043 0.00023873763
+1.2773 -0.37097999 0.059312001 -0.60492814 -0.22427312 -0.76404411 0.016616886
+1.1612 -0.26966 0.1014 -0.49261734 -0.57268447 -0.65525615 0.0016345183
+1.1459 -0.26402 0.10669 -0.50871509 -0.5731796 -0.64239722 0.0043328926
+1.1834 -0.30743 0.10469 -0.59069502 -0.45766565 -0.66454613 0.0046179187
+1.1477 -0.28566 0.12486 -0.54779345 -0.49890956 -0.67157394 0.0039123474
+1.1625 -0.30726001 0.1227 -0.60981768 -0.34796917 -0.71206743 0.002676198
+1.151 -0.29978001 0.12961 -0.64275795 -0.33521342 -0.68883538 0.0041879574
+1.1663001 -0.28279999 0.10643 -0.62381256 -0.35831583 -0.69459897 0.00200868
+1.1529 -0.27755001 0.11364 -0.5139147 -0.5073446 -0.69173211 0.0051062787
+1.1694 -0.29890001 0.11065 -0.62415737 -0.39706862 -0.67287743 0.0025404091
+1.1583 -0.29389 0.118 -0.63591677 -0.38191509 -0.67063451 0.0014852083
+1.1831 -0.26519999 0.081093997 -0.52381331 -0.49165779 -0.6956237 0.0019654816
+1.1874 -0.24155 0.064511999 -0.49903563 -0.2864607 -0.81786537 0.0036358149
+1.2072999 -0.26212001 0.063206002 -0.41857302 -0.60073298 -0.68111414 8.2402439e-05
+1.191 -0.26041999 0.071753003 -0.48528963 -0.41504347 -0.76956671 0.0020141206
+1.1626 -0.24591 0.082690999 -0.50479364 -0.49204552 -0.70927751 0.00077393115
+1.1490999 -0.24084 0.088010997 -0.48106298 -0.47235778 -0.73855031 0.0018497951
+1.1688 -0.26104999 0.087365001 -0.53303498 -0.50501984 -0.67884356 0.00049036567
+1.1507 -0.25720999 0.095522001 -0.42618394 -0.5339396 -0.73025739 0.0047278213
+1.1701 -0.23982 0.072504997 -0.44828832 -0.47783861 -0.7554521 0.0017232394
+1.1551 -0.23344 0.077551 -0.48319378 -0.50982624 -0.71175909 0.00086309382
+1.1755 -0.25343001 0.077550001 -0.50705034 -0.48211744 -0.71446669 0.00019157382
+1.1889 -0.28184 0.088583 -0.59943962 -0.39973029 -0.69346076 0.0020436668
+1.2068 -0.30147001 0.083322003 -0.55289 -0.23256885 -0.80014026 0.00014973084
+1.1919 -0.29945999 0.093062997 -0.55405796 -0.31756446 -0.76952761 0.0043040658
+1.2108999 -0.28083 0.070277996 -0.44386652 -0.40316963 -0.80027294 0.00031637543
+1.1966 -0.27632999 0.076397002 -0.54960006 -0.47880405 -0.68460673 0.001299254
+1.2149 -0.29666001 0.076350003 -0.55600321 -0.36945984 -0.74455339 0.0013452818
+1.1736 -0.27695 0.096648 -0.56107348 -0.41954118 -0.7135697 0.0097505329
+1.178 -0.29587999 0.099597 -0.59760529 -0.35953641 -0.7166599 0.0035885875
+1.1232001 -0.24992999 0.12142 -0.56473774 -0.53276461 -0.6302644 0.0051483987
+1.1065 -0.24247 0.12717 -0.54931957 -0.56879771 -0.61214149 0.00635122
+1.1263 -0.26207 0.12461 -0.60086715 -0.37513399 -0.70585638 0.0028834075
+1.112 -0.25937 0.13395 -0.59787214 -0.38268459 -0.70434463 0.0052116173
+1.1278 -0.24275 0.10709 -0.6203891 -0.54040128 -0.56840461 0.0059688389
+1.1121 -0.23608001 0.11397 -0.55091363 -0.56232476 -0.61667252 0.0035600138
+1.1343 -0.25746 0.11303 -0.67426366 -0.46968347 -0.56988251 0.0039666798
+1.0927 -0.23751 0.1338 -0.46947855 -0.58866441 -0.65807611 0.0081103109
+1.0768 -0.23214 0.13767 -0.49465403 -0.54711694 -0.67526329 0.0070489026
+1.1301 -0.27875 0.13107 -0.51266199 -0.50150388 -0.69690138 0.0039571747
+1.1160001 -0.27307999 0.13707 -0.55847651 -0.40405893 -0.72445869 0.0029991923
+1.1367 -0.29407001 0.13801999 -0.50018924 -0.45421571 -0.73722368 0.0022387705
+1.1384 -0.27304 0.11873 -0.54797637 -0.51624268 -0.65819097 0.0046796696
+1.1346 -0.23765001 0.095457003 -0.57667732 -0.460345 -0.6749264 0.002845725
+1.1389 -0.25027001 0.099445 -0.58697689 -0.4895021 -0.6448611 0.004754107
+1.1839 -0.34413001 0.12279 -0.49479368 -0.3772696 -0.78284532 0
+1.2026 -0.32874 0.10362 -0.5893622 -0.47195771 -0.65567386 0.004868404
+1.1896 -0.32104999 0.10944 -0.59116602 -0.45536563 -0.66570628 0.0052664159
+1.2079 -0.34088001 0.10474 -0.51433408 -0.37189141 -0.7727595 0.0060328054
+1.194 -0.33862001 0.11422 -0.53500861 -0.34494454 -0.77121919 0.0008458115
+1.1672 -0.32189 0.12495 -0.5732795 -0.30155215 -0.76185095 0
+1.1526 -0.31839001 0.13412 -0.62597638 -0.24743176 -0.73954785 0.0026880195
+1.1694 -0.33985999 0.13022 -0.55069214 -0.34106478 -0.76184839 0.0013293785
+1.1575 -0.33658001 0.1375 -0.57717001 -0.34368494 -0.74078035 0.001156874
+1.1742001 -0.31386 0.11604 -0.55239326 -0.41869345 -0.72080338 0.0020032728
+1.2043 -0.36662 0.12155 -0.57406193 -0.37011304 -0.73038977 0.0015329781
+1.1900001 -0.36131001 0.12762 -0.47817469 -0.36539817 -0.79864454 0.00037577105
+1.2074 -0.38080999 0.1249 -0.56266069 -0.26392409 -0.78342652 0.0028699527
+1.1913 -0.37948 0.13428 -0.46077216 -0.34638497 -0.81713307 0.00098854059
+1.2097 -0.35922 0.11162 -0.55380511 -0.36214542 -0.74976707 0.0018181246
+1.1982 -0.35313001 0.11823 -0.53457236 -0.38630021 -0.75166786 0.002252785
+1.2153 -0.37684 0.11582 -0.57519126 -0.37532538 -0.72683275 0.0017811341
+1.1731 -0.35811999 0.13614 -0.5445925 -0.31821984 -0.77598667 0.0040111514
+1.1766 -0.37461001 0.13916001 -0.55340731 -0.35443321 -0.75373566 0.0037101104
+1.2096 -0.32082 0.088734999 -0.51429778 -0.54149735 -0.66504008 0.0043034502
+1.1966 -0.31529 0.095174998 -0.62903619 -0.4628464 -0.62456912 0.0045543602
+1.2155 -0.33539 0.095418997 -0.51816052 -0.50810319 -0.6879977 0.0038244748
+1.2091 -0.24115001 0.047357999 -0.48175719 -0.43030462 -0.76337928 0.0013837609
+1.1964 -0.23784 0.055461999 -0.57857019 -0.3538945 -0.73485726 8.7337801e-05
+1.2129 -0.25705001 0.055318002 -0.51423568 -0.48742047 -0.70567906 0
+1.2176 -0.23214 0.037978999 -0.46780351 -0.418789 -0.77831596 0.00095664134
+1.3853 -0.54500002 0.067501999 -0.46224645 -0.57682604 -0.67349827 0.0068631405
+1.3802 -0.46397001 0.040180001 -0.56307435 -0.35620919 -0.74569583 0.0069956821
+1.3857 -0.44317001 0.023974 -0.48878902 -0.36494821 -0.79240024 0.0022666124
+1.4014 -0.46724001 0.022348 -0.66629422 -0.27933609 -0.6913923 0.00078315241
+1.3901 -0.46108001 0.028677 -0.58741623 -0.34190473 -0.73351431 0.0029132599
+1.3831 -0.40935999 0.0019293 -0.47757193 -0.42331728 -0.76988804 0.0044234437
+1.4019001 -0.42789999 0.0026028 -0.59199154 -0.43818751 -0.67641532 0.00064842054
+1.3885 -0.42221999 0.0087494003 -0.4905633 -0.49875602 -0.71455586 0.00091161736
+1.4055001 -0.403 -0.014305 -0.73742735 -0.49815959 -0.45611173 0.011931987
+1.3904999 -0.39825001 -0.0051158001 -0.54402828 -0.42198381 -0.72523302 0.011867519
+1.4105 -0.42106 -0.010955 -0.86933434 -0.23459442 -0.43499786 0.032738712
+1.3954 -0.41466001 -0.0010938999 -0.55219525 -0.41677588 -0.72206527 0.0075594941
+1.4226 -0.46061999 -0.010056 0.023203088 0.096351989 0.99507678 0
+1.4058 -0.44198999 0.0068047 -0.714544 -0.32479486 -0.61962509 0.0027764651
+1.3937 -0.43784001 0.015246 -0.57423604 -0.39779821 -0.71554852 0.00070043316
+1.4099 -0.46024001 0.010261 -0.69250882 -0.27289039 -0.66780418 0.0010844048
+1.3979 -0.45346999 0.01874 -0.62120134 -0.32438755 -0.71335948 0.00063003675
+1.4164 -0.44051999 -0.0099783 -0.84128952 -0.064944632 -0.53666943 0
+1.4179 -0.45954999 -0.01005 0.00072135881 -0.0036789961 0.99999297 0
+1.3832999 -0.48168999 0.042939998 -0.55026394 -0.2458934 -0.79796362 0.0025339071
+1.3879 -0.50082999 0.045793999 -0.60927707 -0.1799767 -0.77226281 0.0021262709
+1.404 -0.48199001 0.024883 -0.6882605 -0.24499893 -0.68284184 0
+1.393 -0.47891 0.033750001 -0.62686718 -0.26461127 -0.73281544 0.00074111816
+1.4071 -0.50058001 0.028275 -0.67937535 -0.25266415 -0.68891937 0.0030923618
+1.3959 -0.49783 0.037229002 -0.65757847 -0.22142048 -0.72011358 0
+1.4245 -0.54597002 0.041469 -0.42265508 -0.51446271 -0.74611712 0.0015420903
+1.4253 -0.5244 0.024928 -0.53689069 -0.51028019 -0.67183518 0.0012056865
+1.4421 -0.54354 0.023461999 -0.78291112 -0.46641564 -0.41171187 0.0074983952
+1.4325 -0.53987002 0.031184999 -0.54681021 -0.5268088 -0.65074652 0.0026251031
+1.4017 -0.52414 0.040807001 -0.49438965 -0.37759662 -0.78294295 0.0019838579
+1.3892 -0.51921999 0.046964001 -0.49667439 -0.24195324 -0.83353055 0.0076644793
+1.4069 -0.54174 0.046721999 -0.41469294 -0.4410533 -0.7959283 0.00088007079
+1.3918 -0.53694999 0.053348999 -0.48789081 -0.49039385 -0.72213322 0.012613221
+1.4111 -0.51796001 0.031663999 -0.53684968 -0.35562816 -0.76506269 0.002724536
+1.3979 -0.51063001 0.038759999 -0.60325164 -0.21389712 -0.7683329 0.002838467
+1.4162 -0.53397 0.038283002 -0.46230081 -0.47076818 -0.75143546 0.0021604246
+1.4241 -0.48453999 0.0045755999 -0.76335722 -0.38146973 -0.5213123 0.023595229
+1.4295 -0.50107002 0.0070187999 -0.90905708 -0.11856368 -0.39944696 0.083708368
+1.4243 -0.47973001 -0.0082451003 -0.96239507 0.076286152 0.26072258 0.0072456412
+1.4268 -0.49996999 -0.0079389997 -0.43046549 -0.90257937 0.0070680785 0.00015560447
+1.4143 -0.47869 0.012362 -0.70931482 -0.22209772 -0.66898811 0.00087269722
+1.4163001 -0.49775001 0.015712 -0.66680479 -0.27524975 -0.69253802 0.0025463444
+1.4182 -0.4817 -0.018017 -0.86114788 0.034507014 0.507182 0
+1.4182 -0.49586001 -0.017364001 -0.85704404 -0.091141813 0.50711811 0.0040609357
+1.4433 -0.52178001 0.005012 -0.93020207 -0.35896319 -0.076613173 0.060070653
+1.4328001 -0.51942003 0.01431 -0.66179436 -0.37751046 -0.64769906 0
+1.4433 -0.54021001 0.011016 -0.99650908 0.01851156 0.081405699 0.020975741
+1.4381 -0.54820001 0.0030024 -0.80100578 0.22374991 0.55527079 0.01960676
+1.443 -0.52357 -0.0031848999 -0.89628738 -0.12660822 0.42501682 0.015987312
+1.4349999 -0.51950002 -0.012787 -0.49914908 -0.82089329 0.27746072 0.0065918295
+1.4423 -0.53656 -0.0030509001 -0.89687693 0.22023633 0.38354608 0.021114489
+1.4318 -0.54114002 -0.011445 -0.66588634 0.37284923 0.6462034 0.0066346545
+1.4184999 -0.54614002 -0.018908 -0.57416451 0.34829944 0.7409606 0.0022278058
+1.4069999 -0.56156999 0.064000003 -0.52406925 -0.33256578 -0.7840609 0.0014184252
+1.3908 -0.55619001 0.07096 -0.43721062 -0.41425589 -0.79827255 0.00026636772
+1.4162 -0.57159001 0.061507002 -0.50246483 -0.34042099 -0.79475951 0.0035994088
+1.4437 -0.56625003 0.042474002 -0.76209068 -0.28236654 -0.58265507 0.015955638
+1.4311 -0.56263 0.048744 -0.4550142 -0.43114698 -0.77914983 0.002209899
+1.4437 -0.57792997 0.044482999 -0.784338 0.059656519 -0.61745858 0.012666938
+1.4324 -0.57514 0.053706001 -0.52483821 -0.24194138 -0.81609386 0.003038957
+1.4452 -0.56002003 0.030160001 -0.93561035 -0.31329504 -0.16272563 0.011936897
+1.4381 -0.55268002 0.037381001 -0.61437112 -0.49516582 -0.61429542 0.0077531352
+1.4515001 -0.57867998 0.029345 -0.97716856 -0.15608542 -0.1441493 0.019219084
+1.4158 -0.55869001 0.055546001 -0.51840419 -0.29698026 -0.8019101 0.0026293159
+1.4193 -0.57349002 0.059020001 -0.49439088 -0.32913598 -0.80451673 0.0027724071
+1.4450001 -0.55998999 0.012037 -0.9550724 -0.13285853 0.26492485 0.028931117
+1.4367 -0.56123 0.0026262 -0.72156292 0.013911576 0.69220906 0.0014057078
+1.4485 -0.57858002 0.01193 -0.89482337 0.0036948684 0.44640484 0.025651816
+1.4376 -0.57634002 0.0025746999 -0.6422528 -0.031138817 0.7658602 0.00070795673
+1.4281 -0.55901998 -0.0062668999 -0.66230786 0.21504135 0.71770853 0.011235082
+1.4299001 -0.57427001 -0.0034920999 -0.57763356 0.045370672 0.81503433 0.0058821752
+1.415 -0.56173003 -0.016132999 -0.72462106 0.24796234 0.64299226 0.0045468826
+1.4168 -0.57170999 -0.011373 -0.56237555 0.14522879 0.81402856 0.0023754581
+1.2279 -0.46441999 0.1459 -0.55407053 -0.48246604 -0.67840415 1.2763771e-05
+1.2645 -0.50375998 0.14196 -0.62582093 -0.21016936 -0.75111717 0.0073632887
+1.225 -0.48710999 0.16286001 -0.55924052 -0.40983996 -0.72061169 0.0029444739
+1.2297 -0.49470001 0.16408999 -0.60394377 -0.36516348 -0.70845431 0.0044158823
+1.2460999 -0.48280999 0.14425001 -0.510939 -0.31609857 -0.79938918 0.00015576137
+1.2314 -0.47924 0.153 -0.56075561 -0.42190254 -0.71242648 0.0026696865
+1.2507 -0.49842 0.14783999 -0.51536924 -0.28517395 -0.8081277 0.0017970798
+1.2363 -0.49529001 0.15593 -0.58544189 -0.36560094 -0.72359776 0.0026612636
+1.2649 -0.51068997 0.14157 -0.62598574 -0.21118587 -0.75069469 0.0074352277
+1.1028 -0.42381001 0.22239 -0.62287146 -0.23871572 -0.74501401 0.0056202863
+1.064 -0.40533 0.24160001 -0.46282706 -0.32964504 -0.82287627 0.0036176359
+1.0669 -0.42092001 0.24346 -0.55532557 -0.31287158 -0.77053547 0.0048570191
+1.0862 -0.40211001 0.22434001 -0.57517219 -0.36344093 -0.73286265 0.0015240809
+1.0707 -0.39956 0.23339 -0.49683934 -0.37412554 -0.78305852 0.0033433482
+1.0904 -0.41995001 0.22951999 -0.52061486 -0.38206157 -0.76353729 0.0014953832
+1.0750999 -0.41648 0.23687001 -0.51233083 -0.31805876 -0.79771912 0.0022720685
+1.1036 -0.43889999 0.22547001 -0.73937505 -0.17665517 -0.64970559 0.00041554138
+1.0821 -0.43531001 0.24146 -0.41616985 0.10689028 -0.90298235 0.00077619078
+1.0743999 -0.43255001 0.24523 -0.46799621 -0.38367054 -0.7961008 0.00049151742
+1.0944 -0.43669 0.23551001 -0.60052562 -0.30889249 -0.73753262 0.0072896075
+1.1451 -0.40461999 0.18243 -0.55493492 -0.44529423 -0.70268089 0.0024131997
+1.1623 -0.42681 0.183 -0.63716632 -0.39779106 -0.66013741 0.0034899905
+1.1508 -0.42076001 0.18752 -0.47905925 -0.42054194 -0.77048469 0.0074116373
+1.1812 -0.46830001 0.18089999 -0.58652371 -0.32936367 -0.73993897 0.0037807445
+1.1446 -0.44345999 0.20085 -0.40399608 -0.2876147 -0.86836904 0.0014344248
+1.15 -0.45985001 0.20397 -0.5391801 -0.32487795 -0.77700651 0.00076887017
+1.1652 -0.44158 0.18577 -0.66633713 -0.26273522 -0.69782877 0.0006778508
+1.1533999 -0.43909001 0.19523001 -0.51004553 -0.31737795 -0.79945272 0.0026375547
+1.1689 -0.46021 0.18931 -0.64181346 -0.29813763 -0.70653343 0.0022370927
+1.1561 -0.45636001 0.19821 -0.56872571 -0.25227639 -0.78288424 0.0018616952
+1.1864001 -0.42195001 0.16259 -0.55956787 -0.27563918 -0.7816053 0
+1.2027 -0.40786999 0.14149 -0.56095189 -0.3989087 -0.72539985 0.0057105524
+1.1878999 -0.40024999 0.14726999 -0.50374389 -0.44569227 -0.74000031 0
+1.2067 -0.42214999 0.14568999 -0.74681473 -0.1421905 -0.64965349 0.010998433
+1.1964 -0.41945001 0.15456 -0.64748818 -0.26419207 -0.71481574 0.0041995668
+1.1653 -0.40186 0.16407 -0.57944256 -0.32946199 -0.74545366 0.00097648794
+1.1517 -0.39998999 0.1728 -0.54986751 -0.37611875 -0.74577504 0.0016544178
+1.1676 -0.4206 0.17062999 -0.62914443 -0.40768242 -0.66179478 0.0084388219
+1.1576 -0.41578001 0.17678 -0.63276052 -0.4626947 -0.62090886 0.0023165205
+1.1714 -0.39658001 0.15583999 -0.55855322 -0.37072551 -0.74201137 0.0019586678
+1.2019 -0.44817999 0.16158 -0.64889592 -0.35521516 -0.67287171 0.0066804104
+1.1901 -0.44108 0.16669001 -0.55059415 -0.29150882 -0.78222036 0.0052207368
+1.2049 -0.46241999 0.16423 -0.58784276 -0.35223743 -0.72826475 0.0044291662
+1.1908 -0.46015999 0.17295 -0.50101346 -0.27549717 -0.82041866 0.00028972697
+1.2059 -0.44016999 0.14791 -0.79126912 -0.27055004 -0.54835749 0.014261735
+1.1985 -0.43720001 0.15640999 -0.7389074 -0.24976605 -0.62580568 0.012356797
+1.2122999 -0.45743999 0.15316001 -0.62616402 -0.4381837 -0.64491373 0.0047750026
+1.1738 -0.43911999 0.17603 -0.5866363 -0.1941804 -0.78622627 0.0021782718
+1.1769 -0.45372 0.17845 -0.59822243 -0.28228819 -0.74996221 0.0034831876
+1.1052999 -0.40127 0.20517001 -0.5675661 -0.39429456 -0.72277272 0.0028363336
+1.1243 -0.42370999 0.20451 -0.58073872 -0.30620512 -0.75430834 0.0050486671
+1.1122 -0.41975999 0.21283001 -0.58311862 -0.19570123 -0.78846288 0.0056176777
+1.1294 -0.40061 0.18973 -0.49898547 -0.38481873 -0.77648443 0.0017768412
+1.1164 -0.39827999 0.19724999 -0.5087204 -0.29759243 -0.80786282 0.00013420841
+1.1329 -0.41663 0.19379 -0.46146569 -0.39087641 -0.79640752 0.0016378255
+1.0942 -0.39783001 0.21382 -0.64010924 -0.36167967 -0.67782581 0.00079558656
+1.0985 -0.41192001 0.21873 -0.59074062 -0.42454261 -0.68614072 0.001404607
+1.1285 -0.43968001 0.20635 -0.44755968 -0.30869904 -0.83928263 0.0010389263
+1.1125 -0.43876001 0.21546 -0.60480314 -0.21879515 -0.76572955 0.00425576
+1.131 -0.45401999 0.21128 -0.49323568 -0.35748455 -0.79304689 0
+1.1184 -0.45111999 0.21777 -0.48108307 -0.36671716 -0.79628992 0.00025979555
+1.1375999 -0.43075001 0.19916999 -0.42509967 -0.36734188 -0.82725465 0.0039691203
+1.1384 -0.39215001 0.17868 -0.52765024 -0.44135153 -0.72580582 0.0011019261
+1.1835001 -0.47573 0.18385001 -0.58843762 -0.48365682 -0.64793301 0
+1.1734 -0.47211 0.19134 -0.66039938 -0.39251962 -0.64015704 0.0016057175
+1.2108999 -0.47966999 0.16771001 -0.48106855 -0.37710023 -0.79143447 0.0013453919
+1.1938 -0.47621 0.1759 -0.49945131 -0.30401969 -0.81124628 0.0016344929
+1.2184 -0.49175999 0.16943 -0.47903752 -0.4123731 -0.77490091 9.2262773e-05
+1.2185 -0.47211999 0.15841 -0.55402249 -0.44056097 -0.70637459 0.0014301483
+1.3012 -0.42749 0.082056999 -0.50986552 -0.37196723 -0.77567875 0.00074572384
+1.3069 -0.40551001 0.065077998 -0.55072725 -0.4768241 -0.68508267 0.0038016823
+1.3216 -0.42535001 0.062590003 -0.70161211 -0.21356767 -0.67980093 0.0053468347
+1.3121001 -0.42085999 0.070437998 -0.63830382 -0.30997828 -0.70461452 0.006891022
+1.3039 -0.44259 0.086127996 -0.64148837 -0.3135798 -0.70011449 0.0065512592
+1.3214 -0.46847001 0.081045002 -0.61295748 -0.42811111 -0.66408134 0.0088156881
+1.3091 -0.4605 0.088408999 -0.61152476 -0.27150279 -0.7431848 0.01122878
+1.323 -0.43887001 0.062288001 -0.69106668 -0.089015983 -0.71728867 0.001634779
+1.3137 -0.44034001 0.072249003 -0.74635005 -0.14232817 -0.65015721 0.001751045
+1.327 -0.4628 0.068287998 -0.59730291 -0.49180031 -0.63353115 0.0027635072
+1.3174 -0.45497 0.072795004 -0.72173673 -0.37201655 -0.58369499 0.0049741333
+1.267 -0.42337999 0.10432 -0.51910937 -0.38559148 -0.76278746 0.0017430108
+1.2254 -0.40270999 0.125 -0.62048537 -0.37184191 -0.6904574 0.0033945285
+1.2408 -0.42745 0.12039 -0.46636742 -0.25880435 -0.84588522 0.008388659
+1.2295001 -0.42017999 0.12791 -0.57649893 -0.16489826 -0.80028588 0.0035680104
+1.2457 -0.40015 0.10355 -0.50961578 -0.25540027 -0.82162184 0.0032770613
+1.2326 -0.39912 0.11327 -0.63365006 -0.32752866 -0.70086545 0.0037815387
+1.2496001 -0.41971001 0.1124 -0.47258583 -0.27918667 -0.83589327 0.00040260048
+1.2368 -0.41429999 0.1184 -0.61218494 -0.34548974 -0.71124297 0.0059987116
+1.2644 -0.46368 0.12297 -0.56781244 -0.40750691 -0.71521121 0.0038714639
+1.2823 -0.44885999 0.10131 -0.5907315 -0.25212717 -0.76646477 0.0021776864
+1.2717 -0.44071001 0.10808 -0.59291047 -0.28112289 -0.75460392 0.00044928971
+1.2854 -0.46169999 0.10281 -0.59290564 -0.27474403 -0.75695354 0.0012048773
+1.2736 -0.45949 0.11256 -0.58378798 -0.29766008 -0.75537413 0.0051527247
+1.2465 -0.44231001 0.12245 -0.41003913 -0.33917594 -0.84665674 0.0055273999
+1.2298 -0.43869999 0.12846 -0.42341137 -0.25026879 -0.87068266 0.009422536
+1.2503 -0.46044001 0.12977 -0.50682789 -0.44103676 -0.74068362 0.00070842198
+1.2315 -0.45637 0.13647 -0.7583909 -0.32650238 -0.56412715 0
+1.2563 -0.43819001 0.11747 -0.45292088 -0.25618884 -0.85394967 0.0025923608
+1.2575999 -0.45065001 0.11853 -0.52103186 -0.35565758 -0.77590817 0.0057682903
+1.2836 -0.40594 0.081396997 -0.54947388 -0.4299852 -0.71637368 0.0021275033
+1.2703 -0.40041 0.089169003 -0.57655406 -0.39969864 -0.71261948 0.00036157254
+1.2886 -0.42135 0.086076997 -0.49859381 -0.38566548 -0.77631593 0.00037297729
+1.2746 -0.41800001 0.094327003 -0.57232541 -0.38944802 -0.72164667 0.00015758797
+1.2893 -0.39941999 0.071686 -0.50070703 -0.56029499 -0.65981966 0.0035008132
+1.2786 -0.39414001 0.077574 -0.62368965 -0.49410498 -0.60569918 0.0025700778
+1.2958 -0.41459 0.078261003 -0.49427354 -0.45601776 -0.74009556 0.00099886511
+1.2575999 -0.39873001 0.097755998 -0.39923564 0.60133547 -0.69210303 0
+1.2894 -0.43880001 0.093865998 -0.49734348 -0.31200153 -0.80950886 0.00085763546
+1.2798001 -0.43821999 0.099160999 -0.59697139 -0.22487417 -0.77010173 0.0050320253
+1.2925 -0.45809999 0.097857997 -0.50157678 -0.22410072 -0.83558339 8.0324695e-05
+1.3017 -0.48591 0.10284 -0.4907161 -0.4766708 -0.72937143 0.00016729262
+1.3271 -0.50579 0.10323 -0.41284645 -0.43370301 -0.80091166 0.013181553
+1.3087 -0.50081998 0.10857 -0.39511761 -0.53483957 -0.74687934 0.0014780232
+1.3404 -0.51190001 0.10032 -0.62724161 -0.32529151 -0.70763928 0.027191443
+1.3435 -0.53868002 0.10192 -0.42124069 -0.78460282 -0.45492268 0.00027046297
+1.3041 -0.52306002 0.12263 -0.49409416 -0.47833824 -0.72599143 0.0052817371
+1.3147 -0.53123999 0.12117 -0.61948448 -0.45614526 -0.63888228 0.0048036608
+1.3298 -0.52092999 0.10459 -0.49379387 -0.16969727 -0.85286021 0.0086761005
+1.3124 -0.52002001 0.11478 -0.57748103 -0.45591295 -0.67724377 0.0072055873
+1.3278 -0.53375 0.10806 -0.57171744 -0.2939924 -0.76596844 0.0068043009
+1.318 -0.53166997 0.116 -0.57012969 -0.31393725 -0.75920719 0.0081205834
+1.3453 -0.50351 0.085280001 -0.69346082 -0.39975354 -0.59942412 0.013812186
+1.3444 -0.48308 0.068600997 -0.62440163 -0.47602177 -0.61929458 0
+1.364 -0.50541002 0.061824001 -0.7360962 -0.26765481 -0.62171012 0.0054716878
+1.3548 -0.49987999 0.070779003 -0.73121637 -0.37157726 -0.57206029 0.0061431965
+1.3264 -0.48144001 0.083953999 -0.54755771 -0.41856644 -0.72455686 0.0027530093
+1.3097 -0.47858 0.093033001 -0.50685614 -0.35799456 -0.78417897 0.0041479594
+1.3322999 -0.49880999 0.093139999 -0.50780088 -0.58824235 -0.62937194 0.0084542986
+1.318 -0.49193999 0.096364997 -0.43802735 -0.53710204 -0.72086996 0.0013497764
+1.3336999 -0.47571999 0.073448002 -0.61843628 -0.49745378 -0.60833901 0.0016516427
+1.3472 -0.52028 0.089813001 -0.79132795 -0.30907318 -0.52751666 0.0072591691
+1.3645999 -0.54514998 0.084514 -0.69075334 -0.49886966 -0.52343959 0.0050056605
+1.3546 -0.53869998 0.091752999 -0.7175073 -0.38216931 -0.58234859 0.010326358
+1.3664 -0.52164 0.065471999 -0.71649873 -0.31059641 -0.62462735 0.004831661
+1.3572 -0.51836002 0.074340999 -0.77163988 -0.22431879 -0.59519148 0.00095236266
+1.3708 -0.53833002 0.071797997 -0.58775049 -0.4898774 -0.64387065 0.011347357
+1.3591 -0.53252 0.077234 -0.69326401 -0.41836053 -0.58682162 0.0050896001
+1.3367 -0.51358998 0.098814003 -0.62724161 -0.32529151 -0.70763928 0.027191443
+1.2703 -0.48199999 0.12782 -0.67131883 -0.29944161 -0.6779865 0.00293321
+1.2842 -0.505 0.12311 -0.53040755 -0.37921798 -0.75819623 0.0091622239
+1.2726001 -0.49917001 0.13125999 -0.69002783 -0.23723286 -0.68379986 0.004558946
+1.2882 -0.47966 0.10831 -0.53864831 -0.33857018 -0.77151036 0.0025591145
+1.2769001 -0.47593001 0.11616 -0.67368889 -0.2859866 -0.68143594 0.0039075613
+1.2905999 -0.49726999 0.11544 -0.40457579 -0.40962598 -0.81763375 0.00036549233
+1.2798001 -0.49320999 0.11885 -0.65281433 -0.30826756 -0.69195706 0.0054440233
+1.255 -0.47701001 0.13676 -0.50942749 -0.3979075 -0.76298976 0.00083337375
+1.26 -0.49169001 0.13970999 -0.55620921 -0.29863784 -0.77552998 0.0023277171
+1.2912 -0.51560998 0.12475 -0.40940359 -0.42657262 -0.80648899 0.00035845122
+1.2739 -0.51283997 0.13248999 -0.60421944 -0.28071532 -0.74573308 0.010036114
+1.2977 -0.47310999 0.098026 -0.51347333 -0.2961258 -0.80539095 0.0023670646
+1.341 -0.40842 0.042383 -0.6576798 -0.28591579 -0.69692856 0.011647227
+1.3417 -0.42014 0.042071 -0.66510004 0.060099006 -0.74433202 0.0027995338
+1.3484 -0.40057999 0.026938001 -0.7097311 -0.29630691 -0.63912755 0.0084156031
+1.3667001 -0.42287999 0.022938 -0.52608687 -0.40783527 -0.74625933 5.8720845e-05
+1.3504 -0.41905999 0.032357998 -0.65281427 -0.30040962 -0.69540465 0.0082233651
+1.3298 -0.40110999 0.046149001 -0.52198982 -0.33571687 -0.78410506 0.0098976335
+1.312 -0.39877 0.054951001 -0.55025518 -0.3250204 -0.76914304 0.0088257091
+1.3297 -0.42016 0.050843999 -0.59718567 -0.20922469 -0.77433473 0.0063313171
+1.3183 -0.41420001 0.057693001 -0.66746753 -0.4257853 -0.61089599 0.00022172106
+1.3358001 -0.39721999 0.035448998 -0.64257795 -0.4731696 -0.60266417 0.0017358781
+1.3628 -0.44870001 0.041563999 -0.51190782 -0.48992437 -0.70563757 0.00061979273
+1.3473001 -0.44088 0.04606 -0.47016388 -0.54310858 -0.69568604 0
+1.3693 -0.46191001 0.045062002 -0.43162709 -0.34809667 -0.83218193 0.0075617651
+1.3494999 -0.46041 0.053238999 -0.41156724 -0.24689537 -0.8772999 0
+1.3688 -0.44134 0.031438999 -0.45609897 -0.45092627 -0.76722819 0.0022173645
+1.3564 -0.43636 0.036261 -0.51191992 -0.43180862 -0.74261653 0.0024386386
+1.3745 -0.45653999 0.036775 -0.53458649 -0.49749058 -0.68316942 0.00081034115
+1.3314 -0.43873999 0.054995999 -0.5980522 -0.23116659 -0.76739526 0.0048619816
+1.3358001 -0.45750001 0.058842 -0.49577585 -0.34156317 -0.79846168 0.0016963617
+1.3695 -0.39954999 0.0072007999 -0.5509581 -0.271743 -0.78905064 0.0083570145
+1.3572 -0.39927 0.016347 -0.66101998 -0.2135098 -0.71935117 0.0016725642
+1.3732001 -0.41615 0.014692 -0.50560564 -0.46756172 -0.72508544 0.0018205909
+1.3707 -0.47936001 0.049392 -0.42318642 -0.2297999 -0.87641621 0.00041059128
+1.3526 -0.47911999 0.057043999 -0.52780443 -0.31183487 -0.79005158 0.009742789
+1.3691 -0.50010002 0.055190001 -0.65107608 -0.24486032 -0.71843117 0.010560745
+1.36 -0.493 0.057812002 -0.55835587 -0.34127185 -0.75615621 0.018694049
+1.3716 -0.51795 0.056322999 -0.59250993 -0.21664754 -0.77588391 0.0052656145
+1.3762 -0.53196001 0.058504 -0.57497674 -0.52065331 -0.63112736 0.010245605
+1.2114 -0.39914 0.13224 -0.45826232 -0.42934072 -0.77824295 0.00054435997
+1.1967 -0.39460999 0.13744999 -0.47167587 -0.40383112 -0.78386366 0.0010537173
+1.2145 -0.42061999 0.13699 -0.53838652 -0.033811294 -0.84201938 0.017898368
+1.2134 -0.43706 0.13598 -0.63806188 -0.065775692 -0.76717055 0.014956202
+1.3692 -0.55263001 0.086025998 -0.75979787 -0.53965414 -0.36260271 0
+1.3733 -0.55304998 0.078047 -0.5350396 -0.50775373 -0.67521763 0.0095922798
+0.96698999 -0.38306001 0.30175 -0.65813267 -0.55166268 -0.51237643 0.0088539924
+0.97341001 -0.39208999 0.3026 -0.74739623 -0.44469148 -0.49360746 0.0053339945
+0.92010999 -0.14992 0.22060999 -0.58289778 -0.47631252 -0.65829819 0.0081211496
+0.90618998 -0.14202 0.22622 -0.50065458 -0.54554093 -0.67210859 0.0052382913
+0.90512002 -0.22482 0.26493999 -0.53116578 -0.49243587 -0.68947065 0.0059627276
+0.94339001 -0.18798 0.22351 -0.64723927 -0.43505722 -0.62594455 0.007414781
+0.90289998 -0.16690999 0.24276 -0.48967022 -0.37935618 -0.78505552 0.0087683247
+0.90592003 -0.18061 0.24367 -0.46967641 -0.15563262 -0.86901236 0
+0.92372 -0.16372 0.22582 -0.68369025 -0.3716099 -0.62807143 0.0038080679
+0.91175002 -0.15888999 0.23216 -0.46969092 -0.44244665 -0.76395768 0.0046347403
+0.92804998 -0.18017 0.22972 -0.5546723 -0.37899235 -0.74074513 0.013686095
+0.91599 -0.17851 0.23834001 -0.52116227 -0.18643758 -0.83284509 0.00070356549
+0.94247001 -0.21991 0.2406 -0.5578633 0.0055941222 -0.82991397 0.018345719
+0.94531 -0.20132001 0.22724 -0.69555229 -0.31781995 -0.64435828 0.0060664425
+0.96415001 -0.22222 0.22321001 -0.59273654 -0.23848999 -0.7692762 0.0035392542
+0.94836998 -0.21962 0.23218 -0.54240376 -0.23304446 -0.80714834 0.011547633
+0.92438 -0.20417 0.24372 -0.47885847 -0.3432695 -0.80799794 0.0066779079
+0.90994 -0.19968 0.25029999 -0.45736501 -0.27962896 -0.84417111 0.011749286
+0.92853999 -0.22058 0.24605 -0.50219202 -0.23875861 -0.83114219 0.009050536
+0.91131997 -0.21894 0.2545 -0.45635763 -0.35189787 -0.81725496 0.015340651
+0.93255001 -0.19745 0.23583999 -0.48499504 -0.37711766 -0.78902608 0.0039999499
+0.91733003 -0.19233 0.23955999 -0.4831956 -0.35856867 -0.79871809 0.004263124
+0.93940997 -0.22313 0.23932 -0.55780923 0.0054597775 -0.82995123 0.018288651
+0.98365003 -0.087447003 0.14300001 -0.5343284 -0.43919125 -0.72222173 0.020859174
+0.98772001 -0.10072 0.14567 -0.64257264 -0.24667592 -0.72543192 0.0033578898
+1.0225 -0.14695001 0.14199001 -0.55393815 -0.45102072 -0.69980913 0.0024216871
+0.98237997 -0.12594 0.16279 -0.59998041 -0.43480048 -0.67154449 0.0040623257
+0.9878 -0.14094999 0.16676 -0.60340434 -0.31153163 -0.73406482 0.004362545
+1.0046 -0.12337 0.14393 -0.60718566 -0.46532026 -0.64405173 0.004145883
+0.98931003 -0.11993 0.15172 -0.57169503 -0.42222625 -0.70348394 0.0066458946
+1.0105 -0.14125 0.14869 -0.53877282 -0.39443734 -0.74440783 0.0057950523
+0.99333 -0.13597 0.15565 -0.58866179 -0.37937009 -0.71383172 0.0068077324
+0.94224 -0.10658 0.18227001 -0.61563754 -0.35623261 -0.70291454 0.006454872
+0.90227002 -0.088491 0.20083 -0.51014268 -0.52309275 -0.68273598 0.001020642
+0.92010999 -0.10614 0.20205 -0.65930402 -0.20527864 -0.72331107 0.017872469
+0.90979999 -0.10219 0.20688 -0.36879334 -0.35380492 -0.85954261 0.019113882
+0.92387003 -0.083182998 0.18434 -0.57933778 -0.42203793 -0.69731748 0.0054334416
+0.90796 -0.079536997 0.19045 -0.465372 -0.41472718 -0.7819401 0.0013496076
+0.92698002 -0.10083 0.18895 -0.62554699 -0.32068369 -0.71123338 0.015298203
+0.91424 -0.095469996 0.19647001 -0.52550608 -0.48839656 -0.69664353 0.0065247095
+0.94384003 -0.14613 0.20209999 -0.51537222 -0.35891226 -0.77818596 0.0090524675
+0.94560999 -0.12087 0.18292999 -0.50943029 -0.28369299 -0.81240326 0.012596425
+0.96451998 -0.14341 0.18561999 -0.58202875 -0.35981584 -0.72922909 0.0062108287
+0.95108002 -0.13948999 0.19204 -0.44184566 -0.57612842 -0.68763977 0.00043946339
+0.92216998 -0.12127 0.20203 -0.64151675 0.067553326 -0.76412874 0.016648268
+0.90858001 -0.11985 0.20952 -0.58633959 -0.15663503 -0.79477751 0.0081205154
+0.92864001 -0.14089 0.20671 -0.40416104 -0.62518793 -0.66767794 0.00027018596
+0.91084999 -0.1383 0.21479 -0.51845211 -0.48359451 -0.70522606 0.0093298769
+0.92913002 -0.11945 0.19196001 -0.60684586 -0.26156223 -0.75054866 0.017304381
+0.91881001 -0.12042 0.19993 -0.64151067 0.067863122 -0.76410657 0.016636239
+0.93642998 -0.13423 0.19604 -0.44523221 -0.51846665 -0.7300415 0.0016639344
+0.94607002 -0.084027 0.16329999 -0.51925343 -0.3928965 -0.75895214 0.00015522096
+0.96402001 -0.103 0.16253 -0.50985837 -0.38407448 -0.76976049 0.0012871025
+0.94928998 -0.10054 0.17045 -0.55595332 -0.38441527 -0.7369808 0.0072744084
+0.96833998 -0.080900997 0.14826 -0.489988 -0.49274701 -0.71910512 0.0091791917
+0.95319998 -0.077055 0.15575001 -0.49872333 -0.40217966 -0.76780635 0.0012620623
+0.97306001 -0.099480003 0.15522 -0.49934223 -0.35610849 -0.78983796 0.0015294983
+0.95798999 -0.091035001 0.15933 -0.47527552 -0.41007993 -0.77842629 0.00021260795
+0.93120998 -0.079164997 0.17169 -0.6277582 -0.41766509 -0.65686798 0.0035748349
+0.93559998 -0.094746001 0.17721 -0.60661209 -0.43924946 -0.66263235 0.0051668249
+0.97083998 -0.12093 0.16669001 -0.50408477 -0.40619448 -0.76217103 0.0015237941
+0.95226002 -0.11792 0.17452 -0.64153957 -0.37013459 -0.67188346 0.0098633002
+0.97091001 -0.13865 0.176 -0.49418133 -0.54374611 -0.67832512 0.00070525869
+0.9594 -0.13106 0.17951 -0.49114013 -0.49507922 -0.71671325 0.0020863509
+0.97667003 -0.1124 0.15716 -0.53848583 -0.37195033 -0.75609922 0.0027875521
+0.98711997 -0.18414 0.18637 -0.6252197 -0.33880723 -0.70307171 0.0041257525
+1.0233999 -0.22653 0.18190999 -0.5968039 -0.33507854 -0.72907305 0.0050694789
+0.98484999 -0.22363999 0.20567 -0.66779637 -0.44179705 -0.59905213 0.0055548227
+1.0051 -0.20672999 0.18151 -0.50729889 -0.44473287 -0.73814666 0.00062372262
+0.98895001 -0.19973999 0.18944 -0.5474174 -0.270888 -0.79180425 0.0042941524
+1.0112 -0.22076 0.18630999 -0.49122092 -0.46940717 -0.73372942 0.00032240679
+0.99116999 -0.21887 0.19478001 -0.56185848 -0.35558659 -0.74690914 0.011748854
+1.0222 -0.18564001 0.16178 -0.58163029 -0.26266742 -0.76987791 0.0030878866
+1.0412 -0.16915999 0.14094 -0.5846107 -0.33237171 -0.74010766 0.001747996
+1.0283 -0.16171999 0.14585 -0.53418678 -0.38437647 -0.75292712 0.00071588205
+1.0427999 -0.18242 0.14297 -0.59405589 -0.274436 -0.756163 0.0012619509
+1.0307 -0.17914 0.15208 -0.5757218 -0.31923613 -0.75275004 0.0018368105
+1.0087 -0.16665 0.16322 -0.5195834 -0.42291227 -0.74241394 0.0010011081
+0.99000001 -0.15944 0.16979 -0.60243505 -0.17511441 -0.77872133 0.0014230409
+1.0118001 -0.18057001 0.16776 -0.55888617 -0.31034514 -0.76898122 0.0011767796
+0.99247998 -0.17843001 0.17579 -0.74161404 -0.35558027 -0.56883323 0.00010477105
+1.0132 -0.15812001 0.15468 -0.52040637 -0.3934626 -0.75786835 0.0016599855
+0.99913001 -0.15102001 0.15925001 -0.52640891 -0.37947947 -0.76084757 0.0064034876
+1.0185 -0.17329 0.15838 -0.56736362 -0.36665469 -0.73733491 0.00040973394
+1.0235 -0.20095 0.16366 -0.59018242 -0.30829203 -0.74608362 0.004125752
+1.0453 -0.22571 0.16309001 -0.57705379 -0.35377771 -0.73610479 0.0024526832
+1.0290999 -0.21952 0.17064001 -0.56210846 -0.48348728 -0.67102474 0.0006268305
+1.0492001 -0.20073 0.14816999 -0.56948209 -0.32450163 -0.75524098 0.0017648145
+1.0333 -0.19854 0.1577 -0.51512897 -0.21973591 -0.82846749 0.00086731161
+1.0523 -0.21799 0.1523 -0.59198225 -0.339688 -0.7308687 0.003280432
+1.038 -0.21199 0.15910999 -0.51715535 -0.37827894 -0.76775998 0.0023181713
+1.013 -0.19955 0.17304 -0.52884763 -0.32244202 -0.78508049 0.0093965158
+0.99772 -0.19383 0.17859 -0.56347108 -0.36929145 -0.73900217 0.0060579204
+1.0181 -0.21213999 0.17617001 -0.55740118 -0.4510752 -0.69701862 0.0021248392
+0.94558001 -0.16125 0.2043 -0.57595289 -0.21678922 -0.78821361 0.0013701805
+0.96641999 -0.18494 0.2035 -0.52542877 -0.36365965 -0.76920497 0.007514996
+0.94849998 -0.18072 0.20988999 -0.53098691 -0.44027907 -0.72402161 0.017884584
+0.96801001 -0.16013999 0.18736 -0.56686091 -0.28544185 -0.77278173 0.0060031908
+0.95394999 -0.15956999 0.19706 -0.58802652 -0.19435363 -0.78514421 0.0003046215
+0.97271001 -0.17767 0.19269 -0.50758332 -0.4351708 -0.74362999 0.0048252717
+0.95712 -0.17236 0.19864 -0.51295215 -0.39192924 -0.76372218 0.0046877926
+0.93059999 -0.15966 0.21357 -0.64175779 -0.29455224 -0.70808601 0.0069692978
+0.93590999 -0.1745 0.2157 -0.62227732 -0.41894227 -0.66125518 0.0084508499
+0.96864003 -0.20104 0.20621 -0.55878282 -0.11718439 -0.82099307 0.002873291
+0.95200998 -0.19794001 0.21475001 -0.63624012 -0.42104024 -0.64647007 0.010734497
+0.97319001 -0.21905001 0.21394999 -0.66811734 -0.35537589 -0.65370274 0.01843692
+0.97627997 -0.20022 0.19869 -0.61119646 -0.14336677 -0.778386 0.0012970994
+0.97763997 -0.21077999 0.19918001 -0.61690307 -0.39219093 -0.68236119 0.0099694841
+0.97689998 -0.15835001 0.17816 -0.41708195 -0.7229296 -0.55083156 0
+0.83244997 -0.10628 0.26047999 -0.83598381 -0.30831164 -0.45395482 0
+0.86247998 -0.14501999 0.26115 -0.51577324 -0.36600134 -0.77461016 0.007264086
+0.84259999 -0.12534 0.2615 -0.54004675 -0.4351317 -0.72042328 6.6961336e-05
+0.83625001 -0.11772 0.26137 -0.58030701 -0.36780253 -0.72661209 0.0065248245
+0.85106999 -0.14029001 0.26339 -0.36623421 -0.3198159 -0.87383652 0.0063447626
+0.86207002 -0.1084 0.24113999 -0.54468215 -0.37740356 -0.74892449 0.010276433
+0.88080001 -0.089557998 0.22240999 -0.5289759 -0.45385185 -0.71707952 0.012702914
+0.86698002 -0.083995998 0.22391 -0.43715629 -0.42181033 -0.79433644 0.019782079
+0.88308001 -0.10015 0.22262999 -0.61969543 -0.037525333 -0.78394485 0.0067437757
+0.87041003 -0.10134 0.23029 -0.43148243 -0.32950881 -0.83978975 0.011230771
+0.84385002 -0.082145996 0.24299 -0.57177842 -0.25731584 -0.77901095 0.020818235
+0.82821 -0.080293998 0.24794 -0.40284789 -0.2171687 -0.88912952 0.0024206138
+0.84864998 -0.10108 0.24569 -0.53982139 -0.32812339 -0.77519542 0.013590534
+0.83332002 -0.099202998 0.25413999 -0.54808438 -0.31355858 -0.77542537 0.0076837544
+0.85093999 -0.079319999 0.23205 -0.67003947 -0.34625429 -0.65662396 0.01947327
+0.85244 -0.096341997 0.23593 -0.57609314 -0.38974136 -0.71848333 0.01444769
+0.86497003 -0.12238 0.24368 -0.64895624 -0.32440996 -0.68819618 0.017495435
+0.88213998 -0.14775001 0.24329001 -0.52808195 -0.50496137 -0.68274713 0.0097360499
+0.8696 -0.14029001 0.25023001 -0.64319837 -0.44380423 -0.62396616 0.010668348
+0.89019001 -0.12142 0.22543 -0.51318288 -0.15374896 -0.844396 0.0027191178
+0.87229002 -0.11938 0.23406 -0.56589788 -0.20567895 -0.79840833 0.0093831094
+0.89004999 -0.14026 0.2335 -0.40608209 -0.50859195 -0.75923091 0.005929207
+0.87318999 -0.13495 0.23662999 -0.59116858 -0.43485707 -0.67927819 0.017106522
+0.85049999 -0.1194 0.25159001 -0.50628436 -0.36073288 -0.78329301 0.0018544163
+0.83652002 -0.11365 0.25791001 -0.58281034 -0.38500869 -0.71561188 0.0036702873
+0.85396999 -0.13332 0.25725001 -0.52678651 -0.47182706 -0.70701849 0.0030020103
+0.81825 -0.077197 0.25351 -0.5331502 -0.26386404 -0.80382001 0
+0.86668003 -0.16204999 0.26398 -0.53675699 -0.242259 -0.80820954 0.0060769874
+0.88402998 -0.18756001 0.26230001 -0.53734642 -0.41998199 -0.73135084 0.0012875749
+0.87023997 -0.17910001 0.26620001 -0.59402972 -0.35608861 -0.72133869 0.00722775
+0.85558999 -0.15565 0.26576999 -0.27747649 -0.22467297 -0.93409246 4.2952135e-05
+0.88739002 -0.20092 0.26648 -0.62453872 -0.27333152 -0.73160189 0.0081534758
+0.87567002 -0.19695 0.27224001 -0.45637411 -0.34914064 -0.81842744 0.0015657499
+0.89095002 -0.21888 0.27077001 -0.58964378 -0.41050264 -0.69556284 0.013809392
+0.87834001 -0.21128 0.27511001 -0.47871614 -0.27918512 -0.83239812 0
+0.88856 -0.16026001 0.24774 -0.50209278 -0.38262904 -0.77556294 0.0098805465
+0.87380999 -0.15887 0.25606 -0.60038304 -0.30596855 -0.73886633 0.0066267443
+0.89003998 -0.17935 0.25227001 -0.49902615 -0.3274774 -0.80232877 0.0051566227
+0.87658 -0.17523 0.25845 -0.57033509 -0.32396597 -0.75482708 0.0063016531
+0.89552999 -0.15527 0.2369 -0.46969754 -0.49027124 -0.73417872 0.0036502944
+0.89719999 -0.19981 0.25745001 -0.53006744 -0.12042013 -0.83936131 0.011057837
+0.89796001 -0.21342 0.25707 -0.56315917 -0.31850705 -0.76249921 0.017803727
+0.88758999 -0.081832998 0.20653 -0.57557029 -0.44134757 -0.68842661 0.0096352929
+0.87217999 -0.077109002 0.21450999 -0.50341129 -0.41095436 -0.76006168 0.023035374
+0.89025998 -0.098035999 0.21417999 -0.76929045 -0.32157952 -0.55206788 0.0043053762
+0.89441001 -0.074914001 0.19694 -0.55204678 -0.32633653 -0.76729965 0.004155573
+0.85790002 -0.073201001 0.21996 -0.5088625 -0.43748677 -0.74139345 0.016455548
+0.89715999 -0.11804 0.21861 -0.63377219 -0.18392545 -0.75133502 0.00012797593
+0.89977002 -0.13039 0.21947999 -0.58814061 -0.3707532 -0.71877164 0.0094561493
+0.98108 -0.24890999 0.22026999 -0.5680598 -0.47186622 -0.67427766 0.0034297861
+0.98771 -0.26245001 0.22584 -0.59834898 -0.41233608 -0.68699157 0.0048888093
+1.0218 -0.30645999 0.22211 -0.59876984 -0.35689956 -0.71700585 0.0022234623
+0.98255998 -0.28944999 0.24102999 -0.49667192 -0.4614636 -0.73509747 0.0041258149
+0.98881 -0.30250001 0.24564999 -0.58628821 -0.34715956 -0.73194695 0.0049727578
+1.0059 -0.28483 0.22352999 -0.5874747 -0.48172876 -0.65023923 0.0022670925
+0.99068999 -0.27922001 0.23011 -0.5069164 -0.37599161 -0.77567136 0.0085080797
+1.0113 -0.30061999 0.22747 -0.52035964 -0.39098343 -0.75918233 0.0038573237
+0.99387002 -0.29791999 0.23553 -0.54290164 -0.36664137 -0.75553417 0.0066012326
+0.94161999 -0.26464999 0.26168999 -0.60591203 -0.3112064 -0.73213476 0.0081351055
+0.90101999 -0.24753 0.2818 -0.54453689 -0.36729157 -0.75404006 0.008023764
+0.90693003 -0.26221001 0.28218001 -0.54058826 -0.33785102 -0.77046806 0.004944752
+0.92412001 -0.24398001 0.26284 -0.58068341 -0.43940523 -0.68536842 0.0025060074
+0.90913999 -0.24005 0.27008 -0.53241974 -0.39720762 -0.74749929 0.0049935994
+0.92905003 -0.26122001 0.26640001 -0.51964432 -0.33915478 -0.78418356 0.0051234639
+0.91317999 -0.25810999 0.27533999 -0.53469241 -0.35092214 -0.76873773 0.0035873915
+0.94229001 -0.30544999 0.28077999 -0.57344782 -0.26947394 -0.77365464 0.0091330409
+0.94327003 -0.28503001 0.26381999 -0.56815118 -0.47727591 -0.6703819 0.003917085
+0.96494001 -0.3037 0.26288 -0.58860248 -0.29538086 -0.7525273 0.006877006
+0.94866002 -0.30061999 0.27122 -0.56855619 -0.39891186 -0.71945345 0.011791299
+0.92510998 -0.28595999 0.28219 -0.50794005 -0.45903012 -0.72889531 0.0017729055
+0.91400999 -0.27772999 0.2834 -0.45370001 -0.34635326 -0.82109421 0.0035796845
+0.93197 -0.30083999 0.28558001 -0.40872058 -0.25735202 -0.875624 0.0051060254
+0.93182999 -0.27838999 0.27112001 -0.55097491 -0.36516717 -0.7503863 0.010603263
+0.91772997 -0.27226001 0.27897 -0.55315518 -0.39199907 -0.73508906 0.002757268
+0.93877 -0.29405001 0.27789 -0.59910834 -0.47000307 -0.64820236 0.0022047064
+0.94536 -0.24615 0.24349999 -0.5772444 -0.42916471 -0.69469899 0.00060154725
+0.96351999 -0.26346001 0.24276 -0.57655925 -0.37350735 -0.7266854 0.0085715055
+0.94887 -0.26113001 0.25009 -0.56616175 -0.39574581 -0.72308099 0.013024054
+0.96683002 -0.24074 0.22651 -0.54361087 -0.25450432 -0.79982173 0.0054900581
+0.95152998 -0.23891 0.23532 -0.51579845 -0.26634571 -0.81425548 0.0032604157
+0.97031999 -0.25944 0.23444 -0.46884152 -0.3535676 -0.80943042 0.014530137
+0.9594 -0.25071999 0.23401999 -0.49899593 -0.44998208 -0.74062079 0.0046118046
+0.93131 -0.23898 0.25082001 -0.60660577 -0.3973217 -0.68859637 0.0051749465
+0.91665 -0.23151 0.25768 -0.5425902 -0.42891607 -0.72223735 0.0052591469
+0.93769002 -0.25494999 0.25554001 -0.60094577 -0.45003554 -0.66055435 0.0035398446
+0.93967998 -0.2332 0.23963 -0.56358838 -0.22101885 -0.79593897 0.011008323
+0.96683002 -0.28171 0.24615 -0.53553009 -0.37020999 -0.75904679 0.0072638583
+0.95109999 -0.27794999 0.25486001 -0.59071147 -0.31522307 -0.74276137 0.0096912943
+0.97191 -0.29969999 0.25398999 -0.53512269 -0.30180308 -0.78902388 0.010122755
+0.95798999 -0.29107001 0.25889999 -0.49401754 -0.48425427 -0.72211105 0.00041926035
+0.97382998 -0.27739999 0.23729999 -0.5215562 -0.33922815 -0.78288156 0.0062098214
+0.98352998 -0.34645 0.26778999 -0.65812671 -0.45138055 -0.60259849 0.0092727719
+1.0211 -0.38782999 0.26038 -0.56250656 -0.3919225 -0.72799933 0.0013622167
+0.98411 -0.36274001 0.28264001 -0.60678256 -0.41253105 -0.67943591 0.016736817
+0.98760998 -0.38079 0.28542 -0.58236873 -0.2293594 -0.77989805 0.005447838
+1.0048 -0.36651 0.26128 -0.47991392 -0.45340338 -0.75107121 0.0074568531
+0.98846 -0.35978001 0.27070001 -0.77777135 -0.41099292 -0.47555918 0.0013049954
+1.0089999 -0.38238999 0.2676 -0.57162619 -0.40751478 -0.71216238 0.00049221248
+0.99529999 -0.37643999 0.27467 -0.64933991 -0.38997072 -0.65290153 0.0074786921
+1.0225 -0.34817001 0.2419 -0.59557134 -0.42972937 -0.67869538 0.0032319333
+1.0405999 -0.32964 0.22066 -0.42359874 -0.27993608 -0.86151028 0.0042147855
+1.025 -0.32216999 0.22537 -0.55276006 -0.3138608 -0.77197653 0.0066271489
+1.0432 -0.34232 0.22156 -0.47795841 -0.16094652 -0.86351144 0
+1.0290999 -0.33992001 0.22901 -0.52639699 -0.37124631 -0.76490682 0.0072168182
+1.0039999 -0.32385999 0.24158999 -0.51577199 -0.34268847 -0.7852031 0.0029710634
+0.99146998 -0.32027999 0.24841 -0.50462866 -0.26956517 -0.82017344 0.004790449
+1.0089999 -0.34066999 0.24618 -0.55065703 -0.41505641 -0.72422725 0.0016556269
+0.99080998 -0.33801001 0.25468001 -0.58574784 -0.31855312 -0.74526727 0.016029252
+1.0137 -0.31876001 0.23442 -0.53083408 -0.31057641 -0.78851593 0.0023172151
+0.99861997 -0.31172001 0.23851 -0.53840911 -0.35429507 -0.76458532 0.0086363638
+1.0172 -0.33676001 0.23703 -0.58202255 -0.35318714 -0.73246741 0.005922087
+1.0264 -0.36263001 0.24698 -0.66838568 -0.34923571 -0.65673053 0.0056026662
+1.0426 -0.38400999 0.24291 -0.56674761 -0.42310986 -0.70694786 0.0055585052
+1.0302 -0.37992999 0.25094 -0.59239846 -0.34791791 -0.72664791 0.0074485755
+1.0477 -0.36169001 0.22642 -0.44358981 -0.35725176 -0.82194847 0.0079387408
+1.0333 -0.35859999 0.23495001 -0.64642102 -0.27734676 -0.71078736 0.0081457123
+1.0499001 -0.37908 0.23177999 -0.49694729 -0.43488622 -0.75094426 0.0059486013
+1.0366 -0.37219 0.23728999 -0.63522679 -0.37137344 -0.67717695 0.0065064915
+1.0128 -0.35802999 0.25364 -0.41815317 -0.38413283 -0.8231585 0.0027076087
+0.99436003 -0.35363001 0.25782999 -0.53291076 -0.4458994 -0.71915221 0.011620293
+1.0165 -0.37654999 0.25781 -0.53131092 -0.34931508 -0.77180809 0.0022673456
+0.94701999 -0.32359001 0.2841 -0.55734408 -0.34690386 -0.75433761 0.0088148871
+0.96907002 -0.34602001 0.28251001 -0.49889591 -0.45307842 -0.7387982 0.0081206551
+0.95055002 -0.34013 0.28862 -0.60820329 -0.30762595 -0.73174798 0.00046973192
+0.96616 -0.32111001 0.26629001 -0.57031292 -0.33896178 -0.74822992 0.0093546826
+0.95225 -0.31775001 0.27458999 -0.63527721 -0.32595262 -0.70012695 0.0019127654
+0.97356999 -0.33724999 0.27054 -0.61228633 -0.50622517 -0.60732317 0.0089501236
+0.95747 -0.33215001 0.27833 -0.530828 -0.4625611 -0.71011186 0.0043559689
+0.93276 -0.31714001 0.28731 -0.44331288 -0.30467951 -0.84299701 0.0084643513
+0.93948001 -0.33197001 0.29322001 -0.46629435 -0.40817469 -0.78483307 0.0051136566
+0.96978998 -0.36041999 0.28665999 -0.35978422 -0.34945732 -0.8651213 0.0010343528
+0.95304 -0.35834 0.2933 -0.41619992 -0.33239794 -0.84633869 0.0012244389
+0.97132999 -0.37983 0.29429001 -0.50048953 -0.4572646 -0.73513222 0.011661064
+0.95771003 -0.37079999 0.29730999 -0.41246071 -0.44765994 -0.7933957 0.0049161981
+0.97378999 -0.31744999 0.25654 -0.57079858 -0.22197476 -0.79051644 0.0049330881
+0.97960001 -0.33610001 0.25931001 -0.62466669 -0.45504162 -0.63460898 0.0085738497
+1.0239 -0.24123999 0.18401 -0.60213584 -0.17890824 -0.77809012 0.00057789928
+1.0432 -0.26554 0.18261001 -0.4898738 -0.50367731 -0.71157062 0.00046375985
+1.0283 -0.26107001 0.18844 -0.52195954 -0.40842539 -0.74883038 0.0030394664
+1.0032001 -0.24549 0.20110001 -0.54218084 -0.3563464 -0.76095802 0.0046059918
+0.99019998 -0.24065 0.20875999 -0.57385635 -0.36940613 -0.73090899 0.003710577
+1.0075999 -0.26256999 0.20478 -0.56946069 -0.37371793 -0.73215401 0.00088837493
+0.99501997 -0.25792 0.21287 -0.62496066 -0.37483418 -0.68477988 0.0035284581
+1.0132 -0.24022 0.19315 -0.50748134 -0.35958111 -0.78304803 0.005102355
+0.99559999 -0.23345999 0.19803999 -0.54904598 -0.4125202 -0.7268945 0.0074472302
+1.0164 -0.25692999 0.19576 -0.57119763 -0.26497459 -0.77686661 0.00035293147
+1.0267 -0.28286999 0.20424999 -0.53659385 -0.47652486 -0.69641286 0.0011035394
+1.0451 -0.30294999 0.2054 -0.48458809 -0.53507018 -0.69200748 0.0011262043
+1.0294 -0.30039001 0.21308 -0.48386446 -0.40203366 -0.77733141 0.0037388934
+1.0484999 -0.28040999 0.18806 -0.38646856 -0.45706314 -0.8010838 0.0028768231
+1.0312999 -0.27801001 0.19524001 -0.48790759 -0.45046037 -0.74768412 0.0037257557
+1.0512 -0.29655999 0.19482 -0.51081371 -0.47134081 -0.71896255 0.0038694236
+1.039 -0.29023001 0.19799 -0.48972726 -0.49760225 -0.71593243 0.0042085475
+1.011 -0.27847999 0.21180999 -0.55147445 -0.47309271 -0.68706566 0.0036512243
+0.99836999 -0.27127999 0.21723001 -0.62140095 -0.44272679 -0.64641613 0.0048404727
+1.0173 -0.29413 0.21697 -0.56893921 -0.44487768 -0.69165885 0.00270888
+1.0469 -0.24037001 0.16678999 -0.5662024 -0.25592718 -0.78352797 0.0092792837
+1.0339 -0.23942 0.17678 -0.59183222 -0.17283565 -0.78731346 0.00037658054
+1.0499001 -0.25926 0.17191 -0.50770742 -0.44120756 -0.73997915 0.0050712228
+1.0369 -0.2538 0.17779 -0.557625 -0.33498687 -0.75949866 0.0050910404
+1.0571001 -0.24002001 0.15778001 -0.53986281 -0.20737384 -0.81580889 0.014596157
+1.0592 -0.25038999 0.16001999 -0.49911001 -0.33937052 -0.79731852 0.011065743
+1.0569 -0.27217001 0.17724 -0.45250192 -0.5478937 -0.70360118 0.0028367359
+0.97404999 -0.23646 0.21698 -0.59188735 -0.28356054 -0.75449502 0.0044144006
+1.0512 -0.31959999 0.21219 -0.40887299 -0.40301818 -0.81877911 0.0017737158
+1.0319 -0.31661999 0.21746001 -0.50448179 -0.36501461 -0.78247201 0.0044522053
+1.0518 -0.33998001 0.21653999 -0.47630349 -0.1603982 -0.86452723 0.00019827645
+1.0556 -0.35286 0.21672 -0.44234279 -0.36639586 -0.81858832 0.0074364753
+0.89761001 -0.24406999 0.28068 -0.52395016 -0.38680461 -0.75885332 0.017921247
+0.89977002 -0.25009999 0.28119999 -0.54467142 -0.36720151 -0.75398678 0.0076896888
+0.89538002 -0.23664001 0.27713001 -0.50433761 -0.40273196 -0.76383942 0.0046073766
+0.89977002 -0.25009999 0.27932999 -0.5446139 -0.36741936 -0.75392228 0.0079430575
+1.0219001 -0.10667 0.12039 -0.60043132 -0.3196725 -0.73300189 0.0020223148
+1.0427001 -0.087707996 0.1017 -0.49008864 -0.43393579 -0.75598472 0.0071424847
+1.0266 -0.082739003 0.105 -0.48272684 -0.45707804 -0.74703038 0.0088130971
+1.0454 -0.10036 0.10246 -0.50054979 -0.20042728 -0.84218693 0.00053985114
+1.029 -0.099978998 0.11202 -0.55160493 -0.35497382 -0.75480175 0.0047689998
+1.0068001 -0.082230002 0.12577 -0.58728111 -0.38574365 -0.71154958 0.0092091421
+0.99145001 -0.079967 0.13285001 -0.56000173 -0.14944762 -0.81490093 0.0077950507
+1.0124 -0.10015 0.12611 -0.60065567 -0.20063071 -0.77392507 0
+0.99438 -0.099532001 0.13557 -0.71463758 -0.26948008 -0.64550257 0.0021076198
+1.0135 -0.078294002 0.11291 -0.67409855 -0.3981238 -0.62216443 0.002484618
+1.0187 -0.092565 0.1193 -0.65931618 -0.33778325 -0.6717177 0.00489065
+1.044 -0.12689 0.12173 -0.50922155 -0.41096559 -0.75617504 0.014555052
+1.0275 -0.12185 0.124 -0.39494881 -0.49127486 -0.77631468 0.0061151935
+1.0452 -0.14203 0.12406 -0.52060097 -0.29440069 -0.80143803 0.0085337106
+1.0296 -0.14065 0.13191999 -0.46775052 -0.45779225 -0.75606602 0.0029309392
+1.05 -0.12095 0.10992 -0.54820979 -0.43811181 -0.71240729 0.011532702
+1.0338 -0.11363 0.11531 -0.46447763 -0.47673711 -0.7463125 0.0080004334
+1.0536 -0.13847999 0.11438 -0.66039413 -0.34249988 -0.66826147 0.0057453434
+1.0112 -0.11939 0.13225 -0.55399984 -0.40836573 -0.7254802 0.010534224
+0.99847001 -0.11188 0.13799 -0.62921089 -0.40968412 -0.66049421 0.0078726988
+1.0164 -0.13382 0.13569 -0.61612159 -0.46171603 -0.63813204 0.0042294087
+1.0499001 -0.080784 0.089038 -0.55940711 -0.39225802 -0.73020369 0.0090898229
+1.0326999 -0.074818 0.096583001 -0.46368054 -0.43923485 -0.76946288 0.0072263298
+1.0556 -0.098435 0.095452003 -0.61493117 -0.34862801 -0.70733178 0.0035141823
+1.0562 -0.11281 0.099549003 -0.56749362 -0.37155735 -0.73477626 0.0021379732
+0.97210997 -0.075084999 0.13687 -0.52575737 -0.50439417 -0.68495667 0.012167354
+1.049 -0.16057999 0.12932999 -0.54459375 -0.34464011 -0.7646181 0.001992567
+1.0353 -0.15581 0.13687 -0.5547238 -0.43963185 -0.70640314 0
+1.0508 -0.17844 0.13539 -0.6183539 -0.30137837 -0.72581643 0.0015912164
+1.0592 -0.15106 0.11843 -0.57117677 -0.40511766 -0.71388847 0.0016343724
+1.0561 -0.19619 0.13882001 -0.56254786 -0.34782705 -0.75003749 0.0020241947
+1.0272 -0.40239 0.26492 -0.59396327 -0.39557388 -0.70052058 0.00043724597
+1.0328 -0.41472 0.26629999 -0.61971688 -0.33096656 -0.71162641 0.0017715525
+1.0031 -0.39987999 0.28112999 -0.51770151 -0.38975629 -0.76162666 0.00016209201
+0.99110001 -0.39576 0.28654 -0.51403517 -0.21793924 -0.82962066 0.00030580186
+1.0118999 -0.39862999 0.27397999 -0.55038381 -0.4063893 -0.72933215 0.00041792571
+1.0185 -0.41099 0.27581999 -0.55264163 -0.37228745 -0.74564689 0.00018213381
+1.0470001 -0.40147999 0.24731 -0.48190624 -0.34256065 -0.80648535 0.0050506559
+1.0347 -0.39756 0.25466001 -0.58264744 -0.34634873 -0.73523092 0.0013406452
+1.048 -0.41677001 0.25152001 -0.65463489 -0.24171042 -0.71626061 0.0010342663
+1.0386 -0.41246 0.25872999 -0.64406544 -0.32516149 -0.69242299 0.0015553264
+1.0541 -0.39087999 0.23813 -0.46356988 -0.46866423 -0.75196868 0.0039757057
+0.97706002 -0.39272001 0.29530001 -0.59810203 -0.32481462 -0.73264545 0.010529944
+1.061 0.29030001 -0.098504998 -0.53012669 -0.39202678 -0.75185144 0.0032233607
+1.0639 0.25323001 -0.076838002 -0.60527593 -0.43229413 -0.66840315 0.0050942446
+1.0803 0.27537999 -0.098805003 -0.53375024 -0.18238622 -0.82573962 0.0248839
+1.0674 0.27827001 -0.093749002 -0.59145641 -0.36561683 -0.71868181 0.019129205
+1.0832 0.25253999 -0.097170003 -0.54535091 -0.50329947 -0.67028511 0.0016385406
+1.0698 0.25990999 -0.089276999 -0.69647288 -0.36943644 -0.61517662 0.0029545682
+1.1438 0.33471999 -0.17259 -0.77299607 -0.45480323 -0.44230202 0.03886437
+1.0662 0.37549999 -0.1357 -0.5192014 -0.36281592 -0.77381819 0.0013356189
+1.1023 0.33061999 -0.139 -0.55101234 -0.31093532 -0.77440602 0.0027013095
+1.0619 0.35234001 -0.11882 -0.55447203 -0.39334589 -0.73337567 0.002958938
+1.0669 0.33778 -0.116 -0.52143288 -0.36539805 -0.77109796 0.0014162073
+1.0869 0.35444999 -0.13671 -0.49918064 -0.4492605 -0.74093437 0.0032430924
+1.0692 0.35975999 -0.13034 -0.50768203 -0.4336012 -0.74447894 0.0032235393
+1.0891 0.33859 -0.13189 -0.5355528 -0.30698612 -0.78672916 0.00077896251
+1.0727 0.34321001 -0.12355 -0.54221153 -0.41531032 -0.73042721 0.0017881223
+1.1016001 0.37257999 -0.15819 -0.53776503 -0.35085931 -0.76662016 0.0010413587
+1.1212 0.39070001 -0.17869 -0.50873023 -0.45240474 -0.73247761 0.006533904
+1.1059 0.39363 -0.17495 -0.43533957 -0.52502507 -0.73131943 0.0048013027
+1.1238 0.37817001 -0.17665 -0.59913182 -0.21911785 -0.77008337 0.0014965335
+1.1102 0.38058001 -0.16790999 -0.48760813 -0.38800421 -0.78210682 0.0039000358
+1.0857 0.39096001 -0.15798 -0.51421022 -0.44840911 -0.73110676 0
+1.0886 0.37918001 -0.15241 -0.51368541 -0.38117445 -0.76865679 0.00096875598
+1.0749 0.38240001 -0.14514001 -0.54009074 -0.35802236 -0.76165748 0.0016705882
+1.0951999 0.39307001 -0.1655 -0.50832367 -0.51011777 -0.69382042 0.00073559996
+1.0962 0.38730001 -0.16340999 -0.51691121 -0.46250978 -0.72033852 0.00072803377
+1.105 0.35773 -0.15523 -0.55343294 -0.39266601 -0.73452395 0.0022629865
+1.1272 0.3382 -0.1551 -0.84024435 -0.18326166 -0.51029855 0
+1.1077 0.34167999 -0.14757 -0.64237082 -0.34922531 -0.68220323 0.0026314117
+1.1291 0.35865 -0.17215 -0.63186336 -0.45164868 -0.62989056 0.003957598
+1.1144 0.36267 -0.16376001 -0.54468626 -0.3063398 -0.78068745 0.00069480325
+1.1349 0.34222999 -0.1692 -0.82302058 -0.44325712 -0.3551904 0.044799309
+1.0915 0.36050999 -0.14647999 -0.53060108 -0.41056675 -0.74155074 0.0047099637
+1.0777 0.36691001 -0.14105 -0.50786287 -0.40094984 -0.76243985 0.0034501865
+1.0983 0.34592 -0.14142001 -0.5925017 -0.3826175 -0.70890445 0.0027834168
+1.1434 0.25848001 -0.13806 -0.56233585 -0.29411814 -0.7728343 5.4748489e-05
+1.1409 0.31057999 -0.15967999 -0.65586066 -0.34803846 -0.66986275 0.0032406605
+1.1454 0.29782999 -0.15710001 -0.6251471 -0.30301949 -0.71928459 0.00087125937
+1.1474 0.31935999 -0.17256001 -0.75798208 -0.30726343 -0.57537144 0.0058591454
+1.1636 0.29624 -0.17456999 -0.62735605 -0.43986386 -0.64260745 0.0077127367
+1.1533 0.30267999 -0.16772 -0.69789231 -0.42315736 -0.57782716 0.0047352645
+1.1832 0.27812999 -0.17842001 -0.50037998 -0.41474804 -0.76000261 0.0009831402
+1.2019 0.25141001 -0.17987999 -0.58171058 -0.29830408 -0.7567215 0.00062861794
+1.1901 0.25773999 -0.17421 -0.54825592 -0.32929078 -0.76875424 0
+1.1612 0.27307001 -0.15891001 -0.70700145 -0.27909118 -0.64981306 0.0037671884
+1.1508 0.27792001 -0.15231 -0.5360263 -0.41349375 -0.73600185 0.0024690994
+1.1626 0.25729001 -0.15631001 -0.66945922 -0.31821162 -0.67124188 0.0055958377
+1.1545 0.26089001 -0.14772999 -0.64816797 -0.29110065 -0.70366085 0.0026996413
+1.1682 0.27976999 -0.17037 -0.58311766 -0.32454681 -0.7447437 0.0089090709
+1.1569 0.28299001 -0.16227999 -0.65739095 -0.35862979 -0.66273814 0.0010634626
+1.1687 0.26176 -0.1656 -0.64224923 -0.3211011 -0.69599563 0.0096476935
+1.1042 0.31858 -0.13643999 -0.52741247 -0.31274816 -0.78995234 0.0056517781
+1.1224999 0.29514 -0.13771001 -0.58684641 -0.26394284 -0.76547074 0.0030647798
+1.1089 0.29909 -0.13123 0.2053981 -0.5957045 0.77649713 0
+1.0845 0.31828001 -0.1175 -0.60480785 -0.20545863 -0.76941156 0.0049179057
+1.0707999 0.32069999 -0.11038 -0.43010348 -0.33915982 -0.83664912 0.00044919999
+1.0891 0.29852 -0.11534 nan nan nan nan
+1.0687 0.30070999 -0.10602 -0.45119026 -0.27720878 -0.84828216 0.0001092403
+1.0919 0.32142001 -0.12704 -0.64848578 -0.26312965 -0.71430314 0.0023975377
+1.0947 0.30340999 -0.12402 -0.62012661 -0.27110115 -0.73617059 0.0045624222
+1.1034 0.27851999 -0.11722 -0.56368381 -0.3138037 -0.76406002 0.0033978557
+1.1221 0.25439 -0.1183 -0.55504286 -0.37494341 -0.74252588 0.0059657507
+1.1093 0.25999999 -0.11414 -0.59935945 -0.4209905 -0.68083423 0.012236702
+1.1262 0.27939001 -0.13592 -0.64625698 -0.20341343 -0.73550993 0.0016915742
+1.113 0.28005001 -0.12574001 -0.61825967 -0.18883316 -0.76295286 0
+1.1294 0.25883001 -0.12871 -0.53772527 -0.42141125 -0.73024935 0.0051850514
+1.115 0.26666 -0.12383 -0.57660234 -0.37830934 -0.72416288 0.0062379544
+1.0888 0.27886 -0.10873 -0.48105696 -0.18430111 -0.85709816 0.016622731
+1.0733 0.2845 -0.10331 -0.47400445 -0.43119657 -0.767717 0.0065962737
+1.0896 0.25935999 -0.10517 -0.45258585 -0.25065902 -0.8557663 0.020364538
+1.0776 0.26486 -0.10154 -0.58479494 -0.19025613 -0.78855401 0.014092938
+1.1293 0.31918001 -0.1517 -0.64086133 -0.22723255 -0.73325443 0.0043176194
+1.1145 0.32282999 -0.14242999 -0.49469671 -0.25314507 -0.83138001 0.0017805458
+1.1312 0.30063 -0.14771999 -0.62436521 -0.23552831 -0.74477822 0.0016980065
+1.1382 0.32063001 -0.16323 -0.71977681 -0.24855502 -0.64818335 0.0024462333
+1.1335 0.28273001 -0.14470001 -0.5627048 -0.2746703 -0.77969193 0.0041622473
+1.2235 0.43652001 -0.27737999 -0.71944791 0.15162888 -0.67779309 0.0020697571
+1.2222 0.42673001 -0.27947 -0.73634875 0.30357674 -0.60467488 0.0045671542
+1.2408 0.44656 -0.29877999 -0.7906571 0.59691 -0.13623396 0.0088727875
+1.2344 0.43827 -0.2906 -0.85457456 0.34636098 -0.38695788 0.014771693
+1.2271 0.42137 -0.29126 -0.83348888 0.43815166 -0.33662939 0.004438044
+1.2410001 0.44260001 -0.30631 -0.87868327 0.33670804 -0.33844277 0.020713978
+1.2352999 0.43779001 -0.30513999 -0.47205397 0.64141411 -0.60477519 0.11486709
+1.2408 0.42721 -0.31726 -0.70062679 0.33242694 -0.63135922 0.0027235313
+1.2306 0.41984001 -0.30825001 -0.66331726 0.12906183 -0.73712492 0.14893638
+1.2385 0.41095001 -0.32095 -0.72859395 0.2550993 -0.63566911 0
+1.1518 0.41319999 -0.2139 -0.5814963 -0.23296835 -0.77947909 0
+1.1828001 0.41461 -0.23932 -0.57339758 -0.25746751 -0.77776968 0.0060937637
+1.2019 0.43130001 -0.25817001 -0.72866935 0.017986819 -0.6846295 0.0066971881
+1.1969 0.43151 -0.25400999 -0.64526701 -0.088914216 -0.75876528 0.00057214807
+1.2029001 0.41766 -0.25747001 -0.75358558 -0.10378646 -0.64910483 0.0049537206
+1.1921999 0.41949001 -0.24853 -0.57485968 -0.17550136 -0.79920936 0.0036127884
+1.1684999 0.41631001 -0.22966 -0.59830266 -0.18346407 -0.77998382 0.0095679872
+1.178 0.41701001 -0.23998 -0.43352604 -0.61993432 -0.65401578 0.0067267497
+1.1379 0.41069001 -0.20263 -0.57857674 -0.23306094 -0.7816211 0.0083143488
+1.212 0.43397999 -0.26791 -0.68326223 0.18705709 -0.7058062 0.00033580358
+1.2097 0.41909 -0.26890001 -0.80400628 0.034816395 -0.59360057 0.012340154
+1.2194 0.41395 -0.28542 -0.88733512 0.043013453 -0.45911461 0.05970813
+1.2199 0.43353999 -0.30768999 -0.088824525 -0.13190599 0.98727453 0.00072106416
+1.2154 0.42686999 -0.30822 -0.026917936 -0.062246643 0.99769777 0
+1.2234 0.35084 -0.23904 -0.61826402 -0.55015999 -0.56131417 0.042613689
+1.227 0.34003001 -0.23646 -0.69131964 0.029149659 -0.72196078 0.05119586
+1.2269 0.35598999 -0.25228 -0.72550172 -0.59245056 -0.35021368 0.026808994
+1.2308 0.33961999 -0.2498 -0.9068644 -0.29554728 -0.30041429 0.00078015181
+1.2264 0.29791999 -0.21706 -0.50616199 -0.53576154 -0.6758399 0.0096356226
+1.2222 0.27810001 -0.19944 -0.53849655 -0.36105695 -0.76135361 0.010061938
+1.2262 0.25939 -0.19765 -0.51396388 -0.21556732 -0.83028424 0.0076909265
+1.2422 0.27447999 -0.21777 -0.77132618 -0.39406386 -0.49976945 0.019014165
+1.23 0.28029999 -0.21016 -0.60306036 -0.43189144 -0.67066234 0.005041841
+1.2418 0.25749999 -0.21294001 -0.82195038 -0.2988264 -0.48487151 0.013321084
+1.2356 0.26120999 -0.20745 -0.64661747 -0.31921583 -0.69281095 0.0058049923
+1.2259001 0.31646001 -0.23141 -0.69675148 -0.67769635 -0.23508503 0.035989296
+1.2341 0.30030999 -0.23026 -0.92474008 -0.3140246 -0.21504508 0.012963314
+1.2282 0.31900001 -0.24964 -0.85271043 -0.52193594 0.021627832 0.05497564
+1.2408 0.29824001 -0.25106001 0.14628047 -0.10114674 0.98405862 0.00010100203
+1.2339 0.29991999 -0.24986 -0.94208658 -0.27240056 0.19562943 0.047929563
+1.2625 0.25095001 -0.23794 -0.77976972 -0.54150283 -0.3142195 0.025638353
+1.2641 0.25185999 -0.24817 -0.70094085 -0.25421244 0.66637665 0.066505305
+1.2448 0.27590001 -0.23024 -0.89560753 -0.44106501 -0.057869438 0.010483656
+1.2361 0.28498 -0.22906999 -0.89876723 -0.40036604 -0.17867412 0.019579619
+1.2491 0.25951001 -0.22985999 -0.76747924 -0.35748807 -0.53214473 0.0049678581
+1.2436 0.27524 -0.24817 -0.78077716 -0.59968752 0.17539051 0.0033246081
+1.2356 0.28342 -0.25181001 -0.77654457 -0.26020959 0.57382011 0.040650561
+1.2531 0.26102 -0.25026 -0.76276135 -0.57730311 0.29140386 0.0083316453
+1.2224 0.39739999 -0.27643001 -0.93223572 -0.20012064 -0.30147702 0.033888858
+1.2234 0.37891999 -0.27745 -0.93858862 0.32428119 -0.11786891 0.063887425
+1.2242 0.40061 -0.289 -0.98570973 -0.13740361 -0.097450949 0.017230537
+1.2235 0.38503999 -0.28802001 -0.93773663 0.14251408 0.31676459 0.041008588
+1.2289 0.35916999 -0.27032 -0.5832839 -0.80902392 -0.072527155 0.0039594425
+1.2286 0.33886001 -0.26980999 -0.95887595 -0.19627415 0.20502052 0
+1.2272 0.35922 -0.28984001 -0.92236698 -0.28960365 0.25567329 0.052786116
+1.2243 0.34095001 -0.2879 -0.89396477 0.35301217 0.27606052 0.014741465
+1.2249 0.40371999 -0.30847001 -0.86307758 0.4065387 -0.29970554 0.046492655
+1.2229 0.38683999 -0.31152001 -0.34450224 0.13859545 -0.92849845 0.004424498
+1.2243 0.35398999 -0.30149001 -0.86526287 -0.33976617 0.36861777 0.085358016
+1.2236 0.34709999 -0.30184001 -0.76037961 0.25372016 0.59787041 0.0555574
+1.2323999 0.32006001 -0.26998001 -0.95379925 0.094366416 0.28524026 0.020545101
+1.226 0.30237001 -0.26640999 -0.72176915 0.46075603 0.51648164 0.0028897808
+1.2237999 0.31911999 -0.28529999 -0.80070233 -0.17951927 0.57153171 0.0137335
+1.2230999 0.30096 -0.29262 -0.90773666 0.28087476 -0.31164652 0.0092550199
+1.2408 0.27129999 -0.26194 -0.67087036 -0.53733939 0.51107669 0.011165101
+1.2308 0.27831 -0.26479 -0.5543505 -0.54589492 0.62824696 0.01121887
+1.2472 0.25839999 -0.26710001 -0.79915297 -0.29605582 0.52316856 0.040814791
+1.2323999 0.26177001 -0.27379999 -0.47525421 -0.54664558 0.68942875 0.0038197497
+1.2408 0.25009 -0.28115001 -0.73547095 0.014163426 0.67740828 0.067748241
+1.2295001 0.25389001 -0.28290001 -0.85451591 -0.050218236 0.51699197 0.12533131
+1.2230999 0.29749 -0.30425 -0.23563427 -0.97115409 0.036555246 0.013104214
+1.2222 0.30393001 -0.32690001 -0.28843838 -0.91921693 -0.26803628 0.091457605
+1.1801 0.37088001 -0.2186 -0.59586746 -0.47026804 -0.65099162 0.020663766
+1.1446 0.37753999 -0.19575 -0.6296519 -0.14632659 -0.76297247 0.0006158888
+1.163 0.39747 -0.21738 -0.67883128 -0.31536725 -0.66312253 0.0027127792
+1.151 0.39952001 -0.20931 -0.53348124 -0.2957072 -0.79243618 0.0057976269
+1.1662 0.37911001 -0.21304999 -0.69369334 -0.29181021 -0.65851068 0.014592607
+1.1549 0.38350001 -0.20437001 -0.58318418 -0.30273151 -0.75382346 0.0015788452
+1.1864001 0.35767999 -0.21561 -0.69889778 -0.4212172 -0.57802939 0.025252044
+1.1901 0.33924001 -0.21326999 -0.60142332 -0.18378997 -0.77750313 0.0058335899
+1.1482 0.36057001 -0.19456001 -0.62241364 -0.12865393 -0.77204239 0.0039357324
+1.166 0.33276001 -0.19746999 -0.39756745 -0.40636775 -0.82268184 0.0016960204
+1.1488 0.33693999 -0.19097 -0.56728405 -0.55697244 -0.60660577 0.036461711
+1.1672 0.36238 -0.20782 -0.51106489 -0.29616463 -0.80690718 0
+1.1583 0.36092001 -0.20107999 -0.57211083 -0.008918304 -0.82012784 0
+1.1725 0.33972001 -0.20384 -0.38470799 -0.47989908 -0.78847748 0.00079377601
+1.1571 0.34466001 -0.20043001 -0.45627034 -0.19042115 -0.86922789 0.0093339225
+1.1854 0.39840999 -0.23721001 -0.63599217 -0.19869556 -0.74567693 0.00040274175
+1.1868 0.37810001 -0.23365 -0.65545863 -0.43046567 -0.62054271 0.017726941
+1.2043 0.39886999 -0.25656 -0.79927021 -0.054965273 -0.59845299 0.00063882768
+1.1959 0.40057001 -0.24676999 -0.70264882 -0.15786424 -0.69380373 0.0017561264
+1.2036999 0.37915 -0.25508001 -0.87195826 -0.14094973 -0.46885175 0.10088334
+1.1973 0.37968999 -0.24544001 -0.87380403 0.19845863 -0.44393778 0.059640512
+1.1682 0.40026999 -0.22676 -0.86212122 -0.075038053 -0.50111502 0
+1.174 0.38115001 -0.22469001 -0.6728456 -0.40793341 -0.6171459 0.038312145
+1.2057 0.35639 -0.23601 -0.47228587 -0.58888721 -0.6558643 0.018854368
+1.1921 0.36186001 -0.22769 -0.66211194 -0.46556786 -0.58724302 0.017965753
+1.2099 0.33976999 -0.22861999 -0.3732428 -0.36464646 -0.85306662 0.0058516595
+1.197 0.34356001 -0.22319999 -0.63544655 -0.2731393 -0.72222066 0.014081538
+1.2112 0.3637 -0.24878 -0.46645892 -0.78706241 -0.40366921 0.052945379
+1.1997 0.36857 -0.24481 -0.74042529 -0.55948675 -0.37248492 0.056749493
+1.178 0.36884001 -0.22528 -0.63994777 -0.51909792 -0.56657237 0.019891638
+1.1293 0.39752999 -0.19172999 -0.55816382 -0.40287066 -0.72536087 0.011271526
+1.115 0.39839 -0.18340001 -0.33572447 -0.70264393 -0.62736005 0.0018499342
+1.1345 0.38137001 -0.18709999 -0.65554518 -0.34512115 -0.67167848 0.0020891249
+1.1364 0.40292999 -0.20290001 -0.58592695 -0.26869482 -0.76452124 0.01279976
+1.1365 0.36067 -0.18455 -0.75790155 0.14026251 -0.63711196 0.0066638808
+1.1354001 0.34231001 -0.18477 -0.84248829 -0.39678168 -0.36438695 0.054504793
+1.2029999 0.29221001 -0.19867 -0.47475374 -0.56895363 -0.67149138 0.0029693379
+1.1885999 0.29861 -0.19447 -0.46917969 -0.67841095 -0.56535733 0
+1.2067 0.31698 -0.21704 -0.54385489 -0.59537446 -0.59139752 4.4581055e-05
+1.1889 0.32082999 -0.20861 -0.56051022 -0.26527718 -0.7845102 0.010372451
+1.2091 0.29776999 -0.20905 -0.39501292 -0.58216327 -0.71066922 0.0025524825
+1.1937 0.30322 -0.20421 -0.51056993 -0.48506916 -0.70994818 0.0069458163
+1.1694 0.31952 -0.19341999 -0.59766138 -0.32095048 -0.73470521 0.0028211202
+1.1545 0.32115999 -0.18403 -0.60718828 -0.44471851 -0.65844351 0.014417193
+1.1694 0.30175 -0.18668 -0.52660519 -0.43769479 -0.72877306 0.0095710447
+1.1587 0.30667999 -0.18126 -0.71048695 -0.45118627 -0.54003626 0.0045056953
+1.1775 0.31639001 -0.20107 -0.60378098 0.26993197 -0.7500568 0
+1.2095 0.27948001 -0.19521999 -0.40896523 -0.50191277 -0.76212269 0.0047000889
+1.1912 0.28073999 -0.18545 -0.50033718 -0.41500667 -0.75988954 0.0023518007
+1.2085 0.25938001 -0.1885 -0.49987352 -0.26882488 -0.8233223 0.0016856086
+1.197 0.2665 -0.18271001 -0.55542994 -0.344758 -0.75672948 0
+1.2161 0.2863 -0.20355 -0.49024379 -0.56987697 -0.65947032 0.0037879155
+1.1759 0.28915 -0.18129 -0.51031047 -0.49326247 -0.70446813 0.0047895093
+1.2157 0.32001999 -0.22837999 -0.43217942 -0.88461691 -0.1751398 0.023289861
+1.1997 0.32743001 -0.22112 -0.5730449 -0.27343929 -0.77256101 0.0088529568
+1.2191 0.31865999 -0.24695 -0.20373628 -0.97690767 -0.064366058 0.0070111146
+1.2117 0.40156001 -0.26800001 -0.73227733 -0.19035833 -0.65386045 0.0029193675
+1.212 0.37900001 -0.26958999 -0.64321613 0.13413689 -0.75384361 0.052068342
+1.1997 0.37147999 -0.26102 -0.72110879 -0.56809086 -0.396579 0.11107038
+1.219 0.40107 -0.29350001 -0.99692029 -0.045713104 0.063720308 0.043105036
+1.2148 0.37775001 -0.29054001 -0.87873638 0.41973659 0.22725204 0.019109536
+1.2137001 0.36774001 -0.2647 -0.53165102 -0.57250607 -0.62416673 0.066244699
+1.1997 0.36982 -0.26102 -0.7208029 -0.56886446 -0.39602572 0.11130345
+1.2142 0.36722001 -0.29359001 -0.88890576 -0.33621949 0.31113189 0.087157011
+1.216 0.33421999 -0.29315999 -0.70676267 0.33358127 0.62386703 0.029620869
+1.2162 0.39374 -0.30812001 -0.86730999 0.33320731 -0.36979228 0.039665312
+1.2156 0.37970999 -0.30845001 -0.96367812 -0.013759937 -0.26671162 0.031452667
+1.212 0.36004999 -0.30655 -0.36097211 -0.49565393 0.78995335 0.030704491
+1.1971999 0.35288 -0.31108999 -0.35151219 -0.018866854 0.93599319 0.0021832001
+1.2108001 0.33943 -0.30651 -0.44131315 0.34532088 0.8282488 0.045835797
+1.1952 0.33803999 -0.31344 -0.50173074 -0.2499547 0.82812375 0.012167444
+1.1931 0.33140999 -0.32077 -0.95841998 -0.21804596 0.18408443 0.0070934081
+1.2155 0.29657 -0.27202001 -0.83113396 0.49956626 0.24423331 0.019553129
+1.2126 0.31961 -0.29383001 -0.82555997 -0.035569087 0.56319225 0.018582808
+1.2176 0.29964 -0.28674001 -0.79863346 0.5729813 -0.18405738 0.008224668
+1.2106 0.28027999 -0.27221 -0.98819643 0.065501295 0.13848226 0.01415226
+1.2129 0.26506999 -0.27678001 -0.87805438 -0.25516796 0.40485775 0
+1.2102 0.27981001 -0.29065001 -0.85097629 0.49695173 0.16993652 0.0063739321
+1.1997 0.27006 -0.29925999 -0.8881914 0.11265603 0.44544879 0.046546943
+1.2082 0.25985 -0.29028001 -0.80560672 -0.47074908 0.35971248 0.002216805
+1.1997 0.26840001 -0.29925999 -0.8874464 0.11277491 0.44690117 0.047413446
+1.2064 0.31959 -0.31020999 -0.80491793 -0.48967522 0.33514971 0.034988109
+1.1997 0.31628001 -0.30989999 -0.83514017 -0.52253091 0.17176256 0.029735062
+1.2127 0.30142 -0.31083 -0.81698906 -0.39712858 -0.41811204 0.17228653
+1.2051001 0.31136999 -0.32675999 -0.15186922 -0.69027299 0.70743126 0.086597659
+1.197 0.31986001 -0.32530999 -0.81658071 -0.54761064 0.18253389 0.050791152
+1.2081 0.30138001 -0.32707 -0.27024779 0.94741285 0.17139158 0.13104343
+1.1957 0.29686001 -0.33204001 -0.45226219 0.22788942 0.86227918 0.016414354
+1.2067 0.28516999 -0.30634999 -0.76583755 0.47586122 0.43249154 0.0020747257
+1.1968 0.27741 -0.31130999 -0.88593334 0.30237266 0.35170016 0.024108289
+1.2035 0.25821999 -0.30691999 -0.87614202 -0.36182207 0.31852782 0.006016376
+1.1968 0.26232001 -0.31266001 -0.84407991 -0.34794229 0.40800172 0.02748125
+1.1933 0.28016999 -0.32576001 -0.93255693 0.23722988 0.27213877 0
+1.1898 0.25850999 -0.32563999 -0.43548375 -0.38700143 0.81276315 0.027633939
+1.173 0.26214001 -0.32799 nan nan nan nan
+1.2241 0.17151 -0.15832999 -0.56333804 -0.28610951 -0.7751075 0.0050335159
+1.2258 0.19762 -0.17566 -0.55380177 -0.43083587 -0.71251947 0
+1.2474999 0.17708001 -0.17674001 -0.50834441 -0.33595568 -0.7929185 0.00099982857
+1.2304 0.18062 -0.16872001 -0.4858672 -0.46116292 -0.74247009 0.00025090019
+1.2241 0.13221 -0.13854 -0.55134147 -0.46889725 -0.6900419 0.0038897903
+1.2276 0.11933 -0.13473 -0.56705648 -0.29610869 -0.76861334 0.0039167842
+1.2302001 0.098645002 -0.13225 -0.61917704 -0.34409592 -0.70584553 0
+1.2646 0.15772 -0.17799 -0.62293988 -0.24292603 -0.74359459 0.02031664
+1.2647001 0.14024 -0.17718001 -0.79521078 0.13310882 -0.59154201 0.01738051
+1.2247 0.15874 -0.15672 -0.58744937 -0.21583927 -0.77994651 0.0036412077
+1.2431 0.13387001 -0.15638 -0.63139981 -0.33571887 -0.69901866 0.0059702648
+1.2302999 0.13988 -0.15019999 -0.515953 -0.54416841 -0.6615687 0.00084489846
+1.2501 0.15872 -0.17204 -0.39692774 -0.26750287 -0.87800372 0.00028328816
+1.2326 0.16080999 -0.16449 -0.51761943 -0.17685579 -0.83713329 0.005070996
+1.2524 0.13946 -0.16746999 -0.57104766 -0.27358073 -0.77398849 0.0056175725
+1.2367001 0.14814 -0.16153 -0.56662679 -0.42905989 -0.70344985 0.00093736826
+1.2661999 0.093269996 -0.15606999 -0.61564612 -0.43621257 -0.65627611 0.0050167111
+1.2674 0.1189 -0.17391001 -0.69040447 -0.4030219 -0.60076207 0.006502904
+1.283 0.094377004 -0.17768 -0.91596997 -0.23656014 -0.32409626 0.021719322
+1.2727 0.10047 -0.16937999 -0.71013385 -0.42018813 -0.56493521 0.009368089
+1.2445 0.11926 -0.15493 -0.68299949 -0.26278907 -0.68150836 0.0026076986
+1.2371 0.12048 -0.14499 -0.69945544 -0.24406759 -0.67170912 0.0029299478
+1.2484 0.10076 -0.14974 -0.62373054 -0.33688468 -0.70531482 0
+1.2379 0.10328 -0.14120001 -0.66483599 -0.20577183 -0.71808845 0.00015687727
+1.2553999 0.12212 -0.16507 -0.64158088 -0.24057043 -0.72835422 0.001300535
+1.2584 0.10684 -0.16102 -0.58089697 -0.39775002 -0.71017855 0.0034939023
+1.1422 0.17111 -0.099188998 -0.56048107 -0.29463792 -0.77398282 0.0047833296
+1.0662 0.19788 -0.054356001 -0.63061363 -0.38818544 -0.67204064 0.0062762904
+1.0805 0.17674001 -0.058989 -0.63155377 -0.2897439 -0.71915805 0.010659879
+1.0711 0.17994 -0.051109999 -0.61009234 -0.25276297 -0.7509315 0.0057624565
+1.1004 0.23094 -0.098352998 -0.60364991 -0.32022181 -0.73011279 0.00081384578
+1.1044 0.21943 -0.094921999 -0.59473246 -0.40016788 -0.69725108 0.00042573229
+1.068 0.23890001 -0.071736999 -0.66667527 -0.26068729 -0.69827378 0.0042179273
+1.0822001 0.21616 -0.078100003 -0.54296559 -0.32410055 -0.77469164 0.00066075841
+1.0692 0.22017001 -0.069533996 -0.59680158 -0.20258187 -0.77639455 0.0013978785
+1.0901999 0.2396 -0.091495 -0.5885101 -0.39009848 -0.70815188 0.004131956
+1.0743001 0.24398001 -0.082549997 -0.60252154 -0.48992813 -0.63003033 0.0021989124
+1.0915 0.22098 -0.085418001 -0.57800388 -0.30742505 -0.75591087 0.0022304424
+1.1023999 0.19442999 -0.078927003 -0.45705003 -0.46157947 -0.76029581 0.00090459385
+1.1227 0.17304 -0.078653999 -0.62506843 -0.29034948 -0.72455966 0.012020864
+1.1082 0.17901 -0.074529998 -0.3591007 -0.33001289 -0.87300521 0.0013885733
+1.1259 0.19583 -0.095450997 -0.57218385 -0.46203014 -0.67759401 0.0034117289
+1.1099 0.20118 -0.088983998 -0.50401038 -0.4788098 -0.71882862 0.0026120006
+1.13 0.17936 -0.090704001 -0.67789394 -0.29736769 -0.67233348 0.0058977306
+1.1157 0.18605 -0.081937999 -0.51208848 -0.45277235 -0.72990584 0.0023770088
+1.0888 0.19952001 -0.074730001 -0.46873903 -0.39823756 -0.78847361 0.001469068
+1.0729001 0.20116 -0.065605998 -0.6110183 -0.31617486 -0.72573417 0.0077651339
+1.0893 0.18035001 -0.066127002 -0.49014369 -0.24367756 -0.83688736 0.008100058
+1.0769 0.1877 -0.063170999 -0.638174 -0.38135803 -0.66880476 0.0066371667
+1.0954 0.20519 -0.081973001 -0.49447712 -0.37485367 -0.78420478 0.0020623431
+1.146 0.15724 -0.097237997 -0.53706193 -0.28229147 -0.79490632 0.0026028075
+1.1616 0.13404 -0.098185003 -0.55500108 -0.38687459 -0.73641151 0.00067530875
+1.15 0.13959999 -0.092055999 -0.57471776 -0.3730289 -0.72838789 0.00059503259
+1.1801 0.11029 -0.099756002 -0.58826971 -0.33473241 -0.73613375 0.0034572154
+1.1831 0.096578002 -0.095912002 -0.61034358 -0.40426281 -0.68121386 0.0023600745
+1.1446 0.11495 -0.076442003 -0.48005342 -0.46244556 -0.74544805 0.0014745704
+1.1629 0.095394 -0.076517999 -0.60013056 -0.38502386 -0.70114183 0.0007304374
+1.151 0.1006 -0.070671 -0.47971907 -0.45012692 -0.75316358 0.0012202212
+1.1663001 0.1182 -0.093245 -0.57828188 -0.4059847 -0.70764858 0.00035179866
+1.153 0.12223 -0.085121997 -0.49077949 -0.42518017 -0.76049811 0.0026352929
+1.1712 0.10115 -0.087736003 -0.61513484 -0.38086438 -0.69032705 8.6404842e-05
+1.1581 0.10903 -0.080239996 -0.54113483 -0.43843547 -0.71759832 0.0023308375
+1.102 0.13719 -0.059044 -0.51231015 -0.35342053 -0.78270829 0.0027458703
+1.064 0.15313999 -0.038959 -0.52891177 -0.28993344 -0.79761583 0.00049628149
+1.0654 0.13786 -0.035211999 -0.53273541 -0.26040256 -0.80522263 0.0025348454
+1.0836999 0.15594 -0.0561 -0.5802415 -0.37026057 -0.72541499 0.00063807244
+1.0719 0.16069999 -0.048021998 -0.63142794 -0.1728635 -0.7559213 0.00023153028
+1.0898 0.14 -0.051837999 -0.51016915 -0.36001801 -0.78109825 0.00030331447
+1.0742 0.14064001 -0.042396002 -0.53102982 -0.19481583 -0.82465398 0.00055182813
+1.1026 0.097860999 -0.038132001 -0.518278 -0.38601345 -0.76313919 0.0020929577
+1.1243 0.11495 -0.057282999 -0.50001043 -0.43907383 -0.7464608 0.0081356289
+1.1073 0.11969 -0.053047001 -0.41061422 -0.45901442 -0.78784621 0.0041129165
+1.1279 0.098431997 -0.054453 -0.56003654 -0.29477367 -0.77425289 0.0051313308
+1.1106 0.1012 -0.045178998 -0.47917736 -0.36118537 -0.79995883 0.0011527747
+1.084 0.11419 -0.03771 -0.45588925 -0.47923344 -0.75000024 0.00064048223
+1.0686001 0.12004 -0.030708 -0.55538982 -0.328697 -0.76387197 0.0023551618
+1.091 0.099119 -0.031319 -0.39244464 -0.38139361 -0.83697438 0.005025791
+1.0694 0.10317 -0.024405999 -0.23885812 -0.39320505 -0.88788325 0.016179664
+1.092 0.12168 -0.045694999 -0.41639698 -0.37593573 -0.82781994 0.0013723912
+1.0768 0.12682 -0.041111 -0.5076862 -0.32258114 -0.79887176 0.0034655316
+1.0971 0.10861 -0.041425001 -0.44394621 -0.45190454 -0.77375323 0.00074253528
+1.1243 0.15785 -0.076626003 -0.6012091 -0.27716962 -0.74948287 0.017828176
+1.1097 0.15989 -0.069320999 -0.45134792 -0.25316989 -0.85568106 0
+1.1296 0.13945 -0.073509 -0.73199844 -0.26093352 -0.62935835 0.00061283726
+1.1097 0.14117 -0.064130001 -0.44823241 -0.23623113 -0.86213845 0.00027727633
+1.1317 0.1604 -0.088050999 -0.69060367 -0.24061656 -0.6820339 0.0035834163
+1.1362 0.14286 -0.083070002 -0.62376928 -0.31944016 -0.71335113 0.0066092773
+1.0899 0.16124 -0.062569998 -0.59467518 -0.18431444 -0.78255332 0.00023279458
+1.1317 0.12034 -0.069201998 -0.56658739 -0.37797713 -0.73219675 0.013868154
+1.1144 0.12567 -0.062403001 -0.4810183 -0.43511277 -0.7611165 0.0084277345
+1.1361001 0.10297 -0.063294001 -0.58015072 -0.33000088 -0.74466395 0.007406929
+1.1384 0.12768 -0.080449998 -0.5849216 -0.32440415 -0.7433899 0.0077014714
+1.1442 0.21373001 -0.11756 -0.47946659 -0.37870008 -0.79164261 0.00033876629
+1.1612 0.23162 -0.13839 -0.64803952 -0.36632019 -0.66772324 0.0022089751
+1.1502 0.23875999 -0.13296001 -0.55565107 -0.39404067 -0.73210925 0.0014422307
+1.1647 0.21775 -0.13586 -0.64253116 -0.34579816 -0.68379623 0.0013083748
+1.1523 0.22065 -0.12637 -0.57919139 -0.34843284 -0.73697484 0.0015080812
+1.1809 0.19761001 -0.13835 -0.49897414 0.71816462 -0.48504063 0.0095743276
+1.1864001 0.17835 -0.13251001 -0.67594838 -0.3876341 -0.62676448 0.0029197182
+1.1626 0.19377001 -0.11895 -0.55845535 -0.33707815 -0.75796175 0.0019719158
+1.1494 0.19914 -0.11431 -0.46171626 -0.37385085 -0.80439645 0.00049771811
+1.1659 0.17708001 -0.11591 -0.50663126 -0.3271583 -0.79767936 0.0039214334
+1.1503 0.18010999 -0.10813 -0.48490831 -0.34132352 -0.80520934 0
+1.1705 0.19960999 -0.1296 -0.67704481 -0.3929202 -0.62227327 0.0091747064
+1.1582 0.2075 -0.12358 -0.54755324 -0.40878135 -0.73012549 0.0019725042
+1.1734999 0.1829 -0.12445 -0.60429609 -0.31563196 -0.73157561 0.001412485
+1.1837 0.23338 -0.15802 -0.53096211 -0.40061706 -0.74671632 0.0017945699
+1.1882 0.21773 -0.15276 -0.58880949 -0.32711375 -0.73912108 0.0031167602
+1.2045 0.23702 -0.17744 -0.59864432 -0.27533019 -0.75220895 0.00057603844
+1.1927 0.2402 -0.16841 -0.56205475 -0.33483946 -0.75629163 0.001404896
+1.2078 0.21857999 -0.17251 -0.56586975 -0.33100757 -0.75513273 0.0012320806
+1.1964 0.22221 -0.16353001 -0.64862776 -0.3249025 -0.68827349 0.0007048524
+1.1665 0.23932999 -0.15062 -0.58045053 -0.40546185 -0.70617133 0.0032030747
+1.1571 0.24498001 -0.14341 -0.66143942 -0.37317038 -0.65057033 0.0019606592
+1.1712 0.22299001 -0.14477 -0.5629651 -0.43126804 -0.70503771 0.0046856198
+1.1767 0.24728 -0.16144 -0.51369089 -0.43600312 -0.73893362 0.0016550262
+1.2034 0.1971 -0.15801001 -0.57701081 -0.38241011 -0.72167927 0.00054514909
+1.1908 0.20057 -0.14896999 -0.59744668 -0.28645438 -0.74900031 0.00659252
+1.2095 0.17914 -0.15388 -0.50191551 -0.39044467 -0.7717731 0.00038913428
+1.1945 0.18167999 -0.14469001 -0.63294846 -0.31516781 -0.70713896 0.0058345092
+1.2118 0.20132001 -0.16678999 -0.56210506 -0.39275643 -0.72786009 7.7336474e-05
+1.1997 0.20855001 -0.16125999 -0.63571119 -0.32381094 -0.70072669 0.0017664713
+1.2179 0.1846 -0.16192 -0.52256811 -0.40647116 -0.74946898 0.00057402969
+1.178 0.19661 -0.14120001 -0.49897414 0.71816462 -0.48504063 0.0095743276
+1.125 0.23759 -0.11622 -0.50688976 -0.26374298 -0.82067198 0.0021985802
+1.1092 0.2401 -0.10765 -0.51292986 -0.28912032 -0.80827743 0.00044742241
+1.1296999 0.22019 -0.11249 -0.45720136 -0.31799284 -0.83057064 0
+1.1138999 0.22057 -0.10356 -0.52307045 -0.31225681 -0.7930277 0.0015862315
+1.1339999 0.24268 -0.12414 -0.54798079 -0.32216528 -0.77196276 0.0040278547
+1.0972 0.24405 -0.10085 -0.5463143 -0.43007091 -0.71873474 0.005586029
+1.1321 0.20096 -0.10521 -0.4949064 -0.40626588 -0.76812482 0.0081901327
+1.1174001 0.20919999 -0.10116 -0.54159969 -0.46232864 -0.702084 0.0030058862
+1.1373 0.18592 -0.10244 -0.61760604 -0.36172831 -0.69836617 0.0025574761
+1.1837 0.15677001 -0.11701 -0.60652441 -0.31471655 -0.73012429 0.0053117084
+1.1869 0.13905001 -0.11506 -0.6122812 -0.22930571 -0.75665754 0.00030201013
+1.2019 0.15063 -0.13823999 -0.64419544 -0.39138237 -0.65713924 0.0069111553
+1.1933 0.15998 -0.12980001 -0.75941914 -0.34196135 -0.5534845 0.00081516645
+1.2074 0.13872001 -0.13237999 -0.53165925 -0.45826063 -0.71227491 0.0082834018
+1.1971 0.14315 -0.12452 -0.66320568 -0.35404816 -0.65939987 0.0072608949
+1.1697 0.16109 -0.11079 -0.46353352 -0.36380959 -0.80794752 7.4291878e-05
+1.1548001 0.16131 -0.10246 -0.45077428 -0.18603937 -0.87303603 0.00086340855
+1.1691 0.13891999 -0.10542 -0.5157032 -0.3564181 -0.77911252 0.00090759509
+1.1578 0.14563 -0.10174 -0.5349896 -0.28366193 -0.79581535 0.0037220309
+1.1914999 0.11914 -0.11129 -0.63399851 -0.20025471 -0.74695641 0
+1.207 0.097466998 -0.11672 -0.55364865 -0.34148777 -0.75951254 0.0002222496
+1.1921 0.10029 -0.10712 -0.61456764 -0.27029514 -0.74111211 0.0014294289
+1.2104 0.12043 -0.12495 -0.47936884 -0.27357998 -0.83388221 0.0057581817
+1.1997 0.12874 -0.12136 -0.58514684 -0.31580186 -0.74690855 0.0010584993
+1.2126 0.10259 -0.12312 -0.68372637 -0.15518866 -0.71304607 0
+1.1739 0.12452 -0.10267 -0.55211335 -0.36891165 -0.74771321 0.00037088789
+1.2112 0.16018 -0.1469 -0.52740425 -0.32038084 -0.78689319 0.0011350252
+1.1975 0.16833 -0.14188001 -0.67207432 -0.32992774 -0.66292059 0.0083732475
+1.2144001 0.1454 -0.14341 -0.49369499 -0.4612861 -0.73721129 0.0056808097
+1.2237 0.035441998 -0.097223997 -0.5672788 -0.38787574 -0.72646201 0
+1.242 0.014082 -0.098531 -0.50752515 -0.42755499 -0.74807417 0.0020478244
+1.2296 0.018906999 -0.093053997 -0.50820446 -0.41319567 -0.75564384 0.0011543862
+1.2248 -0.041861001 -0.057346001 -0.58498865 -0.3220107 -0.7443772 0.0021281079
+1.2416 -0.0678 -0.057920001 -0.56380129 -0.41179249 -0.71592951 0.00089785183
+1.2292 -0.060258001 -0.053263001 -0.53579021 -0.35169321 -0.76762009 0.0026774404
+1.2625 -0.0097415997 -0.099716999 -0.54190624 -0.33208564 -0.7720471 0.0031149248
+1.2647001 -0.022414001 -0.096923001 -0.54792768 -0.27944639 -0.78847003 0.0014628087
+1.2273 -0.0031126 -0.075859003 -0.53378999 -0.44292417 -0.72033763 0.0042479555
+1.2413 -0.024718 -0.078433998 -0.67566955 -0.26519147 -0.68785477 0.00040607591
+1.2313 -0.020594001 -0.070298001 -0.59794885 -0.30758601 -0.74016756 0.0013027516
+1.2467999 -0.0026531999 -0.094577 -0.51324213 -0.36100355 -0.77862632 0.0020719068
+1.2335 0.0014515 -0.086119004 -0.60166109 -0.39995593 -0.69140381 0.0019134968
+1.2486 -0.019833 -0.087898001 -0.55780584 -0.38978881 -0.73274648 0.0013260429
+1.2381001 -0.012986 -0.081491001 -0.64475209 -0.3685489 -0.66967636 0.00076864782
+1.2643 -0.065921001 -0.076789998 -0.57427567 -0.41119513 -0.70790255 0.0010631727
+1.2687 -0.040916 -0.093534 -0.62291324 -0.28864968 -0.72709042 0.0018368494
+1.2854 -0.063810997 -0.096454002 -0.52440381 -0.43686005 -0.73085827 0.0022493722
+1.2729 -0.059342001 -0.088490002 -0.61306351 -0.37870964 -0.69334847 0.0025665562
+1.2448 -0.040663 -0.076549999 -0.5915128 -0.30094096 -0.74802881 0.0016833941
+1.2343 -0.039469998 -0.066946998 -0.66275764 -0.24553424 -0.70743573 0.00036858732
+1.2492 -0.060433 -0.069613002 -0.54845381 -0.41863704 -0.72383797 0.0010850683
+1.2368 -0.055255 -0.063267 -0.60708153 -0.35712436 -0.70986915 0.0026925113
+1.2551 -0.038734 -0.084201999 -0.54807949 -0.34060162 -0.76393676 0.000174824
+1.2589999 -0.052988999 -0.080952004 -0.55249709 -0.37718734 -0.7432878 0.0010305203
+1.3003 0.031413 -0.15765999 -0.82358074 -0.42922187 -0.37078759 0.032969147
+1.3035001 0.019846 -0.15524 -0.91363204 -0.150538 -0.37764379 0.031424593
+1.3003 0.032184999 -0.16886 -0.94090068 -0.21705617 0.25998557 0.016229507
+1.3025 0.020259 -0.16897 -0.94827908 -0.22881958 0.22001885 0.0097216628
+1.2671 0.054857001 -0.13502 -0.59973884 -0.47840494 -0.64143753 0.0052194875
+1.2276 0.076358996 -0.11671 -0.67974216 -0.38269526 -0.62569559 0.00011223325
+1.2438 0.055450998 -0.11739 -0.57780558 -0.33502769 -0.74424273 0.0075835837
+1.2314 0.059755001 -0.11098 -0.5192703 -0.39990363 -0.75527173 0.0040217317
+1.2438 0.077188998 -0.13584 -0.58933783 -0.44443429 -0.67465478 0.0037620696
+1.2342 0.081771001 -0.12749 -0.70424265 -0.36202088 -0.61072344 0.00066940649
+1.2507 0.061974999 -0.12843999 -0.52513421 -0.56693012 -0.6346845 0.00043438212
+1.2376 0.066559002 -0.12155 -0.61147296 -0.46804592 -0.63799208 0.0034271316
+1.2668 0.015888 -0.11659 -0.54207939 -0.39372614 -0.74238104 0.0029786427
+1.2823 0.034534998 -0.13754 -0.72492969 -0.32463881 -0.60752499 0.0041161366
+1.2718 0.039609998 -0.1311 -0.60405648 -0.35875812 -0.71162373 0.0055954917
+1.2849 0.018898999 -0.13594 -0.72576809 -0.26994145 -0.63276565 0.0032767106
+1.2749 0.021156 -0.12650999 -0.65973032 -0.27995169 -0.6974116 0.0012828618
+1.2458 0.038727999 -0.11611 -0.53015977 -0.1610373 -0.83246475 0.0012205498
+1.2323999 0.040096 -0.10658 -0.57921231 -0.34469339 -0.73871481 0
+1.2495 0.019952999 -0.10844 -0.4916172 -0.48764241 -0.72146887 0.00030824312
+1.2359999 0.026644001 -0.10298 -0.55112237 -0.41347578 -0.72477722 0.001033527
+1.2563 0.042610999 -0.12212 -0.49185091 -0.12858544 -0.86113214 0.00020055535
+1.2695 0.079227 -0.15328 -0.73878694 -0.16305926 -0.65391552 0.01212219
+1.284 0.057323001 -0.15673999 -0.79490334 -0.38082671 -0.47233444 0.0064480659
+1.2754 0.060557 -0.14842001 -0.62513173 -0.49519315 -0.60331917 0.0076289098
+1.2825 0.080176003 -0.17067 -0.95576012 0.25011697 0.15480332 0.014409893
+1.2783999 0.079758003 -0.17002 -0.88660139 0.19285962 -0.42040834 0.018646674
+1.2865 0.057817999 -0.16716 -0.76680803 -0.63414872 0.099301606 0.015645234
+1.2754 0.062831998 -0.17478999 -0.78729624 -0.30945903 0.5332914 0.050066877
+1.2542 0.080794998 -0.14351 -0.52076864 -0.30072522 -0.79897714 0
+1.2588 0.068791002 -0.14217 -0.52071583 -0.47781965 -0.70749092 0.0047328509
+1.288 0.038814999 -0.15103 -0.70526022 -0.37749073 -0.60009062 0.0049335691
+1.2790999 0.045504998 -0.14442 -0.71420074 -0.39263088 -0.57944655 0.0017618976
+1.2918 0.021225 -0.14526001 -0.70982206 -0.2841306 -0.64453274 0.0050405967
+1.295 0.040617999 -0.17044 -0.87989688 -0.32618725 0.34551889 0.014127109
+1.2952 0.023709999 -0.17839999 -0.75652272 -0.3345826 0.56189668 0.008214633
+1.3008 -0.028786 -0.11789 -0.51022834 -0.42538953 -0.74746954 0.0059262263
+1.3028001 -0.0070134001 -0.13492 -0.62466681 -0.53825337 -0.56575137 0.0073518916
+1.3081 -0.020675 -0.13143 -0.76493692 -0.46194753 -0.44886068 0.023356957
+1.3056 -0.040927999 -0.11593 -0.59459698 -0.27856937 -0.75422382 0.0092573278
+1.3214 -0.068796001 -0.11902 -0.85733879 -0.28619847 -0.42785591 0.012448348
+1.3107001 -0.061478999 -0.11178 -0.68131846 -0.38978806 -0.6195727 0.00075837702
+1.322 -0.046089001 -0.13372999 -0.9674018 -0.25098515 0.033767749 0.021975374
+1.3155 -0.038547002 -0.12949 -0.73352355 -0.35536554 -0.57936049 0.00066997408
+1.3229001 -0.060561001 -0.13158 -0.97852004 -0.16103837 -0.12870537 0.015968604
+1.3178999 -0.055192001 -0.12254 -0.76916438 -0.31186697 -0.55778593 0.0043432657
+1.3056999 -0.00034179 -0.15137 -0.87455606 -0.45528343 -0.16693941 0.011354361
+1.3109 -0.01942 -0.15026 -0.98818928 -0.048982844 0.14519867 0.021704568
+1.3046 0.00027039001 -0.16955 -0.94123662 0.23998633 0.23765539 0.0082744919
+1.3029 -0.020943999 -0.16586 -0.89484978 -0.0014962644 0.44636494 0.002582388
+1.3142 -0.039526001 -0.15042 -0.90497154 0.0036349914 0.42545652 0.00098256255
+1.3214 -0.063607998 -0.14221001 -0.87696594 -0.18402834 0.44391927 0.0078030643
+1.3138 -0.059489999 -0.15109 -0.7599349 -0.0059067127 0.64997232 0.00046502234
+1.3072 -0.040872999 -0.17012 -0.85843015 -0.032744184 0.51188439 0.028786106
+1.3048 -0.060401998 -0.16969 -0.92283154 0.22350411 0.31373224 0.0062896702
+1.2823 -0.0081179002 -0.11906 -0.60413516 -0.39965227 -0.68941909 0.001793273
+1.2703 -0.00078974001 -0.11113 -0.63608432 -0.34293205 -0.69122672 0.00022290557
+1.288 -0.021891 -0.11453 -0.50707954 -0.3975887 -0.76471794 0.0043578045
+1.2732 -0.01881 -0.10571 -0.59589165 -0.35508478 -0.72029716 0.0021670929
+1.2884001 0.00056801998 -0.13003001 -0.61915267 -0.43041071 -0.6568079 0.0064367573
+1.2783999 0.0061675999 -0.12286 -0.66446161 -0.34269166 -0.66411841 0
+1.2929 -0.015597 -0.12278 -0.53354025 -0.48351029 -0.69393986 0.0011883884
+1.257 0.0042332001 -0.10242 -0.51627755 -0.41661334 -0.74825853 0.0025545114
+1.2897 -0.040424999 -0.10815 -0.41842577 -0.29738909 -0.85818392 0.0011444773
+1.2774 -0.038881 -0.10198 -0.56478608 -0.10190026 -0.81892186 0.0051750415
+1.2908 -0.057078999 -0.10308 -0.33774918 -0.36270612 -0.86854458 0.0035743148
+1.2798001 -0.050671 -0.10109 -0.55371445 -0.32546636 -0.76646721 0.0059174532
+1.2954 0.0064956001 -0.14317 -0.69002527 -0.39120772 -0.60895127 0.012761791
+1.2973 -0.0068636001 -0.17842001 -0.76614136 0.25324607 0.59067231 0.0053523718
+1.2969 -0.020595999 -0.17495 -0.82358342 -0.0020568576 0.56719136 0.010246925
+1.2970001 -0.032926999 -0.17929 -0.76287538 -0.26564023 0.58945447 0.0042698462
+1.2977 -0.066963002 -0.17772999 -0.85015893 -0.078688927 0.52061296 0.043739922
+1.1465 0.075240001 -0.055369001 -0.52675301 -0.360091 -0.76997769 0.0080651399
+1.1633 0.051477998 -0.059638999 -0.44755039 -0.34980744 -0.8230027 0.0020604711
+1.1496 0.059599999 -0.053734001 -0.55126101 -0.24782445 -0.79667711 0.00031572007
+1.1801 0.030964 -0.058867998 -0.55300152 -0.27193031 -0.78755516 0.0018125353
+1.1841 0.016342999 -0.057098001 -0.58042979 -0.36297163 -0.72893965 0.0025159658
+1.1435 0.032536 -0.037866998 -0.52263403 -0.52718514 -0.67002207 0.0023923318
+1.1627001 0.01419 -0.03638 -0.60720199 -0.39769676 -0.68785399 0.0020489783
+1.1504 0.019129001 -0.030003 -0.51997441 -0.44296226 -0.73035002 0.0074009434
+1.1683 0.037105002 -0.054792002 -0.49089384 -0.383398 -0.782323 0.0032811188
+1.1499 0.041186001 -0.047449 -0.39019459 -0.40661332 -0.82608336 0.0030870372
+1.1698 0.020072 -0.048121002 -0.57356113 -0.37962544 -0.72588712 0.0029734066
+1.1572 0.027287999 -0.041556001 -0.4904907 -0.50434554 -0.71067184 0.0047133486
+1.1823 0.071162999 -0.078636996 -0.5373019 -0.43666399 -0.72154778 0.0035772978
+1.189 0.057498001 -0.073863998 -0.68915302 -0.35304976 -0.63279057 0.0053702975
+1.2031 0.073344998 -0.097441003 -0.61173898 -0.44031319 -0.65719074 0.0027482272
+1.1905 0.079742998 -0.090920001 -0.59028375 -0.4712716 -0.65533817 0.002264817
+1.2069 0.058688 -0.094516002 -0.6427148 -0.28995836 -0.70911342 0.00022696514
+1.1962 0.061276 -0.085132003 -0.65800977 -0.33182943 -0.67595303 0.0043163439
+1.1688 0.079547003 -0.073273003 -0.53973514 -0.36337036 -0.75937349 0.0017196937
+1.1522 0.081555001 -0.063506 -0.47752053 -0.42276672 -0.77022225 0.0059491065
+1.1693 0.062422998 -0.066321 -0.47185889 -0.3589898 -0.80527985 0.0019533057
+1.1583 0.066914 -0.061595 -0.52308398 -0.27762726 -0.80579549 0.0019503129
+1.1763 0.084169 -0.083049998 -0.59240121 -0.42150575 -0.68658113 0.00087975088
+1.1923 0.039535001 -0.070451997 -0.6776315 -0.2206459 -0.70152044 0.002634471
+1.2061 0.016546 -0.075949997 -0.59075856 -0.40478075 -0.69796622 0.00054385845
+1.1942 0.021001 -0.067376003 -0.61585295 -0.26324672 -0.74258083 0.0023386083
+1.2098 0.040217999 -0.089528002 -0.58306754 -0.30282924 -0.75387448 0.00048268179
+1.1995 0.045464002 -0.082415998 -0.71056288 -0.2807889 -0.6451807 0.00094605656
+1.2127 0.022748999 -0.084550001 -0.5219245 -0.35617739 -0.77506936 0.00074032316
+1.1747 0.044838 -0.060587998 -0.39232105 -0.3534072 -0.84922761 0.0015083188
+1.1229 0.072701 -0.038228001 -0.48608938 -0.37628448 -0.78875035 0.0033975283
+1.1081001 0.077104002 -0.033778999 -0.42260295 -0.42570055 -0.80011606 0.00066385546
+1.127 0.057840999 -0.034809999 -0.57997221 -0.30285412 -0.75624835 0.0060129962
+1.1104 0.060973 -0.026481001 -0.47638315 -0.42102027 -0.7718814 0
+1.1312 0.081090003 -0.048767999 -0.51950586 -0.41359186 -0.7477001 0.0057551814
+1.1148 0.085288003 -0.041361999 -0.47690627 -0.36113343 -0.80133826 0.0020336641
+1.1357 0.061278 -0.043873999 -0.59481013 -0.21768792 -0.77383006 0.0027817471
+1.0912 0.081702001 -0.026743 -0.49875671 -0.3661297 -0.78561491 0.0051907394
+1.0777 0.088013001 -0.020899 -0.57667589 -0.51062971 -0.63773203 0.00042661736
+1.0978 0.066651002 -0.021862 -0.53108793 -0.4474878 -0.71951383 0.0022008047
+1.1306 0.039774999 -0.029903 -0.61968005 -0.40938798 -0.66962534 0.0046691638
+1.1144 0.046884 -0.021393999 -0.52327001 -0.43398452 -0.73337972 0.0017826728
+1.1354001 0.02468 -0.023959 -0.56860828 -0.48423889 -0.66497928 0.0027140721
+1.1377 0.046720002 -0.042560998 -0.63328815 -0.32392812 -0.70286322 0.0039114007
+1.1389 0.085911997 -0.059967 -0.53642303 -0.39190912 -0.74743396 0.0064524775
+1.1817 -0.0083002001 -0.038477998 -0.55845207 -0.38921544 -0.73255903 0.0030067705
+1.1861 -0.021413 -0.037799001 -0.61994123 -0.28195679 -0.73223847 0
+1.2026 -0.0087248003 -0.057769001 -0.55735433 -0.40941328 -0.72231352 0.0022446592
+1.1902 -0.00083941 -0.051410001 -0.60000622 -0.42277104 -0.6791591 0.0011943736
+1.2074 -0.022565 -0.054745 -0.54710144 -0.33549723 -0.76689082 0.0011524464
+1.1950001 -0.018214 -0.046259999 -0.62295759 -0.32890272 -0.70975131 0.0010742905
+1.1666 -0.00076463999 -0.034086 -0.50507158 -0.35894501 -0.78489566 0.003989717
+1.1513 0.0010381 -0.024687 -0.55092168 -0.2281829 -0.80275637 0.0015355442
+1.168 -0.020368 -0.029154001 -0.52807093 -0.39591268 -0.75126177 0.00017667392
+1.1553 -0.015623 -0.022705 -0.53460389 -0.26118618 -0.80372918 7.4331234e-05
+1.1753 0.0046823998 -0.043184999 -0.56959176 -0.43081853 -0.69997185 0.0033874565
+1.1895 -0.041095 -0.032324001 -0.51532209 -0.41471711 -0.74996859 0.00024911109
+1.2061 -0.063450001 -0.034352001 -0.62379378 -0.37226012 -0.68724364 0
+1.1941 -0.05762 -0.026929 -0.57699001 -0.36487076 -0.73072016 0.00057943229
+1.2103 -0.040709998 -0.048388999 -0.52525282 -0.32225826 -0.78756529 0.00074208312
+1.1987 -0.035277002 -0.042516001 -0.58790714 -0.32057866 -0.74269402 0.00064550113
+1.2130001 -0.058568999 -0.043637 -0.56269878 -0.33418182 -0.75610358 0.0015245836
+1.1727999 -0.035489999 -0.024545999 -0.48467204 -0.38268965 -0.78653777 0.00017689385
+1.2094001 0.00036934001 -0.068226002 -0.46603426 -0.46149167 -0.75487578 0.00072073209
+1.1983 0.0054044002 -0.062996998 -0.58970273 -0.4116303 -0.69484615 0.00028059445
+1.2156 -0.015858 -0.061971001 -0.48861146 -0.41548759 -0.76722157 0.00099674135
+1.2092 0.079040997 -0.10832 -0.61305881 -0.51194668 -0.60172212 0.0031085915
+1.1977 0.085764997 -0.10469 -0.58551025 -0.4540377 -0.67158586 0.0036117069
+1.215 0.063626997 -0.10326 -0.52536529 -0.4264656 -0.73628688 0.0044043735
+1.2408 0.23461001 -0.19947 -0.73253351 -0.13950312 -0.66628343 0.012206506
+1.2309 0.23874 -0.19343001 -0.57986677 -0.23080823 -0.78133351 0
+1.2434 0.21799 -0.19683 -0.7965644 -0.082238212 -0.59893411 0.021935595
+1.2316 0.22091 -0.18844999 -0.56130415 -0.2412769 -0.7916584 0.00042740046
+1.2497 0.24055 -0.21077 -0.77654785 -0.31760657 -0.54415023 0.0050605512
+1.2379 0.24821 -0.20114 -0.64870256 -0.33443373 -0.683622 0.0030342506
+1.2472 0.21881001 -0.20920999 -0.8941707 -0.27581248 -0.35268444 0.0040969588
+1.2625 0.19420999 -0.19894999 -0.80562121 -0.48885283 -0.33466023 0.024433054
+1.2666 0.17727 -0.1917 -0.87144524 -0.36456308 -0.32814166 0.02005348
+1.2636 0.19547001 -0.20853999 -0.88815004 -0.4584828 0.031353284 0.013469281
+1.2671 0.1806 -0.20964 -0.99650645 -0.021573065 0.0806816 0.03079774
+1.251 0.19931 -0.19193999 -0.63239139 -0.63227534 -0.44755897 0.028437309
+1.2322 0.20254999 -0.18329 -0.67863762 -0.21719271 -0.70162541 0
+1.2559 0.18516 -0.18714 -0.56958753 -0.41479287 -0.70958924 0.0011006241
+1.2549 0.2035 -0.21092001 -0.82722712 -0.56092536 -0.032527439 0.035135884
+1.2591 0.17416 -0.21744999 -0.9029181 0.17785847 0.3912867 0.026169037
+1.2659 0.23785 -0.23281001 -0.93870401 -0.080600604 -0.33516917 0.033059023
+1.2646 0.22375999 -0.23334 -0.90442312 0.30071101 -0.30264109 0.016182367
+1.2657 0.23996 -0.24729 -0.91338968 0.0084314737 0.40699905 0.049176555
+1.2638 0.22225 -0.24257 -0.85262078 0.45919719 0.24935056 0.045906533
+1.2553999 0.24327999 -0.22499999 -0.71229905 -0.48052105 -0.51159519 0.0036562926
+1.2567 0.21654999 -0.22701 -0.90913701 0.3195672 -0.26710778 0.011014624
+1.2539001 0.23938 -0.25440001 -0.65016365 0.06380523 0.75711036 0.0054811942
+1.2508 0.21946 -0.2516 -0.63761246 -0.036547262 0.76948988 0.0016555784
+1.2632 0.19131 -0.2265 -0.99158812 -0.10003506 0.082134455 0.062332105
+1.2645 0.1831 -0.22718 -0.91723543 0.37353426 0.1383886 0.030778186
+1.2629 0.18205 -0.24225 -0.91468078 0.24267644 0.32321399 0.057310831
+1.2539001 0.2001 -0.22972 -0.96856302 -0.22048341 -0.11520781 0.057384785
+1.2582 0.17794 -0.23276 -0.92818224 0.29113203 0.23177527 0.032944236
+1.247 0.19949 -0.24972001 -0.75470483 -0.068824202 0.65244448 0.022019213
+1.2385 0.19812 -0.25916001 -0.81552362 0.2604827 0.51678818 0.0030713298
+1.2516 0.18031999 -0.25097001 -0.81799072 -0.16515975 0.5510112 0.045790717
+1.2711 0.15995 -0.19034 -0.9923526 -0.071955673 -0.10029326 0.015295269
+1.2693 0.14016999 -0.19035999 -0.97509003 0.21330214 -0.060841829 0.0098111331
+1.2682 0.16028 -0.20934001 -0.93917698 -0.056126285 0.33881614 0.029375002
+1.2671 0.13986 -0.21015 -0.46679628 -0.88372916 0.03352496 0.0002188152
+1.2591 0.16223 -0.21837001 -0.91218567 -0.058283016 0.40561104 0.044182852
+1.26 0.14395 -0.21478 -0.9779641 -0.1484414 0.14680393 0.068102814
+1.2763 0.12012 -0.18999 -0.86880833 -0.35012916 -0.35011664 0.0044041337
+1.2838 0.098506004 -0.19149999 -0.99292791 -0.11361308 -0.034441102 0.012176029
+1.2789 0.10601 -0.18604 -0.84244424 -0.36111325 -0.39985618 0.0095723011
+1.2823 0.11562 -0.20742001 -0.98915631 -0.1468288 0.0033320137 0.04604901
+1.2764 0.12141 -0.21089999 -0.75077146 -0.58429164 0.30813241 0
+1.2833 0.10055 -0.20602 -0.95669937 0.078945123 0.280168 0.01471123
+1.2771 0.099776 -0.21258999 -0.79562324 0.13428003 0.59072214 0.0033540735
+1.2625 0.15244 -0.22604001 -0.93311876 -0.25797573 0.25047544 0.062285002
+1.2666 0.1401 -0.22983 -0.96627945 -0.23718539 0.10023545 0.019182701
+1.2639 0.13635001 -0.24147999 -0.61116016 -0.29124787 0.73597407 0.034281604
+1.2558 0.16037001 -0.22977 -0.99146467 -0.10179175 0.081463508 0.016302176
+1.26 0.14849 -0.23783 -0.8166824 -0.28089839 0.50410903 0.060891692
+1.2522 0.16015001 -0.2499 -0.66394138 0.357032 0.65704638 0.0022720529
+1.2385 0.15007 -0.25916001 -0.77434659 0.24026403 0.58537215 0.011772461
+1.2476 0.14069 -0.24668001 -0.5989669 -0.064079568 0.79820585 0.023878405
+1.2377 0.13913999 -0.25566 -0.84762537 0.12887026 0.51470727 0.010209925
+1.2695 0.12038 -0.22961999 -0.86391079 0.1182861 0.4895575 0.022348728
+1.2667 0.1005 -0.22590999 -0.5910629 0.63528544 0.49704838 0
+1.2635 0.12582999 -0.24113999 -0.67571563 0.13364367 0.7249468 0.044750258
+1.2567 0.11287 -0.2388 -0.57318699 0.23619549 0.78464538 0.015099383
+1.2569 0.099099003 -0.23575 -0.7252804 0.0054507861 0.68843198 0.0031686234
+1.2483 0.12024 -0.24542999 -0.48644277 0.39375198 0.77995694 0.0044466327
+1.2374001 0.11943 -0.25455999 -0.86249089 0.0015447241 0.5060702 0.022167211
+1.2451 0.098897003 -0.24865 -0.81723076 -0.27484772 0.5065496 0.020940181
+1.2373 0.10534 -0.25567999 -0.83803827 -0.25903854 0.4801988 0.012203022
+1.2451 0.24258 -0.26493001 -0.76230252 0.31701061 0.56426859 0.027006436
+1.2345001 0.23771 -0.27296001 -0.70027554 0.29458573 0.65025645 0.03098347
+1.2422 0.21841 -0.26067999 -0.71770555 -0.001980464 0.69634396 0.00044851878
+1.2326 0.22012 -0.27039999 -0.80519414 0.046038479 0.59122157 0.003602552
+1.2291 0.2411 -0.28518999 -0.60973728 0.35077333 0.71075916 0.041709036
+1.2259001 0.21944 -0.28367999 -0.72804546 -0.24416284 0.64057344 0.010143775
+1.242 0.20902 -0.26076001 -0.77476096 0.11692223 0.62134898 0.0074868258
+1.2341 0.19994 -0.27028 -0.88836873 0.041485809 0.45725265 0.0059429333
+1.2428 0.17757 -0.26249999 -0.76736236 -0.052174367 0.63908756 0.00047301114
+1.2342 0.18055999 -0.27182999 -0.79510748 -0.086926118 0.60020655 9.6845026e-05
+1.2259001 0.1998 -0.28733 -0.79491061 -0.0099895988 0.60664439 0.0083162133
+1.2258 0.18197 -0.28428 -0.68814099 0.22848834 0.68866175 0.0051400866
+1.243 0.1622 -0.26291001 -0.72914886 0.18014121 0.66022044 0.0093204752
+1.232 0.15958001 -0.27212 -0.78346211 0.12955809 0.60778433 0.012609689
+1.2332 0.13996001 -0.27006999 -0.91389531 -0.0071775867 0.40588659 0.0014737962
+1.2242 0.15898 -0.28286999 -0.77477282 -0.134652 0.61773443 0.00021819692
+1.2256 0.1402 -0.28459999 -0.85130006 -0.068524227 0.52018511 0.0005638288
+1.2338001 0.12003 -0.26991001 -0.93239492 0.03358743 0.35987705 0.0020323175
+1.2413 0.093911998 -0.26282999 -0.74698877 -0.26670432 0.60899639 0.040656518
+1.2316 0.10067 -0.27072001 -0.83033711 -0.067150123 0.55320078 0.032800809
+1.2257 0.11922 -0.28498 -0.80454856 -0.041162714 0.59245867 0.0053610974
+1.2246 0.10067 -0.28481001 -0.82623512 0.13202608 0.5476355 0.0033431069
+1.2115999 0.24236 -0.1842 -0.58994108 -0.27275726 -0.75998217 0.00059275213
+1.2186 0.22291 -0.1807 -0.52278817 -0.24554549 -0.81633317 2.2324386e-05
+1.2146 0.23919 -0.29418999 -0.69787133 0.23585548 0.6762749 0.010340675
+1.2131 0.21944 -0.29300001 -0.71654344 -0.022628801 0.69717532 0.0036087155
+1.2139 0.20094 -0.29622999 -0.67249012 -0.21328811 0.70870674 0.0022180888
+1.2124 0.1793 -0.29332 -0.79702055 0.097316653 0.59606004 0.020284215
+1.2071 0.24065 -0.30787 -0.84305251 0.037258103 0.53653926 0.047784481
+1.1959 0.23812 -0.31501999 -0.70170248 0.22988841 0.67436254 0.024870308
+1.2042 0.22067 -0.30585 -0.74939477 0.35811487 0.55692118 0
+1.1964999 0.21882001 -0.31494999 -0.77031094 0.028034158 0.637052 0.00036224542
+1.2019 0.24890999 -0.32146999 -0.77661717 -0.093746156 0.62295872 0.044112355
+1.1892999 0.24181999 -0.32670999 -0.3963052 0.30890471 0.86459243 0.032063637
+1.1887 0.21717 -0.32414001 -0.45190579 -0.52406019 0.72190171 0.020733308
+1.1751 0.23129 -0.3247 0.077577844 0.10611928 0.99132252 0.00010893016
+1.1734 0.22257 -0.3233 0.10319154 0.13849761 0.984972 0
+1.2045 0.19984999 -0.30763999 -0.084621757 -0.98261064 0.16527389 0
+1.1977 0.19982 -0.31117001 -0.94877464 -0.2900981 0.12517886 0.035613667
+1.2064 0.17975999 -0.30972999 -0.11715732 0.98308361 0.1407868 0.0016938255
+1.1997 0.18002 -0.30897999 -0.062375136 -0.97426116 -0.2166205 3.3239558e-05
+1.2031 0.19578999 -0.329 -0.89909148 -0.39291504 -0.19300874 0.014724558
+1.1969 0.20096 -0.32975999 -0.82953149 -0.52518225 -0.18989755 0.011356118
+1.2064 0.18313999 -0.32493001 -0.79065675 0.51872665 0.32524544 0.066156179
+1.1934 0.17811 -0.33129999 -0.47767702 0.14380825 0.86668557 0.00042169369
+1.1738 0.18234999 -0.33399999 nan nan nan nan
+1.2157 0.16085 -0.29227999 -0.86549592 -0.240495 0.43940762 0.0066584344
+1.2181 0.13942 -0.29462001 -0.81749976 0.12838264 0.56143743 0.00032846219
+1.2155 0.12013 -0.29448 -0.83189404 0.0045398339 0.55491608 0.0081043085
+1.2154 0.098802 -0.29447001 -0.79499388 -0.10078572 0.59818643 0.002237851
+1.2107 0.15929 -0.30862001 -0.78237343 -0.1548038 0.60326415 0.026260432
+1.1968 0.16034999 -0.31679001 -0.12844752 -0.98771536 0.088992849 0
+1.2084 0.13953 -0.30943 -0.78845966 0.022689424 0.61466789 0.0045445361
+1.1995 0.13939001 -0.31854001 -0.84612602 0.14499575 0.51288098 0.017490983
+1.1932 0.15978999 -0.32835001 -0.98957229 -0.14205043 -0.023841301 0.018177722
+1.1971999 0.13914999 -0.32828999 -0.97078419 -0.022187483 0.23892631 0
+1.2085 0.11991 -0.31035 -0.888928 -0.084952049 0.45010009 0.014694556
+1.1997 0.12874 -0.31920999 -0.85200167 -0.1289147 0.50741929 0.014640046
+1.2058001 0.1001 -0.30963001 -0.77045572 0.44878998 0.45275328 0.0022469088
+1.1997 0.095489003 -0.31920999 -0.90514576 0.010381807 0.42497456 0.013952408
+1.2043999 0.11932 -0.32218 -0.85370624 -0.16229498 0.49481907 0.015401631
+1.1971 0.12024 -0.33013999 -0.90147394 -0.11241181 0.41798118 0.013322598
+1.2028 0.10474 -0.32269999 -0.82927167 0.18783745 0.52633232 0.0095490869
+1.196 0.099956997 -0.32672 -0.78244895 0.45235819 0.42795539 0.0092639765
+1.3008 0.011956 -0.18314999 -0.8001858 -0.076534018 0.59484887 0.038801759
+1.2832 0.086130999 -0.19061001 -0.95525545 0.28901958 -0.062886737 0.010975115
+1.277 0.076232001 -0.18983001 -0.93129796 0.36378783 0.01850833 0.0039369492
+1.2871 0.051987 -0.18193001 -0.76253659 -0.51384318 0.39306897 0.020577589
+1.2726001 0.059920002 -0.19044 -0.91909933 -0.29253799 0.26396596 0.069710895
+1.2823 0.086961001 -0.20081 -0.89186019 0.32094616 0.31871447 0.017487887
+1.2722 0.079963997 -0.2101 nan nan nan nan
+1.2708 0.059978001 -0.21009 -0.091196597 0.99575984 0.012062736 0
+1.2864 0.039900001 -0.18355 -0.72755337 -0.14484389 0.67058665 0.0097877635
+1.2752 0.039703 -0.19329 -0.8845017 0.041933503 0.46464849 0.026434803
+1.2888 0.019936001 -0.18706 -0.60079193 -0.41789269 0.68147981 0.0036923231
+1.277 0.022146 -0.19595 -0.78701383 -0.34959507 0.50832307 0.016033331
+1.2723 0.039549001 -0.20981 -0.97303605 -0.098577559 0.20852631 0.0011591865
+1.2737 0.019997001 -0.21049 -0.9086529 0.0084960237 0.4174659 0.0071496381
+1.2646 0.079315998 -0.22921 -0.77851468 -0.022763653 0.62721336 0
+1.2661 0.059781 -0.22807001 -0.89851481 -0.046124969 0.43651301 0.016815312
+1.2587 0.084845997 -0.23635 -0.77633458 -0.09908808 0.62248385 0
+1.2566 0.058063999 -0.23762999 -0.63473588 -0.34344533 0.69221079 0
+1.2495 0.080537997 -0.24792001 -0.755373 0.17117256 0.6325438 0.073573716
+1.2328 0.075241998 -0.25648001 -0.46608111 0.57837564 0.66951483 0.053776253
+1.2456 0.059230998 -0.24710999 -0.74830472 -0.14992234 0.64619142 0.023354633
+1.2352 0.062357999 -0.25634 -0.60294932 -0.41407371 0.68190539 0.036682647
+1.2679 0.040592 -0.227 -0.80027914 0.12648374 0.58613586 0.023707775
+1.2643 0.022078 -0.22375999 -0.60101348 0.37125722 0.70777881 0.0059559047
+1.2528 0.037769999 -0.23591 -0.64519787 0.42930055 0.63199741 0.0057350625
+1.2477 0.019009 -0.23217 -0.73967767 0.071208194 0.66918331 0.024143299
+1.2452 0.039820999 -0.24970999 -0.91382295 0.039165266 0.40421996 0.019222047
+1.2385 0.047083002 -0.25916001 -0.80066568 -0.27387366 0.5328486 0.017547583
+1.2414 0.021178 -0.24934 -0.95057946 0.16114159 0.26539031 0.0036968263
+1.2384 0.013481 -0.25365999 -0.89698344 -0.16246474 0.4111276 0.031165032
+1.3008 0.0065672002 -0.18311 -0.80013555 -0.076533124 0.59491652 0.038783342
+1.3015 -0.044853002 -0.18206 -0.72745287 -0.16952501 0.66488624 0.011274662
+1.3005 -0.060679 -0.18213999 -0.76521182 0.22604384 0.60278934 0.016118683
+1.2894 -0.0010424 -0.18918 -0.72061843 0.14821172 0.67730534 0.018012358
+1.2796 5.7058001e-05 -0.19733 -0.8480683 -0.12701382 0.51443923 0.022929369
+1.2864 -0.020571001 -0.18962 -0.8194291 -0.0042828266 0.57316446 0.0076390663
+1.2798001 -0.022883 -0.19864 -0.87199181 0.1820334 0.45441628 0.0032862371
+1.2766 6.6100998e-05 -0.20995 -0.88449556 -0.19755384 0.42265835 0.005699351
+1.2823 -0.013449 -0.20081 -0.86974078 0.031340405 0.49251267 0.013215644
+1.276 -0.020506 -0.20961 -0.9120602 0.17646253 0.37014472 0.0027159241
+1.2898 -0.039197002 -0.18898 -0.60751015 -0.12222388 0.78485197 0.0090137022
+1.278 -0.042114001 -0.19728 -0.77212316 0.095362052 0.62827688 0.013694842
+1.2898 -0.060185 -0.18865 -0.69131947 -0.055354133 0.72042578 0.029132176
+1.2783 -0.058922 -0.19583 -0.78910911 -0.080207065 0.60899395 0.020758741
+1.2733001 -0.039613001 -0.20947 -0.91865027 0.12918416 0.37335375 0
+1.2735 -0.060318001 -0.20964999 -0.92145014 -0.051085275 0.38512319 0.00062127592
+1.2671 -0.0036573 -0.2262 -0.69022739 -0.29730889 0.65969193 0.0080473991
+1.2673 -0.020052001 -0.22887 -0.94245452 0.03461751 0.33253729 0.014666673
+1.2625 -0.016522 -0.24538 -0.56156826 0.7548449 0.33889574 0
+1.2536 0.0030199999 -0.23244999 -0.72748649 -0.48632115 0.48399922 0.0097861802
+1.2594 -0.022262 -0.23791 -0.81093514 0.3422803 0.4745824 0.011762548
+1.2491 -0.00087902998 -0.24961001 -0.8046869 -0.40401518 0.43502957 0.0042169061
+1.2385 0.0070790998 -0.25678 -0.87358344 -0.12728253 0.46973515 0.027988993
+1.2532001 -0.0206 -0.25097001 -0.61267239 0.54414797 0.57318026 0.010910857
+1.2385 -0.028437 -0.25916001 -0.73319602 0.25171542 0.63171422 0.015693165
+1.2668999 -0.039276998 -0.22555999 -0.81733602 0.23415206 0.52643585 0.0085668154
+1.2663 -0.060405999 -0.22669999 -0.80604571 -0.11618444 0.58033741 0.013993196
+1.2561001 -0.041023001 -0.23522 -0.6844272 0.13453969 0.71656024 0.001987285
+1.2539001 -0.058944002 -0.23621 -0.70312202 -0.033032291 0.71030152 0.0035923277
+1.2441 -0.039062999 -0.24732 -0.77516097 0.083190776 0.62626255 0.0029475407
+1.2371 -0.041164 -0.25668001 -0.86605847 0.073600776 0.49449545 0.0023491329
+1.2441 -0.060683999 -0.24872001 -0.85023189 -0.21138813 0.4821004 0.012617051
+1.2385 -0.054182 -0.25540999 -0.89963204 -0.15111263 0.4096671 0.012168868
+1.2431999 0.086432002 -0.26405001 -0.78647465 0.16723789 0.59454942 0.059523799
+1.2299 0.082066998 -0.27127001 -0.73687005 0.61566156 0.27925524 0.092687972
+1.2408 0.050613001 -0.26137 -0.80190325 -0.2730054 0.53143132 0.016146664
+1.2286 0.05737 -0.26886001 -0.76110625 -0.58445728 0.28129536 0.042413607
+1.2257 0.078218997 -0.28793001 -0.89814073 -0.13972782 0.41691658 0.0077675735
+1.2258 0.060867 -0.28762001 -0.8708896 0.25286084 0.42144117 0.020046845
+1.2427 0.036194 -0.26306 -0.88967198 -0.076142251 0.45020673 0.019481186
+1.2337 0.040681001 -0.27177 -0.79511839 -0.36512342 0.4842228 0.012322853
+1.2408 0.022668 -0.26157999 -0.90266615 0.24496676 0.35381523 0.015950566
+1.2327 0.020002 -0.27066001 -0.93992501 0.10594163 0.32452628 0.0088305036
+1.227 0.039103001 -0.28876001 -0.76062077 -0.29593575 0.57782179 0.014743091
+1.2284 0.020226 -0.29003999 -0.97737706 -0.11018331 0.18053734 0.00095509476
+1.2266001 0.020776 -0.30371001 -0.65130502 -0.3366164 0.68006706 0.080801629
+1.2416 -0.0040766001 -0.26131001 -0.79457855 -0.24498323 0.55554301 0.0095274532
+1.2333 0.00010337 -0.27079001 -0.8994832 -0.13745669 0.41477191 0.014681754
+1.2421 -0.017426999 -0.26087999 -0.64496022 0.12249266 0.7543354 0.0061645438
+1.2305 -0.020531001 -0.27059999 -0.66572833 0.048516255 0.7446152 0.0088962754
+1.2253 -0.00017879999 -0.28979999 -0.92308849 0.2588315 0.28445363 0.013384144
+1.2234 -0.016132999 -0.28884 -0.87365693 0.35344937 0.33436078 0.009649043
+1.2312 -0.039980002 -0.26973999 -0.74666053 -0.14342593 0.64955914 0.020632612
+1.2414 -0.064038001 -0.26260999 -0.90273356 -0.26104012 0.3419506 0.0044644396
+1.2345001 -0.059489001 -0.27171001 -0.84283566 -0.19137928 0.50299311 0.0097339666
+1.2237999 -0.046032 -0.28154001 -0.63413835 -0.22298925 0.74036771 0.0057514287
+1.2252001 -0.060727999 -0.28235 -0.5277254 -0.10446189 0.84296721 0.014761966
+1.2251 0.0054755001 -0.30340001 -0.68333477 0.38314614 0.62149221 0.037049372
+1.2187999 0.071671002 -0.25926 -0.58013171 0.030232251 0.81396145 0.16209891
+1.2176 0.072649002 -0.26763999 -0.43915138 -0.071697354 0.89554769 0.20724165
+1.2165 0.066004999 -0.27057999 -0.67800701 -0.62752962 0.38277021 0.025605667
+1.2180001 0.082613997 -0.29578 -0.74303144 -0.16701716 0.64808136 0
+1.2147 0.056635998 -0.29596001 -0.72798121 0.17464745 0.66297936 0.0028225463
+1.2134 0.043862998 -0.29642999 -0.64367878 -0.13471711 0.75334513 0.0065748482
+1.2065001 0.080026999 -0.30950001 -0.7918334 0.026983475 0.6101408 0.00094089069
+1.1997 0.080940001 -0.31920999 -0.98036081 -0.0089572556 0.19700888 0.036150757
+1.2054 0.060446002 -0.30971 -0.90390998 -0.10874352 0.41366842 0.015782351
+1.1997 0.065560997 -0.31920999 -0.9611519 0.0087872911 0.27588022 0.03021853
+1.2023 0.079631001 -0.33249 -0.9800514 0.19852811 0.0092630582 0.027936541
+1.1985 0.079125002 -0.32888001 -0.9748069 0.18006849 0.131631 0.08246395
+1.2029999 0.056558002 -0.32582 -0.96369994 0.059837215 0.260196 0.068774156
+1.1964 0.063056 -0.32993001 -0.87380344 -0.044039991 0.48428097 0.064162992
+1.2059 0.040623002 -0.30673999 -0.2273756 0.96476382 -0.13240495 0
+1.1959 0.037138 -0.31538999 -0.87280405 0.39185834 0.29096419 0.054910608
+1.211 0.020165 -0.30774999 -0.040920667 0.99916017 0.0021333063 0
+1.1952 0.019514 -0.31415001 -0.74277115 0.011187 0.66945195 0.065898858
+1.2019 0.044027999 -0.33230001 -0.94820559 0.026480513 -0.3165518 0.068886332
+1.1935 0.039487001 -0.32523 -0.91662478 0.36914888 -0.15338862 0.036000498
+1.2019 0.015896 -0.33701 -0.2733475 0.77934778 -0.56382459 0.0030503087
+1.1957999 0.019370999 -0.32769999 -0.87323552 0.40541065 -0.27037388 0.043265712
+1.2182 -0.028391 -0.27897999 -0.70594889 0.18863058 0.68268204 0.050027933
+1.2199 -0.0065954998 -0.29923001 -0.76193011 0.273985 0.5868516 0.035940506
+1.2151999 -0.024786999 -0.2913 -0.76072389 0.49567023 0.41905889 0.0033309513
+1.2176 -0.034499001 -0.27906001 -0.68643391 0.020992851 0.72688907 0.053773489
+1.2072001 -0.039723001 -0.28905001 -0.79021144 0.16624708 0.58985406 0.060143843
+1.1997 -0.044588 -0.29541999 -0.81028765 0.29069307 0.50885314 0.046076976
+1.2086999 -0.059255999 -0.28830999 -0.45729828 -0.028036011 0.88887131 0.0048079561
+1.1969 -0.06098 -0.29613999 -0.72438484 0.083591826 0.68430912 0.0066930684
+1.2101001 -0.0013001 -0.30614001 -0.44929811 0.10446268 0.88725346 0.015448105
+1.1964 -0.00011118 -0.31481001 -0.75255758 -0.094567239 0.65170091 0.021686096
+1.2095 -0.020496 -0.30748999 -0.75941747 0.16571921 0.62914413 0.017852031
+1.1974 -0.018805999 -0.31674999 -0.64944679 -0.1404098 0.74733126 0.00080774812
+1.1919 0.00042731999 -0.32789999 -0.96383643 0.19370365 0.18302539 0.0031503693
+1.1891 -0.019021999 -0.32504001 -0.39318094 0.33572108 0.85597897 0.011164905
+1.1706001 -0.025064001 -0.32719001 -0.062760212 -0.021744808 0.99779165 0.00093003397
+1.1571 -0.026567999 -0.32712001 -0.0057590138 0.097863123 0.99518323 3.8633847e-05
+1.2053 -0.035484001 -0.30752999 -0.79184192 0.50562453 0.34253493 0.013450466
+1.1941 -0.04219 -0.31262001 -0.75469309 0.46172005 0.46610403 0.020065298
+1.1878999 -0.059889 -0.3096 -0.80026561 0.43554944 0.41215476 0.021373322
+1.1853 -0.040716 -0.32545 -0.63779736 -0.25538284 0.72663212 0.020510832
+1.1854 -0.057994001 -0.32598999 -0.86505932 0.3451831 0.36403427 0.03577558
+1.1767 -0.069092996 -0.31733999 -0.87929839 0.42368522 0.21754323 0.088355295
+1.1738 -0.032809 -0.32641 -0.0067885062 0.10353373 0.99460274 6.2028812e-05
+1.1772 -0.068065003 -0.32527 -0.86724108 0.37536737 -0.3270967 0.02314375
+1.2029999 0.20329 -0.34094 -0.53983217 -0.71483588 -0.44451192 6.8876921e-05
+1.1975 0.15838 -0.34103 nan nan nan nan
+1.2026 0.07739 -0.3425 -0.43570215 0.8605212 -0.26394463 0.0013313045
+1.1964 0.073259003 -0.34154999 -0.74866813 0.60165673 0.27839762 0.12097263
+1.1866 0.069778003 -0.34039 -0.71453291 0.63016182 0.30387318 0.14180131
+1.2026 0.011277 -0.34167001 -0.27240518 0.77955467 -0.56399453 0.0030770742
+1.1931 0.0089819999 -0.34143999 -0.86510068 0.36503592 -0.34401977 0.076949954
+0.98624003 0.33418 -0.053410001 -0.59154987 -0.52511448 -0.61181986 0.015360881
+1.0423 0.35091001 -0.099661 -0.50536245 -0.35057405 -0.78848374 0.013460168
+1.0272 0.35510999 -0.097126998 -0.39207593 -0.36424968 -0.84474766 0.0076418663
+1.0422 0.34143999 -0.098866001 -0.58941776 0.075140186 -0.80432618 0.0056813094
+1.0314 0.33921999 -0.093121998 -0.30308104 -0.25123763 -0.91925055 0.0051921736
+0.98835999 0.35350999 -0.074446999 -0.57212311 -0.37428993 -0.72978228 0.0091463234
+1.0041 0.33465999 -0.074383996 -0.61962932 -0.41877943 -0.6638397 0.0052389335
+0.99171001 0.34046 -0.068715997 -0.55302584 -0.54821575 -0.62739289 0.013383035
+1.0122 0.35907 -0.090294003 -0.47227418 -0.17894369 -0.86309683 0.00024038198
+0.99747998 0.35518 -0.080861002 -0.55095547 -0.269063 -0.7899704 0.01328473
+1.01 0.34044001 -0.084981002 -0.51207596 -0.28262237 -0.81111211 0.013192269
+0.99744999 0.34604999 -0.080720998 -0.59184152 -0.4373717 -0.67707431 0.010708646
+0.96509999 0.33256999 -0.038185999 -0.49918073 -0.3557778 -0.79008913 0.026661379
+0.94774997 0.336 -0.032117002 -0.5300743 -0.42342383 -0.73466563 0.030038577
+0.97437 0.3511 -0.057673 -0.87794834 -0.16736095 -0.4485499 0.0056687933
+0.97171998 0.34059 -0.050207999 -0.36277279 -0.64908558 -0.66864318 0.011766876
+0.95315999 0.34106001 -0.043542001 -0.28969932 -0.76029825 -0.5813958 0.0021934023
+0.93818998 0.33425999 -0.021791 -0.6013369 -0.34075528 -0.72268921 0.011092702
+0.97645998 0.35146001 -0.064659998 -0.60695332 -0.46628511 -0.64357269 0.0097977724
+0.97817999 0.34683001 -0.063612998 -0.5524295 -0.57775062 -0.60085428 0.012548574
+1.0022 0.31172001 -0.059714999 -0.64088565 -0.40818968 -0.65011287 0.0016259245
+0.98964 0.32080001 -0.053135 -0.73513103 -0.34868973 -0.5813759 0.0082996534
+1.0061001 0.29795 -0.056894999 -0.50328743 -0.11298843 -0.85670024 0.0070278966
+0.98826998 0.29798001 -0.050030001 -0.37210068 -0.35210219 -0.85881603 0.00044811211
+1.0239 0.27375999 -0.058286998 -0.45363694 -0.420028 -0.78599614 0.0079978583
+1.0269001 0.25622001 -0.053047001 -0.54306775 -0.397194 -0.73980701 0.0075149098
+1.0007 0.27103001 -0.038821001 -0.64751422 -0.36966881 -0.66638607 0.016425123
+0.98970997 0.27520999 -0.035362002 -0.70858109 -0.33926356 -0.61871898 0.035426173
+1.0032001 0.25725999 -0.037817001 -0.5580644 -0.44755393 -0.69875568 0.034663081
+0.99238002 0.25993001 -0.028973 -0.57974797 -0.29669657 -0.75885665 0.011026025
+1.0065 0.27761999 -0.052758001 -0.52920616 -0.47565553 -0.70263267 0.017539851
+0.99409997 0.28202999 -0.04532 -0.59185356 -0.50543219 -0.62789154 0.0048521264
+1.0096999 0.26109999 -0.046606001 -0.50618666 -0.440752 -0.74129122 0.020207331
+0.99913001 0.2604 -0.041012 -0.64997137 -0.27512601 -0.70840865 0.02593632
+1.0243 0.31290999 -0.078952 -0.53482771 -0.44479781 -0.71841085 0.0029933667
+1.0274 0.29855999 -0.075020999 -0.55388737 -0.38605055 -0.73768133 0.0010342777
+1.0437 0.31672001 -0.095969997 -0.52623862 -0.25807166 -0.81022954 0.0012991108
+1.0315 0.31964001 -0.088941999 -0.49399853 -0.47522292 -0.72809935 0.0020926569
+1.0470001 0.29947001 -0.091669999 -0.61940527 -0.35460439 -0.70042324 0.00084732863
+1.0364 0.30210999 -0.082220003 -0.59670305 -0.37058839 -0.71176511 0.0020259821
+1.0085 0.31933001 -0.071543999 -0.60294199 -0.41857234 -0.67915988 0.0046565756
+0.99814999 0.32106999 -0.063809 -0.65302795 -0.36250415 -0.66494006 0.0027887158
+1.0147001 0.30201 -0.065925002 -0.6108622 -0.2786729 -0.74107277 0.0078777624
+1.0165 0.32352999 -0.082944997 -0.57714736 -0.41861019 -0.70118928 0.0058843433
+1.0452 0.27706999 -0.07418 -0.57207048 -0.36976081 -0.73212856 0.0055663264
+1.0326 0.28084999 -0.068348996 -0.40887424 -0.45443934 -0.79139543 0.0066493112
+1.0492001 0.25983 -0.071800001 -0.48200634 -0.37494326 -0.79188848 0.0051275091
+1.0359 0.26087001 -0.062991001 -0.58242917 -0.30539227 -0.75333381 0.00046523512
+1.0523 0.28239 -0.085868999 -0.57792288 -0.47135994 -0.66620189 0.0010732175
+1.0581 0.26899001 -0.080642 -0.59932244 -0.37158343 -0.70904052 0.0056808707
+1.0149 0.28428 -0.063830003 -0.4841094 -0.30245218 -0.82107288 0.016016688
+0.96306998 0.32085001 -0.038086001 -0.54474449 0.031195771 -0.83802158 0.00099381385
+0.94976002 0.31974 -0.028520999 -0.65751249 -0.25400034 -0.70933843 0.0087401588
+0.96763998 0.29743001 -0.031971999 -0.60646862 -0.37259865 -0.70240027 0.0058772578
+0.95286 0.30410001 -0.026695 -0.65577829 -0.28802717 -0.69785047 0.013611356
+0.97214001 0.31906 -0.042957 -0.46266943 0.053194512 -0.88493359 0
+0.97443998 0.30241001 -0.044923998 -0.6421991 -0.22691514 -0.73218161 0.016604725
+0.93839997 0.32855001 -0.02132 -0.60133564 -0.34098816 -0.72258049 0.010995754
+0.96977001 0.28020999 -0.028422 -0.5730378 -0.40692422 -0.7113651 0.010582825
+0.95863003 0.28439999 -0.020764999 -0.57936299 -0.34944806 -0.73635894 0.0094447583
+0.97514999 0.26655999 -0.021677 -0.52855903 -0.43421173 -0.729442 0.0069686039
+1.0429 0.37325999 -0.11743 -0.55898684 -0.46314111 -0.68777466 0.0015551018
+1.0348001 0.37198001 -0.11058 -0.50994319 -0.45145184 -0.73222202 0.00044642476
+1.0515 0.37531 -0.12695999 -0.54298478 -0.38126713 -0.74819976 0.0031298595
+1.0481 0.35865 -0.11181 -0.57458097 -0.43358243 -0.69416356 0.0069548674
+1.0322 0.36425 -0.1044 -0.4353714 -0.5090071 -0.74253863 0.0054270723
+1.0508 0.34081 -0.10725 -0.61052704 -0.24516262 -0.75309491 0.0062119393
+1.0549999 0.36454001 -0.12291 -0.56989622 -0.48584363 -0.66270226 0.00044383502
+1.0525 0.32221001 -0.10257 -0.42414996 -0.22904642 -0.87614757 0.0017767218
+1.0568 0.30441999 -0.10105 -0.51871055 -0.25665379 -0.81551713 0.00063875562
+1.0221 0.23537 -0.037182 -0.64915639 -0.15404053 -0.74489421 0.0042364574
+1.0225 0.21933 -0.036662001 -0.70874989 -0.051645499 -0.70356691 0.00026185854
+1.0463001 0.23871 -0.056499999 -0.40967178 -0.56561309 -0.71571696 0.0029351611
+1.0311 0.24108 -0.047862999 -0.55682254 -0.4458634 -0.70082414 0.0024260422
+1.0488 0.21838 -0.05359 -0.50827813 -0.387108 -0.76928586 6.6468863e-05
+1.0308 0.22087 -0.044707999 -0.55769694 -0.20806384 -0.80354428 0.022390118
+1.0113 0.23957001 -0.030972 -0.62814766 -0.23932452 -0.74037439 0.0017182837
+0.99248999 0.24383 -0.024568001 -0.41863659 -0.38237461 -0.82373112 0.0074484423
+1.0134 0.22029001 -0.027148999 -0.68760318 -0.17205618 -0.70540667 0
+1.0195 0.24716 -0.040963002 -0.50987303 -0.4880107 -0.70843148 0.002609628
+1.0434999 0.19487 -0.037856001 -0.5037387 -0.30588669 -0.8078866 0.0011187824
+1.029 0.19865 -0.031991001 -0.44435492 -0.43187734 -0.78487617 0.00069357309
+1.0454 0.17878 -0.034405999 -0.63782907 -0.19686742 -0.74459207 0.0024232878
+1.0346 0.18148001 -0.024737 -0.61433709 -0.43724835 -0.65681338 0.0010811058
+1.0505 0.20205 -0.046415001 -0.51546603 -0.34963229 -0.78233755 0.0017678599
+1.0385 0.20787001 -0.041317001 -0.45540243 -0.41703296 -0.78656989 0.00063678069
+1.0547 0.183 -0.042139001 -0.52490717 -0.28920814 -0.80051923 0.0010481714
+1.0143 0.20238 -0.024985 -0.48043475 -0.15156966 -0.86383396 0.00014117493
+1.0544 0.24455 -0.063707002 -0.46875292 -0.47174102 -0.74681407 0.0031478505
+1.039 0.24972001 -0.060465999 -0.4900673 -0.46226531 -0.73901606 0.0034021919
+1.058 0.2208 -0.060697 -0.6173467 0.02119299 -0.78640568 0
+1.0484 0.15982001 -0.032285001 -0.509031 -0.21353047 -0.8338418 0.00070563675
+1.034 0.16102 -0.022674 -0.52293652 -0.22334746 -0.8225894 0.00044747975
+1.0495 0.14044 -0.027031001 -0.46455052 -0.53494102 -0.70571309 0.00022244413
+1.0376 0.14274999 -0.020564999 -0.51756185 -0.30014956 -0.801274 0.0075044017
+1.0562 0.1222 -0.022142 -0.56217986 -0.27093557 -0.78137553 0
+1.0575 0.099806003 -0.020997999 -0.34047982 -0.77234882 -0.53623754 0.029662728
+1.382 -0.30788001 -0.055009 -0.87184823 -0.37457424 -0.3155548 0.028956322
+1.3812 -0.28753 -0.067667998 -0.54462379 -0.15516646 0.82420164 0
+1.3824 -0.30002001 -0.068874002 -0.99017638 0.082056463 0.11321414 0.021858247
+1.3802 -0.30138001 -0.086060002 -0.9462083 0.026283607 0.3224889 0.082975477
+1.3822 -0.32526001 -0.036679 -0.63914949 -0.48908997 -0.59353083 0.0068001272
+1.3877 -0.34158999 -0.032031 -0.73422575 -0.40569702 -0.54435515 0.015835108
+1.3866 -0.32086 -0.051219001 -0.88984895 -0.39971793 -0.21998742 0.032233417
+1.4009 -0.34863001 -0.056290999 -0.97025788 -0.18337983 0.15802342 0.067520641
+1.3934 -0.33972999 -0.049332 -0.91338605 -0.21242119 -0.34727964 0.003934416
+1.4009 -0.36504999 -0.037935 -0.95261472 -0.18663703 -0.24019133 0.013600939
+1.3934 -0.35982001 -0.029034 -0.69167393 -0.25964165 -0.67392385 0.002293383
+1.4012001 -0.38177001 -0.033438001 -0.92630935 -0.24246059 -0.28838119 0.022728505
+1.3958 -0.37718001 -0.026084 -0.78614461 -0.23452827 -0.57181549 0.0027541295
+1.401 -0.36414999 -0.048526999 -0.99537814 0.055148378 0.078619353 0.0083927261
+1.3979 -0.35598001 -0.050905 -0.92359698 -0.30542955 -0.23169258 0.0082014035
+1.4011 -0.38038 -0.046349999 -0.9897809 -0.022083368 0.14087616 0.0042483718
+1.3972 -0.38036001 -0.0557 -0.89580798 -0.0053339028 0.44440928 0.00029487707
+1.3853 -0.32025999 -0.069201 -0.89032131 -0.40278122 0.2123563 0.0058548059
+1.4009 -0.34823999 -0.063281 -0.9592579 -0.21618576 0.1819015 0.089956164
+1.3916 -0.33959001 -0.070032999 -0.78692597 -0.40708911 0.463709 0.0096563837
+1.3815 -0.32352999 -0.082872003 -0.80906838 -0.27504173 0.51938456 0.012605228
+1.3834 -0.34185001 -0.082172997 -0.67332137 0.017180685 0.73915023 0.0082630767
+1.4009 -0.35155001 -0.063087001 -0.97029006 -0.1827925 0.15850551 0.068340853
+1.3931 -0.36039001 -0.070036002 -0.7698521 0.091710441 0.63159871 0.010325438
+1.3903 -0.37979001 -0.069020003 -0.735744 0.26231584 0.62439674 0.0073163584
+1.3821 -0.35697001 -0.081202 -0.64545494 0.14572632 0.74976784 0.0011470151
+1.3047 -0.083297998 -0.096127003 -0.49596876 -0.28020063 -0.82188964 0.00041516544
+1.3084 -0.10085 -0.093193002 -0.54553568 -0.30589592 -0.78026819 0.0044276919
+1.3404 -0.14445999 -0.098442003 -0.86269933 -0.35656545 -0.35862365 0.040707927
+1.3045 -0.12507001 -0.076823004 -0.51615554 -0.42248636 -0.7450428 0.0031042767
+1.3083 -0.14108001 -0.072604999 -0.59635985 -0.22636425 -0.77013904 0.0045810356
+1.3247 -0.12345 -0.095775001 -0.67586774 -0.38475752 -0.62862116 0.0028119113
+1.3121001 -0.11884 -0.087820001 -0.55426395 -0.39355123 -0.73342276 0.0055573741
+1.3276 -0.14044 -0.091027997 -0.58551133 -0.25073004 -0.77091563 0.0038368045
+1.3176 -0.13846999 -0.081890002 -0.64215249 -0.21162499 -0.73678696 0.0047967471
+1.2647001 -0.10386 -0.055452 -0.65519208 -0.3785975 -0.65374863 0.0034747995
+1.2253 -0.083586998 -0.037423 -0.52326858 -0.4399676 -0.7298072 0.0006105979
+1.2427 -0.10707 -0.038396999 -0.56731945 -0.32960469 -0.75465846 0.0015605065
+1.2306 -0.10109 -0.032223001 -0.54514432 -0.37347528 -0.75055569 0
+1.2478 -0.082668997 -0.054900002 -0.55104089 -0.42122442 -0.72036374 0.0010041415
+1.2318 -0.078699999 -0.046165999 -0.51522499 -0.4131521 -0.75089854 0.00099157402
+1.2509 -0.098586999 -0.047733001 -0.53658158 -0.39473084 -0.74583364 0.00072457641
+1.2385 -0.091941997 -0.042468999 -0.53499573 -0.40693349 -0.74039501 0.0010519596
+1.263 -0.14744 -0.037330002 -0.65831167 -0.38053724 -0.6494745 0.0038414805
+1.2687 -0.12075 -0.052475002 -0.67788005 -0.23961243 -0.69502848 0.0016060697
+1.2849 -0.14443 -0.057792999 -0.54298949 -0.32092735 -0.7759949 0.0028319629
+1.2711 -0.14011 -0.048937999 -0.64612168 -0.27178082 -0.71320546 0.0023954648
+1.2449 -0.12042 -0.035872001 -0.58972824 -0.31603301 -0.74319828 0.00322729
+1.235 -0.11973 -0.026172999 -0.71049064 -0.22624555 -0.66634524 8.3352883e-05
+1.2501 -0.14038999 -0.030751999 -0.56487924 -0.43809193 -0.69927603 0.00066728954
+1.2371 -0.13682 -0.022345999 -0.65602511 -0.27161044 -0.70417243 0.0014014865
+1.2558 -0.11965 -0.042631 -0.55576652 -0.26210421 -0.78893912 0.00055714516
+1.2595 -0.13417999 -0.041184999 -0.61679065 -0.26978764 -0.73944837 0.0011014745
+1.2697001 -0.080906004 -0.073081002 -0.60073501 -0.32837597 -0.72889417 0.001310308
+1.2836 -0.10381 -0.077372 -0.57216728 -0.35215607 -0.74068266 0.0016231351
+1.2724 -0.099477999 -0.068759002 -0.72561413 -0.29475665 -0.62177378 0.00046910453
+1.2889 -0.080617003 -0.088468999 -0.4560056 -0.36978987 -0.80951494 0.0033454779
+1.2769001 -0.074449003 -0.084229998 -0.5835954 -0.41598797 -0.69740254 0.001378144
+1.2913001 -0.099104002 -0.083377004 -0.49230036 -0.29218432 -0.81991994 0
+1.2539999 -0.078224003 -0.063447997 -0.57087648 -0.42069831 -0.70506233 0.00074422249
+1.2887 -0.11994 -0.071889997 -0.45783484 -0.43093103 -0.77761537 0.0028780471
+1.2765 -0.11777 -0.064011 -0.64896309 -0.33196992 -0.6845749 0.0046411036
+1.2916 -0.1388 -0.063394003 -0.45803612 -0.30527249 -0.83487225 0.0015016006
+1.279 -0.13099 -0.060846001 -0.59890205 -0.33395398 -0.72786748 0.0058908006
+1.2957 -0.11191 -0.081244998 -0.48753762 -0.42644626 -0.76187313 0.0033250637
+1.3012 -0.16812 -0.058894001 -0.59182853 -0.36299807 -0.71970236 0.0037874528
+1.3049001 -0.18205 -0.053924002 -0.64036459 -0.37536782 -0.67009872 0.0042757662
+1.3418 -0.2273 -0.058874 -0.53817177 -0.46835554 -0.70072407 0.00058038201
+1.3016 -0.20546 -0.039372001 -0.55755079 -0.37564749 -0.74028784 0.00039294045
+1.3065 -0.22209001 -0.034557998 -0.54356587 -0.39775825 -0.73913771 0.00067137548
+1.3219 -0.20671999 -0.056612 -0.59550017 -0.4316949 -0.67750949 0.0031378535
+1.3116 -0.19994 -0.049433 -0.62691081 -0.39129034 -0.67370218 0.0036639906
+1.3272001 -0.22127999 -0.052421 -0.54728544 -0.42990214 -0.71809661 0.00046689648
+1.3148 -0.21763 -0.044154 -0.60699207 -0.36324167 -0.70683521 0.00098931009
+1.3404 -0.18403 -0.078937002 -0.60250163 -0.26400813 -0.75318748 0.015726529
+1.3437999 -0.16371 -0.095142998 -0.80009615 -0.36485708 -0.47615698 0.043137107
+1.3487 -0.18024001 -0.090473004 -0.94068557 -0.17718811 -0.28933555 0.031406406
+1.3246 -0.16614 -0.076601997 -0.55225998 -0.41932836 -0.72053635 0.0066471482
+1.3096 -0.15906 -0.069328003 -0.59267497 -0.27490562 -0.75707549 0.0068821912
+1.3286999 -0.18054 -0.074662 -0.46537268 -0.29792443 -0.8334682 0.00038317454
+1.3132 -0.17926 -0.065479003 -0.60386527 -0.282664 -0.74528366 0.0053528938
+1.33 -0.15828 -0.087596998 -0.56672448 -0.39282304 -0.72423297 0.0089342417
+1.3182 -0.15389 -0.080678001 -0.64765114 -0.25564241 -0.71777076 0.005460816
+1.3376 -0.17253 -0.081556 -0.58630699 -0.41442949 -0.69605488 0.0064528631
+1.3448 -0.20352 -0.074222997 -0.59990633 -0.48309842 -0.63775253 0.0070907194
+1.3508 -0.22056 -0.070988998 -0.75661296 -0.43299311 -0.48995283 0.023905803
+1.3528 -0.19995999 -0.090131 nan nan nan nan
+1.3556 -0.22002999 -0.090245999 -0.96737641 -0.070896253 -0.24322134 0
+1.3291 -0.19892 -0.067396998 -0.49372652 -0.39583144 -0.77430713 0.0017877015
+1.3162 -0.19340999 -0.062011 -0.65770072 -0.41824102 -0.6265015 0.0035547379
+1.3346 -0.21306001 -0.062642999 -0.5349158 -0.42171243 -0.73213643 0.00077594415
+1.267 -0.1622 -0.031622 -0.72814947 -0.41618228 -0.54460138 0.0020809781
+1.2846 -0.18506999 -0.037080001 -0.60749733 -0.38419423 -0.69522786 0.0022850407
+1.2733001 -0.17935 -0.028620999 -0.73497015 -0.34531331 -0.58359027 0.0021849219
+1.2891999 -0.16108 -0.054602001 -0.52686822 -0.37697133 -0.76177591 0.0013480629
+1.2743 -0.1583 -0.045198001 -0.66080087 -0.34779942 -0.66511488 0.0040345835
+1.2916 -0.17781 -0.045786999 -0.53423363 -0.41093153 -0.73873526 0.00066458835
+1.279 -0.17175999 -0.041347999 -0.6289652 -0.41458607 -0.6576634 0.0043829693
+1.2557 -0.15527999 -0.024956999 -0.55067259 -0.48062992 -0.68246222 0.0044799228
+1.2891001 -0.20121001 -0.032430001 -0.57854092 -0.34850439 -0.73745179 0.00076970999
+1.2774 -0.19746 -0.024056001 -0.66598892 -0.32199332 -0.67288852 0.0014963641
+1.2905999 -0.2183 -0.026099 -0.54346025 -0.38777584 -0.7445004 0.00060483237
+1.2798001 -0.2103 -0.021273 -0.6760428 -0.34406823 -0.65160042 0.0028231377
+1.2956001 -0.19279 -0.042004999 -0.55134696 -0.37574112 -0.74487257 0
+1.2968 -0.15648 -0.061094001 -0.53864586 -0.29258636 -0.79009742 0.0003455785
+1.3232 -0.081116997 -0.11455 -0.9128741 -0.16154341 -0.37491959 0.0070052017
+1.3155 -0.078942001 -0.10513 -0.65255725 -0.34409779 -0.6751042 0.0034097559
+1.3238 -0.10029 -0.11246 -0.96667922 0.051908724 -0.25067291 0.011358419
+1.3176 -0.099097997 -0.10231 -0.59088993 0.66783029 -0.45260566 0
+1.3264 -0.080086 -0.1305 -0.99503577 -0.094980866 -0.029705441 0.011307425
+1.3253 -0.10022 -0.13039 -0.21004131 -0.977485 -0.020142006 0
+1.3407 -0.12668 -0.11405 -0.95112443 -0.26630095 0.15635251 0.041621909
+1.3407 -0.14072999 -0.10858 -0.98638582 0.10345579 0.12782806 0.00970768
+1.332 -0.11872 -0.10933 -0.70741475 -0.45643222 -0.53966093 0.00047268215
+1.3371 -0.13978 -0.11095 -0.9862113 0.10364602 0.12901466 0.011728549
+1.3306 -0.12081 -0.13018 -0.83731818 0.14197508 0.52795959 0.00081442948
+1.3281 -0.14046 -0.12973 -0.87939578 0.048759937 0.47358793 0.0018978952
+1.3229001 -0.079874001 -0.14471 -0.88406533 -0.04613328 0.46508077 0.0085514653
+1.3137 -0.080330998 -0.15452 -0.79687858 0.10978336 0.59408087 0.00059069024
+1.3225 -0.099371001 -0.14359 -0.86690146 0.1781857 0.46554458 0.012702373
+1.313 -0.10023 -0.15333 -0.76531947 -0.030705841 0.64291775 0.0020220818
+1.3042001 -0.081134997 -0.1693 -0.84562671 -0.36346772 0.39090511 0.013194662
+1.3035001 -0.1013 -0.16642 -0.77228856 -0.25196752 0.58316612 0
+1.3226 -0.12011 -0.14462 -0.84983349 0.030416029 0.526173 0.0018394614
+1.316 -0.11961 -0.15368 -0.80561179 -0.13721859 0.57633376 0.00097222335
+1.3217 -0.13813999 -0.14399999 -0.89010572 0.062789291 0.45140821 0.00082929223
+1.3161 -0.14125 -0.15307 -0.86910582 0.10662812 0.4829964 0
+1.3063999 -0.12132 -0.16761 -0.73779565 -0.16636243 0.6542027 0.0017107673
+1.3074 -0.14045 -0.16918001 -0.83087128 -0.042587295 0.55483264 0.014401332
+1.2970999 -0.074169002 -0.17726 -0.83581114 -0.060309719 0.54569459 0.033443015
+1.2959 -0.098802 -0.17535999 -0.81428629 0.026006227 0.57988054 0.0013766156
+1.2951 -0.11805 -0.17666 -0.59057528 -0.051995941 0.80530572 0.0021286763
+1.2948999 -0.13575 -0.17881 -0.62557173 -0.214798 0.7500146 0.0056442586
+1.3430001 -0.16087 -0.10909 -0.94671041 -0.26223966 0.18700206 0.0034257174
+1.3479 -0.18008 -0.11042 -0.96498662 -0.1691404 0.2004801 0.0058593103
+1.3404 -0.16638 -0.12073 -0.79345542 -0.24108624 0.55884337 0.0071585323
+1.3421 -0.18165 -0.12425 -0.80175501 -0.20711142 0.560619 0.0067229862
+1.3376 -0.15288 -0.11641 -0.78257704 -0.23158635 0.57787627 0.0072600986
+1.3285 -0.16011 -0.13005 -0.74575526 -0.11226878 0.65669239 0.013870458
+1.3187 -0.16917001 -0.13888 -0.81862795 -0.18554156 0.54352796 0.018976221
+1.3314 -0.17888001 -0.13327 -0.65370291 -0.31109434 0.68984985 0.0081923632
+1.3485 -0.20051999 -0.11017 nan nan nan nan
+1.3492 -0.22059 -0.11015 -0.91223967 -0.03425676 0.40822226 0
+1.3424 -0.19986001 -0.12910999 -0.95058703 -0.059109438 0.30477926 0.016606921
+1.3414 -0.22102 -0.12763 -0.85498273 -0.17771052 0.48726127 0.0039714137
+1.3372 -0.20129 -0.13376001 -0.74586827 0.25451446 0.61555094 0.045714203
+1.3345 -0.21852 -0.13426 -0.78704417 0.045649137 0.61520535 0.001761179
+1.3214 -0.15776999 -0.14196 -0.83083707 0.14527455 0.53721976 0.0057834657
+1.3148 -0.1602 -0.15146001 -0.95476264 0.0074189687 0.29727653 0.010132383
+1.3238 -0.18213999 -0.14544 -0.77256632 -0.32678682 0.54438204 0.01349571
+1.3166 -0.17823 -0.15391999 -0.85414386 -0.22823675 0.46727532 0.015243884
+1.3045 -0.15944999 -0.16862001 -0.87520123 0.23733886 0.42153651 0.0068367543
+1.3074 -0.18045001 -0.16864 -0.77516818 -0.23651941 0.58580959 0.0059298151
+1.3404 -0.19982 -0.14117 -0.088919558 0.99295002 0.078380756 0.0026438746
+1.3265001 -0.20013 -0.14811 -0.68602473 -0.069288872 0.72427148 0.031195121
+1.3184 -0.19992 -0.15804 -0.75779957 0.32156348 0.56774718 0
+1.3248 -0.22 -0.14856 -0.82913679 0.087837547 0.55210215 0.0013571831
+1.3184 -0.2208 -0.15814 -0.55614144 0.7516064 0.35467517 0.00068754959
+1.3102 -0.20017 -0.1698 -0.85533601 -0.11212388 0.50579494 0.0034288636
+1.3111 -0.22013 -0.16986001 -0.83105403 0.0056771701 0.55616266 0.0008510481
+1.2968 -0.16315 -0.17745 -0.83212942 0.22339796 0.50759637 0.005049027
+1.2959 -0.17607 -0.1781 -0.73783958 -0.20616658 0.64271933 0.0081563322
+1.2104 -0.079968996 -0.029686 -0.50562847 -0.33116567 -0.79666126 0.0043378519
+1.198 -0.079053998 -0.021875 -0.5644477 -0.12375548 -0.81613922 0.00072237913
+1.2122999 -0.097292997 -0.024256 -0.37612998 -0.39896166 -0.83627498 0.0045598876
+1.1991 -0.091931 -0.020346999 -0.53146243 -0.34600458 -0.77319366 0.0046453676
+1.2187999 -0.071901001 -0.041370999 -0.54050821 -0.40303916 -0.73851901 0.001618008
+1.3441 -0.26618999 -0.036777999 -0.54959917 -0.46191081 -0.69611722 0.00083955948
+1.3476 -0.24214999 -0.053601 -0.59514171 -0.38797545 -0.70376241 0.0018661721
+1.3636 -0.26616001 -0.056510001 -0.7490328 -0.4180105 -0.51402044 0.0033183426
+1.3521 -0.25924 -0.049258001 -0.62379748 -0.41569343 -0.6618728 0.0027746535
+1.325 -0.24335 -0.036805999 -0.56002253 -0.39077622 -0.73052627 0
+1.3106 -0.23982 -0.028140999 -0.56982327 -0.37612125 -0.73063964 0.002797392
+1.3289 -0.25916001 -0.032001998 -0.47608241 -0.40151367 -0.78238887 0.0010076687
+1.3145 -0.25863001 -0.022946 -0.57022321 -0.31268016 -0.75965559 0.001873052
+1.3306 -0.23822001 -0.044585999 -0.51777846 -0.43530253 -0.73648971 0.00068893598
+1.3369 -0.25257999 -0.041214 -0.53362501 -0.41591707 -0.73638135 0.0019564913
+1.3502001 -0.2816 -0.032542001 -0.63168317 -0.4074744 -0.65950048 0.00015907803
+1.3645 -0.30384001 -0.036189001 -0.71813536 -0.39537638 -0.5726772 0.0026919786
+1.3552999 -0.29826999 -0.027698001 -0.69860607 -0.36082271 -0.61786455 0.00092065067
+1.3674999 -0.28123 -0.05198 -0.84762633 -0.31019852 -0.43047243 0.0039447681
+1.3584 -0.27654999 -0.043466002 -0.66263366 -0.40903288 -0.62738246 0.00040683773
+1.3713 -0.29861999 -0.049787 -0.72680837 -0.34203058 -0.59562117 0.0030953141
+1.3307 -0.27601999 -0.023691 -0.35929725 -0.49967751 -0.78818011 0.00097204209
+1.3187 -0.27151999 -0.020090999 -0.51125306 -0.44942111 -0.73255789 0.0017038659
+1.365 -0.2431 -0.073913001 -0.88751113 -0.30977806 -0.34111807 0.016405469
+1.3572 -0.23803 -0.066408001 -0.81060171 -0.35849318 -0.46304151 0.01471393
+1.3669 -0.26012 -0.070752002 -0.94608897 -0.2758601 -0.16975535 0.033454761
+1.3594 -0.25389999 -0.060653001 -0.75201201 -0.33419561 -0.56814724 0.0051991297
+1.3631001 -0.241 -0.084090002 -0.46338791 -0.88550299 0.034000829 0.0023559125
+1.3576 -0.23981 -0.092402004 -0.89361775 -0.12481131 0.43112567 0.0012214597
+1.3644 -0.26113001 -0.085764997 -0.91911316 -0.25957179 0.29640076 0.0039708163
+1.3586 -0.25944999 -0.095265001 -0.85111457 -0.11362408 0.51253641 0
+1.3735 -0.27860001 -0.070717998 -0.91559958 -0.40196484 0.010080089 0.067533746
+1.3766 -0.29857999 -0.072614998 -0.94740176 0.0081766089 0.31994247 0.053648241
+1.3674999 -0.28072 -0.088264003 -0.88115281 -0.19075653 0.43264502 0.0040495172
+1.3599 -0.27972001 -0.098058 -0.82821727 0.0082024792 0.56034714 0.00053857802
+1.3712 -0.30019999 -0.088618003 -0.81652784 -0.093676127 0.56965518 0.042078804
+1.3599 -0.29951999 -0.098679997 -0.76377922 -0.096442215 0.63823217 0.0040827878
+1.2970001 -0.23246001 -0.022008 -0.54442269 -0.45699707 -0.70339012 0.0010008598
+1.3693 -0.31995001 -0.030027 -0.61231518 -0.44285795 -0.65494037 0.0044067819
+1.3589 -0.31693 -0.022586999 -0.62021667 -0.3398723 -0.70697826 0.003568043
+1.3722 -0.33634999 -0.023381 -0.52334905 -0.36986372 -0.76766312 0.00011187963
+1.3748 -0.31323999 -0.042700998 -0.68421817 -0.49300227 -0.53739595 0.0041337218
+1.3772 -0.31334999 -0.076526001 -0.88484573 -0.13386057 0.44623902 0.044206027
+1.3708 -0.31922001 -0.090406999 -0.70662415 -0.10609255 0.69959038 0.028391685
+1.3593 -0.32043999 -0.099166997 -0.71229607 0.11744438 0.69198346 0.0038361261
+1.369 -0.33998001 -0.090690002 -0.56349701 -0.12451248 0.81668097 0.00083401997
+1.3585 -0.33877 -0.098977998 -0.80841619 -0.039590918 0.58727831 0.011130836
+1.3772 -0.38282001 -0.078244001 -0.64870566 0.08466465 0.75631529 0.0011636786
+1.3699 -0.36048999 -0.090008996 -0.68834311 0.13327184 0.71303737 0.011756289
+1.36 -0.35447001 -0.099881001 -0.82323879 -0.09138488 0.56029159 0.0080721071
+1.3681999 -0.37898001 -0.08811 -0.75498152 0.16251436 0.63528883 0.0031941847
+1.3593 -0.38266999 -0.097445004 -0.84096849 0.16198887 0.51626688 0.0040044039
+1.3498 -0.24034999 -0.11049 -0.93009585 -0.0079313163 0.36723128 0
+1.3494999 -0.26010001 -0.11032 -0.83685291 0.040023584 0.54596281 0
+1.3442 -0.23999999 -0.1265 -0.84806585 0.05633286 0.52688801 0.012658543
+1.3411 -0.26107001 -0.12187 -0.6406548 -0.56746918 0.51724273 0
+1.3342 -0.24229001 -0.13473 -0.65381795 0.23005359 0.72083104 0.00028366511
+1.3319 -0.25946999 -0.13143 -0.79200095 0.0033055102 0.610511 0.0095701385
+1.3523 -0.28007001 -0.11065 -0.85025573 -0.028409848 0.52560252 0
+1.3529 -0.30004001 -0.11058 -0.8772375 0.024027785 0.4794549 0.002016546
+1.3431 -0.28106001 -0.12532 -0.79289919 -0.15160842 0.5901913 0.0011616538
+1.3444 -0.2999 -0.12679 -0.80447096 -0.034062784 0.59301448 0.00428718
+1.3343 -0.2789 -0.13428999 -0.74964511 -0.20358711 0.62974954 0
+1.3338 -0.30019999 -0.13586999 -0.59007281 -0.52764177 0.61107147 0
+1.3247 -0.23847 -0.14469001 -0.71857089 0.12573917 0.68399239 3.4642781e-05
+1.3159 -0.24166 -0.15406001 -0.86302739 0.11649901 0.49154013 0.0053357882
+1.3235 -0.26144999 -0.14445999 -0.81036764 -0.13699786 0.56968051 0.00071725959
+1.3161 -0.25874999 -0.15373001 -0.88431907 -0.089808472 0.45816404 0.0043388791
+1.3099 -0.24003001 -0.16985001 -0.91636491 0.028140211 0.39935386 0.0012590461
+1.3099 -0.26001 -0.16993999 -0.91131759 0.03208195 0.41045216 0.00028250203
+1.3243999 -0.28009 -0.14719 -0.81233251 -0.03987962 0.58182943 0.0031554408
+1.3177 -0.28011999 -0.15737 -0.84474319 -0.14737086 0.51448125 0
+1.3253 -0.29925001 -0.14470001 -0.74066895 0.037204184 0.67083925 0.00050609116
+1.317 -0.30094999 -0.15437999 -0.76844615 0.1567378 0.6204223 0
+1.3105 -0.28007001 -0.16996001 -0.63572031 0.53367573 0.55771852 0.0055630077
+1.3076 -0.29960001 -0.16653 -0.67147017 0.20066653 0.71334493 0.0037399665
+1.2967 -0.28292999 -0.1797 -0.68181789 0.33503789 0.65028763 0.002977408
+1.294 -0.30078 -0.17613 -0.64277965 0.20258926 0.73877728 0.0023662783
+1.3514 -0.3197 -0.11033 -0.87376779 0.023309451 0.48578435 0.0017452048
+1.3545001 -0.33998001 -0.1108 -0.88678789 -0.077080883 0.45570362 0.0018943943
+1.3444999 -0.31919 -0.12564 -0.79862756 0.16036046 0.58006769 0.0098920884
+1.345 -0.33969 -0.12566 -0.22786064 0.95962679 0.16491227 0
+1.3333 -0.32093999 -0.13462 -0.53197867 0.65046239 0.54212302 2.9169903e-05
+1.3328 -0.34097999 -0.13495 -0.66478348 0.087763362 0.74186289 0.00020460083
+1.3628 -0.36559999 -0.10072 -0.84254992 0.094124258 0.5303303 0.0078868577
+1.3563 -0.36021999 -0.11131 -0.80433065 -0.25933829 0.53459889 0.0037968531
+1.354 -0.38021001 -0.11074 -0.81715703 0.19348702 0.54297066 0.0023381866
+1.3447 -0.35984001 -0.12508 -0.68986857 -0.0041198819 0.72392303 0.0038424381
+1.3446 -0.37838 -0.12352 -0.61235178 0.18324916 0.76905459 0.0089446297
+1.3319 -0.36070001 -0.13449 -0.71981829 0.011801891 0.69406211 0.01218243
+1.3288 -0.38019001 -0.13094001 -0.45595542 0.49001104 0.74296284 0.0074895681
+1.3171 -0.38435 -0.13680001 -0.71930212 0.37870201 0.58239943 0.012396963
+1.3253 -0.31964001 -0.14395 -0.56125295 0.57738101 0.59298092 0
+1.3132 -0.32025999 -0.15433 -0.66012496 0.086950317 0.74610633 0.0011529856
+1.3239 -0.34 -0.14454 -0.46890563 0.68955469 0.55194372 0
+1.3119 -0.33967999 -0.15434 -0.49516672 -0.0054346407 0.86878097 0.022064257
+1.3022 -0.31829 -0.16467001 -0.63125509 0.37359551 0.67966425 0.011885833
+1.3015 -0.34261 -0.16201 -0.47704044 -0.3796455 0.79265493 0.0017584179
+1.3256 -0.36114001 -0.1471 -0.75872517 0.15539476 0.63260448 0.011944506
+1.3135999 -0.35966 -0.15682 -0.63295954 -0.24614249 0.73401374 0
+1.3226 -0.37299001 -0.14422999 -0.7583431 0.396889 0.5171023 0.011087365
+1.3127 -0.38060999 -0.1505 -0.69584489 0.5950768 0.40209886 0
+1.3029 -0.36364999 -0.16745999 -0.78833222 -0.21939899 0.57480115 0.071584515
+1.3038 -0.37928 -0.16734 -0.74640948 0.17053586 0.64326549 0.015137232
+1.2951 -0.33186999 -0.15913001 -0.54318506 0.18866909 0.81814051 0.037893008
+1.2926 -0.32194 -0.17279001 -0.75135404 0.40413401 0.5216732 0.005674663
+1.2873 -0.33947 -0.16972999 -0.76087147 -0.073296562 0.6447497 0.05418558
+1.279 -0.34046 -0.17747 0.085042216 0.99581534 -0.033462036 0.013263871
+1.2925 -0.35655999 -0.17308 -0.60715485 -0.39984396 0.6866498 0.046647504
+1.2915 -0.38073 -0.17439 -0.34451762 0.66668636 0.66093636 0.003148054
+1.2766 -0.38409999 -0.17799 -0.59515738 0.23491201 0.7685076 0.035338663
+1.3015 -0.081468999 -0.18376 -0.82969278 -0.29173988 0.47591776 0.034324612
+1.3012 -0.14828999 -0.18091001 -0.7539646 -0.039914999 0.65570134 0.029549841
+1.2905 -0.079764999 -0.19201 -0.76128262 -0.047924522 0.6466468 0.039794967
+1.2798001 -0.071245 -0.19757999 -0.75199777 -0.20943627 0.62500858 0.015245396
+1.2874 -0.099074997 -0.18896 -0.87232268 0.30108809 0.38522598 0.028723419
+1.2795 -0.10803 -0.19338 -0.85535014 0.35740244 0.37501961 0.026664745
+1.2845 -0.084770001 -0.20284 -0.70226371 -0.33639139 0.62742841 0.0041378704
+1.2732 -0.079475999 -0.21108 -0.82175618 -0.19821872 0.53425282 0.012115805
+1.286 -0.096524999 -0.20421 -0.88106257 0.34568408 0.32284874 0.029863572
+1.2767 -0.10143 -0.21214999 -0.69457513 0.17711769 0.69727665 0
+1.2853 -0.12017 -0.18276 -0.70130759 -0.026081627 0.71238142 0.010071802
+1.2782 -0.1201 -0.19267 -0.93016315 0.0037699919 0.36712697 0.0064613014
+1.2873 -0.14182 -0.18739 -0.68707192 -0.28267801 0.66934699 0.011903672
+1.2790999 -0.13585 -0.19425 -0.84361517 -0.25860554 0.47057065 0.0044354331
+1.2740999 -0.12021 -0.21003 -0.90811592 0.24441482 0.33998084 0.0029297441
+1.2823 -0.14851999 -0.20081 -0.82855844 -0.29295024 0.47714886 0.0015315622
+1.274 -0.14031 -0.20984 -0.82503825 -0.40988213 0.38898399 1.7368397e-05
+1.2652 -0.079883002 -0.22688 -0.83536774 0.11464369 0.53760356 0.0031000411
+1.2647001 -0.099910997 -0.22455999 -0.57084167 0.53882748 0.61951971 0
+1.2566 -0.081635997 -0.23597001 -0.79169315 0.21564594 0.57159317 0.00075894757
+1.2539999 -0.10012 -0.23417 -0.78152889 0.079023093 0.61884397 0.0020177797
+1.249 -0.079700001 -0.24923 -0.8716473 -0.25885192 0.41620511 0.00030420869
+1.2448 -0.10018 -0.24935 -0.86378706 0.29322079 0.40974796 0.0049269833
+1.2385 -0.10854 -0.25859001 -0.78206527 0.32822013 0.52975982 0.0075426549
+1.266 -0.11988 -0.22528 -0.028777117 0.9989022 0.036963016 0
+1.2658 -0.14025 -0.22709 -0.222506 -0.96958059 0.10200188 0
+1.2536 -0.11988 -0.2349 -0.66311407 -0.091709398 0.74287891 0.0021896921
+1.2566 -0.13913999 -0.23668 -0.62182099 -0.15682678 0.76729655 0.0033102657
+1.2427 -0.11768 -0.24597 -0.7562691 0.21320294 0.61854798 0.007364362
+1.2358 -0.12244 -0.25334999 -0.78451437 0.18611011 0.59152359 0.0060828361
+1.2458 -0.14027999 -0.24314 -0.59258437 -0.076118819 0.80190378 0.0015349729
+1.2344 -0.14018001 -0.25308999 -0.79459625 -0.03667523 0.60602951 0.0062924149
+1.3003 -0.15239 -0.18019 -0.75396293 -0.039940681 0.65570164 0.029547857
+1.301 -0.18718 -0.18073 -0.77201396 -0.30354938 0.55843723 0.0050038686
+1.3023 -0.20196 -0.18633001 -0.84963471 -0.060731299 0.52386314 0.0067004659
+1.3020999 -0.21799 -0.18257 -0.6793952 0.26704305 0.68345457 0.0037502309
+1.2912 -0.15995 -0.19007 -0.81097126 0.0054558804 0.5850606 0.026807697
+1.2884001 -0.17946 -0.19042 -0.80140311 -0.046904869 0.59628266 0.018006207
+1.2843 -0.1611 -0.20422 -0.8609286 0.0093442323 0.50864005 0.0096732741
+1.2772 -0.16016001 -0.21336 -0.84254313 -0.23414195 0.4850758 0.0010275031
+1.2823 -0.17847 -0.20132001 -0.83025163 0.1994307 0.52048975 0.0011997145
+1.2755001 -0.18028 -0.21072 -0.86246574 -0.009418387 0.50602776 0.0018446571
+1.2941999 -0.19833 -0.19453999 -0.69049615 -0.31179321 0.65268672 0.0011625029
+1.2894 -0.21986 -0.19159 -0.624744 0.35450503 0.69571632 0.0017767429
+1.2798001 -0.22686 -0.19805001 -0.69055694 0.10853878 0.71508777 0.0059184516
+1.2867 -0.20133001 -0.20223001 -0.68338764 0.18075411 0.7073254 0.00059847336
+1.276 -0.20013 -0.21177 -0.75380081 -0.008468667 0.65704846 0.0053720311
+1.2829 -0.21371 -0.2018 -0.68015933 0.26283777 0.68432415 0.00028215183
+1.2716 -0.22031 -0.20999999 -0.6890921 0.38959876 0.611036 0.00087198796
+1.2588 -0.22953001 -0.21893001 -0.5631355 0.30452633 0.76820707 0.0082189506
+1.2694 -0.16071001 -0.22966 -0.85125333 0.012457168 0.52460694 0.01548707
+1.2672 -0.17887001 -0.22679999 -0.71513206 0.42224741 0.55703986 0.014767867
+1.2625 -0.16721 -0.24144 -0.53939742 0.24034335 0.80702269 0.029010989
+1.2588 -0.15696 -0.23847 -0.57122278 -0.20153588 0.79566813 0.017355535
+1.2522 -0.18277 -0.23540001 -0.49174032 0.34582186 0.7991237 0.019745849
+1.2492 -0.15939 -0.24354 -0.17303087 0.0040536136 0.9849081 0.0089214705
+1.2313 -0.16056 -0.25279 -0.50547153 0.2251105 0.83296084 0.044427309
+1.2462 -0.17712 -0.24197 -0.44037348 0.27000368 0.85625303 0.027129959
+1.2321 -0.18036 -0.25092 -0.49490061 0.086808264 0.86460263 0.0011701467
+1.2661 -0.20052999 -0.22386 -0.67400742 0.047896471 0.73717016 0.0047120806
+1.2651 -0.21588001 -0.22172 -0.64714319 0.29823261 0.70161462 0.005313457
+1.2517999 -0.19994 -0.23404001 -0.5384286 0.046294339 0.84139848 0.023991188
+1.2385 -0.19664 -0.23856001 -0.51644295 -0.0044532837 0.85631001 0.026403189
+1.2513 -0.21986 -0.22913 -0.49237061 0.39937893 0.77334833 0.00033479783
+1.2364 -0.22416 -0.23574001 -0.72431415 0.55256611 0.41235873 0.065329649
+1.2438 -0.20114 -0.24241 -0.32602873 -0.78655452 0.52443999 0.0012678765
+1.2289 -0.20057 -0.2494 -0.35979328 -0.760212 0.5409497 0.0013599681
+1.2408 -0.22355001 -0.25130001 -0.98290962 -0.044423528 -0.17864849 0.035290163
+1.2345001 -0.22025 -0.2492 -0.58050835 -0.80894643 -0.092820838 0.0059228973
+1.2436 -0.079552002 -0.26196 -0.85726768 -0.022190338 0.51439255 0.0024207523
+1.2352 -0.080678001 -0.27219 -0.74960309 0.17997919 0.63694793 0.00022769342
+1.2428 -0.097213 -0.26179001 -0.82842743 0.22549869 0.5126971 0.013904417
+1.232 -0.10015 -0.27037001 -0.58808434 0.3364242 0.73551041 0.010260194
+1.2256 -0.079471998 -0.28365001 -0.54084551 0.057147924 0.83917826 0.012373271
+1.2237 -0.092166997 -0.28169999 -0.48711374 0.29149064 0.8232578 0.012975612
+1.2265 -0.12111 -0.26637 -0.80517626 0.0074642166 0.59298861 0.047603521
+1.226 -0.13951001 -0.26873001 -0.84761727 0.22217618 0.48185331 0.041085664
+1.2227 -0.12779 -0.28246 -0.75291765 -0.19021662 0.6300258 0.066383332
+1.2232 -0.13514 -0.28233001 -0.56670994 0.59858245 0.56616151 0.020487839
+1.2251 -0.15665001 -0.26379001 -0.59820384 0.41736227 0.68407661 0.011388156
+1.2244 -0.18144999 -0.27134001 -0.94915003 -0.024527689 -0.31386736 0.039384726
+1.2232 -0.18603 -0.28356001 -0.83011287 -0.10874801 0.54688793 0.15284894
+1.2248 -0.20055 -0.27225 -0.8033483 0.57586116 0.15170863 0.096171983
+1.2408 -0.22453 -0.26223001 -0.92163539 0.017582301 0.38765851 0.10029855
+1.2301 -0.21988 -0.26890999 -0.45911184 0.060968522 0.88628387 0.0006648596
+1.2244999 -0.19244 -0.28112 -0.67459011 0.36493349 0.64167881 0.097803749
+1.2199 -0.16410001 -0.25781 -0.70930284 0.18747321 0.67951703 0.046603147
+1.2176 -0.1759 -0.25845999 -0.70676076 -0.52778804 0.47109351 0.074566267
+1.2185 -0.19744 -0.25402001 -0.26991323 -0.96044767 0.068463765 0.00073560089
+1.2147 -0.10439 -0.27785999 -0.55941254 0.20144738 0.80403769 0.036867954
+1.2097 -0.08038 -0.2888 -0.34369105 0.25451761 0.90393424 0.0009943645
+1.196 -0.079494998 -0.29565999 -0.57509059 -0.038627334 0.81717724 0.0056540417
+1.2063 -0.099632002 -0.28503999 -0.51115805 0.26313528 0.81821591 0.019662626
+1.1962 -0.10109 -0.29488 -0.73801875 0.15067211 0.65774328 0.00039422925
+1.2169 -0.11725 -0.27355999 -0.75898767 -0.35099155 0.54840016 0.039268721
+1.2122 -0.14646 -0.27609 -0.53293586 0.55505329 0.63866675 0.018662017
+1.2097 -0.11967 -0.28599 -0.53601491 -0.18772908 0.82307094 0.03053721
+1.1932 -0.11964 -0.29481 -0.75646913 -0.1597558 0.63421804 0.043390092
+1.2102 -0.13896 -0.28522 -0.42575049 0.25111338 0.86929774 0.03917712
+1.1959 -0.14068 -0.29284999 -0.82454365 0.32288504 0.46462137 0.052732848
+1.1865 -0.080123 -0.30526 -0.58234388 0.37272081 0.72246438 0.0021020502
+1.187 -0.10124 -0.30631 -0.57301027 -0.2718927 0.77313232 0.041707695
+1.182 -0.076516002 -0.33486 -0.75871599 0.45896405 -0.46227923 0.02923356
+1.1835999 -0.10612 -0.32727 -0.23956835 0.25523701 -0.93672889 0.10568775
+1.1726 -0.080514997 -0.31417999 -0.90261233 0.11027512 0.41608939 0.052045815
+1.1742001 -0.096652001 -0.31298 -0.92995954 -0.36528274 0.041758619 0.081296176
+1.1726 -0.079709001 -0.32583001 -0.92792165 0.12231222 -0.35213795 0.023930978
+1.1754 -0.096291997 -0.32545 -0.9352771 -0.29061231 -0.20199271 0.018405572
+1.1902 -0.12022 -0.31026 -0.87780058 -0.41806823 0.23384853 0.079040155
+1.1948 -0.14056 -0.31093001 -0.2167698 -0.97620231 0.0063182372 1.1159018e-05
+1.1865 -0.11983 -0.32444 -0.72898394 0.0049088965 0.68451321 0.068744302
+1.1865 -0.13879 -0.32348001 -0.59236395 0.21189669 0.77730614 0.013570091
+1.178 -0.11031 -0.30691001 -0.24060522 -0.065669768 0.96839899 0.045151614
+1.1723 -0.12136 -0.32771 -0.088882402 0.037531752 0.99533474 0.0053453092
+1.1591001 -0.12621 -0.32609001 -0.24001782 0.34950429 -0.90566999 3.2243115e-05
+1.1737 -0.14042 -0.32637 -0.16829564 0.10707011 0.97990435 0.0007984055
+1.1591001 -0.13316999 -0.32877001 -0.030958869 0.014719807 0.9994123 0.010826381
+1.2106 -0.16028 -0.27127001 -0.75455648 0.017185101 0.65601003 0.065151691
+1.1995 -0.15719999 -0.27677 -0.84090871 0.02504063 0.54059738 0.10914163
+1.2164 -0.17883 -0.2678 -0.89948338 -0.42009085 0.12022265 0.045739233
+1.2051001 -0.16658001 -0.28766999 -0.64052933 -0.46302387 0.61264271 0.046267089
+1.1977 -0.15775999 -0.29152 -0.90736228 -0.19263232 0.37361279 0.033093564
+1.2128 -0.17969 -0.28909001 -0.49777123 -0.18298641 0.84778523 0.0068501467
+1.1959 -0.18058001 -0.29694 -0.60858727 -0.1003767 0.78711247 0.024944751
+1.2172 -0.19889 -0.26918 -0.79445249 0.59101713 0.13979961 0.11401709
+1.2122999 -0.21978 -0.27746001 -0.35110745 0.043167632 0.93533963 0.042273801
+1.1957999 -0.21951 -0.27895001 -0.30462587 0.28313538 0.90941596 0.0612657
+1.2086999 -0.19862001 -0.28356999 -0.52030796 0.37843987 0.76554739 0.051201094
+1.192 -0.19958 -0.29197001 -0.60467809 0.3125622 0.73257715 0.016440587
+1.205 -0.21804 -0.28323001 -0.12550737 0.11908579 0.98491955 0.037871517
+1.1964 -0.21694 -0.28632 -0.31860337 0.2962724 0.90039688 0.026861146
+1.1889 -0.15992001 -0.30921999 -0.83385813 -0.3506085 0.42632675 0.066475771
+1.1899 -0.17907 -0.30772999 -0.97993386 0.033177085 0.19654243 0.026309006
+1.1869 -0.15988 -0.32374001 -0.69282764 -0.67155254 0.26269224 0.072205462
+1.1906 -0.17302001 -0.32126999 -0.99213696 -0.12232299 0.026484692 0.0067465804
+1.1766 -0.15703 -0.31501999 -0.31563637 -0.94854021 -0.025400013 0.006242814
+1.1763999 -0.15499 -0.32319999 -0.33882567 0.37277275 0.86385053 0.11332119
+1.1888 -0.19309001 -0.30379999 -0.85858184 0.25771156 0.44319519 0.00089871651
+1.3031 -0.24014001 -0.18337999 -0.72409695 -0.11907112 0.67934215 0.015252088
+1.303 -0.25944999 -0.18257 -0.64232606 0.092427343 0.76083797 0.025719168
+1.3012 -0.27491 -0.18171 -0.70092189 0.2116978 0.68109661 0.0070236372
+1.2891001 -0.23998 -0.19220001 -0.51791596 0.031721503 0.85484314 0.00017183779
+1.2793 -0.24569 -0.19760001 -0.72057331 0.11353093 0.68402106 0.015478676
+1.2889 -0.26021999 -0.18751 -0.16382095 0.93260193 0.32158431 0
+1.276 -0.25986001 -0.19515 -0.72764963 0.11589202 0.67608804 0.01375052
+1.2704 -0.24022999 -0.20852999 -0.67937082 -0.0048225126 0.73377931 0.0031837979
+1.2701 -0.25896001 -0.20803 -0.81455147 0.10068412 0.57128674 0.044260286
+1.2558 -0.23741999 -0.21821 -0.48558849 0.27864128 0.82859087 0
+1.256 -0.26365 -0.21399 -0.6897912 0.28875673 0.66393346 0.10068619
+1.2915 -0.28141001 -0.18956999 -0.67788297 0.12551925 0.72437537 0.065936871
+1.2754 -0.27443999 -0.19713999 -0.6962291 -0.22514126 0.68159848 0.031851571
+1.2855999 -0.29730001 -0.18649 -0.75252986 0.40584376 0.51864207 0.012205461
+1.2759 -0.30162001 -0.19423001 -0.8424226 0.31871766 0.43444595 0.018903445
+1.2842 -0.28667 -0.20200001 -0.62486392 0.21082853 0.75172895 0.067845255
+1.2706 -0.28198001 -0.20676 -0.5308587 -0.29191777 0.795596 0.016073039
+1.2719001 -0.30055001 -0.20992 -0.95249283 0.027026197 0.30335957 0.0044727693
+1.2564 -0.27811 -0.21529 -0.81493658 -0.19520251 0.54568708 0.13547389
+1.2646 -0.26585999 -0.22301 -0.72872335 -0.16494298 0.66464728 0.13182524
+1.245 -0.24089999 -0.22316 -0.56773633 0.39123696 0.72429901 0.0015121568
+1.2361 -0.23882 -0.23243 -0.93085527 -0.30423 0.20236748 0.035691116
+1.2483 -0.25986999 -0.23015 -0.81272531 -0.12918207 0.56814575 0.07564579
+1.2408 -0.24241 -0.249 -0.97827411 -0.10270905 -0.18008518 0.033173181
+1.2357 -0.24061 -0.25060001 -0.97345519 -0.030599341 0.22682305 0.053923145
+1.2424999 -0.25760999 -0.24273001 -0.72256309 0.24106538 0.64791203 0.0080805188
+1.2304 -0.26054999 -0.25108999 -0.76102382 0.21761389 0.61113578 0.045569558
+1.2628 -0.27968001 -0.22542 -0.75100029 0.63461417 0.18238235 0.1210897
+1.2659 -0.29980999 -0.22536001 -0.79478425 -0.011209981 0.60678858 0.021454941
+1.2506 -0.27948001 -0.2314 -0.69812447 -0.19271344 0.68955332 0.06250529
+1.2361 -0.27507001 -0.23982 -0.60395736 0.13458002 0.78557217 0.013800181
+1.2529 -0.30112001 -0.23467 -0.51666754 0.35613719 0.77860188 0.02760911
+1.2366 -0.3091 -0.23751999 -0.46604976 0.43060383 0.77290225 0.053169038
+1.2431999 -0.28224999 -0.24033999 -0.58505011 -0.2714414 0.76422238 0.0056154109
+1.2291 -0.27866 -0.24903999 -0.75703365 -0.14572893 0.63691694 0.026787672
+1.2444 -0.29989001 -0.24442001 -0.49720919 0.19488034 0.84546113 0.054821964
+1.2364 -0.29653001 -0.24729 -0.36985147 0.16334544 0.91461915 0.039878987
+1.3003 -0.36743 -0.18319 -0.79565209 0.14893961 0.5871582 0.12338895
+1.2857 -0.32010001 -0.18381999 -0.27936584 0.90799779 0.31224123 0.00020035545
+1.2759 -0.31998 -0.19346 -0.84561366 -0.0027852457 0.53378814 0.0056669149
+1.2832 -0.34167001 -0.18494999 -0.85677975 -0.41095564 0.31151882 0.025717394
+1.2783 -0.33899999 -0.19074 -0.94184542 -0.047078904 0.33273253 0.02512219
+1.2686 -0.31953999 -0.20977999 -0.84624588 0.28977749 0.44709834 0.010294081
+1.2708 -0.33983001 -0.20705999 nan nan nan nan
+1.2585 -0.32563999 -0.21762 -0.69286108 0.44890141 0.56429678 0.0033713002
+1.2512 -0.34121999 -0.21545 -0.61469895 0.11773989 0.77992463 0.017248495
+1.2888 -0.36063999 -0.18743999 -0.62462395 -0.19833304 0.75532037 0.068070732
+1.2744 -0.36131999 -0.1956 -0.63987154 0.34326851 0.68755448 0.024127809
+1.2859 -0.37200001 -0.18325 -0.53844351 0.3843092 0.74992341 0.07324218
+1.2695 -0.37937 -0.18994001 -0.72321755 0.28275913 0.63008231 0.031550817
+1.2665 -0.36004001 -0.20484 -0.72693479 -0.010777562 0.68662196 0.00014984951
+1.2667 -0.37531 -0.20426001 -0.79406214 0.32757834 0.51201338 0.023407264
+1.2579 -0.35795 -0.21298 -0.72973526 -0.21263678 0.64982468 0.00033797949
+1.26 -0.38167 -0.20081 -0.55587995 0.76501071 0.32520157 2.1593627e-05
+1.2644 -0.31373999 -0.22299001 -0.69767427 0.39781275 0.59581512 0.0075774738
+1.252 -0.32012001 -0.22888 -0.52603722 0.34262976 0.77838916 0.014429177
+1.2377 -0.31143999 -0.2367 -0.42437556 0.3922542 0.81611389 0.033817586
+1.2484 -0.33518001 -0.22393 -0.80468726 0.24742426 0.53968471 0.015854122
+1.2408 -0.31395 -0.24074 -0.42491439 0.39159444 0.81615043 0.034070879
+1.2373 -0.31134 -0.24090999 -0.46531761 0.43095055 0.77315021 0.053653784
+1.2503999 -0.35102001 -0.22006001 -0.87152702 -0.14624456 0.46803111 0.013626027
+1.23 -0.23874 -0.26728001 -0.91097242 0.19362669 0.36419475 0.084644228
+1.2237999 -0.25602999 -0.26725999 -0.9518854 0.23867652 0.19221768 0.096624829
+1.2268 -0.24600001 -0.28264999 -0.73600745 -0.64172882 0.2155858 0.17485012
+1.2291 -0.25137001 -0.28105 -0.98329586 -0.12637196 -0.13099355 0.19690351
+1.225 -0.27500999 -0.26197001 -0.82657611 0.051159184 0.56049508 0.064943321
+1.2187999 -0.26361001 -0.25672999 -0.82551706 0.052823927 0.5618996 0.065232515
+1.217 -0.24064 -0.27419999 -0.57297242 -0.81332898 0.10098808 0.11552557
+1.1997 -0.23205 -0.27765 -0.2029874 0.14447463 0.96846437 0.047221541
+1.2161 -0.25953001 -0.26671001 -0.98889446 -0.13647781 -0.058834787 0.13761625
+1.2105 -0.23613 -0.28150001 -0.0020387119 0.035018824 0.99938458 0.050309505
+1.1975 -0.23218 -0.28156 -0.13762982 0.1021423 0.98520297 0.070708044
+1.2181 -0.27173999 -0.26637 -0.98914677 -0.13542996 -0.056985978 0.1376823
+1.4072 -0.39971 -0.030793 -0.96110106 -0.27609146 0.0076311771 0.03108744
+1.3979 -0.39050999 -0.021298001 -0.7419802 -0.44916376 -0.49771217 0.012048908
+1.4125 -0.42003 -0.030316999 nan nan nan nan
+1.4018 -0.40015 -0.04575 -0.9361372 -0.058608271 0.34671634 0.0003428011
+1.3978 -0.39997 -0.055266999 -0.91630995 -0.014047018 0.40022334 0
+1.4028 -0.41991001 -0.048441999 -0.98735058 -0.038152102 0.15389366 0.0088505372
+1.3979 -0.41942 -0.055426002 -0.93100756 -0.15082316 0.33238152 0.0147178
+1.4119 -0.44023001 -0.030432001 -0.87219626 0.057090495 0.48581314 1.1422345e-05
+1.4107 -0.45976001 -0.030317999 -0.90231532 0.058105692 0.42714262 0
+1.4026999 -0.43928999 -0.047076002 -0.90974587 0.06068356 0.41070667 0.010362285
+1.3979 -0.44062001 -0.055977002 -0.88456529 0.11700017 0.4515034 0.012784619
+1.4023 -0.46079001 -0.04792 -0.92990023 0.03181909 0.36643314 0.010784675
+1.3979 -0.45952001 -0.056078002 -0.91943908 -0.076867215 0.38564634 0.018362848
+1.3917 -0.40033001 -0.068917997 -0.70069885 -0.36980215 0.61013722 0.012171341
+1.4009 -0.42118001 -0.062291998 -0.89625907 -0.30305824 0.32384479 0.02855107
+1.3940001 -0.42048001 -0.070468999 -0.78299737 -0.014014925 0.62186706 0.029226858
+1.3802 -0.40658 -0.080321997 -0.61486071 -0.18671606 0.7662136 0.0015095321
+1.381 -0.42052999 -0.081671 -0.62848574 -0.057111572 0.77572161 0.00066301838
+1.4009 -0.43018001 -0.060174 -0.91604382 0.097604237 0.38902086 0.022429155
+1.3914 -0.43948999 -0.069141999 -0.80283356 0.22302189 0.55291915 0.0037002012
+1.4009 -0.45995 -0.060174 -0.030139068 0.99945122 0.013744957 0.0034191553
+1.3927 -0.46059999 -0.070037 -0.79474884 0.17547233 0.58101952 0.014806308
+1.3814 -0.44049999 -0.081945002 -0.66230702 -0.024050234 0.74884641 0.0097661074
+1.3824 -0.45581001 -0.081690997 -0.54296464 0.23070469 0.80744338 0.010854353
+1.4114 -0.48001999 -0.030099999 -0.88264954 -0.10740843 0.45759499 0.00048954436
+1.4139 -0.49959999 -0.030213 -0.90712148 -0.090341493 0.41105834 0.0014160153
+1.4028 -0.48004001 -0.047281999 -0.87654436 0.022736244 0.48078376 0.00095814472
+1.3964 -0.48263001 -0.057107002 -0.8142398 0.073040068 0.57591558 0
+1.4052 -0.50048 -0.047393002 -0.8087675 -0.065572552 0.58446157 0.0089613926
+1.3943 -0.50044 -0.056913 -0.60645306 0.1142429 0.78686929 0.00098951708
+1.425 -0.52156001 -0.026489001 -0.71784842 0.098051749 0.68926001 0.0071955216
+1.4248 -0.53403002 -0.022144999 -0.56431466 0.3812336 0.73226351 0.0015253311
+1.414 -0.52054 -0.034159999 -0.46658716 0.57649195 0.67078573 0.00068372063
+1.3979 -0.52903003 -0.038734 -0.60438997 0.19933853 0.77134746 0.026592406
+1.4084001 -0.54048997 -0.030071 -0.62181515 0.076503783 0.77941841 0.017269161
+1.3979 -0.53289998 -0.038734 -0.67151779 0.20784304 0.71124196 0.041099586
+1.406 -0.51608998 -0.04434 -0.50402778 0.36306748 0.78366959 0.0072409003
+1.3887 -0.52007002 -0.051188 -0.60629946 0.42920974 0.66946238 0.08485806
+1.4009 -0.54667002 -0.040759001 -0.78576827 -0.144742 0.60134685 0.0098531311
+1.3882999 -0.5388 -0.050452001 -0.76215762 -0.14717384 0.63044077 0.0045121796
+1.3898 -0.47861999 -0.065798998 -0.70118332 0.26926628 0.66017997 0.00038106172
+1.3841 -0.5 -0.063669004 -0.53986198 -0.19294146 0.81934273 8.0029386e-05
+1.3834 -0.51906002 -0.068539001 -0.97933018 0.17713733 0.097645931 0.07447619
+1.3864 -0.53968 -0.070527002 -0.94553864 -0.27738908 -0.170329 0.04683141
+1.3816 -0.52765 -0.082799003 -0.84382403 -0.28945547 0.45185894 0.10707947
+1.3852 -0.53991997 -0.084375001 -0.61552697 0.14866936 0.77396637 0.084410965
+1.4067 -0.55969 -0.029835001 -0.87871104 0.018836526 0.47698221 0.0034615935
+1.4019001 -0.55829 -0.042218 -0.87188345 -0.024295829 0.48911035 0.0059369095
+1.3942 -0.55738002 -0.051911999 -0.83364588 -0.35563633 0.42256051 0.014422081
+1.3887 -0.55580997 -0.070455998 -0.79366618 0.24453385 0.55704325 0.071366549
+1.3839 -0.55208999 -0.081363 -0.55987203 0.33256102 0.75891137 0.082237989
+1.3772 -0.39618 -0.078244001 -0.62084758 -0.13937229 0.77144259 0.0033832917
+1.3688999 -0.40011999 -0.087287001 -0.65982729 -0.32696506 0.67655128 0.00012519142
+1.3587 -0.39848 -0.097511001 -0.76399314 -0.025262782 0.64472961 0.00067179743
+1.3688 -0.42006001 -0.090879999 -0.61704302 0.082777098 0.78256363 9.5649142e-05
+1.3586 -0.42210999 -0.099188 -0.63462925 0.058493122 0.77059996 1.1403237e-05
+1.3743 -0.46867001 -0.078552999 -0.40604284 0.48253435 0.77607334 0.00030078087
+1.3681999 -0.43943 -0.089594997 -0.56321567 0.07515239 0.82288533 0.001657417
+1.3588001 -0.44016999 -0.097585998 -0.73443699 0.0010283508 0.67867619 0.0023707431
+1.368 -0.45881 -0.087808996 -0.46392754 0.26773453 0.8444463 0.016666425
+1.355 -0.46344 -0.094108 -0.64835644 0.37798181 0.66088092 0.0043821232
+1.3769 -0.52152997 -0.053594001 -0.89732659 0.27658051 0.34395954 0.11125322
+1.3693 -0.48028001 -0.073556997 -0.35420665 0.21273266 0.91064942 0.012292313
+1.3593 -0.48363 -0.078478001 -0.68800133 0.27649426 0.67097336 0.0084715206
+1.37 -0.49956 -0.072732002 -0.67658705 -0.12237243 0.72612321 0.026181528
+1.3594 -0.49241 -0.078360997 -0.79009253 -0.23025325 0.56809962 0.033018537
+1.3635 -0.47161001 -0.081716999 -0.57048678 0.4191522 0.70629758 0.0083178347
+1.3533 -0.47973001 -0.089951999 -0.93142551 0.019369243 0.36341619 0.024463434
+1.3645 -0.50432003 -0.086360998 -0.79554725 -0.39593595 0.45862767 0.0110169
+1.3575 -0.49860999 -0.093134001 -0.85130137 -0.31396222 0.42037323 0.011636087
+1.3751 -0.51773 -0.070710003 -0.9540146 -0.25585696 0.15618336 0.070883036
+1.3765 -0.53587002 -0.066119999 -0.93572795 -0.35248795 0.012861525 0.064661354
+1.3679 -0.51942998 -0.088845998 -0.66167361 -0.40485156 0.63109684 0.050240491
+1.3543 -0.52055001 -0.097221002 -0.60557687 0.29493353 0.73911494 0.0026272973
+1.3701 -0.54102999 -0.088785 -0.30313298 0.21433845 0.92853081 0.020049794
+1.3511 -0.53837001 -0.09403 -0.42845985 0.11382438 0.89636272 0.015320198
+1.3502001 -0.39908999 -0.10936 -0.753766 0.2208159 0.61893231 0.0003487762
+1.3492 -0.42017999 -0.10701 nan nan nan nan
+1.3418 -0.39063001 -0.12086 -0.51886564 0.37368819 0.76885343 0.010024044
+1.3309 -0.40360001 -0.11763 -0.29189467 0.2958059 0.9095583 0.0079025431
+1.3314 -0.41701999 -0.11597 -0.88442254 0.023959218 0.46607161 0
+1.3245 -0.39831999 -0.12408 -0.53534824 0.38201439 0.75330418 0.017328506
+1.3169 -0.40121001 -0.13315 -0.90247208 0.051067214 0.42771047 0.0063685388
+1.3253 -0.42344001 -0.12722 -0.83446389 -0.30130917 0.46139213 0.01701064
+1.3171999 -0.41683 -0.13328999 -0.84105349 -0.2907173 0.4561936 0.019520329
+1.3494 -0.44012001 -0.10979 -0.68033969 0.12573679 0.72203058 0.0053144749
+1.3467 -0.4594 -0.10689 -0.80404353 0.10629863 0.58499104 0.034823116
+1.3404 -0.46825001 -0.12073 -0.68403345 -0.026340403 0.72897488 0.032697685
+1.3369 -0.44141999 -0.11795 -0.66250926 0.26990497 0.69873661 0.0044198483
+1.3348 -0.45838001 -0.11583 -0.73096317 -0.17783783 0.65883732 0.025965577
+1.3288 -0.44 -0.12939 -0.83862984 0.034659367 0.54359794 0.022435751
+1.3173 -0.44925001 -0.13874 -0.71957999 0.18282692 0.66990966 0.011361105
+1.3281 -0.45868 -0.12718 -0.65799725 -0.034778789 0.75221676 0.024184924
+1.317 -0.46044001 -0.13558 -0.75353289 0.070749559 0.65359217 0.0090328315
+1.3116 -0.40066999 -0.15018 -0.91220397 0.053993247 0.40616313 0.0086541427
+1.3214 -0.42864001 -0.14375 -0.77616042 -0.18392508 0.60311401 0.039585289
+1.3112 -0.41949001 -0.14877 -0.8658849 -0.19349501 0.46130595 0.033695791
+1.3049001 -0.39987001 -0.16438 -0.67741978 0.13740996 0.72264856 0.039455019
+1.3029 -0.4109 -0.16068999 -0.5712446 0.37279552 0.73123395 0.030027265
+1.3216 -0.43797001 -0.14273 -0.6646713 0.33650017 0.66706795 0.013158565
+1.3083 -0.44106001 -0.14929999 -0.68769497 0.071723126 0.72244823 0.056229807
+1.3087 -0.46002999 -0.14921001 -0.92158937 0.06726858 0.38229311 0.018238991
+1.3028001 -0.44558001 -0.16601001 -0.75452501 -0.51624328 0.40519741 0.01143573
+1.3074 -0.45556 -0.1637 -0.90191805 -0.42882094 -0.051540457 0
+1.2922 -0.42010999 -0.15744001 -0.683927 0.064140193 0.72672546 0.099772632
+1.2897 -0.40231001 -0.17068 -0.62405014 0.096248507 0.77543384 0.05662765
+1.2785 -0.39833999 -0.17699 -0.77942884 -0.21417826 0.58874303 0.047745761
+1.2867 -0.41931 -0.16908 -0.91154152 -0.097758524 0.39941868 0.041243974
+1.2798001 -0.41626999 -0.17580999 -0.90775114 -0.051451765 0.41634202 0.079362191
+1.2956001 -0.4339 -0.15685 -0.77638638 -0.47825214 0.4104864 0.013418273
+1.2948 -0.43595999 -0.16725001 -0.86559802 -0.44219646 0.23495182 0.0098557426
+1.3465 -0.48052999 -0.10969 -0.58953726 0.2156374 0.77842563 0.0093657374
+1.3498 -0.49945 -0.10595 -0.85447502 -0.045721244 0.51747656 0
+1.3404 -0.47288999 -0.12073 -0.62149137 0.023179587 0.78307807 0.038707774
+1.3351001 -0.48482999 -0.11824 -0.58089972 0.35980016 0.73013657 0.0028030244
+1.3295 -0.49974 -0.11464 -0.64731437 0.40004194 0.64880705 0
+1.3275 -0.48021999 -0.12482 -0.55828005 0.33062941 0.76092541 0.0019158517
+1.3154 -0.48122001 -0.1346 -0.66618347 0.34307155 0.66219455 0.0024393199
+1.3214999 -0.49998999 -0.12247 -0.69299233 -0.10845266 0.71274102 0.00077239983
+1.3135 -0.49731001 -0.12986 -0.76365846 0.084491566 0.64006793 0.011976553
+1.3472 -0.52091002 -0.10505 -0.56167716 0.18035913 0.80745858 0.006156987
+1.3426 -0.53358001 -0.10365 -0.57669479 0.30480438 0.75796926 0.0059818584
+1.341 -0.52661002 -0.12376 -0.54945159 -0.82659012 -0.1218679 0.0010032816
+1.3303 -0.52086997 -0.11442 -0.16380689 0.70464396 0.69039416 0.11293138
+1.3187 -0.52736998 -0.11421 -0.022496801 0.64398956 0.76470345 0.049597405
+1.3325 -0.53566998 -0.10789 -0.28385943 0.38230827 0.87935448 0.0042068097
+1.3305 -0.51969999 -0.1233 0.2779721 0.68830466 0.67005092 0.056839511
+1.3187 -0.51182997 -0.12701 -0.7800557 -0.27656007 0.5612731 0.024224216
+1.309 -0.47678 -0.14544 -0.83474636 0.10840756 0.53985775 0
+1.3714 -0.55417001 -0.079815 -0.26299554 0.58888805 0.76422787 0.025215268
+1.3703001 -0.55199999 -0.083352 -0.18297143 0.4279187 0.88510287 0.011948184
+1.2823 -0.40621001 -0.18303999 -0.85238385 -0.12953542 0.50661856 0.067905985
+1.2731 -0.39811999 -0.18668 -0.86558914 -0.25176084 0.43286484 0.014469326
+1.2844 -0.41563001 -0.18321 -0.90732622 -0.051509574 0.41725993 0.080321997
+1.2798001 -0.41073 -0.18623 -0.93752658 -0.34001094 0.073732078 0.066370018
--- /dev/null
+PCL_ADD_TEST(sample_consensus test_sample_consensus
+ FILES test_sample_consensus.cpp
+ LINK_WITH pcl_gtest pcl_sample_consensus)
+
+PCL_ADD_TEST(sample_consensus_plane_models test_sample_consensus_plane_models
+ FILES test_sample_consensus_plane_models.cpp
+ LINK_WITH pcl_gtest pcl_io pcl_sample_consensus
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/sac_plane_test.pcd")
+
+PCL_ADD_TEST(sample_consensus_quadric_models test_sample_consensus_quadric_models
+ FILES test_sample_consensus_quadric_models.cpp
+ LINK_WITH pcl_gtest pcl_sample_consensus)
+
+PCL_ADD_TEST(sample_consensus_line_model test_sample_consensus_line_model
+ FILES test_sample_consensus_line_model.cpp
+ LINK_WITH pcl_gtest pcl_sample_consensus)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include <boost/thread.hpp>
+
+#include <pcl/sample_consensus/msac.h>
+#include <pcl/sample_consensus/lmeds.h>
+#include <pcl/sample_consensus/rmsac.h>
+#include <pcl/sample_consensus/mlesac.h>
+#include <pcl/sample_consensus/ransac.h>
+#include <pcl/sample_consensus/rransac.h>
+#include <pcl/sample_consensus/sac_model_sphere.h>
+
+using namespace pcl;
+
+typedef SampleConsensusModelSphere<PointXYZ>::Ptr SampleConsensusModelSpherePtr;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensus, Base)
+{
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>);
+
+ // Create a shared sphere model pointer directly
+ SampleConsensusModelSpherePtr model (new SampleConsensusModelSphere<PointXYZ> (cloud));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Basic tests
+ ASSERT_EQ (0.03, sac.getDistanceThreshold ());
+ sac.setDistanceThreshold (0.03);
+ ASSERT_EQ (0.03, sac.getDistanceThreshold ());
+
+ sac.setProbability (0.99);
+ ASSERT_EQ (0.99, sac.getProbability ());
+
+ sac.setMaxIterations (10000);
+ ASSERT_EQ (10000, sac.getMaxIterations ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Test if RANSAC finishes within a second.
+TEST (SampleConsensus, InfiniteLoop)
+{
+ const unsigned point_count = 100;
+ PointCloud<PointXYZ> cloud;
+ cloud.points.resize (point_count);
+ for (unsigned idx = 0; idx < point_count; ++idx)
+ {
+ cloud.points[idx].x = static_cast<float> (idx);
+ cloud.points[idx].y = 0.0;
+ cloud.points[idx].z = 0.0;
+ }
+
+ boost::posix_time::time_duration delay (0, 0, 1, 0);
+ boost::function<bool ()> sac_function;
+ SampleConsensusModelSpherePtr model (new SampleConsensusModelSphere<PointXYZ> (cloud.makeShared ()));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> ransac (model, 0.03);
+ sac_function = boost::bind (&RandomSampleConsensus<PointXYZ>::computeModel, &ransac, 0);
+ boost::thread thread1 (sac_function);
+ ASSERT_TRUE (thread1.timed_join (delay));
+
+ // Create the LMSAC object
+ LeastMedianSquares<PointXYZ> lmsac (model, 0.03);
+ sac_function = boost::bind (&LeastMedianSquares<PointXYZ>::computeModel, &lmsac, 0);
+ boost::thread thread2 (sac_function);
+ ASSERT_TRUE (thread2.timed_join (delay));
+
+ // Create the MSAC object
+ MEstimatorSampleConsensus<PointXYZ> mesac (model, 0.03);
+ sac_function = boost::bind (&MEstimatorSampleConsensus<PointXYZ>::computeModel, &mesac, 0);
+ boost::thread thread3 (sac_function);
+ ASSERT_TRUE (thread3.timed_join (delay));
+
+ // Create the RRSAC object
+ RandomizedRandomSampleConsensus<PointXYZ> rrsac (model, 0.03);
+ sac_function = boost::bind (&RandomizedRandomSampleConsensus<PointXYZ>::computeModel, &rrsac, 0);
+ boost::thread thread4 (sac_function);
+ ASSERT_TRUE (thread4.timed_join (delay));
+
+ // Create the RMSAC object
+ RandomizedMEstimatorSampleConsensus<PointXYZ> rmsac (model, 0.03);
+ sac_function = boost::bind (&RandomizedMEstimatorSampleConsensus<PointXYZ>::computeModel, &rmsac, 0);
+ boost::thread thread5 (sac_function);
+ ASSERT_TRUE (thread5.timed_join (delay));
+
+ // Create the MLESAC object
+ MaximumLikelihoodSampleConsensus<PointXYZ> mlesac (model, 0.03);
+ sac_function = boost::bind (&MaximumLikelihoodSampleConsensus<PointXYZ>::computeModel, &mlesac, 0);
+ boost::thread thread6 (sac_function);
+ ASSERT_TRUE (thread6.timed_join (delay));
+}
+
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include <pcl/pcl_tests.h>
+
+#include <pcl/sample_consensus/ransac.h>
+#include <pcl/sample_consensus/sac_model_line.h>
+
+using namespace pcl;
+
+typedef SampleConsensusModelLine<PointXYZ>::Ptr SampleConsensusModelLinePtr;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelLine, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ cloud.points.resize (10);
+
+ cloud.points[0].getVector3fMap () << 1.0f, 2.00f, 3.00f;
+ cloud.points[1].getVector3fMap () << 4.0f, 5.00f, 6.00f;
+ cloud.points[2].getVector3fMap () << 7.0f, 8.00f, 9.00f;
+ cloud.points[3].getVector3fMap () << 10.0f, 11.00f, 12.00f;
+ cloud.points[4].getVector3fMap () << 13.0f, 14.00f, 15.00f;
+ cloud.points[5].getVector3fMap () << 16.0f, 17.00f, 18.00f;
+ cloud.points[6].getVector3fMap () << 19.0f, 20.00f, 21.00f;
+ cloud.points[7].getVector3fMap () << 22.0f, 23.00f, 24.00f;
+ cloud.points[8].getVector3fMap () << -5.0f, 1.57f, 0.75f;
+ cloud.points[9].getVector3fMap () << 4.0f, 2.00f, 3.00f;
+
+ // Create a shared line model pointer directly
+ SampleConsensusModelLinePtr model (new SampleConsensusModelLine<PointXYZ> (cloud.makeShared ()));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.001);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (2, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (8, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (6, coeff.size ());
+ EXPECT_NEAR (1, coeff[4] / coeff[3], 1e-4);
+ EXPECT_NEAR (1, coeff[5] / coeff[3], 1e-4);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (6, coeff_refined.size ());
+ EXPECT_NEAR (1, coeff[4] / coeff[3], 1e-4);
+ EXPECT_NEAR (1, coeff[5] / coeff[3], 1e-4);
+
+ // Projection tests
+ PointCloud<PointXYZ> proj_points;
+ model->projectPoints (inliers, coeff_refined, proj_points);
+
+ EXPECT_XYZ_NEAR (PointXYZ ( 7.0, 8.0, 9.0), proj_points.points[2], 1e-4);
+ EXPECT_XYZ_NEAR (PointXYZ (10.0, 11.0, 12.0), proj_points.points[3], 1e-4);
+ EXPECT_XYZ_NEAR (PointXYZ (16.0, 17.0, 18.0), proj_points.points[5], 1e-4);
+}
+
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include <pcl/pcl_tests.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/point_types.h>
+
+#include <pcl/sample_consensus/msac.h>
+#include <pcl/sample_consensus/lmeds.h>
+#include <pcl/sample_consensus/rmsac.h>
+#include <pcl/sample_consensus/mlesac.h>
+#include <pcl/sample_consensus/ransac.h>
+#include <pcl/sample_consensus/rransac.h>
+#include <pcl/sample_consensus/sac_model_plane.h>
+#include <pcl/sample_consensus/sac_model_normal_plane.h>
+#include <pcl/sample_consensus/sac_model_normal_parallel_plane.h>
+
+using namespace pcl;
+using namespace pcl::io;
+
+typedef SampleConsensusModelPlane<PointXYZ>::Ptr SampleConsensusModelPlanePtr;
+typedef SampleConsensusModelNormalPlane<PointXYZ, Normal>::Ptr SampleConsensusModelNormalPlanePtr;
+typedef SampleConsensusModelNormalParallelPlane<PointXYZ, Normal>::Ptr SampleConsensusModelNormalParallelPlanePtr;
+
+PointCloud<PointXYZ>::Ptr cloud_ (new PointCloud<PointXYZ> ());
+PointCloud<Normal>::Ptr normals_ (new PointCloud<Normal> ());
+std::vector<int> indices_;
+float plane_coeffs_[] = {-0.8964f, -0.5868f, -1.208f};
+
+template <typename ModelType, typename SacType>
+void verifyPlaneSac (ModelType& model,
+ SacType& sac,
+ unsigned int inlier_number = 2000,
+ float tol = 1e-1f,
+ float refined_tol = 1e-1f,
+ float proj_tol = 1e-3f)
+{
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (3, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_LT (inlier_number, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (4, coeff.size ());
+ EXPECT_NEAR (plane_coeffs_[0], coeff[0] / coeff[3], tol);
+ EXPECT_NEAR (plane_coeffs_[1], coeff[1] / coeff[3], tol);
+ EXPECT_NEAR (plane_coeffs_[2], coeff[2] / coeff[3], tol);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (4, coeff_refined.size ());
+ EXPECT_NEAR (plane_coeffs_[0], coeff_refined[0] / coeff_refined[3], refined_tol);
+ EXPECT_NEAR (plane_coeffs_[1], coeff_refined[1] / coeff_refined[3], refined_tol);
+
+ // This test fails in Windows (VS 2010) -- not sure why yet -- relaxing the constraint from 1e-2 to 1e-1
+ // This test fails in MacOS too -- not sure why yet -- disabling
+ //EXPECT_NEAR (coeff_refined[2] / coeff_refined[3], plane_coeffs_[2], refined_tol);
+
+ // Projection tests
+ PointCloud<PointXYZ> proj_points;
+ model->projectPoints (inliers, coeff_refined, proj_points);
+ EXPECT_XYZ_NEAR (PointXYZ (1.1266, 0.0152, -0.0156), proj_points.points[20], proj_tol);
+ EXPECT_XYZ_NEAR (PointXYZ (1.1843, -0.0635, -0.0201), proj_points.points[30], proj_tol);
+ EXPECT_XYZ_NEAR (PointXYZ (1.0749, -0.0586, 0.0587), proj_points.points[50], proj_tol);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, Base)
+{
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Basic tests
+ PointCloud<PointXYZ>::ConstPtr cloud = model->getInputCloud ();
+ ASSERT_EQ (cloud_->points.size (), cloud->points.size ());
+
+ model->setInputCloud (cloud);
+ cloud = model->getInputCloud ();
+ ASSERT_EQ (cloud_->points.size (), cloud->points.size ());
+
+ boost::shared_ptr<std::vector<int> > indices = model->getIndices ();
+ ASSERT_EQ (indices_.size (), indices->size ());
+ model->setIndices (indices_);
+ indices = model->getIndices ();
+ ASSERT_EQ (indices_.size (), indices->size ());
+ model->setIndices (indices);
+ indices = model->getIndices ();
+ ASSERT_EQ (indices_.size (), indices->size ());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, RANSAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ verifyPlaneSac (model, sac);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, LMedS)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the LMedS object
+ LeastMedianSquares<PointXYZ> sac (model, 0.03);
+
+ verifyPlaneSac (model, sac);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, MSAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the MSAC object
+ MEstimatorSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ verifyPlaneSac (model, sac);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, RRANSAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the RRANSAC object
+ RandomizedRandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ sac.setFractionNrPretest (10.0);
+ ASSERT_EQ (10.0, sac.getFractionNrPretest ());
+
+ verifyPlaneSac (model, sac, 600, 1.0f, 1.0f, 0.01f);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, MLESAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the MSAC object
+ MaximumLikelihoodSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ verifyPlaneSac (model, sac, 1000, 0.3f, 0.2f, 0.01f);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelPlane, RMSAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
+
+ // Create the RMSAC object
+ RandomizedMEstimatorSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ sac.setFractionNrPretest (10.0);
+ ASSERT_EQ (10.0, sac.getFractionNrPretest ());
+
+ verifyPlaneSac (model, sac, 600, 1.0f, 1.0f, 0.01f);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelNormalPlane, RANSAC)
+{
+ srand (0);
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelNormalPlanePtr model (new SampleConsensusModelNormalPlane<PointXYZ, Normal> (cloud_));
+ model->setInputNormals (normals_);
+ model->setNormalDistanceWeight (0.01);
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ verifyPlaneSac (model, sac);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelNormalParallelPlane, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ PointCloud<Normal> normals;
+ cloud.points.resize (10);
+ normals.resize (10);
+
+ for (unsigned idx = 0; idx < cloud.size (); ++idx)
+ {
+ cloud.points[idx].x = static_cast<float> ((rand () % 200) - 100);
+ cloud.points[idx].y = static_cast<float> ((rand () % 200) - 100);
+ cloud.points[idx].z = 0.0f;
+
+ normals.points[idx].normal_x = 0.0f;
+ normals.points[idx].normal_y = 0.0f;
+ normals.points[idx].normal_z = 1.0f;
+ }
+
+ // Create a shared plane model pointer directly
+ SampleConsensusModelNormalParallelPlanePtr model (new SampleConsensusModelNormalParallelPlane<PointXYZ, Normal> (cloud.makeShared ()));
+ model->setInputNormals (normals.makeShared ());
+
+ const float max_angle_rad = 0.01f;
+ const float angle_eps = 0.001f;
+ model->setEpsAngle (max_angle_rad);
+
+ // Test true axis
+ {
+ model->setAxis (Eigen::Vector3f (0, 0, 1));
+
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+ sac.computeModel();
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ ASSERT_EQ (cloud.size (), inliers.size ());
+ }
+
+ // test axis slightly in valid range
+ {
+ model->setAxis (Eigen::Vector3f (0, sin (max_angle_rad * (1 - angle_eps)), cos (max_angle_rad * (1 - angle_eps))));
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+ sac.computeModel ();
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ ASSERT_EQ (cloud.size (), inliers.size ());
+ }
+
+ // test axis slightly out of valid range
+ {
+ model->setAxis (Eigen::Vector3f (0, sin (max_angle_rad * (1 + angle_eps)), cos (max_angle_rad * (1 + angle_eps))));
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+ sac.computeModel ();
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ ASSERT_EQ (0, inliers.size ());
+ }
+}
+
+
+int
+main (int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ std::cerr << "No test file given. Please download `sac_plane_test.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ // Load a standard PCD file from disk
+ pcl::PCLPointCloud2 cloud_blob;
+ if (loadPCDFile (argv[1], cloud_blob) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `sac_plane_test.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ fromPCLPointCloud2 (cloud_blob, *cloud_);
+ fromPCLPointCloud2 (cloud_blob, *normals_);
+
+ indices_.resize (cloud_->points.size ());
+ for (size_t i = 0; i < indices_.size (); ++i) { indices_[i] = int (i); }
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2012, Willow Garage, Inc.
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include <pcl/sample_consensus/ransac.h>
+#include <pcl/sample_consensus/sac_model_sphere.h>
+#include <pcl/sample_consensus/sac_model_cone.h>
+#include <pcl/sample_consensus/sac_model_cylinder.h>
+#include <pcl/sample_consensus/sac_model_circle.h>
+#include <pcl/sample_consensus/sac_model_circle3d.h>
+#include <pcl/sample_consensus/sac_model_normal_sphere.h>
+
+using namespace pcl;
+
+typedef SampleConsensusModelSphere<PointXYZ>::Ptr SampleConsensusModelSpherePtr;
+typedef SampleConsensusModelCone<PointXYZ, Normal>::Ptr SampleConsensusModelConePtr;
+typedef SampleConsensusModelCircle2D<PointXYZ>::Ptr SampleConsensusModelCircle2DPtr;
+typedef SampleConsensusModelCircle3D<PointXYZ>::Ptr SampleConsensusModelCircle3DPtr;
+typedef SampleConsensusModelCylinder<PointXYZ, Normal>::Ptr SampleConsensusModelCylinderPtr;
+typedef SampleConsensusModelNormalSphere<PointXYZ, Normal>::Ptr SampleConsensusModelNormalSpherePtr;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelSphere, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ cloud.points.resize (10);
+ cloud.points[0].getVector3fMap () << 1.7068f, 1.0684f, 2.2147f;
+ cloud.points[1].getVector3fMap () << 2.4708f, 2.3081f, 1.1736f;
+ cloud.points[2].getVector3fMap () << 2.7609f, 1.9095f, 1.3574f;
+ cloud.points[3].getVector3fMap () << 2.8016f, 1.6704f, 1.5009f;
+ cloud.points[4].getVector3fMap () << 1.8517f, 2.0276f, 1.0112f;
+ cloud.points[5].getVector3fMap () << 1.8726f, 1.3539f, 2.7523f;
+ cloud.points[6].getVector3fMap () << 2.5179f, 2.3218f, 1.2074f;
+ cloud.points[7].getVector3fMap () << 2.4026f, 2.5114f, 2.7588f;
+ cloud.points[8].getVector3fMap () << 2.6999f, 2.5606f, 1.5571f;
+ cloud.points[9].getVector3fMap () << 0.0000f, 0.0000f, 0.0000f;
+
+ // Create a shared sphere model pointer directly
+ SampleConsensusModelSpherePtr model (new SampleConsensusModelSphere<PointXYZ> (cloud.makeShared ()));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (4, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (9, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (4, coeff.size ());
+ EXPECT_NEAR (2, coeff[0] / coeff[3], 1e-2);
+ EXPECT_NEAR (2, coeff[1] / coeff[3], 1e-2);
+ EXPECT_NEAR (2, coeff[2] / coeff[3], 1e-2);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (4, coeff_refined.size ());
+ EXPECT_NEAR (2, coeff_refined[0] / coeff_refined[3], 1e-2);
+ EXPECT_NEAR (2, coeff_refined[1] / coeff_refined[3], 1e-2);
+ EXPECT_NEAR (2, coeff_refined[2] / coeff_refined[3], 1e-2);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelNormalSphere, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ PointCloud<Normal> normals;
+ cloud.points.resize (27); normals.points.resize (27);
+ cloud.points[ 0].getVector3fMap () << -0.014695f, 0.009549f, 0.954775f;
+ cloud.points[ 1].getVector3fMap () << 0.014695f, 0.009549f, 0.954775f;
+ cloud.points[ 2].getVector3fMap () << -0.014695f, 0.040451f, 0.954775f;
+ cloud.points[ 3].getVector3fMap () << 0.014695f, 0.040451f, 0.954775f;
+ cloud.points[ 4].getVector3fMap () << -0.009082f, -0.015451f, 0.972049f;
+ cloud.points[ 5].getVector3fMap () << 0.009082f, -0.015451f, 0.972049f;
+ cloud.points[ 6].getVector3fMap () << -0.038471f, 0.009549f, 0.972049f;
+ cloud.points[ 7].getVector3fMap () << 0.038471f, 0.009549f, 0.972049f;
+ cloud.points[ 8].getVector3fMap () << -0.038471f, 0.040451f, 0.972049f;
+ cloud.points[ 9].getVector3fMap () << 0.038471f, 0.040451f, 0.972049f;
+ cloud.points[10].getVector3fMap () << -0.009082f, 0.065451f, 0.972049f;
+ cloud.points[11].getVector3fMap () << 0.009082f, 0.065451f, 0.972049f;
+ cloud.points[12].getVector3fMap () << -0.023776f, -0.015451f, 0.982725f;
+ cloud.points[13].getVector3fMap () << 0.023776f, -0.015451f, 0.982725f;
+ cloud.points[14].getVector3fMap () << -0.023776f, 0.065451f, 0.982725f;
+ cloud.points[15].getVector3fMap () << 0.023776f, 0.065451f, 0.982725f;
+ cloud.points[16].getVector3fMap () << -0.000000f, -0.025000f, 1.000000f;
+ cloud.points[17].getVector3fMap () << 0.000000f, -0.025000f, 1.000000f;
+ cloud.points[18].getVector3fMap () << -0.029389f, -0.015451f, 1.000000f;
+ cloud.points[19].getVector3fMap () << 0.029389f, -0.015451f, 1.000000f;
+ cloud.points[20].getVector3fMap () << -0.047553f, 0.009549f, 1.000000f;
+ cloud.points[21].getVector3fMap () << 0.047553f, 0.009549f, 1.000000f;
+ cloud.points[22].getVector3fMap () << -0.047553f, 0.040451f, 1.000000f;
+ cloud.points[23].getVector3fMap () << 0.047553f, 0.040451f, 1.000000f;
+ cloud.points[24].getVector3fMap () << -0.029389f, 0.065451f, 1.000000f;
+ cloud.points[25].getVector3fMap () << 0.029389f, 0.065451f, 1.000000f;
+ cloud.points[26].getVector3fMap () << 0.000000f, 0.075000f, 1.000000f;
+
+ normals.points[ 0].getNormalVector3fMap () << -0.293893f, -0.309017f, -0.904509f;
+ normals.points[ 1].getNormalVector3fMap () << 0.293893f, -0.309017f, -0.904508f;
+ normals.points[ 2].getNormalVector3fMap () << -0.293893f, 0.309017f, -0.904509f;
+ normals.points[ 3].getNormalVector3fMap () << 0.293893f, 0.309017f, -0.904508f;
+ normals.points[ 4].getNormalVector3fMap () << -0.181636f, -0.809017f, -0.559017f;
+ normals.points[ 5].getNormalVector3fMap () << 0.181636f, -0.809017f, -0.559017f;
+ normals.points[ 6].getNormalVector3fMap () << -0.769421f, -0.309017f, -0.559017f;
+ normals.points[ 7].getNormalVector3fMap () << 0.769421f, -0.309017f, -0.559017f;
+ normals.points[ 8].getNormalVector3fMap () << -0.769421f, 0.309017f, -0.559017f;
+ normals.points[ 9].getNormalVector3fMap () << 0.769421f, 0.309017f, -0.559017f;
+ normals.points[10].getNormalVector3fMap () << -0.181636f, 0.809017f, -0.559017f;
+ normals.points[11].getNormalVector3fMap () << 0.181636f, 0.809017f, -0.559017f;
+ normals.points[12].getNormalVector3fMap () << -0.475528f, -0.809017f, -0.345491f;
+ normals.points[13].getNormalVector3fMap () << 0.475528f, -0.809017f, -0.345491f;
+ normals.points[14].getNormalVector3fMap () << -0.475528f, 0.809017f, -0.345491f;
+ normals.points[15].getNormalVector3fMap () << 0.475528f, 0.809017f, -0.345491f;
+ normals.points[16].getNormalVector3fMap () << -0.000000f, -1.000000f, 0.000000f;
+ normals.points[17].getNormalVector3fMap () << 0.000000f, -1.000000f, 0.000000f;
+ normals.points[18].getNormalVector3fMap () << -0.587785f, -0.809017f, 0.000000f;
+ normals.points[19].getNormalVector3fMap () << 0.587785f, -0.809017f, 0.000000f;
+ normals.points[20].getNormalVector3fMap () << -0.951057f, -0.309017f, 0.000000f;
+ normals.points[21].getNormalVector3fMap () << 0.951057f, -0.309017f, 0.000000f;
+ normals.points[22].getNormalVector3fMap () << -0.951057f, 0.309017f, 0.000000f;
+ normals.points[23].getNormalVector3fMap () << 0.951057f, 0.309017f, 0.000000f;
+ normals.points[24].getNormalVector3fMap () << -0.587785f, 0.809017f, 0.000000f;
+ normals.points[25].getNormalVector3fMap () << 0.587785f, 0.809017f, 0.000000f;
+ normals.points[26].getNormalVector3fMap () << 0.000000f, 1.000000f, 0.000000f;
+
+ // Create a shared sphere model pointer directly
+ SampleConsensusModelNormalSpherePtr model (new SampleConsensusModelNormalSphere<PointXYZ, Normal> (cloud.makeShared ()));
+ model->setInputNormals (normals.makeShared ());
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (4, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (27, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (4, coeff.size ());
+ EXPECT_NEAR (0.000, coeff[0], 1e-2);
+ EXPECT_NEAR (0.025, coeff[1], 1e-2);
+ EXPECT_NEAR (1.000, coeff[2], 1e-2);
+ EXPECT_NEAR (0.050, coeff[3], 1e-2);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (4, coeff_refined.size ());
+ EXPECT_NEAR (0.000, coeff_refined[0], 1e-2);
+ EXPECT_NEAR (0.025, coeff_refined[1], 1e-2);
+ EXPECT_NEAR (1.000, coeff_refined[2], 1e-2);
+ EXPECT_NEAR (0.050, coeff_refined[3], 1e-2);
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelCone, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ PointCloud<Normal> normals;
+ cloud.points.resize (31); normals.points.resize (31);
+
+ cloud.points[ 0].getVector3fMap () << -0.011247f, 0.200000f, 0.965384f;
+ cloud.points[ 1].getVector3fMap () << 0.000000f, 0.200000f, 0.963603f;
+ cloud.points[ 2].getVector3fMap () << 0.011247f, 0.200000f, 0.965384f;
+ cloud.points[ 3].getVector3fMap () << -0.016045f, 0.175000f, 0.977916f;
+ cloud.points[ 4].getVector3fMap () << -0.008435f, 0.175000f, 0.974038f;
+ cloud.points[ 5].getVector3fMap () << 0.004218f, 0.175000f, 0.973370f;
+ cloud.points[ 6].getVector3fMap () << 0.016045f, 0.175000f, 0.977916f;
+ cloud.points[ 7].getVector3fMap () << -0.025420f, 0.200000f, 0.974580f;
+ cloud.points[ 8].getVector3fMap () << 0.025420f, 0.200000f, 0.974580f;
+ cloud.points[ 9].getVector3fMap () << -0.012710f, 0.150000f, 0.987290f;
+ cloud.points[10].getVector3fMap () << -0.005624f, 0.150000f, 0.982692f;
+ cloud.points[11].getVector3fMap () << 0.002812f, 0.150000f, 0.982247f;
+ cloud.points[12].getVector3fMap () << 0.012710f, 0.150000f, 0.987290f;
+ cloud.points[13].getVector3fMap () << -0.022084f, 0.175000f, 0.983955f;
+ cloud.points[14].getVector3fMap () << 0.022084f, 0.175000f, 0.983955f;
+ cloud.points[15].getVector3fMap () << -0.034616f, 0.200000f, 0.988753f;
+ cloud.points[16].getVector3fMap () << 0.034616f, 0.200000f, 0.988753f;
+ cloud.points[17].getVector3fMap () << -0.006044f, 0.125000f, 0.993956f;
+ cloud.points[18].getVector3fMap () << 0.004835f, 0.125000f, 0.993345f;
+ cloud.points[19].getVector3fMap () << -0.017308f, 0.150000f, 0.994376f;
+ cloud.points[20].getVector3fMap () << 0.017308f, 0.150000f, 0.994376f;
+ cloud.points[21].getVector3fMap () << -0.025962f, 0.175000f, 0.991565f;
+ cloud.points[22].getVector3fMap () << 0.025962f, 0.175000f, 0.991565f;
+ cloud.points[23].getVector3fMap () << -0.009099f, 0.125000f, 1.000000f;
+ cloud.points[24].getVector3fMap () << 0.009099f, 0.125000f, 1.000000f;
+ cloud.points[25].getVector3fMap () << -0.018199f, 0.150000f, 1.000000f;
+ cloud.points[26].getVector3fMap () << 0.018199f, 0.150000f, 1.000000f;
+ cloud.points[27].getVector3fMap () << -0.027298f, 0.175000f, 1.000000f;
+ cloud.points[28].getVector3fMap () << 0.027298f, 0.175000f, 1.000000f;
+ cloud.points[29].getVector3fMap () << -0.036397f, 0.200000f, 1.000000f;
+ cloud.points[30].getVector3fMap () << 0.036397f, 0.200000f, 1.000000f;
+
+ normals.points[ 0].getNormalVector3fMap () << -0.290381f, -0.342020f, -0.893701f;
+ normals.points[ 1].getNormalVector3fMap () << 0.000000f, -0.342020f, -0.939693f;
+ normals.points[ 2].getNormalVector3fMap () << 0.290381f, -0.342020f, -0.893701f;
+ normals.points[ 3].getNormalVector3fMap () << -0.552338f, -0.342020f, -0.760227f;
+ normals.points[ 4].getNormalVector3fMap () << -0.290381f, -0.342020f, -0.893701f;
+ normals.points[ 5].getNormalVector3fMap () << 0.145191f, -0.342020f, -0.916697f;
+ normals.points[ 6].getNormalVector3fMap () << 0.552337f, -0.342020f, -0.760227f;
+ normals.points[ 7].getNormalVector3fMap () << -0.656282f, -0.342020f, -0.656283f;
+ normals.points[ 8].getNormalVector3fMap () << 0.656282f, -0.342020f, -0.656283f;
+ normals.points[ 9].getNormalVector3fMap () << -0.656283f, -0.342020f, -0.656282f;
+ normals.points[10].getNormalVector3fMap () << -0.290381f, -0.342020f, -0.893701f;
+ normals.points[11].getNormalVector3fMap () << 0.145191f, -0.342020f, -0.916697f;
+ normals.points[12].getNormalVector3fMap () << 0.656282f, -0.342020f, -0.656282f;
+ normals.points[13].getNormalVector3fMap () << -0.760228f, -0.342020f, -0.552337f;
+ normals.points[14].getNormalVector3fMap () << 0.760228f, -0.342020f, -0.552337f;
+ normals.points[15].getNormalVector3fMap () << -0.893701f, -0.342020f, -0.290380f;
+ normals.points[16].getNormalVector3fMap () << 0.893701f, -0.342020f, -0.290380f;
+ normals.points[17].getNormalVector3fMap () << -0.624162f, -0.342020f, -0.624162f;
+ normals.points[18].getNormalVector3fMap () << 0.499329f, -0.342020f, -0.687268f;
+ normals.points[19].getNormalVector3fMap () << -0.893701f, -0.342020f, -0.290380f;
+ normals.points[20].getNormalVector3fMap () << 0.893701f, -0.342020f, -0.290380f;
+ normals.points[21].getNormalVector3fMap () << -0.893701f, -0.342020f, -0.290381f;
+ normals.points[22].getNormalVector3fMap () << 0.893701f, -0.342020f, -0.290381f;
+ normals.points[23].getNormalVector3fMap () << -0.939693f, -0.342020f, 0.000000f;
+ normals.points[24].getNormalVector3fMap () << 0.939693f, -0.342020f, 0.000000f;
+ normals.points[25].getNormalVector3fMap () << -0.939693f, -0.342020f, 0.000000f;
+ normals.points[26].getNormalVector3fMap () << 0.939693f, -0.342020f, 0.000000f;
+ normals.points[27].getNormalVector3fMap () << -0.939693f, -0.342020f, 0.000000f;
+ normals.points[28].getNormalVector3fMap () << 0.939693f, -0.342020f, 0.000000f;
+ normals.points[29].getNormalVector3fMap () << -0.939693f, -0.342020f, 0.000000f;
+ normals.points[30].getNormalVector3fMap () << 0.939693f, -0.342020f, 0.000000f;
+
+ // Create a shared cylinder model pointer directly
+ SampleConsensusModelConePtr model (new SampleConsensusModelCone<PointXYZ, Normal> (cloud.makeShared ()));
+ model->setInputNormals (normals.makeShared ());
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (3, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (31, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (7, coeff.size ());
+ EXPECT_NEAR (0.000000, coeff[0], 1e-2);
+ EXPECT_NEAR (0.100000, coeff[1], 1e-2);
+ EXPECT_NEAR (0.349066, coeff[6], 1e-2);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (7, coeff_refined.size ());
+ EXPECT_NEAR (0.349066, coeff_refined[6], 1e-2);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelCylinder, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ PointCloud<Normal> normals;
+ cloud.points.resize (20); normals.points.resize (20);
+
+ cloud.points[ 0].getVector3fMap () << -0.499902f, 2.199701f, 0.000008f;
+ cloud.points[ 1].getVector3fMap () << -0.875397f, 2.030177f, 0.050104f;
+ cloud.points[ 2].getVector3fMap () << -0.995875f, 1.635973f, 0.099846f;
+ cloud.points[ 3].getVector3fMap () << -0.779523f, 1.285527f, 0.149961f;
+ cloud.points[ 4].getVector3fMap () << -0.373285f, 1.216488f, 0.199959f;
+ cloud.points[ 5].getVector3fMap () << -0.052893f, 1.475973f, 0.250101f;
+ cloud.points[ 6].getVector3fMap () << -0.036558f, 1.887591f, 0.299839f;
+ cloud.points[ 7].getVector3fMap () << -0.335048f, 2.171994f, 0.350001f;
+ cloud.points[ 8].getVector3fMap () << -0.745456f, 2.135528f, 0.400072f;
+ cloud.points[ 9].getVector3fMap () << -0.989282f, 1.803311f, 0.449983f;
+ cloud.points[10].getVector3fMap () << -0.900651f, 1.400701f, 0.500126f;
+ cloud.points[11].getVector3fMap () << -0.539658f, 1.201468f, 0.550079f;
+ cloud.points[12].getVector3fMap () << -0.151875f, 1.340951f, 0.599983f;
+ cloud.points[13].getVector3fMap () << -0.000724f, 1.724373f, 0.649882f;
+ cloud.points[14].getVector3fMap () << -0.188573f, 2.090983f, 0.699854f;
+ cloud.points[15].getVector3fMap () << -0.587925f, 2.192257f, 0.749956f;
+ cloud.points[16].getVector3fMap () << -0.927724f, 1.958846f, 0.800008f;
+ cloud.points[17].getVector3fMap () << -0.976888f, 1.549655f, 0.849970f;
+ cloud.points[18].getVector3fMap () << -0.702003f, 1.242707f, 0.899954f;
+ cloud.points[19].getVector3fMap () << -0.289916f, 1.246296f, 0.950075f;
+
+ normals.points[ 0].getNormalVector3fMap () << 0.000098f, 1.000098f, 0.000008f;
+ normals.points[ 1].getNormalVector3fMap () << -0.750891f, 0.660413f, 0.000104f;
+ normals.points[ 2].getNormalVector3fMap () << -0.991765f, -0.127949f, -0.000154f;
+ normals.points[ 3].getNormalVector3fMap () << -0.558918f, -0.829439f, -0.000039f;
+ normals.points[ 4].getNormalVector3fMap () << 0.253627f, -0.967447f, -0.000041f;
+ normals.points[ 5].getNormalVector3fMap () << 0.894105f, -0.447965f, 0.000101f;
+ normals.points[ 6].getNormalVector3fMap () << 0.926852f, 0.375543f, -0.000161f;
+ normals.points[ 7].getNormalVector3fMap () << 0.329948f, 0.943941f, 0.000001f;
+ normals.points[ 8].getNormalVector3fMap () << -0.490966f, 0.871203f, 0.000072f;
+ normals.points[ 9].getNormalVector3fMap () << -0.978507f, 0.206425f, -0.000017f;
+ normals.points[10].getNormalVector3fMap () << -0.801227f, -0.598534f, 0.000126f;
+ normals.points[11].getNormalVector3fMap () << -0.079447f, -0.996697f, 0.000079f;
+ normals.points[12].getNormalVector3fMap () << 0.696154f, -0.717889f, -0.000017f;
+ normals.points[13].getNormalVector3fMap () << 0.998685f, 0.048502f, -0.000118f;
+ normals.points[14].getNormalVector3fMap () << 0.622933f, 0.782133f, -0.000146f;
+ normals.points[15].getNormalVector3fMap () << -0.175948f, 0.984480f, -0.000044f;
+ normals.points[16].getNormalVector3fMap () << -0.855476f, 0.517824f, 0.000008f;
+ normals.points[17].getNormalVector3fMap () << -0.953769f, -0.300571f, -0.000030f;
+ normals.points[18].getNormalVector3fMap () << -0.404035f, -0.914700f, -0.000046f;
+ normals.points[19].getNormalVector3fMap () << 0.420154f, -0.907445f, 0.000075f;
+
+ // Create a shared cylinder model pointer directly
+ SampleConsensusModelCylinderPtr model (new SampleConsensusModelCylinder<PointXYZ, Normal> (cloud.makeShared ()));
+ model->setInputNormals (normals.makeShared ());
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (2, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (20, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (7, coeff.size ());
+ EXPECT_NEAR (-0.5, coeff[0], 1e-3);
+ EXPECT_NEAR ( 1.7, coeff[1], 1e-3);
+ EXPECT_NEAR ( 0.5, coeff[6], 1e-3);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (7, coeff_refined.size ());
+ EXPECT_NEAR (0.5, coeff_refined[6], 1e-3);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelCircle2D, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ cloud.points.resize (18);
+
+ cloud.points[ 0].getVector3fMap () << 3.587751f, -4.190982f, 0.0f;
+ cloud.points[ 1].getVector3fMap () << 3.808883f, -4.412265f, 0.0f;
+ cloud.points[ 2].getVector3fMap () << 3.587525f, -5.809143f, 0.0f;
+ cloud.points[ 3].getVector3fMap () << 2.999913f, -5.999980f, 0.0f;
+ cloud.points[ 4].getVector3fMap () << 2.412224f, -5.809090f, 0.0f;
+ cloud.points[ 5].getVector3fMap () << 2.191080f, -5.587682f, 0.0f;
+ cloud.points[ 6].getVector3fMap () << 2.048941f, -5.309003f, 0.0f;
+ cloud.points[ 7].getVector3fMap () << 2.000397f, -4.999944f, 0.0f;
+ cloud.points[ 8].getVector3fMap () << 2.999953f, -6.000056f, 0.0f;
+ cloud.points[ 9].getVector3fMap () << 2.691127f, -5.951136f, 0.0f;
+ cloud.points[10].getVector3fMap () << 2.190892f, -5.587838f, 0.0f;
+ cloud.points[11].getVector3fMap () << 2.048874f, -5.309052f, 0.0f;
+ cloud.points[12].getVector3fMap () << 1.999990f, -5.000147f, 0.0f;
+ cloud.points[13].getVector3fMap () << 2.049026f, -4.690918f, 0.0f;
+ cloud.points[14].getVector3fMap () << 2.190956f, -4.412162f, 0.0f;
+ cloud.points[15].getVector3fMap () << 2.412231f, -4.190918f, 0.0f;
+ cloud.points[16].getVector3fMap () << 2.691027f, -4.049060f, 0.0f;
+ cloud.points[17].getVector3fMap () << 2.000000f, -3.000000f, 0.0f;
+
+ // Create a shared 2d circle model pointer directly
+ SampleConsensusModelCircle2DPtr model (new SampleConsensusModelCircle2D<PointXYZ> (cloud.makeShared ()));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (3, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (17, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (3, coeff.size ());
+ EXPECT_NEAR ( 3, coeff[0], 1e-3);
+ EXPECT_NEAR (-5, coeff[1], 1e-3);
+ EXPECT_NEAR ( 1, coeff[2], 1e-3);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (3, coeff_refined.size ());
+ EXPECT_NEAR ( 3, coeff_refined[0], 1e-3);
+ EXPECT_NEAR (-5, coeff_refined[1], 1e-3);
+ EXPECT_NEAR ( 1, coeff_refined[2], 1e-3);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+TEST (SampleConsensusModelCircle3D, RANSAC)
+{
+ srand (0);
+
+ // Use a custom point cloud for these tests until we need something better
+ PointCloud<PointXYZ> cloud;
+ cloud.points.resize (20);
+
+ cloud.points[ 0].getVector3fMap () << 1.00000000f, 5.0000000f, -2.9000001f;
+ cloud.points[ 1].getVector3fMap () << 1.03420200f, 5.0000000f, -2.9060307f;
+ cloud.points[ 2].getVector3fMap () << 1.06427870f, 5.0000000f, -2.9233956f;
+ cloud.points[ 3].getVector3fMap () << 1.08660260f, 5.0000000f, -2.9500000f;
+ cloud.points[ 4].getVector3fMap () << 1.09848080f, 5.0000000f, -2.9826353f;
+ cloud.points[ 5].getVector3fMap () << 1.09848080f, 5.0000000f, -3.0173647f;
+ cloud.points[ 6].getVector3fMap () << 1.08660260f, 5.0000000f, -3.0500000f;
+ cloud.points[ 7].getVector3fMap () << 1.06427870f, 5.0000000f, -3.0766044f;
+ cloud.points[ 8].getVector3fMap () << 1.03420200f, 5.0000000f, -3.0939693f;
+ cloud.points[ 9].getVector3fMap () << 1.00000000f, 5.0000000f, -3.0999999f;
+ cloud.points[10].getVector3fMap () << 0.96579796f, 5.0000000f, -3.0939693f;
+ cloud.points[11].getVector3fMap () << 0.93572122f, 5.0000000f, -3.0766044f;
+ cloud.points[12].getVector3fMap () << 0.91339743f, 5.0000000f, -3.0500000f;
+ cloud.points[13].getVector3fMap () << 0.90151924f, 5.0000000f, -3.0173647f;
+ cloud.points[14].getVector3fMap () << 0.90151924f, 5.0000000f, -2.9826353f;
+ cloud.points[15].getVector3fMap () << 0.91339743f, 5.0000000f, -2.9500000f;
+ cloud.points[16].getVector3fMap () << 0.93572122f, 5.0000000f, -2.9233956f;
+ cloud.points[17].getVector3fMap () << 0.96579796f, 5.0000000f, -2.9060307f;
+ cloud.points[18].getVector3fMap () << 0.85000002f, 4.8499999f, -3.1500001f;
+ cloud.points[19].getVector3fMap () << 1.15000000f, 5.1500001f, -2.8499999f;
+
+ // Create a shared 3d circle model pointer directly
+ SampleConsensusModelCircle3DPtr model (new SampleConsensusModelCircle3D<PointXYZ> (cloud.makeShared ()));
+
+ // Create the RANSAC object
+ RandomSampleConsensus<PointXYZ> sac (model, 0.03);
+
+ // Algorithm tests
+ bool result = sac.computeModel ();
+ ASSERT_TRUE (result);
+
+ std::vector<int> sample;
+ sac.getModel (sample);
+ EXPECT_EQ (3, sample.size ());
+
+ std::vector<int> inliers;
+ sac.getInliers (inliers);
+ EXPECT_EQ (18, inliers.size ());
+
+ Eigen::VectorXf coeff;
+ sac.getModelCoefficients (coeff);
+ EXPECT_EQ (7, coeff.size ());
+ EXPECT_NEAR ( 1.0, coeff[0], 1e-3);
+ EXPECT_NEAR ( 5.0, coeff[1], 1e-3);
+ EXPECT_NEAR (-3.0, coeff[2], 1e-3);
+ EXPECT_NEAR ( 0.1, coeff[3], 1e-3);
+ EXPECT_NEAR ( 0.0, coeff[4], 1e-3);
+ EXPECT_NEAR (-1.0, coeff[5], 1e-3);
+ EXPECT_NEAR ( 0.0, coeff[6], 1e-3);
+
+ Eigen::VectorXf coeff_refined;
+ model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
+ EXPECT_EQ (7, coeff_refined.size ());
+ EXPECT_NEAR ( 1.0, coeff_refined[0], 1e-3);
+ EXPECT_NEAR ( 5.0, coeff_refined[1], 1e-3);
+ EXPECT_NEAR (-3.0, coeff_refined[2], 1e-3);
+ EXPECT_NEAR ( 0.1, coeff_refined[3], 1e-3);
+ EXPECT_NEAR ( 0.0, coeff_refined[4], 1e-3);
+ EXPECT_NEAR (-1.0, coeff_refined[5], 1e-3);
+ EXPECT_NEAR ( 0.0, coeff_refined[6], 1e-3);
+}
+
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+
ASSERT_EQ (indices_tree[i].size (), no_of_neighbors);
ASSERT_EQ (dists_flann[i].size (), no_of_neighbors);
ASSERT_EQ (dists_tree[i].size (), no_of_neighbors);
- for (size_t j = 0; j<no_of_neighbors; j++ )
+ for (int j = 0; j < no_of_neighbors; j++ )
{
-
ASSERT_TRUE( indices_flann[i][j] == indices_tree[i][j] || dists_flann[i][j]==dists_tree[i][j]);
}
}
PCL_ADD_TEST(surface_marching_cubes test_marching_cubes
FILES test_marching_cubes.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_moving_least_squares test_moving_least_squares
FILES test_moving_least_squares.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_gp3 test_gp3
FILES test_gp3.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_organized_fast_mesh test_organized_fast_mesh
FILES test_organized_fast_mesh.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_grid_projection test_grid_projection
FILES test_grid_projection.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_ear_clipping test_ear_clipping
FILES test_ear_clipping.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
#PCL_ADD_TEST(surface_poisson test_poisson
# FILES test_poisson.cpp
# LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features
-# ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+# ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
if(QHULL_FOUND)
PCL_ADD_TEST(surface_convex_hull test_convex_hull
FILES test_convex_hull.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_filters pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
PCL_ADD_TEST(surface_concave test_concave_hull
FILES test_concave_hull.cpp
LINK_WITH pcl_gtest pcl_io pcl_kdtree pcl_surface pcl_features pcl_filters pcl_search
- ARGUMENTS ${PCL_SOURCE_DIR}/test/bun0.pcd)
+ ARGUMENTS "${PCL_SOURCE_DIR}/test/bun0.pcd")
endif(QHULL_FOUND)
}
}
+TEST (PCL, EarClippingCubeTest)
+{
+ PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ>());
+ cloud->height = 1;
+ //bottom of cube (z=0)
+ cloud->points.push_back (PointXYZ ( 0.f, 0.f, 0.f));
+ cloud->points.push_back (PointXYZ ( 1.f, 0.f, 0.f));
+ cloud->points.push_back (PointXYZ ( 1.f, 1.f, 0.f));
+ cloud->points.push_back (PointXYZ ( 0.f, 1.f, 0.f));
+ //top of cube (z=1.0)
+ cloud->points.push_back (PointXYZ ( 0.f, 0.f, 1.f));
+ cloud->points.push_back (PointXYZ ( 1.f, 0.f, 1.f));
+ cloud->points.push_back (PointXYZ ( 1.f, 1.f, 1.f));
+ cloud->points.push_back (PointXYZ ( 0.f, 1.f, 1.f));
+ cloud->width = static_cast<uint32_t> (cloud->points.size ());
+
+ Vertices vertices;
+ vertices.vertices.resize(4);
+
+ const int squares[][4] = { {1, 5, 6, 2},
+ {2, 6, 7, 3},
+ {3, 7, 4, 0},
+ {0, 4, 5, 1},
+ {4, 7, 6, 5},
+ {0, 1, 2, 3} };
+
+ const int truth[][3] = { {2, 1, 5},
+ {6, 2, 5},
+ {3, 2, 6},
+ {7, 3, 6},
+ {0, 3, 7},
+ {4, 0, 7},
+ {1, 0, 4},
+ {5, 1, 4},
+ {5, 4, 7},
+ {6, 5, 7},
+ {3, 0, 1},
+ {2, 3, 1} };
+
+ PolygonMesh::Ptr mesh (new PolygonMesh);
+ toPCLPointCloud2 (*cloud, mesh->cloud);
+
+ for (int i = 0; i < 6; ++i)
+ {
+ vertices.vertices[0] = squares[i][0];
+ vertices.vertices[1] = squares[i][1];
+ vertices.vertices[2] = squares[i][2];
+ vertices.vertices[3] = squares[i][3];
+ mesh->polygons.push_back (vertices);
+ }
+
+ EarClipping clipper;
+ PolygonMesh::ConstPtr mesh_aux (mesh);
+ clipper.setInputMesh (mesh_aux);
+
+ PolygonMesh triangulated_mesh;
+ clipper.process (triangulated_mesh);
+
+ EXPECT_EQ (triangulated_mesh.polygons.size (), 12);
+ for (int i = 0; i < static_cast<int> (triangulated_mesh.polygons.size ()); ++i)
+ EXPECT_EQ (triangulated_mesh.polygons[i].vertices.size (), 3);
+
+
+
+ for (int pi = 0; pi < static_cast<int> (triangulated_mesh.polygons.size ()); ++pi)
+ {
+ for (int vi = 0; vi < 3; ++vi)
+ {
+ EXPECT_EQ (triangulated_mesh.polygons[pi].vertices[vi], truth[pi][vi]);
+ }
+ }
+}
+
/* ---[ */
int
main (int argc, char** argv)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Copyright (c) 2013, Intelligent Robotics Lab, DLUT.
+ * Author: Qinghua Li, Yan Zhuang, Fei Yan
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Intelligent Robotics Lab, DLUT. nor the names
+ * of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file test_bearing_angle_image.cpp
+ * \created on: July 07, 2013
+ * \author: Qinghua Li (qinghua__li@163.com)
+ */
+
+#include <gtest/gtest.h>
+#include <iostream>
+#include <pcl/range_image/bearing_angle_image.h>
+
+pcl::BearingAngleImage bearing_angle_image;
+pcl::PointCloud<pcl::PointXYZ> point_cloud (3, 2);
+
+/////////////////////////////////////////////////////////////////////
+TEST (BearingAngleImageTest, GetAngle)
+{
+ pcl::PointXYZ point1 (1.0, 2.0, 3.0);
+ pcl::PointXYZ point2 (2.0, 1.0, 1.0);
+
+ double angle = bearing_angle_image.getAngle (point1, point2);
+ EXPECT_NEAR (40.203, angle, 1e-3);
+}
+
+/////////////////////////////////////////////////////////////////////
+TEST (BearingAngleImageTest, GenerateBAImage)
+{
+ point_cloud.points[0] = pcl::PointXYZ (3.0, 1.5, -2.0);
+ point_cloud.points[1] = pcl::PointXYZ (1.0, 3.0, 2.0);
+ point_cloud.points[2] = pcl::PointXYZ (2.0, 3.0, 2.0);
+
+ point_cloud.points[3] = pcl::PointXYZ (2.0, 3.0, 1.0);
+ point_cloud.points[4] = pcl::PointXYZ (4.0, 2.0, 2.0);
+ point_cloud.points[5] = pcl::PointXYZ (-1.5, 3.0, 1.0);
+
+ bearing_angle_image.generateBAImage (point_cloud);
+
+ uint8_t grays[6];
+ for (int i = 0; i < 3 * 2; ++i)
+ {
+ grays[i] = (bearing_angle_image.points[i].rgba >> 8) & 0xff;
+ }
+
+ EXPECT_EQ (0, grays[0]);
+ EXPECT_EQ (0, grays[1]);
+ EXPECT_EQ (0, grays[2]);
+ EXPECT_EQ (112, grays[3]);
+ EXPECT_EQ (80, grays[4]);
+ EXPECT_EQ (0, grays[5]);
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
pcl::people::PersonClassifier<pcl::RGB> person_classifier;
std::string svm_filename;
float min_confidence;
+float min_width;
+float max_width;
float min_height;
float max_height;
float voxel_size;
people_detector.setVoxelSize(voxel_size); // set the voxel size
people_detector.setIntrinsics(rgb_intrinsics_matrix); // set RGB camera intrinsic parameters
people_detector.setClassifier(person_classifier); // set person classifier
- people_detector.setHeightLimits(min_height, max_height); // set person classifier
+ people_detector.setPersonClusterLimits(min_height, max_height, min_width, max_width);
// Perform people detection on the new cloud:
std::vector<pcl::people::PersonCluster<PointT> > clusters; // vector containing persons clusters
// Algorithm parameters:
svm_filename = argv[1];
min_confidence = -1.5;
+ min_width = 0.1;
+ max_width = 8.0;
min_height = 1.3;
max_height = 2.3;
voxel_size = 0.06;
--- /dev/null
+
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2010-2011, Willow Garage, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id: $
+ *
+ */
+
+#include <gtest/gtest.h>
+#include <pcl/point_types.h>
+#include <pcl/point_cloud.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/recognition/ransac_based/model_library.h>
+#include <pcl/features/normal_3d.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::recognition;
+
+typedef pcl::PointXYZ PointT;
+typedef pcl::PointCloud<PointT> PointCloudT;
+typedef pcl::PointCloud<pcl::Normal> PointCloudTN;
+typedef pcl::PointCloud<PointT>::Ptr PointCloudTPtr;
+typedef pcl::PointCloud<pcl::Normal>::Ptr PointCloudTNPtr;
+
+PointCloud<PointXYZ>::Ptr cloud_;
+PointCloudTPtr model_cloud(new pcl::PointCloud<PointT>);
+PointCloudTNPtr model_cloud_normals (new pcl::PointCloud<pcl::Normal>);
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+int
+estimateNormals(pcl::PointCloud<PointT>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr cloud_normals) {
+ // Create the normal estimation class, and pass the input dataset to it
+ pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
+ ne.setInputCloud (cloud);
+
+ // Create an empty kdtree representation, and pass it to the normal estimation object.
+ // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
+ ne.setSearchMethod (tree);
+
+ // Use all neighbors in a sphere of radius 1m
+ // experiments with tensors dataset show that the points are as far apart as 1m from each other
+ ne.setRadiusSearch (0.03);
+
+ // Compute the features
+ ne.compute (*cloud_normals);
+
+ // cloud_normals->points.size () should have the same size as the input cloud->points.size ()*
+ return cloud_normals->points.size();
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+TEST (ORROctreeTest, OctreeSphereIntersection)
+{
+ float voxel_size = 0.02f;
+ float pair_width = 0.05f;
+ float frac_of_points_for_registration = 0.3f;
+ std::string object_name = "test_object";
+
+ ModelLibrary::Model* new_model = new ModelLibrary::Model (*model_cloud, *model_cloud_normals, voxel_size, object_name, frac_of_points_for_registration);
+
+ const ORROctree& octree = new_model->getOctree ();
+ const vector<ORROctree::Node*> &full_leaves = octree.getFullLeaves ();
+ list<ORROctree::Node*> inter_leaves;
+
+ // Run through all full leaves
+ for ( vector<ORROctree::Node*>::const_iterator leaf1 = full_leaves.begin () ; leaf1 != full_leaves.end () ; ++leaf1 )
+ {
+ const ORROctree::Node::Data* node_data1 = (*leaf1)->getData ();
+ // Get all full leaves at the right distance to the current leaf
+ inter_leaves.clear ();
+ octree.getFullLeavesIntersectedBySphere (node_data1->getPoint (), pair_width, inter_leaves);
+ // Ensure that inter_leaves does not contain leaf1
+ for ( list<ORROctree::Node*>::iterator leaf2 = inter_leaves.begin () ; leaf2 != inter_leaves.end () ; ++leaf2 )
+ {
+ EXPECT_NE(*leaf1, *leaf2);
+ }
+ }
+
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+//* ---[ */
+int
+ main (int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ std::cerr << "No test file given. Please download `bunny.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ // Load a standard PCD file from disk
+ if (pcl::io::loadPCDFile (argv[1], *model_cloud) < 0)
+ {
+ std::cerr << "Failed to read test file. Please download `bunny.pcd` and pass its path to the test." << std::endl;
+ return (-1);
+ }
+
+ if (!estimateNormals(model_cloud, model_cloud_normals) == model_cloud->points.size())
+ {
+ std::cerr << "Failed to estimate normals" << std::endl;
+ return (-1);
+ }
+
+ testing::InitGoogleTest (&argc, argv);
+ return (RUN_ALL_TESTS ());
+}
+/* ]--- */
+++ /dev/null
-/*
- * Software License Agreement (BSD License)
- *
- * Point Cloud Library (PCL) - www.pointclouds.org
- * Copyright (c) 2010-2012, Willow Garage, Inc.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of the copyright holder(s) nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id$
- *
- */
-#include <gtest/gtest.h>
-#include <pcl/io/pcd_io.h>
-#include "boost.h"
-#include <pcl/sample_consensus/sac.h>
-#include <pcl/sample_consensus/lmeds.h>
-#include <pcl/sample_consensus/ransac.h>
-#include <pcl/sample_consensus/rransac.h>
-#include <pcl/sample_consensus/msac.h>
-#include <pcl/sample_consensus/rmsac.h>
-#include <pcl/sample_consensus/mlesac.h>
-#include <pcl/sample_consensus/sac_model.h>
-#include <pcl/sample_consensus/sac_model_plane.h>
-#include <pcl/sample_consensus/sac_model_sphere.h>
-#include <pcl/sample_consensus/sac_model_cone.h>
-#include <pcl/sample_consensus/sac_model_cylinder.h>
-#include <pcl/sample_consensus/sac_model_circle.h>
-#include <pcl/sample_consensus/sac_model_circle3d.h>
-#include <pcl/sample_consensus/sac_model_line.h>
-#include <pcl/sample_consensus/sac_model_normal_plane.h>
-#include <pcl/sample_consensus/sac_model_normal_sphere.h>
-#include <pcl/sample_consensus/sac_model_parallel_plane.h>
-#include <pcl/sample_consensus/sac_model_normal_parallel_plane.h>
-#include <pcl/features/normal_3d.h>
-
-using namespace pcl;
-using namespace pcl::io;
-using namespace std;
-
-typedef SampleConsensusModel<PointXYZ>::Ptr SampleConsensusModelPtr;
-typedef SampleConsensusModelPlane<PointXYZ>::Ptr SampleConsensusModelPlanePtr;
-typedef SampleConsensusModelSphere<PointXYZ>::Ptr SampleConsensusModelSpherePtr;
-typedef SampleConsensusModelCylinder<PointXYZ, Normal>::Ptr SampleConsensusModelCylinderPtr;
-typedef SampleConsensusModelCone<PointXYZ, Normal>::Ptr SampleConsensusModelConePtr;
-typedef SampleConsensusModelCircle2D<PointXYZ>::Ptr SampleConsensusModelCircle2DPtr;
-typedef SampleConsensusModelCircle3D<PointXYZ>::Ptr SampleConsensusModelCircle3DPtr;
-typedef SampleConsensusModelLine<PointXYZ>::Ptr SampleConsensusModelLinePtr;
-typedef SampleConsensusModelNormalPlane<PointXYZ, Normal>::Ptr SampleConsensusModelNormalPlanePtr;
-typedef SampleConsensusModelNormalSphere<PointXYZ, Normal>::Ptr SampleConsensusModelNormalSpherePtr;
-typedef SampleConsensusModelParallelPlane<PointXYZ>::Ptr SampleConsensusModelParallelPlanePtr;
-typedef SampleConsensusModelNormalParallelPlane<PointXYZ, Normal>::Ptr SampleConsensusModelNormalParallelPlanePtr;
-
-PointCloud<PointXYZ>::Ptr cloud_ (new PointCloud<PointXYZ> ());
-PointCloud<Normal>::Ptr normals_ (new PointCloud<Normal> ());
-vector<int> indices_;
-float plane_coeffs_[] = {-0.8964f, -0.5868f, -1.208f};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-template<typename ModelType, typename SacType>
-void verifyPlaneSac (ModelType & model, SacType & sac, unsigned int inlier_number = 2000, float tol = 1e-1f,
- float refined_tol = 1e-1f, float proj_tol = 1e-3f)
-{
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 3);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_GE (int (inliers.size ()), inlier_number);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 4);
- EXPECT_NEAR (coeff[0]/coeff[3], plane_coeffs_[0], tol);
- EXPECT_NEAR (coeff[1]/coeff[3], plane_coeffs_[1], tol);
- EXPECT_NEAR (coeff[2]/coeff[3], plane_coeffs_[2], tol);
-
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 4);
- EXPECT_NEAR (coeff_refined[0]/coeff_refined[3], plane_coeffs_[0], refined_tol);
- EXPECT_NEAR (coeff_refined[1]/coeff_refined[3], plane_coeffs_[1], refined_tol);
- // This test fails in Windows (VS 2010) -- not sure why yet -- relaxing the constraint from 1e-2 to 1e-1
- // This test fails in MacOS too -- not sure why yet -- disabling
- //EXPECT_NEAR (coeff_refined[2]/coeff_refined[3], plane_coeffs_[2], refined_tol);
-
- // Projection tests
- PointCloud<PointXYZ> proj_points;
- model->projectPoints (inliers, coeff_refined, proj_points);
- EXPECT_NEAR (proj_points.points[20].x, 1.1266, proj_tol);
- EXPECT_NEAR (proj_points.points[20].y, 0.0152, proj_tol);
- EXPECT_NEAR (proj_points.points[20].z, -0.0156, proj_tol);
-
- EXPECT_NEAR (proj_points.points[30].x, 1.1843, proj_tol);
- EXPECT_NEAR (proj_points.points[30].y, -0.0635, proj_tol);
- EXPECT_NEAR (proj_points.points[30].z, -0.0201, proj_tol);
-
- EXPECT_NEAR (proj_points.points[50].x, 1.0749, proj_tol);
- EXPECT_NEAR (proj_points.points[50].y, -0.0586, proj_tol);
- EXPECT_NEAR (proj_points.points[50].z, 0.0587, refined_tol);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (SampleConsensusModelPlane, Base)
-{
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Basic tests
- PointCloud<PointXYZ>::ConstPtr cloud = model->getInputCloud ();
- ASSERT_EQ (cloud->points.size (), cloud_->points.size ());
-
- model->setInputCloud (cloud);
- cloud = model->getInputCloud ();
- ASSERT_EQ (cloud->points.size (), cloud_->points.size ());
-
- boost::shared_ptr<vector<int> > indices = model->getIndices ();
- ASSERT_EQ (indices->size (), indices_.size ());
- model->setIndices (indices_);
- indices = model->getIndices ();
- ASSERT_EQ (indices->size (), indices_.size ());
- model->setIndices (indices);
- indices = model->getIndices ();
- ASSERT_EQ (indices->size (), indices_.size ());
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, Base)
-{
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Basic tests
- ASSERT_EQ (sac.getDistanceThreshold (), 0.03);
- sac.setDistanceThreshold (0.03);
- ASSERT_EQ (sac.getDistanceThreshold (), 0.03);
-
- sac.setProbability (0.99);
- ASSERT_EQ (sac.getProbability (), 0.99);
-
- sac.setMaxIterations (10000);
- ASSERT_EQ (sac.getMaxIterations (), 10000);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- verifyPlaneSac(model, sac);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (LMedS, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the LMedS object
- LeastMedianSquares<PointXYZ> sac (model, 0.03);
-
- verifyPlaneSac(model, sac);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (MSAC, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the MSAC object
- MEstimatorSampleConsensus<PointXYZ> sac (model, 0.03);
-
- verifyPlaneSac (model, sac);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RRANSAC, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the RRANSAC object
- RandomizedRandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- sac.setFractionNrPretest (10.0);
- ASSERT_EQ (sac.getFractionNrPretest (), 10.0);
-
- verifyPlaneSac(model, sac, 600, 1.0f, 1.0f, 0.01f);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RMSAC, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the RMSAC object
- RandomizedMEstimatorSampleConsensus<PointXYZ> sac (model, 0.03);
-
- sac.setFractionNrPretest (10.0);
- ASSERT_EQ (sac.getFractionNrPretest (), 10.0);
-
- verifyPlaneSac(model, sac, 600, 1.0f, 1.0f, 0.01f);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelNormalParallelPlane)
-{
- srand (0);
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- PointCloud<Normal> normals;
- cloud.points.resize (10);
- normals.resize (10);
-
- for (unsigned idx = 0; idx < cloud.size (); ++idx)
- {
- cloud.points[idx].x = static_cast<float> ((rand () % 200) - 100);
- cloud.points[idx].y = static_cast<float> ((rand () % 200) - 100);
- cloud.points[idx].z = 0.0f;
-
- normals.points[idx].normal_x = 0.0f;
- normals.points[idx].normal_y = 0.0f;
- normals.points[idx].normal_z = 1.0f;
- }
-
- // Create a shared plane model pointer directly
- SampleConsensusModelNormalParallelPlanePtr model (new SampleConsensusModelNormalParallelPlane<PointXYZ, Normal> (cloud.makeShared ()));
- model->setInputNormals (normals.makeShared ());
-
- const float max_angle_rad = 0.01f;
- const float angle_eps = 0.001f;
- model->setEpsAngle (max_angle_rad);
-
- // Test true axis
- {
- model->setAxis (Eigen::Vector3f (0, 0, 1));
-
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
- sac.computeModel();
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- ASSERT_EQ (inliers.size (), cloud.size ());
- }
-
- // test axis slightly in valid range
- {
- model->setAxis (Eigen::Vector3f(0, sin(max_angle_rad * (1 - angle_eps)), cos(max_angle_rad * (1 - angle_eps))));
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
- sac.computeModel();
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- ASSERT_EQ (inliers.size (), cloud.size ());
- }
-
- // test axis slightly out of valid range
- {
- model->setAxis (Eigen::Vector3f(0, sin(max_angle_rad * (1 + angle_eps)), cos(max_angle_rad * (1 + angle_eps))));
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
- sac.computeModel();
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- ASSERT_EQ (inliers.size (), 0);
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (MLESAC, SampleConsensusModelPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelPlanePtr model (new SampleConsensusModelPlane<PointXYZ> (cloud_));
-
- // Create the MSAC object
- MaximumLikelihoodSampleConsensus<PointXYZ> sac (model, 0.03);
-
- verifyPlaneSac(model, sac, 1000, 0.3f, 0.2f, 0.01f);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelSphere)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- cloud.points.resize (10);
- cloud.points[0].x = 1.7068f; cloud.points[0].y = 1.0684f; cloud.points[0].z = 2.2147f;
- cloud.points[1].x = 2.4708f; cloud.points[1].y = 2.3081f; cloud.points[1].z = 1.1736f;
- cloud.points[2].x = 2.7609f; cloud.points[2].y = 1.9095f; cloud.points[2].z = 1.3574f;
- cloud.points[3].x = 2.8016f; cloud.points[3].y = 1.6704f; cloud.points[3].z = 1.5009f;
- cloud.points[4].x = 1.8517f; cloud.points[4].y = 2.0276f; cloud.points[4].z = 1.0112f;
- cloud.points[5].x = 1.8726f; cloud.points[5].y = 1.3539f; cloud.points[5].z = 2.7523f;
- cloud.points[6].x = 2.5179f; cloud.points[6].y = 2.3218f; cloud.points[6].z = 1.2074f;
- cloud.points[7].x = 2.4026f; cloud.points[7].y = 2.5114f; cloud.points[7].z = 2.7588f;
- cloud.points[8].x = 2.6999f; cloud.points[8].y = 2.5606f; cloud.points[8].z = 1.5571f;
- cloud.points[9].x = 0.0f; cloud.points[9].y = 0.0f; cloud.points[9].z = 0.0f;
-
- // Create a shared sphere model pointer directly
- SampleConsensusModelSpherePtr model (new SampleConsensusModelSphere<PointXYZ> (cloud.makeShared ()));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 4);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 9);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 4);
- EXPECT_NEAR (coeff[0]/coeff[3], 2, 1e-2);
- EXPECT_NEAR (coeff[1]/coeff[3], 2, 1e-2);
- EXPECT_NEAR (coeff[2]/coeff[3], 2, 1e-2);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 4);
- EXPECT_NEAR (coeff_refined[0]/coeff_refined[3], 2, 1e-2);
- EXPECT_NEAR (coeff_refined[1]/coeff_refined[3], 2, 1e-2);
- EXPECT_NEAR (coeff_refined[2]/coeff_refined[3], 2, 1e-2);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelNormalSphere)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- PointCloud<Normal> normals;
- cloud.points.resize (27); normals.points.resize (27);
- cloud.points[0].x = -0.014695f; cloud.points[0].y = 0.009549f; cloud.points[0].z = 0.954775f;
- cloud.points[1].x = 0.014695f; cloud.points[1].y = 0.009549f; cloud.points[1].z = 0.954775f;
- cloud.points[2].x = -0.014695f; cloud.points[2].y = 0.040451f; cloud.points[2].z = 0.954775f;
- cloud.points[3].x = 0.014695f; cloud.points[3].y = 0.040451f; cloud.points[3].z = 0.954775f;
- cloud.points[4].x = -0.009082f; cloud.points[4].y = -0.015451f; cloud.points[4].z = 0.972049f;
- cloud.points[5].x = 0.009082f; cloud.points[5].y = -0.015451f; cloud.points[5].z = 0.972049f;
- cloud.points[6].x = -0.038471f; cloud.points[6].y = 0.009549f; cloud.points[6].z = 0.972049f;
- cloud.points[7].x = 0.038471f; cloud.points[7].y = 0.009549f; cloud.points[7].z = 0.972049f;
- cloud.points[8].x = -0.038471f; cloud.points[8].y = 0.040451f; cloud.points[8].z = 0.972049f;
- cloud.points[9].x = 0.038471f; cloud.points[9].y = 0.040451f; cloud.points[9].z = 0.972049f;
- cloud.points[10].x = -0.009082f; cloud.points[10].y = 0.065451f; cloud.points[10].z = 0.972049f;
- cloud.points[11].x = 0.009082f; cloud.points[11].y = 0.065451f; cloud.points[11].z = 0.972049f;
- cloud.points[12].x = -0.023776f; cloud.points[12].y = -0.015451f; cloud.points[12].z = 0.982725f;
- cloud.points[13].x = 0.023776f; cloud.points[13].y = -0.015451f; cloud.points[13].z = 0.982725f;
- cloud.points[14].x = -0.023776f; cloud.points[14].y = 0.065451f; cloud.points[14].z = 0.982725f;
- cloud.points[15].x = 0.023776f; cloud.points[15].y = 0.065451f; cloud.points[15].z = 0.982725f;
- cloud.points[16].x = -0.000000f; cloud.points[16].y = -0.025000f; cloud.points[16].z = 1.000000f;
- cloud.points[17].x = 0.000000f; cloud.points[17].y = -0.025000f; cloud.points[17].z = 1.000000f;
- cloud.points[18].x = -0.029389f; cloud.points[18].y = -0.015451f; cloud.points[18].z = 1.000000f;
- cloud.points[19].x = 0.029389f; cloud.points[19].y = -0.015451f; cloud.points[19].z = 1.000000f;
- cloud.points[20].x = -0.047553f; cloud.points[20].y = 0.009549f; cloud.points[20].z = 1.000000f;
- cloud.points[21].x = 0.047553f; cloud.points[21].y = 0.009549f; cloud.points[21].z = 1.000000f;
- cloud.points[22].x = -0.047553f; cloud.points[22].y = 0.040451f; cloud.points[22].z = 1.000000f;
- cloud.points[23].x = 0.047553f; cloud.points[23].y = 0.040451f; cloud.points[23].z = 1.000000f;
- cloud.points[24].x = -0.029389f; cloud.points[24].y = 0.065451f; cloud.points[24].z = 1.000000f;
- cloud.points[25].x = 0.029389f; cloud.points[25].y = 0.065451f; cloud.points[25].z = 1.000000f;
- cloud.points[26].x = 0.000000f; cloud.points[26].y = 0.075000f; cloud.points[26].z = 1.000000f;
-
- normals.points[0].normal[0] = -0.293893f; normals.points[0].normal[1] = -0.309017f; normals.points[0].normal[2] = -0.904509f;
- normals.points[1].normal[0] = 0.293893f; normals.points[1].normal[1] = -0.309017f; normals.points[1].normal[2] = -0.904508f;
- normals.points[2].normal[0] = -0.293893f; normals.points[2].normal[1] = 0.309017f; normals.points[2].normal[2] = -0.904509f;
- normals.points[3].normal[0] = 0.293893f; normals.points[3].normal[1] = 0.309017f; normals.points[3].normal[2] = -0.904508f;
- normals.points[4].normal[0] = -0.181636f; normals.points[4].normal[1] = -0.809017f; normals.points[4].normal[2] = -0.559017f;
- normals.points[5].normal[0] = 0.181636f; normals.points[5].normal[1] = -0.809017f; normals.points[5].normal[2] = -0.559017f;
- normals.points[6].normal[0] = -0.769421f; normals.points[6].normal[1] = -0.309017f; normals.points[6].normal[2] = -0.559017f;
- normals.points[7].normal[0] = 0.769421f; normals.points[7].normal[1] = -0.309017f; normals.points[7].normal[2] = -0.559017f;
- normals.points[8].normal[0] = -0.769421f; normals.points[8].normal[1] = 0.309017f; normals.points[8].normal[2] = -0.559017f;
- normals.points[9].normal[0] = 0.769421f; normals.points[9].normal[1] = 0.309017f; normals.points[9].normal[2] = -0.559017f;
- normals.points[10].normal[0] = -0.181636f; normals.points[10].normal[1] = 0.809017f; normals.points[10].normal[2] = -0.559017f;
- normals.points[11].normal[0] = 0.181636f; normals.points[11].normal[1] = 0.809017f; normals.points[11].normal[2] = -0.559017f;
- normals.points[12].normal[0] = -0.475528f; normals.points[12].normal[1] = -0.809017f; normals.points[12].normal[2] = -0.345491f;
- normals.points[13].normal[0] = 0.475528f; normals.points[13].normal[1] = -0.809017f; normals.points[13].normal[2] = -0.345491f;
- normals.points[14].normal[0] = -0.475528f; normals.points[14].normal[1] = 0.809017f; normals.points[14].normal[2] = -0.345491f;
- normals.points[15].normal[0] = 0.475528f; normals.points[15].normal[1] = 0.809017f; normals.points[15].normal[2] = -0.345491f;
- normals.points[16].normal[0] = -0.000000f; normals.points[16].normal[1] = -1.000000f; normals.points[16].normal[2] = 0.000000f;
- normals.points[17].normal[0] = 0.000000f; normals.points[17].normal[1] = -1.000000f; normals.points[17].normal[2] = 0.000000f;
- normals.points[18].normal[0] = -0.587785f; normals.points[18].normal[1] = -0.809017f; normals.points[18].normal[2] = 0.000000f;
- normals.points[19].normal[0] = 0.587785f; normals.points[19].normal[1] = -0.809017f; normals.points[19].normal[2] = 0.000000f;
- normals.points[20].normal[0] = -0.951057f; normals.points[20].normal[1] = -0.309017f; normals.points[20].normal[2] = 0.000000f;
- normals.points[21].normal[0] = 0.951057f; normals.points[21].normal[1] = -0.309017f; normals.points[21].normal[2] = 0.000000f;
- normals.points[22].normal[0] = -0.951057f; normals.points[22].normal[1] = 0.309017f; normals.points[22].normal[2] = 0.000000f;
- normals.points[23].normal[0] = 0.951057f; normals.points[23].normal[1] = 0.309017f; normals.points[23].normal[2] = 0.000000f;
- normals.points[24].normal[0] = -0.587785f; normals.points[24].normal[1] = 0.809017f; normals.points[24].normal[2] = 0.000000f;
- normals.points[25].normal[0] = 0.587785f; normals.points[25].normal[1] = 0.809017f; normals.points[25].normal[2] = 0.000000f;
- normals.points[26].normal[0] = 0.000000f; normals.points[26].normal[1] = 1.000000f; normals.points[26].normal[2] = 0.000000f;
-
- // Create a shared sphere model pointer directly
- SampleConsensusModelNormalSpherePtr model (new SampleConsensusModelNormalSphere<PointXYZ, Normal> (cloud.makeShared ()));
- model->setInputNormals(normals.makeShared ());
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 4);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 27);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 4);
- EXPECT_NEAR (coeff[0], 0.0, 1e-2);
- EXPECT_NEAR (coeff[1], 0.025, 1e-2);
- EXPECT_NEAR (coeff[2], 1.0, 1e-2);
- EXPECT_NEAR (coeff[3], 0.05, 1e-2);
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 4);
- EXPECT_NEAR (coeff_refined[0], 0.0, 1e-2);
- EXPECT_NEAR (coeff_refined[1], 0.025, 1e-2);
- EXPECT_NEAR (coeff_refined[2], 1.0, 1e-2);
- EXPECT_NEAR (coeff_refined[3], 0.05, 1e-2);
-}
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelCone)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- PointCloud<Normal> normals;
- cloud.points.resize (31); normals.points.resize (31);
-
- cloud.points[0].x = -0.011247f; cloud.points[0].y = 0.200000f; cloud.points[0].z = 0.965384f;
- cloud.points[1].x = 0.000000f; cloud.points[1].y = 0.200000f; cloud.points[1].z = 0.963603f;
- cloud.points[2].x = 0.011247f; cloud.points[2].y = 0.200000f; cloud.points[2].z = 0.965384f;
- cloud.points[3].x = -0.016045f; cloud.points[3].y = 0.175000f; cloud.points[3].z = 0.977916f;
- cloud.points[4].x = -0.008435f; cloud.points[4].y = 0.175000f; cloud.points[4].z = 0.974038f;
- cloud.points[5].x = 0.004218f; cloud.points[5].y = 0.175000f; cloud.points[5].z = 0.973370f;
- cloud.points[6].x = 0.016045f; cloud.points[6].y = 0.175000f; cloud.points[6].z = 0.977916f;
- cloud.points[7].x = -0.025420f; cloud.points[7].y = 0.200000f; cloud.points[7].z = 0.974580f;
- cloud.points[8].x = 0.025420f; cloud.points[8].y = 0.200000f; cloud.points[8].z = 0.974580f;
- cloud.points[9].x = -0.012710f; cloud.points[9].y = 0.150000f; cloud.points[9].z = 0.987290f;
- cloud.points[10].x = -0.005624f; cloud.points[10].y = 0.150000f; cloud.points[10].z = 0.982692f;
- cloud.points[11].x = 0.002812f; cloud.points[11].y = 0.150000f; cloud.points[11].z = 0.982247f;
- cloud.points[12].x = 0.012710f; cloud.points[12].y = 0.150000f; cloud.points[12].z = 0.987290f;
- cloud.points[13].x = -0.022084f; cloud.points[13].y = 0.175000f; cloud.points[13].z = 0.983955f;
- cloud.points[14].x = 0.022084f; cloud.points[14].y = 0.175000f; cloud.points[14].z = 0.983955f;
- cloud.points[15].x = -0.034616f; cloud.points[15].y = 0.200000f; cloud.points[15].z = 0.988753f;
- cloud.points[16].x = 0.034616f; cloud.points[16].y = 0.200000f; cloud.points[16].z = 0.988753f;
- cloud.points[17].x = -0.006044f; cloud.points[17].y = 0.125000f; cloud.points[17].z = 0.993956f;
- cloud.points[18].x = 0.004835f; cloud.points[18].y = 0.125000f; cloud.points[18].z = 0.993345f;
- cloud.points[19].x = -0.017308f; cloud.points[19].y = 0.150000f; cloud.points[19].z = 0.994376f;
- cloud.points[20].x = 0.017308f; cloud.points[20].y = 0.150000f; cloud.points[20].z = 0.994376f;
- cloud.points[21].x = -0.025962f; cloud.points[21].y = 0.175000f; cloud.points[21].z = 0.991565f;
- cloud.points[22].x = 0.025962f; cloud.points[22].y = 0.175000f; cloud.points[22].z = 0.991565f;
- cloud.points[23].x = -0.009099f; cloud.points[23].y = 0.125000f; cloud.points[23].z = 1.000000f;
- cloud.points[24].x = 0.009099f; cloud.points[24].y = 0.125000f; cloud.points[24].z = 1.000000f;
- cloud.points[25].x = -0.018199f; cloud.points[25].y = 0.150000f; cloud.points[25].z = 1.000000f;
- cloud.points[26].x = 0.018199f; cloud.points[26].y = 0.150000f; cloud.points[26].z = 1.000000f;
- cloud.points[27].x = -0.027298f; cloud.points[27].y = 0.175000f; cloud.points[27].z = 1.000000f;
- cloud.points[28].x = 0.027298f; cloud.points[28].y = 0.175000f; cloud.points[28].z = 1.000000f;
- cloud.points[29].x = -0.036397f; cloud.points[29].y = 0.200000f; cloud.points[29].z = 1.000000f;
- cloud.points[30].x = 0.036397f; cloud.points[30].y = 0.200000f; cloud.points[30].z = 1.000000f;
-
- normals.points[0].normal[0] = -0.290381f; normals.points[0].normal[1] = -0.342020f; normals.points[0].normal[2] = -0.893701f;
- normals.points[1].normal[0] = 0.000000f; normals.points[1].normal[1] = -0.342020f; normals.points[1].normal[2] = -0.939693f;
- normals.points[2].normal[0] = 0.290381f; normals.points[2].normal[1] = -0.342020f; normals.points[2].normal[2] = -0.893701f;
- normals.points[3].normal[0] = -0.552338f; normals.points[3].normal[1] = -0.342020f; normals.points[3].normal[2] = -0.760227f;
- normals.points[4].normal[0] = -0.290381f; normals.points[4].normal[1] = -0.342020f; normals.points[4].normal[2] = -0.893701f;
- normals.points[5].normal[0] = 0.145191f; normals.points[5].normal[1] = -0.342020f; normals.points[5].normal[2] = -0.916697f;
- normals.points[6].normal[0] = 0.552337f; normals.points[6].normal[1] = -0.342020f; normals.points[6].normal[2] = -0.760227f;
- normals.points[7].normal[0] = -0.656282f; normals.points[7].normal[1] = -0.342020f; normals.points[7].normal[2] = -0.656283f;
- normals.points[8].normal[0] = 0.656282f; normals.points[8].normal[1] = -0.342020f; normals.points[8].normal[2] = -0.656283f;
- normals.points[9].normal[0] = -0.656283f; normals.points[9].normal[1] = -0.342020f; normals.points[9].normal[2] = -0.656282f;
- normals.points[10].normal[0] = -0.290381f; normals.points[10].normal[1] = -0.342020f; normals.points[10].normal[2] = -0.893701f;
- normals.points[11].normal[0] = 0.145191f; normals.points[11].normal[1] = -0.342020f; normals.points[11].normal[2] = -0.916697f;
- normals.points[12].normal[0] = 0.656282f; normals.points[12].normal[1] = -0.342020f; normals.points[12].normal[2] = -0.656282f;
- normals.points[13].normal[0] = -0.760228f; normals.points[13].normal[1] = -0.342020f; normals.points[13].normal[2] = -0.552337f;
- normals.points[14].normal[0] = 0.760228f; normals.points[14].normal[1] = -0.342020f; normals.points[14].normal[2] = -0.552337f;
- normals.points[15].normal[0] = -0.893701f; normals.points[15].normal[1] = -0.342020f; normals.points[15].normal[2] = -0.290380f;
- normals.points[16].normal[0] = 0.893701f; normals.points[16].normal[1] = -0.342020f; normals.points[16].normal[2] = -0.290380f;
- normals.points[17].normal[0] = -0.624162f; normals.points[17].normal[1] = -0.342020f; normals.points[17].normal[2] = -0.624162f;
- normals.points[18].normal[0] = 0.499329f; normals.points[18].normal[1] = -0.342020f; normals.points[18].normal[2] = -0.687268f;
- normals.points[19].normal[0] = -0.893701f; normals.points[19].normal[1] = -0.342020f; normals.points[19].normal[2] = -0.290380f;
- normals.points[20].normal[0] = 0.893701f; normals.points[20].normal[1] = -0.342020f; normals.points[20].normal[2] = -0.290380f;
- normals.points[21].normal[0] = -0.893701f; normals.points[21].normal[1] = -0.342020f; normals.points[21].normal[2] = -0.290381f;
- normals.points[22].normal[0] = 0.893701f; normals.points[22].normal[1] = -0.342020f; normals.points[22].normal[2] = -0.290381f;
- normals.points[23].normal[0] = -0.939693f; normals.points[23].normal[1] = -0.342020f; normals.points[23].normal[2] = 0.000000f;
- normals.points[24].normal[0] = 0.939693f; normals.points[24].normal[1] = -0.342020f; normals.points[24].normal[2] = 0.000000f;
- normals.points[25].normal[0] = -0.939693f; normals.points[25].normal[1] = -0.342020f; normals.points[25].normal[2] = 0.000000f;
- normals.points[26].normal[0] = 0.939693f; normals.points[26].normal[1] = -0.342020f; normals.points[26].normal[2] = 0.000000f;
- normals.points[27].normal[0] = -0.939693f; normals.points[27].normal[1] = -0.342020f; normals.points[27].normal[2] = 0.000000f;
- normals.points[28].normal[0] = 0.939693f; normals.points[28].normal[1] = -0.342020f; normals.points[28].normal[2] = 0.000000f;
- normals.points[29].normal[0] = -0.939693f; normals.points[29].normal[1] = -0.342020f; normals.points[29].normal[2] = 0.000000f;
- normals.points[30].normal[0] = 0.939693f; normals.points[30].normal[1] = -0.342020f; normals.points[30].normal[2] = 0.000000f;
-
-
- // Create a shared cylinder model pointer directly
- SampleConsensusModelConePtr model (new SampleConsensusModelCone<PointXYZ, Normal> (cloud.makeShared ()));
- model->setInputNormals (normals.makeShared ());
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 3);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 31);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 7);
- EXPECT_NEAR (coeff[0], 0, 1e-2);
- EXPECT_NEAR (coeff[1], 0.1, 1e-2);
- EXPECT_NEAR (coeff[6], 0.349066, 1e-2);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 7);
- EXPECT_NEAR (coeff_refined[6], 0.349066 , 1e-2);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelCylinder)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- PointCloud<Normal> normals;
- cloud.points.resize (20); normals.points.resize (20);
-
- cloud.points[0].x = -0.499902f; cloud.points[0].y = 2.199701f; cloud.points[0].z = 0.000008f;
- cloud.points[1].x = -0.875397f; cloud.points[1].y = 2.030177f; cloud.points[1].z = 0.050104f;
- cloud.points[2].x = -0.995875f; cloud.points[2].y = 1.635973f; cloud.points[2].z = 0.099846f;
- cloud.points[3].x = -0.779523f; cloud.points[3].y = 1.285527f; cloud.points[3].z = 0.149961f;
- cloud.points[4].x = -0.373285f; cloud.points[4].y = 1.216488f; cloud.points[4].z = 0.199959f;
- cloud.points[5].x = -0.052893f; cloud.points[5].y = 1.475973f; cloud.points[5].z = 0.250101f;
- cloud.points[6].x = -0.036558f; cloud.points[6].y = 1.887591f; cloud.points[6].z = 0.299839f;
- cloud.points[7].x = -0.335048f; cloud.points[7].y = 2.171994f; cloud.points[7].z = 0.350001f;
- cloud.points[8].x = -0.745456f; cloud.points[8].y = 2.135528f; cloud.points[8].z = 0.400072f;
- cloud.points[9].x = -0.989282f; cloud.points[9].y = 1.803311f; cloud.points[9].z = 0.449983f;
- cloud.points[10].x = -0.900651f; cloud.points[10].y = 1.400701f; cloud.points[10].z = 0.500126f;
- cloud.points[11].x = -0.539658f; cloud.points[11].y = 1.201468f; cloud.points[11].z = 0.550079f;
- cloud.points[12].x = -0.151875f; cloud.points[12].y = 1.340951f; cloud.points[12].z = 0.599983f;
- cloud.points[13].x = -0.000724f; cloud.points[13].y = 1.724373f; cloud.points[13].z = 0.649882f;
- cloud.points[14].x = -0.188573f; cloud.points[14].y = 2.090983f; cloud.points[14].z = 0.699854f;
- cloud.points[15].x = -0.587925f; cloud.points[15].y = 2.192257f; cloud.points[15].z = 0.749956f;
- cloud.points[16].x = -0.927724f; cloud.points[16].y = 1.958846f; cloud.points[16].z = 0.800008f;
- cloud.points[17].x = -0.976888f; cloud.points[17].y = 1.549655f; cloud.points[17].z = 0.849970f;
- cloud.points[18].x = -0.702003f; cloud.points[18].y = 1.242707f; cloud.points[18].z = 0.899954f;
- cloud.points[19].x = -0.289916f; cloud.points[19].y = 1.246296f; cloud.points[19].z = 0.950075f;
-
- normals.points[0].normal[0] = 0.000098f; normals.points[0].normal[1] = 1.000098f; normals.points[0].normal[2] = 0.000008f;
- normals.points[1].normal[0] = -0.750891f; normals.points[1].normal[1] = 0.660413f; normals.points[1].normal[2] = 0.000104f;
- normals.points[2].normal[0] = -0.991765f; normals.points[2].normal[1] = -0.127949f; normals.points[2].normal[2] = -0.000154f;
- normals.points[3].normal[0] = -0.558918f; normals.points[3].normal[1] = -0.829439f; normals.points[3].normal[2] = -0.000039f;
- normals.points[4].normal[0] = 0.253627f; normals.points[4].normal[1] = -0.967447f; normals.points[4].normal[2] = -0.000041f;
- normals.points[5].normal[0] = 0.894105f; normals.points[5].normal[1] = -0.447965f; normals.points[5].normal[2] = 0.000101f;
- normals.points[6].normal[0] = 0.926852f; normals.points[6].normal[1] = 0.375543f; normals.points[6].normal[2] = -0.000161f;
- normals.points[7].normal[0] = 0.329948f; normals.points[7].normal[1] = 0.943941f; normals.points[7].normal[2] = 0.000001f;
- normals.points[8].normal[0] = -0.490966f; normals.points[8].normal[1] = 0.871203f; normals.points[8].normal[2] = 0.000072f;
- normals.points[9].normal[0] = -0.978507f; normals.points[9].normal[1] = 0.206425f; normals.points[9].normal[2] = -0.000017f;
- normals.points[10].normal[0] = -0.801227f; normals.points[10].normal[1] = -0.598534f; normals.points[10].normal[2] = 0.000126f;
- normals.points[11].normal[0] = -0.079447f; normals.points[11].normal[1] = -0.996697f; normals.points[11].normal[2] = 0.000079f;
- normals.points[12].normal[0] = 0.696154f; normals.points[12].normal[1] = -0.717889f; normals.points[12].normal[2] = -0.000017f;
- normals.points[13].normal[0] = 0.998685f; normals.points[13].normal[1] = 0.048502f; normals.points[13].normal[2] = -0.000118f;
- normals.points[14].normal[0] = 0.622933f; normals.points[14].normal[1] = 0.782133f; normals.points[14].normal[2] = -0.000146f;
- normals.points[15].normal[0] = -0.175948f; normals.points[15].normal[1] = 0.984480f; normals.points[15].normal[2] = -0.000044f;
- normals.points[16].normal[0] = -0.855476f; normals.points[16].normal[1] = 0.517824f; normals.points[16].normal[2] = 0.000008f;
- normals.points[17].normal[0] = -0.953769f; normals.points[17].normal[1] = -0.300571f; normals.points[17].normal[2] = -0.000030f;
- normals.points[18].normal[0] = -0.404035f; normals.points[18].normal[1] = -0.914700f; normals.points[18].normal[2] = -0.000046f;
- normals.points[19].normal[0] = 0.420154f; normals.points[19].normal[1] = -0.907445f; normals.points[19].normal[2] = 0.000075f;
-
- // Create a shared cylinder model pointer directly
- SampleConsensusModelCylinderPtr model (new SampleConsensusModelCylinder<PointXYZ, Normal> (cloud.makeShared ()));
- model->setInputNormals (normals.makeShared ());
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 2);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 20);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 7);
- EXPECT_NEAR (coeff[0], -0.5, 1e-3);
- EXPECT_NEAR (coeff[1], 1.7, 1e-3);
- EXPECT_NEAR (coeff[6], 0.5, 1e-3);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 7);
- EXPECT_NEAR (coeff_refined[6], 0.5, 1e-3);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelCircle2D)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- cloud.points.resize (18);
-
- cloud.points[0].x = 3.587751f; cloud.points[0].y = -4.190982f; cloud.points[0].z = 0.0f;
- cloud.points[1].x = 3.808883f; cloud.points[1].y = -4.412265f; cloud.points[1].z = 0.0f;
- cloud.points[2].x = 3.587525f; cloud.points[2].y = -5.809143f; cloud.points[2].z = 0.0f;
- cloud.points[3].x = 2.999913f; cloud.points[3].y = -5.999980f; cloud.points[3].z = 0.0f;
- cloud.points[4].x = 2.412224f; cloud.points[4].y = -5.809090f; cloud.points[4].z = 0.0f;
- cloud.points[5].x = 2.191080f; cloud.points[5].y = -5.587682f; cloud.points[5].z = 0.0f;
- cloud.points[6].x = 2.048941f; cloud.points[6].y = -5.309003f; cloud.points[6].z = 0.0f;
- cloud.points[7].x = 2.000397f; cloud.points[7].y = -4.999944f; cloud.points[7].z = 0.0f;
- cloud.points[8].x = 2.999953f; cloud.points[8].y = -6.000056f; cloud.points[8].z = 0.0f;
- cloud.points[9].x = 2.691127f; cloud.points[9].y = -5.951136f; cloud.points[9].z = 0.0f;
- cloud.points[10].x = 2.190892f; cloud.points[10].y = -5.587838f; cloud.points[10].z = 0.0f;
- cloud.points[11].x = 2.048874f; cloud.points[11].y = -5.309052f; cloud.points[11].z = 0.0f;
- cloud.points[12].x = 1.999990f; cloud.points[12].y = -5.000147f; cloud.points[12].z = 0.0f;
- cloud.points[13].x = 2.049026f; cloud.points[13].y = -4.690918f; cloud.points[13].z = 0.0f;
- cloud.points[14].x = 2.190956f; cloud.points[14].y = -4.412162f; cloud.points[14].z = 0.0f;
- cloud.points[15].x = 2.412231f; cloud.points[15].y = -4.190918f; cloud.points[15].z = 0.0f;
- cloud.points[16].x = 2.691027f; cloud.points[16].y = -4.049060f; cloud.points[16].z = 0.0f;
- cloud.points[17].x = 2.0f; cloud.points[17].y = -3.0f; cloud.points[17].z = 0.0f;
-
- // Create a shared 2d circle model pointer directly
- SampleConsensusModelCircle2DPtr model (new SampleConsensusModelCircle2D<PointXYZ> (cloud.makeShared ()));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 3);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 17);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 3);
- EXPECT_NEAR (coeff[0], 3, 1e-3);
- EXPECT_NEAR (coeff[1], -5, 1e-3);
- EXPECT_NEAR (coeff[2], 1, 1e-3);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 3);
- EXPECT_NEAR (coeff_refined[0], 3, 1e-3);
- EXPECT_NEAR (coeff_refined[1], -5, 1e-3);
- EXPECT_NEAR (coeff_refined[2], 1, 1e-3);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelCircle3D)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- cloud.points.resize (20);
-
- cloud.points[0].x = 1.0f; cloud.points[0].y = 5.0f; cloud.points[0].z = -2.9000001f;
- cloud.points[1].x = 1.034202f; cloud.points[1].y = 5.0f; cloud.points[1].z = -2.9060307f;
- cloud.points[2].x = 1.0642787f; cloud.points[2].y = 5.0f; cloud.points[2].z = -2.9233956f;
- cloud.points[3].x = 1.0866026f; cloud.points[3].y = 5.0f; cloud.points[3].z = -2.95f;
- cloud.points[4].x = 1.0984808f; cloud.points[4].y = 5.0f; cloud.points[4].z = -2.9826353f;
- cloud.points[5].x = 1.0984808f; cloud.points[5].y = 5.0f; cloud.points[5].z = -3.0173647f;
- cloud.points[6].x = 1.0866026f; cloud.points[6].y = 5.0f; cloud.points[6].z = -3.05f;
- cloud.points[7].x = 1.0642787f; cloud.points[7].y = 5.0f; cloud.points[7].z = -3.0766044f;
- cloud.points[8].x = 1.034202f; cloud.points[8].y = 5.0f; cloud.points[8].z = -3.0939693f;
- cloud.points[9].x = 1.0f; cloud.points[9].y = 5.0f; cloud.points[9].z = -3.0999999f;
- cloud.points[10].x = 0.96579796f; cloud.points[10].y = 5.0f; cloud.points[10].z = -3.0939693f;
- cloud.points[11].x = 0.93572122f; cloud.points[11].y = 5.0f; cloud.points[11].z = -3.0766044f;
- cloud.points[12].x = 0.91339743f; cloud.points[12].y = 5.0f; cloud.points[12].z = -3.05f;
- cloud.points[13].x = 0.90151924f; cloud.points[13].y = 5.0f; cloud.points[13].z = -3.0173647f;
- cloud.points[14].x = 0.90151924f; cloud.points[14].y = 5.0f; cloud.points[14].z = -2.9826353f;
- cloud.points[15].x = 0.91339743f; cloud.points[15].y = 5.0f; cloud.points[15].z = -2.95f;
- cloud.points[16].x = 0.93572122f; cloud.points[16].y = 5.0f; cloud.points[16].z = -2.9233956f;
- cloud.points[17].x = 0.96579796f; cloud.points[17].y = 5.0; cloud.points[17].z = -2.9060307f;
- cloud.points[18].x = 0.85000002f; cloud.points[18].y = 4.8499999f; cloud.points[18].z = -3.1500001f;
- cloud.points[19].x = 1.15f; cloud.points[19].y = 5.1500001f; cloud.points[19].z = -2.8499999f;
-
- // Create a shared 3d circle model pointer directly
- SampleConsensusModelCircle3DPtr model (new SampleConsensusModelCircle3D<PointXYZ> (cloud.makeShared ()));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 3);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 18);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 7);
- EXPECT_NEAR (coeff[0], 1, 1e-3);
- EXPECT_NEAR (coeff[1], 5, 1e-3);
- EXPECT_NEAR (coeff[2], -3, 1e-3);
- EXPECT_NEAR (coeff[3],0.1, 1e-3);
- EXPECT_NEAR (coeff[4], 0, 1e-3);
- EXPECT_NEAR (coeff[5], -1, 1e-3);
- EXPECT_NEAR (coeff[6], 0, 1e-3);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 7);
- EXPECT_NEAR (coeff_refined[0], 1, 1e-3);
- EXPECT_NEAR (coeff_refined[1], 5, 1e-3);
- EXPECT_NEAR (coeff_refined[2], -3, 1e-3);
- EXPECT_NEAR (coeff_refined[3],0.1, 1e-3);
- EXPECT_NEAR (coeff_refined[4], 0, 1e-3);
- EXPECT_NEAR (coeff_refined[5], -1, 1e-3);
- EXPECT_NEAR (coeff_refined[6], 0, 1e-3);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelLine)
-{
- srand (0);
-
- // Use a custom point cloud for these tests until we need something better
- PointCloud<PointXYZ> cloud;
- cloud.points.resize (10);
-
- cloud.points[0].x = 1.0f; cloud.points[0].y = 2.0f; cloud.points[0].z = 3.0f;
- cloud.points[1].x = 4.0f; cloud.points[1].y = 5.0f; cloud.points[1].z = 6.0f;
- cloud.points[2].x = 7.0f; cloud.points[2].y = 8.0f; cloud.points[2].z = 9.0f;
- cloud.points[3].x = 10.0f; cloud.points[3].y = 11.0f; cloud.points[3].z = 12.0f;
- cloud.points[4].x = 13.0f; cloud.points[4].y = 14.0f; cloud.points[4].z = 15.0f;
- cloud.points[5].x = 16.0f; cloud.points[5].y = 17.0f; cloud.points[5].z = 18.0f;
- cloud.points[6].x = 19.0f; cloud.points[6].y = 20.0f; cloud.points[6].z = 21.0f;
- cloud.points[7].x = 22.0f; cloud.points[7].y = 23.0f; cloud.points[7].z = 24.0f;
- cloud.points[8].x = -5.0f; cloud.points[8].y = 1.57f; cloud.points[8].z = 0.75f;
- cloud.points[9].x = 4.0f; cloud.points[9].y = 2.0f; cloud.points[9].z = 3.0f;
-
- // Create a shared line model pointer directly
- SampleConsensusModelLinePtr model (new SampleConsensusModelLine<PointXYZ> (cloud.makeShared ()));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.001);
-
- // Algorithm tests
- bool result = sac.computeModel ();
- ASSERT_EQ (result, true);
-
- std::vector<int> sample;
- sac.getModel (sample);
- EXPECT_EQ (int (sample.size ()), 2);
-
- std::vector<int> inliers;
- sac.getInliers (inliers);
- EXPECT_EQ (int (inliers.size ()), 8);
-
- Eigen::VectorXf coeff;
- sac.getModelCoefficients (coeff);
- EXPECT_EQ (int (coeff.size ()), 6);
- EXPECT_NEAR (coeff[4]/coeff[3], 1, 1e-4);
- EXPECT_NEAR (coeff[5]/coeff[3], 1, 1e-4);
-
- Eigen::VectorXf coeff_refined;
- model->optimizeModelCoefficients (inliers, coeff, coeff_refined);
- EXPECT_EQ (int (coeff_refined.size ()), 6);
- EXPECT_NEAR (coeff[4]/coeff[3], 1, 1e-4);
- EXPECT_NEAR (coeff[5]/coeff[3], 1, 1e-4);
-
- // Projection tests
- PointCloud<PointXYZ> proj_points;
- model->projectPoints (inliers, coeff_refined, proj_points);
-
- EXPECT_NEAR (proj_points.points[2].x, 7.0, 1e-4);
- EXPECT_NEAR (proj_points.points[2].y, 8.0, 1e-4);
- EXPECT_NEAR (proj_points.points[2].z, 9.0, 1e-4);
-
- EXPECT_NEAR (proj_points.points[3].x, 10.0, 1e-4);
- EXPECT_NEAR (proj_points.points[3].y, 11.0, 1e-4);
- EXPECT_NEAR (proj_points.points[3].z, 12.0, 1e-4);
-
- EXPECT_NEAR (proj_points.points[5].x, 16.0, 1e-4);
- EXPECT_NEAR (proj_points.points[5].y, 17.0, 1e-4);
- EXPECT_NEAR (proj_points.points[5].z, 18.0, 1e-4);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-TEST (RANSAC, SampleConsensusModelNormalPlane)
-{
- srand (0);
- // Create a shared plane model pointer directly
- SampleConsensusModelNormalPlanePtr model (new SampleConsensusModelNormalPlane<PointXYZ, Normal> (cloud_));
- model->setInputNormals (normals_);
- model->setNormalDistanceWeight (0.01);
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> sac (model, 0.03);
-
- verifyPlaneSac (model, sac);
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Test if RANSAC finishes within a second.
-TEST (SAC, InfiniteLoop)
-{
- const unsigned point_count = 100;
- PointCloud<PointXYZ> cloud;
- cloud.points.resize (point_count);
- for (unsigned pIdx = 0; pIdx < point_count; ++pIdx)
- {
- cloud.points[pIdx].x = static_cast<float> (pIdx);
- cloud.points[pIdx].y = 0.0;
- cloud.points[pIdx].z = 0.0;
- }
-
- boost::posix_time::time_duration delay(0,0,1,0);
- boost::function<bool ()> sac_function;
- SampleConsensusModelSpherePtr model (new SampleConsensusModelSphere<PointXYZ> (cloud.makeShared ()));
-
- // Create the RANSAC object
- RandomSampleConsensus<PointXYZ> ransac (model, 0.03);
- sac_function = boost::bind (&RandomSampleConsensus<PointXYZ>::computeModel, &ransac, 0);
- boost::thread thread1 (sac_function);
- ASSERT_TRUE(thread1.timed_join(delay));
-
- // Create the LMSAC object
- LeastMedianSquares<PointXYZ> lmsac (model, 0.03);
- sac_function = boost::bind (&LeastMedianSquares<PointXYZ>::computeModel, &lmsac, 0);
- boost::thread thread2 (sac_function);
- ASSERT_TRUE(thread2.timed_join(delay));
-
- // Create the MSAC object
- MEstimatorSampleConsensus<PointXYZ> mesac (model, 0.03);
- sac_function = boost::bind (&MEstimatorSampleConsensus<PointXYZ>::computeModel, &mesac, 0);
- boost::thread thread3 (sac_function);
- ASSERT_TRUE(thread3.timed_join(delay));
-
- // Create the RRSAC object
- RandomizedRandomSampleConsensus<PointXYZ> rrsac (model, 0.03);
- sac_function = boost::bind (&RandomizedRandomSampleConsensus<PointXYZ>::computeModel, &rrsac, 0);
- boost::thread thread4 (sac_function);
- ASSERT_TRUE(thread4.timed_join(delay));
-
- // Create the RMSAC object
- RandomizedMEstimatorSampleConsensus<PointXYZ> rmsac (model, 0.03);
- sac_function = boost::bind (&RandomizedMEstimatorSampleConsensus<PointXYZ>::computeModel, &rmsac, 0);
- boost::thread thread5 (sac_function);
- ASSERT_TRUE(thread5.timed_join(delay));
-
- // Create the MLESAC object
- MaximumLikelihoodSampleConsensus<PointXYZ> mlesac (model, 0.03);
- sac_function = boost::bind (&MaximumLikelihoodSampleConsensus<PointXYZ>::computeModel, &mlesac, 0);
- boost::thread thread6 (sac_function);
- ASSERT_TRUE(thread6.timed_join(delay));
-}
-
-/* ---[ */
-int
- main (int argc, char** argv)
-{
- if (argc < 2)
- {
- std::cerr << "No test file given. Please download `sac_plane_test.pcd` and pass its path to the test." << std::endl;
- return (-1);
- }
-
- // Load a standard PCD file from disk
- pcl::PCLPointCloud2 cloud_blob;
- if (loadPCDFile (argv[1], cloud_blob) < 0)
- {
- std::cerr << "Failed to read test file. Please download `sac_plane_test.pcd` and pass its path to the test." << std::endl;
- return (-1);
- }
- fromPCLPointCloud2 (cloud_blob, *cloud_);
-
- indices_.resize (cloud_->points.size ());
- for (size_t i = 0; i < indices_.size (); ++i) { indices_[i] = int (i); }
-
- // Estimate surface normals
- NormalEstimation<PointXYZ, Normal> n;
- search::Search<PointXYZ>::Ptr tree (new search::KdTree<PointXYZ>);
- tree->setInputCloud (cloud_);
- n.setInputCloud (cloud_);
- boost::shared_ptr<vector<int> > indicesptr (new vector<int> (indices_));
- n.setIndices (indicesptr);
- n.setSearchMethod (tree);
- n.setRadiusSearch (0.02); // Use 2cm radius to estimate the normals
- n.compute (*normals_);
-
- testing::InitGoogleTest (&argc, argv);
- return (RUN_ALL_TESTS ());
-}
-/* ]--- */
EXPECT_NEAR (centroid[0], -0.0290809, 1e-4);
EXPECT_NEAR (centroid[1], 0.102653, 1e-4);
EXPECT_NEAR (centroid[2], 0.027302, 1e-4);
- EXPECT_NEAR (centroid[3], 0, 1e-4);
+ EXPECT_NEAR (centroid[3], 1, 1e-4);
// Check standard demean
demeanPointCloud (cloud, centroid, cloud_demean);
set (DEFAULT ON)
set (REASON "")
-PCL_SUBSYS_OPTION (build ${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND (build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION (BUILD_tools "${SUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSYS_DEPEND (BUILD_tools "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-if (build)
+if (BUILD_tools)
- PCL_ADD_EXECUTABLE(pcl_sac_segmentation_plane ${SUBSYS_NAME} sac_segmentation_plane.cpp)
+ PCL_ADD_EXECUTABLE(pcl_sac_segmentation_plane "${SUBSYS_NAME}" sac_segmentation_plane.cpp)
target_link_libraries(pcl_sac_segmentation_plane pcl_common pcl_io pcl_sample_consensus pcl_segmentation)
- PCL_ADD_EXECUTABLE (pcl_plane_projection ${SUBSYS_NAME} plane_projection.cpp)
+ PCL_ADD_EXECUTABLE (pcl_plane_projection "${SUBSYS_NAME}" plane_projection.cpp)
target_link_libraries (pcl_plane_projection pcl_common pcl_io pcl_sample_consensus)
- PCL_ADD_EXECUTABLE (pcl_normal_estimation ${SUBSYS_NAME} normal_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_normal_estimation "${SUBSYS_NAME}" normal_estimation.cpp)
target_link_libraries (pcl_normal_estimation pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_uniform_sampling ${SUBSYS_NAME} uniform_sampling.cpp)
+ PCL_ADD_EXECUTABLE (pcl_uniform_sampling "${SUBSYS_NAME}" uniform_sampling.cpp)
target_link_libraries (pcl_uniform_sampling pcl_common pcl_io pcl_filters pcl_keypoints pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_boundary_estimation ${SUBSYS_NAME} boundary_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_boundary_estimation "${SUBSYS_NAME}" boundary_estimation.cpp)
target_link_libraries (pcl_boundary_estimation pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_cluster_extraction ${SUBSYS_NAME} cluster_extraction.cpp)
+ PCL_ADD_EXECUTABLE (pcl_cluster_extraction "${SUBSYS_NAME}" cluster_extraction.cpp)
target_link_libraries (pcl_cluster_extraction pcl_common pcl_io pcl_segmentation pcl_filters pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_fpfh_estimation ${SUBSYS_NAME} fpfh_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_fpfh_estimation "${SUBSYS_NAME}" fpfh_estimation.cpp)
target_link_libraries (pcl_fpfh_estimation pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_pcd2ply ${SUBSYS_NAME} pcd2ply.cpp)
+ PCL_ADD_EXECUTABLE (pcl_pcd2ply "${SUBSYS_NAME}" pcd2ply.cpp)
target_link_libraries (pcl_pcd2ply pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_ply2pcd ${SUBSYS_NAME} ply2pcd.cpp)
+ PCL_ADD_EXECUTABLE (pcl_ply2pcd "${SUBSYS_NAME}" ply2pcd.cpp)
target_link_libraries (pcl_ply2pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_xyz2pcd ${SUBSYS_NAME} xyz2pcd.cpp)
+ PCL_ADD_EXECUTABLE (pcl_xyz2pcd "${SUBSYS_NAME}" xyz2pcd.cpp)
target_link_libraries (pcl_xyz2pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_pclzf2pcd ${SUBSYS_NAME} pclzf2pcd.cpp)
+ PCL_ADD_EXECUTABLE (pcl_pclzf2pcd "${SUBSYS_NAME}" pclzf2pcd.cpp)
target_link_libraries (pcl_pclzf2pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_pcd2vtk ${SUBSYS_NAME} pcd2vtk.cpp)
+ PCL_ADD_EXECUTABLE (pcl_pcd2vtk "${SUBSYS_NAME}" pcd2vtk.cpp)
target_link_libraries (pcl_pcd2vtk pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_vfh_estimation ${SUBSYS_NAME} vfh_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_vfh_estimation "${SUBSYS_NAME}" vfh_estimation.cpp)
target_link_libraries (pcl_vfh_estimation pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_spin_estimation ${SUBSYS_NAME} spin_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_spin_estimation "${SUBSYS_NAME}" spin_estimation.cpp)
target_link_libraries (pcl_spin_estimation pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_voxel_grid ${SUBSYS_NAME} voxel_grid.cpp)
+ PCL_ADD_EXECUTABLE (pcl_voxel_grid "${SUBSYS_NAME}" voxel_grid.cpp)
target_link_libraries (pcl_voxel_grid pcl_common pcl_io pcl_filters)
- PCL_ADD_EXECUTABLE (pcl_passthrough_filter ${SUBSYS_NAME} passthrough_filter.cpp)
+ PCL_ADD_EXECUTABLE (pcl_passthrough_filter "${SUBSYS_NAME}" passthrough_filter.cpp)
target_link_libraries (pcl_passthrough_filter pcl_common pcl_io pcl_filters)
- PCL_ADD_EXECUTABLE (pcl_radius_filter ${SUBSYS_NAME} radius_filter.cpp)
+ PCL_ADD_EXECUTABLE (pcl_radius_filter "${SUBSYS_NAME}" radius_filter.cpp)
target_link_libraries (pcl_radius_filter pcl_common pcl_io pcl_filters)
- PCL_ADD_EXECUTABLE (pcl_extract_feature ${SUBSYS_NAME} extract_feature.cpp)
+ PCL_ADD_EXECUTABLE (pcl_extract_feature "${SUBSYS_NAME}" extract_feature.cpp)
target_link_libraries (pcl_extract_feature pcl_common pcl_io pcl_features pcl_kdtree)
- PCL_ADD_EXECUTABLE (pcl_compute_cloud_error ${SUBSYS_NAME} compute_cloud_error.cpp)
+ PCL_ADD_EXECUTABLE (pcl_compute_cloud_error "${SUBSYS_NAME}" compute_cloud_error.cpp)
target_link_libraries (pcl_compute_cloud_error pcl_common pcl_io pcl_kdtree pcl_search)
# NOTE: boost/uuid/uuid.hpp only exists for versions > 1.41
if(Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 41)
- PCL_ADD_EXECUTABLE (pcl_add_gaussian_noise ${SUBSYS_NAME} add_gaussian_noise.cpp)
+ PCL_ADD_EXECUTABLE (pcl_add_gaussian_noise "${SUBSYS_NAME}" add_gaussian_noise.cpp)
target_link_libraries (pcl_add_gaussian_noise pcl_common pcl_io)
endif()
- PCL_ADD_EXECUTABLE (pcl_outlier_removal ${SUBSYS_NAME} outlier_removal.cpp)
+ PCL_ADD_EXECUTABLE (pcl_outlier_removal "${SUBSYS_NAME}" outlier_removal.cpp)
target_link_libraries (pcl_outlier_removal pcl_common pcl_io pcl_filters)
- PCL_ADD_EXECUTABLE (pcl_mls_smoothing ${SUBSYS_NAME} mls_smoothing.cpp)
+ PCL_ADD_EXECUTABLE (pcl_mls_smoothing "${SUBSYS_NAME}" mls_smoothing.cpp)
target_link_libraries (pcl_mls_smoothing pcl_common pcl_io pcl_surface pcl_filters)
- PCL_ADD_EXECUTABLE (pcl_marching_cubes_reconstruction ${SUBSYS_NAME} marching_cubes_reconstruction.cpp)
+ PCL_ADD_EXECUTABLE (pcl_marching_cubes_reconstruction "${SUBSYS_NAME}" marching_cubes_reconstruction.cpp)
target_link_libraries (pcl_marching_cubes_reconstruction pcl_common pcl_io pcl_surface)
- PCL_ADD_EXECUTABLE (pcl_gp3_surface ${SUBSYS_NAME} gp3_surface.cpp)
+ PCL_ADD_EXECUTABLE (pcl_gp3_surface "${SUBSYS_NAME}" gp3_surface.cpp)
target_link_libraries (pcl_gp3_surface pcl_common pcl_io pcl_surface)
- PCL_ADD_EXECUTABLE(pcl_icp ${SUBSYS_NAME} icp.cpp)
+ PCL_ADD_EXECUTABLE(pcl_icp "${SUBSYS_NAME}" icp.cpp)
target_link_libraries(pcl_icp pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_icp2d ${SUBSYS_NAME} icp2d.cpp)
+ PCL_ADD_EXECUTABLE(pcl_icp2d "${SUBSYS_NAME}" icp2d.cpp)
target_link_libraries(pcl_icp2d pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_elch ${SUBSYS_NAME} elch.cpp)
+ PCL_ADD_EXECUTABLE(pcl_elch "${SUBSYS_NAME}" elch.cpp)
target_link_libraries(pcl_elch pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_lum ${SUBSYS_NAME} lum.cpp)
+ PCL_ADD_EXECUTABLE(pcl_lum "${SUBSYS_NAME}" lum.cpp)
target_link_libraries(pcl_lum pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_ndt2d ${SUBSYS_NAME} ndt2d.cpp)
+ PCL_ADD_EXECUTABLE(pcl_ndt2d "${SUBSYS_NAME}" ndt2d.cpp)
target_link_libraries(pcl_ndt2d pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_ndt3d ${SUBSYS_NAME} ndt3d.cpp)
+ PCL_ADD_EXECUTABLE(pcl_ndt3d "${SUBSYS_NAME}" ndt3d.cpp)
target_link_libraries(pcl_ndt3d pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE(pcl_pcd_change_viewpoint ${SUBSYS_NAME} pcd_change_viewpoint.cpp)
+ PCL_ADD_EXECUTABLE(pcl_pcd_change_viewpoint "${SUBSYS_NAME}" pcd_change_viewpoint.cpp)
target_link_libraries(pcl_pcd_change_viewpoint pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_concatenate_points_pcd ${SUBSYS_NAME} concatenate_points_pcd.cpp)
+ PCL_ADD_EXECUTABLE(pcl_concatenate_points_pcd "${SUBSYS_NAME}" concatenate_points_pcd.cpp)
target_link_libraries(pcl_concatenate_points_pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_poisson_reconstruction ${SUBSYS_NAME} poisson_reconstruction.cpp)
+ PCL_ADD_EXECUTABLE(pcl_poisson_reconstruction "${SUBSYS_NAME}" poisson_reconstruction.cpp)
target_link_libraries(pcl_poisson_reconstruction pcl_common pcl_io pcl_surface)
- PCL_ADD_EXECUTABLE(pcl_train_linemod_template ${SUBSYS_NAME} train_linemod_template.cpp)
+ PCL_ADD_EXECUTABLE(pcl_train_linemod_template "${SUBSYS_NAME}" train_linemod_template.cpp)
target_link_libraries(pcl_train_linemod_template pcl_common pcl_io pcl_segmentation pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_match_linemod_template ${SUBSYS_NAME} match_linemod_template.cpp)
+ PCL_ADD_EXECUTABLE(pcl_match_linemod_template "${SUBSYS_NAME}" match_linemod_template.cpp)
target_link_libraries(pcl_match_linemod_template pcl_common pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_linemod_detection ${SUBSYS_NAME} linemod_detection.cpp)
+ PCL_ADD_EXECUTABLE(pcl_linemod_detection "${SUBSYS_NAME}" linemod_detection.cpp)
target_link_libraries(pcl_linemod_detection pcl_common pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_fast_bilateral_filter ${SUBSYS_NAME} fast_bilateral_filter.cpp)
+ PCL_ADD_EXECUTABLE(pcl_fast_bilateral_filter "${SUBSYS_NAME}" fast_bilateral_filter.cpp)
target_link_libraries(pcl_fast_bilateral_filter pcl_common pcl_io pcl_filters)
- PCL_ADD_EXECUTABLE(pcl_demean_cloud ${SUBSYS_NAME} demean_cloud.cpp)
+ PCL_ADD_EXECUTABLE(pcl_demean_cloud "${SUBSYS_NAME}" demean_cloud.cpp)
target_link_libraries(pcl_demean_cloud pcl_common pcl_io)
+ PCL_ADD_EXECUTABLE(pcl_compute_hausdorff "${SUBSYS_NAME}" compute_hausdorff.cpp)
+ target_link_libraries(pcl_compute_hausdorff pcl_common pcl_io pcl_search)
+
+ PCL_ADD_EXECUTABLE(pcl_morph "${SUBSYS_NAME}" morph.cpp)
+ target_link_libraries(pcl_morph pcl_common pcl_io pcl_filters)
+
+ PCL_ADD_EXECUTABLE(pcl_progressive_morphological_filter "${SUBSYS_NAME}" progressive_morphological_filter.cpp)
+ target_link_libraries(pcl_progressive_morphological_filter pcl_common pcl_io pcl_filters pcl_segmentation)
+
+ PCL_ADD_EXECUTABLE(pcl_generate "${SUBSYS_NAME}" generate.cpp)
+ target_link_libraries(pcl_generate pcl_common pcl_io)
+
+ PCL_ADD_EXECUTABLE(pcl_local_max "${SUBSYS_NAME}" local_max.cpp)
+ target_link_libraries(pcl_local_max pcl_common pcl_io pcl_filters)
+
+ PCL_ADD_EXECUTABLE(pcl_grid_min "${SUBSYS_NAME}" grid_min.cpp)
+ target_link_libraries(pcl_grid_min pcl_common pcl_io pcl_filters)
if(BUILD_OPENNI AND OPENNI_FOUND)
- PCL_ADD_EXECUTABLE(pcl_oni2pcd ${SUBSYS_NAME} oni2pcd.cpp)
+ PCL_ADD_EXECUTABLE(pcl_oni2pcd "${SUBSYS_NAME}" oni2pcd.cpp)
target_link_libraries(pcl_oni2pcd pcl_common pcl_io)
endif(BUILD_OPENNI AND OPENNI_FOUND)
if (QHULL_FOUND)
- PCL_ADD_EXECUTABLE(pcl_crop_to_hull ${SUBSYS_NAME} crop_to_hull.cpp)
+ PCL_ADD_EXECUTABLE(pcl_crop_to_hull "${SUBSYS_NAME}" crop_to_hull.cpp)
target_link_libraries(pcl_crop_to_hull pcl_common pcl_io pcl_filters pcl_surface)
- PCL_ADD_EXECUTABLE(pcl_compute_hull ${SUBSYS_NAME} compute_hull.cpp)
+ PCL_ADD_EXECUTABLE(pcl_compute_hull "${SUBSYS_NAME}" compute_hull.cpp)
target_link_libraries(pcl_compute_hull pcl_common pcl_io pcl_surface)
endif (QHULL_FOUND)
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
- PCL_ADD_EXECUTABLE(pcl_png2pcd ${SUBSYS_NAME} png2pcd.cpp)
+ PCL_ADD_EXECUTABLE(pcl_png2pcd "${SUBSYS_NAME}" png2pcd.cpp)
target_link_libraries(pcl_png2pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_pcd2png ${SUBSYS_NAME} pcd2png.cpp)
+ PCL_ADD_EXECUTABLE(pcl_pcd2png "${SUBSYS_NAME}" pcd2png.cpp)
target_link_libraries(pcl_pcd2png pcl_common pcl_io)
- PCL_ADD_EXECUTABLE (pcl_organized_pcd_to_png ${SUBSYS_NAME} organized_pcd_to_png.cpp)
+ PCL_ADD_EXECUTABLE (pcl_organized_pcd_to_png "${SUBSYS_NAME}" organized_pcd_to_png.cpp)
target_link_libraries (pcl_organized_pcd_to_png pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_tiff2pcd ${SUBSYS_NAME} tiff2pcd.cpp)
+ PCL_ADD_EXECUTABLE(pcl_tiff2pcd "${SUBSYS_NAME}" tiff2pcd.cpp)
target_link_libraries(pcl_tiff2pcd pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_ply2vtk ${SUBSYS_NAME} ply2vtk.cpp)
+ PCL_ADD_EXECUTABLE(pcl_ply2vtk "${SUBSYS_NAME}" ply2vtk.cpp)
target_link_libraries(pcl_ply2vtk pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_vtk2ply ${SUBSYS_NAME} vtk2ply.cpp)
+ PCL_ADD_EXECUTABLE(pcl_vtk2ply "${SUBSYS_NAME}" vtk2ply.cpp)
target_link_libraries(pcl_vtk2ply pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_vtk2obj ${SUBSYS_NAME} vtk2obj.cpp)
+ PCL_ADD_EXECUTABLE(pcl_vtk2obj "${SUBSYS_NAME}" vtk2obj.cpp)
target_link_libraries(pcl_vtk2obj pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_obj2vtk ${SUBSYS_NAME} obj2vtk.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj2vtk "${SUBSYS_NAME}" obj2vtk.cpp)
target_link_libraries(pcl_obj2vtk pcl_common pcl_io)
- PCL_ADD_EXECUTABLE(pcl_vtk2pcd ${SUBSYS_NAME} vtk2pcd.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj2pcd "${SUBSYS_NAME}" obj2pcd.cpp)
+ target_link_libraries(pcl_obj2pcd pcl_common pcl_io)
+
+ PCL_ADD_EXECUTABLE(pcl_vtk2pcd "${SUBSYS_NAME}" vtk2pcd.cpp)
target_link_libraries(pcl_vtk2pcd pcl_common pcl_io)
if(BUILD_visualization)
-
- PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS visualization)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_model_opps ${SUBSYS_NAME} obj_rec_ransac_model_opps.cpp)
+ PCL_SUBSYS_DEPEND(BUILD_tools "${SUBSYS_NAME}" DEPS visualization)
+
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_model_opps "${SUBSYS_NAME}" obj_rec_ransac_model_opps.cpp)
target_link_libraries(pcl_obj_rec_ransac_model_opps pcl_common pcl_visualization pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_hash_table ${SUBSYS_NAME} obj_rec_ransac_hash_table.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_hash_table "${SUBSYS_NAME}" obj_rec_ransac_hash_table.cpp)
target_link_libraries(pcl_obj_rec_ransac_hash_table pcl_common pcl_visualization pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_scene_opps ${SUBSYS_NAME} obj_rec_ransac_scene_opps.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_scene_opps "${SUBSYS_NAME}" obj_rec_ransac_scene_opps.cpp)
target_link_libraries(pcl_obj_rec_ransac_scene_opps pcl_common pcl_visualization pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_accepted_hypotheses ${SUBSYS_NAME} obj_rec_ransac_accepted_hypotheses.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_accepted_hypotheses "${SUBSYS_NAME}" obj_rec_ransac_accepted_hypotheses.cpp)
target_link_libraries(pcl_obj_rec_ransac_accepted_hypotheses pcl_common pcl_visualization pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_orr_octree ${SUBSYS_NAME} obj_rec_ransac_orr_octree.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_orr_octree "${SUBSYS_NAME}" obj_rec_ransac_orr_octree.cpp)
target_link_libraries(pcl_obj_rec_ransac_orr_octree pcl_common pcl_visualization pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_orr_octree_zprojection ${SUBSYS_NAME} obj_rec_ransac_orr_octree_zprojection.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_orr_octree_zprojection "${SUBSYS_NAME}" obj_rec_ransac_orr_octree_zprojection.cpp)
target_link_libraries(pcl_obj_rec_ransac_orr_octree_zprojection pcl_common pcl_visualization pcl_io pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_result ${SUBSYS_NAME} obj_rec_ransac_result.cpp)
+ PCL_ADD_EXECUTABLE(pcl_obj_rec_ransac_result "${SUBSYS_NAME}" obj_rec_ransac_result.cpp)
target_link_libraries(pcl_obj_rec_ransac_result pcl_common pcl_visualization pcl_io pcl_segmentation pcl_recognition)
- PCL_ADD_EXECUTABLE(pcl_registration_visualizer ${SUBSYS_NAME} registration_visualizer.cpp)
+ PCL_ADD_EXECUTABLE(pcl_registration_visualizer "${SUBSYS_NAME}" registration_visualizer.cpp)
target_link_libraries(pcl_registration_visualizer pcl_common pcl_io pcl_kdtree pcl_filters pcl_registration pcl_visualization)
- PCL_ADD_EXECUTABLE(pcl_octree_viewer ${SUBSYS_NAME} octree_viewer.cpp)
+ PCL_ADD_EXECUTABLE(pcl_octree_viewer "${SUBSYS_NAME}" octree_viewer.cpp)
target_link_libraries(pcl_octree_viewer pcl_common pcl_io pcl_octree pcl_visualization pcl_kdtree pcl_filters)
- PCL_ADD_EXECUTABLE(pcl_mesh2pcd ${SUBSYS_NAME} mesh2pcd.cpp)
- target_link_libraries(pcl_mesh2pcd pcl_common pcl_io pcl_visualization pcl_filters vtkCommon)
+ PCL_ADD_EXECUTABLE(pcl_mesh2pcd "${SUBSYS_NAME}" mesh2pcd.cpp)
+ target_link_libraries(pcl_mesh2pcd pcl_common pcl_io pcl_visualization pcl_filters ${VTK_LIBRARIES})
- PCL_ADD_EXECUTABLE(pcl_mesh_sampling ${SUBSYS_NAME} mesh_sampling.cpp)
- target_link_libraries(pcl_mesh_sampling pcl_common pcl_io pcl_visualization pcl_filters vtkCommon)
+ PCL_ADD_EXECUTABLE(pcl_mesh_sampling "${SUBSYS_NAME}" mesh_sampling.cpp)
+ target_link_libraries(pcl_mesh_sampling pcl_common pcl_io pcl_visualization pcl_filters ${VTK_LIBRARIES})
- PCL_ADD_EXECUTABLE(pcl_virtual_scanner ${SUBSYS_NAME} virtual_scanner.cpp)
- target_link_libraries(pcl_virtual_scanner pcl_common pcl_io pcl_filters pcl_visualization vtkCommon vtkGraphics)
+ PCL_ADD_EXECUTABLE(pcl_virtual_scanner "${SUBSYS_NAME}" virtual_scanner.cpp)
+ target_link_libraries(pcl_virtual_scanner pcl_common pcl_io pcl_filters pcl_visualization ${VTK_LIBRARIES})
- PCL_ADD_EXECUTABLE (pcl_voxel_grid_occlusion_estimation ${SUBSYS_NAME} voxel_grid_occlusion_estimation.cpp)
+ PCL_ADD_EXECUTABLE (pcl_voxel_grid_occlusion_estimation "${SUBSYS_NAME}" voxel_grid_occlusion_estimation.cpp)
target_link_libraries (pcl_voxel_grid_occlusion_estimation pcl_common pcl_io pcl_filters pcl_visualization)
if(BUILD_OPENNI AND OPENNI_FOUND)
- PCL_ADD_EXECUTABLE(pcl_openni_save_image ${SUBSYS_NAME} openni_save_image.cpp)
+ PCL_ADD_EXECUTABLE(pcl_openni_save_image "${SUBSYS_NAME}" openni_save_image.cpp)
target_link_libraries(pcl_openni_save_image pcl_common pcl_io pcl_visualization)
endif(BUILD_OPENNI AND OPENNI_FOUND)
endif(BUILD_visualization)
endif(NOT VTK_FOUND)
- PCL_ADD_EXECUTABLE (pcl_transform_point_cloud ${SUBSYS_NAME} transform_point_cloud.cpp)
+ PCL_ADD_EXECUTABLE (pcl_transform_point_cloud "${SUBSYS_NAME}" transform_point_cloud.cpp)
target_link_libraries (pcl_transform_point_cloud pcl_common pcl_io pcl_registration)
- PCL_ADD_EXECUTABLE (pcl_transform_from_viewpoint ${SUBSYS_NAME} transform_from_viewpoint.cpp)
+ PCL_ADD_EXECUTABLE (pcl_transform_from_viewpoint "${SUBSYS_NAME}" transform_from_viewpoint.cpp)
target_link_libraries (pcl_transform_from_viewpoint pcl_common pcl_io pcl_registration)
find_package(tide QUIET)
if(Tide_FOUND)
include_directories(${Tide_INCLUDE_DIRS})
add_definitions(${Tide_DEFINITIONS})
- PCL_ADD_EXECUTABLE(pcl_video ${SUBSYS_NAME} pcl_video.cpp)
+ PCL_ADD_EXECUTABLE(pcl_video "${SUBSYS_NAME}" pcl_video.cpp)
target_link_libraries(pcl_video pcl_common pcl_io pcl_visualization
${Tide_LIBRARIES})
endif(Tide_FOUND)
-endif ()
+endif (BUILD_tools)
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/search/kdtree.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+using namespace pcl::search;
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s cloud_a.pcd cloud_b.pcd\n", argv[0]);
+}
+
+bool
+loadCloud (const std::string &filename, Cloud &cloud)
+{
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
+
+ tt.tic ();
+ if (loadPCDFile (filename, cloud) < 0)
+ return (false);
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+ print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
+
+ return (true);
+}
+
+void
+compute (Cloud &cloud_a, Cloud &cloud_b)
+{
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ // compare A to B
+ pcl::search::KdTree<PointType> tree_b;
+ tree_b.setInputCloud (cloud_b.makeShared ());
+ float max_dist_a = -std::numeric_limits<float>::max ();
+ for (size_t i = 0; i < cloud_a.points.size (); ++i)
+ {
+ std::vector<int> indices (1);
+ std::vector<float> sqr_distances (1);
+
+ tree_b.nearestKSearch (cloud_a.points[i], 1, indices, sqr_distances);
+ if (sqr_distances[0] > max_dist_a)
+ max_dist_a = sqr_distances[0];
+ }
+
+ // compare B to A
+ pcl::search::KdTree<PointType> tree_a;
+ tree_a.setInputCloud (cloud_a.makeShared ());
+ float max_dist_b = -std::numeric_limits<float>::max ();
+ for (size_t i = 0; i < cloud_b.points.size (); ++i)
+ {
+ std::vector<int> indices (1);
+ std::vector<float> sqr_distances (1);
+
+ tree_a.nearestKSearch (cloud_b.points[i], 1, indices, sqr_distances);
+ if (sqr_distances[0] > max_dist_b)
+ max_dist_b = sqr_distances[0];
+ }
+
+ max_dist_a = std::sqrt (max_dist_a);
+ max_dist_b = std::sqrt (max_dist_b);
+
+ float dist = std::max (max_dist_a, max_dist_b);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : ");
+ print_info ("A->B: "); print_value ("%f", max_dist_a);
+ print_info (", B->A: "); print_value ("%f", max_dist_b);
+ print_info (", Hausdorff Distance: "); print_value ("%f", dist);
+ print_info (" ]\n");
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Compute Hausdorff distance between point clouds. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 2)
+ {
+ print_error ("Need two PCD files to compute Hausdorff distance.\n");
+ return (-1);
+ }
+
+ // Load the first file
+ Cloud::Ptr cloud_a (new Cloud);
+ if (!loadCloud (argv[p_file_indices[0]], *cloud_a))
+ return (-1);
+
+ // Load the second file
+ Cloud::Ptr cloud_b (new Cloud);
+ if (!loadCloud (argv[p_file_indices[1]], *cloud_b))
+ return (-1);
+
+ // Compute the Hausdorff distance
+ compute (*cloud_a, *cloud_b);
+}
+
{
if (!convex_concave_hull)
{
- print_info ("Computing the convex hull of a cloud with %zu points.\n", cloud_in->size ());
+ print_info ("Computing the convex hull of a cloud with %lu points.\n", cloud_in->size ());
ConvexHull<PointXYZ> convex_hull;
convex_hull.setInputCloud (cloud_in);
convex_hull.reconstruct (mesh_out);
}
else
{
- print_info ("Computing the concave hull (alpha shapes) with alpha %f of a cloud with %zu points.\n", alpha, cloud_in->size ());
+ print_info ("Computing the concave hull (alpha shapes) with alpha %f of a cloud with %lu points.\n", alpha, cloud_in->size ());
ConcaveHull<PointXYZ> concave_hull;
concave_hull.setInputCloud (cloud_in);
concave_hull.setAlpha (alpha);
//pcl::io::loadPCDFile (argv[file_indices[i]], cloud);
//cloud_all += cloud;
pcl::concatenatePointCloud (cloud_all, cloud, cloud_all);
- PCL_INFO ("Total number of points so far: %u. Total data size: %zu bytes.\n", cloud_all.width * cloud_all.height, cloud_all.data.size ());
+ PCL_INFO ("Total number of points so far: %u. Total data size: %lu bytes.\n", cloud_all.width * cloud_all.height, cloud_all.data.size ());
}
saveCloud ("output.pcd", cloud_all);
PointCloud<PointXYZ> xyz_filtered;
fbf.filter (xyz_filtered);
- print_highlight ("Filtered data in "); print_value ("%g", tt.toc ()); print_info (" ms for "); print_value ("%zu", xyz_filtered.size ()); print_info (" points.\n");
+ print_highlight ("Filtered data in "); print_value ("%g", tt.toc ()); print_info (" ms for "); print_value ("%lu", xyz_filtered.size ()); print_info (" points.\n");
// Convert data back
pcl::PCLPointCloud2 output_xyz;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/common/generate.h>
+#include <pcl/common/random.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::common;
+using namespace pcl::console;
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+typedef const Cloud::ConstPtr ConstCloudPtr;
+
+std::string default_distribution = "uniform";
+float default_xmin = 0.0f;
+float default_xmax = 1.0f;
+float default_xmean = 0.0f;
+float default_xstddev = 1.0f;
+float default_ymin = 0.0f;
+float default_ymax = 1.0f;
+float default_ymean = 0.0f;
+float default_ystddev = 1.0f;
+float default_zmin = 0.0f;
+float default_zmax = 1.0f;
+float default_zmean = 0.0f;
+float default_zstddev = 1.0f;
+int default_size = 10000;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s output.pcd <options>\n", argv[0]);
+ print_info (" where options are:\n");
+ print_info (" -distribution X = the distribution to be used (options: uniform / normal) (default: ");
+ print_value ("%s", default_distribution.c_str ()); print_info (")\n");
+ print_info (" -size X = number of points in cloud (default: ");
+ print_value ("%d", default_size); print_info (")\n");
+ print_info (" Options for uniform distribution:\n");
+ print_info (" -[x|y|z]min X = minimum for the [x|y|z] dimension (defaults: ");
+ print_value ("%f, %f, %f", default_xmin, default_ymin, default_zmin); print_info (")\n");
+ print_info (" -[x|y|z]max X = maximum for the [x|y|z] dimension (defaults: ");
+ print_value ("%f, %f, %f", default_xmax, default_ymax, default_zmax); print_info (")\n");
+ print_info (" Options for normal distribution:\n");
+ print_info (" -[x|y|z]mean X = mean for the [x|y|z] dimension (defaults: ");
+ print_value ("%f, %f, %f", default_xmean, default_ymean, default_zmean); print_info (")\n");
+ print_info (" -[x|y|z]stddev X = standard deviation for the [x|y|z] dimension (defaults: ");
+ print_value ("%f, %f, %f", default_xstddev, default_ystddev, default_zstddev); print_info (")\n");
+}
+
+void
+saveCloud (const std::string &filename, const Cloud &output)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ if (find_switch (argc, argv, "-h"))
+ {
+ printHelp (argc, argv);
+ return (0);
+ }
+
+ print_info ("Generate a random point cloud. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 2)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ // Command line parsing
+ std::string distribution = default_distribution;
+ float xmin = default_xmin;
+ float xmax = default_xmax;
+ float xmean = default_xmean;
+ float xstddev = default_xstddev;
+ float ymin = default_ymin;
+ float ymax = default_ymax;
+ float ymean = default_ymean;
+ float ystddev = default_ystddev;
+ float zmin = default_zmin;
+ float zmax = default_zmax;
+ float zmean = default_zmean;
+ float zstddev = default_zstddev;
+ int size = default_size;
+ parse_argument (argc, argv, "-distribution", distribution);
+ parse_argument (argc, argv, "-xmin", xmin);
+ parse_argument (argc, argv, "-xmax", xmax);
+ parse_argument (argc, argv, "-xmean", xmean);
+ parse_argument (argc, argv, "-xstddev", xstddev);
+ parse_argument (argc, argv, "-ymin", ymin);
+ parse_argument (argc, argv, "-ymax", ymax);
+ parse_argument (argc, argv, "-ymean", ymean);
+ parse_argument (argc, argv, "-ystddev", ystddev);
+ parse_argument (argc, argv, "-zmin", zmin);
+ parse_argument (argc, argv, "-zmax", zmax);
+ parse_argument (argc, argv, "-zmean", zmean);
+ parse_argument (argc, argv, "-zstddev", zstddev);
+ parse_argument (argc, argv, "-size", size);
+
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 1)
+ {
+ print_error ("Need one output PCD file to continue.\n");
+ return (-1);
+ }
+
+ // Perform the feature estimation
+ Cloud output;
+
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ if (distribution == "uniform")
+ {
+ CloudGenerator<pcl::PointXYZ, UniformGenerator<float> > generator;
+ uint32_t seed = static_cast<uint32_t> (time (NULL));
+ UniformGenerator<float>::Parameters x_params (xmin, xmax, seed++);
+ generator.setParametersForX (x_params);
+ UniformGenerator<float>::Parameters y_params (ymin, ymax, seed++);
+ generator.setParametersForY (y_params);
+ UniformGenerator<float>::Parameters z_params (zmin, zmax, seed++);
+ generator.setParametersForZ (z_params);
+
+ generator.fill (size, 1, output);
+ }
+ else if (distribution == "normal")
+ {
+ CloudGenerator<pcl::PointXYZ, NormalGenerator<float> > generator;
+ uint32_t seed = static_cast<uint32_t> (time (NULL));
+ NormalGenerator<float>::Parameters x_params (xmean, xstddev, seed++);
+ generator.setParametersForX (x_params);
+ NormalGenerator<float>::Parameters y_params (ymean, ystddev, seed++);
+ generator.setParametersForY (y_params);
+ NormalGenerator<float>::Parameters z_params (zmean, zstddev, seed++);
+ generator.setParametersForZ (z_params);
+
+ generator.fill (size, 1, output);
+ }
+ else
+ {
+ PCL_ERROR ("%s is not a valid generator! Quitting!\n", distribution.c_str ());
+ return (0);
+ }
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+
+ // Save into the second file
+ saveCloud (argv[p_file_indices[0]], output);
+}
+
gpt.reconstruct (output);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", output.polygons.size ()); print_info (" polygons]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", output.polygons.size ()); print_info (" polygons]\n");
}
void
print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
saveVTKFile (filename, output);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%zu", output.polygons.size ()); print_info (" polygons]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%lu", output.polygons.size ()); print_info (" polygons]\n");
}
/* ---[ */
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/filters/grid_minimum.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+typedef const Cloud::ConstPtr ConstCloudPtr;
+
+float default_resolution = 1.0f;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s input.pcd output.pcd <options>\n", argv[0]);
+ print_info (" where options are:\n");
+ print_info (" -resolution X = xy resolution of the grid (default: ");
+ print_value ("%f", default_resolution); print_info (")\n");
+ print_info (" -input_dir X = batch process all PCD files found in input_dir\n");
+ print_info (" -output_dir X = save the processed files from input_dir in this directory\n");
+}
+
+bool
+loadCloud (const std::string &filename, Cloud &cloud)
+{
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
+
+ tt.tic ();
+ if (loadPCDFile (filename, cloud) < 0)
+ return (false);
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+ print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
+
+ return (true);
+}
+
+void
+compute (ConstCloudPtr &input, Cloud &output, float resolution)
+{
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ GridMinimum<PointType> gm (resolution);
+ gm.setInputCloud (input);
+ gm.filter (output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+void
+saveCloud (const std::string &filename, const Cloud &output)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+int
+batchProcess (const vector<string> &pcd_files, string &output_dir,
+ float resolution)
+{
+ vector<string> st;
+ for (size_t i = 0; i < pcd_files.size (); ++i)
+ {
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (pcd_files[i], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, resolution);
+
+ // Prepare output file name
+ string filename = pcd_files[i];
+ boost::trim (filename);
+ boost::split (st, filename, boost::is_any_of ("/\\"), boost::token_compress_on);
+
+ // Save into the second file
+ stringstream ss;
+ ss << output_dir << "/" << st.at (st.size () - 1);
+ saveCloud (ss.str (), output);
+ }
+ return (0);
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Filter a point cloud using the pcl::GridMinimum filter. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ bool batch_mode = false;
+
+ // Command line parsing
+ float resolution = default_resolution;
+ parse_argument (argc, argv, "-resolution", resolution);
+ string input_dir, output_dir;
+ if (parse_argument (argc, argv, "-input_dir", input_dir) != -1)
+ {
+ PCL_INFO ("Input directory given as %s. Batch process mode on.\n", input_dir.c_str ());
+ if (parse_argument (argc, argv, "-output_dir", output_dir) == -1)
+ {
+ PCL_ERROR ("Need an output directory! Please use -output_dir to continue.\n");
+ return (-1);
+ }
+
+ // Both input dir and output dir given, switch into batch processing mode
+ batch_mode = true;
+ }
+
+ if (!batch_mode)
+ {
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 2)
+ {
+ print_error ("Need one input PCD file and one output PCD file to continue.\n");
+ return (-1);
+ }
+
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (argv[p_file_indices[0]], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, resolution);
+
+ // Save into the second file
+ saveCloud (argv[p_file_indices[1]], output);
+ }
+ else
+ {
+ if (input_dir != "" && boost::filesystem::exists (input_dir))
+ {
+ vector<string> pcd_files;
+ boost::filesystem::directory_iterator end_itr;
+ for (boost::filesystem::directory_iterator itr (input_dir); itr != end_itr; ++itr)
+ {
+ // Only add PCD files
+ if (!is_directory (itr->status ()) && boost::algorithm::to_upper_copy (boost::filesystem::extension (itr->path ())) == ".PCD" )
+ {
+ pcd_files.push_back (itr->path ().string ());
+ PCL_INFO ("[Batch processing mode] Added %s for processing.\n", itr->path ().string ().c_str ());
+ }
+ }
+ batchProcess (pcd_files, output_dir, resolution);
+ }
+ else
+ {
+ PCL_ERROR ("Batch processing mode enabled, but invalid input directory (%s) given!\n", input_dir.c_str ());
+ return (-1);
+ }
+ }
+}
{
const LineRGBD<PointXYZRGBA>::Detection & d = detections[i];
const BoundingBoxXYZ & bb = d.bounding_box;
- print_info ("%zu %zu %f (%f %f %f) (%f %f %f)\n",
+ print_info ("%lu %lu %f (%f %f %f) (%f %f %f)\n",
d.detection_id, d.template_id, d.response,
bb.x, bb.y, bb.z, bb.width, bb.height, bb.depth);
}
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/filters/local_maximum.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+typedef const Cloud::ConstPtr ConstCloudPtr;
+
+float default_radius = 1.0f;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s input.pcd output.pcd <options>\n", argv[0]);
+ print_info (" where options are:\n");
+ print_info (" -radius X = xy radius to test for local max (default: ");
+ print_value ("%f", default_radius); print_info (")\n");
+ print_info (" -input_dir X = batch process all PCD files found in input_dir\n");
+ print_info (" -output_dir X = save the processed files from input_dir in this directory\n");
+}
+
+bool
+loadCloud (const std::string &filename, Cloud &cloud)
+{
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
+
+ tt.tic ();
+ if (loadPCDFile (filename, cloud) < 0)
+ return (false);
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+ print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
+
+ return (true);
+}
+
+void
+compute (ConstCloudPtr &input, Cloud &output, float radius)
+{
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ LocalMaximum<PointType> lm;
+ lm.setInputCloud (input);
+ lm.setRadius (radius);
+ lm.filter (output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+void
+saveCloud (const std::string &filename, const Cloud &output)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+int
+batchProcess (const vector<string> &pcd_files, string &output_dir,
+ float radius)
+{
+ vector<string> st;
+ for (size_t i = 0; i < pcd_files.size (); ++i)
+ {
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (pcd_files[i], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, radius);
+
+ // Prepare output file name
+ string filename = pcd_files[i];
+ boost::trim (filename);
+ boost::split (st, filename, boost::is_any_of ("/\\"), boost::token_compress_on);
+
+ // Save into the second file
+ stringstream ss;
+ ss << output_dir << "/" << st.at (st.size () - 1);
+ saveCloud (ss.str (), output);
+ }
+ return (0);
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Filter a point cloud using the pcl::LocalMaximum filter. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ bool batch_mode = false;
+
+ // Command line parsing
+ float radius = default_radius;
+ parse_argument (argc, argv, "-radius", radius);
+ string input_dir, output_dir;
+ if (parse_argument (argc, argv, "-input_dir", input_dir) != -1)
+ {
+ PCL_INFO ("Input directory given as %s. Batch process mode on.\n", input_dir.c_str ());
+ if (parse_argument (argc, argv, "-output_dir", output_dir) == -1)
+ {
+ PCL_ERROR ("Need an output directory! Please use -output_dir to continue.\n");
+ return (-1);
+ }
+
+ // Both input dir and output dir given, switch into batch processing mode
+ batch_mode = true;
+ }
+
+ if (!batch_mode)
+ {
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 2)
+ {
+ print_error ("Need one input PCD file and one output PCD file to continue.\n");
+ return (-1);
+ }
+
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (argv[p_file_indices[0]], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, radius);
+
+ // Save into the second file
+ saveCloud (argv[p_file_indices[1]], output);
+ }
+ else
+ {
+ if (input_dir != "" && boost::filesystem::exists (input_dir))
+ {
+ vector<string> pcd_files;
+ boost::filesystem::directory_iterator end_itr;
+ for (boost::filesystem::directory_iterator itr (input_dir); itr != end_itr; ++itr)
+ {
+ // Only add PCD files
+ if (!is_directory (itr->status ()) && boost::algorithm::to_upper_copy (boost::filesystem::extension (itr->path ())) == ".PCD" )
+ {
+ pcd_files.push_back (itr->path ().string ());
+ PCL_INFO ("[Batch processing mode] Added %s for processing.\n", itr->path ().string ().c_str ());
+ }
+ }
+ batchProcess (pcd_files, output_dir, radius);
+ }
+ else
+ {
+ PCL_ERROR ("Batch processing mode enabled, but invalid input directory (%s) given!\n", input_dir.c_str ());
+ return (-1);
+ }
+ }
+}
lum.compute ();
- for(int i = 0; i < lum.getNumVertices (); i++)
+ for(size_t i = 0; i < lum.getNumVertices (); i++)
{
//std::cout << i << ": " << lum.getTransformation (i) (0, 3) << " " << lum.getTransformation (i) (1, 3) << " " << lum.getTransformation (i) (2, 3) << std::endl;
clouds[i].second = lum.getTransformedCloud (i);
}
}
- for(int i = 0; i < lum.getNumVertices (); i++)
+ for(size_t i = 0; i < lum.getNumVertices (); i++)
{
std::string result_filename (clouds[i].first);
result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
for (size_t i = 0; i < detections.size (); ++i)
{
const LINEMODDetection & d = detections[i];
- printf ("%zu: %d %d %d %f\n", i, d.x, d.y, d.template_id, d.score);
+ printf ("%lu: %d %d %d %f\n", i, d.x, d.y, d.template_id, d.score);
}
/*// Visualization code for testing purposes (requires libpng++)
{
vtkSmartPointer<vtkPLYReader> readerQuery = vtkSmartPointer<vtkPLYReader>::New ();
readerQuery->SetFileName (argv[ply_file_indices[0]]);
+ readerQuery->Update ();
polydata1 = readerQuery->GetOutput ();
- polydata1->Update ();
}
else if (obj_file_indices.size () == 1)
{
vtkSmartPointer<vtkOBJReader> readerQuery = vtkSmartPointer<vtkOBJReader>::New ();
readerQuery->SetFileName (argv[obj_file_indices[0]]);
+ readerQuery->Update ();
polydata1 = readerQuery->GetOutput ();
- polydata1->Update ();
}
bool INTER_VIS = false;
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/common/transforms.h>
+#include <vtkVersion.h>
#include <vtkPLYReader.h>
#include <vtkOBJReader.h>
#include <vtkTriangle.h>
{
vtkSmartPointer<vtkOBJReader> readerQuery = vtkSmartPointer<vtkOBJReader>::New ();
readerQuery->SetFileName (argv[obj_file_indices[0]]);
+ readerQuery->Update ();
polydata1 = readerQuery->GetOutput ();
- polydata1->Update ();
}
//make sure that the polygons are triangles!
vtkSmartPointer<vtkTriangleFilter> triangleFilter = vtkSmartPointer<vtkTriangleFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
triangleFilter->SetInput (polydata1);
+#else
+ triangleFilter->SetInputData (polydata1);
+#endif
triangleFilter->Update ();
vtkSmartPointer<vtkPolyDataMapper> triangleMapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
triangleMapper->SetInputConnection (triangleFilter->GetOutputPort ());
triangleMapper->Update();
polydata1 = triangleMapper->GetInput();
- polydata1->Update ();
bool INTER_VIS = false;
bool VIS = true;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/filters/morphological_filter.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+typedef const Cloud::ConstPtr ConstCloudPtr;
+
+std::string default_method = "open";
+float default_resolution = 1.0f;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s input.pcd output.pcd <options>\n", argv[0]);
+ print_info (" where options are:\n");
+ print_info (" -resolution X = cell size (default: ");
+ print_value ("%f", default_resolution); print_info (")\n");
+ print_info (" -method X = the morphological operator to be used (options: dilate / erode / open / close) (default: ");
+ print_value ("%s", default_method.c_str ()); print_info (")\n");
+ print_info (" -input_dir X = batch process all PCD files found in input_dir\n");
+ print_info (" -output_dir X = save the processed files from input_dir in this directory\n");
+}
+
+bool
+loadCloud (const std::string &filename, Cloud &cloud)
+{
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
+
+ tt.tic ();
+ if (loadPCDFile (filename, cloud) < 0)
+ return (false);
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+ print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
+
+ return (true);
+}
+
+void
+compute (ConstCloudPtr &input, Cloud &output, float resolution, std::string method)
+{
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ if (method == "dilate")
+ {
+ applyMorphologicalOperator<PointType> (input, resolution, MORPH_DILATE, output);
+ }
+ else if (method == "erode")
+ {
+ applyMorphologicalOperator<PointType> (input, resolution, MORPH_ERODE, output);
+ }
+ else if (method == "open")
+ {
+ applyMorphologicalOperator<PointType> (input, resolution, MORPH_OPEN, output);
+ }
+ else if (method == "close")
+ {
+ applyMorphologicalOperator<PointType> (input, resolution, MORPH_CLOSE, output);
+ }
+ else
+ {
+ PCL_ERROR ("%s is not a valid morphological operator! Quitting!\n", method.c_str ());
+ return;
+ }
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+void
+saveCloud (const std::string &filename, const Cloud &output)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+int
+batchProcess (const vector<string> &pcd_files, string &output_dir,
+ float resolution, std::string method)
+{
+ vector<string> st;
+ for (size_t i = 0; i < pcd_files.size (); ++i)
+ {
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (pcd_files[i], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, resolution, method);
+
+ // Prepare output file name
+ string filename = pcd_files[i];
+ boost::trim (filename);
+ boost::split (st, filename, boost::is_any_of ("/\\"), boost::token_compress_on);
+
+ // Save into the second file
+ stringstream ss;
+ ss << output_dir << "/" << st.at (st.size () - 1);
+ saveCloud (ss.str (), output);
+ }
+ return (0);
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Filter a point cloud using the pcl::morphologicalOpen. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ bool batch_mode = false;
+
+ // Command line parsing
+ std::string method = default_method;
+ float resolution = default_resolution;
+ parse_argument (argc, argv, "-method", method);
+ parse_argument (argc, argv, "-resolution", resolution);
+ string input_dir, output_dir;
+ if (parse_argument (argc, argv, "-input_dir", input_dir) != -1)
+ {
+ PCL_INFO ("Input directory given as %s. Batch process mode on.\n", input_dir.c_str ());
+ if (parse_argument (argc, argv, "-output_dir", output_dir) == -1)
+ {
+ PCL_ERROR ("Need an output directory! Please use -output_dir to continue.\n");
+ return (-1);
+ }
+
+ // Both input dir and output dir given, switch into batch processing mode
+ batch_mode = true;
+ }
+
+ if (!batch_mode)
+ {
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 2)
+ {
+ print_error ("Need one input PCD file and one output PCD file to continue.\n");
+ return (-1);
+ }
+
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (argv[p_file_indices[0]], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, resolution, method);
+
+ // Save into the second file
+ saveCloud (argv[p_file_indices[1]], output);
+ }
+ else
+ {
+ if (input_dir != "" && boost::filesystem::exists (input_dir))
+ {
+ vector<string> pcd_files;
+ boost::filesystem::directory_iterator end_itr;
+ for (boost::filesystem::directory_iterator itr (input_dir); itr != end_itr; ++itr)
+ {
+ // Only add PCD files
+ if (!is_directory (itr->status ()) && boost::algorithm::to_upper_copy (boost::filesystem::extension (itr->path ())) == ".PCD" )
+ {
+ pcd_files.push_back (itr->path ().string ());
+ PCL_INFO ("[Batch processing mode] Added %s for processing.\n", itr->path ().string ().c_str ());
+ }
+ }
+ batchProcess (pcd_files, output_dir, resolution, method);
+ }
+ else
+ {
+ PCL_ERROR ("Batch processing mode enabled, but invalid input directory (%s) given!\n", input_dir.c_str ());
+ return (-1);
+ }
+ }
+}
+
return (-1);
}
- print_info ("Estimating normals with a radius/k/smoothing size of: ");
+ print_info ("Estimating normals with a k/radius/smoothing size of: ");
print_value ("%d / %f / %f\n", k, radius, radius);
// Load the first file
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id:
+ *
+ */
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/vtk_lib_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s input.obj output.pcd [options]\n", argv[0]);
+ print_info ("where options are: \n");
+ print_info (" -copy_normals 0/1 : set to true (1) or false (0) if the output PointCloud should contain normals or not.\n");
+}
+
+template <typename T> void
+saveCloud (const std::string &filename, const pcl::PointCloud<T> &cloud)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, cloud);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+}
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Convert a OBJ file to PCD format. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ // Parse the command line arguments for .pcd and .obj files
+ std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ std::vector<int> obj_file_indices = parse_file_extension_argument (argc, argv, ".obj");
+ if (pcd_file_indices.size () != 1 || obj_file_indices.size () != 1)
+ {
+ print_error ("Need one input OBJ file and one output PCD file.\n");
+ return (-1);
+ }
+
+ // Load the OBJ file
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", argv[obj_file_indices[0]]);
+
+ // Load the input file
+ vtkSmartPointer<vtkPolyData> polydata;
+ vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New ();
+ reader->SetFileName (argv[obj_file_indices[0]]);
+ reader->Update ();
+ polydata = reader->GetOutput ();
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", polydata->GetNumberOfPoints ()); print_info (" points]\n");
+
+ bool copy_normals = false;
+ parse_argument (argc, argv, "-copy_normals", copy_normals);
+ PCL_INFO ("Copy normals: %s.\n", copy_normals ? "true" : "false");
+
+ if (copy_normals)
+ {
+ vtkSmartPointer<vtkPolyDataNormals> ng = vtkSmartPointer<vtkPolyDataNormals>::New ();
+#if VTK_MAJOR_VERSION < 6
+ ng->SetInput (polydata);
+#else
+ ng->SetInputData (polydata);
+#endif
+ ng->ComputePointNormalsOn ();
+ ng->ComputeCellNormalsOff ();
+ ng->Update ();
+ polydata = ng->GetOutput ();
+
+ pcl::PointCloud<pcl::PointNormal> cloud;
+ vtkPolyDataToPointCloud (polydata, cloud);
+ // Convert to pcd and save
+ saveCloud (argv[pcd_file_indices[0]], cloud);
+ }
+ else
+ {
+ pcl::PointCloud<pcl::PointXYZ> cloud;
+ vtkPolyDataToPointCloud (polydata, cloud);
+ // Convert to pcd and save
+ saveCloud (argv[pcd_file_indices[0]], cloud);
+ }
+
+ return (0);
+}
+
vtkSmartPointer<vtkPolyData> polydata;
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New ();
reader->SetFileName (argv[obj_file_indices[0]]);
+ reader->Update ();
polydata = reader->GetOutput ();
- polydata->Update ();
// Convert to VTK and save
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
writer->SetInput (polydata);
+#else
+ writer->SetInputData (polydata);
+#endif
writer->SetFileName (argv[vtk_file_indices[0]]);
writer->Write ();
}
#include <pcl/console/parse.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
+#include <vtkVersion.h>
#include <vtkPolyDataReader.h>
#include <vtkRenderWindow.h>
#include <vtkTransformPolyDataFilter.h>
// Setup the transformator
vtkSmartPointer<vtkTransformPolyDataFilter> vtk_transformator = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
vtk_transformator->SetTransform (vtk_transform);
+#if VTK_MAJOR_VERSION < 6
vtk_transformator->SetInput (vtk_model);
+#else
+ vtk_transformator->SetInputData (vtk_model);
+#endif
vtk_transformator->Update ();
// Visualize
vtkSmartPointer<vtkActor> vtk_actor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkPolyDataMapper> vtk_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
vtk_mapper->SetInput(vtk_transformator->GetOutput ());
+#else
+ vtk_mapper->SetInputData (vtk_transformator->GetOutput ());
+#endif
vtk_actor->SetMapper(vtk_mapper);
// Set the appearance & add to the renderer
vtk_actor->GetProperty ()->SetColor (0.6, 0.7, 0.9);
}
}
- vis.addCoordinateSystem(1.5);
+ vis.addCoordinateSystem(1.5, "global");
vis.resetCamera ();
// Enter the main loop
#include <pcl/console/parse.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
+#include <vtkVersion.h>
#include <vtkPolyDataReader.h>
#include <vtkDoubleArray.h>
#include <vtkDataArray.h>
// Save the normals
vtk_opps->GetPointData ()->SetNormals (vtk_normals);
// Setup the hedge hog object
+#if VTK_MAJOR_VERSION < 6
vtk_hedge_hog->SetInput (vtk_opps);
+#else
+ vtk_hedge_hog->SetInputData (vtk_opps);
+#endif
vtk_hedge_hog->SetVectorModeToUseNormal ();
vtk_hedge_hog->SetScaleFactor (0.5f*pair_width);
vtk_hedge_hog->Update ();
#include <pcl/io/pcd_io.h>
#include <pcl/recognition/ransac_based/orr_octree.h>
#include <pcl/visualization/pcl_visualizer.h>
+#include <vtkVersion.h>
#include <vtkPolyData.h>
#include <vtkAppendPolyData.h>
#include <vtkPolyDataReader.h>
cube->SetBounds (b[0], b[1], b[2], b[3], b[4], b[5]);
cube->Update ();
+#if VTK_MAJOR_VERSION < 6
additive_octree->AddInput (cube->GetOutput ());
+#else
+ additive_octree->AddInputData (cube->GetOutput ());
+#endif
}
//===============================================================================================================================
vtkRenderer *renderer = viz.getRenderWindow ()->GetRenderers ()->GetFirstRenderer ();
vtkSmartPointer<vtkActor> octree_actor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput(vtk_octree);
+#else
+ mapper->SetInputData (vtk_octree);
+#endif
octree_actor->SetMapper(mapper);
// Set the appearance & add to the renderer
#include <pcl/io/pcd_io.h>
#include <pcl/recognition/ransac_based/orr_octree_zprojection.h>
#include <pcl/visualization/pcl_visualizer.h>
+#include <vtkVersion.h>
#include <vtkRenderWindow.h>
#include <vtkPolyData.h>
#include <vtkAppendPolyData.h>
vtkRenderer *renderer = viz.getRenderWindow ()->GetRenderers ()->GetFirstRenderer ();
vtkSmartPointer<vtkActor> octree_actor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput(vtk_octree);
+#else
+ mapper->SetInputData (vtk_octree);
+#endif
octree_actor->SetMapper(mapper);
// Set the appearance & add to the renderer
vtkRenderer *renderer = viz.getRenderWindow ()->GetRenderers ()->GetFirstRenderer ();
vtkSmartPointer<vtkActor> upper_actor = vtkSmartPointer<vtkActor>::New(), lower_actor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkDataSetMapper> upper_mapper = vtkSmartPointer<vtkDataSetMapper>::New (), lower_mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
upper_mapper->SetInput(upper_bound->GetOutput ());
+#else
+ upper_mapper->SetInputData (upper_bound->GetOutput ());
+#endif
upper_actor->SetMapper(upper_mapper);
+#if VTK_MAJOR_VERSION < 6
lower_mapper->SetInput(lower_bound->GetOutput ());
+#else
+ lower_mapper->SetInputData (lower_bound->GetOutput ());
+#endif
lower_actor->SetMapper(lower_mapper);
// Set the appearance & add to the renderer
cube->SetBounds (b[0], b[1], b[2], b[3], b[4], b[5]);
cube->Update ();
+#if VTK_MAJOR_VERSION < 6
additive_octree->AddInput (cube->GetOutput ());
+#else
+ additive_octree->AddInputData (cube->GetOutput ());
+#endif
}
//===============================================================================================================================
cube->SetBounds (x1, x2, y1, y2, z, z);
cube->Update ();
+#if VTK_MAJOR_VERSION < 6
additive_rectangle->AddInput (cube->GetOutput ());
+#else
+ additive_rectangle->AddInputData (cube->GetOutput ());
+#endif
}
//===============================================================================================================================
#include <pcl/console/parse.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
+#include <vtkVersion.h>
#include <vtkPolyDataReader.h>
#include <vtkDoubleArray.h>
#include <vtkDataArray.h>
// Setup the transformator
vtkSmartPointer<vtkTransformPolyDataFilter> vtk_transformator = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
vtk_transformator->SetTransform (vtk_transform);
+#if VTK_MAJOR_VERSION < 6
vtk_transformator->SetInput (vtk_model);
+#else
+ vtk_transformator->SetInputData (vtk_model);
+#endif
vtk_transformator->Update ();
// Visualize
vtkSmartPointer<vtkActor> vtk_actor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkPolyDataMapper> vtk_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
vtk_mapper->SetInput(vtk_transformator->GetOutput ());
+#else
+ vtk_mapper->SetInputData (vtk_transformator->GetOutput ());
+#endif
vtk_actor->SetMapper(vtk_mapper);
// Set the appearance & add to the renderer
vtk_actor->GetProperty ()->SetColor (0.6, 0.7, 0.9);
for ( i = 0, j = 0, id = 0 ; i < inliers->indices.size () ; )
{
- if ( id == inliers->indices[i] )
+ if ( static_cast<int> (id) == inliers->indices[i] )
{
plane_points.points[i] = all_points->points[id];
++id;
#include <pcl/console/parse.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
+#include <vtkVersion.h>
#include <vtkPolyDataReader.h>
#include <vtkDoubleArray.h>
#include <vtkDataArray.h>
vtkSmartPointer<vtkHedgeHog> vtk_hh = vtkSmartPointer<vtkHedgeHog>::New ();
vtk_hh->SetVectorModeToUseNormal ();
vtk_hh->SetScaleFactor (0.5f*params->objrec_.getPairWidth ());
+#if VTK_MAJOR_VERSION < 6
vtk_hh->SetInput (vtk_opps);
+#else
+ vtk_hh->SetInputData (vtk_opps);
+#endif
vtk_hh->Update ();
// The lines
viz.addText(level, 0, 45, 1.0, 0.0, 0.0, "level_t1");
viz.removeShape("level_t2");
- sprintf(level, "Voxel size: %.4fm [%zu voxels]", sqrt(octree.getVoxelSquaredSideLen(displayedDepth)),
+ sprintf(level, "Voxel size: %.4fm [%lu voxels]", sqrt(octree.getVoxelSquaredSideLen(displayedDepth)),
displayCloud->points.size());
viz.addText(level, 0, 30, 1.0, 0.0, 0.0, "level_t2");
double y = displayCloud->points[i].y;
double z = displayCloud->points[i].z;
+#if VTK_MAJOR_VERSION < 6
treeWireframe->AddInput(GetCuboid(x - s, x + s, y - s, y + s, z - s, z + s));
+#else
+ treeWireframe->AddInputData (GetCuboid (x - s, x + s, y - s, y + s, z - s, z + s));
+#endif
}
vtkSmartPointer<vtkActor> treeActor = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput(treeWireframe->GetOutput());
+#else
+ mapper->SetInputData (treeWireframe->GetOutput ());
+#endif
treeActor->SetMapper(mapper);
treeActor->GetProperty()->SetColor(1.0, 1.0, 1.0);
}
double end = pcl::getTime ();
- printf("%zu pts, %.4gs. %.4gs./pt. =====\n", displayCloud->points.size (), end - start,
+ printf("%lu pts, %.4gs. %.4gs./pt. =====\n", displayCloud->points.size (), end - start,
(end - start) / static_cast<double> (displayCloud->points.size ()));
update();
PCDWriter w;
sprintf (buf, "frame_%06d.pcd", i);
w.writeBinaryCompressed (buf, *cloud);
- PCL_INFO ("Wrote a cloud with %zu (%ux%u) points in %s.\n",
+ PCL_INFO ("Wrote a cloud with %lu (%ux%u) points in %s.\n",
cloud->size (), cloud->width, cloud->height, buf);
++i;
}
filter.setStddevMulThresh (std_dev_mul);
filter.setNegative (negative);
filter.setKeepOrganized (keep_organized);
- PCL_INFO ("Computing filtered cloud from %zu points with mean_k %d, std_dev_mul %f, inliers %d ...", xyz_cloud->size (), filter.getMeanK (), filter.getStddevMulThresh (), filter.getNegative ());
+ PCL_INFO ("Computing filtered cloud from %lu points with mean_k %d, std_dev_mul %f, inliers %d ...", xyz_cloud->size (), filter.getMeanK (), filter.getStddevMulThresh (), filter.getNegative ());
filter.filter (*xyz_cloud_filtered);
// Get the indices that have been explicitly removed
filter.getRemovedIndices (*removed_indices);
filter.setMinNeighborsInRadius (min_pts);
filter.setNegative (negative);
filter.setKeepOrganized (keep_organized);
- PCL_INFO ("Computing filtered cloud from %zu points with radius %f, min_pts %d ...", xyz_cloud->size (), radius, min_pts);
+ PCL_INFO ("Computing filtered cloud from %lu points with radius %f, min_pts %d ...", xyz_cloud->size (), radius, min_pts);
filter.filter (*xyz_cloud_filtered);
// Get the indices that have been explicitly removed
filter.getRemovedIndices (*removed_indices);
return;
}
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", xyz_cloud_filtered->width * xyz_cloud_filtered->height); print_info (" points, %zu indices removed]\n", removed_indices->indices.size ());
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", xyz_cloud_filtered->width * xyz_cloud_filtered->height); print_info (" points, %lu indices removed]\n", removed_indices->indices.size ());
if (keep_organized)
{
std::cout << "Usage: " << argv[0] << " [Options] input.pcd output.png" << std::endl;
std::cout << std::endl;
std::cout << "Options:" << std::endl;
- std::cout << " --help : Show this help" << std::endl;
- std::cout << " --field : Set the field to extract data from. Supported fields:" << std::endl;
- std::cout << " - normal" << std::endl;
- std::cout << " * rgb (default)" << std::endl;
- std::cout << " - label" << std::endl;
- std::cout << " - z" << std::endl;
- std::cout << " - curvature" << std::endl;
- std::cout << " - intensity" << std::endl;
- std::cout << " --scale : Apply scaling to extracted data (only for z, curvature, and" << std::endl;
- std::cout << " intensity fields). Supported options:" << std::endl;
- std::cout << " - <float> : Scale by a fixed number" << std::endl;
- std::cout << " - auto : Auto-scale to the full range" << std::endl;
- std::cout << " - no : No scaling" << std::endl;
- std::cout << " If the option is omitted then default scaling (depends on" << std::endl;
- std::cout << " the field type) will be used." << std::endl;
- std::cout << " --colors : Choose color mapping mode for labels (only for label" << std::endl;
- std::cout << " field). Supported options:" << std::endl;
- std::cout << " * mono : Use shades of gray (default)" << std::endl;
- std::cout << " - rgb : Use randomly generated RGB colors" << std::endl;
std::cout << std::endl;
- std::cout << "Note: The converter will try to use RGB field if '--field' option is not" << std::endl;
- std::cout << " supplied." << std::endl;
+ std::cout << " --help : Show this help" << std::endl;
+ std::cout << " --no-nan : Paint NaN (infinite) points with black color regardless of" << std::endl;
+ std::cout << " field contents" << std::endl;
+ std::cout << " --field : Set the field to extract data from. Supported fields:" << std::endl;
+ std::cout << " - normal" << std::endl;
+ std::cout << " * rgb (default)" << std::endl;
+ std::cout << " - label" << std::endl;
+ std::cout << " - z" << std::endl;
+ std::cout << " - curvature" << std::endl;
+ std::cout << " - intensity" << std::endl;
+ std::cout << " --scale : Apply scaling to extracted data (only for z, curvature, and" << std::endl;
+ std::cout << " intensity fields). Supported options:" << std::endl;
+ std::cout << " - <float> : Scale by a fixed number" << std::endl;
+ std::cout << " - auto : Auto-scale to the full range" << std::endl;
+ std::cout << " - no : No scaling" << std::endl;
+ std::cout << " If the option is omitted then default scaling (depends on" << std::endl;
+ std::cout << " the field type) will be used." << std::endl;
+ std::cout << " --colors : Choose color mapping mode for labels (only for label field)." << std::endl;
+ std::cout << " Supported options:" << std::endl;
+ std::cout << " * mono : Use shades of gray (default)" << std::endl;
+ std::cout << " - rgb : Use randomly generated RGB colors" << std::endl;
+ std::cout << " - glasbey : Use fixed colors from the Glasbey lookup table¹" << std::endl;
+ std::cout << std::endl;
+ std::cout << "Notes:" << std::endl;
+ std::cout << std::endl;
+ std::cout << "¹) The Glasbey lookup table is a color table structured in a maximally" << std::endl;
+ std::cout << " discontinuous manner. Adjacent color bins are chosen to be as distinct" << std::endl;
+ std::cout << " from one another as possible (see http://fiji.sc/Glasbey)." << std::endl;
+ std::cout << " The label with the smallest id will be assigned the first color from the" << std::endl;
+ std::cout << " table, the second smallest will have the second color, and so on. Thus," << std::endl;
+ std::cout << " if you have several clouds with the same labels, you will get repetitive" << std::endl;
+ std::cout << " consistently colored PNG images." << std::endl;
}
bool
{
pcie.setColorMode(pcie.COLORS_RGB_RANDOM);
}
+ else if (colors == "glasbey")
+ {
+ pcie.setColorMode(pcie.COLORS_RGB_GLASBEY);
+ }
else
{
return false;
{
print_info ("Convert a PCD file to PNG format.\nFor more information, use: %s --help\n", argv[0]);
- if (argc < 3)
+ if (argc < 3 || pcl::console::find_switch (argc, argv, "--help"))
{
printHelp (argc, argv);
return (-1);
return (-1);
}
+ bool paint_nans_with_black = pcl::console::find_switch (argc, argv, "--no-nan");
+ print_info ("Paint infinite points with black: "); print_value ("%s\n", paint_nans_with_black ? "YES" : "NO");
+
std::string field_name = "rgb";
parse_argument (argc, argv, "--field", field_name);
print_info ("Field name: "); print_value ("%s\n", field_name.c_str());
+
pcl::PCLImage image;
bool extracted;
if (field_name == "normal")
{
- PointCloud<Normal> cloud;
+ PointCloud<PointNormal> cloud;
fromPCLPointCloud2 (*blob, cloud);
- PointCloudImageExtractorFromNormalField<Normal> pcie;
+ PointCloudImageExtractorFromNormalField<PointNormal> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
extracted = pcie.extract(cloud, image);
}
else if (field_name == "rgb")
PointCloud<PointXYZRGB> cloud;
fromPCLPointCloud2 (*blob, cloud);
PointCloudImageExtractorFromRGBField<PointXYZRGB> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
extracted = pcie.extract(cloud, image);
}
else if (field_name == "label")
{
- PointCloud<Label> cloud;
+ PointCloud<PointXYZL> cloud;
fromPCLPointCloud2 (*blob, cloud);
- PointCloudImageExtractorFromLabelField<Label> pcie;
+ PointCloudImageExtractorFromLabelField<PointXYZL> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
if (!parseColorsOption(argc, argv, pcie))
return (-1);
extracted = pcie.extract(cloud, image);
PointCloud<PointXYZ> cloud;
fromPCLPointCloud2 (*blob, cloud);
PointCloudImageExtractorFromZField<PointXYZ> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
if (!parseScaleOption(argc, argv, pcie))
return (-1);
extracted = pcie.extract(cloud, image);
}
else if (field_name == "curvature")
{
- PointCloud<Normal> cloud;
+ PointCloud<PointNormal> cloud;
fromPCLPointCloud2 (*blob, cloud);
- PointCloudImageExtractorFromCurvatureField<Normal> pcie;
+ PointCloudImageExtractorFromCurvatureField<PointNormal> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
if (!parseScaleOption(argc, argv, pcie))
return (-1);
extracted = pcie.extract(cloud, image);
}
else if (field_name == "intensity")
{
- PointCloud<Intensity> cloud;
+ PointCloud<PointXYZI> cloud;
fromPCLPointCloud2 (*blob, cloud);
- PointCloudImageExtractorFromIntensityField<Intensity> pcie;
+ PointCloudImageExtractorFromIntensityField<PointXYZI> pcie;
+ pcie.setPaintNaNsWithBlack (paint_nans_with_black);
if (!parseScaleOption(argc, argv, pcie))
return (-1);
extracted = pcie.extract(cloud, image);
}
else
{
- print_error ("Wrong number of values given (%zu): ", values.size ());
+ print_error ("Wrong number of values given (%lu): ", values.size ());
print_error ("The VIEWPOINT specified with -viewpoint must contain 7 elements (tx, ty, tz, qw, qx, qy, qz).\n");
return (-1);
}
void
printHelp (int, char **argv)
{
- print_error ("Syntax is: %s input.ply output.pcd\n", argv[0]);
+ print_error ("Syntax is: %s [-format 0|1] input.ply output.pcd\n", argv[0]);
}
bool
vtkSmartPointer<vtkPolyData> polydata;
vtkSmartPointer<vtkPLYReader> reader = vtkSmartPointer<vtkPLYReader>::New ();
reader->SetFileName (argv[ply_file_indices[0]]);
+ reader->Update ();
polydata = reader->GetOutput ();
- polydata->Update ();
- print_info ("Loaded %s with %zu points/vertices.\n", argv[ply_file_indices[0]], polydata->GetNumberOfPoints ());
+ print_info ("Loaded %s with %lu points/vertices.\n", argv[ply_file_indices[0]], polydata->GetNumberOfPoints ());
// Convert to VTK and save
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
writer->SetInput (polydata);
+#else
+ writer->SetInputData (polydata);
+#endif
writer->SetFileName (argv[vtk_file_indices[0]]);
writer->SetFileTypeToBinary ();
writer->Write ();
std::cout << "* PNG 2 PCD CONVERTER - Usage Guide *" << std::endl;
std::cout << "* *" << std::endl;
std::cout << "***************************************************************************" << std::endl << std::endl;
- std::cout << "Usage: " << argv[0] << " [Options] input.png output.pcd" << std::endl << std::endl;
+ std::cout << "Usage: " << argv[0] << " [Options] color.png [depth.png] output.pcd" << std::endl << std::endl;
std::cout << "Options:" << std::endl;
std::cout << " -h: Show this help." << std::endl;
std::cout << " -format 0 | 1: Set the format of the output pcd file." << std::endl;
std::cout << " -mode DEFAULT | FORCE_COLOR | FORCE_GRAYSCALE: Set the working mode of the converter." << std::endl;
- std::cout << " --intensity_type: FLOAT | UINT_8 Set the desired intensity type" << std::endl;
+ std::cout << " --intensity_type: FLOAT | UINT_8 Set the desired intensity type" << std::endl;
+ std::cout << " FLOAT is always used when depth input file is valid." << std::endl;
+ std::cout << " --v_viewing_angle angle Set vertical viewing angle of 3D camera." << std::endl;
+ std::cout << " Default value is 43 (for Kinect device)." << std::endl;
+ std::cout << " This option is only used when depth input file is valid." << std::endl;
+ std::cout << " --h_viewing_angle angle Set horizontal viewing angle of 3D camera." << std::endl;
+ std::cout << " Default value is 57 (for Kinect device)." << std::endl;
+ std::cout << " This option is only used when depth input file is valid." << std::endl;
+ std::cout << " --depth_unit mm | m Set unit of depth values in depth.png (default is mm)." << std::endl;
}
template<typename PointInT> void
print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
}
+inline void
+depth2xyz (float v_viewing_angle, float h_viewing_angle,
+ int image_width, int image_height, int image_x, int image_y,
+ float depth, float &x, float &y, float &z)
+{
+ float width, height;
+ static const float PI = 3.1415927;
+
+ if (depth <= 0.0f)
+ {
+ x = y = z = std::numeric_limits<float>::quiet_NaN ();
+ }
+ else
+ {
+ width = depth * std::tan (h_viewing_angle * PI / 180 / 2) * 2;
+ height = depth * std::tan (v_viewing_angle * PI / 180 / 2) * 2;
+
+ x = (image_x - image_width / 2.0) / image_width * width;
+ y = (image_height / 2.0 - image_y) / image_height * height;
+ z = depth;
+ }
+}
+
/* ---[ */
int
main (int argc, char** argv)
{
- print_info ("Convert a PNG file to PCD format. For more information, use: %s -h\n", argv[0]);
+ print_info ("Convert a (or two with color and depth) PNG file to PCD format. For more information, use: %s -h\n", argv[0]);
if (argc < 3)
{
std::vector<int> png_file_indices = parse_file_extension_argument (argc, argv, ".png");
std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
- if (png_file_indices.size () != 1 || pcd_file_indices.size () != 1)
+ if ((png_file_indices.size () != 1 && png_file_indices.size () != 2) || pcd_file_indices.size () != 1)
{
- print_error ("Need one input PNG file and one output PCD file.\n");
+ print_error ("Need one/two input PNG file and one output PCD file.\n");
return (-1);
}
print_info ("%s mode selected.\n", mode.c_str ());
- // Load the input file
- vtkSmartPointer<vtkImageData> image_data;
- vtkSmartPointer<vtkPNGReader> reader = vtkSmartPointer<vtkPNGReader>::New ();
- reader->SetFileName (argv[png_file_indices[0]]);
- image_data = reader->GetOutput ();
- image_data->Update ();
-
- // Retrieve the entries from the image data and copy them into the output RGB cloud
- int components = image_data->GetNumberOfScalarComponents();
+ // Load the color input file
+ vtkSmartPointer<vtkImageData> color_image_data;
+ vtkSmartPointer<vtkPNGReader> color_reader = vtkSmartPointer<vtkPNGReader>::New ();
+ color_reader->SetFileName (argv[png_file_indices[0]]);
+ color_reader->Update ();
+ color_image_data = color_reader->GetOutput ();
+ int components = color_image_data->GetNumberOfScalarComponents ();
int dimensions[3];
- image_data->GetDimensions (dimensions);
+ color_image_data->GetDimensions (dimensions);
+
+ // Load the depth input file
+ vtkSmartPointer<vtkImageData> depth_image_data;
+ vtkSmartPointer<vtkPNGReader> depth_reader;
+ bool enable_depth = false;
+ float v_viewing_angle = 43.0f;
+ float h_viewing_angle = 57.0f;
+ float depth_unit_magic = 1000.0f;
+ if (png_file_indices.size () == 2)
+ {
+ depth_reader = vtkSmartPointer<vtkPNGReader>::New ();
+ depth_reader->SetFileName (argv[png_file_indices[1]]);
+ depth_reader->Update ();
+ depth_image_data = depth_reader->GetOutput ();
+ if (depth_reader->GetNumberOfScalarComponents () != 1)
+ {
+ print_error ("Component number of depth input file should be 1.\n");
+ exit (-1);
+ }
+
+ int depth_dimensions[3];
+ depth_image_data->GetDimensions (depth_dimensions);
+ if (depth_dimensions[0] != dimensions[0] || depth_dimensions[1] != dimensions[1])
+ {
+ print_error ("Width or height of the color and depth input file should be the same.\n");
+ exit (-1);
+ }
+
+ parse_argument (argc, argv, "--v_viewing_angle", v_viewing_angle);
+ parse_argument (argc, argv, "--h_viewing_angle", h_viewing_angle);
+
+ std::string depth_unit;
+ if (parse_argument (argc, argv, "--depth_unit", depth_unit) > 0)
+ {
+ if (depth_unit == "m")
+ {
+ depth_unit_magic = 1.0f;
+ }
+ else if (depth_unit == "mm")
+ {
+ depth_unit_magic = 1000.0f;
+ }
+ else
+ {
+ print_error ("Unknow depth unit defined.\n");
+ exit (-1);
+ }
+ }
+
+ enable_depth = true;
+ }
+
+ // Retrieve the entries from the image data and copy them into the output RGB cloud
double* pixel = new double [4];
- memset (pixel, 0, sizeof(double) * 4);
+ memset (pixel, 0, sizeof (double) * 4);
+ float depth;
std::string intensity_type;
PointCloud<Intensity> mono_cloud;
PointCloud<Intensity8u> mono_cloud_u8;
PointCloud<RGB> color_cloud;
+ PointCloud<PointXYZI> mono_depth_cloud;
+ PointCloud<PointXYZRGB> rgb_depth_cloud;
+ PointCloud<PointXYZRGBA> rgba_depth_cloud;
int rgb;
int rgba;
{
case 1: if (intensity_type.compare ("FLOAT") == 0)
{
- mono_cloud.width = dimensions[0];
- mono_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
- mono_cloud.is_dense = true;
- mono_cloud.points.resize (mono_cloud.width * mono_cloud.height);
+ if (enable_depth)
+ {
+ mono_depth_cloud.width = dimensions[0];
+ mono_depth_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ mono_depth_cloud.is_dense = false;
+ mono_depth_cloud.resize (mono_depth_cloud.width * mono_depth_cloud.height);
+
+ for (int y = 0; y < dimensions[1]; y++)
+ {
+ for (int x = 0; x < dimensions[0]; x++)
+ {
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
+ depth = depth_image_data->GetScalarComponentAsFloat (x, y, 0, 0) / depth_unit_magic;
- // TODO: is this Z loop needed?
- for (int z = 0; z < dimensions[2]; z++)
+ PointXYZI xyzi;
+ depth2xyz (v_viewing_angle, h_viewing_angle,
+ mono_depth_cloud.width, mono_depth_cloud.height, x, y,
+ depth, xyzi.x, xyzi.y, xyzi.z);
+ xyzi.intensity = static_cast<float> (pixel[0]) / MAX_COLOR_INTENSITY;
+
+ mono_depth_cloud (x, dimensions[1] - y -1) = xyzi;
+ }
+ }
+
+ // Save the point cloud into a PCD file
+ saveCloud<PointXYZI> (argv[pcd_file_indices[0]], mono_depth_cloud, format);
+ }
+ else
{
+ mono_cloud.width = dimensions[0];
+ mono_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ mono_cloud.is_dense = true;
+ mono_cloud.points.resize (mono_cloud.width * mono_cloud.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
- pixel[0] = image_data->GetScalarComponentAsDouble(x, y, 0, 0);
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
Intensity gray;
gray.intensity = static_cast<float> (pixel[0]) / MAX_COLOR_INTENSITY;
mono_cloud (x, dimensions[1] - y - 1) = gray;
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<Intensity> (argv[pcd_file_indices[0]], mono_cloud, format);
+ // Save the point cloud into a PCD file
+ saveCloud<Intensity> (argv[pcd_file_indices[0]], mono_cloud, format);
+ }
}
else
{
mono_cloud_u8.is_dense = true;
mono_cloud_u8.points.resize (mono_cloud_u8.width * mono_cloud_u8.height);
- for (int z = 0; z < dimensions[2]; z++)
+ for (int y = 0; y < dimensions[1]; y++)
{
- for (int y = 0; y < dimensions[1]; y++)
+ for (int x = 0; x < dimensions[0]; x++)
{
- for (int x = 0; x < dimensions[0]; x++)
- {
- pixel[0] = image_data->GetScalarComponentAsDouble(x, y, 0, 0);
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
- Intensity8u gray;
- gray.intensity = static_cast<uint8_t> (pixel[0]);
+ Intensity8u gray;
+ gray.intensity = static_cast<uint8_t> (pixel[0]);
- mono_cloud_u8 (x, dimensions[1] - y - 1) = gray;
- }
+ mono_cloud_u8 (x, dimensions[1] - y - 1) = gray;
}
}
}
break;
- case 3: color_cloud.width = dimensions[0];
- color_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
- color_cloud.is_dense = true;
- color_cloud.points.resize (color_cloud.width * color_cloud.height);
+ case 3: if (enable_depth)
+ {
+ rgb_depth_cloud.width = dimensions[0];
+ rgb_depth_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ rgb_depth_cloud.is_dense = false;
+ rgb_depth_cloud.resize (rgb_depth_cloud.width * rgb_depth_cloud.height);
- for (int z = 0; z < dimensions[2]; z++)
+ for (int y = 0; y < dimensions[1]; y++)
+ {
+ for (int x = 0; x < dimensions[0]; x++)
+ {
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
+ pixel[1] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 1);
+ pixel[2] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 2);
+ depth = depth_image_data->GetScalarComponentAsFloat (x, y, 0, 0) / depth_unit_magic;
+
+ PointXYZRGB xyzrgb;
+ depth2xyz (v_viewing_angle, h_viewing_angle,
+ rgb_depth_cloud.width, rgb_depth_cloud.height, x, y,
+ depth, xyzrgb.x, xyzrgb.y, xyzrgb.z);
+ xyzrgb.r = static_cast<uint8_t> (pixel[0]);
+ xyzrgb.g = static_cast<uint8_t> (pixel[1]);
+ xyzrgb.b = static_cast<uint8_t> (pixel[2]);
+
+ rgb_depth_cloud (x, dimensions[1] - y - 1) = xyzrgb;
+ }
+ }
+
+ // Save the point cloud into a PCD file
+ saveCloud<PointXYZRGB> (argv[pcd_file_indices[0]], rgb_depth_cloud, format);
+ }
+ else
{
+ color_cloud.width = dimensions[0];
+ color_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ color_cloud.is_dense = true;
+ color_cloud.points.resize (color_cloud.width * color_cloud.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
- pixel[0] = image_data->GetScalarComponentAsDouble(x, y, 0, 0);
- pixel[1] = image_data->GetScalarComponentAsDouble(x, y, 0, 1);
- pixel[2] = image_data->GetScalarComponentAsDouble(x, y, 0, 2);
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
+ pixel[1] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 1);
+ pixel[2] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 2);
RGB color;
color.r = static_cast<uint8_t> (pixel[0]);
color_cloud (x, dimensions[1] - y - 1) = color;
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<RGB> (argv[pcd_file_indices[0]], color_cloud, format);
+ // Save the point cloud into a PCD file
+ saveCloud<RGB> (argv[pcd_file_indices[0]], color_cloud, format);
+ }
break;
- case 4: color_cloud.width = dimensions[0];
- color_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
- color_cloud.is_dense = true;
- color_cloud.points.resize (color_cloud.width * color_cloud.height);
+ case 4: if (enable_depth)
+ {
+ rgba_depth_cloud.width = dimensions[0];
+ rgba_depth_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ rgba_depth_cloud.is_dense = false;
+ rgba_depth_cloud.resize (rgba_depth_cloud.width * rgba_depth_cloud.height);
+
+ for (int y = 0; y < dimensions[1]; y++)
+ {
+ for (int x = 0; x < dimensions[0]; x++)
+ {
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
+ pixel[1] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 1);
+ pixel[2] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 2);
+ pixel[3] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 3);
+ depth = depth_image_data->GetScalarComponentAsFloat (x, y, 0, 0) / depth_unit_magic;
+
+ PointXYZRGBA xyzrgba;
+ depth2xyz (v_viewing_angle, h_viewing_angle,
+ rgba_depth_cloud.width, rgba_depth_cloud.height, x, y,
+ depth, xyzrgba.x, xyzrgba.y, xyzrgba.z);
+ xyzrgba.r = static_cast<uint8_t> (pixel[0]);
+ xyzrgba.g = static_cast<uint8_t> (pixel[1]);
+ xyzrgba.b = static_cast<uint8_t> (pixel[2]);
+ xyzrgba.a = static_cast<uint8_t> (pixel[3]);
+
+ rgba_depth_cloud (x, dimensions[1] - y - 1) = xyzrgba;
+ }
+ }
- for (int z = 0; z < dimensions[2]; z++)
+ // Save the point cloud into a PCD file
+ saveCloud<PointXYZRGBA> (argv[pcd_file_indices[0]], rgba_depth_cloud, format);
+ }
+ else
{
+ color_cloud.width = dimensions[0];
+ color_cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ color_cloud.is_dense = true;
+ color_cloud.points.resize (color_cloud.width * color_cloud.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
- pixel[0] = image_data->GetScalarComponentAsDouble(x, y, 0, 0);
- pixel[1] = image_data->GetScalarComponentAsDouble(x, y, 0, 1);
- pixel[2] = image_data->GetScalarComponentAsDouble(x, y, 0, 2);
- pixel[3] = image_data->GetScalarComponentAsDouble(x, y, 0, 3);
+ pixel[0] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 0);
+ pixel[1] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 1);
+ pixel[2] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 2);
+ pixel[3] = color_image_data->GetScalarComponentAsDouble (x, y, 0, 3);
RGB color;
color.r = static_cast<uint8_t> (pixel[0]);
color_cloud (x, dimensions[1] - y - 1) = color;
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<RGB> (argv[pcd_file_indices[0]], color_cloud, format);
+ // Save the point cloud into a PCD file
+ saveCloud<RGB> (argv[pcd_file_indices[0]], color_cloud, format);
+ }
break;
}
}
else if (mode.compare ("FORCE_COLOR") == 0)
{
//
- // Force the output cloud to be a pcl::PointCloud<pcl::RGB> even if the input image is a
+ // Force the output cloud to be colored even if the input image is a
// monochrome image.
//
+ if (enable_depth)
+ {
+ PointCloud<PointXYZRGBA> cloud;
+ int dimensions[3];
+ color_image_data->GetDimensions (dimensions);
+ cloud.width = dimensions[0];
+ cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ cloud.is_dense = false;
+ cloud.points.resize (cloud.width * cloud.height);
- PointCloud<RGB> cloud;
- int dimensions[3];
- image_data->GetDimensions (dimensions);
- cloud.width = dimensions[0];
- cloud.height = dimensions[1]; // This indicates that the point cloud is organized
- cloud.is_dense = true;
- cloud.points.resize (cloud.width * cloud.height);
+ for (int y = 0; y < dimensions[1]; y++)
+ {
+ for (int x = 0; x < dimensions[0]; x++)
+ {
+ for (int c = 0; c < components; c++)
+ pixel[c] = color_image_data->GetScalarComponentAsDouble (x, y, 0, c);
+ depth = depth_image_data->GetScalarComponentAsFloat (x, y, 0, 0) / depth_unit_magic;
+
+ PointXYZRGBA color;
+ depth2xyz (v_viewing_angle, h_viewing_angle,
+ cloud.width, cloud.height, x, y,
+ depth, color.x, color.y, color.z);
+ color.r = 0;
+ color.g = 0;
+ color.b = 0;
+ color.a = 0;
- for (int z = 0; z < dimensions[2]; z++)
+ switch (components)
+ {
+ case 1: color.r = static_cast<uint8_t> (pixel[0]);
+ color.g = static_cast<uint8_t> (pixel[0]);
+ color.b = static_cast<uint8_t> (pixel[0]);
+ break;
+
+ case 3: color.r = static_cast<uint8_t> (pixel[0]);
+ color.g = static_cast<uint8_t> (pixel[1]);
+ color.b = static_cast<uint8_t> (pixel[2]);
+ break;
+
+ case 4: color.r = static_cast<uint8_t> (pixel[0]);
+ color.g = static_cast<uint8_t> (pixel[1]);
+ color.b = static_cast<uint8_t> (pixel[2]);
+ color.a = static_cast<uint8_t> (pixel[3]);
+ break;
+ }
+
+ cloud (x, dimensions[1] - y -1) = color;
+ }
+ }
+
+ // Save the point cloud into a PCD file
+ saveCloud<PointXYZRGBA> (argv[pcd_file_indices[0]], cloud, format);
+ }
+ else
{
+ PointCloud<RGB> cloud;
+ int dimensions[3];
+ color_image_data->GetDimensions (dimensions);
+ cloud.width = dimensions[0];
+ cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ cloud.is_dense = true;
+ cloud.points.resize (cloud.width * cloud.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
for (int c = 0; c < components; c++)
- pixel[c] = image_data->GetScalarComponentAsDouble(x, y, 0, c);
+ pixel[c] = color_image_data->GetScalarComponentAsDouble (x, y, 0, c);
RGB color;
color.r = 0;
}
cloud (x, dimensions[1] - y - 1) = color;
-
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<RGB> (argv[pcd_file_indices[0]], cloud, format);
+ // Save the point cloud into a PCD file
+ saveCloud<RGB> (argv[pcd_file_indices[0]], cloud, format);
+ }
}
else if (mode.compare ("FORCE_GRAYSCALE") == 0)
{
+ if (enable_depth)
+ {
+ PointCloud<PointXYZI> cloud;
+ int dimensions[3];
+ color_image_data->GetDimensions (dimensions);
+ cloud.width = dimensions[0];
+ cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ cloud.is_dense = false;
+ cloud.points.resize (cloud.width * cloud.height);
+
+ for (int y = 0; y < dimensions[1]; y++)
+ {
+ for (int x = 0; x < dimensions[0]; x++)
+ {
+ for (int c = 0; c < components; c++)
+ pixel[c] = color_image_data->GetScalarComponentAsDouble (x, y, 0, c);
+ depth = depth_image_data->GetScalarComponentAsFloat (x, y, 0, 0) / depth_unit_magic;
+
+ PointXYZI gray;
+ depth2xyz (v_viewing_angle, h_viewing_angle,
+ cloud.width, cloud.height, x, y,
+ depth, gray.x, gray.y, gray.z);
+
+ switch (components)
+ {
+ case 1: gray.intensity = static_cast<float> (pixel[0]) / MAX_COLOR_INTENSITY;
+ break;
+
+ case 3: gray.intensity = static_cast<float> ( RED_MULTIPLIER * pixel[0] +
+ GREEN_MULTIPLIER * pixel[1] +
+ BLUE_MULTIPLIER * pixel[2] ) / MAX_COLOR_INTENSITY;
+ break;
+
+ case 4: gray.intensity = static_cast<float> ( RED_MULTIPLIER * pixel[0] +
+ GREEN_MULTIPLIER * pixel[1] +
+ BLUE_MULTIPLIER * pixel[2] ) / MAX_COLOR_INTENSITY;
+ break;
+ }
+
+ cloud (x, dimensions[1] - y - 1) = gray;
+ }
+ }
+
+ // Save the point cloud into a PCD file
+ saveCloud<PointXYZI> (argv[pcd_file_indices[0]], cloud, format);
+ }
+ else
//
// Force the output cloud to be:
// - a pcl::PointCloud<pcl::Intensity> if the intensity_type flag is set to FLOAT;
// - a pcl::PointCloud<pcl::Intensity8u> if the intensity_type flag is set to UINT_8;
// even if the input image is a RGB or a RGBA image.
//
-
- PointCloud<Intensity> cloud;
- PointCloud<Intensity8u> cloud8u;
-
- if (pcl::console::parse_argument (argc, argv, "--intensity_type", intensity_type) != -1)
{
- if (intensity_type.compare ("FLOAT") == 0)
- {
- cloud.width = dimensions[0];
- cloud.height = dimensions[1]; // This indicates that the point cloud is organized
- cloud.is_dense = true;
- cloud.points.resize (cloud.width * cloud.height);
+ PointCloud<Intensity> cloud;
+ PointCloud<Intensity8u> cloud8u;
- for (int z = 0; z < dimensions[2]; z++)
+ if (pcl::console::parse_argument (argc, argv, "--intensity_type", intensity_type) != -1)
+ {
+ if (intensity_type.compare ("FLOAT") == 0)
{
+ cloud.width = dimensions[0];
+ cloud.height = dimensions[1]; // This indicates that the point cloud is organized
+ cloud.is_dense = true;
+ cloud.points.resize (cloud.width * cloud.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
for (int c = 0; c < components; c++)
- pixel[c] = image_data->GetScalarComponentAsDouble(x, y, 0, c);
+ pixel[c] = color_image_data->GetScalarComponentAsDouble (x, y, 0, c);
Intensity gray;
cloud (x, dimensions[1] - y - 1) = gray;
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<Intensity> (argv[pcd_file_indices[0]], cloud, format);
- }
- else if (intensity_type.compare ("UINT_8") != 0)
- {
- cloud8u.width = dimensions[0];
- cloud8u.height = dimensions[1]; // This indicates that the point cloud is organized
- cloud8u.is_dense = true;
- cloud8u.points.resize (cloud8u.width * cloud8u.height);
-
- for (int z = 0; z < dimensions[2]; z++)
+ // Save the point cloud into a PCD file
+ saveCloud<Intensity> (argv[pcd_file_indices[0]], cloud, format);
+ }
+ else if (intensity_type.compare ("UINT_8") != 0)
{
+ cloud8u.width = dimensions[0];
+ cloud8u.height = dimensions[1]; // This indicates that the point cloud is organized
+ cloud8u.is_dense = true;
+ cloud8u.points.resize (cloud8u.width * cloud8u.height);
+
for (int y = 0; y < dimensions[1]; y++)
{
for (int x = 0; x < dimensions[0]; x++)
{
for (int c = 0; c < components; c++)
- pixel[c] = image_data->GetScalarComponentAsDouble(x, y, 0, c);
+ pixel[c] = color_image_data->GetScalarComponentAsDouble (x, y, 0, c);
Intensity8u gray;
cloud8u (x, dimensions[1] - y - 1) = gray;
}
}
- }
- // Save the point cloud into a PCD file
- saveCloud<Intensity8u> (argv[pcd_file_indices[0]], cloud8u, format);
+ // Save the point cloud into a PCD file
+ saveCloud<Intensity8u> (argv[pcd_file_indices[0]], cloud8u, format);
+ }
+ else
+ {
+ print_error ("Wrong intensity option.\n");
+ printHelp (argc, argv);
+ exit (-1);
+ }
}
else
{
- print_error ("Wrong intensity option.\n");
- printHelp (argc, argv);
+ print_error ("The intensity type must be set to enable the PNG conversion.\n");
exit (-1);
}
}
- else
- {
- print_error ("The intensity type must be set to enable the PNG conversion.\n");
- exit (-1);
- }
-
}
delete[] pixel;
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2009-2012, Willow Garage, Inc.
+ * Copyright (c) 2012-, Open Perception, Inc.
+ * Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+
+using namespace std;
+using namespace pcl;
+using namespace pcl::io;
+using namespace pcl::console;
+
+typedef PointXYZ PointType;
+typedef PointCloud<PointXYZ> Cloud;
+typedef const Cloud::ConstPtr ConstCloudPtr;
+
+int default_max_window_size = 33;
+float default_slope = 0.7f;
+float default_max_distance = 10.0f;
+float default_initial_distance = 0.15f;
+float default_cell_size = 1.0f;
+float default_base = 2.0f;
+bool default_exponential = true;
+int default_verbosity_level = 3;
+
+void
+printHelp (int, char **argv)
+{
+ print_error ("Syntax is: %s input.pcd output.pcd <options>\n", argv[0]);
+ print_info (" where options are:\n");
+ print_info (" -max_window_size X = maximum window size (default: ");
+ print_value ("%d", default_max_window_size); print_info (")\n");
+ print_info (" -slope X = slope value to compute threshold (default: ");
+ print_value ("%f", default_slope); print_info (")\n");
+ print_info (" -max_distnace X = maximum distance from parameterized ground surface to be considered ground (default: ");
+ print_value ("%f", default_max_distance); print_info (")\n");
+ print_info (" -initial_distance X = initial distance from parameterized ground surface to be considered ground (default: ");
+ print_value ("%f", default_initial_distance); print_info (")\n");
+ print_info (" -cell_size X = cell size (default: ");
+ print_value ("%f", default_cell_size); print_info (")\n");
+ print_info (" -base X = base to be used in computing progressive window sizes (default: ");
+ print_value ("%f", default_base); print_info (")\n");
+ print_info (" -exponential X = use exponential growth? (default: ");
+ print_value ("%s", default_exponential?"true":"false"); print_info (")\n");
+ print_info (" -approximate X = use approximate? (default: false\n");
+ print_info (" -input_dir X = batch process all PCD files found in input_dir\n");
+ print_info (" -output_dir X = save the processed files from input_dir in this directory\n");
+ print_info (" -verbosity X = verbosity level (default: ");
+ print_value ("%d", default_verbosity_level); print_info (")\n");
+}
+
+bool
+loadCloud (const std::string &filename, Cloud &cloud)
+{
+ TicToc tt;
+ print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
+
+ tt.tic ();
+ if (loadPCDFile (filename, cloud) < 0)
+ return (false);
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
+ print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
+
+ return (true);
+}
+
+void
+compute (ConstCloudPtr &input, Cloud &output, int max_window_size, float slope, float max_distance, float initial_distance, float cell_size, float base, bool exponential, bool approximate)
+{
+ // Estimate
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight (stderr, "Computing ");
+
+ std::vector<int> ground;
+
+ if (approximate)
+ {
+ PCL_DEBUG ("approx with %d points\n", input->points.size ());
+ ApproximateProgressiveMorphologicalFilter<PointType> pmf;
+ pmf.setInputCloud (input);
+ pmf.setMaxWindowSize (max_window_size);
+ pmf.setSlope (slope);
+ pmf.setMaxDistance (max_distance);
+ pmf.setInitialDistance (initial_distance);
+ pmf.setCellSize (cell_size);
+ pmf.setBase (base);
+ pmf.setExponential (exponential);
+ pmf.extract (ground);
+ }
+ else
+ {
+ PCL_DEBUG ("full\n");
+ ProgressiveMorphologicalFilter<PointType> pmf;
+ pmf.setInputCloud (input);
+ pmf.setMaxWindowSize (max_window_size);
+ pmf.setSlope (slope);
+ pmf.setMaxDistance (max_distance);
+ pmf.setInitialDistance (initial_distance);
+ pmf.setCellSize (cell_size);
+ pmf.setBase (base);
+ pmf.setExponential (exponential);
+ pmf.extract (ground);
+ }
+
+ PointIndicesPtr idx (new PointIndices);
+ idx->indices = ground;
+
+ ExtractIndices<PointType> extract;
+ extract.setInputCloud (input);
+ extract.setIndices (idx);
+ extract.setNegative (false);
+ extract.filter (output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+void
+saveCloud (const std::string &filename, const Cloud &output)
+{
+ TicToc tt;
+ tt.tic ();
+
+ print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
+
+ PCDWriter w;
+ w.writeBinaryCompressed (filename, output);
+
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
+}
+
+int
+batchProcess (const vector<string> &pcd_files, string &output_dir, int max_window_size, float slope, float max_distance, float initial_distance, float cell_size, float base, bool exponential, bool approximate)
+{
+ vector<string> st;
+ for (size_t i = 0; i < pcd_files.size (); ++i)
+ {
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (pcd_files[i], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, max_window_size, slope, max_distance, initial_distance, cell_size, base, exponential, approximate);
+
+ // Prepare output file name
+ string filename = pcd_files[i];
+ boost::trim (filename);
+ boost::split (st, filename, boost::is_any_of ("/\\"), boost::token_compress_on);
+
+ // Save into the second file
+ stringstream ss;
+ ss << output_dir << "/" << st.at (st.size () - 1);
+ saveCloud (ss.str (), output);
+ }
+ return (0);
+}
+
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ print_info ("Filter a point cloud using the pcl::ProgressiveMorphologicalFilter. For more information, use: %s -h\n", argv[0]);
+
+ if (argc < 3)
+ {
+ printHelp (argc, argv);
+ return (-1);
+ }
+
+ bool batch_mode = false;
+
+ // Command line parsing
+ int max_window_size = default_max_window_size;
+ float slope = default_slope;
+ float max_distance = default_max_distance;
+ float initial_distance = default_initial_distance;
+ float cell_size = default_cell_size;
+ float base = default_base;
+ bool exponential = default_exponential;
+ bool approximate;
+ int verbosity_level = default_verbosity_level;
+ parse_argument (argc, argv, "-max_window_size", max_window_size);
+ parse_argument (argc, argv, "-slope", slope);
+ parse_argument (argc, argv, "-max_distance", max_distance);
+ parse_argument (argc, argv, "-initial_distance", initial_distance);
+ parse_argument (argc, argv, "-cell_size", cell_size);
+ parse_argument (argc, argv, "-base", base);
+ parse_argument (argc, argv, "-exponential", exponential);
+ approximate = find_switch (argc, argv, "-approximate");
+ parse_argument (argc, argv, "-verbosity", verbosity_level);
+ string input_dir, output_dir;
+ if (parse_argument (argc, argv, "-input_dir", input_dir) != -1)
+ {
+ PCL_INFO ("Input directory given as %s. Batch process mode on.\n", input_dir.c_str ());
+ if (parse_argument (argc, argv, "-output_dir", output_dir) == -1)
+ {
+ PCL_ERROR ("Need an output directory! Please use -output_dir to continue.\n");
+ return (-1);
+ }
+
+ // Both input dir and output dir given, switch into batch processing mode
+ batch_mode = true;
+ }
+
+ switch (verbosity_level)
+ {
+ case 0:
+ pcl::console::setVerbosityLevel(pcl::console::L_ALWAYS);
+ break;
+
+ case 1:
+ pcl::console::setVerbosityLevel(pcl::console::L_ERROR);
+ break;
+
+ case 2:
+ pcl::console::setVerbosityLevel(pcl::console::L_WARN);
+ break;
+
+ case 3:
+ pcl::console::setVerbosityLevel(pcl::console::L_INFO);
+ break;
+
+ case 4:
+ pcl::console::setVerbosityLevel(pcl::console::L_DEBUG);
+ break;
+
+ default:
+ pcl::console::setVerbosityLevel(pcl::console::L_VERBOSE);
+ break;
+ }
+
+ if (!batch_mode)
+ {
+ // Parse the command line arguments for .pcd files
+ std::vector<int> p_file_indices;
+ p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 2)
+ {
+ print_error ("Need one input PCD file and one output PCD file to continue.\n");
+ return (-1);
+ }
+
+ // Load the first file
+ Cloud::Ptr cloud (new Cloud);
+ if (!loadCloud (argv[p_file_indices[0]], *cloud))
+ return (-1);
+
+ // Perform the feature estimation
+ Cloud output;
+ compute (cloud, output, max_window_size, slope, max_distance, initial_distance, cell_size, base, exponential, approximate);
+
+ // Save into the second file
+ saveCloud (argv[p_file_indices[1]], output);
+ }
+ else
+ {
+ if (input_dir != "" && boost::filesystem::exists (input_dir))
+ {
+ vector<string> pcd_files;
+ boost::filesystem::directory_iterator end_itr;
+ for (boost::filesystem::directory_iterator itr (input_dir); itr != end_itr; ++itr)
+ {
+ // Only add PCD files
+ if (!is_directory (itr->status ()) && boost::algorithm::to_upper_copy (boost::filesystem::extension (itr->path ())) == ".PCD" )
+ {
+ pcd_files.push_back (itr->path ().string ());
+ PCL_INFO ("[Batch processing mode] Added %s for processing.\n", itr->path ().string ().c_str ());
+ }
+ }
+ batchProcess (pcd_files, output_dir, max_window_size, slope, max_distance, initial_distance, cell_size, base, exponential, approximate);
+ }
+ else
+ {
+ PCL_ERROR ("Batch processing mode enabled, but invalid input directory (%s) given!\n", input_dir.c_str ());
+ return (-1);
+ }
+ }
+}
+
cond->addComparison (pcl::TfQuadraticXYZComparison<PointType>::ConstPtr (new pcl::TfQuadraticXYZComparison<PointType> (inside ? pcl::ComparisonOps::LT : pcl::ComparisonOps::GT, Eigen::Matrix3f::Identity (),
Eigen::Vector3f::Zero (), - radius * radius)));
- pcl::ConditionalRemoval<PointType> condrem (cond);
+ pcl::ConditionalRemoval<PointType> condrem;
+ condrem.setCondition (cond);
condrem.setInputCloud (input);
condrem.setKeepOrganized (keep_organized);
condrem.filter (*output);
sac.getInliers (inliers);
sac.getModelCoefficients (coefficients);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms, plane has : "); print_value ("%zu", inliers.size ()); print_info (" points]\n");
+ print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms, plane has : "); print_value ("%lu", inliers.size ()); print_info (" points]\n");
print_info ("Model coefficients: [");
print_value ("%g %g %g %g", coefficients[0], coefficients[1], coefficients[2], coefficients[3]); print_info ("]\n");
if(ret == 2 || ret == 3)
{
reader->SetFileName (tiff_rgb_files[i].c_str());
+ reader->Update ();
rgb_data = reader->GetOutput ();
- rgb_data->Update ();
std::string rgb_filename = tiff_rgb_paths[i].filename().string();
std::string rgb_time = rgb_filename.substr(6,22);
// Try to read the depth file
int found = 0; // indicates if a corresponding depth file was found
// Find the correct file name
- for(int j = 0; j < tiff_depth_paths.size(); j++)
+ for(size_t j = 0; j < tiff_depth_paths.size(); j++)
{
std::string depth_filename = tiff_depth_paths[i].filename().string();
std::string depth_time = depth_filename.substr(6,22);
if(read == 2 || read == 3)
{
depth_reader->SetFileName (tiff_depth_files[j].c_str());
+ depth_reader->Update ();
depth_data = depth_reader->GetOutput ();
- depth_data->Update ();
processAndSave(depth_data, rgb_data, depth_time, focal_length, format, color, depth, use_output_path, output_path_);
}
bool has_normals = false;
for (size_t i = 0; i < input.fields.size (); ++i)
{
- if (input.fields[i].name == "rgb")
+ if (input.fields[i].name.find("rgb") != std::string::npos)
has_rgb = true;
if (input.fields[i].name == "normal_x")
has_normals = true;
}
else
{
- print_error ("Wrong number of values given (%zu): ", values.size ());
+ print_error ("Wrong number of values given (%lu): ", values.size ());
print_error ("The quaternion specified with -quat must contain 4 elements (w,x,y,z).\n");
}
}
}
else
{
- print_error ("Wrong number of values given (%zu): ", values.size ());
+ print_error ("Wrong number of values given (%lu): ", values.size ());
print_error ("The rotation specified with -axisangle must contain 4 elements (ax,ay,az,theta).\n");
}
}
}
else
{
- print_error ("Wrong number of values given (%zu): ", values.size ());
+ print_error ("Wrong number of values given (%lu): ", values.size ());
print_error ("The transformation specified with -matrix must be 3x3 (9) or 4x4 (16).\n");
}
}
vtkSmartPointer<vtkLoopSubdivisionFilter> subdivide = vtkSmartPointer<vtkLoopSubdivisionFilter>::New ();
subdivide->SetNumberOfSubdivisions (subdiv_level);
subdivide->SetInputConnection (icosa->GetOutputPort ());
+ subdivide->Update ();
// Get camera positions
vtkPolyData *sphere = subdivide->GetOutput ();
- sphere->Update ();
if (!single_view)
PCL_INFO ("Created %ld camera position points.\n", sphere->GetNumberOfPoints ());
}
pcl::PCDWriter writer;
- PCL_INFO ("Wrote %zu points (%d x %d) to %s\n", cloud.points.size (), cloud.width, cloud.height, fname.c_str ());
+ PCL_INFO ("Wrote %lu points (%d x %d) to %s\n", cloud.points.size (), cloud.width, cloud.height, fname.c_str ());
writer.writeBinaryCompressed (fname.c_str (), cloud);
} // sphere
return (0);
}
else
{
- print_error ("Leaf size must be specified with either 1 or 3 numbers (%zu given).\n", values.size ());
+ print_error ("Leaf size must be specified with either 1 or 3 numbers (%lu given).\n", values.size ());
}
print_info ("Using a leaf size of: "); print_value ("%f, %f, %f\n", leaf_x, leaf_y, leaf_z);
double y = voxelCenters.points[i].y;
double z = voxelCenters.points[i].z;
+#if VTK_MAJOR_VERSION < 6
treeWireframe->AddInput (getCuboid (x - s, x + s, y - s, y + s, z - s, z + s));
+#else
+ treeWireframe->AddInputData (getCuboid (x - s, x + s, y - s, y + s, z - s, z + s));
+#endif
+
}
vtkSmartPointer < vtkLODActor > treeActor = vtkSmartPointer<vtkLODActor>::New ();
vtkSmartPointer < vtkDataSetMapper > mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (treeWireframe->GetOutput ());
+#else
+ mapper->SetInputData (treeWireframe->GetOutput ());
+#endif
+
treeActor->SetMapper (mapper);
treeActor->GetProperty ()->SetRepresentationToWireframe ();
vtkSmartPointer<vtkActorCollection> coll)
{
vtkSmartPointer < vtkAppendPolyData > treeWireframe = vtkSmartPointer<vtkAppendPolyData>::New ();
+#if VTK_MAJOR_VERSION < 6
treeWireframe->AddInput (getCuboid (min_b[0], max_b[0], min_b[1], max_b[1], min_b[2], max_b[2]));
+#else
+ treeWireframe->AddInputData (getCuboid (min_b[0], max_b[0], min_b[1], max_b[1], min_b[2], max_b[2]));
+#endif
vtkSmartPointer < vtkActor > treeActor = vtkSmartPointer<vtkActor>::New ();
vtkSmartPointer < vtkDataSetMapper > mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (treeWireframe->GetOutput ());
+#else
+ mapper->SetInputData (treeWireframe->GetOutput ());
+#endif
treeActor->SetMapper (mapper);
treeActor->GetProperty ()->SetRepresentationToWireframe ();
}
else
{
- print_error ("Leaf size must be specified with either 1 or 3 numbers (%zu given).\n", values.size ());
+ print_error ("Leaf size must be specified with either 1 or 3 numbers (%lu given).\n", values.size ());
}
print_info ("Using a leaf size of: "); print_value ("%f, %f, %f\n", leaf_x, leaf_y, leaf_z);
if (copy_normals)
{
vtkSmartPointer<vtkPolyDataNormals> ng = vtkSmartPointer<vtkPolyDataNormals>::New ();
+#if VTK_MAJOR_VERSION < 6
ng->SetInput (polydata);
+#else
+ ng->SetInputData (polydata);
+#endif
ng->ComputePointNormalsOn ();
ng->ComputeCellNormalsOff ();
ng->Update ();
vtkSmartPointer<vtkPolyData> polydata;
vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New ();
reader->SetFileName (argv[vtk_file_indices[0]]);
+ reader->Update ();
polydata = reader->GetOutput ();
- polydata->Update ();
- print_info ("Loaded %s with %zu points/vertices.\n", argv[vtk_file_indices[0]], polydata->GetNumberOfPoints ());
+ print_info ("Loaded %s with %lu points/vertices.\n", argv[vtk_file_indices[0]], polydata->GetNumberOfPoints ());
// Convert to PLY and save
vtkSmartPointer<vtkPLYWriter> writer = vtkSmartPointer<vtkPLYWriter>::New ();
+#if VTK_MAJOR_VERSION < 6
writer->SetInput (polydata);
+#else
+ writer->SetInputData (polydata);
+#endif
writer->SetArrayName ("Colors");
writer->SetFileTypeToASCII ();
writer->SetFileName (argv[ply_file_indices[0]]);
set(SUBSYS_DEPS common search kdtree filters octree)
set(build TRUE)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ON)
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS})
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON)
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS})
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
set(incs
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/tracking.h
- include/pcl/${SUBSYS_NAME}/tracker.h
- include/pcl/${SUBSYS_NAME}/coherence.h
- include/pcl/${SUBSYS_NAME}/nearest_pair_point_cloud_coherence.h
- include/pcl/${SUBSYS_NAME}/approx_nearest_pair_point_cloud_coherence.h
- include/pcl/${SUBSYS_NAME}/distance_coherence.h
- include/pcl/${SUBSYS_NAME}/hsv_color_coherence.h
- include/pcl/${SUBSYS_NAME}/normal_coherence.h
- include/pcl/${SUBSYS_NAME}/particle_filter.h
- include/pcl/${SUBSYS_NAME}/particle_filter_omp.h
- include/pcl/${SUBSYS_NAME}/kld_adaptive_particle_filter.h
- include/pcl/${SUBSYS_NAME}/kld_adaptive_particle_filter_omp.h
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/tracking.h"
+ "include/pcl/${SUBSYS_NAME}/tracker.h"
+ "include/pcl/${SUBSYS_NAME}/coherence.h"
+ "include/pcl/${SUBSYS_NAME}/nearest_pair_point_cloud_coherence.h"
+ "include/pcl/${SUBSYS_NAME}/approx_nearest_pair_point_cloud_coherence.h"
+ "include/pcl/${SUBSYS_NAME}/distance_coherence.h"
+ "include/pcl/${SUBSYS_NAME}/hsv_color_coherence.h"
+ "include/pcl/${SUBSYS_NAME}/normal_coherence.h"
+ "include/pcl/${SUBSYS_NAME}/particle_filter.h"
+ "include/pcl/${SUBSYS_NAME}/particle_filter_omp.h"
+ "include/pcl/${SUBSYS_NAME}/kld_adaptive_particle_filter.h"
+ "include/pcl/${SUBSYS_NAME}/kld_adaptive_particle_filter_omp.h"
+ "include/pcl/${SUBSYS_NAME}/pyramidal_klt.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/tracking.hpp
- include/pcl/${SUBSYS_NAME}/impl/tracker.hpp
- include/pcl/${SUBSYS_NAME}/impl/coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/nearest_pair_point_cloud_coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/approx_nearest_pair_point_cloud_coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/distance_coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/hsv_color_coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/normal_coherence.hpp
- include/pcl/${SUBSYS_NAME}/impl/particle_filter.hpp
- include/pcl/${SUBSYS_NAME}/impl/particle_filter_omp.hpp
- include/pcl/${SUBSYS_NAME}/impl/kld_adaptive_particle_filter.hpp
- include/pcl/${SUBSYS_NAME}/impl/kld_adaptive_particle_filter_omp.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/tracking.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/tracker.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/nearest_pair_point_cloud_coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/approx_nearest_pair_point_cloud_coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/distance_coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/hsv_color_coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/normal_coherence.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/particle_filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/particle_filter_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/kld_adaptive_particle_filter.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/kld_adaptive_particle_filter_omp.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/pyramidal_klt.hpp"
)
- set(LIB_NAME pcl_${SUBSYS_NAME})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${impl_incs})
- target_link_libraries(${LIB_NAME} pcl_common pcl_kdtree pcl_search pcl_filters pcl_octree)
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${impl_incs})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_kdtree pcl_search pcl_filters pcl_octree)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
endif(build)
addPointCoherence (PointCoherencePtr coherence) { point_coherences_.push_back (coherence); }
/** \brief add a PointCoherence to the PointCloudCoherence.
- * \param coherence a pointer to PointCoherence.
+ * \param cloud a pointer to PointCoherence.
*/
virtual inline void
setTargetCloud (const PointCloudInConstPtr &cloud) { target_input_ = cloud; }
target_h, target_s, target_v);
// hue value is in 0 ~ 2pi, but circulated.
const float _h_diff = fabsf (source_h - target_h);
+ // Also need to compute distance other way around circle - but need to check which is closer to 0
+ float _h_diff2;
+ if (source_h < target_h)
+ _h_diff2 = fabsf (1.0f + source_h - target_h); //Add 2pi to source, subtract target
+ else
+ _h_diff2 = fabsf (1.0f + target_h - source_h); //Add 2pi to target, subtract source
+
float h_diff;
- if (_h_diff > 0.5f)
- h_diff = static_cast<float> (h_weight_) * (_h_diff - 0.5f) * (_h_diff - 0.5f);
- else
+ //Now we need to choose the smaller distance
+ if (_h_diff < _h_diff2)
h_diff = static_cast<float> (h_weight_) * _h_diff * _h_diff;
+ else
+ h_diff = static_cast<float> (h_weight_) * _h_diff2 * _h_diff2;
const float s_diff = static_cast<float> (s_weight_) * (source_s - target_s) * (source_s - target_s);
const float v_diff = static_cast<float> (v_weight_) * (source_v - target_v) * (source_v - target_v);
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRACKING_IMPL_PYRAMIDAL_KLT_HPP
+#define PCL_TRACKING_IMPL_PYRAMIDAL_KLT_HPP
+
+#include <pcl/common/time.h>
+#include <pcl/common/utils.h>
+#include <pcl/tracking/boost.h>
+#include <pcl/common/io.h>
+#include <pcl/common/utils.h>
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> inline void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::setTrackingWindowSize (int width, int height)
+{
+ track_width_ = width;
+ track_height_ = height;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> inline void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::setPointsToTrack (const pcl::PointCloud<pcl::PointUV>::ConstPtr& keypoints)
+{
+ if (keypoints->size () <= keypoints_nbr_)
+ keypoints_ = keypoints;
+ else
+ {
+ pcl::PointCloud<pcl::PointUV>::Ptr p (new pcl::PointCloud<pcl::PointUV>);
+ p->reserve (keypoints_nbr_);
+ for (std::size_t i = 0; i < keypoints_nbr_; ++i)
+ p->push_back (keypoints->points[i]);
+ keypoints_ = p;
+ }
+
+ keypoints_status_.reset (new pcl::PointIndices);
+ keypoints_status_->indices.resize (keypoints_->size (), 0);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> inline void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::setPointsToTrack (const pcl::PointIndicesConstPtr& points)
+{
+ assert ((input_ || ref_) && "[pcl::tracking::PyramidalKLTTracker] CALL setInputCloud FIRST!");
+
+ pcl::PointCloud<pcl::PointUV>::Ptr keypoints (new pcl::PointCloud<pcl::PointUV>);
+ keypoints->reserve (keypoints_nbr_);
+ for (std::size_t i = 0; i < keypoints_nbr_; ++i)
+ {
+ pcl::PointUV uv;
+ uv.u = points->indices[i] % input_->width;
+ uv.v = points->indices[i] / input_->width;
+ keypoints->push_back (uv);
+ }
+ setPointsToTrack (keypoints);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> bool
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::initCompute ()
+{
+ // std::cout << ">>> [PyramidalKLTTracker::initCompute]" << std::endl;
+ if (!PCLBase<PointInT>::initCompute ())
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] PCLBase::Init failed.\n",
+ tracker_name_.c_str ());
+ return (false);
+ }
+
+ if (!input_->isOrganized ())
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] Need an organized point cloud to proceed!",
+ tracker_name_.c_str ());
+ return (false);
+ }
+
+ if (!keypoints_ || keypoints_->empty ())
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] No keypoints aborting!",
+ tracker_name_.c_str ());
+ return (false);
+ }
+
+ // This is the first call
+ if (!ref_)
+ {
+ ref_ = input_;
+ // std::cout << "First run!!!" << std::endl;
+
+ if ((track_height_ * track_width_)%2 == 0)
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] Tracking window (%dx%d) must be odd!\n",
+ tracker_name_.c_str (), track_width_, track_height_);
+ return (false);
+ }
+
+ if (track_height_ < 3 || track_width_ < 3)
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] Tracking window (%dx%d) must be >= 3x3!\n",
+ tracker_name_.c_str (), track_width_, track_height_);
+ return (false);
+ }
+
+ track_width_2_ = track_width_ / 2;
+ track_height_2_ = track_height_ / 2;
+
+ if (nb_levels_ < 2)
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] Number of pyramid levels should be at least 2!",
+ tracker_name_.c_str ());
+ return (false);
+ }
+
+ if (nb_levels_ > 5)
+ {
+ PCL_ERROR ("[pcl::tracking::%s::initCompute] Number of pyramid levels should not exceed 5!",
+ tracker_name_.c_str ());
+ return (false);
+ }
+
+ computePyramids (ref_, ref_pyramid_, pcl::BORDER_REFLECT_101);
+ return (true);
+ }
+ else
+ initialized_ = true;
+
+ return (true);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::derivatives (const FloatImage& src, FloatImage& grad_x, FloatImage& grad_y) const
+{
+ // std::cout << ">>> derivatives" << std::endl;
+ ////////////////////////////////////////////////////////
+ // Use Shcarr operator to compute derivatives. //
+ // Vertical kernel +3 +10 +3 = [1 0 -1]T * [3 10 3] //
+ // 0 0 0 //
+ // -3 -10 -3 //
+ // Horizontal kernel +3 0 -3 = [3 10 3]T * [1 0 -1] //
+ // +10 0 -10 //
+ // +3 0 -3 //
+ ////////////////////////////////////////////////////////
+ if (grad_x.size () != src.size () || grad_x.width != src.width || grad_x.height != src.height)
+ grad_x = FloatImage (src.width, src.height);
+ if (grad_y.size () != src.size () || grad_y.width != src.width || grad_y.height != src.height)
+ grad_y = FloatImage (src.width, src.height);
+
+ int height = src.height, width = src.width;
+ float *row0 = new float [src.width + 2];
+ float *row1 = new float [src.width + 2];
+ float *trow0 = row0; ++trow0;
+ float *trow1 = row1; ++trow1;
+ const float* src_ptr = &(src.points[0]);
+
+ for (int y = 0; y < height; y++)
+ {
+ const float* srow0 = src_ptr + (y > 0 ? y-1 : height > 1 ? 1 : 0) * width;
+ const float* srow1 = src_ptr + y * width;
+ const float* srow2 = src_ptr + (y < height-1 ? y+1 : height > 1 ? height-2 : 0) * width;
+ float* grad_x_row = &(grad_x.points[y * width]);
+ float* grad_y_row = &(grad_y.points[y * width]);
+
+ // do vertical convolution
+ for (int x = 0; x < width; x++)
+ {
+ trow0[x] = (srow0[x] + srow2[x])*3 + srow1[x]*10;
+ trow1[x] = srow2[x] - srow0[x];
+ }
+
+ // make border
+ int x0 = width > 1 ? 1 : 0, x1 = width > 1 ? width-2 : 0;
+ trow0[-1] = trow0[x0]; trow0[width] = trow0[x1];
+ trow1[-1] = trow1[x0]; trow1[width] = trow1[x1];
+
+ // do horizontal convolution and store results
+ for (int x = 0; x < width; x++)
+ {
+ grad_x_row[x] = trow0[x+1] - trow0[x-1];
+ grad_y_row[x] = (trow1[x+1] + trow1[x-1])*3 + trow1[x]*10;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::downsample (const FloatImageConstPtr& input,
+ FloatImageConstPtr& output) const
+{
+ FloatImage smoothed (input->width, input->height);
+ convolve (input, smoothed);
+
+ int width = (smoothed.width +1) / 2;
+ int height = (smoothed.height +1) / 2;
+
+ int *ii = new int[width];
+ int *ii_ptr = ii;
+ for (int i = 0; i < width; ++i)
+ *ii_ptr++ = 2*i;
+
+ FloatImagePtr down (new FloatImage (width, height));
+#ifdef _OPENMP
+#pragma omp parallel for shared (output) private (ii) num_threads (threads_)
+#endif
+ for (int j = 0; j < height; ++j)
+ {
+ int jj = 2*j;
+ for (int i = 0; i < width; ++i)
+ (*down) (i,j) = smoothed (ii[i],jj);
+ }
+
+ output = down;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::downsample (const FloatImageConstPtr& input,
+ FloatImageConstPtr& output,
+ FloatImageConstPtr& output_grad_x,
+ FloatImageConstPtr& output_grad_y) const
+{
+ downsample (input, output);
+ FloatImagePtr grad_x (new FloatImage (input->width, input->height));
+ FloatImagePtr grad_y (new FloatImage (input->width, input->height));
+ derivatives (*output, *grad_x, *grad_y);
+ output_grad_x = grad_x;
+ output_grad_y = grad_y;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::convolve (const FloatImageConstPtr& input, FloatImage& output) const
+{
+ FloatImagePtr tmp (new FloatImage (input->width, input->height));
+ convolveRows (input, *tmp);
+ convolveCols (tmp, output);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::convolveRows (const FloatImageConstPtr& input, FloatImage& output) const
+{
+ int width = input->width;
+ int height = input->height;
+ int last = input->width - kernel_size_2_;
+ int w = last - 1;
+
+#ifdef _OPENMP
+#pragma omp parallel for shared (output) num_threads (threads_)
+#endif
+ for (int j = 0; j < height; ++j)
+ {
+ for (int i = kernel_size_2_; i < last; ++i)
+ {
+ double result = 0;
+ for (int k = kernel_last_, l = i - kernel_size_2_; k > -1; --k, ++l)
+ result+= kernel_[k] * (*input) (l,j);
+
+ output (i,j) = static_cast<float> (result);
+ }
+
+ for (int i = last; i < width; ++i)
+ output (i,j) = output (w, j);
+
+ for (int i = 0; i < kernel_size_2_; ++i)
+ output (i,j) = output (kernel_size_2_, j);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::convolveCols (const FloatImageConstPtr& input, FloatImage& output) const
+{
+ output = FloatImage (input->width, input->height);
+
+ int width = input->width;
+ int height = input->height;
+ int last = input->height - kernel_size_2_;
+ int h = last -1;
+
+#ifdef _OPENMP
+#pragma omp parallel for shared (output) num_threads (threads_)
+#endif
+ for (int i = 0; i < width; ++i)
+ {
+ for (int j = kernel_size_2_; j < last; ++j)
+ {
+ double result = 0;
+ for (int k = kernel_last_, l = j - kernel_size_2_; k > -1; --k, ++l)
+ result += kernel_[k] * (*input) (i,l);
+ output (i,j) = static_cast<float> (result);
+ }
+
+ for (int j = last; j < height; ++j)
+ output (i,j) = output (i,h);
+
+ for (int j = 0; j < kernel_size_2_; ++j)
+ output (i,j) = output (i, kernel_size_2_);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::computePyramids (const PointCloudInConstPtr& input,
+ std::vector<FloatImageConstPtr>& pyramid,
+ pcl::InterpolationType border_type) const
+{
+ int step = 3;
+ pyramid.resize (step * nb_levels_);
+
+ FloatImageConstPtr previous;
+ FloatImagePtr tmp (new FloatImage (input->width, input->height));
+#ifdef _OPENMP
+#pragma omp parallel for num_threads (threads_)
+#endif
+ for (int i = 0; i < static_cast<int> (input->size ()); ++i)
+ tmp->points[i] = intensity_ (input->points[i]);
+ previous = tmp;
+
+ FloatImagePtr img (new FloatImage (previous->width + 2*track_width_,
+ previous->height + 2*track_height_));
+
+ pcl::copyPointCloud (*tmp, *img, track_height_, track_height_, track_width_, track_width_,
+ border_type, 0.f);
+ pyramid[0] = img;
+
+ // compute first level gradients
+ FloatImagePtr g_x (new FloatImage (input->width, input->height));
+ FloatImagePtr g_y (new FloatImage (input->width, input->height));
+ derivatives (*img, *g_x, *g_y);
+ // copy to bigger clouds
+ FloatImagePtr grad_x (new FloatImage (previous->width + 2*track_width_,
+ previous->height + 2*track_height_));
+ pcl::copyPointCloud (*g_x, *grad_x, track_height_, track_height_, track_width_, track_width_,
+ pcl::BORDER_CONSTANT, 0.f);
+ pyramid[1] = grad_x;
+
+ FloatImagePtr grad_y (new FloatImage (previous->width + 2*track_width_,
+ previous->height + 2*track_height_));
+ pcl::copyPointCloud (*g_y, *grad_y, track_height_, track_height_, track_width_, track_width_,
+ pcl::BORDER_CONSTANT, 0.f);
+ pyramid[2] = grad_y;
+
+ for (int level = 1; level < nb_levels_; ++level)
+ {
+ // compute current level and current level gradients
+ FloatImageConstPtr current;
+ FloatImageConstPtr g_x;
+ FloatImageConstPtr g_y;
+ downsample (previous, current, g_x, g_y);
+ // copy to bigger clouds
+ FloatImagePtr image (new FloatImage (current->width + 2*track_width_,
+ current->height + 2*track_height_));
+ pcl::copyPointCloud (*current, *image, track_height_, track_height_, track_width_, track_width_,
+ border_type, 0.f);
+ pyramid[level*step] = image;
+ FloatImagePtr gradx (new FloatImage (g_x->width + 2*track_width_, g_x->height + 2*track_height_));
+ pcl::copyPointCloud (*g_x, *gradx, track_height_, track_height_, track_width_, track_width_,
+ pcl::BORDER_CONSTANT, 0.f);
+ pyramid[level*step + 1] = gradx;
+ FloatImagePtr grady (new FloatImage (g_y->width + 2*track_width_, g_y->height + 2*track_height_));
+ pcl::copyPointCloud (*g_y, *grady, track_height_, track_height_, track_width_, track_width_,
+ pcl::BORDER_CONSTANT, 0.f);
+ pyramid[level*step + 2] = grady;
+ // set the new level
+ previous = current;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::spatialGradient (const FloatImage& img,
+ const FloatImage& grad_x,
+ const FloatImage& grad_y,
+ const Eigen::Array2i& location,
+ const Eigen::Array4f& weight,
+ Eigen::ArrayXXf& win,
+ Eigen::ArrayXXf& grad_x_win,
+ Eigen::ArrayXXf& grad_y_win,
+ Eigen::Array3f &covariance) const
+{
+ const int step = img.width;
+ covariance.setZero ();
+
+ for (int y = 0; y < track_height_; y++)
+ {
+ const float* img_ptr = &(img.points[0]) + (y + location[1])*step + location[0];
+ const float* grad_x_ptr = &(grad_x.points[0]) + (y + location[1])*step + location[0];
+ const float* grad_y_ptr = &(grad_y.points[0]) + (y + location[1])*step + location[0];
+
+ float* win_ptr = win.data () + y*win.cols ();
+ float* grad_x_win_ptr = grad_x_win.data () + y*grad_x_win.cols ();
+ float* grad_y_win_ptr = grad_y_win.data () + y*grad_y_win.cols ();
+
+ for (int x =0; x < track_width_; ++x, ++grad_x_ptr, ++grad_y_ptr)
+ {
+ *win_ptr++ = img_ptr[x]*weight[0] + img_ptr[x+1]*weight[1] + img_ptr[x+step]*weight[2] + img_ptr[x+step+1]*weight[3];
+ float ixval = grad_x_ptr[0]*weight[0] + grad_x_ptr[1]*weight[1] + grad_x_ptr[step]*weight[2] + grad_x_ptr[step+1]*weight[3];
+ float iyval = grad_y_ptr[0]*weight[0] + grad_y_ptr[1]*weight[1] + grad_y_ptr[step]*weight[2] + grad_y_ptr[step+1]*weight[3];
+ //!!! store those
+ *grad_x_win_ptr++ = ixval;
+ *grad_y_win_ptr++ = iyval;
+ //covariance components
+ covariance[0] += ixval*ixval;
+ covariance[1] += ixval*iyval;
+ covariance[2] += iyval*iyval;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::mismatchVector (const Eigen::ArrayXXf& prev,
+ const Eigen::ArrayXXf& prev_grad_x,
+ const Eigen::ArrayXXf& prev_grad_y,
+ const FloatImage& next,
+ const Eigen::Array2i& location,
+ const Eigen::Array4f& weight,
+ Eigen::Array2f &b) const
+{
+ const int step = next.width;
+ b.setZero ();
+ for (int y = 0; y < track_height_; y++)
+ {
+ const float* next_ptr = &(next.points[0]) + (y + location[1])*step + location[0];
+ const float* prev_ptr = prev.data () + y*prev.cols ();
+ const float* prev_grad_x_ptr = prev_grad_x.data () + y*prev_grad_x.cols ();
+ const float* prev_grad_y_ptr = prev_grad_y.data () + y*prev_grad_y.cols ();
+
+ for (int x = 0; x < track_width_; ++x, ++prev_grad_y_ptr, ++prev_grad_x_ptr)
+ {
+ float diff = next_ptr[x]*weight[0] + next_ptr[x+1]*weight[1]
+ + next_ptr[x+step]*weight[2] + next_ptr[x+step+1]*weight[3] - prev_ptr[x];
+ b[0] += *prev_grad_x_ptr * diff;
+ b[1] += *prev_grad_y_ptr * diff;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::track (const PointCloudInConstPtr& prev_input,
+ const PointCloudInConstPtr& input,
+ const std::vector<FloatImageConstPtr>& prev_pyramid,
+ const std::vector<FloatImageConstPtr>& pyramid,
+ const pcl::PointCloud<pcl::PointUV>::ConstPtr& prev_keypoints,
+ pcl::PointCloud<pcl::PointUV>::Ptr& keypoints,
+ std::vector<int>& status,
+ Eigen::Affine3f& motion) const
+{
+ std::vector<Eigen::Array2f> next_pts (prev_keypoints->size ());
+ Eigen::Array2f half_win ((track_width_-1)*0.5f, (track_height_-1)*0.5f);
+ pcl::TransformationFromCorrespondences transformation_computer;
+ const int nb_points = prev_keypoints->size ();
+ for (int level = nb_levels_ - 1; level >= 0; --level)
+ {
+ const FloatImage& prev = *(prev_pyramid[level*3]);
+ const FloatImage& next = *(pyramid[level*3]);
+ const FloatImage& grad_x = *(prev_pyramid[level*3+1]);
+ const FloatImage& grad_y = *(prev_pyramid[level*3+2]);
+
+ Eigen::ArrayXXf prev_win (track_height_, track_width_);
+ Eigen::ArrayXXf grad_x_win (track_height_, track_width_);
+ Eigen::ArrayXXf grad_y_win (track_height_, track_width_);
+ float ratio (1./(1 << level));
+ for (int ptidx = 0; ptidx < nb_points; ptidx++)
+ {
+ Eigen::Array2f prev_pt (prev_keypoints->points[ptidx].u * ratio,
+ prev_keypoints->points[ptidx].v * ratio);
+ Eigen::Array2f next_pt;
+ if (level == nb_levels_ -1)
+ next_pt = prev_pt;
+ else
+ next_pt = next_pts[ptidx]*2.f;
+
+ next_pts[ptidx] = next_pt;
+
+ Eigen::Array2i iprev_point, inext_pt;
+ prev_pt -= half_win;
+ iprev_point[0] = floor (prev_pt[0]);
+ iprev_point[1] = floor (prev_pt[1]);
+
+ if (iprev_point[0] < -track_width_ || iprev_point[0] >= grad_x.width ||
+ iprev_point[1] < -track_height_ || iprev_point[1] >= grad_y.height)
+ {
+ if (level == 0)
+ status [ptidx] = -1;
+ continue;
+ }
+
+ float a = prev_pt[0] - iprev_point[0];
+ float b = prev_pt[1] - iprev_point[1];
+ Eigen::Array4f weight;
+ weight[0] = (1.f - a)*(1.f - b);
+ weight[1] = a*(1.f - b);
+ weight[2] = (1.f - a)*b;
+ weight[3] = 1 - weight[0] - weight[1] - weight[2];
+
+ Eigen::Array3f covar = Eigen::Array3f::Zero ();
+ spatialGradient (prev, grad_x, grad_y, iprev_point, weight, prev_win, grad_x_win, grad_y_win, covar);
+
+ float det = covar[0]*covar[2] - covar[1]*covar[1];
+ float min_eigenvalue = (covar[2] + covar[0] - std::sqrt ((covar[0]-covar[2])*(covar[0]-covar[2]) + 4.f*covar[1]*covar[1]))/2.f;
+
+ if (min_eigenvalue < min_eigenvalue_threshold_ || det < std::numeric_limits<float>::epsilon ())
+ {
+ status[ptidx] = -2;
+ continue;
+ }
+
+ det = 1.f/det;
+ next_pt -= half_win;
+
+ Eigen::Array2f prev_delta;
+ for (int j = 0; j < max_iterations_; j++)
+ {
+ inext_pt[0] = floor (next_pt[0]);
+ inext_pt[1] = floor (next_pt[1]);
+
+ if (inext_pt[0] < -track_width_ || inext_pt[0] >= next.width ||
+ inext_pt[1] < -track_height_ || inext_pt[1] >= next.height)
+ {
+ if (level == 0)
+ status[ptidx] = -1;
+ break;
+ }
+
+ a = next_pt[0] - inext_pt[0];
+ b = next_pt[1] - inext_pt[1];
+ weight[0] = (1.f - a)*(1.f - b);
+ weight[1] = a*(1.f - b);
+ weight[2] = (1.f - a)*b;
+ weight[3] = 1 - weight[0] - weight[1] - weight[2];
+ // compute mismatch vector
+ Eigen::Array2f beta = Eigen::Array2f::Zero ();
+ mismatchVector (prev_win, grad_x_win, grad_y_win, next, inext_pt, weight, beta);
+ // optical flow resolution
+ Eigen::Vector2f delta ((covar[1]*beta[1] - covar[2]*beta[0])*det, (covar[1]*beta[0] - covar[0]*beta[1])*det);
+ // update position
+ next_pt[0] += delta[0]; next_pt[1] += delta[1];
+ next_pts[ptidx] = next_pt + half_win;
+
+ if (delta.squaredNorm () <= epsilon_)
+ break;
+
+ if (j > 0 && std::abs (delta[0] + prev_delta[0]) < 0.01 &&
+ std::abs (delta[1] + prev_delta[1]) < 0.01 )
+ {
+ next_pts[ptidx][0] -= delta[0]*0.5f;
+ next_pts[ptidx][1] -= delta[1]*0.5f;
+ break;
+ }
+ // update delta
+ prev_delta = delta;
+ }
+
+ // update tracked points
+ if (level == 0 && !status[ptidx])
+ {
+ Eigen::Array2f next_point = next_pts[ptidx] - half_win;
+ Eigen::Array2i inext_point;
+
+ inext_point[0] = floor (next_point[0]);
+ inext_point[1] = floor (next_point[1]);
+
+ if (inext_point[0] < -track_width_ || inext_point[0] >= next.width ||
+ inext_point[1] < -track_height_ || inext_point[1] >= next.height)
+ {
+ status[ptidx] = -1;
+ continue;
+ }
+ // insert valid keypoint
+ pcl::PointUV n;
+ n.u = next_pts[ptidx][0];
+ n.v = next_pts[ptidx][1];
+ keypoints->push_back (n);
+ // add points pair to compute transformation
+ inext_point[0] = floor (next_pts[ptidx][0]);
+ inext_point[1] = floor (next_pts[ptidx][1]);
+ iprev_point[0] = floor (prev_keypoints->points[ptidx].u);
+ iprev_point[1] = floor (prev_keypoints->points[ptidx].v);
+ const PointInT& prev_pt = prev_input->points[iprev_point[1]*prev_input->width + iprev_point[0]];
+ const PointInT& next_pt = input->points[inext_pt[1]*input->width + inext_pt[0]];
+ transformation_computer.add (prev_pt.getVector3fMap (), next_pt.getVector3fMap (), 1.0);
+ }
+ }
+ }
+ motion = transformation_computer.getTransformation ();
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointInT, typename IntensityT> void
+pcl::tracking::PyramidalKLTTracker<PointInT, IntensityT>::computeTracking ()
+{
+ if (!initialized_)
+ return;
+
+ std::vector<FloatImageConstPtr> pyramid;
+ computePyramids (input_, pyramid, pcl::BORDER_REFLECT_101);
+ pcl::PointCloud<pcl::PointUV>::Ptr keypoints (new pcl::PointCloud<pcl::PointUV>);
+ keypoints->reserve (keypoints_->size ());
+ std::vector<int> status (keypoints_->size (), 0);
+ track (ref_, input_, ref_pyramid_, pyramid, keypoints_, keypoints, status, motion_);
+ //swap reference and input
+ ref_ = input_;
+ ref_pyramid_ = pyramid;
+ keypoints_ = keypoints;
+ keypoints_status_->indices = status;
+}
+
+#endif
* is optional, if this is not set, it will only use the data in the
* input cloud to estimate the features. This is useful when you only
* need to compute the features for a downsampled cloud.
- * \param cloud a pointer to a PointCloud message
+ * \param search a pointer to a PointCloud message
*/
inline void
setSearchMethod (const SearchPtr &search) { search_ = search; }
/** \brief Implementation of "sample with replacement" using Walker's alias method.
about Walker's alias method, you can check the paper below:
- @article{355749,
+ article{355749},
author = {Walker, Alastair J.},
title = {An Efficient Method for Generating Discrete
Random Variables with General Distributions},
--- /dev/null
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2014-, Open Perception.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef PCL_TRACKING_PYRAMIDAL_KLT_H
+#define PCL_TRACKING_PYRAMIDAL_KLT_H
+
+#include <pcl/point_types.h>
+#include <pcl/tracking/tracker.h>
+#include <pcl/common/intensity.h>
+#include <pcl/common/transformation_from_correspondences.h>
+
+namespace pcl
+{
+ namespace tracking
+ {
+ /** Pyramidal Kanade Lucas Tomasi tracker.
+ * This is an implemntation of the Pyramidal Kanade Lucas Tomasi tracker that operates on
+ * organized 3D keypoints with color/intensity information (this is the default behaviour but you
+ * can alterate it by providing another operator as second template argument). It is an affine
+ * tracker that iteratively computes the optical flow to find the best guess for a point p at t
+ * given its location at t-1.
+ * User is advised to respect the Tomasi condition: the response computed is the maximum eigenvalue
+ * of the second moment matrix but no restrictin are applied to points to track so you can use a
+ * detector of your choice to indicate points to track.
+ *
+ * \author Nizar Sallem
+ */
+ template<typename PointInT, typename IntensityT = pcl::common::IntensityFieldAccessor<PointInT> >
+ class PyramidalKLTTracker : public Tracker<PointInT, Eigen::Affine3f>
+ {
+ public:
+ typedef pcl::tracking::Tracker<PointInT, Eigen::Affine3f> TrackerBase;
+ typedef typename TrackerBase::PointCloudIn PointCloudIn;
+ typedef typename PointCloudIn::Ptr PointCloudInPtr;
+ typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
+ typedef pcl::PointCloud<float> FloatImage;
+ typedef FloatImage::Ptr FloatImagePtr;
+ typedef FloatImage::ConstPtr FloatImageConstPtr;
+
+ using TrackerBase::tracker_name_;
+ using TrackerBase::input_;
+ using TrackerBase::indices_;
+
+ /// Constructor
+ PyramidalKLTTracker (int nb_levels = 5, int tracking_window_width = 7, int tracking_window_height = 7)
+ : ref_ ()
+ , nb_levels_ (nb_levels)
+ , track_width_ (tracking_window_width)
+ , track_height_ (tracking_window_height)
+ , threads_ (0)
+ , initialized_ (false)
+ {
+ tracker_name_ = "PyramidalKLTTracker";
+ accuracy_ = 0.1;
+ epsilon_ = 1e-3;
+ max_iterations_ = 10;
+ keypoints_nbr_ = 100;
+ min_eigenvalue_threshold_ = 1e-4;
+ kernel_ << 1.f/16 ,1.f/4 ,3.f/8 ,1.f/4 ,1.f/16;
+ kernel_size_2_ = kernel_.size () / 2;
+ kernel_last_ = kernel_.size () -1;
+ }
+
+ /// Destructor
+ virtual ~PyramidalKLTTracker () {}
+
+ /** \brief Set the number of pyramid levels
+ * \param levels desired number of pyramid levels
+ */
+ inline void
+ setNumberOfPyramidLevels (int levels) { nb_levels_ = levels; }
+
+ /// \brief \return the number of pyramid levels
+ inline int
+ getNumberOfPyramidLevels () const { return (nb_levels_); }
+
+ /** Set accuracy
+ * \param[in] accuracy desired accuracy.
+ */
+ inline void
+ setAccuracy (float accuracy) { accuracy_ = accuracy; }
+
+ /// \return the accuracy
+ inline float
+ getAccuracy () const { return (accuracy_); }
+
+ /** Set epsilon
+ * \param[in] epsilon desired epsilon.
+ */
+ inline void
+ setEpsilon (float epsilon) { epsilon_ = epsilon; }
+
+ /// \return the epsilon
+ inline float
+ getEpsilon () const { return (epsilon_); }
+
+ /** \brief Set the maximum number of points to track. Only the first keypoints_nbr_
+ * are used as points to track after sorting detected keypoints according to their
+ * response measure.
+ * \param[in] number the desired number of points to detect.
+ */
+ inline void
+ setNumberOfKeypoints (std::size_t number) { keypoints_nbr_ = number; }
+
+ /// \return the maximum number of keypoints to keep
+ inline std::size_t
+ getNumberOfKeypoints () { return (keypoints_nbr_); }
+
+ /** \brief set the tracking window size
+ * \param[in] width the tracking window width
+ * \param[in] height the tracking window height
+ */
+ inline void
+ setTrackingWindowSize (int width, int height);
+
+ /// \brief Set tracking window width
+ inline void
+ setTrackingWindowWidth (int width) {track_width_ = width; };
+
+ /// \brief \return the tracking window size
+ inline int
+ getTrackingWindowWidth () { return (track_width_); }
+
+ /// \brief Set tracking window height
+ inline void
+ setTrackingWindowHeight (int height) {track_height_ = height; };
+
+ /// \brief \return the tracking window size
+ inline int
+ getTrackingWindowHeight () { return (track_height_); }
+
+ /** \brief Initialize the scheduler and set the number of threads to use.
+ * \param nr_threads the number of hardware threads to use (0 sets the value back to
+ * automatic).
+ */
+ inline void
+ setNumberOfThreads (unsigned int nr_threads = 0) { threads_ = nr_threads; }
+
+ /** \brief Get a pointer of the cloud at t-1. */
+ inline PointCloudInConstPtr
+ getReferenceCloud () const { return (ref_); }
+
+ /** \brief Set the maximum number of iterations in the Lucas Kanade loop.
+ * \param[in] max the desired maximum number of iterations
+ */
+ inline void
+ setMaxIterationsNumber (unsigned int max) { max_iterations_ = max; }
+
+ /// \brief \return the maximum iterations number
+ inline unsigned int
+ getMaxIterationsNumber () const { return (max_iterations_); }
+
+ /** \brief Provide a pointer to points to track.
+ * \param points the const boost shared pointer to a PointIndices message
+ */
+ inline void
+ setPointsToTrack (const pcl::PointIndicesConstPtr& points);
+
+ /** \brief Provide a pointer to points to track.
+ * \param points the const boost shared pointer to a PointIndices message
+ */
+ inline void
+ setPointsToTrack (const pcl::PointCloud<pcl::PointUV>::ConstPtr& points);
+
+ /// \brief \return a pointer to the points succesfully tracked.
+ inline pcl::PointCloud<pcl::PointUV>::ConstPtr
+ getTrackedPoints () const { return (keypoints_); };
+
+ /** \brief \return the status of points to track.
+ * Status == 0 --> points succesfully tracked;
+ * Status < 0 --> point is lost;
+ * Status == -1 --> point is out of bond;
+ * Status == -2 --> optical flow can not be computed for this point.
+ */
+ inline pcl::PointIndicesConstPtr
+ getPointsToTrackStatus () const { return (keypoints_status_); }
+
+ /** \brief Return the computed transfromation from tracked points. */
+ Eigen::Affine3f
+ getResult () const { return (motion_); }
+
+ /// \brief \return initialization state
+ bool
+ getInitialized () const { return (initialized_); }
+
+ protected:
+ virtual bool
+ initCompute ();
+
+ /** \brief compute Scharr derivatives of a source cloud.
+ * \param[in] src the image for which gradients are to be computed
+ * \param[out] grad_x image gradient along X direction
+ * \param[out] grad_y image gradient along Y direction
+ */
+ void
+ derivatives (const FloatImage& src, FloatImage& grad_x, FloatImage& grad_y) const;
+
+ /** \brief downsample input
+ * \param[in] input the image to downsample
+ * \param[out] output the downsampled image
+ */
+ void
+ downsample (const FloatImageConstPtr& input, FloatImageConstPtr& output) const;
+
+ /** \brief downsample input and compute output gradients.
+ * \param[in] input the image to downsample
+ * \param[out] output the downsampled image
+ * \param[out] output_grad_x downsampled image gradient along X direction
+ * \param[out] output_grad_y downsampled image gradient along Y direction
+ */
+ void
+ downsample (const FloatImageConstPtr& input, FloatImageConstPtr& output,
+ FloatImageConstPtr& output_grad_x, FloatImageConstPtr& output_grad_y) const;
+
+ /** \brief Separately convolve image with decomposable convolution kernel.
+ * \param[in] input input the image to convolve
+ * \param[out] output output the convolved image
+ */
+ void
+ convolve (const FloatImageConstPtr& input, FloatImage& output) const;
+
+ /** \brief Convolve image columns.
+ * \param[in] input input the image to convolve
+ * \param[out] output output the convolved image
+ */
+ void
+ convolveCols (const FloatImageConstPtr& input, FloatImage& output) const;
+
+ /** \brief Convolve image rows.
+ * \param[in] input input the image to convolve
+ * \param[out] output output the convolved image
+ */
+ void
+ convolveRows (const FloatImageConstPtr& input, FloatImage& output) const;
+
+ /** \brief extract the patch from the previous image, previous image gradients surrounding
+ * pixel alocation while interpolating image and gradients data and compute covariation
+ * matrix of derivatives.
+ * \param[in] img original image
+ * \param[in] grad_x original image gradient along X direction
+ * \param[in] grad_y original image gradient along Y direction
+ * \param[in] location pixel at the center of the patch
+ * \param[in] weights bilinear interpolation weights at this location computed from subpixel
+ * location
+ * \param[out] win patch with interpolated intensity values
+ * \param[out] grad_x_win patch with interpolated gradient along X values
+ * \param[out] grad_y_win patch with interpolated gradient along Y values
+ * \param[out] covariance covariance matrix coefficents
+ */
+ virtual void
+ spatialGradient (const FloatImage& img,
+ const FloatImage& grad_x,
+ const FloatImage& grad_y,
+ const Eigen::Array2i& location,
+ const Eigen::Array4f& weights,
+ Eigen::ArrayXXf& win,
+ Eigen::ArrayXXf& grad_x_win,
+ Eigen::ArrayXXf& grad_y_win,
+ Eigen::Array3f & covariance) const;
+ void
+ mismatchVector (const Eigen::ArrayXXf& prev,
+ const Eigen::ArrayXXf& prev_grad_x,
+ const Eigen::ArrayXXf& prev_grad_y,
+ const FloatImage& next,
+ const Eigen::Array2i& location,
+ const Eigen::Array4f& weights,
+ Eigen::Array2f &b) const;
+
+ /** \brief Compute the pyramidal representation of an image.
+ * \param[in] input the input cloud
+ * \param[out] pyramid computed pyramid levels along with their respective gradients
+ * \param[in] border_type
+ */
+ virtual void
+ computePyramids (const PointCloudInConstPtr& input,
+ std::vector<FloatImageConstPtr>& pyramid,
+ pcl::InterpolationType border_type) const;
+
+ virtual void
+ track (const PointCloudInConstPtr& previous_input,
+ const PointCloudInConstPtr& current_input,
+ const std::vector<FloatImageConstPtr>& previous_pyramid,
+ const std::vector<FloatImageConstPtr>& current_pyramid,
+ const pcl::PointCloud<pcl::PointUV>::ConstPtr& previous_keypoints,
+ pcl::PointCloud<pcl::PointUV>::Ptr& current_keypoints,
+ std::vector<int>& status,
+ Eigen::Affine3f& motion) const;
+
+ virtual void
+ computeTracking ();
+
+ /// \brief input pyranid at t-1
+ std::vector<FloatImageConstPtr> ref_pyramid_;
+ /// \brief point cloud at t-1
+ PointCloudInConstPtr ref_;
+ /// \brief number of pyramid levels
+ int nb_levels_;
+ /// \brief detected keypoints 2D coordinates
+ pcl::PointCloud<pcl::PointUV>::ConstPtr keypoints_;
+ /// \brief status of keypoints of t-1 at t
+ pcl::PointIndicesPtr keypoints_status_;
+ /// \brief number of points to detect
+ std::size_t keypoints_nbr_;
+ /// \brief tracking width
+ int track_width_;
+ /// \brief half of tracking window width
+ int track_width_2_;
+ /// \brief tracking height
+ int track_height_;
+ /// \brief half of tracking window height
+ int track_height_2_;
+ /// \brief maximum number of iterations
+ unsigned int max_iterations_;
+ /// \brief accuracy criterion to stop iterating
+ float accuracy_;
+ float min_eigenvalue_threshold_;
+ /// \brief epsilon for subpixel computation
+ float epsilon_;
+ float max_residue_;
+ /// \brief number of hardware threads
+ unsigned int threads_;
+ /// \brief intensity accessor
+ IntensityT intensity_;
+ /// \brief is the tracker initialized ?
+ bool initialized_;
+ /// \brief compute transformation from successfully tracked points
+ pcl::TransformationFromCorrespondences transformation_computer_;
+ /// \brief computed transformation between tracked points
+ Eigen::Affine3f motion_;
+ /// \brief smoothing kernel
+ Eigen::Array<float, 5, 1> kernel_;
+ /// \brief smoothing kernel half size
+ int kernel_size_2_;
+ /// \brief index of last element in kernel
+ int kernel_last_;
+ public:
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+ }
+}
+
+#include <pcl/tracking/impl/pyramidal_klt.hpp>
+#endif
* is optional, if this is not set, it will only use the data in the
* input cloud to estimate the features. This is useful when you only
* need to compute the features for a downsampled cloud.
- * \param cloud a pointer to a PointCloud message
+ * \param search a pointer to a PointCloud message
*/
inline void
setSearchMethod (const SearchPtr &search) { search_ = search; }
else(NOT VTK_FOUND)
set(DEFAULT TRUE)
set(REASON)
- set(VTK_USE_FILE ${VTK_USE_FILE} CACHE INTERNAL "VTK_USE_FILE")
- include (${VTK_USE_FILE})
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+ set(VTK_USE_FILE "${VTK_USE_FILE}" CACHE INTERNAL "VTK_USE_FILE")
+ include("${VTK_USE_FILE}")
+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
endif(NOT VTK_FOUND)
-PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON})
-PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS vtk OPT_DEPS openni)
+PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ${DEFAULT} "${REASON}")
+PCL_SUBSYS_DEPEND(build "${SUBSYS_NAME}" DEPS ${SUBSYS_DEPS} EXT_DEPS vtk OPT_DEPS openni openni2)
if (ANDROID)
set (build FALSE)
message("VTK was found, but cannot be compiled for Android. Please use VES instead.")
endif ()
-find_package(OpenGL)
if (OPENGL_FOUND)
if(OPENGL_INCLUDE_DIR)
include_directories("${OPENGL_INCLUDE_DIR}")
endif()
endif()
-PCL_ADD_DOC(${SUBSYS_NAME})
+PCL_ADD_DOC("${SUBSYS_NAME}")
if(build)
set(srcs
)
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
# A custom interactor is necessary on VTK 5.4 and below
- set(srcs ${srcs} src/interactor.cpp)
+ list(APPEND srcs src/interactor.cpp)
endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
# PCLPainter2D uses some functions not present in vtk 5.6
- set(srcs
- ${srcs}
+ list(APPEND srcs
src/pcl_painter2D.cpp
src/pcl_plotter.cpp
)
endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
set(incs
- include/pcl/${SUBSYS_NAME}/eigen.h
- include/pcl/${SUBSYS_NAME}/boost.h
- include/pcl/${SUBSYS_NAME}/cloud_viewer.h
- include/pcl/${SUBSYS_NAME}/histogram_visualizer.h
- include/pcl/${SUBSYS_NAME}/image_viewer.h
- include/pcl/${SUBSYS_NAME}/interactor_style.h
- include/pcl/${SUBSYS_NAME}/pcl_visualizer.h
- include/pcl/${SUBSYS_NAME}/pcl_painter2D.h
- include/pcl/${SUBSYS_NAME}/registration_visualizer.h
- include/pcl/${SUBSYS_NAME}/point_cloud_handlers.h
- include/pcl/${SUBSYS_NAME}/point_cloud_color_handlers.h
- include/pcl/${SUBSYS_NAME}/point_cloud_geometry_handlers.h
- include/pcl/${SUBSYS_NAME}/keyboard_event.h
- include/pcl/${SUBSYS_NAME}/point_picking_event.h
- include/pcl/${SUBSYS_NAME}/area_picking_event.h
- include/pcl/${SUBSYS_NAME}/mouse_event.h
- include/pcl/${SUBSYS_NAME}/window.h
- include/pcl/${SUBSYS_NAME}/range_image_visualizer.h
- include/pcl/${SUBSYS_NAME}/interactor.h
- include/pcl/${SUBSYS_NAME}/vtk.h
- include/pcl/${SUBSYS_NAME}/simple_buffer_visualizer.h
+ "include/pcl/${SUBSYS_NAME}/eigen.h"
+ "include/pcl/${SUBSYS_NAME}/boost.h"
+ "include/pcl/${SUBSYS_NAME}/cloud_viewer.h"
+ "include/pcl/${SUBSYS_NAME}/histogram_visualizer.h"
+ "include/pcl/${SUBSYS_NAME}/image_viewer.h"
+ "include/pcl/${SUBSYS_NAME}/interactor_style.h"
+ "include/pcl/${SUBSYS_NAME}/pcl_visualizer.h"
+ "include/pcl/${SUBSYS_NAME}/pcl_painter2D.h"
+ "include/pcl/${SUBSYS_NAME}/registration_visualizer.h"
+ "include/pcl/${SUBSYS_NAME}/point_cloud_handlers.h"
+ "include/pcl/${SUBSYS_NAME}/point_cloud_color_handlers.h"
+ "include/pcl/${SUBSYS_NAME}/point_cloud_geometry_handlers.h"
+ "include/pcl/${SUBSYS_NAME}/keyboard_event.h"
+ "include/pcl/${SUBSYS_NAME}/point_picking_event.h"
+ "include/pcl/${SUBSYS_NAME}/area_picking_event.h"
+ "include/pcl/${SUBSYS_NAME}/mouse_event.h"
+ "include/pcl/${SUBSYS_NAME}/window.h"
+ "include/pcl/${SUBSYS_NAME}/range_image_visualizer.h"
+ "include/pcl/${SUBSYS_NAME}/interactor.h"
+ "include/pcl/${SUBSYS_NAME}/vtk.h"
+ "include/pcl/${SUBSYS_NAME}/simple_buffer_visualizer.h"
)
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
- set(incs
- ${incs}
- include/pcl/${SUBSYS_NAME}/pcl_plotter.h
+ list(APPEND incs
+ "include/pcl/${SUBSYS_NAME}/pcl_plotter.h"
)
endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
set(common_incs
- include/pcl/${SUBSYS_NAME}/common/actor_map.h
- include/pcl/${SUBSYS_NAME}/common/common.h
- include/pcl/${SUBSYS_NAME}/common/io.h
- include/pcl/${SUBSYS_NAME}/common/ren_win_interact_map.h
- include/pcl/${SUBSYS_NAME}/common/shapes.h
- include/pcl/${SUBSYS_NAME}/common/float_image_utils.h
+ "include/pcl/${SUBSYS_NAME}/common/actor_map.h"
+ "include/pcl/${SUBSYS_NAME}/common/common.h"
+ "include/pcl/${SUBSYS_NAME}/common/io.h"
+ "include/pcl/${SUBSYS_NAME}/common/ren_win_interact_map.h"
+ "include/pcl/${SUBSYS_NAME}/common/shapes.h"
+ "include/pcl/${SUBSYS_NAME}/common/float_image_utils.h"
)
set(impl_incs
- include/pcl/${SUBSYS_NAME}/impl/histogram_visualizer.hpp
- include/pcl/${SUBSYS_NAME}/impl/pcl_visualizer.hpp
- include/pcl/${SUBSYS_NAME}/impl/image_viewer.hpp
- include/pcl/${SUBSYS_NAME}/impl/registration_visualizer.hpp
- include/pcl/${SUBSYS_NAME}/impl/point_cloud_handlers.hpp
- include/pcl/${SUBSYS_NAME}/impl/point_cloud_color_handlers.hpp
- include/pcl/${SUBSYS_NAME}/impl/point_cloud_geometry_handlers.hpp
+ "include/pcl/${SUBSYS_NAME}/impl/histogram_visualizer.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/pcl_visualizer.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/image_viewer.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/registration_visualizer.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/point_cloud_handlers.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/point_cloud_color_handlers.hpp"
+ "include/pcl/${SUBSYS_NAME}/impl/point_cloud_geometry_handlers.hpp"
)
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
- set(impl_incs
- ${impl_incs}
- include/pcl/${SUBSYS_NAME}/impl/pcl_plotter.hpp
+ list(APPEND impl_incs
+ "include/pcl/${SUBSYS_NAME}/impl/pcl_plotter.hpp"
)
endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
- set(common_impl_incs include/pcl/${SUBSYS_NAME}/common/impl/shapes.hpp
- include/pcl/${SUBSYS_NAME}/common/impl/common.hpp)
+ set(common_impl_incs "include/pcl/${SUBSYS_NAME}/common/impl/shapes.hpp"
+ "include/pcl/${SUBSYS_NAME}/common/impl/common.hpp")
set(vtk_incs
- include/pcl/${SUBSYS_NAME}/vtk/pcl_image_canvas_source_2d.h
- include/pcl/${SUBSYS_NAME}/vtk/pcl_context_item.h
- include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h
- include/pcl/${SUBSYS_NAME}/vtk/vtkRenderWindowInteractorFix.h
- include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h
+ "include/pcl/${SUBSYS_NAME}/vtk/pcl_image_canvas_source_2d.h"
+ "include/pcl/${SUBSYS_NAME}/vtk/pcl_context_item.h"
+ "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h"
+ "include/pcl/${SUBSYS_NAME}/vtk/vtkRenderWindowInteractorFix.h"
+ "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h"
)
# on apple, a workaround is used for the cocoa render window interactor
include/pcl/visualization/vtk/vtkRenderWindowInteractorFix.mm)
endif()
- set(LIB_NAME pcl_${SUBSYS_NAME})
- PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${incs} ${common_incs} ${impl_incs} ${common_impl_incs} ${vtk_incs})
+ set(LIB_NAME "pcl_${SUBSYS_NAME}")
+ PCL_ADD_LIBRARY("${LIB_NAME}" "${SUBSYS_NAME}" ${srcs} ${incs} ${common_incs} ${impl_incs} ${common_impl_incs} ${vtk_incs})
# apple workaround (continued)
if(APPLE)
- target_link_libraries(${LIB_NAME} "-framework Cocoa")
+ target_link_libraries("${LIB_NAME}" "-framework Cocoa")
endif()
if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
- target_link_libraries(${LIB_NAME} pcl_common pcl_io pcl_kdtree vtkCommon vtkWidgets vtkHybrid vtkFiltering vtkRendering ${OPENGL_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_io pcl_kdtree vtkCommon vtkWidgets vtkHybrid vtkFiltering vtkRendering ${OPENGL_LIBRARIES})
else()
- target_link_libraries(${LIB_NAME} pcl_common pcl_io pcl_kdtree vtkCommon vtkWidgets vtkHybrid vtkCharts vtkFiltering vtkRendering ${OPENGL_LIBRARIES})
+ target_link_libraries("${LIB_NAME}" pcl_common pcl_io pcl_kdtree ${VTK_LIBRARIES} ${OPENGL_LIBRARIES})
endif()
set(EXT_DEPS "")
- PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}"
+ if(OPENNI_FOUND)
+ list(APPEND EXT_DEPS openni-dev)
+ endif(OPENNI_FOUND)
+ if(OPENNI2_FOUND)
+ list(APPEND EXT_DEPS openni2-dev)
+ endif(OPENNI2_FOUND)
+ PCL_MAKE_PKGCONFIG("${LIB_NAME}" "${SUBSYS_NAME}" "${SUBSYS_DESC}"
"${SUBSYS_DEPS}" "${EXT_DEPS}" "" "" "")
# Install include files
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/common ${common_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/common/impl ${common_impl_incs})
- PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/vtk ${vtk_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/common" ${common_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/impl" ${impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/common/impl" ${common_impl_incs})
+ PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/vtk" ${vtk_incs})
if(BUILD_TESTS)
add_subdirectory(test)
endif(BUILD_TESTS)
-
- add_subdirectory(tools)
+
+ if(BUILD_tools)
+ add_subdirectory(tools)
+ endif(BUILD_tools)
endif(build)
class PCL_EXPORTS AreaPickingEvent
{
public:
- AreaPickingEvent (std::size_t nb_points, const std::vector<int>& indices)
+ AreaPickingEvent (int nb_points, const std::vector<int>& indices)
: nb_points_ (nb_points)
, indices_ (indices)
{}
inline bool
getPointsIndices (std::vector<int>& indices) const
{
- if (nb_points_ == -1)
+ if (nb_points_ <= 0)
return (false);
indices = indices_;
return (true);
}
private:
- std::size_t nb_points_;
+ int nb_points_;
std::vector<int> indices_;
};
} //namespace visualization
typedef boost::unordered_map<std::string, vtkSmartPointer<vtkProp> > ShapeActorMap;
typedef boost::shared_ptr<ShapeActorMap> ShapeActorMapPtr;
- typedef std::map<int, vtkSmartPointer<vtkProp> > CoordinateActorMap;
+ typedef boost::unordered_map<std::string, vtkSmartPointer<vtkProp> > CoordinateActorMap;
+ typedef boost::shared_ptr<CoordinateActorMap> CoordinateActorMapPtr;
}
}
poly_grid->Allocate (1, 1);
poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ());
poly_grid->SetPoints (poly_points);
- poly_grid->Update ();
return (poly_grid);
}
poly_grid->Allocate (1, 1);
poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ());
poly_grid->SetPoints (poly_points);
- poly_grid->Update ();
return (poly_grid);
}
create2DCircle (const pcl::ModelCoefficients &coefficients, double z = 0.0);
/** \brief Create a cone shape from a set of model coefficients.
- * \param[in] coefficients the cone coefficients (point_on_axis, axis_direction, radius)
+ * \param[in] coefficients the cone coefficients (cone_apex, axis_direction, angle)
+ *
+ * \code
+ * // The following are given (or computed using sample consensus techniques -- see SampleConsensusModelCone)
+ * // Eigen::Vector3f cone_apex, axis_direction;
+ * // float angle;
+ * // Note: The height of the cone is set using the magnitude of the axis_direction vector.
+ *
+ * pcl::ModelCoefficients cone_coeff;
+ * plane_coeff.values.resize (7); // We need 7 values
+ * plane_coeff.values[0] = cone_apex.x ();
+ * plane_coeff.values[1] = cone_apex.y ();
+ * plane_coeff.values[2] = cone_apex.z ();
+ * plane_coeff.values[3] = axis_direction.x ();
+ * plane_coeff.values[4] = axis_direction.y ();
+ * plane_coeff.values[5] = axis_direction.z ();
+ * plane_coeff.values[6] = angle (); // degrees
+ *
+ * vtkSmartPointer<vtkDataSet> data = pcl::visualization::createCone (cone_coeff);
+ * \endcode
+ *
* \ingroup visualization
*/
PCL_EXPORTS vtkSmartPointer<vtkDataSet>
* \param[in] y_max is the maximum y value of the box
* \param[in] z_min is the minimum z value of the box
* \param[in] z_max is the maximum z value of the box
- * \param[in] id the cube id/name (default: "cube")
- * \param[in] viewport (optional) the id of the new viewport (default: 0)
*/
PCL_EXPORTS vtkSmartPointer<vtkDataSet>
createCube (double x_min, double x_max,
/** \brief Remove the current 2d actor and create a new 2D actor from the given vtkDoubleArray histogram and add it to the screen.
* \param[in] xy_array the input vtkDoubleArray holding the histogram data
- * \param[out] renwinint the resultant render window interactor holding the rendered object
- * \param[in] id the point cloud object id
+ * \param[out] renwinupd the resultant render window interactor holding the rendered object
+ * \param[in] hsize Histogram size
*/
void
reCreateActor (const vtkSmartPointer<vtkDoubleArray> &xy_array,
#include <boost/shared_array.hpp>
+#include <vtkVersion.h>
#include <vtkInteractorStyleImage.h>
class vtkImageSlice;
markPoint (size_t u, size_t v, Vector3ub fg_color, Vector3ub bg_color = red_color, double radius = 3.0,
const std::string &layer_id = "points", double opacity = 1.0);
+ /** \brief Sets the pixel at coordinates(u,v) to color while setting the neighborhood to another
+ * \param[in] uv the u/x, v/y coordinate of the pixels to be marked
+ * \param[in] fg_color the pixel color
+ * \param[in] bg_color the neighborhood color
+ * \param[in] size edge of the square surrounding each pixel
+ * \param[in] layer_id the name of the layer (default: "markers")
+ * \param[in] opacity the opacity of the layer (default: 1.0)
+ */
+ void
+ markPoints (const std::vector<int>& uv, Vector3ub fg_color, Vector3ub bg_color = red_color, double size = 3.0,
+ const std::string &layer_id = "markers", double opacity = 1.0);
+
+ /** \brief Sets the pixel at coordinates(u,v) to color while setting the neighborhood to another (float coordinates version).
+ * \param[in] uv the u/x, v/y coordinate of the pixels to be marked
+ * \param[in] fg_color the pixel color
+ * \param[in] bg_color the neighborhood color
+ * \param[in] size edge of the square surrounding each pixel
+ * \param[in] layer_id the name of the layer (default: "markers")
+ * \param[in] opacity the opacity of the layer (default: 1.0)
+ */
+ void
+ markPoints (const std::vector<float>& uv, Vector3ub fg_color, Vector3ub bg_color = red_color, double size = 3.0,
+ const std::string &layer_id = "markers", double opacity = 1.0);
+
/** \brief Set the window title name
* \param[in] name the window title
*/
resetStoppedFlag () { stopped_ = false; }
/** \brief Fire up a mouse event with a specified event ID
- * \param[int] event_id the id of the event
+ * \param[in] event_id the id of the event
*/
void
emitMouseEvent (unsigned long event_id);
/** \brief Fire up a keyboard event with a specified event ID
- * \param[int] event_id the id of the event
+ * \param[in] event_id the id of the event
*/
void
emitKeyboardEvent (unsigned long event_id);
/** \brief The renderer. */
vtkSmartPointer<vtkRenderer> ren_;
-#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION >= 10))
+#if !((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 10))
/** \brief Global prop. This is the actual "actor". */
vtkSmartPointer<vtkImageSlice> slice_;
#endif
// Parse the cloud data and store it in the array
double xy[2];
- for (int d = 0; d < fields[field_idx].count; ++d)
+ for (uint32_t d = 0; d < fields[field_idx].count; ++d)
{
xy[0] = d;
//xy[1] = cloud.points[index].histogram[d];
// Parse the cloud data and store it in the array
double xy[2];
- for (int d = 0; d < fields[field_idx].count; ++d)
+ for (uint32_t d = 0; d < fields[field_idx].count; ++d)
{
xy[0] = d;
//xy[1] = cloud.points[index].histogram[d];
#ifndef PCL_VISUALIZATION_IMAGE_VISUALIZER_HPP_
#define PCL_VISUALIZATION_IMAGE_VISUALIZER_HPP_
+#include <vtkVersion.h>
#include <vtkContextActor.h>
#include <vtkContextScene.h>
#include <vtkImageData.h>
pcl::PointXY min_pt_2d, max_pt_2d;
min_pt_2d.x = min_pt_2d.y = std::numeric_limits<float>::max ();
- max_pt_2d.x = max_pt_2d.y = std::numeric_limits<float>::min ();
+ max_pt_2d.x = max_pt_2d.y = -std::numeric_limits<float>::max ();
// Search for the two extrema
for (size_t i = 0; i < pp_2d.size (); ++i)
{
pcl::PointXY min_pt_2d, max_pt_2d;
min_pt_2d.x = min_pt_2d.y = std::numeric_limits<float>::max ();
- max_pt_2d.x = max_pt_2d.y = std::numeric_limits<float>::min ();
+ max_pt_2d.x = max_pt_2d.y = -std::numeric_limits<float>::max ();
// Search for the two extrema
for (size_t i = 0; i < pp_2d.size (); ++i)
{
setSize (source_img.width + target_img.width , std::max (source_img.height, target_img.height));
// Set data size
- if (data_size_ < (src_size + tgt_size))
+ if (data_size_ < static_cast<size_t> (src_size + tgt_size))
{
data_size_ = src_size + tgt_size;
data_.reset (new unsigned char[data_size_]);
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New ();
image->SetDimensions (source_img.width + target_img.width, std::max (source_img.height, target_img.height), 1);
+#if VTK_MAJOR_VERSION < 6
image->SetScalarTypeToUnsignedChar ();
image->SetNumberOfScalarComponents (3);
image->AllocateScalars ();
+#else
+ image->AllocateScalars (VTK_UNSIGNED_CHAR, 3);
+#endif
image->GetPointData ()->GetScalars ()->SetVoidArray (data, data_size_, 1);
vtkSmartPointer<PCLContextImageItem> image_item = vtkSmartPointer<PCLContextImageItem>::New ();
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 10))
#ifndef PCL_PCL_VISUALIZER_IMPL_H_
#define PCL_PCL_VISUALIZER_IMPL_H_
+#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkCellArray.h>
#include <vtkLeaderActor2D.h>
vtkSmartPointer<vtkAppendPolyData> all_data = vtkSmartPointer<vtkAppendPolyData>::New ();
// Add old data
+#if VTK_MAJOR_VERSION < 6
all_data->AddInput (reinterpret_cast<vtkPolyDataMapper*> ((vtkActor::SafeDownCast (am_it->second))->GetMapper ())->GetInput ());
-
+#else
+ all_data->AddInputData (reinterpret_cast<vtkPolyDataMapper*> ((vtkActor::SafeDownCast (am_it->second))->GetMapper ())->GetInput ());
+#endif
+
// Add new data
vtkSmartPointer<vtkDataSetSurfaceFilter> surface_filter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New ();
- surface_filter->SetInput (vtkUnstructuredGrid::SafeDownCast (data));
+#if VTK_MAJOR_VERSION < 6
+ surface_filter->AddInput (vtkUnstructuredGrid::SafeDownCast (data));
+#else
+ surface_filter->AddInputData (vtkUnstructuredGrid::SafeDownCast (data));
+#endif
vtkSmartPointer<vtkPolyData> poly_data = surface_filter->GetOutput ();
+#if VTK_MAJOR_VERSION < 6
all_data->AddInput (poly_data);
+#else
+ all_data->AddInputData (poly_data);
+#endif
// Create an Actor
vtkSmartPointer<vtkActor> actor;
vtkSmartPointer<vtkAppendPolyData> all_data = vtkSmartPointer<vtkAppendPolyData>::New ();
// Add old data
+#if VTK_MAJOR_VERSION < 6
all_data->AddInput (reinterpret_cast<vtkPolyDataMapper*> ((vtkActor::SafeDownCast (am_it->second))->GetMapper ())->GetInput ());
+#else
+ all_data->AddInputData (reinterpret_cast<vtkPolyDataMapper*> ((vtkActor::SafeDownCast (am_it->second))->GetMapper ())->GetInput ());
+#endif
// Add new data
vtkSmartPointer<vtkDataSetSurfaceFilter> surface_filter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
surface_filter->SetInput (vtkUnstructuredGrid::SafeDownCast (data));
+#else
+ surface_filter->SetInputData (vtkUnstructuredGrid::SafeDownCast (data));
+#endif
vtkSmartPointer<vtkPolyData> poly_data = surface_filter->GetOutput ();
+#if VTK_MAJOR_VERSION < 6
all_data->AddInput (poly_data);
+#else
+ all_data->AddInputData (poly_data);
+#endif
// Create an Actor
vtkSmartPointer<vtkActor> actor;
//////////////////////////////////////////////////////////////////////////
// Get the actor pointer
vtkLODActor* actor = vtkLODActor::SafeDownCast (am_it->second);
+#if VTK_MAJOR_VERSION < 6
vtkAlgorithm *algo = actor->GetMapper ()->GetInput ()->GetProducerPort ()->GetProducer ();
+#else
+ vtkAlgorithm *algo = actor->GetMapper ()->GetInputAlgorithm ();
+#endif
vtkSphereSource *src = vtkSphereSource::SafeDownCast (algo);
src->SetCenter (double (center.x), double (center.y), double (center.z));
polyData->SetLines (lines);
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (polyData);
+#else
+ mapper->SetInputData (polyData);
+#endif
mapper->SetColorModeToMapScalars();
mapper->SetScalarModeToUsePointData();
polyData->SetLines(lines);
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (polyData);
+#else
+ mapper->SetInputData (polyData);
+#endif
mapper->SetColorModeToMapScalars();
mapper->SetScalarModeToUsePointData();
int j = 0, idx = 0;
// Draw lines between the best corresponding points
- for (size_t i = 0; i < n_corr; ++i)
+ for (int i = 0; i < n_corr; ++i)
{
const PointT &p_src = source_points->points[i];
const PointT &p_tgt = target_points->points[correspondences[i]];
line_data->SetLines (line_cells);
line_data->GetPointData ()->SetTCoords (line_tcoords);
line_data->GetCellData ()->SetScalars (line_colors);
- line_data->Update ();
// Create an Actor
vtkSmartPointer<vtkLODActor> actor;
line_data->SetLines (line_cells);
line_data->GetPointData ()->SetTCoords (line_tcoords);
line_data->GetCellData ()->SetScalars (line_colors);
- line_data->Update ();
// Create an Actor
vtkSmartPointer<vtkLODActor> actor;
line_data->SetLines (line_cells);
line_data->GetPointData ()->SetTCoords (line_tcoords);
line_data->GetCellData ()->SetScalars (line_colors);
- line_data->Update ();
// Update the mapper
+#if VTK_MAJOR_VERSION < 6
reinterpret_cast<vtkPolyDataMapper*>(actor->GetMapper ())->SetInput (line_data);
+#else
+ reinterpret_cast<vtkPolyDataMapper*> (actor->GetMapper ())->SetInputData (line_data);
+#endif
return (true);
}
// Convert the PointCloud to VTK PolyData
convertPointCloudToVTKPolyData<PointT> (geometry_handler, polydata, initcells);
// use the given geometry handler
- polydata->Update ();
// Get the colors from the handler
bool has_colors = false;
// Convert the PointCloud to VTK PolyData
convertPointCloudToVTKPolyData<PointT> (geometry_handler, polydata, initcells);
// use the given geometry handler
- polydata->Update ();
// Get the colors from the handler
bool has_colors = false;
// Convert the PointCloud to VTK PolyData
convertPointCloudToVTKPolyData (geometry_handler, polydata, initcells);
// use the given geometry handler
- polydata->Update ();
// Get the colors from the handler
bool has_colors = false;
vtkSmartPointer<vtkPolyData> polydata = reinterpret_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ())->GetInput ();
// Convert the PointCloud to VTK PolyData
convertPointCloudToVTKPolyData<PointT> (cloud, polydata, am_it->second.cells);
- polydata->Update ();
// Set scalars to blank, since there is no way we can update them here.
vtkSmartPointer<vtkDataArray> scalars;
polydata->GetPointData ()->SetScalars (scalars);
- polydata->Update ();
double minmax[2];
minmax[0] = std::numeric_limits<double>::min ();
minmax[1] = std::numeric_limits<double>::max ();
am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
// Update the mapper
+#if VTK_MAJOR_VERSION < 6
reinterpret_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ())->SetInput (polydata);
+#else
+ reinterpret_cast<vtkPolyDataMapper*> (am_it->second.actor->GetMapper ())->SetInputData (polydata);
+#endif
return (true);
}
// Set scalars to blank, since there is no way we can update them here.
vtkSmartPointer<vtkDataArray> scalars;
polydata->GetPointData ()->SetScalars (scalars);
- polydata->Update ();
double minmax[2];
minmax[0] = std::numeric_limits<double>::min ();
minmax[1] = std::numeric_limits<double>::max ();
am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
// Update the mapper
+#if VTK_MAJOR_VERSION < 6
reinterpret_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ())->SetInput (polydata);
+#else
+ reinterpret_cast<vtkPolyDataMapper*> (am_it->second.actor->GetMapper ())->SetInputData (polydata);
+#endif
return (true);
}
scalars->GetRange (minmax);
// Update the data
polydata->GetPointData ()->SetScalars (scalars);
- polydata->Update ();
am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();
am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
// Update the mapper
+#if VTK_MAJOR_VERSION < 6
reinterpret_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ())->SetInput (polydata);
+#else
+ reinterpret_cast<vtkPolyDataMapper*> (am_it->second.actor->GetMapper ())->SetInputData (polydata);
+#endif
return (true);
}
allocVtkPolyData (polydata);
cell_array->GetData ()->SetNumberOfValues (idx);
cell_array->Squeeze ();
- polydata->SetStrips (cell_array);
+ polydata->SetPolys (cell_array);
polydata->SetPoints (points);
if (colors)
poly_grid->Allocate (1, 1);
poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ());
poly_grid->SetPoints (points);
- poly_grid->Update ();
if (colors)
poly_grid->GetPointData ()->SetScalars (colors);
cells->GetData ()->SetNumberOfValues (idx);
cells->Squeeze ();
// Set the the vertices
- polydata->SetStrips (cells);
- polydata->Update ();
+ polydata->SetPolys (cells);
return (true);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
-template <typename PointT> bool
+template <typename PointT> bool
pcl::visualization::PointCloudColorHandlerHSVField<PointT>::getColor (vtkSmartPointer<vtkDataArray> &scalars) const
{
if (!capable_ || !cloud_)
reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetNumberOfTuples (nr_points);
unsigned char* colors = reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->GetPointer (0);
- int j = 0;
+ int idx = 0;
// If XYZ present, check if the points are invalid
int x_idx = -1;
-
+
for (size_t d = 0; d < fields_.size (); ++d)
if (fields_[d].name == "x")
x_idx = static_cast<int> (d);
{
// Copy the value at the specified field
if (!pcl_isfinite (cloud_->points[cp].x) ||
- !pcl_isfinite (cloud_->points[cp].y) ||
+ !pcl_isfinite (cloud_->points[cp].y) ||
!pcl_isfinite (cloud_->points[cp].z))
continue;
- int idx = j * 3;
-
///@todo do this with the point_types_conversion in common, first template it!
+ float h = cloud_->points[cp].h;
+ float v = cloud_->points[cp].v;
+ float s = cloud_->points[cp].s;
+
// Fill color data with HSV here:
- if (cloud_->points[cp].s == 0)
+ // restrict the hue value to [0,360[
+ h = h < 0.0f ? h - (((int)h)/360 - 1)*360 : h - (((int)h)/360)*360;
+
+ // restrict s and v to [0,1]
+ if (s > 1.0f) s = 1.0f;
+ if (s < 0.0f) s = 0.0f;
+ if (v > 1.0f) v = 1.0f;
+ if (v < 0.0f) v = 0.0f;
+
+ if (s == 0.0f)
{
- colors[idx] = colors[idx+1] = colors[idx+2] = cloud_->points[cp].v;
- return;
- }
- float a = cloud_->points[cp].h / 60;
- int i = floor (a);
- float f = a - i;
- float p = cloud_->points[cp].v * (1 - cloud_->points[cp].s);
- float q = cloud_->points[cp].v * (1 - cloud_->points[cp].s * f);
- float t = cloud_->points[cp].v * (1 - cloud_->points[cp].s * (1 - f));
-
- switch (i)
+ colors[idx] = colors[idx+1] = colors[idx+2] = v*255;
+ }
+ else
{
- case 0:
- colors[idx] = cloud_->points[cp].v; colors[idx+1] = t; colors[idx+2] = p; break;
- case 1:
- colors[idx] = q; colors[idx+1] = cloud_->points[cp].v; colors[idx+2] = p; break;
- case 2:
- colors[idx] = p; colors[idx+1] = cloud_->points[cp].v; colors[idx+2] = t; break;
- case 3:
- colors[idx] = p; colors[idx+1] = q; colors[idx+2] = cloud_->points[cp].v; break;
- case 4:
- colors[idx] = t; colors[idx+1] = p; colors[idx+2] = cloud_->points[cp].v; break;
- default:
- colors[idx] = cloud_->points[cp].v; colors[idx+1] = p; colors[idx+2] = q; break;
+ // calculate p, q, t from HSV-values
+ float a = h / 60;
+ int i = floor (a);
+ float f = a - i;
+ float p = v * (1 - s);
+ float q = v * (1 - s * f);
+ float t = v * (1 - s * (1 - f));
+
+ switch (i)
+ {
+ case 0:
+ colors[idx] = v*255; colors[idx+1] = t*255; colors[idx+2] = p*255; break;
+ case 1:
+ colors[idx] = q*255; colors[idx+1] = v*255; colors[idx+2] = p*255; break;
+ case 2:
+ colors[idx] = p*255; colors[idx+1] = v*255; colors[idx+2] = t*255; break;
+ case 3:
+ colors[idx] = p*255; colors[idx+1] = q*255; colors[idx+2] = v*255; break;
+ case 4:
+ colors[idx] = t*255; colors[idx+1] = p*255; colors[idx+2] = v*255; break;
+ case 5:
+ colors[idx] = v*255; colors[idx+1] = p*255; colors[idx+2] = q*255; break;
+ }
}
- j++;
+ idx +=3;
}
}
else
// Color every point
for (vtkIdType cp = 0; cp < nr_points; ++cp)
{
- int idx = cp * 3;
+ float h = cloud_->points[cp].h;
+ float v = cloud_->points[cp].v;
+ float s = cloud_->points[cp].s;
// Fill color data with HSV here:
- if (cloud_->points[cp].s == 0)
+ // restrict the hue value to [0,360[
+ h = h < 0.0f ? h - (((int)h)/360 - 1)*360 : h - (((int)h)/360)*360;
+
+ // restrict s and v to [0,1]
+ if (s > 1.0f) s = 1.0f;
+ if (s < 0.0f) s = 0.0f;
+ if (v > 1.0f) v = 1.0f;
+ if (v < 0.0f) v = 0.0f;
+
+ if (s == 0.0f)
{
- colors[idx] = colors[idx+1] = colors[idx+2] = cloud_->points[cp].v;
- return;
- }
- float a = cloud_->points[cp].h / 60;
- int i = floor (a);
- float f = a - i;
- float p = cloud_->points[cp].v * (1 - cloud_->points[cp].s);
- float q = cloud_->points[cp].v * (1 - cloud_->points[cp].s * f);
- float t = cloud_->points[cp].v * (1 - cloud_->points[cp].s * (1 - f));
-
- switch (i)
+ colors[idx] = colors[idx+1] = colors[idx+2] = v*255;
+ }
+ else
{
- case 0:
- colors[idx] = cloud_->points[cp].v; colors[idx+1] = t; colors[idx+2] = p; break;
- case 1:
- colors[idx] = q; colors[idx+1] = cloud_->points[cp].v; colors[idx+2] = p; break;
- case 2:
- colors[idx] = p; colors[idx+1] = cloud_->points[cp].v; colors[idx+2] = t; break;
- case 3:
- colors[idx] = p; colors[idx+1] = q; colors[idx+2] = cloud_->points[cp].v; break;
- case 4:
- colors[idx] = t; colors[idx+1] = p; colors[idx+2] = cloud_->points[cp].v; break;
- default:
- colors[idx] = cloud_->points[cp].v; colors[idx+1] = p; colors[idx+2] = q; break;
+ // calculate p, q, t from HSV-values
+ float a = h / 60;
+ int i = floor (a);
+ float f = a - i;
+ float p = v * (1 - s);
+ float q = v * (1 - s * f);
+ float t = v * (1 - s * (1 - f));
+
+ switch (i)
+ {
+ case 0:
+ colors[idx] = v*255; colors[idx+1] = t*255; colors[idx+2] = p*255; break;
+ case 1:
+ colors[idx] = q*255; colors[idx+1] = v*255; colors[idx+2] = p*255; break;
+ case 2:
+ colors[idx] = p*255; colors[idx+1] = v*255; colors[idx+2] = t*255; break;
+ case 3:
+ colors[idx] = p*255; colors[idx+1] = q*255; colors[idx+2] = v*255; break;
+ case 4:
+ colors[idx] = t*255; colors[idx+1] = p*255; colors[idx+2] = v*255; break;
+ case 5:
+ colors[idx] = v*255; colors[idx+1] = p*255; colors[idx+2] = q*255; break;
+ }
}
+ idx +=3;
}
}
return (true);
return (true);
}
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::visualization::PointCloudColorHandlerRGBAField<PointT>::setInputCloud (
+ const PointCloudConstPtr &cloud)
+{
+ PointCloudColorHandler<PointT>::setInputCloud (cloud);
+ // Handle the 24-bit packed RGBA values
+ field_idx_ = pcl::getFieldIndex (*cloud, "rgba", fields_);
+ if (field_idx_ != -1)
+ capable_ = true;
+ else
+ capable_ = false;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> bool
+pcl::visualization::PointCloudColorHandlerRGBAField<PointT>::getColor (vtkSmartPointer<vtkDataArray> &scalars) const
+{
+ if (!capable_ || !cloud_)
+ return (false);
+
+ if (!scalars)
+ scalars = vtkSmartPointer<vtkUnsignedCharArray>::New ();
+ scalars->SetNumberOfComponents (4);
+
+ vtkIdType nr_points = cloud_->points.size ();
+ reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetNumberOfTuples (nr_points);
+ unsigned char* colors = reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->GetPointer (0);
+
+ int j = 0;
+ // If XYZ present, check if the points are invalid
+ int x_idx = -1;
+ for (size_t d = 0; d < fields_.size (); ++d)
+ if (fields_[d].name == "x")
+ x_idx = static_cast<int> (d);
+
+ if (x_idx != -1)
+ {
+ // Color every point
+ for (vtkIdType cp = 0; cp < nr_points; ++cp)
+ {
+ // Copy the value at the specified field
+ if (!pcl_isfinite (cloud_->points[cp].x) ||
+ !pcl_isfinite (cloud_->points[cp].y) ||
+ !pcl_isfinite (cloud_->points[cp].z))
+ continue;
+
+ colors[j ] = cloud_->points[cp].r;
+ colors[j + 1] = cloud_->points[cp].g;
+ colors[j + 2] = cloud_->points[cp].b;
+ colors[j + 3] = cloud_->points[cp].a;
+ j += 4;
+ }
+ }
+ else
+ {
+ // Color every point
+ for (vtkIdType cp = 0; cp < nr_points; ++cp)
+ {
+ int idx = static_cast<int> (cp) * 4;
+ colors[idx ] = cloud_->points[cp].r;
+ colors[idx + 1] = cloud_->points[cp].g;
+ colors[idx + 2] = cloud_->points[cp].b;
+ colors[idx + 3] = cloud_->points[cp].a;
+ }
+ }
+ return (true);
+}
+
#endif // PCL_POINT_CLOUD_COLOR_HANDLERS_IMPL_HPP_
size_t correspondeces_old_size = 0;
// Add coordinate system to both ports
- viewer_->addCoordinateSystem (1.0);
+ viewer_->addCoordinateSystem (1.0, "global");
// The root name of correspondence lines
std::string line_root_ = "line";
# include <vtkWin32RenderWindowInteractor.h>
#else
#include <vtkConfigure.h>
-#if defined VTK_USE_CARBON
-# include <vtkCarbonRenderWindowInteractor.h>
-#elif defined VTK_USE_COCOA
+#if (VTK_MAJOR_VERSION <= 5 && defined VTK_USE_COCOA) || defined __APPLE__
# include <vtkCocoaRenderWindowInteractor.h>
+#elif VTK_MAJOR_VERSION <= 5 && defined VTK_USE_CARBON
+# include <vtkCarbonRenderWindowInteractor.h>
#else
// Stupid X.h defines Complex, Bool, Success globally (!)
# include <vtkXRenderWindowInteractor.h>
/** \brief The PCLVisualizer interactor */
#ifdef _WIN32
class PCL_EXPORTS PCLVisualizerInteractor : public vtkWin32RenderWindowInteractor
-#elif defined VTK_USE_CARBON
- class PCLVisualizerInteractor : public vtkCarbonRenderWindowInteractor
-#elif defined VTK_USE_COCOA
+#elif (VTK_MAJOR_VERSION <= 5 && defined VTK_USE_COCOA) || defined __APPLE__
class PCLVisualizerInteractor : public vtkCocoaRenderWindowInteractor
+#elif VTK_MAJOR_VERSION <= 5 && defined VTK_USE_CARBON
+ class PCLVisualizerInteractor : public vtkCarbonRenderWindowInteractor
#else
class PCLVisualizerInteractor : public vtkXRenderWindowInteractor
#endif
namespace visualization
{
- /** \brief A list of potential keyboard modifiers for \ref PCLVisualizerInteractorStyle.
+ /** \brief A list of potential keyboard modifiers for \ref pcl::visualization::PCLVisualizerInteractorStyle::PCLVisualizerInteractorStyle()
* Defaults to Alt.
*/
enum InteractorKeyboardModifier
* - g, G : display scale grid (on/off)
* - u, U : display lookup table (on/off)
* - r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]
+ * - CTRL + s, S : save camera parameters
+ * - CTRL + r, R : restore camera parameters
* - ALT + s, S : turn stereo mode on/off
* - ALT + f, F : switch between maximized window mode and original size
* - l, L : list all available geometric and color handlers for the current actor map
max_win_height_ (), max_win_width_ (), grid_enabled_ (), grid_actor_ (), lut_enabled_ (),
lut_actor_ (), snapshot_writer_ (), wif_ (), mouse_signal_ (), keyboard_signal_ (),
point_picking_signal_ (), area_picking_signal_ (), stereo_anaglyph_mask_default_ (),
- mouse_callback_ (), modifier_ ()
+ mouse_callback_ (), modifier_ (), camera_file_ (), camera_ (), camera_saved_ (), win_ ()
{}
/** \brief Empty destructor */
setRendererCollection (vtkSmartPointer<vtkRendererCollection> &rens) { rens_ = rens; }
/** \brief Pass a pointer to the actor map
- * \param[in] actors the actor map that will be used with this style
+ * \param[in] use_vbos
*/
inline void
setUseVbos (const bool use_vbos) { use_vbos_ = use_vbos; }
void
saveScreenshot (const std::string &file);
+ /** \brief Save the camera parameters to disk, as a .cam file.
+ * \param[in] file the name of the .cam file
+ */
+ bool
+ saveCameraParameters (const std::string &file);
+
+ /** \brief Get camera parameters and save them to a \ref pcl::visualization::Camera.
+ * \param[out] camera the name of the \ref pcl::visualization::Camera
+ */
+ void
+ getCameraParameters (Camera &camera);
+
+ /** \brief Load camera parameters from a camera parameter file.
+ * \param[in] file the name of the camera parameter file
+ */
+ bool
+ loadCameraParameters (const std::string &file);
+
+ /** \brief Set the camera parameters via an intrinsics and and extrinsics matrix
+ * \note This assumes that the pixels are square and that the center of the image is at the center of the sensor.
+ * \param[in] intrinsics the intrinsics that will be used to compute the VTK camera parameters
+ * \param[in] extrinsics the extrinsics that will be used to compute the VTK camera parameters
+ * \param[in] viewport the viewport to modify camera of (0 modifies all cameras)
+ */
+ void
+ setCameraParameters (const Eigen::Matrix3f &intrinsics, const Eigen::Matrix4f &extrinsics, int viewport = 0);
+
+ /** \brief Set the camera parameters by given a full camera data structure.
+ * \param[in] camera camera structure containing all the camera parameters.
+ * \param[in] viewport the viewport to modify camera of (0 modifies all cameras)
+ */
+ void
+ setCameraParameters (const Camera &camera, int viewport = 0);
+
+ /** \brief Set camera file for camera parameter saving/restoring.
+ * \param[in] file the name of the camera parameter file
+ */
+ void
+ setCameraFile (const std::string file)
+ {
+ camera_file_ = file;
+ }
+
+ /** \brief Get camera file for camera parameter saving/restoring. */
+ std::string
+ getCameraFile () const
+ {
+ return (camera_file_);
+ }
+
/** \brief Change the default keyboard modified from ALT to a different special key.
* Allowed values are:
* - INTERACTOR_KB_MOD_ALT
void
zoomOut ();
+ /** \brief Get camera parameters from a string vector.
+ * \param[in] camera A string vector:
+ * Clipping Range, Focal Point, Position, ViewUp, Distance, Field of View Y, Window Size, Window Pos.
+ * Values in each string are seperated by a ','
+ */
+ bool
+ getCameraParameters (const std::vector<std::string> &camera);
+
+ /** \brief Set render window. */
+ void
+ setRenderWindow (const vtkSmartPointer<vtkRenderWindow> &win)
+ {
+ win_ = win;
+ }
+
/** \brief True if we're using red-blue colors for anaglyphic stereo, false if magenta-green. */
bool stereo_anaglyph_mask_default_;
/** \brief The keyboard modifier to use. Default: Alt. */
InteractorKeyboardModifier modifier_;
+ /** \brief Camera file for camera parameter saving/restoring. */
+ std::string camera_file_;
+ /** \brief A \ref pcl::visualization::Camera for camera parameter saving/restoring. */
+ Camera camera_;
+ /** \brief A \ref pcl::visualization::Camera is saved or not. */
+ bool camera_saved_;
+ /** \brief The render window.
+ * Only used when interactor maybe not available
+ */
+ vtkSmartPointer<vtkRenderWindow> win_;
+
friend class PointPickingCallback;
+ friend class PCLVisualizer;
};
/** \brief PCL histogram visualizer interactory style class.
#include <iostream>
#include <map>
#include <vector>
+#include <pcl/pcl_exports.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPoints2D.h>
#include "vtkCommand.h"
-#include <vtkRegressionTestImage.h>
-
namespace pcl
{
namespace visualization
* \author Kripasindhu Sarkar
* \ingroup visualization
*/
- class PCLPainter2D: public vtkContextItem
+ class PCL_EXPORTS PCLPainter2D: public vtkContextItem
{
public:
/** \brief Constructor of the class
*/
PCLPainter2D (char const * name = "PCLPainter2D");
- vtkTypeRevisionMacro (PCLPainter2D, vtkContextItem);
+ vtkTypeMacro (PCLPainter2D, vtkContextItem);
/** \brief Paint event for the chart, called whenever the chart needs to be drawn
- * \param[in] name Name of the window
+ * \param[in] painter Name of the window
*/
virtual bool
Paint (vtkContext2D *painter);
scalePen(double x, double y);
/** \brief Create a translation matrix and concatenate it with the current transformation.
- * \param[in] x translation along X axis
- * \param[in] y translation along Y axis
+ * \param[in] matrix the transformation matrix
*/
void
setTransform(vtkMatrix3x3 *matrix);
char const *color=NULL);
/** \brief Adds a plot with correspondences in vectors arrayX and arrayY. This is the vector version of the addPlotData function.
- * \param[in] array_X X coordinates of point correspondence array
- * \param[in] array_Y Y coordinates of point correspondence array
- * \param[in] size length of the array arrayX and arrayY
+ * \param[in] array_x X coordinates of point correspondence array
+ * \param[in] array_y Y coordinates of point correspondence array
* \param[in] name name of the plot which appears in the legend when toggled on
* \param[in] type type of the graph plotted. vtkChart::LINE for line plot, vtkChart::BAR for bar plot, and vtkChart::POINTS for a scattered point plot
* \param[in] color a character array of 4 fields denoting the R,G,B and A component of the color of the plot ranging from 0 to 255. If this argument is not passed (or NULL is passed) the plot is colored based on a color scheme
*/
void
- addPlotData (std::vector<double> const &array_X,
- std::vector<double>const &array_Y,
+ addPlotData (std::vector<double> const &array_x,
+ std::vector<double>const &array_y,
char const * name = "Y Axis",
int type = vtkChart::LINE,
std::vector<char> const &color = std::vector<char> ());
- /** \brief Adds a plot with correspondences in vector of pairs. The the first and second field of the pairs of the vector forms the correspondence.
+ /** \brief Adds a plot with correspondences in vector of pairs. The the first and second field of the pairs of the vector forms the correspondence.
+ * \param plot_data
* \param[in] name name of the plot which appears in the legend when toggled on
* \param[in] type type of the graph plotted. vtkChart::LINE for line plot, vtkChart::BAR for bar plot, and vtkChart::POINTS for a scattered point plot
* \param[in] color a character array of 4 fields denoting the R,G,B and A component of the color of the plot ranging from 0 to 255. If this argument is not passed (or NULL is passed) the plot is colored based on a color scheme
void
setWindowSize (int w, int h);
+ /** \brief Set the position in screen coordinates.
+ * \param[in] x where to move the window to (X)
+ * \param[in] y where to move the window to (Y)
+ */
+ void
+ setWindowPosition (int x, int y);
+
+ /** \brief Set the visualizer window name.
+ * \param[in] name the name of the window
+ */
+ void
+ setWindowName (const std::string &name);
+
/** \brief set/get method for the window size.
* \return[in] array containing the width and height of the window
*/
//extra state variables
int current_plot_; //stores the id of the current (most recent) plot, used in automatic coloring and other state change schemes
int win_width_, win_height_;
+ int win_x_, win_y_; //window position according to screen coordinate
double bkg_color_[3];
+ std::string win_name_;
//####event callback class####
struct ExitMainLoopTimerCallback : public vtkCommand
#include <pcl/correspondence.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/PolygonMesh.h>
+#include <pcl/TextureMesh.h>
//
#include <pcl/console/print.h>
#include <pcl/visualization/common/actor_map.h>
* \param[in] scale the scale of the axes (default: 1)
* \param[in] viewport the view port where the 3D axes should be added (default: all)
*/
+ PCL_DEPRECATED (
+ "addCoordinateSystem (scale, viewport) is deprecated, please use function "
+ "addCoordinateSystem (scale, id, viewport) with id a unique string identifier.")
void
- addCoordinateSystem (double scale = 1.0, int viewport = 0);
+ addCoordinateSystem (double scale, int viewport);
+
+ /** \brief Adds 3D axes describing a coordinate system to screen at 0,0,0.
+ * \param[in] scale the scale of the axes (default: 1)
+ * \param[in] id the coordinate system object id (default: reference)
+ * \param[in] viewport the view port where the 3D axes should be added (default: all)
+ */
+ void
+ addCoordinateSystem (double scale = 1.0, const std::string& id = "reference", int viewport = 0);
+
+ /** \brief Adds 3D axes describing a coordinate system to screen at x, y, z
+ * \param[in] scale the scale of the axes (default: 1)
+ * \param[in] x the X position of the axes
+ * \param[in] y the Y position of the axes
+ * \param[in] z the Z position of the axes
+ * \param[in] viewport the view port where the 3D axes should be added (default: all)
+ */
+ PCL_DEPRECATED (
+ "addCoordinateSystem (scale, x, y, z, viewport) is deprecated, please use function "
+ "addCoordinateSystem (scale, x, y, z, id, viewport) with id a unique string identifier.")
+ void
+ addCoordinateSystem (double scale, float x, float y, float z, int viewport);
/** \brief Adds 3D axes describing a coordinate system to screen at x, y, z
* \param[in] scale the scale of the axes (default: 1)
* \param[in] x the X position of the axes
* \param[in] y the Y position of the axes
* \param[in] z the Z position of the axes
+ * \param[in] id the coordinate system object id (default: reference)
* \param[in] viewport the view port where the 3D axes should be added (default: all)
*/
void
- addCoordinateSystem (double scale, float x, float y, float z, int viewport = 0);
+ addCoordinateSystem (double scale, float x, float y, float z, const std::string &id = "reference", int viewport = 0);
+
+ /** \brief Adds 3D axes describing a coordinate system to screen at x, y, z, Roll,Pitch,Yaw
+ *
+ * \param[in] scale the scale of the axes (default: 1)
+ * \param[in] t transformation matrix
+ * \param[in] viewport the view port where the 3D axes should be added (default: all)
+ */
+ PCL_DEPRECATED (
+ "addCoordinateSystem (scale, t, viewport) is deprecated, please use function "
+ "addCoordinateSystem (scale, t, id, viewport) with id a unique string identifier.")
+ void
+ addCoordinateSystem (double scale, const Eigen::Affine3f& t, int viewport);
/** \brief Adds 3D axes describing a coordinate system to screen at x, y, z, Roll,Pitch,Yaw
*
* \param[in] scale the scale of the axes (default: 1)
* \param[in] t transformation matrix
+ * \param[in] id the coordinate system object id (default: reference)
* \param[in] viewport the view port where the 3D axes should be added (default: all)
*
* RPY Angles
*
* All axies use right hand rule. x=red axis, y=green axis, z=blue axis
* z direction is point into the screen.
+ * \code
* z
* \
* \
* |
* |
* y
+ * \endcode
*/
+
void
- addCoordinateSystem (double scale, const Eigen::Affine3f& t, int viewport = 0);
+ addCoordinateSystem (double scale, const Eigen::Affine3f& t, const std::string &id = "reference", int viewport = 0);
+
+ /** \brief Removes a previously added 3D axes (coordinate system)
+ * \param[in] viewport view port where the 3D axes should be removed from (default: all)
+ */
+ PCL_DEPRECATED (
+ "removeCoordinateSystem (viewport) is deprecated, please use function "
+ "addCoordinateSystem (id, viewport) with id a unique string identifier.")
+ bool
+ removeCoordinateSystem (int viewport);
/** \brief Removes a previously added 3D axes (coordinate system)
+ * \param[in] id the coordinate system object id (default: reference)
* \param[in] viewport view port where the 3D axes should be removed from (default: all)
*/
bool
- removeCoordinateSystem (int viewport = 0);
+ removeCoordinateSystem (const std::string &id = "reference", int viewport = 0);
/** \brief Removes a Point Cloud from screen, based on a given ID.
* \param[in] id the point cloud object id (i.e., given on \a addPointCloud)
bool
updateShapePose (const std::string &id, const Eigen::Affine3f& pose);
+ /** \brief Set the pose of an existing coordinate system.
+ *
+ * Returns false if the coordinate system doesn't exist, true if the pose was successfully
+ * updated.
+ *
+ * \param[in] id the point cloud object id (i.e., given on \a addCoordinateSystem etc.)
+ * \param[in] pose the new pose
+ * \return false if no coordinate system with the specified ID was found
+ */
+ bool
+ updateCoordinateSystemPose (const std::string &id, const Eigen::Affine3f& pose);
+
/** \brief Set the pose of an existing point cloud.
*
* Returns false if the point cloud doesn't exist, true if the pose was successfully
const std::string &id = "correspondences",
int viewport = 0);
+ /** \brief Add a TextureMesh object to screen
+ * \param[in] polymesh the textured polygonal mesh
+ * \param[in] id the texture mesh object id (default: "texture")
+ * \param[in] viewport the view port where the TextureMesh should be added (default: all)
+ */
+ bool
+ addTextureMesh (const pcl::TextureMesh &polymesh,
+ const std::string &id = "texture",
+ int viewport = 0);
+
/** \brief Add the specified correspondences to the display.
* \param[in] source_points The source points
* \param[in] target_points The target points
const std::string &id = "line", int viewport = 0);
/** \brief Add a line arrow segment between two points, and display the distance between them
+ *
+ * Arrow heads are attached to both end points of the arrow.
+ *
* \param[in] pt1 the first (start) point on the line
* \param[in] pt2 the second (end) point on the line
* \param[in] r the red channel of the color that the line should be rendered with
addArrow (const P1 &pt1, const P2 &pt2, double r, double g, double b,
const std::string &id = "arrow", int viewport = 0);
- /** \brief Add a line arrow segment between two points, and display the distance between them
+ /** \brief Add a line arrow segment between two points, and (optianally) display the distance between them
+ *
+ * Arrow head is attached on the **start** point (\c pt1) of the arrow.
+ *
* \param[in] pt1 the first (start) point on the line
* \param[in] pt2 the second (end) point on the line
* \param[in] r the red channel of the color that the line should be rendered with
const std::string &id = "arrow", int viewport = 0);
/** \brief Add a line arrow segment between two points, and display the distance between them in a given color
+ *
+ * Arrow heads are attached to both end points of the arrow.
+ *
* \param[in] pt1 the first (start) point on the line
* \param[in] pt2 the second (end) point on the line
* \param[in] r_line the red channel of the color that the line should be rendered with
bool
getCameraParameters (int argc, char **argv);
- /** \brief Checks whether the camera parameters were manually loaded from file.*/
+ /** \brief Load camera parameters from a camera parameters file.
+ * \param[in] file the name of the camera parameters file
+ */
+ bool
+ loadCameraParameters (const std::string &file);
+
+ /** \brief Checks whether the camera parameters were manually loaded.
+ * \return True if valid "-cam" option is available in command line.
+ * \sa cameraFileLoaded ()
+ */
bool
cameraParamsSet () const;
+ /** \brief Checks whether a camera file were automatically loaded.
+ * \return True if a valid camera file is automatically loaded.
+ * \note The camera file is saved by pressing "ctrl + s" during last run of the program
+ * and restored automatically when the program runs this time.
+ * \sa cameraParamsSet ()
+ */
+ bool
+ cameraFileLoaded () const;
+
+ /** \brief Get camera file for camera parameter saving/restoring.
+ * \note This will be valid only when valid "-cam" option were available in command line
+ * or a saved camera file were automatically loaded.
+ * \sa cameraParamsSet (), cameraFileLoaded ()
+ */
+ std::string
+ getCameraFile () const;
+
/** \brief Update camera parameters and render. */
void
updateCamera ();
/** \brief Set the camera clipping distances.
* \param[in] near the near clipping distance (no objects closer than this to the camera will be drawn)
* \param[in] far the far clipping distance (no objects further away than this to the camera will be drawn)
+ * \param[in] viewport the viewport to modify camera of (0 modifies all cameras)
*/
void
setCameraClipDistances (double near, double far, int viewport = 0);
void
saveScreenshot (const std::string &file);
+ /** \brief Save the camera parameters to disk, as a .cam file.
+ * \param[in] file the name of the .cam file
+ */
+ void
+ saveCameraParameters (const std::string &file);
+
+ /** \brief Get camera parameters and save them to a pcl::visualization::Camera.
+ * \param[out] camera the name of the pcl::visualization::Camera
+ */
+ void
+ getCameraParameters (Camera &camera);
+
/** \brief Return a pointer to the underlying VTK Render Window used. */
vtkSmartPointer<vtkRenderWindow>
getRenderWindow ()
return (cloud_actor_map_);
}
+ /** \brief Return a pointer to the ShapeActorMap this visualizer uses. */
+ ShapeActorMapPtr
+ getShapeActorMap ()
+ {
+ return (shape_actor_map_);
+ }
/** \brief Set the position in screen coordinates.
* \param[in] x where to move the window to (X)
ShapeActorMapPtr shape_actor_map_;
/** \brief Internal list with actor pointers and viewpoint for coordinates. */
- CoordinateActorMap coordinate_actor_map_;
+ CoordinateActorMapPtr coordinate_actor_map_;
/** \brief Internal pointer to widget which contains a set of axes */
vtkSmartPointer<vtkOrientationMarkerWidget> axes_widget_;
- /** \brief Boolean that holds whether or not the camera parameters were manually initialized*/
+ /** \brief Boolean that holds whether or not the camera parameters were manually initialized */
bool camera_set_;
+ /** \brief Boolean that holds whether or not a camera file were automatically loaded */
+ bool camera_file_loaded_;
+
/** \brief Boolean that holds whether or not to use the vtkVertexBufferObjectMapper*/
bool use_vbos_;
const Eigen::Quaternion<float> &orientation,
Eigen::Matrix4f &transformation);
+ /** \brief Fills a vtkTexture structure from pcl::TexMaterial.
+ * \param[in] tex_mat texture material in PCL format
+ * \param[out] vtk_tex texture material in VTK format
+ * \return 0 on success and -1 else.
+ * \note for now only image based textures are supported, image file must be in
+ * tex_file attribute of \a tex_mat.
+ */
+ int
+ textureFromTexMaterial (const pcl::TexMaterial& tex_mat,
+ vtkTexture* vtk_tex) const;
+
+ /** \brief Get camera file for camera parameter saving/restoring from command line.
+ * Camera filename is calculated using sha1 value of all pathes of input .pcd files
+ * \return empty string if failed.
+ */
+ std::string
+ getUniqueCameraFile (int argc, char **argv);
+
//There's no reason these conversion functions shouldn't be public and static so others can use them.
public:
/** \brief Convert Eigen::Matrix4f to vtkMatrix4x4
std::string field_name_;
};
+
+ //////////////////////////////////////////////////////////////////////////////////////
+ /** \brief RGBA handler class for colors. Uses the data present in the "rgba" field as
+ * the color at each point. Transparency is handled.
+ * \author Nizar Sallem
+ * \ingroup visualization
+ */
+ template <typename PointT>
+ class PointCloudColorHandlerRGBAField : public PointCloudColorHandler<PointT>
+ {
+ typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
+ typedef typename PointCloud::Ptr PointCloudPtr;
+ typedef typename PointCloud::ConstPtr PointCloudConstPtr;
+
+ public:
+ typedef boost::shared_ptr<PointCloudColorHandlerRGBAField<PointT> > Ptr;
+ typedef boost::shared_ptr<const PointCloudColorHandlerRGBAField<PointT> > ConstPtr;
+
+ /** \brief Constructor. */
+ PointCloudColorHandlerRGBAField ()
+ {
+ capable_ = false;
+ }
+
+ /** \brief Constructor. */
+ PointCloudColorHandlerRGBAField (const PointCloudConstPtr &cloud)
+ : PointCloudColorHandler<PointT> (cloud)
+ {
+ setInputCloud (cloud);
+ }
+
+ /** \brief Destructor. */
+ virtual ~PointCloudColorHandlerRGBAField () {}
+
+ /** \brief Get the name of the field used. */
+ virtual std::string
+ getFieldName () const { return ("rgba"); }
+
+ /** \brief Obtain the actual color for the input dataset as vtk scalars.
+ * \param[out] scalars the output scalars containing the color for the dataset
+ * \return true if the operation was successful (the handler is capable and
+ * the input cloud was given as a valid pointer), false otherwise
+ */
+ virtual bool
+ getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
+
+ /** \brief Set the input cloud to be used.
+ * \param[in] cloud the input cloud to be used by the handler
+ */
+ virtual void
+ setInputCloud (const PointCloudConstPtr &cloud);
+
+ protected:
+ /** \brief Class getName method. */
+ virtual std::string
+ getName () const { return ("PointCloudColorHandlerRGBAField"); }
+
+ // Members derived from the base class
+ using PointCloudColorHandler<PointT>::cloud_;
+ using PointCloudColorHandler<PointT>::capable_;
+ using PointCloudColorHandler<PointT>::field_idx_;
+ using PointCloudColorHandler<PointT>::fields_;
+ };
+
//////////////////////////////////////////////////////////////////////////////////////
/** \brief Base Handler class for PointCloud colors.
* \author Radu B. Rusu
/** \brief Name of the field used to create the color handler. */
std::string field_name_;
};
+
+ //////////////////////////////////////////////////////////////////////////////////////
+ /** \brief RGBA handler class for colors. Uses the data present in the "rgba" field as
+ * the color at each point. Transparency is handled.
+ * \author Nizar Sallem
+ * \ingroup visualization
+ */
+ template <>
+ class PCL_EXPORTS PointCloudColorHandlerRGBAField<pcl::PCLPointCloud2> : public PointCloudColorHandler<pcl::PCLPointCloud2>
+ {
+ typedef PointCloudColorHandler<pcl::PCLPointCloud2>::PointCloud PointCloud;
+ typedef PointCloud::Ptr PointCloudPtr;
+ typedef PointCloud::ConstPtr PointCloudConstPtr;
+
+ public:
+ typedef boost::shared_ptr<PointCloudColorHandlerRGBAField<PointCloud> > Ptr;
+ typedef boost::shared_ptr<const PointCloudColorHandlerRGBAField<PointCloud> > ConstPtr;
+
+ /** \brief Constructor. */
+ PointCloudColorHandlerRGBAField (const PointCloudConstPtr &cloud);
+
+ /** \brief Empty destructor */
+ virtual ~PointCloudColorHandlerRGBAField () {}
+
+ /** \brief Obtain the actual color for the input dataset as vtk scalars.
+ * \param[out] scalars the output scalars containing the color for the dataset
+ * \return true if the operation was successful (the handler is capable and
+ * the input cloud was given as a valid pointer), false otherwise
+ */
+ virtual bool
+ getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
+
+ protected:
+ /** \brief Get the name of the class. */
+ virtual std::string
+ getName () const { return ("PointCloudColorHandlerRGBAField"); }
+
+ /** \brief Get the name of the field used. */
+ virtual std::string
+ getFieldName () const { return ("rgba"); }
+ };
}
}
idx_ (idx1), idx2_ (idx2), x_ (x1), y_ (y1), z_ (z1), x2_ (x2), y2_ (y2), z2_ (z2)
{}
- /** \brief Obtain the ID of a point that the user just clicked on. */
+ /** \brief Obtain the ID of a point that the user just clicked on.
+ * \warning If the cloud contains NaNs the index returned by this function will not correspond to the
+ * original indices. To get the correct index either sanitize the input cloud to remove NaNs or use the
+ * PointPickingEvent::getPoint function to get the x,y,z of the picked point and then search the original
+ * cloud for the correct index. An example of how to do this can be found in the pp_callback function in
+ * visualization/tools/pcd_viewer.cpp
+ */
inline int
getPointIndex () const
{
* \param[out] index_1 index of the first point selected by user
* \param[out] index_2 index of the second point selected by user
* \return true, if two points are available and have been clicked by the user, false otherwise
+ * \warning If the cloud contains NaNs the index returned by this function will not correspond to the
+ * original indices. To get the correct index either sanitize the input cloud to remove NaNs or use the
+ * PointPickingEvent::getPoint function to get the x,y,z of the picked point and then search the original
+ * cloud for the correct index. An example of how to do this can be found in the pp_callback function in
+ * visualization/tools/pcd_viewer.cpp
*/
inline bool
getPointIndices (int &index_1, int &index_2) const
virtual void set (float x, float y, const std::string& _text);
std::string text;
};
+
+ struct PCL_EXPORTS Markers : public Points
+ {
+ vtkTypeMacro (Markers, Points);
+ static Markers *New ();
+ virtual bool Paint (vtkContext2D *painter);
+ void setSize (float _size) { size = _size; }
+ void setPointColors (unsigned char r, unsigned char g, unsigned char b);
+ void setPointColors (unsigned char rgb[3]);
+ float size;
+ unsigned char point_colors[3];
+ };
}
}
}
/**
* @brief registering a callback function for mouse events
- * @param the boost function that will be registered as a callback for a mouse event
* @return connection object that allows to disconnect the callback function.
*/
+ // param the boost function that will be registered as a callback for a mouse event
boost::signals2::connection
registerMouseCallback (boost::function<void (const pcl::visualization::MouseEvent&)> );
/**
* @brief registering a callback boost::function for keyboard events
- * @param the boost function that will be registered as a callback for a keyboard event
* @return connection object that allows to disconnect the callback function.
*/
+ // param the boost function that will be registered as a callback for a keyboard event
boost::signals2::connection
registerKeyboardCallback (boost::function<void (const pcl::visualization::KeyboardEvent&)> );
viewer_ = boost::shared_ptr<PCLVisualizer>(new PCLVisualizer (window_name_, true));
#endif
viewer_->setBackgroundColor (0.1, 0.1, 0.1);
- viewer_->addCoordinateSystem (0.1);
+ viewer_->addCoordinateSystem (0.1, "global");
while (!quit_)
{
*
*/
+#include <vtkVersion.h>
#include <vtkPolyData.h>
#include <vtkCleanPolyData.h>
#include <vtkSmartPointer.h>
// Clean the data (no duplicates!)
vtkSmartPointer<vtkCleanPolyData> cleaner = vtkSmartPointer<vtkCleanPolyData>::New ();
cleaner->SetTolerance (0.0);
+#if VTK_MAJOR_VERSION < 6
cleaner->SetInput (data);
+#else
+ cleaner->SetInputData (data);
+#endif
cleaner->ConvertLinesToPointsOff ();
cleaner->ConvertPolysToLinesOff ();
cleaner->ConvertStripsToPolysOff ();
tuber->SetInputConnection (line->GetOutputPort ());
tuber->SetRadius (coefficients.values[6]);
tuber->SetNumberOfSides (numsides);
+ tuber->Update ();
return (tuber->GetOutput ());
}
vtkSmartPointer<vtkTransformPolyDataFilter> tf = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
tf->SetTransform (t);
tf->SetInputConnection (s_sphere->GetOutputPort ());
+ tf->Update ();
return (tf->GetOutput ());
}
vtkSmartPointer<vtkTransformPolyDataFilter> tf = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
tf->SetTransform (t);
tf->SetInputConnection (cube->GetOutputPort ());
+ tf->Update ();
return (tf->GetOutput ());
}
vtkSmartPointer<vtkTransformPolyDataFilter> tf = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
tf->SetTransform (t);
tf->SetInputConnection (cube->GetOutputPort ());
+ tf->Update ();
return (tf->GetOutput ());
}
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New ();
cube->SetBounds (x_min, x_max, y_min, y_max, z_min, z_max);
-
+ cube->Update ();
return (cube->GetOutput ());
}
+ coefficients.values[2] * coefficients.values[2];
plane->Push (-coefficients.values[3] / sqrt(norm_sqr));
+ plane->Update ();
return (plane->GetOutput ());
}
y -= coefficients.values[1] * t * norm_sqr;
z -= coefficients.values[2] * t * norm_sqr;
plane->SetCenter (x, y, z);
+ plane->Update ();
return (plane->GetOutput ());
}
vtkSmartPointer<vtkTransformPolyDataFilter> tf = vtkSmartPointer<vtkTransformPolyDataFilter>::New ();
tf->SetTransform (t);
tf->SetInputConnection (disk->GetOutputPort ());
+ tf->Update ();
/*
tf->SetInputConnection (tube->GetOutputPort ());
*/
pcl::visualization::createCone (const pcl::ModelCoefficients &coefficients)
{
vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New ();
- cone->SetHeight (1.0);
- cone->SetCenter (coefficients.values[0] + coefficients.values[3] * 0.5,
- coefficients.values[1] + coefficients.values[1] * 0.5,
- coefficients.values[2] + coefficients.values[2] * 0.5);
+ cone->SetHeight (std::sqrt (coefficients.values[3] * coefficients.values[3] +
+ coefficients.values[4] * coefficients.values[4] +
+ coefficients.values[5] * coefficients.values[5]));
+ cone->SetCenter (coefficients.values[0] + coefficients.values[3] * 0.5,
+ coefficients.values[1] + coefficients.values[4] * 0.5,
+ coefficients.values[2] + coefficients.values[5] * 0.5);
cone->SetDirection (-coefficients.values[3], -coefficients.values[4], -coefficients.values[5]);
cone->SetResolution (100);
cone->SetAngle (coefficients.values[6]);
-
+ cone->Update ();
return (cone->GetOutput ());
}
#include <pcl/visualization/histogram_visualizer.h>
#include <pcl/visualization/boost.h>
+#include <vtkVersion.h>
#include <vtkXYPlotActor.h>
#include <vtkDoubleArray.h>
#include <vtkTextProperty.h>
const vtkSmartPointer<vtkDoubleArray> &xy_array, RenWinInteract* renwinupd, const int hsize)
{
renwinupd->ren_->RemoveActor2D (renwinupd->xy_plot_);
+#if VTK_MAJOR_VERSION < 6
renwinupd->xy_plot_->RemoveAllInputs ();
+#else
+ renwinupd->xy_plot_->RemoveAllDataSetInputConnections ();
+#endif
+
double min_max[2];
xy_array->GetRange (min_max, 1);
*
*/
+#include <vtkVersion.h>
#include <vtkImageViewer.h>
#include <vtkCallbackCommand.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
+#if VTK_MAJOR_VERSION >= 6
+#include <vtkImageSlice.h>
+#include <vtkImageSliceMapper.h>
+#endif
+
#include <pcl/visualization/image_viewer.h>
#include <pcl/visualization/common/float_image_utils.h>
#include <pcl/visualization/keyboard_event.h>
vtkSmartPointer<vtkImageData> empty_image = vtkSmartPointer<vtkImageData>::New ();
vtkSmartPointer<vtkImageSliceMapper> map = vtkSmartPointer<vtkImageSliceMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
map->SetInput (empty_image);
+#else
+ map->SetInputData (empty_image);
+#endif
slice_->SetMapper (map);
ren_->AddViewProp (slice_);
interactor_->SetInteractorStyle (interactor_style_);
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New ();
image->SetExtent (0, width - 1, 0, height - 1, 0, 0);
+#if VTK_MAJOR_VERSION < 6
image->SetScalarTypeToUnsignedChar ();
image->SetNumberOfScalarComponents (3);
image->AllocateScalars ();
+#else
+ image->AllocateScalars (VTK_UNSIGNED_CHAR, 3);
+#endif
image->GetPointData ()->GetScalars ()->SetVoidArray (data, 3 * width * height, 1);
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 10))
// Now create filter and set previously created transformation
# else
image_viewer_->SetInputConnection (algo_->GetOutputPort ());
# endif
-#else
+#elif VTK_MAJOR_VERSION < 6
image_viewer_->SetInputData (image);
interactor_style_->adjustCamera (image, ren_);
+#else
+ algo_->SetInputData (image);
+ algo_->Update ();
#endif
}
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New ();
image->SetExtent (0, width - 1, 0, height - 1, 0, 0);
+#if VTK_MAJOR_VERSION < 6
image->SetScalarTypeToUnsignedChar ();
image->SetNumberOfScalarComponents (1);
image->AllocateScalars ();
+#else
+ image->AllocateScalars (VTK_UNSIGNED_CHAR, 1);
+#endif
image->GetPointData ()->GetScalars ()->SetVoidArray (data, width * height, 1);
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 10))
# else
image_viewer_->SetInputConnection (algo_->GetOutputPort ());
# endif
-#else
+#elif VTK_MAJOR_VERSION < 6
image_viewer_->SetInputData (image);
interactor_style_->adjustCamera (image, ren_);
+#else
+ algo_->SetInputData (image);
+ algo_->Update ();
#endif
}
rect->set (0, 0, static_cast<float> (width), static_cast<float> (height));
l.actor->GetScene ()->AddItem (rect);
}
+#if VTK_MAJOR_VERSION < 6
image_viewer_->GetRenderer ()->AddActor (l.actor);
+#else
+ ren_->AddActor (l.actor);
+#endif
// Add another element
layer_map_.push_back (l);
PCL_DEBUG ("[pcl::visualization::ImageViewer::removeLayer] No layer with ID='%s' found.\n", layer_id.c_str ());
return;
}
+#if VTK_MAJOR_VERSION < 6
image_viewer_->GetRenderer ()->RemoveActor (am_it->actor);
+#else
+ ren_->RemoveActor (am_it->actor);
+#endif
layer_map_.erase (am_it);
}
pcl::visualization::ImageViewer::addCircle (unsigned int x, unsigned int y, double radius,
const std::string &layer_id, double opacity)
{
- return (addCircle (x, y, radius, layer_id, opacity));
+ return (addCircle (x, y, radius, 0.0, 1.0, 0.0, layer_id, opacity));
}
//////////////////////////////////////////////////////////////////////////////////////////
am_it->actor->GetScene ()->AddItem (point);
}
+//////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::ImageViewer::markPoints (
+ const std::vector<int>& uv, Vector3ub fg_color, Vector3ub bg_color, double size,
+ const std::string &layer_id, double opacity)
+{
+ if (uv.size () == 0)
+ return;
+
+ std::vector<float> float_uv (uv.size ());
+ for (std::size_t i = 0; i < uv.size (); ++i)
+ float_uv[i] = static_cast<float> (uv[i]);
+ return (markPoints (float_uv, fg_color, bg_color, size, layer_id, opacity));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::ImageViewer::markPoints (
+ const std::vector<float>& uv, Vector3ub fg_color, Vector3ub bg_color, double size,
+ const std::string &layer_id, double opacity)
+{
+ if (uv.size () == 0)
+ return;
+
+ // Check to see if this ID entry already exists (has it been already added to the visualizer?)
+ LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
+ if (am_it == layer_map_.end ())
+ {
+ PCL_DEBUG ("[pcl::visualization::ImageViewer::markPoint] No layer with ID='%s' found. Creating new one...\n", layer_id.c_str ());
+ am_it = createLayer (layer_id, getSize ()[0] - 1, getSize ()[1] - 1, opacity, false);
+#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION > 10))
+ interactor_style_->adjustCamera (ren_);
+#endif
+ }
+
+ vtkSmartPointer<context_items::Markers> markers = vtkSmartPointer<context_items::Markers>::New ();
+ markers->setOpacity (opacity);
+#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION > 10))
+ markers->set (uv);
+#else
+ // translate v which is on odd indices
+ std::vector<float> points = uv;
+ for (std::size_t i = 1; i < points.size (); i+=2)
+ points[i] = getSize ()[1] - points[i];
+ markers->set (points);
+#endif
+ markers->setSize (size);
+ markers->setColors (bg_color[0], bg_color[1], bg_color[2]);
+ markers->setPointColors (fg_color[0], fg_color[1], fg_color[2]);
+ am_it->actor->GetScene ()->AddItem (markers);
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::ImageViewer::render ()
pcl::visualization::ImageViewer::setWindowTitle (const std::string& name)
{
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION >= 10))
- win_->SetWindowName (name.c_str ());
-#else
image_viewer_->GetRenderWindow ()->SetWindowName (name.c_str ());
+#else
+ win_->SetWindowName (name.c_str ());
#endif
}
pcl::visualization::ImageViewer::setPosition (int x, int y)
{
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION >= 10))
- win_->SetPosition (x, y);
-#else
image_viewer_->GetRenderWindow ()->SetPosition (x, y);
+#else
+ win_->SetPosition (x, y);
#endif
}
pcl::visualization::ImageViewer::getSize ()
{
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION >= 10))
- return (win_->GetSize ());
-#else
return (image_viewer_->GetRenderWindow ()->GetSize ());
+#else
+ return (win_->GetSize ());
#endif
}
pcl::visualization::ImageViewer::setSize (int xw, int yw)
{
#if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION >= 10))
- win_->SetSize (xw, yw);
-#else
image_viewer_->GetRenderWindow ()->SetSize (xw, yw);
+#else
+ win_->SetSize (xw, yw);
+
#endif
}
#include <list>
#include <pcl/visualization/common/io.h>
#include <pcl/visualization/interactor_style.h>
+#include <vtkVersion.h>
#include <vtkLODActor.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
snapshot_writer_->Write ();
}
+//////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizerInteractorStyle::saveCameraParameters (const std::string &file)
+{
+ FindPokedRenderer (Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1]);
+
+ ofstream ofs_cam (file.c_str ());
+ if (!ofs_cam.is_open ())
+ {
+ return (false);
+ }
+
+ vtkSmartPointer<vtkCamera> cam = Interactor->GetRenderWindow ()->GetRenderers ()->GetFirstRenderer ()->GetActiveCamera ();
+ double clip[2], focal[3], pos[3], view[3];
+ cam->GetClippingRange (clip);
+ cam->GetFocalPoint (focal);
+ cam->GetPosition (pos);
+ cam->GetViewUp (view);
+ int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
+ int *win_size = Interactor->GetRenderWindow ()->GetSize ();
+ ofs_cam << clip[0] << "," << clip[1] << "/" << focal[0] << "," << focal[1] << "," << focal[2] << "/" <<
+ pos[0] << "," << pos[1] << "," << pos[2] << "/" << view[0] << "," << view[1] << "," << view[2] << "/" <<
+ cam->GetViewAngle () / 180.0 * M_PI << "/" << win_size[0] << "," << win_size[1] << "/" << win_pos[0] << "," << win_pos[1]
+ << endl;
+ ofs_cam.close ();
+
+ return (true);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizerInteractorStyle::getCameraParameters (pcl::visualization::Camera &camera)
+{
+ FindPokedRenderer (Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1]);
+
+ vtkSmartPointer<vtkCamera> cam = Interactor->GetRenderWindow ()->GetRenderers ()->GetFirstRenderer ()->GetActiveCamera ();
+ cam->GetClippingRange (camera.clip);
+ cam->GetFocalPoint (camera.focal);
+ cam->GetPosition (camera.pos);
+ cam->GetViewUp (camera.view);
+ camera.fovy = cam->GetViewAngle () / 180.0 * M_PI;
+ int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
+ int *win_size = Interactor->GetRenderWindow ()->GetSize ();
+ camera.window_pos[0] = win_pos[0];
+ camera.window_pos[1] = win_pos[1];
+ camera.window_size[0] = win_size[0];
+ camera.window_size[1] = win_size[1];
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizerInteractorStyle::loadCameraParameters (const std::string &file)
+{
+ std::ifstream fs;
+ std::string line;
+ std::vector<std::string> camera;
+ bool ret;
+
+ fs.open (file.c_str ());
+ while (!fs.eof ())
+ {
+ getline (fs, line);
+ if (line == "")
+ continue;
+
+ boost::split (camera, line, boost::is_any_of ("/"), boost::token_compress_on);
+ break;
+ }
+ fs.close ();
+
+ ret = getCameraParameters (camera);
+ if (ret)
+ {
+ camera_file_ = file;
+ }
+
+ return (ret);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizerInteractorStyle::setCameraParameters (const Eigen::Matrix3f &intrinsics,
+ const Eigen::Matrix4f &extrinsics,
+ int viewport)
+{
+ // Position = extrinsic translation
+ Eigen::Vector3f pos_vec = extrinsics.block<3, 1> (0, 3);
+
+ // Rotate the view vector
+ Eigen::Matrix3f rotation = extrinsics.block<3, 3> (0, 0);
+ Eigen::Vector3f y_axis (0.f, 1.f, 0.f);
+ Eigen::Vector3f up_vec (rotation * y_axis);
+
+ // Compute the new focal point
+ Eigen::Vector3f z_axis (0.f, 0.f, 1.f);
+ Eigen::Vector3f focal_vec = pos_vec + rotation * z_axis;
+
+ // Get the width and height of the image - assume the calibrated centers are at the center of the image
+ Eigen::Vector2i window_size;
+ window_size[0] = static_cast<int> (intrinsics (0, 2));
+ window_size[1] = static_cast<int> (intrinsics (1, 2));
+
+ // Compute the vertical field of view based on the focal length and image heigh
+ double fovy = 2 * atan (window_size[1] / (2. * intrinsics (1, 1))) * 180.0 / M_PI;
+
+
+ rens_->InitTraversal ();
+ vtkRenderer* renderer = NULL;
+ int i = 0;
+ while ((renderer = rens_->GetNextItem ()) != NULL)
+ {
+ // Modify all renderer's cameras
+ if (viewport == 0 || viewport == i)
+ {
+ vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
+ cam->SetPosition (pos_vec[0], pos_vec[1], pos_vec[2]);
+ cam->SetFocalPoint (focal_vec[0], focal_vec[1], focal_vec[2]);
+ cam->SetViewUp (up_vec[0], up_vec[1], up_vec[2]);
+ cam->SetUseHorizontalViewAngle (0);
+ cam->SetViewAngle (fovy);
+ cam->SetClippingRange (0.01, 1000.01);
+ win_->SetSize (window_size[0], window_size[1]);
+ }
+ ++i;
+ }
+ win_->Render ();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizerInteractorStyle::setCameraParameters (const pcl::visualization::Camera &camera, int viewport)
+{
+ rens_->InitTraversal ();
+ vtkRenderer* renderer = NULL;
+ int i = 0;
+ while ((renderer = rens_->GetNextItem ()) != NULL)
+ {
+ // Modify all renderer's cameras
+ if (viewport == 0 || viewport == i)
+ {
+ vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
+ cam->SetPosition (camera.pos[0], camera.pos[1], camera.pos[2]);
+ cam->SetFocalPoint (camera.focal[0], camera.focal[1], camera.focal[2]);
+ cam->SetViewUp (camera.view[0], camera.view[1], camera.view[2]);
+ cam->SetClippingRange (camera.clip);
+ cam->SetUseHorizontalViewAngle (0);
+ cam->SetViewAngle (camera.fovy * 180.0 / M_PI);
+
+ win_->SetSize (static_cast<int> (camera.window_size[0]),
+ static_cast<int> (camera.window_size[1]));
+ }
+ ++i;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLVisualizerInteractorStyle::zoomIn ()
EndDolly ();
}
+//////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizerInteractorStyle::getCameraParameters (const std::vector<std::string> &camera)
+{
+ pcl::visualization::Camera camera_temp;
+
+ // look for '/' as a separator
+ if (camera.size () != 7)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Camera parameters given, but with an invalid number of options (%lu vs 7)!\n", static_cast<unsigned long> (camera.size ()));
+ return (false);
+ }
+
+ std::string clip_str = camera.at (0);
+ std::string focal_str = camera.at (1);
+ std::string pos_str = camera.at (2);
+ std::string view_str = camera.at (3);
+ std::string fovy_str = camera.at (4);
+ std::string win_size_str = camera.at (5);
+ std::string win_pos_str = camera.at (6);
+
+ // Get each camera setting separately and parse for ','
+ std::vector<std::string> clip_st;
+ boost::split (clip_st, clip_str, boost::is_any_of (","), boost::token_compress_on);
+ if (clip_st.size () != 2)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera clipping angle!\n");
+ return (false);
+ }
+ camera_temp.clip[0] = atof (clip_st.at (0).c_str ());
+ camera_temp.clip[1] = atof (clip_st.at (1).c_str ());
+
+ std::vector<std::string> focal_st;
+ boost::split (focal_st, focal_str, boost::is_any_of (","), boost::token_compress_on);
+ if (focal_st.size () != 3)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera focal point!\n");
+ return (false);
+ }
+ camera_temp.focal[0] = atof (focal_st.at (0).c_str ());
+ camera_temp.focal[1] = atof (focal_st.at (1).c_str ());
+ camera_temp.focal[2] = atof (focal_st.at (2).c_str ());
+
+ std::vector<std::string> pos_st;
+ boost::split (pos_st, pos_str, boost::is_any_of (","), boost::token_compress_on);
+ if (pos_st.size () != 3)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera position!\n");
+ return (false);
+ }
+ camera_temp.pos[0] = atof (pos_st.at (0).c_str ());
+ camera_temp.pos[1] = atof (pos_st.at (1).c_str ());
+ camera_temp.pos[2] = atof (pos_st.at (2).c_str ());
+
+ std::vector<std::string> view_st;
+ boost::split (view_st, view_str, boost::is_any_of (","), boost::token_compress_on);
+ if (view_st.size () != 3)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera viewup!\n");
+ return (false);
+ }
+ camera_temp.view[0] = atof (view_st.at (0).c_str ());
+ camera_temp.view[1] = atof (view_st.at (1).c_str ());
+ camera_temp.view[2] = atof (view_st.at (2).c_str ());
+
+ std::vector<std::string> fovy_size_st;
+ boost::split (fovy_size_st, fovy_str, boost::is_any_of (","), boost::token_compress_on);
+ if (fovy_size_st.size () != 1)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for field of view angle!\n");
+ return (false);
+ }
+ camera_temp.fovy = atof (fovy_size_st.at (0).c_str ());
+
+ std::vector<std::string> win_size_st;
+ boost::split (win_size_st, win_size_str, boost::is_any_of (","), boost::token_compress_on);
+ if (win_size_st.size () != 2)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for window size!\n");
+ return (false);
+ }
+ camera_temp.window_size[0] = atof (win_size_st.at (0).c_str ());
+ camera_temp.window_size[1] = atof (win_size_st.at (1).c_str ());
+
+ std::vector<std::string> win_pos_st;
+ boost::split (win_pos_st, win_pos_str, boost::is_any_of (","), boost::token_compress_on);
+ if (win_pos_st.size () != 2)
+ {
+ pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for window position!\n");
+ return (false);
+ }
+ camera_temp.window_pos[0] = atof (win_pos_st.at (0).c_str ());
+ camera_temp.window_pos[1] = atof (win_pos_st.at (1).c_str ());
+
+ setCameraParameters (camera_temp);
+
+ return (true);
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLVisualizerInteractorStyle::OnChar ()
{
break;
}
- // S have a special !ALT case
+ // S have special !ALT case
case 's': case 'S':
{
if (!keymod)
// ---[ Check the rest of the key codes
+ // Save camera parameters
+ if ((Interactor->GetKeySym ()[0] == 'S' || Interactor->GetKeySym ()[0] == 's') && ctrl && !alt && !shift)
+ {
+ if (camera_file_.empty ())
+ {
+ getCameraParameters (camera_);
+ camera_saved_ = true;
+ pcl::console::print_info ("Camera parameters saved, you can press CTRL + R to restore.\n");
+ }
+ else
+ {
+ if (saveCameraParameters (camera_file_))
+ {
+ pcl::console::print_info ("Save camera parameters to %s, you can press CTRL + R to restore.\n", camera_file_.c_str ());
+ }
+ else
+ {
+ pcl::console::print_error ("[PCLVisualizerInteractorStyle] Can't save camera parameters to file: %s.\n", camera_file_.c_str ());
+ }
+ }
+ }
+
+ // Restore camera parameters
+ if ((Interactor->GetKeySym ()[0] == 'R' || Interactor->GetKeySym ()[0] == 'r') && ctrl && !alt && !shift)
+ {
+ if (camera_file_.empty ())
+ {
+ if (camera_saved_)
+ {
+ setCameraParameters (camera_);
+ pcl::console::print_info ("Camera parameters restored.\n");
+ }
+ else
+ {
+ pcl::console::print_info ("No camera parameters saved for restoring.\n");
+ }
+ }
+ else
+ {
+ if (boost::filesystem::exists (camera_file_))
+ {
+ if (loadCameraParameters (camera_file_))
+ {
+ pcl::console::print_info ("Restore camera parameters from %s.\n", camera_file_.c_str ());
+ }
+ else
+ {
+ pcl::console::print_error ("Can't restore camera parameters from file: %s.\n", camera_file_.c_str ());
+ }
+ }
+ else
+ {
+ pcl::console::print_info ("No camera parameters saved in %s for restoring.\n", camera_file_.c_str ());
+ }
+ }
+ }
+
// Switch between point color/geometry handlers
if (Interactor->GetKeySym () && Interactor->GetKeySym ()[0] >= '0' && Interactor->GetKeySym ()[0] <= '9')
{
else
{
vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(act->actor->GetMapper ());
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (data);
+#else
+ mapper->SetInputData (data);
+#endif
// Modify the actor
act->actor->SetMapper (mapper);
}
// Update the data
vtkPolyData *data = static_cast<vtkPolyData*>(act->actor->GetMapper ()->GetInput ());
data->GetPointData ()->SetScalars (scalars);
- data->Update ();
// Modify the mapper
if (use_vbos_)
{
vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(act->actor->GetMapper ());
mapper->SetScalarRange (minmax);
mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (data);
+#else
+ mapper->SetInputData (data);
+#endif
// Modify the actor
act->actor->SetMapper (mapper);
}
" g, G : display scale grid (on/off)\n"
" u, U : display lookup table (on/off)\n"
"\n"
+ " o, O : switch between perspective/parallel projection (default = perspective)\n"
" r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]\n"
+ " CTRL + s, S : save camera parameters\n"
+ " CTRL + r, R : restore camera parameters\n"
"\n"
" ALT + s, S : turn stereo mode on/off\n"
" ALT + f, F : switch between maximized window mode and original size\n"
" ALT + 0..9 [+ CTRL] : switch between different geometric handlers (where available)\n"
" 0..9 [+ CTRL] : switch between different color handlers (where available)\n"
"\n"
- " SHIFT + left click : select a point\n"
+ " SHIFT + left click : select a point (start with -use_point_picking)\n"
"\n"
" x, X : toggle rubber band selection mode for left mouse button\n"
);
saveScreenshot (snapshot_fn);
sprintf (cam_fn, "screenshot-%d.cam", t);
- ofstream ofs_cam;
- ofs_cam.open (cam_fn);
- vtkSmartPointer<vtkCamera> cam = Interactor->GetRenderWindow ()->GetRenderers ()->GetFirstRenderer ()->GetActiveCamera ();
- double clip[2], focal[3], pos[3], view[3];
- cam->GetClippingRange (clip);
- cam->GetFocalPoint (focal);
- cam->GetPosition (pos);
- cam->GetViewUp (view);
- int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
- int *win_size = Interactor->GetRenderWindow ()->GetSize ();
- ofs_cam << clip[0] << "," << clip[1] << "/" << focal[0] << "," << focal[1] << "," << focal[2] << "/" <<
- pos[0] << "," << pos[1] << "," << pos[2] << "/" << view[0] << "," << view[1] << "," << view[2] << "/" <<
- cam->GetViewAngle () / 180.0 * M_PI << "/" << win_size[0] << "," << win_size[1] << "/" << win_pos[0] << "," << win_pos[1]
- << endl;
- ofs_cam.close ();
+ saveCameraParameters (cam_fn);
pcl::console::print_info ("Screenshot (%s) and camera information (%s) successfully captured.\n", snapshot_fn, cam_fn);
break;
cam->GetViewUp (view);
int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
int *win_size = Interactor->GetRenderWindow ()->GetSize ();
- std::cerr << clip[0] << "," << clip[1] << "/" << focal[0] << "," << focal[1] << "," << focal[2] << "/" <<
- pos[0] << "," << pos[1] << "," << pos[2] << "/" << view[0] << "," << view[1] << "," << view[2] << "/" <<
- cam->GetViewAngle () / 180.0 * M_PI << "/" << win_size[0] << "," << win_size[1] << "/" << win_pos[0] << "," << win_pos[1]
- << endl;
+ std::cerr << "Clipping plane [near,far] " << clip[0] << ", " << clip[1] << endl <<
+ "Focal point [x,y,z] " << focal[0] << ", " << focal[1] << ", " << focal[2] << endl <<
+ "Position [x,y,z] " << pos[0] << ", " << pos[1] << ", " << pos[2] << endl <<
+ "View up [x,y,z] " << view[0] << ", " << view[1] << ", " << view[2] << endl <<
+ "Camera view angle [degrees] " << cam->GetViewAngle () << endl <<
+ "Window size [x,y] " << win_size[0] << ", " << win_size[1] << endl <<
+ "Window position [x,y] " << win_pos[0] << ", " << win_pos[1] << endl;
break;
}
case '=':
#include <pcl/visualization/pcl_painter2D.h>
-vtkCxxRevisionMacro (pcl::visualization::PCLPainter2D, "$Revision: 1.2 $");
-
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pcl::visualization::PCLPainter2D::PCLPainter2D(char const * name)
{
*
*/
+#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
//initializing default state values
win_width_ = 640;
win_height_ = 480;
+ win_x_ = 0;
+ win_y_ = 0;
bkg_color_[0] = 1; bkg_color_[1] = 1; bkg_color_[2] = 1;
current_plot_ = -1;
color_series_->SetColorScheme (vtkColorSeries::SPECTRUM);
+ win_name_ = "PCL Plotter";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//adding to chart
//vtkPlot *line = chart_->AddPlot(vtkChart::LINE);
vtkPlot *line = chart_->AddPlot (type);
+#if VTK_MAJOR_VERSION < 6
line->SetInput (table, 0, 1);
+#else
+ line->SetInputData (table, 0, 1);
+#endif
line->SetWidth (1);
if (color == NULL) //color automatically based on the ColorScheme
//apply current states
view_->GetRenderer ()->SetBackground (bkg_color_[0], bkg_color_[1], bkg_color_[2]);
view_->GetRenderWindow ()->SetSize (win_width_, win_height_);
-
+ view_->GetRenderWindow ()->SetPosition (win_x_, win_y_);
view_->GetInteractor ()->Initialize ();
- view_->GetRenderWindow ()->Render();
+
+ //according to vtk bug 976, SetWindowName must be called after RenderWindow Initialize();
+ view_->GetRenderWindow ()->SetWindowName (win_name_.c_str());
+ view_->GetRenderWindow ()->Render ();
view_->GetInteractor ()->Start ();
}
return (sz);
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLPlotter::setWindowPosition (int x, int y)
+{
+ win_x_ = x;
+ win_y_ = y;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLPlotter::setWindowName (const std::string &name)
+{
+ win_name_ = name;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLPlotter::startInteractor ()
//find min and max in the data
double min = data[0], max = data[0];
- for (int i = 1; i < data.size (); i++)
+ for (size_t i = 1; i < data.size (); i++)
{
if (data[i] < min) min = data[i];
if (data[i] > max) max = data[i];
}
//fill the freq for each data
- for (int i = 0; i < data.size (); i++)
+ for (size_t i = 0; i < data.size (); i++)
{
int index = int (floor ((data[i] - min) / size));
if (index == nbins) index = nbins - 1; //including right boundary
#include <pcl/visualization/common/common.h>
#include <pcl/conversions.h>
+#include <vtkVersion.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkCellData.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkAreaPicker.h>
#include <vtkXYPlotActor.h>
+#include <vtkOpenGLHardwareSupport.h>
+#include <vtkOpenGLRenderWindow.h>
+#include <vtkJPEGReader.h>
+#include <vtkBMPReader.h>
+#include <vtkPNMReader.h>
+#include <vtkPNGReader.h>
+#include <vtkTIFFReader.h>
#include <pcl/visualization/common/shapes.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/time.h>
+#include <boost/uuid/sha1.hpp>
+#include <boost/filesystem.hpp>
+#include <pcl/console/parse.h>
+
+#if defined(_WIN32)
+ // Remove macros defined in Windows.h
+ #undef near
+ #undef far
+#endif
/////////////////////////////////////////////////////////////////////////////////////////////
pcl::visualization::PCLVisualizer::PCLVisualizer (const std::string &name, const bool create_interactor)
, style_ (vtkSmartPointer<pcl::visualization::PCLVisualizerInteractorStyle>::New ())
, cloud_actor_map_ (new CloudActorMap)
, shape_actor_map_ (new ShapeActorMap)
- , coordinate_actor_map_ ()
+ , coordinate_actor_map_ (new CoordinateActorMap)
, camera_set_ ()
+ , camera_file_loaded_ (false)
{
// Create a Renderer
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New ();
update_fps_->pcl_visualizer = this;
update_fps_->decimated = false;
ren->AddActor (txt);
+ txt->SetInput("0 FPS");
// Create a RendererWindow
win_ = vtkSmartPointer<vtkRenderWindow>::New ();
while ((renderer = rens_->GetNextItem ()) != NULL)
win_->AddRenderer (renderer);
+ // Set renderer window in case no interactor is created
+ style_->setRenderWindow (win_);
+
// Create the interactor style
style_->Initialize ();
style_->setRendererCollection (rens_);
, style_ (style)
, cloud_actor_map_ (new CloudActorMap)
, shape_actor_map_ (new ShapeActorMap)
- , coordinate_actor_map_ ()
+ , coordinate_actor_map_ (new CoordinateActorMap)
, camera_set_ ()
+ , camera_file_loaded_ (false)
{
- style_ = style;
-
// Create a Renderer
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New ();
ren->AddObserver (vtkCommand::EndEvent, update_fps_);
win_ = vtkSmartPointer<vtkRenderWindow>::New ();
win_->SetWindowName (name.c_str ());
- // Get screen size
- int *scr_size = win_->GetScreenSize ();
-
- // Set default camera parameters
- initCameraParameters ();
-
- // Parse the camera settings and update the internal camera
- camera_set_ = getCameraParameters (argc, argv);
- // Set the window size as 1/2 of the screen size or the user given parameter
- win_->SetSize (scr_size[0]/2, scr_size[1]/2);
- win_->SetPosition (0, 0);
-
// By default, don't use vertex buffer objects
use_vbos_ = false;
while ((renderer = rens_->GetNextItem ()) != NULL)
win_->AddRenderer (renderer);
+ // Set renderer window in case no interactor is created
+ style_->setRenderWindow (win_);
+
// Create the interactor style
style_->Initialize ();
style_->setRendererCollection (rens_);
style_->setCloudActorMap (cloud_actor_map_);
style_->UseTimersOn ();
+ // Get screen size
+ int *scr_size = win_->GetScreenSize ();
+
+ // Set default camera parameters
+ initCameraParameters ();
+
+ // Parse the camera settings and update the internal camera
+ camera_set_ = getCameraParameters (argc, argv);
+ // Calculate unique camera filename for camera parameter saving/restoring
+ if (!camera_set_)
+ {
+ std::string camera_file = getUniqueCameraFile (argc, argv);
+ if (!camera_file.empty ())
+ {
+ if (boost::filesystem::exists (camera_file) && style_->loadCameraParameters (camera_file))
+ {
+ camera_file_loaded_ = true;
+ }
+ else
+ {
+ style_->setCameraFile (camera_file);
+ }
+ }
+ }
+ // Set the window size as 1/2 of the screen size or the user given parameter
+ if (!camera_set_ && !camera_file_loaded_)
+ {
+ win_->SetSize (scr_size[0]/2, scr_size[1]/2);
+ win_->SetPosition (0, 0);
+ }
+
if (create_interactor)
createInteractor ();
style_->saveScreenshot (file);
}
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizer::saveCameraParameters (const std::string &file)
+{
+ style_->saveCameraParameters (file);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizer::getCameraParameters (pcl::visualization::Camera &camera)
+{
+ style_->getCameraParameters (camera);
+}
+
/////////////////////////////////////////////////////////////////////////////////////////////
boost::signals2::connection
pcl::visualization::PCLVisualizer::registerKeyboardCallback (boost::function<void (const pcl::visualization::KeyboardEvent&)> callback)
void
pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, int viewport)
{
+ addCoordinateSystem (scale, "reference", viewport);
+}
+
+void
+pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, float x, float y, float z, int viewport)
+{
+ addCoordinateSystem (scale, x, y, z, "reference", viewport);
+}
+
+void
+pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, const Eigen::Affine3f& t, int viewport)
+{
+ addCoordinateSystem (scale, t, "reference", viewport);
+}
+
+bool
+pcl::visualization::PCLVisualizer::removeCoordinateSystem (int viewport)
+{
+ return (removeCoordinateSystem ("reference", viewport));
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, const std::string &id, int viewport)
+{
+ if (scale <= 0.0)
+ scale = 1.0;
vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New ();
axes->SetOrigin (0, 0, 0);
axes->SetScaleFactor (scale);
+ axes->Update ();
vtkSmartPointer<vtkFloatArray> axes_colors = vtkSmartPointer<vtkFloatArray>::New ();
axes_colors->Allocate (6);
axes_colors->InsertNextValue (1.0);
vtkSmartPointer<vtkPolyData> axes_data = axes->GetOutput ();
- axes_data->Update ();
axes_data->GetPointData ()->SetScalars (axes_colors);
vtkSmartPointer<vtkTubeFilter> axes_tubes = vtkSmartPointer<vtkTubeFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
axes_tubes->SetInput (axes_data);
+#else
+ axes_tubes->SetInputData (axes_data);
+#endif
axes_tubes->SetRadius (axes->GetScaleFactor () / 50.0);
axes_tubes->SetNumberOfSides (6);
vtkSmartPointer<vtkPolyDataMapper> axes_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
axes_mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
axes_mapper->SetInput (axes_tubes->GetOutput ());
+#else
+ axes_mapper->SetInputConnection (axes_tubes->GetOutputPort ());
+#endif
vtkSmartPointer<vtkLODActor> axes_actor = vtkSmartPointer<vtkLODActor>::New ();
axes_actor->SetMapper (axes_mapper);
// Save the ID and actor pair to the global actor map
- coordinate_actor_map_[viewport] = axes_actor;
+ (*coordinate_actor_map_) [id] = axes_actor;
addActorToRenderer (axes_actor, viewport);
}
/////////////////////////////////////////////////////////////////////////////////////////////
void
-pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, float x, float y, float z, int viewport)
+pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, float x, float y, float z, const std::string& id, int viewport)
{
+ if (scale <= 0.0)
+ scale = 1.0;
vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New ();
axes->SetOrigin (0, 0, 0);
axes->SetScaleFactor (scale);
+ axes->Update ();
vtkSmartPointer<vtkFloatArray> axes_colors = vtkSmartPointer<vtkFloatArray>::New ();
axes_colors->Allocate (6);
axes_colors->InsertNextValue (1.0);
vtkSmartPointer<vtkPolyData> axes_data = axes->GetOutput ();
- axes_data->Update ();
axes_data->GetPointData ()->SetScalars (axes_colors);
vtkSmartPointer<vtkTubeFilter> axes_tubes = vtkSmartPointer<vtkTubeFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
axes_tubes->SetInput (axes_data);
+#else
+ axes_tubes->SetInputData (axes_data);
+#endif
axes_tubes->SetRadius (axes->GetScaleFactor () / 50.0);
axes_tubes->SetNumberOfSides (6);
vtkSmartPointer<vtkPolyDataMapper> axes_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
axes_mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
axes_mapper->SetInput (axes_tubes->GetOutput ());
+#else
+ axes_mapper->SetInputConnection (axes_tubes->GetOutputPort ());
+#endif
vtkSmartPointer<vtkLODActor> axes_actor = vtkSmartPointer<vtkLODActor>::New ();
axes_actor->SetMapper (axes_mapper);
axes_actor->SetPosition (x, y, z);
// Save the ID and actor pair to the global actor map
- coordinate_actor_map_[viewport] = axes_actor;
+ (*coordinate_actor_map_) [id] = axes_actor;
addActorToRenderer (axes_actor, viewport);
}
/////////////////////////////////////////////////////////////////////////////////////////////
void
-pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, const Eigen::Affine3f& t, int viewport)
+pcl::visualization::PCLVisualizer::addCoordinateSystem (double scale, const Eigen::Affine3f& t, const std::string& id, int viewport)
{
+ if (scale <= 0.0)
+ scale = 1.0;
vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New ();
axes->SetOrigin (0, 0, 0);
axes->SetScaleFactor (scale);
+ axes->Update ();
vtkSmartPointer<vtkFloatArray> axes_colors = vtkSmartPointer<vtkFloatArray>::New ();
axes_colors->Allocate (6);
axes_colors->InsertNextValue (1.0);
vtkSmartPointer<vtkPolyData> axes_data = axes->GetOutput ();
- axes_data->Update ();
axes_data->GetPointData ()->SetScalars (axes_colors);
vtkSmartPointer<vtkTubeFilter> axes_tubes = vtkSmartPointer<vtkTubeFilter>::New ();
+#if VTK_MAJOR_VERSION < 6
axes_tubes->SetInput (axes_data);
+#else
+ axes_tubes->SetInputData (axes_data);
+#endif
axes_tubes->SetRadius (axes->GetScaleFactor () / 50.0);
axes_tubes->SetNumberOfSides (6);
vtkSmartPointer<vtkPolyDataMapper> axes_mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
axes_mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
axes_mapper->SetInput (axes_tubes->GetOutput ());
+#else
+ axes_mapper->SetInputConnection (axes_tubes->GetOutputPort ());
+#endif
vtkSmartPointer<vtkLODActor> axes_actor = vtkSmartPointer<vtkLODActor>::New ();
axes_actor->SetMapper (axes_mapper);
//WAS: axes_actor->SetOrientation (roll, pitch, yaw);
// Save the ID and actor pair to the global actor map
- coordinate_actor_map_[viewport] = axes_actor;
+ (*coordinate_actor_map_) [id] = axes_actor;
addActorToRenderer (axes_actor, viewport);
}
/////////////////////////////////////////////////////////////////////////////////////////////
bool
-pcl::visualization::PCLVisualizer::removeCoordinateSystem (int viewport)
+pcl::visualization::PCLVisualizer::removeCoordinateSystem (const std::string& id, int viewport)
{
// Check to see if the given ID entry exists
- CoordinateActorMap::iterator am_it = coordinate_actor_map_.find (viewport);
+ CoordinateActorMap::iterator am_it = coordinate_actor_map_->find (id);
- if (am_it == coordinate_actor_map_.end ())
+ if (am_it == coordinate_actor_map_->end ())
return (false);
// Remove it from all renderers
if (removeActorFromRenderer (am_it->second, viewport))
{
// Remove the ID pair to the global actor map
- coordinate_actor_map_.erase (am_it);
+ coordinate_actor_map_->erase (am_it);
return (true);
}
return (false);
line_1->SetPoint1 (cloud->points[i].x, cloud->points[i].y, cloud->points[i].z);
line_1->SetPoint2 (p.x, p.y, p.z);
line_1->Update ();
+#if VTK_MAJOR_VERSION < 6
polydata_1->AddInput (line_1->GetOutput ());
+#else
+ polydata_1->AddInputData (line_1->GetOutput ());
+#endif
line_1_colors->InsertNextTupleValue (green);
}
polydata_1->Update ();
line_2->SetPoint1 (cloud->points[i].x, cloud->points[i].y, cloud->points[i].z);
line_2->SetPoint2 (p.x, p.y, p.z);
line_2->Update ();
+#if VTK_MAJOR_VERSION < 6
polydata_2->AddInput (line_2->GetOutput ());
+#else
+ polydata_2->AddInputData (line_2->GetOutput ());
+#endif
+
line_2_colors->InsertNextTupleValue (blue);
}
polydata_2->Update ();
// Assemble the two sets of lines
vtkSmartPointer<vtkAppendPolyData> alldata = vtkSmartPointer<vtkAppendPolyData>::New ();
+#if VTK_MAJOR_VERSION < 6
alldata->AddInput (line_1_data);
alldata->AddInput (line_2_data);
+#else
+ alldata->AddInputData (line_1_data);
+ alldata->AddInputData (line_2_data);
+#endif
// Create an Actor
vtkSmartPointer<vtkLODActor> actor;
if (viewport == 0)
{
renderer->RemoveActor (actor);
-// renderer->Render ();
}
else if (viewport == i) // add the actor only to the specified viewport
{
if (current_actor != actor_to_remove)
continue;
renderer->RemoveActor (actor);
-// renderer->Render ();
// Found the correct viewport and removed the actor
return (true);
}
// Add it to all renderers
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Should we remove the actor from all renderers?
if (viewport == 0)
{
renderer->RemoveActor (actor);
-// renderer->Render ();
}
else if (viewport == i) // add the actor only to the specified viewport
{
if (current_actor != actor_to_remove)
continue;
renderer->RemoveActor (actor);
-// renderer->Render ();
// Found the correct viewport and removed the actor
return (true);
}
if (viewport == 0)
{
renderer->AddActor (actor);
-// renderer->Render ();
}
else if (viewport == i) // add the actor only to the specified viewport
{
renderer->AddActor (actor);
-// renderer->Render ();
}
++i;
}
if (viewport == 0)
{
renderer->RemoveActor (actor);
-// renderer->Render ();
}
else if (viewport == i) // add the actor only to the specified viewport
{
if (current_actor != actor_to_remove)
continue;
renderer->RemoveActor (actor);
-// renderer->Render ();
// Found the correct viewport and removed the actor
return (true);
}
else
{
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (data);
+#else
+ mapper->SetInputData (data);
+#endif
if (use_scalars)
{
else
{
vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (data);
+#else
+ mapper->SetInputData (data);
+#endif
if (use_scalars)
{
{
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Should we add the actor to all renderers?
if (viewport == 0)
{
renderer->SetBackground (r, g, b);
-// renderer->Render ();
}
else if (viewport == i) // add the actor only to the specified viewport
{
renderer->SetBackground (r, g, b);
-// renderer->Render ();
}
++i;
}
{
PCL_INFO ("[pcl::visualization::PCLVisualizer::setShapeRenderingProperties] Normals do not exist in the dataset, but Gouraud shading was requested. Estimating normals...\n");
vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New ();
+#if VTK_MAJOR_VERSION < 6
normals->SetInput (actor->GetMapper ()->GetInput ());
- normals->Update ();
vtkDataSetMapper::SafeDownCast (actor->GetMapper ())->SetInput (normals->GetOutput ());
+#else
+ normals->SetInputConnection (actor->GetMapper ()->GetInputAlgorithm ()->GetOutputPort ());
+ vtkDataSetMapper::SafeDownCast (actor->GetMapper ())->SetInputConnection (normals->GetOutputPort ());
+#endif
}
actor->GetProperty ()->SetInterpolationToGouraud ();
break;
{
PCL_INFO ("[pcl::visualization::PCLVisualizer::setShapeRenderingProperties] Normals do not exist in the dataset, but Phong shading was requested. Estimating normals...\n");
vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New ();
+#if VTK_MAJOR_VERSION < 6
normals->SetInput (actor->GetMapper ()->GetInput ());
- normals->Update ();
vtkDataSetMapper::SafeDownCast (actor->GetMapper ())->SetInput (normals->GetOutput ());
+#else
+ normals->SetInputConnection (actor->GetMapper ()->GetInputAlgorithm ()->GetOutputPort ());
+ vtkDataSetMapper::SafeDownCast (actor->GetMapper ())->SetInputConnection (normals->GetOutputPort ());
+#endif
}
actor->GetProperty ()->SetInterpolationToPhong ();
break;
return (camera_set_);
}
+/////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizer::cameraFileLoaded () const
+{
+ return (camera_file_loaded_);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+std::string
+pcl::visualization::PCLVisualizer::getCameraFile () const
+{
+ return (style_->getCameraFile ());
+}
+
/////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLVisualizer::updateCamera ()
PCL_WARN ("[pcl::visualization::PCLVisualizer::updateCamera()] This method was deprecated, just re-rendering all scenes now.");
rens_->InitTraversal ();
// Update the camera parameters
- vtkRenderer* renderer = NULL;
- while ((renderer = rens_->GetNextItem ()) != NULL)
- renderer->Render ();
+ win_->Render ();
}
/////////////////////////////////////////////////////////////////////////////////////////////
return (true);
}
+/////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizer::updateCoordinateSystemPose (const std::string &id, const Eigen::Affine3f& pose)
+{
+ ShapeActorMap::iterator am_it = coordinate_actor_map_->find (id);
+
+ vtkLODActor* actor;
+
+ if (am_it == coordinate_actor_map_->end ())
+ return (false);
+ else
+ actor = vtkLODActor::SafeDownCast (am_it->second);
+
+ vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New ();
+
+ convertToVtkMatrix (pose.matrix (), matrix);
+
+ actor->SetUserMatrix (matrix);
+ actor->Modified ();
+
+ return (true);
+}
+
/////////////////////////////////////////////////////////////////////////////////////////////
bool
pcl::visualization::PCLVisualizer::updatePointCloudPose (const std::string &id, const Eigen::Affine3f& pose)
{
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Modify all renderer's cameras
cam->SetPosition (pos_x, pos_y, pos_z);
cam->SetFocalPoint (view_x, view_y, view_z);
cam->SetViewUp (up_x, up_y, up_z);
- renderer->Render ();
+ renderer->ResetCameraClippingRange ();
}
++i;
}
+ win_->Render ();
}
/////////////////////////////////////////////////////////////////////////////////////////////
{
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Modify all renderer's cameras
vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
cam->SetPosition (pos_x, pos_y, pos_z);
cam->SetViewUp (up_x, up_y, up_z);
- renderer->Render ();
}
++i;
}
+ win_->Render ();
}
/////////////////////////////////////////////////////////////////////////////////////////////
const Eigen::Matrix4f &extrinsics,
int viewport)
{
- // Position = extrinsic translation
- Eigen::Vector3f pos_vec = extrinsics.block<3, 1> (0, 3);
-
- // Rotate the view vector
- Eigen::Matrix3f rotation = extrinsics.block<3, 3> (0, 0);
- Eigen::Vector3f y_axis (0.f, 1.f, 0.f);
- Eigen::Vector3f up_vec (rotation * y_axis);
-
- // Compute the new focal point
- Eigen::Vector3f z_axis (0.f, 0.f, 1.f);
- Eigen::Vector3f focal_vec = pos_vec + rotation * z_axis;
-
- // Get the width and height of the image - assume the calibrated centers are at the center of the image
- Eigen::Vector2i window_size;
- window_size[0] = static_cast<int> (intrinsics (0, 2));
- window_size[1] = static_cast<int> (intrinsics (1, 2));
-
- // Compute the vertical field of view based on the focal length and image heigh
- double fovy = 2 * atan (window_size[1] / (2. * intrinsics (1, 1))) * 180.0 / M_PI;
-
-
- rens_->InitTraversal ();
- vtkRenderer* renderer = NULL;
- int i = 1;
- while ((renderer = rens_->GetNextItem ()) != NULL)
- {
- // Modify all renderer's cameras
- if (viewport == 0 || viewport == i)
- {
- vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
- cam->SetPosition (pos_vec[0], pos_vec[1], pos_vec[2]);
- cam->SetFocalPoint (focal_vec[0], focal_vec[1], focal_vec[2]);
- cam->SetViewUp (up_vec[0], up_vec[1], up_vec[2]);
- cam->SetUseHorizontalViewAngle (0);
- cam->SetViewAngle (fovy);
- cam->SetClippingRange (0.01, 1000.01);
- win_->SetSize (window_size[0], window_size[1]);
-
- renderer->Render ();
- }
- }
+ style_->setCameraParameters (intrinsics, extrinsics, viewport);
}
/////////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLVisualizer::setCameraParameters (const pcl::visualization::Camera &camera, int viewport)
{
- rens_->InitTraversal ();
- vtkRenderer* renderer = NULL;
- int i = 1;
- while ((renderer = rens_->GetNextItem ()) != NULL)
- {
- // Modify all renderer's cameras
- if (viewport == 0 || viewport == i)
- {
- vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
- cam->SetPosition (camera.pos[0], camera.pos[1], camera.pos[2]);
- cam->SetFocalPoint (camera.focal[0], camera.focal[1], camera.focal[2]);
- cam->SetViewUp (camera.view[0], camera.view[1], camera.view[2]);
- cam->SetClippingRange (camera.clip);
- cam->SetUseHorizontalViewAngle (0);
- cam->SetViewAngle (camera.fovy * 180.0 / M_PI);
-
- win_->SetSize (static_cast<int> (camera.window_size[0]),
- static_cast<int> (camera.window_size[1]));
- }
- }
+ style_->setCameraParameters (camera, viewport);
}
/////////////////////////////////////////////////////////////////////////////////////////////
{
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Modify all renderer's cameras
vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
cam->SetClippingRange (near, far);
}
+ ++i;
}
}
{
rens_->InitTraversal ();
vtkRenderer* renderer = NULL;
- int i = 1;
+ int i = 0;
while ((renderer = rens_->GetNextItem ()) != NULL)
{
// Modify all renderer's cameras
cam->SetUseHorizontalViewAngle (0);
cam->SetViewAngle (fovy * 180.0 / M_PI);
}
+ ++i;
}
}
renderer->SetActiveCamera (cam);
renderer->ResetCameraClippingRange ();
- renderer->Render ();
}
+ win_->Render ();
}
//////////////////////////////////////////////////////////////////////////////////////////////
bool
pcl::visualization::PCLVisualizer::getCameraParameters (int argc, char **argv)
{
- Camera camera_temp;
for (int i = 1; i < argc; i++)
{
if ((strcmp (argv[i], "-cam") == 0) && (++i < argc))
{
- std::ifstream fs;
std::string camfile = std::string (argv[i]);
- std::string line;
- std::vector<std::string> camera;
if (camfile.find (".cam") == std::string::npos)
{
// Assume we have clip/focal/pos/view
+ std::vector<std::string> camera;
boost::split (camera, argv[i], boost::is_any_of ("/"), boost::token_compress_on);
+ return (style_->getCameraParameters (camera));
}
else
{
// Assume that if we don't have clip/focal/pos/view, a filename.cam was given as a parameter
- fs.open (camfile.c_str ());
- while (!fs.eof ())
- {
- getline (fs, line);
- if (line == "")
- continue;
-
- boost::split (camera, line, boost::is_any_of ("/"), boost::token_compress_on);
- break;
- }
- fs.close ();
- }
-
- // look for '/' as a separator
- if (camera.size () != 7)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Camera parameters given, but with an invalid number of options (%lu vs 7)!\n", static_cast<unsigned long> (camera.size ()));
- return (false);
- }
-
- std::string clip_str = camera.at (0);
- std::string focal_str = camera.at (1);
- std::string pos_str = camera.at (2);
- std::string view_str = camera.at (3);
- std::string fovy_str = camera.at (4);
- std::string win_size_str = camera.at (5);
- std::string win_pos_str = camera.at (6);
-
- // Get each camera setting separately and parse for ','
- std::vector<std::string> clip_st;
- boost::split (clip_st, clip_str, boost::is_any_of (","), boost::token_compress_on);
- if (clip_st.size () != 2)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera clipping angle!\n");
- return (false);
- }
- camera_temp.clip[0] = atof (clip_st.at (0).c_str ());
- camera_temp.clip[1] = atof (clip_st.at (1).c_str ());
-
- std::vector<std::string> focal_st;
- boost::split (focal_st, focal_str, boost::is_any_of (","), boost::token_compress_on);
- if (focal_st.size () != 3)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera focal point!\n");
- return (false);
- }
- camera_temp.focal[0] = atof (focal_st.at (0).c_str ());
- camera_temp.focal[1] = atof (focal_st.at (1).c_str ());
- camera_temp.focal[2] = atof (focal_st.at (2).c_str ());
-
- std::vector<std::string> pos_st;
- boost::split (pos_st, pos_str, boost::is_any_of (","), boost::token_compress_on);
- if (pos_st.size () != 3)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera position!\n");
- return (false);
- }
- camera_temp.pos[0] = atof (pos_st.at (0).c_str ());
- camera_temp.pos[1] = atof (pos_st.at (1).c_str ());
- camera_temp.pos[2] = atof (pos_st.at (2).c_str ());
-
- std::vector<std::string> view_st;
- boost::split (view_st, view_str, boost::is_any_of (","), boost::token_compress_on);
- if (view_st.size () != 3)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for camera viewup!\n");
- return (false);
- }
- camera_temp.view[0] = atof (view_st.at (0).c_str ());
- camera_temp.view[1] = atof (view_st.at (1).c_str ());
- camera_temp.view[2] = atof (view_st.at (2).c_str ());
-
- std::vector<std::string> fovy_size_st;
- boost::split (fovy_size_st, fovy_str, boost::is_any_of (","), boost::token_compress_on);
- if (fovy_size_st.size () != 1)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for field of view angle!\n");
- return (false);
- }
- camera_temp.fovy = atof (fovy_size_st.at (0).c_str ());
-
- std::vector<std::string> win_size_st;
- boost::split (win_size_st, win_size_str, boost::is_any_of (","), boost::token_compress_on);
- if (win_size_st.size () != 2)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for window size!\n");
- return (false);
+ return (style_->loadCameraParameters (camfile));
}
- camera_temp.window_size[0] = atof (win_size_st.at (0).c_str ());
- camera_temp.window_size[1] = atof (win_size_st.at (1).c_str ());
-
- std::vector<std::string> win_pos_st;
- boost::split (win_pos_st, win_pos_str, boost::is_any_of (","), boost::token_compress_on);
- if (win_pos_st.size () != 2)
- {
- pcl::console::print_error ("[PCLVisualizer::getCameraParameters] Invalid parameters given for window position!\n");
- return (false);
- }
- camera_temp.window_pos[0] = atof (win_pos_st.at (0).c_str ());
- camera_temp.window_pos[1] = atof (win_pos_st.at (1).c_str ());
-
- setCameraParameters (camera_temp);
-
- return (true);
}
}
return (false);
}
+//////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizer::loadCameraParameters (const std::string &file)
+{
+ return (style_->loadCameraParameters (file));
+}
+
////////////////////////////////////////////////////////////////////////////////////////////
bool
pcl::visualization::PCLVisualizer::addCylinder (const pcl::ModelCoefficients &coefficients,
vtkSmartPointer<vtkDataSet> data = createCube (x_min, x_max, y_min, y_max, z_min, z_max);
// Create an Actor
- vtkSmartPointer<vtkActor> actor;
+ vtkSmartPointer<vtkLODActor> actor;
createActorFromVTKDataSet (data, actor);
actor->GetProperty ()->SetRepresentationToWireframe ();
actor->GetProperty ()->SetLighting (false);
vtkSmartPointer <vtkTransformFilter> trans_filter = vtkSmartPointer<vtkTransformFilter>::New ();
trans_filter->SetTransform (transform);
+#if VTK_MAJOR_VERSION < 6
trans_filter->SetInput (polydata);
+#else
+ trans_filter->SetInputData (polydata);
+#endif
trans_filter->Update();
// Create an Actor
// Update the data
vtkPolyData *data = static_cast<vtkPolyData*>(am_it->second.actor->GetMapper ()->GetInput ());
data->GetPointData ()->SetScalars (scalars);
- data->Update ();
// Modify the mapper
if (use_vbos_)
{
vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ());
mapper->SetScalarRange (minmax);
mapper->SetScalarModeToUsePointData ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (data);
+#else
+ mapper->SetInputData (data);
+#endif
// Modify the actor
am_it->second.actor->SetMapper (mapper);
am_it->second.actor->Modified ();
poly_grid->Allocate (1, 1);
poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ());
poly_grid->SetPoints (poly_points);
- poly_grid->Update ();
createActorFromVTKDataSet (poly_grid, actor);
actor->GetProperty ()->SetRepresentationToWireframe ();
cells->Squeeze ();
// Set the the vertices
polydata->SetStrips (cells);
- polydata->Update ();
return (true);
}
// Setup actor and mapper
vtkSmartPointer < vtkPolyDataMapper > mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
mapper->SetInput (polyData);
+#else
+ mapper->SetInputData (polyData);
+#endif
vtkSmartPointer < vtkActor > actor = vtkSmartPointer<vtkActor>::New ();
actor->SetMapper (mapper);
return (true);
}
+/////////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh,
+ const std::string &id,
+ int viewport)
+{
+ CloudActorMap::iterator am_it = cloud_actor_map_->find (id);
+ if (am_it != cloud_actor_map_->end ())
+ {
+ PCL_ERROR ("[PCLVisualizer::addTextureMesh] A shape with id <%s> already exists!"
+ " Please choose a different id and retry.\n",
+ id.c_str ());
+ return (false);
+ }
+ // no texture materials --> exit
+ if (mesh.tex_materials.size () == 0)
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] No textures found!\n");
+ return (false);
+ }
+ // polygons are mapped to texture materials
+ if (mesh.tex_materials.size () != mesh.tex_polygons.size ())
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] Materials number %lu differs from polygons number %lu!\n",
+ mesh.tex_materials.size (), mesh.tex_polygons.size ());
+ return (false);
+ }
+ // each texture material should have its coordinates set
+ if (mesh.tex_materials.size () != mesh.tex_coordinates.size ())
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] Coordinates number %lu differs from materials number %lu!\n",
+ mesh.tex_coordinates.size (), mesh.tex_materials.size ());
+ return (false);
+ }
+ // total number of vertices
+ std::size_t nb_vertices = 0;
+ for (std::size_t i = 0; i < mesh.tex_polygons.size (); ++i)
+ nb_vertices+= mesh.tex_polygons[i].size ();
+ // no vertices --> exit
+ if (nb_vertices == 0)
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] No vertices found!\n");
+ return (false);
+ }
+ // total number of coordinates
+ std::size_t nb_coordinates = 0;
+ for (std::size_t i = 0; i < mesh.tex_coordinates.size (); ++i)
+ nb_coordinates+= mesh.tex_coordinates[i].size ();
+ // no texture coordinates --> exit
+ if (nb_coordinates == 0)
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] No textures coordinates found!\n");
+ return (false);
+ }
+
+ // Create points from mesh.cloud
+ vtkSmartPointer<vtkPoints> poly_points = vtkSmartPointer<vtkPoints>::New ();
+ vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New ();
+ bool has_color = false;
+ vtkSmartPointer<vtkMatrix4x4> transformation = vtkSmartPointer<vtkMatrix4x4>::New ();
+ if ((pcl::getFieldIndex(mesh.cloud, "rgba") != -1) ||
+ (pcl::getFieldIndex(mesh.cloud, "rgb") != -1))
+ {
+ pcl::PointCloud<pcl::PointXYZRGB> cloud;
+ pcl::fromPCLPointCloud2(mesh.cloud, cloud);
+ if (cloud.points.size () == 0)
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] Cloud is empty!\n");
+ return (false);
+ }
+ convertToVtkMatrix (cloud.sensor_origin_, cloud.sensor_orientation_, transformation);
+ has_color = true;
+ colors->SetNumberOfComponents (3);
+ colors->SetName ("Colors");
+ poly_points->SetNumberOfPoints (cloud.size ());
+ for (std::size_t i = 0; i < cloud.points.size (); ++i)
+ {
+ const pcl::PointXYZRGB &p = cloud.points[i];
+ poly_points->InsertPoint (i, p.x, p.y, p.z);
+ const unsigned char color[3] = {p.r, p.g, p.b};
+ colors->InsertNextTupleValue(color);
+ }
+ }
+ else
+ {
+ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
+ pcl::fromPCLPointCloud2 (mesh.cloud, *cloud);
+ // no points --> exit
+ if (cloud->points.size () == 0)
+ {
+ PCL_ERROR("[PCLVisualizer::addTextureMesh] Cloud is empty!\n");
+ return (false);
+ }
+ convertToVtkMatrix (cloud->sensor_origin_, cloud->sensor_orientation_, transformation);
+ poly_points->SetNumberOfPoints (cloud->points.size ());
+ for (std::size_t i = 0; i < cloud->points.size (); ++i)
+ {
+ const pcl::PointXYZ &p = cloud->points[i];
+ poly_points->InsertPoint (i, p.x, p.y, p.z);
+ }
+ }
+
+ //create polys from polyMesh.tex_polygons
+ vtkSmartPointer<vtkCellArray> polys = vtkSmartPointer<vtkCellArray>::New ();
+ for (std::size_t i = 0; i < mesh.tex_polygons.size (); i++)
+ {
+ for (std::size_t j = 0; j < mesh.tex_polygons[i].size (); j++)
+ {
+ std::size_t n_points = mesh.tex_polygons[i][j].vertices.size ();
+ polys->InsertNextCell (int (n_points));
+ for (std::size_t k = 0; k < n_points; k++)
+ polys->InsertCellPoint (mesh.tex_polygons[i][j].vertices[k]);
+ }
+ }
+
+ vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
+ polydata->SetPolys (polys);
+ polydata->SetPoints (poly_points);
+ if (has_color)
+ polydata->GetPointData()->SetScalars(colors);
+
+ vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
+#if VTK_MAJOR_VERSION < 6
+ mapper->SetInput (polydata);
+#else
+ mapper->SetInputData (polydata);
+#endif
+
+ vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New ();
+ vtkOpenGLHardwareSupport* hardware = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetHardwareSupport ();
+ bool supported = hardware->GetSupportsMultiTexturing ();
+ // Check if hardware support multi texture
+ std::size_t texture_units (hardware->GetNumberOfFixedTextureUnits ());
+ if ((mesh.tex_materials.size () > 1) && supported && (texture_units > 1))
+ {
+ if (texture_units < mesh.tex_materials.size ())
+ PCL_WARN ("[PCLVisualizer::addTextureMesh] GPU texture units %d < mesh textures %d!\n",
+ texture_units, mesh.tex_materials.size ());
+ // Load textures
+ std::size_t last_tex_id = std::min (mesh.tex_materials.size (), texture_units);
+ int tu = vtkProperty::VTK_TEXTURE_UNIT_0;
+ std::size_t tex_id = 0;
+ while (tex_id < last_tex_id)
+ {
+ vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New ();
+ if (textureFromTexMaterial (mesh.tex_materials[tex_id], texture))
+ {
+ PCL_WARN ("[PCLVisualizer::addTextureMesh] Failed to load texture %s, skipping!\n",
+ mesh.tex_materials[tex_id].tex_name.c_str ());
+ continue;
+ }
+ // the first texture is in REPLACE mode others are in ADD mode
+ if (tex_id == 0)
+ texture->SetBlendingMode(vtkTexture::VTK_TEXTURE_BLENDING_MODE_REPLACE);
+ else
+ texture->SetBlendingMode(vtkTexture::VTK_TEXTURE_BLENDING_MODE_ADD);
+ // add a texture coordinates array per texture
+ vtkSmartPointer<vtkFloatArray> coordinates = vtkSmartPointer<vtkFloatArray>::New ();
+ coordinates->SetNumberOfComponents (2);
+ std::stringstream ss; ss << "TCoords" << tex_id;
+ std::string this_coordinates_name = ss.str ();
+ coordinates->SetName (this_coordinates_name.c_str ());
+
+ for (std::size_t t = 0 ; t < mesh.tex_coordinates.size (); ++t)
+ if (t == tex_id)
+ for (std::size_t tc = 0; tc < mesh.tex_coordinates[t].size (); ++tc)
+ coordinates->InsertNextTuple2 (mesh.tex_coordinates[t][tc][0],
+ mesh.tex_coordinates[t][tc][1]);
+ else
+ for (std::size_t tc = 0; tc < mesh.tex_coordinates[t].size (); ++tc)
+ coordinates->InsertNextTuple2 (-1.0, -1.0);
+
+ mapper->MapDataArrayToMultiTextureAttribute(tu,
+ this_coordinates_name.c_str (),
+ vtkDataObject::FIELD_ASSOCIATION_POINTS);
+ polydata->GetPointData ()->AddArray (coordinates);
+ actor->GetProperty ()->SetTexture(tu, texture);
+ ++tex_id;
+ ++tu;
+ }
+ } // end of multi texturing
+ else
+ {
+ if (!supported || texture_units < 2)
+ PCL_WARN ("[PCLVisualizer::addTextureMesh] Your GPU doesn't support multi texturing. "
+ "Will use first one only!\n");
+
+ vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New ();
+ // fill vtkTexture from pcl::TexMaterial structure
+ if (textureFromTexMaterial (mesh.tex_materials[0], texture))
+ PCL_WARN ("[PCLVisualizer::addTextureMesh] Failed to create vtkTexture from %s!\n",
+ mesh.tex_materials[0].tex_name.c_str ());
+
+ // set texture coordinates
+ vtkSmartPointer<vtkFloatArray> coordinates = vtkSmartPointer<vtkFloatArray>::New ();
+ coordinates->SetNumberOfComponents (2);
+ coordinates->SetNumberOfTuples (mesh.tex_coordinates[0].size ());
+ for (std::size_t tc = 0; tc < mesh.tex_coordinates[0].size (); ++tc)
+ {
+ const Eigen::Vector2f &uv = mesh.tex_coordinates[0][tc];
+ coordinates->SetTuple2 (tc, uv[0], uv[1]);
+ }
+ coordinates->SetName ("TCoords");
+ polydata->GetPointData ()->SetTCoords(coordinates);
+ // apply texture
+ actor->SetTexture (texture);
+ } // end of one texture
+
+ // set mapper
+ actor->SetMapper (mapper);
+ addActorToRenderer (actor, viewport);
+
+ // Save the pointer/ID pair to the global actor map
+ (*cloud_actor_map_)[id].actor = actor;
+
+ // Save the viewpoint transformation matrix to the global actor map
+ (*cloud_actor_map_)[id].viewpoint_transformation_ = transformation;
+
+ return (true);
+}
+
///////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PCLVisualizer::setRepresentationToSurfaceForAllActors ()
vtkSmartPointer<vtkTransformFilter> trans_filter_center = vtkSmartPointer<vtkTransformFilter>::New ();
trans_filter_center->SetTransform (trans_center);
+#if VTK_MAJOR_VERSION < 6
trans_filter_center->SetInput (polydata);
+#else
+ trans_filter_center->SetInputData (polydata);
+#endif
trans_filter_center->Update ();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
vtkSmartPointer<vtkLoopSubdivisionFilter> subdivide = vtkSmartPointer<vtkLoopSubdivisionFilter>::New ();
subdivide->SetNumberOfSubdivisions (tesselation_level);
subdivide->SetInputConnection (ico->GetOutputPort ());
+ subdivide->Update ();
// Get camera positions
vtkPolyData *sphere = subdivide->GetOutput ();
- sphere->Update ();
std::vector<Eigen::Vector3f> cam_positions;
if (!use_vertices)
hardware_selector->SetArea (0, 0, xres - 1, yres - 1);
hardware_selector->SetFieldAssociation(vtkDataObject::FIELD_ASSOCIATION_CELLS);
hdw_selection = hardware_selector->Select ();
+ if (!hdw_selection || !hdw_selection->GetNode (0) || !hdw_selection->GetNode (0)->GetSelectionList ())
+ {
+ PCL_WARN ("[renderViewTesselatedSphere] Invalid selection, skipping!\n");
+ continue;
+ }
+
vtkSmartPointer<vtkIdTypeArray> ids = vtkSmartPointer<vtkIdTypeArray>::New ();
ids = vtkIdTypeArray::SafeDownCast(hdw_selection->GetNode(0)->GetSelectionList());
double visible_area = 0;
int id_mesh = static_cast<int> (ids->GetValue (sel_id));
vtkCell * cell = polydata->GetCell (id_mesh);
vtkTriangle* triangle = dynamic_cast<vtkTriangle*> (cell);
+ if (!triangle)
+ {
+ PCL_WARN ("[renderViewTesselatedSphere] Invalid triangle %d, skipping!\n", id_mesh);
+ continue;
+ }
+
double p0[3];
double p1[3];
double p2[3];
// Convert the PointCloud to VTK PolyData
convertPointCloudToVTKPolyData (geometry_handler, polydata, initcells);
// use the given geometry handler
- polydata->Update ();
// Get the colors from the handler
bool has_colors = false;
sprintf (buf, "%.1f FPS", fps);
actor->SetInput (buf);
}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+int
+pcl::visualization::PCLVisualizer::textureFromTexMaterial (const pcl::TexMaterial& tex_mat,
+ vtkTexture* vtk_tex) const
+{
+ if (tex_mat.tex_file == "")
+ {
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] No texture file given for material %s!\n",
+ tex_mat.tex_name.c_str ());
+ return (-1);
+ }
+
+ boost::filesystem::path full_path (tex_mat.tex_file.c_str ());
+ if (!boost::filesystem::exists (full_path))
+ {
+ boost::filesystem::path parent_dir = full_path.parent_path ();
+ std::string upper_filename = tex_mat.tex_file;
+ boost::to_upper (upper_filename);
+ std::string real_name = "";
+
+ try
+ {
+ if (!boost::filesystem::exists (parent_dir))
+ {
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] Parent directory '%s' doesn't exist!\n",
+ parent_dir.string ().c_str ());
+ return (-1);
+ }
+
+ if (!boost::filesystem::is_directory (parent_dir))
+ {
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] Parent '%s' is not a directory !\n",
+ parent_dir.string ().c_str ());
+ return (-1);
+ }
+
+ typedef std::vector<boost::filesystem::path> paths_vector;
+ paths_vector paths;
+ std::copy (boost::filesystem::directory_iterator (parent_dir),
+ boost::filesystem::directory_iterator (),
+ back_inserter (paths));
+
+ for (paths_vector::const_iterator it = paths.begin (); it != paths.end (); ++it)
+ {
+ if (boost::filesystem::is_regular_file (*it))
+ {
+ std::string name = it->string ();
+ boost::to_upper (name);
+ if (name == upper_filename)
+ {
+ real_name = it->string ();
+ break;
+ }
+ }
+ }
+ // Check texture file existence
+ if (real_name == "")
+ {
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] Can not find texture file %s!\n",
+ tex_mat.tex_file.c_str ());
+ return (-1);
+ }
+ }
+ catch (const boost::filesystem::filesystem_error& ex)
+ {
+
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] Error %s when looking for file %s\n!",
+ ex.what (), tex_mat.tex_file.c_str ());
+ return (-1);
+ }
+
+ //Save the real path
+ full_path = real_name.c_str ();
+ }
+
+ std::string extension = full_path.extension ().string ();
+ //!!! nizar 20131206 : The list is far from being exhaustive I am afraid.
+ if ((extension == ".jpg") || (extension == ".JPG"))
+ {
+ vtkSmartPointer<vtkJPEGReader> jpeg_reader = vtkSmartPointer<vtkJPEGReader>::New ();
+ jpeg_reader->SetFileName (full_path.string ().c_str ());
+ jpeg_reader->Update ();
+ vtk_tex->SetInputConnection (jpeg_reader->GetOutputPort ());
+ }
+ else if ((extension == ".bmp") || (extension == ".BMP"))
+ {
+ vtkSmartPointer<vtkBMPReader> bmp_reader = vtkSmartPointer<vtkBMPReader>::New ();
+ bmp_reader->SetFileName (full_path.string ().c_str ());
+ bmp_reader->Update ();
+ vtk_tex->SetInputConnection (bmp_reader->GetOutputPort ());
+ }
+ else if ((extension == ".pnm") || (extension == ".PNM"))
+ {
+ vtkSmartPointer<vtkPNMReader> pnm_reader = vtkSmartPointer<vtkPNMReader>::New ();
+ pnm_reader->SetFileName (full_path.string ().c_str ());
+ pnm_reader->Update ();
+ vtk_tex->SetInputConnection (pnm_reader->GetOutputPort ());
+ }
+ else if ((extension == ".png") || (extension == ".PNG"))
+ {
+ vtkSmartPointer<vtkPNGReader> png_reader = vtkSmartPointer<vtkPNGReader>::New ();
+ png_reader->SetFileName (full_path.string ().c_str ());
+ png_reader->Update ();
+ vtk_tex->SetInputConnection (png_reader->GetOutputPort ());
+ }
+ else if ((extension == ".tiff") || (extension == ".TIFF"))
+ {
+ vtkSmartPointer<vtkTIFFReader> tiff_reader = vtkSmartPointer<vtkTIFFReader>::New ();
+ tiff_reader->SetFileName (full_path.string ().c_str ());
+ tiff_reader->Update ();
+ vtk_tex->SetInputConnection (tiff_reader->GetOutputPort ());
+ }
+ else
+ {
+ PCL_WARN ("[PCLVisualizer::textureFromTexMaterial] Unhandled image %s for material %s!\n",
+ full_path.c_str (), tex_mat.tex_name.c_str ());
+ return (-1);
+ }
+
+ return (0);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+std::string
+pcl::visualization::PCLVisualizer::getUniqueCameraFile (int argc, char **argv)
+{
+ std::vector<int> p_file_indices;
+ boost::uuids::detail::sha1 sha1;
+ unsigned int digest[5];
+ const char *str;
+ std::ostringstream sstream;
+ bool valid = false;
+
+ p_file_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
+ if (p_file_indices.size () != 0)
+ {
+ // Calculate sha1 using canonical paths
+ for (size_t i = 0; i < p_file_indices.size (); ++i)
+ {
+ boost::filesystem::path path (argv[p_file_indices[i]]);
+ if (boost::filesystem::exists (path))
+ {
+ path = boost::filesystem::canonical (path);
+ str = path.string ().c_str ();
+ sha1.process_bytes (str, std::strlen (str));
+ valid = true;
+ }
+ }
+
+ // Build camera filename
+ if (valid)
+ {
+ sha1.get_digest (digest);
+ sstream << ".";
+ sstream << std::hex << digest[0] << digest[1] << digest[2] << digest[3] << digest[4];
+ sstream << ".cam";
+ }
+ }
+
+ return (sstream.str ());
+}
return (true);
}
+///////////////////////////////////////////////////////////////////////////////////////////
+pcl::visualization::PointCloudColorHandlerRGBAField<pcl::PCLPointCloud2>::PointCloudColorHandlerRGBAField (
+ const pcl::visualization::PointCloudColorHandler<pcl::PCLPointCloud2>::PointCloudConstPtr &cloud) :
+ pcl::visualization::PointCloudColorHandler<pcl::PCLPointCloud2>::PointCloudColorHandler (cloud)
+{
+ // Handle the 24-bit packed RGBA values
+ field_idx_ = pcl::getFieldIndex (*cloud, "rgba");
+ if (field_idx_ != -1)
+ capable_ = true;
+ else
+ capable_ = false;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::PointCloudColorHandlerRGBAField<pcl::PCLPointCloud2>::getColor (vtkSmartPointer<vtkDataArray> &scalars) const
+{
+ if (!capable_ || !cloud_)
+ return (false);
+
+ if (!scalars)
+ scalars = vtkSmartPointer<vtkUnsignedCharArray>::New ();
+ scalars->SetNumberOfComponents (4);
+
+ vtkIdType nr_points = cloud_->width * cloud_->height;
+ reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetNumberOfTuples (nr_points);
+ // Allocate enough memory to hold all colors
+ unsigned char* colors = new unsigned char[nr_points * 4];
+
+ pcl::RGB rgba_data;
+ int point_offset = cloud_->fields[field_idx_].offset;
+ int j = 0;
+
+ // If XYZ present, check if the points are invalid
+ int x_idx = pcl::getFieldIndex (*cloud_, "x");
+ if (x_idx != -1)
+ {
+ float x_data, y_data, z_data;
+ int x_point_offset = cloud_->fields[x_idx].offset;
+
+ // Color every point
+ for (vtkIdType cp = 0; cp < nr_points; ++cp,
+ point_offset += cloud_->point_step,
+ x_point_offset += cloud_->point_step)
+ {
+ // Copy the value at the specified field
+ memcpy (&rgba_data, &cloud_->data[point_offset], sizeof (float));
+
+ memcpy (&x_data, &cloud_->data[x_point_offset], sizeof (float));
+ memcpy (&y_data, &cloud_->data[x_point_offset + sizeof (float)], sizeof (float));
+ memcpy (&z_data, &cloud_->data[x_point_offset + 2 * sizeof (float)], sizeof (float));
+
+ if (!pcl_isfinite (x_data) || !pcl_isfinite (y_data) || !pcl_isfinite (z_data))
+ continue;
+
+ colors[j + 0] = rgba_data.r;
+ colors[j + 1] = rgba_data.g;
+ colors[j + 2] = rgba_data.b;
+ colors[j + 3] = rgba_data.a;
+ j += 4;
+ }
+ }
+ // No XYZ data checks
+ else
+ {
+ // Color every point
+ for (vtkIdType cp = 0; cp < nr_points; ++cp, point_offset += cloud_->point_step)
+ {
+ // Copy the value at the specified field
+ memcpy (&rgba_data, &cloud_->data[point_offset], sizeof (float));
+
+ colors[j + 0] = rgba_data.r;
+ colors[j + 1] = rgba_data.g;
+ colors[j + 2] = rgba_data.b;
+ colors[j + 3] = rgba_data.a;
+ j += 4;
+ }
+ }
+ if (j != 0)
+ reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetArray (colors, j, 0);
+ else
+ reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetNumberOfTuples (0);
+ //delete [] colors;
+ return (true);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////
void
pcl::visualization::PointCloudGeometryHandler<pcl::PCLPointCloud2>::getGeometry (vtkSmartPointer<vtkPoints> &points) const
// Instantiations of specific point types
#ifdef PCL_ONLY_CORE_POINT_TYPES
- PCL_INSTANTIATE(PointCloudGeometryHandlerXYZ, (pcl::PointSurfel)(pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA)(pcl::PointNormal)(pcl::PointXYZRGBNormal))
+ PCL_INSTANTIATE(PointCloudGeometryHandlerXYZ, (pcl::PointSurfel)(pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGB)(pcl::PointXYZRGBA)(pcl::PointNormal)(pcl::PointXYZRGBNormal)(pcl::PointXYZRGBL))
PCL_INSTANTIATE(PointCloudGeometryHandlerSurfaceNormal, (pcl::Normal)(pcl::PointNormal)(pcl::PointXYZRGBNormal))
#else
PCL_INSTANTIATE(PointCloudGeometryHandlerXYZ, PCL_XYZ_POINT_TYPES)
#include <pcl/visualization/point_picking_event.h>
#include <pcl/visualization/interactor_style.h>
+#include <vtkVersion.h>
#include <vtkPointPicker.h>
#include <vtkAreaPicker.h>
#include <vtkRenderWindowInteractor.h>
vtkSmartPointer<vtkExtractGeometry> extract_geometry = vtkSmartPointer<vtkExtractGeometry>::New ();
extract_geometry->SetImplicitFunction (frustum);
-#if VTK_MAJOR_VERSION <= 5
+#if VTK_MAJOR_VERSION < 6
extract_geometry->SetInput (picker->GetDataSet ());
#else
extract_geometry->SetInputData (picker->GetDataSet ());
vtkStandardNewMacro (Points);
vtkStandardNewMacro (Polygon);
vtkStandardNewMacro (Text);
+ vtkStandardNewMacro (Markers);
}
}
}
return (true);
}
+///////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::context_items::Markers::setPointColors (unsigned char r, unsigned char g, unsigned char b)
+{
+ point_colors[0] = r; point_colors[1] = g; point_colors[2] = b;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void
+pcl::visualization::context_items::Markers::setPointColors (unsigned char rgb[3])
+{
+ memcpy (point_colors, rgb, 3 * sizeof (unsigned char));
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+bool
+pcl::visualization::context_items::Markers::Paint (vtkContext2D *painter)
+{
+ int nb_points (params.size () / 2);
+ if (size <= 0)
+ size = 2.3 * painter->GetPen ()->GetWidth ();
+
+ painter->GetPen ()->SetWidth (size);
+ painter->GetPen ()->SetColor (colors);
+ painter->DrawPointSprites (0, ¶ms[0], nb_points);
+ painter->GetPen ()->SetWidth (1);
+ painter->GetPen ()->SetColor (point_colors);
+ painter->DrawPointSprites (0, ¶ms[0], nb_points);
+ return (true);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////
pcl::visualization::PCLContextImageItem::PCLContextImageItem ()
{
{
GLuint ioBuf;
vtkgl::GenBuffers(1, &ioBuf);
- vtkGraphicErrorMacro(this->Context, "after GenBuffers");
this->Handle = ioBuf;
}
}
#include "pcl/visualization/vtk/vtkVertexBufferObject.h"
#include "pcl/visualization/vtk/vtkVertexBufferObjectMapper.h"
+#include "vtkVersion.h"
#include "vtkCellData.h"
#include "vtkExecutive.h"
#include "vtkInformation.h"
// std::cout << "SetInput" << endl;
if(input)
{
+#if VTK_MAJOR_VERSION < 6
this->SetInputConnection(0, input->GetProducerPort());
+#else
+ this->SetInputDataObject (0, input);
+#endif
}
else
{
// std::cout << "SetInput" << endl;
if(input)
{
+#if VTK_MAJOR_VERSION < 6
this->SetInputConnection(0, input->GetProducerPort());
+#else
+ this->SetInputDataObject (0, input);
+#endif
}
else
{
// Start the visualizer
pcl::visualization::PCLVisualizer p ("test_shapes");
p.setBackgroundColor (1, 1, 1);
- p.addCoordinateSystem (1.0);
+ p.addCoordinateSystem (1.0, "first");
//p.addPolygon (cloud, "polygon");
p.addPolygon<PointXYZ> (cloud, 1.0, 0.0, 0.0, "polygon", 0);
p.addText3D ("text3D", cloud->points[0], 1.0, 1.0, 0.0, 0.0);
p.spin ();
- p.removeCoordinateSystem (0);
+ p.removeCoordinateSystem ("first", 0);
p.spin ();
- p.addCoordinateSystem (1.0, 5, 3, 1);
+ p.addCoordinateSystem (1.0, 5, 3, 1, "second");
p.spin ();
- p.removeCoordinateSystem (0);
+ p.removeCoordinateSystem ("second", 0);
p.spin ();
}
target_link_libraries(pcl_openni_image pcl_common pcl_io pcl_kdtree pcl_visualization)
endif()
+if(OPENNI2_FOUND AND BUILD_OPENNI2)
+ PCL_ADD_EXECUTABLE_OPT_BUNDLE(pcl_openni2_viewer ${SUBSYS_NAME} openni2_viewer.cpp)
+ target_link_libraries(pcl_openni2_viewer pcl_common pcl_io pcl_kdtree pcl_visualization)
+endif()
}
void
- cloud_callback (const CloudConstPtr& cloud, float startAngle,
- float endAngle)
+ cloud_callback (const CloudConstPtr& cloud,
+ float /*startAngle*/,
+ float /*endAngle*/)
{
FPS_CALC ("cloud callback");
boost::mutex::scoped_lock lock (cloud_mutex_);
void
keyboard_callback (const KeyboardEvent& event,
- void* cookie)
+ void* /*cookie*/)
{
if (event.keyUp ())
{
void
mouse_callback (const MouseEvent& mouse_event,
- void* cookie)
+ void* /*cookie*/)
{
if (mouse_event.getType () == MouseEvent::MouseButtonPress &&
mouse_event.getButton () == MouseEvent::LeftButton)
void
run ()
{
- cloud_viewer_->addCoordinateSystem (3.0);
+ cloud_viewer_->addCoordinateSystem (3.0, "global");
cloud_viewer_->setBackgroundColor (0, 0, 0);
cloud_viewer_->initCameraParameters ();
cloud_viewer_->setCameraPosition (0.0, 0.0, 30.0, 0.0, 1.0, 0.0, 0);
float ax_x = 0.0, ax_y = 0.0, ax_z = 0.0;
pcl::console::parse_3x_arguments (argc, argv, "-ax_pos", ax_x, ax_y, ax_z, false);
// Draw XYZ axes if command-line enabled
- cloud_viewer->addCoordinateSystem (axes, ax_x, ax_y, ax_z);
+ cloud_viewer->addCoordinateSystem (axes, ax_x, ax_y, ax_z, "global");
}
float frames_per_second = 0; // 0 means only if triggered!
--- /dev/null
+/*
+* Software License Agreement (BSD License)
+*
+* Copyright (c) 2010, Willow Garage, Inc.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Willow Garage, Inc. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+* $Id$
+*
+*/
+
+#define MEASURE_FUNCTION_TIME
+#include <pcl/common/time.h> //fps calculations
+#include <pcl/common/angles.h>
+#include <pcl/io/openni2_grabber.h>
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/visualization/boost.h>
+#include <pcl/visualization/image_viewer.h>
+#include <pcl/console/print.h>
+#include <pcl/console/parse.h>
+#include <pcl/console/time.h>
+
+#include <boost/chrono.hpp>
+
+#include "pcl/io/openni2/openni.h"
+
+typedef boost::chrono::high_resolution_clock HRClock;
+
+#define SHOW_FPS 1
+#if SHOW_FPS
+#define FPS_CALC(_WHAT_) \
+ do \
+{ \
+ static unsigned count = 0;\
+ static double last = pcl::getTime ();\
+ double now = pcl::getTime (); \
+ ++count; \
+ if (now - last >= 1.0) \
+{ \
+ std::cout << "Average framerate ("<< _WHAT_ << "): " << double (count)/double (now - last) << " Hz" << std::endl; \
+ count = 0; \
+ last = now; \
+} \
+}while (false)
+#else
+#define FPS_CALC (_WHAT_) \
+ do \
+{ \
+}while (false)
+#endif
+
+void
+printHelp (int, char **argv)
+{
+ using pcl::console::print_error;
+ using pcl::console::print_info;
+
+ print_error ("Syntax is: %s [((<device_id> | <path-to-oni-file>) [-depthmode <mode>] [-imagemode <mode>] [-xyz] | -l [<device_id>]| -h | --help)]\n", argv [0]);
+ print_info ("%s -h | --help : shows this help\n", argv [0]);
+ print_info ("%s -xyz : use only XYZ values and ignore RGB components (this flag is required for use with ASUS Xtion Pro) \n", argv [0]);
+ print_info ("%s -l : list all available devices\n", argv [0]);
+ print_info ("%s -l <device-id> :list all available modes for specified device\n", argv [0]);
+ print_info ("\t\t<device_id> may be \"#1\", \"#2\", ... for the first, second etc device in the list\n");
+#ifndef _WIN32
+ print_info ("\t\t bus@address for the device connected to a specific usb-bus / address combination\n");
+ print_info ("\t\t <serial-number>\n");
+#endif
+ print_info ("\n\nexamples:\n");
+ print_info ("%s \"#1\"\n", argv [0]);
+ print_info ("\t\t uses the first device.\n");
+ print_info ("%s \"./temp/test.oni\"\n", argv [0]);
+ print_info ("\t\t uses the oni-player device to play back oni file given by path.\n");
+ print_info ("%s -l\n", argv [0]);
+ print_info ("\t\t list all available devices.\n");
+ print_info ("%s -l \"#2\"\n", argv [0]);
+ print_info ("\t\t list all available modes for the second device.\n");
+#ifndef _WIN32
+ print_info ("%s A00361800903049A\n", argv [0]);
+ print_info ("\t\t uses the device with the serial number \'A00361800903049A\'.\n");
+ print_info ("%s 1@16\n", argv [0]);
+ print_info ("\t\t uses the device on address 16 at USB bus 1.\n");
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointType>
+class OpenNI2Viewer
+{
+public:
+ typedef pcl::PointCloud<PointType> Cloud;
+ typedef typename Cloud::ConstPtr CloudConstPtr;
+
+ OpenNI2Viewer (pcl::io::OpenNI2Grabber& grabber)
+ : cloud_viewer_ (new pcl::visualization::PCLVisualizer ("PCL OpenNI2 cloud"))
+ , image_viewer_ ()
+ , grabber_ (grabber)
+ , rgb_data_ (0), rgb_data_size_ (0)
+ {
+ }
+
+ void
+ cloud_callback (const CloudConstPtr& cloud)
+ {
+ FPS_CALC ("cloud callback");
+ boost::mutex::scoped_lock lock (cloud_mutex_);
+ cloud_ = cloud;
+ }
+
+ void
+ image_callback (const boost::shared_ptr<pcl::io::openni2::Image>& image)
+ {
+ FPS_CALC ("image callback");
+ boost::mutex::scoped_lock lock (image_mutex_);
+ image_ = image;
+
+ if (image->getEncoding () != pcl::io::openni2::Image::RGB)
+ {
+ if (rgb_data_size_ < image->getWidth () * image->getHeight ())
+ {
+ if (rgb_data_)
+ delete [] rgb_data_;
+ rgb_data_size_ = image->getWidth () * image->getHeight ();
+ rgb_data_ = new unsigned char [rgb_data_size_ * 3];
+ }
+ image_->fillRGB (image_->getWidth (), image_->getHeight (), rgb_data_);
+ }
+ }
+
+ void
+ keyboard_callback (const pcl::visualization::KeyboardEvent& event, void*)
+ {
+ if (event.getKeyCode ())
+ cout << "the key \'" << event.getKeyCode () << "\' (" << event.getKeyCode () << ") was";
+ else
+ cout << "the special key \'" << event.getKeySym () << "\' was";
+ if (event.keyDown ())
+ cout << " pressed" << endl;
+ else
+ cout << " released" << endl;
+ }
+
+ void
+ mouse_callback (const pcl::visualization::MouseEvent& mouse_event, void*)
+ {
+ if (mouse_event.getType () == pcl::visualization::MouseEvent::MouseButtonPress && mouse_event.getButton () == pcl::visualization::MouseEvent::LeftButton)
+ {
+ cout << "left button pressed @ " << mouse_event.getX () << " , " << mouse_event.getY () << endl;
+ }
+ }
+
+ /**
+ * @brief starts the main loop
+ */
+ void
+ run ()
+ {
+ cloud_viewer_->registerMouseCallback (&OpenNI2Viewer::mouse_callback, *this);
+ cloud_viewer_->registerKeyboardCallback (&OpenNI2Viewer::keyboard_callback, *this);
+ cloud_viewer_->setCameraFieldOfView (1.02259994f);
+ boost::function<void (const CloudConstPtr&) > cloud_cb = boost::bind (&OpenNI2Viewer::cloud_callback, this, _1);
+ boost::signals2::connection cloud_connection = grabber_.registerCallback (cloud_cb);
+
+ boost::signals2::connection image_connection;
+ if (grabber_.providesCallback<void (const boost::shared_ptr<pcl::io::openni2::Image>&)>())
+ {
+ image_viewer_.reset (new pcl::visualization::ImageViewer ("PCL OpenNI image"));
+ image_viewer_->registerMouseCallback (&OpenNI2Viewer::mouse_callback, *this);
+ image_viewer_->registerKeyboardCallback (&OpenNI2Viewer::keyboard_callback, *this);
+ boost::function<void (const boost::shared_ptr<pcl::io::openni2::Image>&) > image_cb = boost::bind (&OpenNI2Viewer::image_callback, this, _1);
+ image_connection = grabber_.registerCallback (image_cb);
+ }
+
+ bool image_init = false, cloud_init = false;
+
+ grabber_.start ();
+
+ while (!cloud_viewer_->wasStopped () && (image_viewer_ && !image_viewer_->wasStopped ()))
+ {
+ boost::shared_ptr<pcl::io::openni2::Image> image;
+ CloudConstPtr cloud;
+
+ cloud_viewer_->spinOnce ();
+
+ // See if we can get a cloud
+ if (cloud_mutex_.try_lock ())
+ {
+ cloud_.swap (cloud);
+ cloud_mutex_.unlock ();
+ }
+
+ if (cloud)
+ {
+ FPS_CALC("drawing cloud");
+
+ if (!cloud_init)
+ {
+ cloud_viewer_->setPosition (0, 0);
+ cloud_viewer_->setSize (cloud->width, cloud->height);
+ cloud_init = !cloud_init;
+ }
+
+ if (!cloud_viewer_->updatePointCloud (cloud, "OpenNICloud"))
+ {
+ cloud_viewer_->addPointCloud (cloud, "OpenNICloud");
+ cloud_viewer_->resetCameraViewpoint ("OpenNICloud");
+ cloud_viewer_->setCameraPosition (
+ 0,0,0, // Position
+ 0,0,1, // Viewpoint
+ 0,-1,0); // Up
+ }
+ }
+
+ // See if we can get an image
+ if (image_mutex_.try_lock ())
+ {
+ image_.swap (image);
+ image_mutex_.unlock ();
+ }
+
+
+ if (image)
+ {
+ if (!image_init && cloud && cloud->width != 0)
+ {
+ image_viewer_->setPosition (cloud->width, 0);
+ image_viewer_->setSize (cloud->width, cloud->height);
+ image_init = !image_init;
+ }
+
+ if (image->getEncoding () == pcl::io::openni2::Image::RGB)
+ image_viewer_->addRGBImage ( (const unsigned char*)image->getData (), image->getWidth (), image->getHeight ());
+ else
+ image_viewer_->addRGBImage (rgb_data_, image->getWidth (), image->getHeight ());
+ image_viewer_->spinOnce ();
+
+ }
+ }
+
+ grabber_.stop ();
+
+ cloud_connection.disconnect ();
+ image_connection.disconnect ();
+ if (rgb_data_)
+ delete[] rgb_data_;
+ }
+
+ boost::shared_ptr<pcl::visualization::PCLVisualizer> cloud_viewer_;
+ boost::shared_ptr<pcl::visualization::ImageViewer> image_viewer_;
+
+ pcl::io::OpenNI2Grabber& grabber_;
+ boost::mutex cloud_mutex_;
+ boost::mutex image_mutex_;
+
+ CloudConstPtr cloud_;
+ boost::shared_ptr<pcl::io::openni2::Image> image_;
+ unsigned char* rgb_data_;
+ unsigned rgb_data_size_;
+};
+
+// Create the PCLVisualizer object
+boost::shared_ptr<pcl::visualization::PCLVisualizer> cld;
+boost::shared_ptr<pcl::visualization::ImageViewer> img;
+
+/* ---[ */
+int
+main (int argc, char** argv)
+{
+ std::string device_id ("");
+ pcl::io::OpenNI2Grabber::Mode depth_mode = pcl::io::OpenNI2Grabber::OpenNI_Default_Mode;
+ pcl::io::OpenNI2Grabber::Mode image_mode = pcl::io::OpenNI2Grabber::OpenNI_Default_Mode;
+ bool xyz = false;
+
+ if (argc >= 2)
+ {
+ device_id = argv[1];
+ if (device_id == "--help" || device_id == "-h")
+ {
+ printHelp (argc, argv);
+ return 0;
+ }
+ else if (device_id == "-l")
+ {
+ if (argc >= 3)
+ {
+ pcl::io::OpenNI2Grabber grabber (argv[2]);
+ boost::shared_ptr<pcl::io::openni2::OpenNI2Device> device = grabber.getDevice ();
+ cout << *device; // Prints out all sensor data, including supported video modes
+ }
+ else
+ {
+ boost::shared_ptr<pcl::io::openni2::OpenNI2DeviceManager> deviceManager = pcl::io::openni2::OpenNI2DeviceManager::getInstance ();
+ if (deviceManager->getNumOfConnectedDevices () > 0)
+ {
+ for (unsigned deviceIdx = 0; deviceIdx < deviceManager->getNumOfConnectedDevices (); ++deviceIdx)
+ {
+ boost::shared_ptr<pcl::io::openni2::OpenNI2Device> device = deviceManager->getDeviceByIndex (deviceIdx);
+ cout << "Device " << device->getStringID () << "connected." << endl;
+ }
+
+ }
+ else
+ cout << "No devices connected." << endl;
+
+ cout <<"Virtual Devices available: ONI player" << endl;
+ }
+ return 0;
+ }
+ }
+ else
+ {
+ boost::shared_ptr<pcl::io::openni2::OpenNI2DeviceManager> deviceManager = pcl::io::openni2::OpenNI2DeviceManager::getInstance ();
+ if (deviceManager->getNumOfConnectedDevices () > 0)
+ {
+ boost::shared_ptr<pcl::io::openni2::OpenNI2Device> device = deviceManager->getAnyDevice ();
+ cout << "Device ID not set, using default device: " << device->getStringID () << endl;
+ }
+ }
+
+ unsigned mode;
+ if (pcl::console::parse (argc, argv, "-depthmode", mode) != -1)
+ depth_mode = pcl::io::OpenNI2Grabber::Mode (mode);
+
+ if (pcl::console::parse (argc, argv, "-imagemode", mode) != -1)
+ image_mode = pcl::io::OpenNI2Grabber::Mode (mode);
+
+ if (pcl::console::find_argument (argc, argv, "-xyz") != -1)
+ xyz = true;
+
+ pcl::io::OpenNI2Grabber grabber (device_id, depth_mode, image_mode);
+
+ if (xyz || !grabber.providesCallback<pcl::io::OpenNI2Grabber::sig_cb_openni_point_cloud_rgb> ())
+ {
+ OpenNI2Viewer<pcl::PointXYZ> openni_viewer (grabber);
+ openni_viewer.run ();
+ }
+ else
+ {
+ OpenNI2Viewer<pcl::PointXYZRGBA> openni_viewer (grabber);
+ openni_viewer.run ();
+ }
+
+ return (0);
+}
+/* ]--- */
float ax_x = 0.0, ax_y = 0.0, ax_z = 0.0;
pcl::console::parse_3x_arguments (argc, argv, "-ax_pos", ax_x, ax_y, ax_z, false);
// Draw XYZ axes if command-line enabled
- cloud_viewer->addCoordinateSystem (axes, ax_x, ax_y, ax_z);
+ cloud_viewer->addCoordinateSystem (axes, ax_x, ax_y, ax_z, "global");
}
float frames_per_second = 0; // 0 means only if triggered!
if (debug)
pcl::console::setVerbosityLevel (pcl::console::L_DEBUG);
- bool cam = pcl::console::find_switch (argc, argv, "-cam");
-
// Parse the command line arguments for .pcd files
std::vector<int> p_file_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
std::vector<int> vtk_file_indices = pcl::console::parse_file_extension_argument (argc, argv, ".vtk");
// Set whether or not we should be using the vtkVertexBufferObjectMapper
p->setUseVbos (use_vbos);
- if (!cam)
+ if (!p->cameraParamsSet () && !p->cameraFileLoaded ())
{
Eigen::Matrix3f rotation;
rotation = orientation;
// Add every dimension as a possible color
if (!fcolorparam)
{
+ int idx = 0;
for (size_t f = 0; f < cloud->fields.size (); ++f)
{
if (cloud->fields[f].name == "rgb" || cloud->fields[f].name == "rgba")
+ {
+ idx = f + 1;
color_handler.reset (new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2> (cloud));
+ }
else
{
if (!isValidFieldName (cloud->fields[f].name))
//p->addPointCloud<pcl::PointXYZ> (cloud_xyz, color_handler, cloud_name.str (), viewport);
p->addPointCloud (cloud, color_handler, origin, orientation, cloud_name.str (), viewport);
}
+ // Set RGB color handler as default
+ p->updateColorHandlerIndex (cloud_name.str (), idx);
}
// Additionally, add normals as a handler
p->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_OPACITY, opaque.at (i), cloud_name.str ());
// Reset camera viewpoint to center of cloud if camera parameters were not passed manually and this is the first loaded cloud
- if (i == 0 && !p->cameraParamsSet ())
+ if (i == 0 && !p->cameraParamsSet () && !p->cameraFileLoaded ())
+ {
p->resetCameraViewpoint (cloud_name.str ());
+ p->resetCamera ();
+ }
print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%u", cloud->width * cloud->height); print_info (" points]\n");
print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (*cloud).c_str ());
+ if (p->cameraFileLoaded ())
+ print_info ("Camera parameters restored from %s.\n", p->getCameraFile ().c_str ());
}
if (!mview && p)
if (axes != 0.0 && p)
{
float ax_x = 0.0, ax_y = 0.0, ax_z = 0.0;
- pcl::console::parse_3x_arguments (argc, argv, "-ax_pos", ax_x, ax_y, ax_z, false);
+ pcl::console::parse_3x_arguments (argc, argv, "-ax_pos", ax_x, ax_y, ax_z);
// Draw XYZ axes if command-line enabled
- p->addCoordinateSystem (axes, ax_x, ax_y, ax_z);
+ p->addCoordinateSystem (axes, ax_x, ax_y, ax_z, "global");
}
// Clean up the memory used by the binary blob
- VTK
- \ref io "io"
- \ref kdtree "kdtree"
- - \ref range_image "range_image"
+ - \ref pcl::RangeImage "RangeImage"
*/